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

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

this is a test commit

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