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

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

added some test procedures to make it easier to calculate and patch the corrected beam center to a series of files. This new method can be found under the VSANS menu.

Changed the mask drawing objects to be semi-transparent to allow easier masking of bad spots - since you can see what you're doing now.

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