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

Last change on this file was 1246, checked in by srkline, 2 years ago

A large number of changes to the size of panels to enable "Laptop Mode" where all of the panels and controls are scaled down so that they fit on screen and are still in correct proportion. For the laptop I'm using for testing, the resolution is 1920x1080. For this, a scaling of 0.7 seems to work. The on/off of the "laptop Mode" is controlled by a checkbox in the preference panel (under the General tab).

There are still more panels to update in the next commit.

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