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

Last change on this file since 1124 was 1124, checked in by srkline, 4 years ago

changes to read in new USANS Raw data structure, based on the file creation date.

Some additional changes to sector averaging and viewing the "avg" masks on the detector panels. still not quite complete.

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