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

Last change on this file since 1025 was 1025, checked in by srkline, 6 years ago

many changes to get the basics of a reduction protocol working

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