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

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

fixing two bugs related to naming and parsing mask files names.

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={50,40},size={140,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={50,70},size={140,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={200,40},size={140,23},title="Sector Angle (deg)"
1139        SetVariable setvar2,limits={-90,90,1},value=root:Packages:NIST:VSANS:Globals:Mask:gSectorAngle
1140        SetVariable setvar3,pos={200,70},size={140,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.