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

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

increasing setVariable control size on the masking panel so that the sector parameters are more visible on windows computers.

Added the capability to save smoothed (not desmeared) data files from the USANs desmearing panel. These smoothed data files are re-saved with the -dQv value that they were loaded with, since they are still smeared USANS data sets. They are saved with the ".smth" extension.

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