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

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

fix bugs in operation of patch panel (wrong button function) and bugs in mask draw panel where the maximum row/column allowed was not being updated.

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