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

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

many additions.

Moved unused igor/nexus testing files to Vx_ prefix since they're garbage. Pulled out the useful bits for mask and div R/W and moved those to theire appropriate procedures.

Testing the simple correction of data, only tested basic subtraction. All of it still needs to be verified since I don't have any real header numbers and units yet.

Adjusted the columns on the file catalog to be more appropriate, and added a hook to allow loading of raw data files directly from the table and a popup contextual menu. May add more functionality to it later.

Corrected how the 1D data is plotted so that it correctly uses the binning type. I(q) save now also uses the binning as specified.

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