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

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

main changes here are the addition of a first pass at the file catalog, and patch panel. each of these is based on the old SANS file (for now) and has been updated to at least compile.

Much more work needs to be done to get the functionality to be what VSANS needs, both in what is important to report in the file catalog, and how to best present the patch GUI for different situations

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