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

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

VSANS: changes here are simply cleaning up comments and TODO items

SANS: added a contextual menu simialr to VSANS so that RAW, MSK, DIV can be directly loaded from the FileCatalog?, in the sam way that they are in VSANS

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