source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_MaskUtils.ipf @ 1227

Last change on this file since 1227 was 1227, checked in by srkline, 3 years ago

updates to:
how the DIV file is generated. Options for normalization are transparent choices now. Normalizing individually is the correct option to use, others are for testing.

updated what files can be displayed for drawing a mask

updated how the beam stop in place is deciphered

updated which raw data corrections are shown and allowed to be turned on/off on the VSANS preferences.

File size: 63.6 KB
Line 
1#pragma TextEncoding = "MacRoman"
2#pragma rtGlobals=3             // Use modern global access method and strict wave access.
3
4//
5// Mask utilities:
6// - loader
7// - simple editor
8// - save mask file
9// - assign mask file to data file
10//
11//
12//
13//
14//
15//
16
17///// LOADING
18
19// TODO
20// x- when mask is loaded, need to be sure to clean up the "extra" waves that may be present
21//
22// x- the overlay and the currentTube waves since these are not overwritten or killed when new mask
23//  data is read in from HDF. need to manually? check for these and delete then, or the data and
24//  mask overlay will be out of sync.
25//
26
27
28// passing null file string presents a dialog
29// called from the Main Button " Read Mask"
30Proc V_LoadMASKData()
31        V_LoadHDF5Data("","MSK")
32End
33
34
35
36//// DRAWING/SAVING
37//
38// (DONE)
39// x- CHANGE the mask behavior to a more logical choice - and consistent with SANS
40//   x- CHANGE to:
41// 1 == mask == discard data
42// 0 == no Mask == keep data
43// x- and then make the corresponding changes in the I(Q) routines
44//
45// x- move the mask generating utilities from VC_HDF5_Utils into this procedure - to keep
46// all of the mask procedures together
47
48
49// TODO
50// -- document the arrow keys moving the tube number and adding/deleting tubes from the mask
51//  this is done through a window hook function (LR moves tube number, up/down = add/delete)
52//
53// (DONE)
54// x- (NO)- Igor 7 is necessary for some VSANS functionality, so do not support Igor 6
55//    x (no)make the arrow keys Igor 6 compatible - search for specialKeyCode or Keyboard Events in the help file
56//     and what needs to be replaced for Igor 6
57// DONE
58// x- for L/R panels, the maksing of columns should be sufficient. Tubes are vertical. For the T/B panels
59//         the L/R panels cast a vertical shadow (=vertical mask) AND the tubes are horizontal, so the individual
60//         tubes will likely need to be masked in a horizontal line too, per tube. ADD this in...
61
62
63//TODO
64// x- draw a mask
65// x- save a mask (all panels)
66// x- move everything into it's own folder, rather than root:
67// -- be able to save the mask name to the RAW data file
68// -- be able to read a mask based on what name is in the data file
69//
70// x- biggest thing now is to re-write the DrawDetPanel() routine from the beamCenter.ipf
71//    to do what this panel needs
72//
73// x- add this to the list of includes, move the file to SVN, and add it.
74//
75// -- for working with VCALC -- maybe have an automatic generator (if val < -2e6, mask = 0)
76//    this can be checked column-wise to go faster (1st index)
77//
78// x- re-write V_OverlayMask to make the "overlay" wave that has the NaNs, and then the drawing
79//    routines need to be aware of this
80
81
82
83// called from the main button "Draw Mask"
84Proc V_Edit_a_Mask()
85        V_EditMask()
86end
87
88Function V_EditMask()
89        DoWindow/F MaskEditPanel
90        if(V_flag==0)
91       
92                NewDataFolder/O root:Packages:NIST:VSANS:Globals:Mask
93
94                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gMaskTube = 0
95                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gMaskMaxIndex = 47
96               
97                // check for a mask, if not present, generate a default mask
98                String str="FT"
99                wave/Z maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
100                if(!WaveExists(maskW))
101                        V_GenerateDefaultMask()
102                endif
103               
104                Execute "V_MaskEditorPanel()"
105        endif
106End
107
108//
109// TODO
110// -- may need to adjust the display for the different pixel dimensions
111//      ModifyGraph width={Plan,1,bottom,left}
112//
113// TODO
114//  need buttons for:
115//              x- quit (to exit gracefully) (no, just close the window is fine)
116//    x- help (button is there, fill in the content)
117//
118Proc V_MaskEditorPanel()
119        PauseUpdate; Silent 1           // building window...
120
121        Display /W=(662,418,1300,960)/N=MaskEditPanel    /K=1
122
123        ShowTools rect
124        ControlBar 100
125               
126        PopupMenu popup_0,pos={18,40},size={109,20},proc=V_SetMaskPanelPopMenuProc,title="Detector Panel"
127        PopupMenu popup_0,mode=1,popvalue="FL",value= #"\"FL;FR;FT;FB;ML;MR;MT;MB;B;\""
128        PopupMenu popup_2,pos={18,10},size={109,20},title="Data Source"//,proc=SetFldrPopMenuProc
129        PopupMenu popup_2,mode=1,popvalue="RAW",value= #"\"RAW;SAM;ABS;VCALC;\""
130
131        SetVariable setvar0,pos={226,32},size={112,23},title="tube number"
132        SetVariable setvar0,limits={0,127,1},value=root:Packages:NIST:VSANS:Globals:Mask:gMaskTube
133        Button button_0,pos={226,58},size={50.00,20.00},proc=V_AddToMaskButtonProc,title="Add"
134        Button button_1,pos={288,58},size={50.00,20.00},proc=V_RemoveFromMaskButtonProc,title="Del"
135        Button button_2,pos={496,41},size={90.00,20.00},proc=V_ToggleMaskButtonProc,title="Toggle"
136        Button button_3,pos={506,66},size={80.00,20.00},proc=V_SaveMaskButtonProc,title="Save"
137        CheckBox check_0,pos={174,35},size={37.00,15.00},proc=V_DrawMaskRadioCheckProc,title="Row"
138        CheckBox check_0,value= 0,mode=1
139        CheckBox check_1,pos={174,58},size={32.00,15.00},proc=V_DrawMaskRadioCheckProc,title="Col"
140        CheckBox check_1,value= 1,mode=1
141
142        Button button_5,pos={18,70.00},size={70.00,20.00},proc=V_MaskToolsButton,title="Tools"
143        Button button_6,pos={380,33},size={90.00,20.00},proc=V_AddShapeToMaskButtonProc,title="Add Shape"
144        Button button_7,pos={380,58},size={90.00,20.00},proc=V_AddShapeToMaskButtonProc,title="Del Shape"
145        Button button_8,pos={556.00,14.00},size={30.00,20.00},proc=V_DrawMaskHelpButtonProc,title="?"
146
147        GroupBox group0,pos={163.00,5.00},size={188.00,90.00},title="Mask Tubes"
148        GroupBox group1,pos={365.00,5.00},size={122.00,90.00},title="Mask Shapes"
149
150        SetWindow MaskEditPanel, hook(MyHook)=V_MaskWindowHook
151
152        // draw the correct images
153        //draw the detector panel
154        V_DrawPanelToMask("FL")
155       
156        // overlay the current mask
157        V_OverlayMask("FL",1)
158
159        SetDrawLayer/W=MaskEditPanel ProgFront
160        SetDrawEnv/W=MaskEditPanel xcoord= bottom,ycoord= left,save     //be sure to use axis coordinate mode
161EndMacro
162
163Function V_DrawMaskHelpButtonProc(ba) : ButtonControl
164        STRUCT WMButtonAction &ba
165
166        switch( ba.eventCode )
167                case 2: // mouse up
168                        // click code here
169                        DisplayHelpTopic/Z/K=1 "VSANS Data Reduction Documentation[Drawing a Mask]"
170                        if(V_flag !=0)
171                                DoAlert 0,"The VSANS Data Reduction Help file could not be found"
172                        endif
173                        break
174                case -1: // control being killed
175                        break
176        endswitch
177
178        return 0
179End
180
181//
182//a simple toggle between the two, so the logic is not done in the cleanest way.
183//
184// update the limits on the tube nubmer based on row/col and the panel (gMaskMaxIndex global)
185//
186Function V_DrawMaskRadioCheckProc(cba) : CheckBoxControl
187        STRUCT WMCheckboxAction &cba
188
189        switch( cba.eventCode )
190                case 2: // mouse up
191                        Variable checked = cba.checked
192                        String name = cba.ctrlName
193                       
194                        //get information to update the limits on the tube number setvar
195                        ControlInfo popup_0
196                        String str=S_Value
197                        wave data = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
198                        Variable val
199                       
200                        // update the radio button status and the setvar limits                 
201                        if(cmpstr(name,"check_0") == 0)         // ROW is being selected
202                                CheckBox check_0,value = 1
203                                CheckBox check_1,value = 0
204                                val = DimSize(data, 1) -1
205                        else
206                                // COL is being selected
207                                CheckBox check_0,value = 0
208                                CheckBox check_1,value = 1
209                                val = DimSize(data, 0) -1
210                        endif
211
212//                      print "max = ",val
213                                               
214                        SetVariable setvar0,limits={0,val,1}
215                        NVAR gVal = root:Packages:NIST:VSANS:Globals:Mask:gMaskTube
216                        NVAR gMax = root:Packages:NIST:VSANS:Globals:Mask:gMaskMaxIndex
217                        gMax = val
218                        if(gVal > val)
219                                gVal = val
220                        endif
221                       
222                        break
223                case -1: // control being killed
224                        break
225        endswitch
226
227        return 0
228End
229
230Function V_MaskWindowHook(s)
231        STRUCT WMWinHookStruct &s
232       
233        Variable hookResult = 0 // 0 if we do not handle event, 1 if we handle it.
234       
235        String message = ""
236
237        switch(s.eventCode)
238                case 11:        // Keyboard event
239//                      String keyCodeInfo
240//                      sprintf keyCodeInfo, "s.keycode = 0x%04X", s.keycode
241//                      if (strlen(message) > 0)
242//                              message += "\r"
243//                      endif
244//                      message +=keyCodeInfo
245//
246//                      message += "\r"
247//                      String specialKeyCodeInfo
248//                      sprintf specialKeyCodeInfo, "s.specialKeyCode = %d", s.specialKeyCode
249//                      message +=specialKeyCodeInfo
250//                      message += "\r"
251//
252//                      String keyTextInfo
253//                      sprintf keyTextInfo, "s.keyText = \"%s\"", s.keyText
254//                      message +=keyTextInfo
255//
256//                      String text = "\\Z24" + message
257//                      Textbox /C/N=Message/W=KeyboardEventsGraph/A=MT/X=0/Y=15 text
258
259                // NOTE:  these special keyCodes are all Igor-7 ONLY
260
261// Note that I need to keep track of the index value since I'm intercepting the
262// SetVariable event here. I need to keep the index in range.           
263                        STRUCT WMButtonAction ba
264                        ba.eventCode = 2
265                        NVAR tubeVal = root:Packages:NIST:VSANS:Globals:Mask:gMaskTube
266                        if(s.specialKeyCode == 100)
267                                //left arrow
268                                tubeVal -= 1
269                        endif
270                        if(s.specialKeyCode == 101)
271                                //right arrow
272                                tubeVal += 1
273                        endif
274                        if(s.specialKeyCode == 102)
275                                //up arrow
276                                V_AddToMaskButtonProc(ba)
277                        endif
278                        if(s.specialKeyCode == 103)
279                                //down arrow
280                                V_RemoveFromMaskButtonProc(ba)
281                        endif
282
283// enforce the limits on the setvar
284                        NVAR gMax = root:Packages:NIST:VSANS:Globals:Mask:gMaskMaxIndex
285                        if(tubeVal > gMax)
286                                tubeVal = gMax
287                        endif
288                        if(tubeVal < 0)
289                                tubeVal = 0
290                        endif
291                       
292// draw the "currentTube" every time
293                        ControlInfo popup_0
294                        String str=S_Value
295                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
296
297                        // update so that the proper row is displayed on the currentTube
298                        currentTube = 0
299                       
300                        ControlInfo check_0             // is it row?
301                        Variable isRow = V_value
302                        if(isRow)
303                                currentTube[][tubeVal] = 1                     
304                        else
305                                currentTube[tubeVal][] = 1
306                        endif           
307
308
309                        hookResult = 1  // We handled keystroke
310                        break
311        endswitch
312       
313        return hookResult               // If non-zero, we handled event and Igor will ignore it.
314End
315
316// toggles the view of the mask, either show the mask, or hide it
317//
318Function V_ToggleMaskButtonProc(ba) : ButtonControl
319        STRUCT WMButtonAction &ba
320
321        switch( ba.eventCode )
322                case 2: // mouse up
323                        // click code here
324                       
325                        ControlInfo popup_0
326                        String str=S_Value
327
328                        wave/Z overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
329                       
330                        CheckDisplayed/W=MaskEditPanel overlay
331                        Variable state = !(V_flag)              //if V_flag == 0, then set to 1 (and vice versa)
332                        V_OverlayMask(str,state)
333
334                        break
335                case -1: // control being killed
336                        break
337        endswitch
338
339        return 0
340End
341
342// adds a row (or column) to the mask
343//
344Function V_AddToMaskButtonProc(ba) : ButtonControl
345        STRUCT WMButtonAction &ba
346
347        switch( ba.eventCode )
348                case 2: // mouse up
349                        // click code here
350                        ControlInfo popup_0
351                        String str=S_Value
352                       
353                        wave/Z maskData = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
354                       
355                        Variable val
356                        ControlInfo setvar0             //get the tube number
357                        val = V_Value
358                       
359                        ControlInfo check_0             // is it row?
360                        Variable isRow = V_value
361                        if(isRow)
362                                maskData[][val] = 1                     
363                        else
364                                maskData[val][] = 1
365                        endif
366                       
367                        V_OverlayMask(str,1)
368                       
369                        break
370                case -1: // control being killed
371                        break
372        endswitch
373
374        return 0
375End
376
377//
378//adds or erases the mask, based on which button was clicked
379// (only checks for "add shape", otherwise erases mask)
380//
381Function V_AddShapeToMaskButtonProc(ba) : ButtonControl
382        STRUCT WMButtonAction &ba
383
384        switch( ba.eventCode )
385                case 2: // mouse up
386                        // click code here
387                        ControlInfo popup_0
388                        String str=S_Value
389                       
390                        wave/Z data = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
391
392                        SetDrawLayer/W=MaskEditPanel ProgFront
393                        SetDrawEnv/W=MaskEditPanel xcoord= bottom,ycoord= left,save     //be sure to use axis coordinate mode
394
395                        ImageGenerateROIMask/W=MaskEditPanel curDispPanel               //M_ROIMask is in the root: folder
396                       
397                        WAVE M_ROIMask=M_ROIMask
398                        if(cmpstr("button_6",ba.ctrlName)==0)
399                                data = (data || M_ROIMask)              // 0=0, 1=1             == "drawing" more mask points                   
400                        else
401                                data = (M_ROIMask[p][q] == 1 && data[p][q] == 1) ? 0 : data[p][q]               // if the drawn shape = 1, set the mask to 0 (erase)
402                        endif
403                       
404                        V_OverlayMask(str,1)
405                       
406                        SetDrawLayer/K ProgFront
407                        SetDrawLayer/W=MaskEditPanel ProgFront
408                        SetDrawEnv/W=MaskEditPanel xcoord= bottom,ycoord= left,save     //be sure to use axis coordinate mode
409                        break
410                case -1: // control being killed
411                        break
412        endswitch
413
414        return 0
415End
416
417// show the tools (they are there by default)
418//
419Function V_MaskToolsButton(ba) : ButtonControl
420        STRUCT WMButtonAction &ba
421
422        switch( ba.eventCode )
423                case 2: // mouse up
424                        // click code here
425                       
426                        ShowTools rect
427                       
428                        SetDrawLayer/W=MaskEditPanel ProgFront
429                        SetDrawEnv/W=MaskEditPanel xcoord= bottom,ycoord= left,save     //be sure to use axis coordinate mode
430                        SetDrawEnv/W=MaskEditPanel fillPat=1   
431                       
432                        break
433                case -1: // control being killed
434                        break
435        endswitch
436
437        return 0
438End
439
440// un-mask a row or column
441//
442Function V_RemoveFromMaskButtonProc(ba) : ButtonControl
443        STRUCT WMButtonAction &ba
444
445        switch( ba.eventCode )
446                case 2: // mouse up
447                        // click code here
448                        ControlInfo popup_0
449                        String str=S_Value
450                       
451                        wave/Z maskData = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
452                       
453                        Variable val
454                        ControlInfo setvar0 // get the tube number
455                        val = V_Value
456                       
457                        ControlInfo check_0             // is it row?
458                        Variable isRow = V_value
459                        if(isRow)
460                                maskData[][val] = 0                     
461                        else
462                                maskData[val][] = 0
463                        endif
464                       
465                        V_OverlayMask(str,1)   
466                                       
467                        break
468                case -1: // control being killed
469                        break
470        endswitch
471
472        return 0
473End
474
475//
476// function to choose which detector panel to display, and then to actually display it
477//
478Function V_SetMaskPanelPopMenuProc(pa) : PopupMenuControl
479        STRUCT WMPopupAction &pa
480
481        switch( pa.eventCode )
482                case 2: // mouse up
483                        Variable popNum = pa.popNum
484                        String popStr = pa.popStr
485                                               
486                        // remove the old image (it may not be the right shape)
487                        // -- but make sure it exists first...
488
489                        String list = ImageNameList("", ";" )
490                        Variable num=ItemsInList(list)
491                        Variable ii
492                        for(ii=0;ii<num;ii+=1)
493//                              Wave w = ImageNameToWaveRef("", StringFromList(ii, list,";"))
494//                              CheckDisplayed/W=MaskEditPanel w
495                               
496                                RemoveImage/W=MaskEditPanel $(StringFromList(ii, list,";"))
497                        endfor
498
499
500       
501                        // draw the correct images
502                        V_DrawPanelToMask(popStr)
503
504                        // fake a "click" on the radio buttons to re-set the row/col limits
505                        STRUCT WMCheckboxAction cba
506                        cba.eventCode = 2
507                       
508                        ControlInfo check_0
509                        if(V_flag == 1)         //row is currently selected
510                                cba.ctrlName = "check_0"
511                        else
512                                cba.ctrlName = "check_1"
513                        endif
514                       
515                        V_DrawMaskRadioCheckProc(cba)           //call the radio button action proc     
516                       
517                        //overlay the mask (removes the old mask first)
518                        V_OverlayMask(popStr,1)
519
520                        SetDrawLayer/K ProgFront
521                        SetDrawLayer/W=MaskEditPanel ProgFront
522                        SetDrawEnv/W=MaskEditPanel xcoord= bottom,ycoord= left,save     //be sure to use axis coordinate mode
523
524                        break
525                case -1: // control being killed
526                        break
527        endswitch
528
529        return 0
530End
531
532//
533// SEE DrawDetPanel() in the BeamCenter file
534//
535// TODO
536// x- currently is hard-wired for the simulation path!   need to make it more generic, especially for RAW data
537//
538// -- need to adjust the size of the image subwindows
539//
540// x- need to do something for panel "B". currently ignored
541//
542//
543// draw the selected panel and the model calculation, adjusting for the
544// orientation of the panel and the number of pixels, and pixel sizes
545Function V_DrawPanelToMask(str)
546        String str
547       
548        // from the selection, find the path to the data
549
550        Variable xDim,yDim
551        Variable left,top,right,bottom
552        Variable height, width
553        Variable left2,top2,right2,bottom2
554        Variable nPix_X,nPix_Y,pixSize_X,pixSize_Y
555
556       
557//      Wave dispW=root:curDispPanel
558
559        //plot it in the subwindow with the proper aspect and positioning
560        // for 48x256 (8mm x 4mm), aspect = (256/2)/48 = 2.67 (LR panels)
561        // for 128x48 (4mm x 8 mm), aspect = 48/(128/2) = 0.75 (TB panels)
562       
563       
564        // using two switches -- one to set the panel-specific dimensions
565        // and the other to set the "common" values, some of which are based on the panel dimensions
566
567// set the source of the data. not always VCALC anymore
568        String folder
569        ControlInfo popup_2
570        folder = S_Value
571
572        // TODO -- fix all of this mess
573        if(cmpstr(folder,"VCALC") == 0)
574                // panel-specific values
575                Variable VC_nPix_X = VCALC_get_nPix_X(str)
576                Variable VC_nPix_Y = VCALC_get_nPix_Y(str)
577                Variable VC_pixSize_X = VCALC_getPixSizeX(str)
578                Variable VC_pixSize_Y = VCALC_getPixSizeY(str)
579
580       
581        // if VCALC declare this way   
582                wave newW = $("root:Packages:NIST:VSANS:VCALC:entry:instrument:detector_"+str+":det_"+str)
583                nPix_X = VC_nPix_X
584                nPix_Y = VC_nPix_Y
585                pixSize_X = VC_pixSize_X
586                pixSize_Y = VC_pixSize_Y
587       
588        else
589        // TODO: if real data, need new declaration w/ data as the wave name
590                wave newW = $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+str+":data")
591
592                nPix_X = V_getDet_pixel_num_x(folder,str)
593                nPix_Y = V_getDet_pixel_num_Y(folder,str)
594                pixSize_X = V_getDet_x_pixel_size(folder,str)/10
595                pixSize_Y = V_getDet_y_pixel_size(folder,str)/10
596        endif
597       
598
599        Variable scale = 10
600       
601        // common values (panel position, etc)
602        // TODO -- units are absolute, based on pixels in cm. make sure this is always correct
603        strswitch(str)
604                case "FL":
605                case "FR":
606                case "ML":
607                case "MR":
608                        width = trunc(nPix_X*pixSize_X *scale*1.15)                     //48 tubes @ 8 mm
609                        height = trunc(nPix_Y*pixSize_Y *scale*0.8)                     //128 pixels @ 8 mm
610                       
611                        left = 20
612                        top = 80
613                        right = left+width
614                        bottom = top+height
615                       
616                        left2 = right + 20
617                        right2 = left2 + width
618                        top2 = top
619                        bottom2 = bottom
620                       
621                        break                   
622                case "FT":
623                case "FB":
624                case "MT":
625                case "MB":
626                        width = trunc(nPix_X*pixSize_X *scale*1.)                       //128 pix @ 4 mm
627                        height = trunc(nPix_Y*pixSize_Y *scale)                 // 48 tubes @ 8 mm
628                                               
629                        left = 20
630                        top = 80
631                        right = left+width
632                        bottom = top+height
633                       
634                        left2 = left
635                        right2 = right
636                        top2 = top + height + 20
637                        bottom2 = bottom + height + 20
638                       
639                        break
640                case "B":
641                        width = trunc(nPix_X/3.2)                       //
642                        height = trunc(nPix_Y/3.2)                      //
643                       
644                        left = 20
645                        top = 80
646                        right = left+width
647                        bottom = top+height
648                       
649//                      Print left,top,right,bottom
650
651                        break                                           
652                default:
653                        return(0)               //just exit
654        endswitch
655
656        SetDataFolder root:Packages:NIST:VSANS:Globals:Mask
657       
658        // generate the new panel display
659        duplicate/O newW curDispPanel
660        SetScale/P x 0,1, curDispPanel
661        SetScale/P y 0,1, curDispPanel
662       
663        NVAR defaultLogScaling = root:Packages:NIST:VSANS:Globals:gLogScalingAsDefault
664        if(defaultLogScaling)
665                Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
666        else
667                Wave LookupWave = root:Packages:NIST:VSANS:Globals:linearLookupWave
668        endif
669
670        //draw the detector panel
671//      Display/W=(left,top,right,bottom)
672        AppendImage curDispPanel
673        ModifyImage curDispPanel ctab= {*,*,ColdWarm,0}
674//      ModifyImage curDispPanel log=1          // this fails, since there are data values that are zero
675        ModifyImage curDispPanel ctabAutoscale=0,lookup= LookupWave
676        Label left "Y pixels"
677        Label bottom "X pixels"
678
679       
680        DoUpdate
681       
682        SetDataFolder root:
683        return(0)
684End
685
686//
687// overlay the mask
688//
689// (DONE)
690// x- remove the old mask first
691// x- make the mask "toggle" to remove it
692// x- go see SANS for color, implementation, etc.
693// x- un-comment the (two) calls
694//
695//
696//toggles a mask on/off of the SANS_Data window
697// points directly to window, doesn't need current display type
698//
699// if state==1, show the mask, if ==0, hide the mask
700//
701//** This assumes that if the overlay is/not present on the image display, then the currentTube is also there/not
702// and is not checked
703//
704Function V_OverlayMask(str,state)
705        String str
706        Variable state
707
708
709        String maskPath = "root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data"
710        if(WaveExists($maskPath) == 1)
711                if(state == 1)
712                        //duplicate the mask, which is named "data"
713                        wave maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
714       
715                        Duplicate/O maskW $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
716                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
717                        Duplicate/O maskW $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
718                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
719
720                        Redimension/D overlay,currentTube
721                        SetScale/P x 0,1, overlay,currentTube
722                        SetScale/P y 0,1, overlay,currentTube
723               
724                        //              overlay = (maskW == 1) ? 1 : NaN                        //no need to do this - simply adjust the coloring
725
726                        // update so that the proper row is displayed on the currentTube
727                        currentTube = 0
728                                               
729                        Variable val
730                        ControlInfo setvar0             //get the tube number
731                        val = V_Value
732                       
733                        ControlInfo check_0             // is it row?
734                        Variable isRow = V_value
735                        if(isRow)
736                                currentTube[][val] = 1                 
737                        else
738                                currentTube[val][] = 1
739                        endif                   
740                               
741                        CheckDisplayed/W=MaskEditPanel overlay
742                        if(V_flag==0)           //so the overlay doesn't get appended more than once
743                                AppendImage/W=MaskEditPanel overlay
744                                AppendImage/W=MaskEditPanel currentTube
745//                              ModifyImage/W=MaskEditPanel#DetData overlay ctab= {0.9,1,BlueRedGreen,0}        ,minRGB=NaN,maxRGB=0
746                                ModifyImage/W=MaskEditPanel overlay ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
747                                ModifyImage/W=MaskEditPanel currentTube ctab= {0.9,1,CyanMagenta,0}     ,minRGB=NaN,maxRGB=0
748                //              ModifyImage/W=MaskEditPanel#DetData overlay ctab= {0,*,BlueRedGreen,0} 
749                        endif
750                endif
751
752                if(state == 0)
753                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
754                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
755
756                        CheckDisplayed/W=MaskEditPanel overlay
757//                      Print "V_flag = ",V_flag
758       
759                        If(V_Flag == 1)         //overlay is present
760                                RemoveImage/W=MaskEditPanel overlay
761                                RemoveImage/W=MaskEditPanel currentTube
762                        endif
763                endif
764        Endif
765       
766        return(0)
767End
768
769
770Function V_SaveMaskButtonProc(ba) : ButtonControl
771        STRUCT WMButtonAction &ba
772
773        switch( ba.eventCode )
774                case 2: // mouse up
775                        // click code here
776                       
777                        // fills in a "default mask" in a separate folder to then write out
778                        Execute "H_Setup_VSANS_MASK_Structure()"
779                       
780                        // fill with current "stuff"
781                        SetDataFolder root:VSANS_MASK_file:entry       
782                        Wave/T title    = title
783                        title = "This is a custom MASK file for VSANS: VSANS_MASK"
784                        SetDataFolder root:
785                       
786                       
787                // copy over what was actually drawn for all of the detector panels
788
789                        Variable ii
790                        String str
791                        for(ii=0;ii<ItemsInList(ksDetectorListAll);ii+=1)
792                                str = StringFromList(ii, ksDetectorListAll, ";")
793                                Wave det_str = $("root:VSANS_MASK_file:entry:instrument:detector_"+str+":data")
794                                wave maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")                   
795                                det_str = maskW
796                        endfor
797
798                        //save it
799//                      String fileName = "ThisIsAMASK"
800
801                        Execute "Save_VSANS_MASK_Nexus()"
802                       
803                        break
804                case -1: // control being killed
805                        break
806        endswitch
807
808        SetDataFolder root:
809        return 0
810End
811
812
813////////////// fake MASK file tests
814//
815//
816//      Make/O/T/N=1    file_name       = "VSANS_MASK_test.h5"
817//
818// simple generation of a fake MASK file. for sans, nothing other than the creation date was written to the
819// file header. nothing more is needed (possibly)
820//
821//
822// TODO
823// -- make the number of pixels GLOBAL to pick up the right numbers for the detector dimensions
824//  x- there will be lots of work to do to develop the procedures necessary to actually generate the
825//      9 data sets to become the MASK file contents. More complexity here than for the simple SANS case.
826//
827//  x- this is currently random 0|1 values, need to write an editor
828//
829// currently set up to use 1 = YES MASK == exclude the data
830//      and 0 = NO MASK == keep the data
831//
832Proc H_Setup_VSANS_MASK_Structure()
833       
834        NewDataFolder/O/S root:VSANS_MASK_file         
835
836        NewDataFolder/O/S root:VSANS_MASK_file:entry   
837                Make/O/T/N=1    title   = "This is a MASK file for VSANS: VSANS_MASK"
838                Make/O/T/N=1    start_date      = "2015-02-28T08:15:30-5:00"
839                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument         
840                        Make/O/T/N=1    name    = "NG3_VSANS"
841                       
842                       
843//      NVAR gHighResBinning = root:Packages:NIST:VSANS:Globals:gHighResBinning
844                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_B     
845                if(root:Packages:NIST:VSANS:Globals:gHighResBinning == 1)
846                                // TODOHIGHRES - the pixel values are hard-wired
847                                Make/O/I/N=(2720,6624)  data    = 0             
848
849                        // TODOHIGHRES -- these values are simply the 4x4 values x4
850                        // these will need to be updated
851                                data[][0,20] = 1
852                                data[][6603,6623] = 1           //
853                                data[0,20][] = 1
854                                data[2599,2719][] = 1           //
855                               
856                        else
857                                Make/O/I/N=(680,1656)   data    = 0             
858
859                                data[][0,5] = 1
860                                data[][1650,1655] = 1
861                                data[0,5][] = 1
862                                data[675,679][] = 1
863
864                endif
865                               
866                       
867                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_MR             
868                        Make/O/I/N=(48,128)     data    = 0
869                        data[44,47][] = 1
870                        data[][0,4] = 1
871                        data[][123,127] = 1
872                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_ML             
873                        Make/O/I/N=(48,128)     data    = 0
874                        data[0,3][] = 1
875                        data[][0,4] = 1
876                        data[][123,127] = 1
877                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_MT             
878                        Make/O/I/N=(128,48)     data    = 0
879                        data[0,49][] = 1
880                        data[78,127][] = 1
881                        data[50,77][] = 0
882                       
883                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_MB             
884                        Make/O/I/N=(128,48)     data    = 0
885                        data[0,49][] = 1
886                        data[78,127][] = 1
887                        data[50,77][] = 0
888                       
889                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FR             
890                        Make/O/I/N=(48,128)     data    = 0
891                        data[44,47][] = 1
892                        data[][0,4] = 1
893                        data[][123,127] = 1
894                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FL             
895                        Make/O/I/N=(48,128)     data    = 0
896                        data[0,3][] = 1
897                        data[][0,4] = 1
898                        data[][123,127] = 1
899                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FT             
900                        Make/O/I/N=(128,48)     data    = 0
901                        data[0,49][] = 1
902                        data[78,127][] = 1
903                        data[50,77][] = 0
904
905                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FB             
906                        Make/O/I/N=(128,48)     data    = 0
907                        data[0,49][] = 1
908                        data[78,127][] = 1
909                        data[50,77][] = 0
910
911
912                // fake, empty folders so that the generic loaders can be used
913                NewDataFolder/O root:VSANS_MASK_file:entry:DAS_logs
914                NewDataFolder/O root:VSANS_MASK_file:entry:control
915                NewDataFolder/O root:VSANS_MASK_file:entry:reduction
916                NewDataFolder/O root:VSANS_MASK_file:entry:sample
917                NewDataFolder/O root:VSANS_MASK_file:entry:user                 
918        SetDataFolder root:
919
920End
921
922
923// this default mask is only generated on startup of the panel, if a mask
924// has not been previously loaded. If any mask is present ("FT" is tested) then
925// this function is skipped and the existing mask is not overwritten
926Function V_GenerateDefaultMask()
927
928        NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry   
929                Make/O/T/N=1    title   = "This is a MASK file for VSANS: VSANS_MASK"
930                Make/O/T/N=1    start_date      = "2015-02-28T08:15:30-5:00"
931                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument         
932                        Make/O/T/N=1    name    = "NG3_VSANS"
933                       
934       
935        NVAR gHighResBinning = root:Packages:NIST:VSANS:Globals:gHighResBinning
936                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_B     
937                switch(gHighResBinning)
938                        case 1:
939                        // TODOHIGHRES - the pix values are hard-wired
940                                Make/O/I/N=(2720,6624)  data    = 0             
941
942                        // TODOHIGHRES -- these values are simply the 4x4 values x4
943                        // these will need to be updated
944                                data[][0,152] = 1
945                                data[][6195,6623] = 1           // 107 pix *4 =428
946                                data[0,40][] = 1
947                                data[2679,2719][] = 1           // 10 pix (*4)
948                               
949                                break
950                        case 4:
951                                Make/O/I/N=(680,1656)   data    = 0             
952
953                                data[][0,38] = 1
954                                data[][1535,1655] = 1
955//                              data[0,10][] = 1
956                                data[0,190][] = 1               //with the beam stop stuck on the detector
957                                data[669,679][] = 1
958                                break
959                        default:
960                                Abort "No binning case matches in V_GenerateDefaultMask"
961                endswitch
962       
963                       
964                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_MR             
965                        Make/O/I/N=(48,128)     data    = 0
966//                      data[][0,3] = 1
967                        data[44,47][] = 1
968                        data[][0,4] = 1
969                        data[][123,127] = 1
970                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_ML             
971                        Make/O/I/N=(48,128)     data    = 0
972                        data[0,3][] = 1
973//                      data[44,47][] = 1
974                        data[][0,4] = 1
975                        data[][123,127] = 1
976                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_MT             
977                        Make/O/I/N=(128,48)     data    = 0
978                        data[0,49][] = 1
979                        data[78,127][] = 1
980                        data[50,77][] = 0
981                       
982                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_MB             
983                        Make/O/I/N=(128,48)     data    = 0
984                        data[0,49][] = 1
985                        data[78,127][] = 1
986                        data[50,77][] = 0
987                       
988                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FR             
989                        Make/O/I/N=(48,128)     data    = 0
990//                      data[][0,3] = 1
991                        data[44,47][] = 1
992                        data[][0,4] = 1
993                        data[][123,127] = 1
994                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FL             
995                        Make/O/I/N=(48,128)     data    = 0
996                        data[0,3][] = 1
997//                      data[44,47][] = 1
998                        data[][0,4] = 1
999                        data[][123,127] = 1
1000                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FT             
1001                        Make/O/I/N=(128,48)     data    = 0
1002                        data[0,49][] = 1
1003                        data[78,127][] = 1
1004                        data[50,77][] = 0
1005
1006                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FB             
1007                        Make/O/I/N=(128,48)     data    = 0
1008                        data[0,49][] = 1
1009                        data[78,127][] = 1
1010                        data[50,77][] = 0
1011                       
1012        SetDataFolder root:
1013
1014end
1015
1016////////////////////// MASK FILE
1017
1018
1019// (DONE)
1020// x- currently, there are no dummy fill values or attributes for the fake MASK file
1021//
1022Proc Setup_VSANS_MASK_Struct()
1023
1024        // lays out the tree and fills with dummy values
1025        H_Setup_VSANS_MASK_Structure()
1026       
1027        // writes in the attributes
1028//      H_Fill_VSANS_Attributes()
1029       
1030
1031End
1032
1033Proc Save_VSANS_MASK_Nexus(fileName)
1034        String fileName="Test_VSANS_MASK_file"
1035
1036        // save as HDF5 (no attributes saved yet)
1037        Save_VSANS_file("root:VSANS_MASK_file", fileName+".MASK.h5")
1038       
1039//      // read in a data file using the gateway-- reads from the home path
1040//      H_HDF5Gate_Read_Raw(fileName+".h5")
1041//     
1042//      // after reading in a "partial" file using the gateway (to generate the xref)
1043//      // Save the xref to disk (for later use)
1044//      Save_HDF5___xref("root:"+fileName,"HDF5___xref")
1045//     
1046//      // after you've generated the HDF5___xref, load it in and copy it
1047//      // to the necessary folder location.
1048//      Copy_HDF5___xref("root:VSANS_MASK_file", "HDF5___xref")
1049//     
1050//      // writes out the contents of a data folder using the gateway
1051//      H_HDF5Gate_Write_Raw("root:VSANS_MASK_file", fileName+".h5")
1052//
1053//      // re-load the data file using the gateway-- reads from the home path
1054//      // now with attributes
1055//      H_HDF5Gate_Read_Raw(fileName+".h5")
1056       
1057End
1058
1059
1060
1061
1062//////////////////
1063// procedures for an integrated panel to show the masks for all panels on a carriage
1064//
1065// also can be used to show the annular or sector ranges selected for averaging
1066// (so this block may be better located in one of the averaging procedure files)
1067// viewing the standard mask files may be a side benefit
1068//
1069//
1070// generally:
1071// - show the 4 panels on a carriage
1072// - allow selection of the averaging options
1073// - buttons for toggling of the mask, do average
1074//
1075// copy the general panel structure from DIVUtils, and add a larger control area for input
1076// - use the averaging routines from the main data display
1077//
1078
1079
1080Proc V_Display_Four_Panels()
1081        V_SetupPanelDisplay()
1082end
1083
1084Function V_SetupPanelDisplay()
1085        DoWindow/F VSANS_Det_Panels
1086        if(V_flag==0)
1087       
1088                NewDataFolder/O root:Packages:NIST:VSANS:Globals:Mask
1089
1090                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gAnnularQCtr = 0.1
1091                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gAnnularDQ = 0.01
1092
1093                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gSectorAngle = 30
1094                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gSectorDQ = 10
1095               
1096                // check for a mask, if not present, generate a default mask
1097                String str="FT"
1098                wave/Z maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
1099                if(!WaveExists(maskW))
1100                        V_GenerateDefaultMask()
1101                endif
1102                       
1103                Execute "V_Display_Det_Panels()"
1104        endif
1105End
1106
1107
1108//
1109// simple panel to display the 4 detector panels
1110//
1111// TODO:
1112// -- label panels, axes
1113// -- add in display of "B"
1114
1115Proc V_Display_Det_Panels()
1116        PauseUpdate; Silent 1           // building window...
1117        NewPanel /W=(720,45,1500,570)/N=VSANS_Det_Panels/K=1
1118        DoWindow/C VSANS_Det_Panels
1119//      ModifyPanel fixedSize=1,noEdit =1
1120
1121
1122        PopupMenu popup0,pos={15.00,10.00},size={77.00,23.00},proc=V_PickCarriagePopMenuProc,title="Carriage"
1123        PopupMenu popup0,mode=1,value= #"\"F;M;B;\""
1124        PopupMenu popup1,pos={100.00,10.00},size={68.00,23.00},proc=V_PickFolderPopMenuProc,title="Folder"
1125        PopupMenu popup1,mode=1,popvalue="RAW",value= #"\"SAM;EMP;BGD;DIV;COR;CAL;RAW;ABS;STO;SUB;DRK;MSK;ADJ;VCALC;\""
1126//      PopupMenu popup1,mode=1,popvalue="RAW",value= #"\"SAM;EMP;BGD;DIV;COR;CAL;RAW;ABS;STO;SUB;DRK;MSK;ADJ;VCALC;\""
1127        PopupMenu popup2,pos={200.00,10.00},size={83.00,23.00},title="Bin Type"//,proc=V_DummyPopMenuProc
1128        PopupMenu popup2,mode=1,value= ksBinTypeStr
1129        PopupMenu popup3,pos={350,10.00},size={83.00,23.00},title="Average Type"//,proc=V_DummyPopMenuProc
1130        PopupMenu popup3,mode=1,value= #"\"Circular;Sector;Annular;\""
1131//      Button button0,pos={520.00,10.00},size={110.00,20.00},proc=V_UpdatePanelsButtonProc,title="Update Display"
1132        Button button1,pos={520.00,40.00},size={100.00,20.00},proc=V_ToggleFourMaskButtonProc,title="Toggle Mask"
1133        Button button2,pos={350.00,40.00},size={120.00,20.00},proc=V_ShowAvgRangeButtonProc,title="Show Avg Range"
1134        Button button3,pos={350.00,70.00},size={100.00,20.00},proc=V_DoPanelAvgButtonProc,title="Do Average"
1135        Button button4,pos={720.00,10.00},size={25.00,20.00},proc=V_AvgPanelHelpButtonProc,title="?"
1136
1137        SetVariable setvar0,pos={20,40},size={160,23},title="Annulus q-center (A)"
1138        SetVariable setvar0,limits={0,1,0.001},value=root:Packages:NIST:VSANS:Globals:Mask:gAnnularQCtr
1139        SetVariable setvar1,pos={20,70},size={160,23},title="Annulus (+/-) q (A)"
1140        SetVariable setvar1,limits={0,1,0.001},value=root:Packages:NIST:VSANS:Globals:Mask:gAnnularDQ
1141        SetVariable setvar2,pos={190,40},size={150,23},title="Sector Angle (deg)"
1142        SetVariable setvar2,limits={-90,90,1},value=root:Packages:NIST:VSANS:Globals:Mask:gSectorAngle
1143        SetVariable setvar3,pos={190,70},size={150,23},title="Sector (+/-) (deg)"
1144        SetVariable setvar3,limits={0,90,1},value=root:Packages:NIST:VSANS:Globals:Mask:gSectorDQ
1145
1146        PopupMenu popup4,pos={200,100},size={90,23.00},title="Sector Side(s)"//,proc=V_DummyPopMenuProc
1147        PopupMenu popup4,mode=1,value= #"\"both;left;right;\""
1148
1149        Make/O/B/N=(48,128) tmpLR
1150        Make/O/B/N=(128,48) tmpTB
1151        Make/O/B/N=(680,1656) tmpB
1152       
1153        tmpLR = 1
1154        tmpTB = 1
1155        tmpB = 1
1156       
1157//      Display/W=(745,45,945,425)/HOST=#
1158        Display/W=(10,45+80,210,425+80)/HOST=#
1159        //  root:Packages:NIST:VSANS:RAW:entry:instrument:detector_FL:data
1160        AppendImage/T/G=1 tmpLR         //  /G=1 flag prevents interpretation as RGB so 3, 4 slices display correctly
1161
1162        ModifyImage tmpLR ctab= {*,*,ColdWarm,0}
1163        ModifyImage tmpLR ctabAutoscale=3
1164        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1165        ModifyGraph mirror=2
1166        ModifyGraph nticks=4
1167        ModifyGraph minor=1
1168        ModifyGraph fSize=9
1169        ModifyGraph standoff=0
1170        ModifyGraph tkLblRot(left)=90
1171        ModifyGraph btLen=3
1172        ModifyGraph tlOffset=-2
1173        RenameWindow #,Panel_L
1174        SetActiveSubwindow ##
1175
1176//      Display/W=(1300,45,1500,425)/HOST=#
1177        Display/W=(565,45+80,765,425+80)/HOST=#
1178        AppendImage/T/G=1 tmpLR         //  /G=1 flag prevents interpretation as RGB so 3, 4 slices display correctly
1179        ModifyImage tmpLR ctab= {*,*,ColdWarm,0}
1180        ModifyImage tmpLR ctabAutoscale=3
1181        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1182        ModifyGraph mirror=2
1183        ModifyGraph nticks=4
1184        ModifyGraph minor=1
1185        ModifyGraph fSize=9
1186        ModifyGraph standoff=0
1187        ModifyGraph tkLblRot(left)=90
1188        ModifyGraph btLen=3
1189        ModifyGraph tlOffset=-2
1190        RenameWindow #,Panel_R
1191        SetActiveSubwindow ##
1192
1193//      Display/W=(945,45,1300,235)/HOST=#
1194        Display/W=(210,45+80,565,235+80)/HOST=#
1195        AppendImage/T/G=1 tmpTB         //  /G=1 flag prevents interpretation as RGB so 3, 4 slices display correctly
1196        ModifyImage tmpTB ctab= {*,*,ColdWarm,0}
1197        ModifyImage tmpTB ctabAutoscale=3
1198        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1199        ModifyGraph mirror=2
1200        ModifyGraph nticks=4
1201        ModifyGraph minor=1
1202        ModifyGraph fSize=9
1203        ModifyGraph standoff=0
1204        ModifyGraph tkLblRot(left)=90
1205        ModifyGraph btLen=3
1206        ModifyGraph tlOffset=-2
1207        RenameWindow #,Panel_T
1208        SetActiveSubwindow ##
1209
1210//      Display/W=(945,235,1300,425)/HOST=#
1211        Display/W=(210,235+80,565,425+80)/HOST=#
1212        AppendImage/T/G=1 tmpTB         //  /G=1 flag prevents interpretation as RGB so 3, 4 slices display correctly
1213        ModifyImage tmpTB ctab= {*,*,ColdWarm,0}
1214        ModifyImage tmpTB ctabAutoscale=3
1215        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1216        ModifyGraph mirror=2
1217        ModifyGraph nticks=4
1218        ModifyGraph minor=1
1219        ModifyGraph fSize=9
1220        ModifyGraph standoff=0
1221        ModifyGraph tkLblRot(left)=90
1222        ModifyGraph btLen=3
1223        ModifyGraph tlOffset=-2
1224        RenameWindow #,Panel_B
1225        SetActiveSubwindow ##
1226//
1227
1228End
1229
1230
1231// called by the "update" button
1232//
1233// must check for overlay of mask and of avgMask
1234//
1235Function V_UpdateFourPanelDisp()
1236
1237        ControlInfo/W=VSANS_Det_Panels popup0
1238        String carrStr = S_value
1239
1240//      if(cmpstr("B",carrStr)==0)
1241//              DoAlert 0, "Detector B plotting not supported yet"
1242//              return(0)
1243//      endif
1244       
1245        ControlInfo/W=VSANS_Det_Panels popup1
1246        String folder = S_Value
1247
1248        Variable isVCALC=0
1249        if(cmpstr("VCALC",folder)==0)
1250                isVCALC=1
1251        endif
1252
1253        String tmpStr=""
1254//
1255
1256       
1257        // remove everything from each of the 4 panels
1258        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_L",";")
1259        if(ItemsInList(tmpStr) > 0)
1260                do
1261                        RemoveImage /W=VSANS_Det_Panels#Panel_L $(StringFromList(0,tmpStr,";"))         //get 1st item
1262                        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_L",";")                                                          //refresh list
1263                while(ItemsInList(tmpStr) > 0)
1264        endif
1265       
1266        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_R",";")
1267        if(ItemsInList(tmpStr) > 0)
1268                do
1269                        RemoveImage /W=VSANS_Det_Panels#Panel_R $(StringFromList(0,tmpStr,";"))         //get 1st item
1270                        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_R",";")                                                          //refresh list
1271                while(ItemsInList(tmpStr) > 0)
1272        endif
1273       
1274        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_T",";")
1275        if(ItemsInList(tmpStr) > 0)
1276                do
1277                        RemoveImage /W=VSANS_Det_Panels#Panel_T $(StringFromList(0,tmpStr,";"))         //get 1st item
1278                        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_T",";")                                                          //refresh list
1279                while(ItemsInList(tmpStr) > 0)
1280        endif
1281       
1282        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_B",";")
1283        if(ItemsInList(tmpStr) > 0)
1284                do
1285                        RemoveImage /W=VSANS_Det_Panels#Panel_B $(StringFromList(0,tmpStr,";"))         //get 1st item
1286                        tmpStr = ImageNameList("VSANS_Det_Panels#Panel_B",";")                                                          //refresh list
1287                while(ItemsInList(tmpStr) > 0)
1288        endif
1289       
1290
1291        // append the new image
1292        // if back, put this in the "left" postion, and nothing else
1293        if(cmpstr("B",carrStr)==0)
1294                if(isVCALC)
1295                        AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_L $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+":det_"+carrStr)               
1296                        SetActiveSubwindow VSANS_Det_Panels#Panel_L
1297                        ModifyImage ''#0 ctab= {*,*,ColdWarm,0}
1298                        ModifyImage ''#0 ctabAutoscale=3
1299                else
1300                        AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_L $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+":data")               
1301                        SetActiveSubwindow VSANS_Det_Panels#Panel_L
1302                        ModifyImage data ctab= {*,*,ColdWarm,0}
1303                        ModifyImage data ctabAutoscale=3       
1304                endif
1305                ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1306                ModifyGraph mirror=2
1307                ModifyGraph nticks=4
1308                ModifyGraph minor=1
1309                ModifyGraph fSize=9
1310                ModifyGraph standoff=0
1311                ModifyGraph tkLblRot(left)=90
1312                ModifyGraph btLen=3
1313                ModifyGraph tlOffset=-2
1314                SetActiveSubwindow ##
1315                return(0)
1316        endif
1317       
1318//      RemoveImage/Z/W=VSANS_Det_Panels#Panel_L data
1319        if(isVCALC)
1320                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_L $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"L:det_"+carrStr+"L")           
1321                SetActiveSubwindow VSANS_Det_Panels#Panel_L
1322                ModifyImage ''#0 ctab= {*,*,ColdWarm,0}
1323                ModifyImage ''#0 ctabAutoscale=3
1324        else
1325                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_L $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"L:data")               
1326                SetActiveSubwindow VSANS_Det_Panels#Panel_L
1327                ModifyImage data ctab= {*,*,ColdWarm,0}
1328                ModifyImage data ctabAutoscale=3       
1329        endif
1330        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1331        ModifyGraph mirror=2
1332        ModifyGraph nticks=4
1333        ModifyGraph minor=1
1334        ModifyGraph fSize=9
1335        ModifyGraph standoff=0
1336        ModifyGraph tkLblRot(left)=90
1337        ModifyGraph btLen=3
1338        ModifyGraph tlOffset=-2
1339        SetActiveSubwindow ##
1340
1341
1342//      RemoveImage/Z/W=VSANS_Det_Panels#Panel_T data
1343        if(isVCALC)
1344                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_T $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"T:det_"+carrStr+"T")           
1345                SetActiveSubwindow VSANS_Det_Panels#Panel_T
1346                ModifyImage ''#0 ctab= {*,*,ColdWarm,0}
1347                ModifyImage ''#0 ctabAutoscale=3
1348        else
1349                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_T $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"T:data")               
1350                SetActiveSubwindow VSANS_Det_Panels#Panel_T
1351                ModifyImage data ctab= {*,*,ColdWarm,0}
1352                ModifyImage data ctabAutoscale=3
1353        endif
1354        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1355        ModifyGraph mirror=2
1356        ModifyGraph nticks=4
1357        ModifyGraph minor=1
1358        ModifyGraph fSize=9
1359        ModifyGraph standoff=0
1360        ModifyGraph tkLblRot(left)=90
1361        ModifyGraph btLen=3
1362        ModifyGraph tlOffset=-2
1363        SetActiveSubwindow ##
1364       
1365//      RemoveImage/Z/W=VSANS_Det_Panels#Panel_B data
1366        if(isVCALC)
1367                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_B $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"B:det_"+carrStr+"B")           
1368                SetActiveSubwindow VSANS_Det_Panels#Panel_B
1369                ModifyImage ''#0 ctab= {*,*,ColdWarm,0}
1370                ModifyImage ''#0 ctabAutoscale=3
1371        else
1372                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_B $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"B:data")               
1373                SetActiveSubwindow VSANS_Det_Panels#Panel_B
1374                ModifyImage data ctab= {*,*,ColdWarm,0}
1375                ModifyImage data ctabAutoscale=3
1376        endif
1377        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1378        ModifyGraph mirror=2
1379        ModifyGraph nticks=4
1380        ModifyGraph minor=1
1381        ModifyGraph fSize=9
1382        ModifyGraph standoff=0
1383        ModifyGraph tkLblRot(left)=90
1384        ModifyGraph btLen=3
1385        ModifyGraph tlOffset=-2
1386        SetActiveSubwindow ##
1387
1388//      RemoveImage/Z/W=VSANS_Det_Panels#Panel_R data
1389        if(isVCALC)
1390                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_R $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"R:det_"+carrStr+"R")           
1391                SetActiveSubwindow VSANS_Det_Panels#Panel_R
1392                ModifyImage ''#0 ctab= {*,*,ColdWarm,0}
1393                ModifyImage ''#0 ctabAutoscale=3
1394        else
1395                AppendImage/T/G=1/W=VSANS_Det_Panels#Panel_R $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+carrStr+"R:data")               
1396                SetActiveSubwindow VSANS_Det_Panels#Panel_R
1397                ModifyImage data ctab= {*,*,ColdWarm,0}
1398                ModifyImage data ctabAutoscale=3
1399        endif
1400        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
1401        ModifyGraph mirror=2
1402        ModifyGraph nticks=4
1403        ModifyGraph minor=1
1404        ModifyGraph fSize=9
1405        ModifyGraph standoff=0
1406        ModifyGraph tkLblRot(left)=90
1407        ModifyGraph btLen=3
1408        ModifyGraph tlOffset=-2
1409        SetActiveSubwindow ##
1410
1411        return(0)
1412End
1413
1414
1415
1416
1417Function V_PickFolderPopMenuProc(pa) : PopupMenuControl
1418        STRUCT WMPopupAction &pa
1419
1420        switch( pa.eventCode )
1421                case 2: // mouse up
1422                        Variable popNum = pa.popNum
1423                        String popStr = pa.popStr
1424                        break
1425                case -1: // control being killed
1426                        break
1427        endswitch
1428
1429        return 0
1430End
1431
1432Function V_PickCarriagePopMenuProc(pa) : PopupMenuControl
1433        STRUCT WMPopupAction &pa
1434
1435        switch( pa.eventCode )
1436                case 2: // mouse up
1437                        Variable popNum = pa.popNum
1438                        String popStr = pa.popStr
1439                       
1440                        // update the data that is displayed
1441                        V_UpdateFourPanelDisp()
1442                       
1443                        break
1444                case -1: // control being killed
1445                        break
1446        endswitch
1447
1448        return 0
1449End
1450
1451
1452
1453Function V_UpdatePanelsButtonProc(ba) : ButtonControl
1454        STRUCT WMButtonAction &ba
1455
1456        switch( ba.eventCode )
1457                case 2: // mouse up
1458                        // click code here
1459                       
1460                        // do nothing
1461                       
1462                       
1463                               
1464                        break
1465                case -1: // control being killed
1466                        break
1467        endswitch
1468
1469        return 0
1470End
1471
1472//
1473// toggle the mask overlay(s) on/off of the detector panels.
1474//
1475Function V_ToggleFourMaskButtonProc(ba) : ButtonControl
1476        STRUCT WMButtonAction &ba
1477
1478        switch( ba.eventCode )
1479                case 2: // mouse up
1480                        // click code here
1481
1482                        String detStr
1483                        Variable state,isVCALC
1484                       
1485                        ControlInfo/W=VSANS_Det_Panels popup1
1486                        String folderStr = S_Value
1487                       
1488                        ControlInfo/W=VSANS_Det_Panels popup0
1489                        String carrStr = S_Value
1490
1491                        if(cmpstr(folderStr,"VCALC") == 0)
1492                                isVCALC = 1
1493                        else
1494                                isVCALC = 0
1495                        endif
1496
1497// handle "B" separately
1498                        if(cmpstr(carrStr,"B") == 0)
1499                                detStr = carrStr
1500                                // is the mask already there?
1501                                wave/Z overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1502                                CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1503                                if(V_Flag == 1)         //overlay is present, set state = 0 to remove overlay
1504                                        state = 0
1505                                else
1506                                        state = 1
1507                                endif
1508                               
1509                                if(state == 1)
1510                                        //duplicate the mask, which is named "data"
1511                                        wave maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data")
1512                                        // for the wave scaling
1513                                        if(isVCALC)
1514                                                wave data = $("root:Packages:NIST:VSANS:"+folderStr+":entry:instrument:detector_"+detStr+":det_"+detStr)       
1515                                        else
1516                                                wave data = $("root:Packages:NIST:VSANS:"+folderStr+":entry:instrument:detector_"+detStr+":data")       
1517                                        endif
1518                                        Duplicate/O data $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1519                                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1520                                        overlay = maskW         //this copies the data into the properly scaled wave
1521               
1522                                        //"B" uses the L side display                   
1523                        //      Print ImageNameList("VSANS_Det_Panels#Panel_L", ";" )
1524                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1525                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
1526                                                AppendImage/T/W=VSANS_Det_Panels#Panel_L overlay
1527                //                              ModifyImage/W=VSANS_Det_Panels#Panel_L overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1528                                                ModifyImage/W=VSANS_Det_Panels#Panel_L ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1529                                        endif
1530               
1531                                endif           //state == 1
1532               
1533                                if(state == 0)
1534                                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1535               
1536                                        //"B" uses the L side display                   
1537               
1538                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1539                                        if(V_Flag == 1)         //overlay is present
1540                //                              RemoveImage/W=VSANS_Det_Panels#Panel_L overlay
1541                                                RemoveImage/W=VSANS_Det_Panels#Panel_L ''#1
1542                                        endif
1543                                endif           //state == 0
1544                                                               
1545                                return(0)
1546                        endif           //handle carriage B
1547
1548
1549// now toggle the mask for the F or M carriages                 
1550// test the L image to see if I need to remove the mask
1551                        if(cmpstr(carrStr,"F")==0)
1552                                detStr = "FL"
1553                        else
1554                                detStr = "ML"
1555                        endif
1556                       
1557                        wave/Z overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1558                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1559                        if(V_Flag == 1)         //overlay is present, set state = 0 to remove overlay
1560                                state = 0
1561                        else
1562                                state = 1
1563                        endif
1564                       
1565                        if(cmpstr(carrStr,"F") == 0)
1566                                V_OverlayFourMask(folderStr,"FL",state)
1567                                V_OverlayFourMask(folderStr,"FR",state)
1568                                V_OverlayFourMask(folderStr,"FT",state)
1569                                V_OverlayFourMask(folderStr,"FB",state)
1570                        else
1571                                V_OverlayFourMask(folderStr,"ML",state)
1572                                V_OverlayFourMask(folderStr,"MR",state)
1573                                V_OverlayFourMask(folderStr,"MT",state)
1574                                V_OverlayFourMask(folderStr,"MB",state)                                         
1575                        endif
1576                       
1577                        break
1578                case -1: // control being killed
1579                        break
1580        endswitch
1581
1582        return 0
1583End
1584
1585Function V_ShowAvgRangeButtonProc(ba) : ButtonControl
1586        STRUCT WMButtonAction &ba
1587
1588        switch( ba.eventCode )
1589                case 2: // mouse up
1590                        // click code here
1591
1592                        ControlInfo/W=VSANS_Det_Panels popup3
1593                        String av_type = S_Value
1594                       
1595                        ControlInfo/W=VSANS_Det_Panels popup1
1596                        String folderStr = S_Value
1597                       
1598                        ControlInfo/W=VSANS_Det_Panels popup0
1599                        String detGroup = S_Value
1600                       
1601                        Variable isVCALC
1602                        if(cmpstr(folderStr,"VCALC")==0)
1603                                isVCALC = 1
1604                        else
1605                                isVCALC = 0
1606                        endif
1607                       
1608                        // calculate the "mask" to add
1609                       
1610                        // if circular, do nothing
1611                        // if annular
1612                        // if sector           
1613                        // display the mask on the current data
1614                       
1615                        Variable ii
1616                        String detStr
1617                        String str1 = "root:Packages:NIST:VSANS:"+folderStr
1618                        String str2 = ":entry:instrument:detector_"
1619
1620                        strswitch(av_type)      //dispatch to the proper routine to calculate mask
1621
1622                                case "Circular":       
1623                                        //do nothing
1624                                        break                   
1625               
1626                                case "Sector":
1627                                        ControlInfo/W=VSANS_Det_Panels popup4
1628                                        String side = S_Value
1629                                        NVAR phi_rad = root:Packages:NIST:VSANS:Globals:Mask:gSectorAngle
1630                                        NVAR dphi_rad = root:Packages:NIST:VSANS:Globals:Mask:gSectorDQ
1631                                       
1632                                        // loop over all of the panels
1633                                        // calculate phi matrix
1634                                        // fill in the mask
1635                                        for(ii=0;ii<ItemsInList(ksDetectorListAll);ii+=1)
1636                                                detStr = StringFromList(ii, ksDetectorListAll, ";")
1637                                                Wave qTotal = $(str1+str2+detStr+":qTot_"+detStr)
1638                                                Wave phi =      V_MakePhiMatrix(qTotal,folderStr,detStr,str1+str2+detStr)
1639                                                if(isVCALC)
1640                                                        Wave w = $("root:Packages:NIST:VSANS:VCALC:entry:instrument:detector_"+detStr+":det_"+detStr)
1641                                                else
1642                                                        Wave w = V_getDetectorDataW(folderStr,detStr)   //this is simply to get the correct wave scaling on the overlay
1643                                                endif
1644                                                Duplicate/O w $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
1645                                                Wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
1646                                                V_MarkSectorOverlayPixels(phi,overlay,phi_rad,dphi_rad,side)
1647                                        endfor
1648                                       
1649                                        break
1650                                case "Sector_PlusMinus":
1651                                        break
1652                                case "Rectangular":
1653                                        break
1654               
1655                                case "Annular":
1656
1657                                        NVAR qCtr_Ann = root:Packages:NIST:VSANS:Globals:Mask:gAnnularQCtr
1658                                        NVAR qWidth = root:Packages:NIST:VSANS:Globals:Mask:gAnnularDQ                         
1659
1660                                        // loop over all of the panels
1661                                        // fill in the mask
1662                                        for(ii=0;ii<ItemsInList(ksDetectorListAll);ii+=1)
1663                                                detStr = StringFromList(ii, ksDetectorListAll, ";")
1664                                                Wave qTotal = $(str1+str2+detStr+":qTot_"+detStr)
1665                                                if(isVCALC)
1666                                                        Wave w = $("root:Packages:NIST:VSANS:VCALC:entry:instrument:detector_"+detStr+":det_"+detStr)
1667                                                else                                           
1668                                                        Wave w = V_getDetectorDataW(folderStr,detStr)   //this is simply to get the correct wave scaling on the overlay
1669                                                endif
1670                                                Duplicate/O w $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
1671                                                Wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
1672                                                V_MarkAnnularOverlayPixels(qTotal,overlay,qCtr_ann,qWidth)
1673                                        endfor
1674
1675                                        break
1676                                default:       
1677                                        //do nothing
1678                        endswitch
1679                               
1680                       
1681                       
1682                        // switch for the overlay
1683                        strswitch(av_type)
1684                                case "Sector":
1685                                case "Annular":
1686                                case "Sector_PlusMinus":
1687                                case "Rectangular":
1688                                                                               
1689                                        Variable state = 1
1690               
1691                                        ControlInfo/W=VSANS_Det_Panels popup0
1692                                        String carrStr = S_Value
1693
1694// handle "B" separately
1695                                if(cmpstr(carrStr,"B") == 0)
1696                                        detStr = carrStr
1697                                        // is the mask already there?
1698                                        wave/Z overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
1699                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1700                                        if(V_Flag == 1)         //overlay is present, set state = 0 to remove overlay
1701                                                state = 0
1702                                        else
1703                                                state = 1
1704                                        endif
1705                                       
1706                                        V_OverlayFourAvgMask(folderStr,"B",state)
1707                                        return(0)
1708                                endif           //carriage "B"
1709                                       
1710                // test the L image to see if I need to remove the mask
1711                                        if(cmpstr(carrStr,"F")==0)
1712                                                detStr = "FL"
1713                                        else
1714                                                detStr = "ML"
1715                                        endif
1716                                       
1717                                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
1718                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1719                                        if(V_Flag == 1)         //overlay is present
1720                                                state = 0
1721                                        else
1722                                                state = 1
1723                                        endif
1724                                       
1725                                        if(cmpstr(carrStr,"F") == 0)
1726                                                V_OverlayFourAvgMask(folderStr,"FL",state)
1727                                                V_OverlayFourAvgMask(folderStr,"FR",state)
1728                                                V_OverlayFourAvgMask(folderStr,"FT",state)
1729                                                V_OverlayFourAvgMask(folderStr,"FB",state)
1730                                        else
1731                                                V_OverlayFourAvgMask(folderStr,"ML",state)
1732                                                V_OverlayFourAvgMask(folderStr,"MR",state)
1733                                                V_OverlayFourAvgMask(folderStr,"MT",state)
1734                                                V_OverlayFourAvgMask(folderStr,"MB",state)                                             
1735                                        endif
1736                                       
1737                                        break
1738
1739                                default:       
1740                                        //do nothing
1741                        endswitch
1742                       
1743                               
1744                        break
1745                case -1: // control being killed
1746                        break
1747        endswitch
1748
1749        return 0
1750End
1751
1752
1753//
1754// see V_Proto_doAverage() and V_Proto_doPlot()
1755// this duplicates the switch and functionality from these operations
1756//
1757Function V_DoPanelAvgButtonProc(ba) : ButtonControl
1758        STRUCT WMButtonAction &ba
1759
1760        switch( ba.eventCode )
1761                case 2: // mouse up
1762                        // click code here
1763       
1764                        ControlInfo/W=VSANS_Det_Panels popup2
1765                        Variable binType = V_BinTypeStr2Num(S_Value)
1766//                      V_BinningModePopup("",binType,S_Value)          // does binning of current popString and updates the graph
1767
1768                        ControlInfo/W=VSANS_Det_Panels popup3
1769                        String av_type = S_Value
1770                       
1771                        ControlInfo/W=VSANS_Det_Panels popup1
1772                        String activeType = S_Value
1773
1774                        String collimationStr="pinhole"
1775
1776
1777                        strswitch(av_type)      //dispatch to the proper routine to average to 1D data
1778                                case "none":           
1779                                        //still do nothing
1780                                        // set binType and binTypeStr to bad flags
1781                                        String binTypeStr = "none"
1782                                        binType = -999999
1783                                        break                   
1784               
1785                                case "Circular":
1786                                        V_QBinAllPanels_Circular(activeType,binType,collimationStr)             // this does a default circular average
1787                                        V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY)
1788                                        V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned             
1789                                        break
1790                                       
1791                                case "Sector":
1792                                        ControlInfo/W=VSANS_Det_Panels popup4
1793                                        String side = S_Value
1794                                        NVAR phi = root:Packages:NIST:VSANS:Globals:Mask:gSectorAngle
1795                                        NVAR delta = root:Packages:NIST:VSANS:Globals:Mask:gSectorDQ
1796                                                               
1797                                // convert the angles to radians before passing                                 
1798                                        V_QBinAllPanels_Sector(activeType,binType,collimationStr,side,phi*pi/180,delta*pi/180)
1799                                        V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY)
1800                                        V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned             
1801                                        break
1802                                case "Sector_PlusMinus":
1803                //                      Sector_PlusMinus1D(activeType)
1804                                        break
1805                                case "Rectangular":
1806                //                      RectangularAverageTo1D(activeType)
1807                                        break
1808               
1809                                case "Annular":
1810                                        ControlInfo/W=VSANS_Det_Panels popup0
1811                                        String detGroup = S_Value
1812                                        NVAR qCtr_Ann = root:Packages:NIST:VSANS:Globals:Mask:gAnnularQCtr
1813                                        NVAR qWidth = root:Packages:NIST:VSANS:Globals:Mask:gAnnularDQ                         
1814                                        //String detGroup = StringByKey("DETGROUP",avgStr,"=",";")
1815                                        //Variable qCtr_Ann = NumberByKey("QCENTER",avgStr,"=",";")
1816                                        //Variable qWidth = NumberByKey("QDELTA",avgStr,"=",";")
1817                                        V_QBinAllPanels_Annular(activeType,detGroup,qCtr_Ann,qWidth)
1818                                        V_Phi_Graph_Proc(activeType,detGroup)
1819                                        break
1820               
1821                                case "Narrow_Slit":
1822                                        V_QBinAllPanels_Slit(activeType,binType)                // this does a tall, narrow slit average
1823                                        V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY)
1824                                        V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned             
1825                                       
1826                                        break
1827                                       
1828                                case "2D_ASCII":       
1829                                        //do nothing
1830                                        break
1831                                case "QxQy_ASCII":
1832                                        //do nothing
1833                                        break
1834                                case "PNG_Graphic":
1835                                        //do nothing
1836                                        break
1837                                default:       
1838                                        //do nothing
1839                        endswitch
1840
1841                               
1842                        break
1843                case -1: // control being killed
1844                        break
1845        endswitch
1846
1847
1848
1849        return 0
1850End
1851
1852Function V_AvgPanelHelpButtonProc(ba) : ButtonControl
1853        STRUCT WMButtonAction &ba
1854
1855        switch( ba.eventCode )
1856                case 2: // mouse up
1857                        // click code here
1858                       
1859                        DisplayHelpTopic/Z/K=1 "VSANS Data Reduction Documentation[Show Mask for Averaging]"
1860                        if(V_flag !=0)
1861                                DoAlert 0,"The VSANS Data Reduction Tutorial Help file could not be found"
1862                        endif   
1863                                               
1864                        break
1865                case -1: // control being killed
1866                        break
1867        endswitch
1868
1869        return 0
1870End
1871
1872
1873
1874//
1875// overlay the mask
1876//
1877//
1878// if state==1, show the mask, if ==0, hide the mask
1879//
1880//
1881Function V_OverlayFourMask(folderStr,detStr,state)
1882        String folderStr,detStr
1883        Variable state
1884
1885
1886        Variable isVCALC=0
1887        if(cmpstr("VCALC",folderStr)==0)
1888                isVCALC=1
1889        endif
1890       
1891        String maskPath = "root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data"
1892        if(WaveExists($maskPath) == 1)
1893               
1894               
1895                if(state == 1)
1896                        //duplicate the mask, which is named "data"
1897                        wave maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data")
1898                        // for the wave scaling
1899                        if(isVCALC)
1900                                wave data = $("root:Packages:NIST:VSANS:"+folderStr+":entry:instrument:detector_"+detStr+":det_"+detStr)       
1901                        else
1902                                wave data = $("root:Packages:NIST:VSANS:"+folderStr+":entry:instrument:detector_"+detStr+":data")       
1903                        endif
1904                        Duplicate/O data $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1905                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1906                        overlay = maskW         //this copies the data into the properly scaled wave
1907                       
1908                        strswitch(detStr)
1909                                case "ML":
1910                                case "FL":
1911//                                      Print ImageNameList("VSANS_Det_Panels#Panel_L", ";" )
1912                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1913                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
1914                                                AppendImage/T/W=VSANS_Det_Panels#Panel_L overlay
1915                //                              ModifyImage/W=VSANS_Det_Panels#Panel_L overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1916                                                ModifyImage/W=VSANS_Det_Panels#Panel_L ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1917                                        endif
1918                                        break
1919                                case "MR":
1920                                case "FR":
1921                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_R overlay
1922                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
1923                                                AppendImage/T/W=VSANS_Det_Panels#Panel_R overlay
1924                //                              ModifyImage/W=VSANS_Det_Panels#Panel_R overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1925                                                ModifyImage/W=VSANS_Det_Panels#Panel_R ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1926                                        endif
1927                                        break
1928                                case "MT":
1929                                case "FT":
1930                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_T overlay
1931                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
1932                                                AppendImage/T/W=VSANS_Det_Panels#Panel_T overlay
1933                //                              ModifyImage/W=VSANS_Det_Panels#Panel_T overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1934                                                ModifyImage/W=VSANS_Det_Panels#Panel_T ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1935                                        endif
1936                                        break                                   
1937                                case "MB":
1938                                case "FB":
1939                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_B overlay
1940                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
1941                                                AppendImage/T/W=VSANS_Det_Panels#Panel_B overlay
1942                //                              ModifyImage/W=VSANS_Det_Panels#Panel_B overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1943                                                ModifyImage/W=VSANS_Det_Panels#Panel_B ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
1944                                        endif
1945                                        break                                   
1946                                default:                       
1947                                        //
1948                                        Print "off bottom of switch"
1949                        endswitch
1950                endif           //state == 1
1951
1952                if(state == 0)
1953                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
1954
1955                        strswitch(detStr)
1956                                case "ML":
1957                                case "FL":
1958                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
1959                                        if(V_Flag == 1)         //overlay is present
1960                //                              RemoveImage/W=VSANS_Det_Panels#Panel_L overlay
1961                                                RemoveImage/W=VSANS_Det_Panels#Panel_L ''#1
1962                                        endif
1963                                        break
1964                                case "MR":
1965                                case "FR":
1966                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_R overlay
1967                                        if(V_Flag == 1)         //overlay is present
1968                //                              RemoveImage/W=VSANS_Det_Panels#Panel_R overlay
1969                                                RemoveImage/W=VSANS_Det_Panels#Panel_R ''#1
1970                                        endif
1971                                        break
1972                                case "MT":
1973                                case "FT":
1974                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_T overlay
1975                                        if(V_Flag == 1)         //overlay is present
1976                //                              RemoveImage/W=VSANS_Det_Panels#Panel_T overlay
1977                                                RemoveImage/W=VSANS_Det_Panels#Panel_T ''#1
1978                                        endif
1979                                        break                                   
1980                                case "MB":
1981                                case "FB":
1982                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_B overlay
1983                                        if(V_Flag == 1)         //overlay is present
1984                //                              RemoveImage/W=VSANS_Det_Panels#Panel_B overlay
1985                                                RemoveImage/W=VSANS_Det_Panels#Panel_B ''#1
1986                                        endif
1987                                        break                                   
1988                                default:                       
1989                                        //
1990                                        Print "off bottom of switch"
1991                        endswitch
1992                endif           //state == 0
1993               
1994        Endif
1995       
1996        return(0)
1997End
1998
1999
2000//
2001// overlay the mask
2002//
2003//
2004// if state==1, show the mask, if ==0, hide the mask
2005//
2006//
2007Function V_OverlayFourAvgMask(folderStr,detStr,state)
2008        String folderStr,detStr
2009        Variable state
2010
2011//      Variable isVCALC=0
2012//      if(cmpstr("VCALC",folderStr)==0)
2013//              isVCALC=1
2014//      endif
2015       
2016        String maskPath = "root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data"
2017        if(WaveExists($maskPath) == 1)
2018               
2019               
2020                if(state == 1)
2021                        //duplicate the mask, which is named "AvgOverlay_"
2022//                      wave maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data")
2023//                      // for the wave scaling
2024//                      wave data = $("root:Packages:NIST:VSANS:"+folderStr+":entry:instrument:detector_"+detStr+":data")       
2025//                      Duplicate/O data $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":overlay_"+detStr)
2026
2027//                      if(isVCALC)
2028//                              wave overlay = $("root:Packages:NIST:VSANS:"+folderStr+":entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)     
2029//                      else
2030                                wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
2031//                      endif
2032//                      overlay = maskW         //this copies the data into the properly scaled wave
2033                       
2034                        strswitch(detStr)
2035                                case "ML":
2036                                case "FL":
2037                                case "B":
2038//                                      Print ImageNameList("VSANS_Det_Panels#Panel_L", ";" )
2039                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
2040                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
2041                                                AppendImage/T/W=VSANS_Det_Panels#Panel_L overlay
2042                //                              ModifyImage/W=VSANS_Det_Panels#Panel_L overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2043                                                ModifyImage/W=VSANS_Det_Panels#Panel_L ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2044                                        endif
2045                                        break
2046                                case "MR":
2047                                case "FR":
2048                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_R overlay
2049                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
2050                                                AppendImage/T/W=VSANS_Det_Panels#Panel_R overlay
2051                //                              ModifyImage/W=VSANS_Det_Panels#Panel_R overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2052                                                ModifyImage/W=VSANS_Det_Panels#Panel_R ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2053                                        endif
2054                                        break
2055                                case "MT":
2056                                case "FT":
2057                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_T overlay
2058                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
2059                                                AppendImage/T/W=VSANS_Det_Panels#Panel_T overlay
2060                //                              ModifyImage/W=VSANS_Det_Panels#Panel_T overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2061                                                ModifyImage/W=VSANS_Det_Panels#Panel_T ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2062                                        endif
2063                                        break                                   
2064                                case "MB":
2065                                case "FB":
2066                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_B overlay
2067                                        if(V_flag==0)           //so the overlay doesn't get appended more than once
2068                                                AppendImage/T/W=VSANS_Det_Panels#Panel_B overlay
2069                //                              ModifyImage/W=VSANS_Det_Panels#Panel_B overlay ctab= {0.9,0.95,BlueRedGreen,0}  ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2070                                                ModifyImage/W=VSANS_Det_Panels#Panel_B ''#1 ctab= {0.9,0.95,BlueRedGreen,0}     ,minRGB=NaN,maxRGB=(0,65000,0,35000)
2071                                        endif
2072                                        break                                   
2073                                default:                       
2074                                        //
2075                                        Print "off bottom of switch"
2076                        endswitch
2077                endif           //state == 1
2078
2079                if(state == 0)
2080                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":AvgOverlay_"+detStr)
2081
2082                        strswitch(detStr)
2083                                case "ML":
2084                                case "FL":
2085                                case "B":
2086                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_L overlay
2087                                        if(V_Flag == 1)         //overlay is present
2088                //                              RemoveImage/W=VSANS_Det_Panels#Panel_L overlay
2089                                                RemoveImage/W=VSANS_Det_Panels#Panel_L ''#1
2090                                        endif
2091                                        break
2092                                case "MR":
2093                                case "FR":
2094                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_R overlay
2095                                        if(V_Flag == 1)         //overlay is present
2096                //                              RemoveImage/W=VSANS_Det_Panels#Panel_R overlay
2097                                                RemoveImage/W=VSANS_Det_Panels#Panel_R ''#1
2098                                        endif
2099                                        break
2100                                case "MT":
2101                                case "FT":
2102                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_T overlay
2103                                        if(V_Flag == 1)         //overlay is present
2104                //                              RemoveImage/W=VSANS_Det_Panels#Panel_T overlay
2105                                                RemoveImage/W=VSANS_Det_Panels#Panel_T ''#1
2106                                        endif
2107                                        break                                   
2108                                case "MB":
2109                                case "FB":
2110                                        CheckDisplayed/W=VSANS_Det_Panels#Panel_B overlay
2111                                        if(V_Flag == 1)         //overlay is present
2112                //                              RemoveImage/W=VSANS_Det_Panels#Panel_B overlay
2113                                                RemoveImage/W=VSANS_Det_Panels#Panel_B ''#1
2114                                        endif
2115                                        break                                   
2116                                default:                       
2117                                        //
2118                                        Print "off bottom of switch"
2119                        endswitch
2120                endif           //state == 0
2121               
2122        Endif
2123       
2124        return(0)
2125End
2126
2127
Note: See TracBrowser for help on using the repository browser.