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

Last change on this file since 1064 was 1064, checked in by srkline, 5 years ago

many minor changes after real VSANS data collected.

additional procedures added to allow easy correction of the incorrect header information from NICE.

Most notable addition is the pinhole resolution added to the calculation and the I(q) output. White beam is also treated (incorrectly) as a gaussian distrivution, but the results of smeared fitting look to be quite good.

Trimming and sorting routines are now (pinhole) resolution aware.

File identification routines have been updated to use the proper definitions of "purpose" and "intent". Both fields are now in the catalog, to allow for better sorting.

File size: 25.1 KB
Line 
1#pragma TextEncoding = "MacRoman"
2#pragma rtGlobals=3             // Use modern global access method and strict wave access.
3
4//
5// Mask utilities:
6// - loader
7// - simple editor
8// - save mask file
9// - assign mask file to data file
10//
11//
12//  this is (at first) to be a very simple editor to generate masks row/column wise, not drawing
13//  masks with arbitrary shape.
14//
15//
16//
17//
18//
19//
20
21///// LOADING
22
23// TODO
24// -- when mask is loaded, need to be sure to clean up the "extra" waves that may be present
25//
26// -- the overlay and the currentTube waves since these are not overwritten or killed when new mask
27//  data is read in from HDF. need to manually? check for these and delete then, or the data and
28//  mask overlay will be out of sync.
29//
30
31
32// passing null file string presents a dialog
33// called from the Main Button " Read Mask"
34Proc V_LoadMASKData()
35        V_LoadHDF5Data("","MSK")
36End
37
38
39
40//// DRAWING/SAVING
41//
42// TODO:
43// x- CHANGE the mask behavior to a more logical choice - and consistent with SANS
44//   x- CHANGE to:
45// 1 == mask == discard data
46// 0 == no Mask == keep data
47// x- and then make the corresponding changes in the I(Q) routines
48
49
50// x- move the mask generating utilities from VC_HDF5_Utils into this procedure - to keep
51// all of the mask procedures together
52
53
54// TODO
55// -- document the arrow keys moving the tube number and adding/deleting tubes from the mask
56//  this is done through a window hook function (LR moves tube number, up/down = add/delete)
57//
58// TODO
59// -- make the arrow keys Igor 6 compatible - search for specialKeyCode or Keyboard Events in the help file
60//     and what needs to be replaced for Igor 6
61// TODO
62// -- for L/R panels, the maksing of columns should be sufficient. Tubes are vertical. For the T/B panels
63//         the L/R panels cast a vertical shadow (=vertical mask) AND the tubes are horizontal, so the individual
64//         tubes will likely need to be masked in a horizontal line too, per tube. ADD this in...
65
66
67//TODO
68// x- draw a mask
69// x- save a mask (all panels)
70// -- move everything into it's own folder, rather than root:
71// -- be able to save the mask name to the RAW data file
72// -- be able to read a mask based on what name is in the data file
73//
74// x- biggest thing now is to re-write the DrawDetPanel() routine from the beamCenter.ipf
75//    to do what this panel needs
76//
77// x- add this to the list of includes, move the file to SVN, and add it.
78//
79// -- for working with VCALC -- maybe have an automatic generator (if val < -2e6, mask = 0)
80//    this can be checked column-wise to go faster (1st index)
81//
82// x- re-write V_OverlayMask to make the "overlay" wave that has the NaNs, and then the drawing
83//    routines need to be aware of this
84
85
86
87// called from the main button "Draw Mask"
88Proc V_Edit_a_Mask()
89        V_EditMask()
90end
91
92Function V_EditMask()
93        DoWindow/F MaskEditPanel
94        if(V_flag==0)
95       
96                NewDataFolder/O root:Packages:NIST:VSANS:Globals:Mask
97
98                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gMaskTube = 0
99                Variable/G root:Packages:NIST:VSANS:Globals:Mask:gMaskMaxIndex = 47
100               
101                // check for a mask, if not present, generate a default mask
102                String str="FT"
103                wave/Z maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
104                if(!WaveExists(maskW))
105                        V_GenerateDefaultMask()
106                endif
107               
108                Execute "V_MaskEditorPanel()"
109        endif
110End
111
112//
113// TODO
114// -- may need to adjust the display for the different pixel dimensions
115//      ModifyGraph width={Plan,1,bottom,left}
116//
117// TODO
118//  need buttons for:
119//              -- quit (to exit gracefully)
120//    -- help (button is there, fill in the content)
121//
122Proc V_MaskEditorPanel() : Panel
123        PauseUpdate; Silent 1           // building window...
124
125        NewPanel /W=(662,418,1300,960)/N=MaskEditPanel   /K=1
126//      ShowTools/A
127       
128        PopupMenu popup_0,pos={20,50},size={109,20},proc=V_SetMaskPanelPopMenuProc,title="Detector Panel"
129        PopupMenu popup_0,mode=1,popvalue="FT",value= #"\"FL;FR;FT;FB;MR;ML;MT;MB;B;\""
130        PopupMenu popup_2,pos={20,20},size={109,20},title="Data Source"//,proc=SetFldrPopMenuProc
131        PopupMenu popup_2,mode=1,popvalue="RAW",value= #"\"RAW;SAM;VCALC;\""
132
133        SetVariable setvar0,pos={257.00,20.00},size={150.00,14.00},title="tube number"
134        SetVariable setvar0,limits={0,127,1},value=root:Packages:NIST:VSANS:Globals:Mask:gMaskTube
135        Button button_0,pos={257,46.00},size={50.00,20.00},proc=V_AddToMaskButtonProc,title="Add"
136        Button button_1,pos={319.00,46.00},size={50.00,20.00},proc=V_RemoveFromMaskButtonProc,title="Del"
137        Button button_2,pos={409.00,46.00},size={90.00,20.00},proc=V_ToggleMaskButtonProc,title="Toggle"
138        Button button_3,pos={509.00,46.00},size={80.00,20.00},proc=V_SaveMaskButtonProc,title="Save"
139        Button button_4,pos={603.00,10.00},size={20.00,20.00},proc=V_DrawMaskHelpButtonProc,title="?"
140        CheckBox check_0,pos={190.00,23.00},size={37.00,15.00},proc=V_DrawMaskRadioCheckProc,title="Row"
141        CheckBox check_0,value= 0,mode=1
142        CheckBox check_1,pos={190.00,46.00},size={32.00,15.00},proc=V_DrawMaskRadioCheckProc,title="Col"
143        CheckBox check_1,value= 1,mode=1
144
145        SetWindow MaskEditPanel, hook(MyHook)=V_MaskWindowHook
146
147        // draw the correct images
148        //draw the detector panel
149        V_DrawPanelToMask("FT")
150       
151        // overlay the current mask
152        V_OverlayMask("FT",1)
153
154EndMacro
155
156Function V_DrawMaskHelpButtonProc(ba) : ButtonControl
157        STRUCT WMButtonAction &ba
158
159        switch( ba.eventCode )
160                case 2: // mouse up
161                        // click code here
162                        DoAlert 0, "Draw Mask Help not written yet..."
163                        break
164                case -1: // control being killed
165                        break
166        endswitch
167
168        return 0
169End
170
171//
172//a simple toggle between the two, so the logic is not done in the cleanest way.
173//
174// update the limits on the tube nubmer based on row/col and the panel (gMaskMaxIndex global)
175//
176Function V_DrawMaskRadioCheckProc(cba) : CheckBoxControl
177        STRUCT WMCheckboxAction &cba
178
179        switch( cba.eventCode )
180                case 2: // mouse up
181                        Variable checked = cba.checked
182                        String name = cba.ctrlName
183                       
184                        //get information to update the limits on the tube number setvar
185                        ControlInfo popup_0
186                        String str=S_Value
187                        wave data = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
188                        Variable val
189                       
190                        // update the radio button status and the setvar limits                 
191                        if(cmpstr(name,"check_0") == 0)         // ROW is being selected
192                                CheckBox check_0,value = 1
193                                CheckBox check_1,value = 0
194                                val = DimSize(data, 1) -1
195                        else
196                                // COL is being selected
197                                CheckBox check_0,value = 0
198                                CheckBox check_1,value = 1
199                                val = DimSize(data, 0) -1
200                        endif
201
202//                      print "max = ",val
203                                               
204                        SetVariable setvar0,limits={0,val,1}
205                        NVAR gVal = root:Packages:NIST:VSANS:Globals:Mask:gMaskTube
206                        NVAR gMax = root:Packages:NIST:VSANS:Globals:Mask:gMaskMaxIndex
207                        gMax = val
208                        if(gVal > val)
209                                gVal = val
210                        endif
211                       
212                        break
213                case -1: // control being killed
214                        break
215        endswitch
216
217        return 0
218End
219
220Function V_MaskWindowHook(s)
221        STRUCT WMWinHookStruct &s
222       
223        Variable hookResult = 0 // 0 if we do not handle event, 1 if we handle it.
224       
225        String message = ""
226
227        switch(s.eventCode)
228                case 11:        // Keyboard event
229//                      String keyCodeInfo
230//                      sprintf keyCodeInfo, "s.keycode = 0x%04X", s.keycode
231//                      if (strlen(message) > 0)
232//                              message += "\r"
233//                      endif
234//                      message +=keyCodeInfo
235//
236//                      message += "\r"
237//                      String specialKeyCodeInfo
238//                      sprintf specialKeyCodeInfo, "s.specialKeyCode = %d", s.specialKeyCode
239//                      message +=specialKeyCodeInfo
240//                      message += "\r"
241//
242//                      String keyTextInfo
243//                      sprintf keyTextInfo, "s.keyText = \"%s\"", s.keyText
244//                      message +=keyTextInfo
245//
246//                      String text = "\\Z24" + message
247//                      Textbox /C/N=Message/W=KeyboardEventsGraph/A=MT/X=0/Y=15 text
248
249                // NOTE:  these special keyCodes are all Igor-7 ONLY
250
251// Note that I need to keep track of the index value since I'm intercepting the
252// SetVariable event here. I need to keep the index in range.           
253                        STRUCT WMButtonAction ba
254                        ba.eventCode = 2
255                        NVAR tubeVal = root:Packages:NIST:VSANS:Globals:Mask:gMaskTube
256                        if(s.specialKeyCode == 100)
257                                //left arrow
258                                tubeVal -= 1
259                        endif
260                        if(s.specialKeyCode == 101)
261                                //right arrow
262                                tubeVal += 1
263                        endif
264                        if(s.specialKeyCode == 102)
265                                //up arrow
266                                V_AddToMaskButtonProc(ba)
267                        endif
268                        if(s.specialKeyCode == 103)
269                                //down arrow
270                                V_RemoveFromMaskButtonProc(ba)
271                        endif
272
273// enforce the limits on the setvar
274                        NVAR gMax = root:Packages:NIST:VSANS:Globals:Mask:gMaskMaxIndex
275                        if(tubeVal > gMax)
276                                tubeVal = gMax
277                        endif
278                        if(tubeVal < 0)
279                                tubeVal = 0
280                        endif
281                       
282// draw the "currentTube" every time
283                        ControlInfo popup_0
284                        String str=S_Value
285                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
286
287                        // update so that the proper row is displayed on the currentTube
288                        currentTube = 0
289                       
290                        ControlInfo check_0             // is it row?
291                        Variable isRow = V_value
292                        if(isRow)
293                                currentTube[][tubeVal] = 1                     
294                        else
295                                currentTube[tubeVal][] = 1
296                        endif           
297
298
299                        hookResult = 1  // We handled keystroke
300                        break
301        endswitch
302       
303        return hookResult               // If non-zero, we handled event and Igor will ignore it.
304End
305
306
307Function V_ToggleMaskButtonProc(ba) : ButtonControl
308        STRUCT WMButtonAction &ba
309
310        switch( ba.eventCode )
311                case 2: // mouse up
312                        // click code here
313                       
314                        ControlInfo popup_0
315                        String str=S_Value
316
317                        wave/Z overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
318                       
319                        CheckDisplayed/W=MaskEditPanel#DetData overlay
320                        Variable state = !(V_flag)              //if V_flag == 0, then set to 1 (and vice versa)
321                        V_OverlayMask(str,state)
322
323                        break
324                case -1: // control being killed
325                        break
326        endswitch
327
328        return 0
329End
330
331
332Function V_AddToMaskButtonProc(ba) : ButtonControl
333        STRUCT WMButtonAction &ba
334
335        switch( ba.eventCode )
336                case 2: // mouse up
337                        // click code here
338                        ControlInfo popup_0
339                        String str=S_Value
340                       
341                        wave/Z maskData = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
342                       
343                        Variable val
344                        ControlInfo setvar0             //get the tube number
345                        val = V_Value
346                       
347                        ControlInfo check_0             // is it row?
348                        Variable isRow = V_value
349                        if(isRow)
350                                maskData[][val] = 1                     
351                        else
352                                maskData[val][] = 1
353                        endif
354                       
355                        V_OverlayMask(str,1)
356                       
357                        break
358                case -1: // control being killed
359                        break
360        endswitch
361
362        return 0
363End
364
365Function V_RemoveFromMaskButtonProc(ba) : ButtonControl
366        STRUCT WMButtonAction &ba
367
368        switch( ba.eventCode )
369                case 2: // mouse up
370                        // click code here
371                        ControlInfo popup_0
372                        String str=S_Value
373                       
374                        wave/Z maskData = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
375                       
376                        Variable val
377                        ControlInfo setvar0 // get the tube number
378                        val = V_Value
379                       
380                        ControlInfo check_0             // is it row?
381                        Variable isRow = V_value
382                        if(isRow)
383                                maskData[][val] = 0                     
384                        else
385                                maskData[val][] = 0
386                        endif
387                       
388                        V_OverlayMask(str,1)   
389                                       
390                        break
391                case -1: // control being killed
392                        break
393        endswitch
394
395        return 0
396End
397
398//
399// function to choose which detector panel to display, and then to actually display it
400//
401Function V_SetMaskPanelPopMenuProc(pa) : PopupMenuControl
402        STRUCT WMPopupAction &pa
403
404        switch( pa.eventCode )
405                case 2: // mouse up
406                        Variable popNum = pa.popNum
407                        String popStr = pa.popStr
408                                               
409                        // remove the old image (it may not be the right shape)
410                        // -- but make sure it exists first...
411                        String childList = ChildWindowList("MaskEditPanel")
412                        Variable flag
413                       
414                        flag = WhichListItem("DetData", ChildList)              //returns -1 if not in list, 0+ otherwise
415                        if(flag != -1)
416                                KillWindow MaskEditPanel#DetData
417                        endif
418                       
419                        flag = WhichListItem("ModelData", ChildList)
420                        if(flag != -1)
421                                KillWindow MaskEditPanel#ModelData
422                        endif
423       
424                        // draw the correct images
425                        V_DrawPanelToMask(popStr)
426
427                        // fake a "click" on the radio buttons to re-set the row/col limits
428                        STRUCT WMCheckboxAction cba
429                        cba.eventCode = 2
430                       
431                        ControlInfo check_0
432                        if(V_flag == 1)         //row is currently selected
433                                cba.ctrlName = "check_0"
434                        else
435                                cba.ctrlName = "check_1"
436                        endif
437                       
438                        V_DrawMaskRadioCheckProc(cba)           //call the radio button action proc     
439                       
440                        //overlay the mask
441                        V_OverlayMask(popStr,1)
442
443                        break
444                case -1: // control being killed
445                        break
446        endswitch
447
448        return 0
449End
450
451//
452// SEE DrawDetPanel() in the BeamCenter file
453//
454// TODO
455// x- currently is hard-wired for the simulation path!   need to make it more generic, especially for RAW data
456//
457// -- need to adjust the size of the image subwindows to keep the model
458//    calculation from spilling over onto the table (maybe just move the table)
459// -- need to do something for panel "B". currently ignored
460// -- currently the pixel sizes for "real" data is incorrect in the file
461//     and this is why the plots are incorrectly sized
462// -- error checking if the data does not exist in selected work folder
463//
464// draw the selected panel and the model calculation, adjusting for the
465// orientation of the panel and the number of pixels, and pixel sizes
466Function V_DrawPanelToMask(str)
467        String str
468       
469        // from the selection, find the path to the data
470
471        Variable xDim,yDim
472        Variable left,top,right,bottom
473        Variable height, width
474        Variable left2,top2,right2,bottom2
475        Variable nPix_X,nPix_Y,pixSize_X,pixSize_Y
476
477       
478//      Wave dispW=root:curDispPanel
479
480        //plot it in the subwindow with the proper aspect and positioning
481        // for 48x256 (8mm x 4mm), aspect = (256/2)/48 = 2.67 (LR panels)
482        // for 128x48 (4mm x 8 mm), aspect = 48/(128/2) = 0.75 (TB panels)
483       
484       
485        // using two switches -- one to set the panel-specific dimensions
486        // and the other to set the "common" values, some of which are based on the panel dimensions
487
488// set the source of the data. not always VCALC anymore
489        String folder
490        ControlInfo popup_2
491        folder = S_Value
492
493        // TODO -- fix all of this mess
494        if(cmpstr(folder,"VCALC") == 0)
495                // panel-specific values
496                Variable VC_nPix_X = VCALC_get_nPix_X(str)
497                Variable VC_nPix_Y = VCALC_get_nPix_Y(str)
498                Variable VC_pixSize_X = VCALC_getPixSizeX(str)
499                Variable VC_pixSize_Y = VCALC_getPixSizeY(str)
500
501       
502        // if VCALC declare this way   
503                wave newW = $("root:Packages:NIST:VSANS:VCALC:entry:instrument:detector_"+str+":det_"+str)
504                nPix_X = VC_nPix_X
505                nPix_Y = VC_nPix_Y
506                pixSize_X = VC_pixSize_X
507                pixSize_Y = VC_pixSize_Y
508       
509        else
510        // TODO: if real data, need new declaration w/ data as the wave name
511                wave newW = $("root:Packages:NIST:VSANS:"+folder+":entry:instrument:detector_"+str+":data")
512
513                nPix_X = V_getDet_pixel_num_x(folder,str)
514                nPix_Y = V_getDet_pixel_num_Y(folder,str)
515                pixSize_X = V_getDet_x_pixel_size(folder,str)/10
516                pixSize_Y = V_getDet_y_pixel_size(folder,str)/10
517        endif
518       
519
520        Variable scale = 10
521       
522        // common values (panel position, etc)
523        // TODO -- units are absolute, based on pixels in cm. make sure this is always correct
524        strswitch(str)
525                case "FL":
526                case "FR":
527                case "ML":
528                case "MR":
529                        width = trunc(nPix_X*pixSize_X *scale*1.15)                     //48 tubes @ 8 mm
530                        height = trunc(nPix_Y*pixSize_Y *scale*0.8)                     //128 pixels @ 8 mm
531                       
532                        left = 20
533                        top = 80
534                        right = left+width
535                        bottom = top+height
536                       
537                        left2 = right + 20
538                        right2 = left2 + width
539                        top2 = top
540                        bottom2 = bottom
541                       
542                        break                   
543                case "FT":
544                case "FB":
545                case "MT":
546                case "MB":
547                        width = trunc(nPix_X*pixSize_X *scale*1.)                       //128 pix @ 4 mm
548                        height = trunc(nPix_Y*pixSize_Y *scale)                 // 48 tubes @ 8 mm
549                                               
550                        left = 20
551                        top = 80
552                        right = left+width
553                        bottom = top+height
554                       
555                        left2 = left
556                        right2 = right
557                        top2 = top + height + 20
558                        bottom2 = bottom + height + 20
559                       
560                        break
561                case "B":
562                        return(0)               //just exit
563                        break                                           
564                default:
565                        return(0)               //just exit
566        endswitch
567
568        SetDataFolder root:Packages:NIST:VSANS:Globals:Mask
569       
570        // generate the new panel display
571        duplicate/O newW curDispPanel
572        SetScale/P x 0,1, curDispPanel
573        SetScale/P y 0,1, curDispPanel
574       
575        Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
576
577        //draw the detector panel
578        Display/W=(left,top,right,bottom)/HOST=#
579        AppendImage curDispPanel
580        ModifyImage curDispPanel ctab= {*,*,ColdWarm,0}
581//      ModifyImage curDispPanel log=1          // this fails, since there are data values that are zero
582        ModifyImage curDispPanel ctabAutoscale=0,lookup= LookupWave
583        Label left "Y pixels"
584        Label bottom "X pixels"
585        RenameWindow #,DetData
586        SetActiveSubwindow ##   
587       
588        DoUpdate
589       
590        SetDataFolder root:
591        return(0)
592End
593
594//
595// overlay the mask
596//
597//
598// x- remove the old mask first
599// x- make the mask "toggle" to remove it
600// x- go see SANS for color, implementation, etc.
601// x- un-comment the (two) calls
602//
603//
604//toggles a mask on/off of the SANS_Data window
605// points directly to window, doesn't need current display type
606//
607// if state==1, show the mask, if ==0, hide the mask
608//
609//** This assumes that if the overlay is/not present on the image display, then the currentTube is also there/not
610// and is not checked
611//
612Function V_OverlayMask(str,state)
613        String str
614        Variable state
615
616
617        String maskPath = "root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data"
618        if(WaveExists($maskPath) == 1)
619                if(state == 1)
620                        //duplicate the mask, which is named "data"
621                        wave maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")
622       
623                        Duplicate/O maskW $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
624                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
625                        Duplicate/O maskW $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
626                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
627
628                        Redimension/D overlay,currentTube
629                        SetScale/P x 0,1, overlay,currentTube
630                        SetScale/P y 0,1, overlay,currentTube
631               
632                        //              overlay = (maskW == 1) ? 1 : NaN                        //no need to do this - simply adjust the coloring
633
634                        // update so that the proper row is displayed on the currentTube
635                        currentTube = 0
636                                               
637                        Variable val
638                        ControlInfo setvar0             //get the tube number
639                        val = V_Value
640                       
641                        ControlInfo check_0             // is it row?
642                        Variable isRow = V_value
643                        if(isRow)
644                                currentTube[][val] = 1                 
645                        else
646                                currentTube[val][] = 1
647                        endif                   
648                               
649                        CheckDisplayed/W=MaskEditPanel#DetData overlay
650                        if(V_flag==0)           //so the overlay doesn't get appended more than once
651                                AppendImage/W=MaskEditPanel#DetData overlay
652                                AppendImage/W=MaskEditPanel#DetData currentTube
653                                ModifyImage/W=MaskEditPanel#DetData overlay ctab= {0.9,1,BlueRedGreen,0}        ,minRGB=NaN,maxRGB=0
654                                ModifyImage/W=MaskEditPanel#DetData currentTube ctab= {0.9,1,CyanMagenta,0}     ,minRGB=NaN,maxRGB=0
655                //              ModifyImage/W=MaskEditPanel#DetData overlay ctab= {0,*,BlueRedGreen,0} 
656                        endif
657                endif
658
659                if(state == 0)
660                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay")
661                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube")
662
663                        CheckDisplayed/W=MaskEditPanel#DetData overlay
664//                      Print "V_flag = ",V_flag
665       
666                        If(V_Flag == 1)         //overlay is present
667                                RemoveImage/W=MaskEditPanel#DetData overlay
668                                RemoveImage/W=MaskEditPanel#DetData currentTube
669                        endif
670                endif
671        Endif
672       
673        return(0)
674End
675
676
677Function V_SaveMaskButtonProc(ba) : ButtonControl
678        STRUCT WMButtonAction &ba
679
680        switch( ba.eventCode )
681                case 2: // mouse up
682                        // click code here
683                       
684                        // fills in a "default mask" in a separate folder to then write out
685                        Execute "H_Setup_VSANS_MASK_Structure()"
686                       
687                        // fill with current "stuff"
688                        SetDataFolder root:VSANS_MASK_file:entry       
689                        Wave/T title    = title
690                        title = "This is a custom MASK file for VSANS: VSANS_MASK"
691                        SetDataFolder root:
692                       
693                       
694                // copy over what was actually drawn for all of the detector panels
695
696                        Variable ii
697                        String str
698                        for(ii=0;ii<ItemsInList(ksDetectorListAll);ii+=1)
699                                str = StringFromList(ii, ksDetectorListAll, ";")
700                                Wave det_str = $("root:VSANS_MASK_file:entry:instrument:detector_"+str+":data")
701                                wave maskW = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data")                   
702                                det_str = maskW
703                        endfor
704
705                        //save it
706//                      String fileName = "ThisIsAMASK"
707
708                        Execute "Save_VSANS_MASK_Nexus()"
709                       
710                        break
711                case -1: // control being killed
712                        break
713        endswitch
714
715        SetDataFolder root:
716        return 0
717End
718
719
720////////////// fake MASK file tests
721//
722//
723//      Make/O/T/N=1    file_name       = "VSANS_MASK_test.h5"
724//
725// simple generation of a fake MASK file. for sans, nothing other than the creation date was written to the
726// file header. nothing more is needed (possibly)
727//
728//
729// TODO
730// -- make the number of pixels GLOBAL
731//  x- there will be lots of work to do to develop the procedures necessary to actually generate the
732//      9 data sets to become the MASK file contents. More complexity here than for the simple SANS case.
733//
734//  x- this is currently random 0|1 values, need to write an editor
735//
736// currently set up to use 1 = YES MASK == exclude the data
737//      and 0 = NO MASK == keep the data
738//
739Proc H_Setup_VSANS_MASK_Structure()
740       
741        NewDataFolder/O/S root:VSANS_MASK_file         
742
743        NewDataFolder/O/S root:VSANS_MASK_file:entry   
744                Make/O/T/N=1    title   = "This is a MASK file for VSANS: VSANS_MASK"
745                Make/O/T/N=1    start_date      = "2015-02-28T08:15:30-5:00"
746                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument         
747                        Make/O/T/N=1    name    = "NG3_VSANS"
748                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_B     
749                        Make/O/I/N=(150,150)    data    = 0
750                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_MR             
751                        Make/O/I/N=(48,128)     data    = 0
752                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_ML             
753                        Make/O/I/N=(48,128)     data    = 0
754                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_MT             
755                        Make/O/I/N=(128,48)     data    = 0
756                        data[0,49][] = 1
757                        data[78,127][] = 1
758                        data[50,77][] = 0
759                       
760                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_MB             
761                        Make/O/I/N=(128,48)     data    = 0
762                        data[0,49][] = 1
763                        data[78,127][] = 1
764                        data[50,77][] = 0
765                       
766                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FR             
767                        Make/O/I/N=(48,128)     data    = 0
768                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FL             
769                        Make/O/I/N=(48,128)     data    = 0
770                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FT             
771                        Make/O/I/N=(128,48)     data    = 0
772                        data[0,49][] = 1
773                        data[78,127][] = 1
774                        data[50,77][] = 0
775
776                NewDataFolder/O/S root:VSANS_MASK_file:entry:instrument:detector_FB             
777                        Make/O/I/N=(128,48)     data    = 0
778                        data[0,49][] = 1
779                        data[78,127][] = 1
780                        data[50,77][] = 0
781
782
783                // fake, empty folders so that the generic loaders can be used
784                NewDataFolder/O root:VSANS_MASK_file:entry:DAS_logs
785                NewDataFolder/O root:VSANS_MASK_file:entry:control
786                NewDataFolder/O root:VSANS_MASK_file:entry:reduction
787                NewDataFolder/O root:VSANS_MASK_file:entry:sample
788                NewDataFolder/O root:VSANS_MASK_file:entry:user                 
789        SetDataFolder root:
790
791End
792
793
794// this default mask is only generated on startup of the panel, if a mask
795// has not been previously loaded. If any mask is present ("FT" is tested) then
796// this function is skipped and the existing mask is not overwritten
797Function V_GenerateDefaultMask()
798
799        NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry   
800                Make/O/T/N=1    title   = "This is a MASK file for VSANS: VSANS_MASK"
801                Make/O/T/N=1    start_date      = "2015-02-28T08:15:30-5:00"
802                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument         
803                        Make/O/T/N=1    name    = "NG3_VSANS"
804                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_B     
805                        Make/O/I/N=(150,150)    data    = 0
806                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_MR             
807                        Make/O/I/N=(48,128)     data    = 0
808                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_ML             
809                        Make/O/I/N=(48,128)     data    = 0
810                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_MT             
811                        Make/O/I/N=(128,48)     data    = 0
812                        data[0,49][] = 1
813                        data[78,127][] = 1
814                        data[50,77][] = 0
815                       
816                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_MB             
817                        Make/O/I/N=(128,48)     data    = 0
818                        data[0,49][] = 1
819                        data[78,127][] = 1
820                        data[50,77][] = 0
821                       
822                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FR             
823                        Make/O/I/N=(48,128)     data    = 0
824                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FL             
825                        Make/O/I/N=(48,128)     data    = 0
826                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FT             
827                        Make/O/I/N=(128,48)     data    = 0
828                        data[0,49][] = 1
829                        data[78,127][] = 1
830                        data[50,77][] = 0
831
832                NewDataFolder/O/S root:Packages:NIST:VSANS:MSK:entry:instrument:detector_FB             
833                        Make/O/I/N=(128,48)     data    = 0
834                        data[0,49][] = 1
835                        data[78,127][] = 1
836                        data[50,77][] = 0
837                       
838        SetDataFolder root:
839
840end
841
842////////////////////// MASK FILE
843
844
845// TODO
846// -- currently, there are no dummy fill values or attributes for the fake MASK file
847//
848Proc Setup_VSANS_MASK_Struct()
849
850        // lays out the tree and fills with dummy values
851        H_Setup_VSANS_MASK_Structure()
852       
853        // writes in the attributes
854//      H_Fill_VSANS_Attributes()
855       
856
857End
858
859Proc Save_VSANS_MASK_Nexus(fileName)
860        String fileName="Test_VSANS_MASK_file"
861
862        // save as HDF5 (no attributes saved yet)
863        Save_VSANS_file("root:VSANS_MASK_file", fileName+".h5")
864       
865//      // read in a data file using the gateway-- reads from the home path
866//      H_HDF5Gate_Read_Raw(fileName+".h5")
867//     
868//      // after reading in a "partial" file using the gateway (to generate the xref)
869//      // Save the xref to disk (for later use)
870//      Save_HDF5___xref("root:"+fileName,"HDF5___xref")
871//     
872//      // after you've generated the HDF5___xref, load it in and copy it
873//      // to the necessary folder location.
874//      Copy_HDF5___xref("root:VSANS_MASK_file", "HDF5___xref")
875//     
876//      // writes out the contents of a data folder using the gateway
877//      H_HDF5Gate_Write_Raw("root:VSANS_MASK_file", fileName+".h5")
878//
879//      // re-load the data file using the gateway-- reads from the home path
880//      // now with attributes
881//      H_HDF5Gate_Read_Raw(fileName+".h5")
882       
883End
Note: See TracBrowser for help on using the repository browser.