source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_Initialize.ipf @ 1236

Last change on this file since 1236 was 1236, checked in by srkline, 3 years ago

additions to the reduction for new corrections to the tube detectors for the angle dependent efficiency and the angle dependent tube shadowing. Calculations have been added, new folder for the efficiency has been added, and preference checkboxes have been updated.

File size: 18.6 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=0.1
3#pragma IgorVersion=6.1
4
5//***********************
6// NOV 2015 Vers 0.1
7//
8// Initialization procedures that must be run before anything
9// this is accomplished by placing:
10//
11// Initialize()
12// #include "includes"
13//
14// in the built-in procedure window of the .pxt (template) experiment
15// IGOR recognizes this, and executes Initialize() immediately after
16// compiling all of the included procedures. This is all done as the blank
17// template is opened
18//
19// Choosing initialize from the VSANS menu will do the same, and no harm is done
20// to the experiment by re- initializing. no data or folders are overwritten
21//
22//************************
23
24Constant kVSANSVersion = 7.99
25
26// TODO -- need to set up a separate file of "constants" or "globals" where the actual numbers are
27//stored. If there are not a lot, that place could be here. InitFacilityGlobals() is currently in NCNR_Utils.ipf
28
29
30// for the change in July 2017 where the beam center is now defined in cm, rather than pixels.
31// this need not ever change from 1
32// the back detector is always treated as a beam center in pixels, since it is the natural definition
33Constant kBCTR_CM = 1                   //set to 1 to use beam center in cm. O to use pixels
34
35// // TODO: -- replace this constant with V_getDet_panel_gap(fname,detStr)
36//Constant kPanelTouchingGap = 10                       // TODO -- measure this gap when panels "touch", UNITS OF mm, not cm
37
38
39// the base data folder path where the raw data is loaded
40Strconstant ksBaseDFPath = "root:Packages:NIST:VSANS:RawVSANS:"
41
42
43// the list of WORK Folders
44// RawVSANS does not behave as a WORK folder, but it is local. so add it in explicitly to the list if needed
45// VCALC behaves *almost* as a WORK folder, but it is local. so add it in explicitly to the list if needed
46//Strconstant ksWorkFolderList = "RAW;SAM;EMP;BGD;COR;DIV;ABS;MSK;CAL;STO;SUB;DRK;ADJ;VCALC;RawVSANS;"
47Strconstant ksWorkFolderListShort = "RAW;SAM;EMP;BGD;COR;DIV;ABS;MSK;CAL;STO;SUB;DRK;ADJ;"
48
49
50// for defining which "bin type" corresponds to which set of extensions for I(q) data
51// !! see V_BinTypeStr2Num() for the numbering, not the order of the list
52//
53//////////////////
54//Strconstant ksBinTypeStr = "One;Two;Four;Slit Mode;"
55Strconstant ksBinTypeStr = "F4-M4-B;F2-M2-B;F1-M1-B;F2-M1-B;F1-M2xTB-B;F2-M2xTB-B;SLIT-F2-M2-B;"
56Strconstant ksBinType1 = "FT;FB;FL;FR;MT;MB;ML;MR;B;"           //these are the "active" extensions
57Strconstant ksBinType2 = "FTB;FLR;MTB;MLR;B;"
58Strconstant ksBinType3 = "FLRTB;MLRTB;B;"
59Strconstant ksBinType4 = "FL;FR;ML;MR;B;"               //in SLIT mode, disregard the T/B panels
60Strconstant ksBinType5 = "FTB;FLR;MLRTB;B;"
61Strconstant ksBinType6 = "FLRTB;MLR;B;"
62Strconstant ksBinType7 = "FTB;FLR;MLR;B;"
63///////////////////
64
65
66// for looping over each detector
67Strconstant ksDetectorListNoB = "FL;FR;FT;FB;ML;MR;MT;MB;"
68Strconstant ksDetectorListAll = "FL;FR;FT;FB;ML;MR;MT;MB;B;"
69
70
71// for Protocols
72Constant kNumProtocolSteps = 12
73// for trimming of the I(q) data sets, and part of the protocol
74Strconstant ksPanelBinTypeList = "B;FT;FB;FL;FR;MT;MB;ML;MR;FTB;FLR;MTB;MLR;FLRTB;MLRTB;"
75Strconstant ksBinTrimBegDefault = "B=5;FT=3;FB=3;FL=3;FR=3;MT=3;MB=3;ML=3;MR=3;FTB=2;FLR=2;MTB=2;MLR=2;FLRTB=1;MLRTB=1;"
76Strconstant ksBinTrimEndDefault = "B=10;FT=5;FB=5;FL=5;FR=5;MT=5;MB=5;ML=5;MR=5;FTB=4;FLR=4;MTB=4;MLR=4;FLRTB=3;MLRTB=3;"
77
78
79
80//////// HIGH RESOLUTION DETECTOR  ///////////////
81
82
83//
84// In May 2019 - after testing with Phil's procesing, the data from the detector has a
85// larger read noise value. It can also no longer be treated  as a constant value, but rather
86// a detector file that is read in and subtracted pixel-by-pixel.
87//
88
89
90// the average read noise level of the back detector
91// taken from multiple runs with the beam off, 6-28-18
92// runs sans12324 - sans12353
93//
94// used in V_Raw_to_Work()
95// average of whole panel (tested several data files) = 208 +/- 14
96//
97// 200 appears to be a better value - (empirical, based on teflon/converging pinhole data)
98//Constant kReadNoiseLevel_bin4 = 200
99//Constant kReadNoiseLevel_Err_bin4 = 14
100// after binning/processing changes from March 2019:
101Constant kReadNoiseLevel_bin4 = 3160                    // from bkg area of sans30201 (a transmission measurement)
102Constant kReadNoiseLevel_Err_bin4 = 50          //estimated
103
104// TODOHIGHRES: these values are complete fiction
105Constant kReadNoiseLevel_bin1 = 20
106Constant kReadNoiseLevel_Err_bin1 = 1
107
108// Pixel shifts for the back detector to bring the three CCDs into registry
109// data from pinholes used to match up CCDs
110// 27 JUN 2018
111// runs 12221,12225,27,33,34,35,38,42
112// middle CCD is not moved
113// See V_ShiftBackDetImage() for implementation
114Constant        kShift_TopX_bin4 = 7
115Constant                kShift_TopY_bin4 = 105
116Constant                kShift_BottomX_bin4 = 5
117Constant                kShift_BottomY_bin4 = 35
118
119// TODOHIGHRES -- these values need to be verified. they are currently simply 4x the bin4 values
120Constant        kShift_TopX_bin1 = 28
121Constant                kShift_TopY_bin1 = 420
122Constant                kShift_BottomX_bin1 = 20
123Constant                kShift_BottomY_bin1 = 130
124
125
126
127
128
129
130
131
132Proc Initialize_VSANS()
133        V_Initialize()
134End
135
136//this is the main initialization procedure that must be the first thing
137//done when opening a new Data reduction experiment
138//
139//sets up data folders, globals, protocols, and draws the main panel
140Proc V_Initialize()
141
142        Variable curVersion = kVSANSVersion
143        Variable oldVersion = NumVarOrDefault("root:VSANS_RED_VERSION",curVersion)
144               
145        if(oldVersion == curVersion)
146                //must just be a new startup with the current version
147                Variable/G root:VSANS_RED_VERSION=kVSANSVersion
148        endif
149       
150        if(oldVersion < curVersion)
151                String str =    "This experiment was created with version "+num2str(oldVersion)+" of the macros. I'll try to make this work, but please start new work with a current template"
152                DoAlert 0,str
153        endif
154       
155        V_InitFolders()
156       
157       
158        V_InitFakeProtocols()
159        V_InitGlobals()
160        V_InitFacilityGlobals()
161        DoWindow/F Main_VSANS_Panel
162        If(V_flag == 0)
163                //draw panel
164                Main_VSANS_Panel()
165        Endif
166//      V_ResizeCmdWindow()
167
168        VC_Initialize_Space()           //initialize folders for VCALC
169
170// TODO - be sure that NCNR is defined correctly       
171        //unload the NCNR_Package_Loader, if NCNR not defined
172        UnloadNCNR_VSANS_Procedures()
173
174End
175
176//creates all the necessary data folders in the root folder
177//does not overwrite any existing folders of the same name
178//it leaves data in them untouched
179//
180// x-- make sure that I have all of the folders that I need
181//
182Function V_InitFolders()
183       
184        NewDataFolder/O root:Packages
185        NewDataFolder/O root:Packages:NIST
186        NewDataFolder/O root:Packages:NIST:VSANS
187       
188// for the file catalog
189        NewDataFolder/O root:Packages:NIST:VSANS:CatVSHeaderInfo
190// for the globals
191        NewDataFolder/O root:Packages:NIST:VSANS:Globals
192        NewDataFolder/O root:Packages:NIST:VSANS:Globals:Efficiency
193       
194// for the raw nexus data (so I don't need to reload to get a single value)
195        NewDataFolder/O root:Packages:NIST:VSANS:RawVSANS
196
197// folders for the reduction steps             
198        NewDataFolder/O root:Packages:NIST:VSANS:RAW
199        NewDataFolder/O root:Packages:NIST:VSANS:SAM
200        NewDataFolder/O root:Packages:NIST:VSANS:EMP
201        NewDataFolder/O root:Packages:NIST:VSANS:BGD
202        NewDataFolder/O root:Packages:NIST:VSANS:COR
203        NewDataFolder/O root:Packages:NIST:VSANS:DIV
204        NewDataFolder/O root:Packages:NIST:VSANS:MSK
205        NewDataFolder/O root:Packages:NIST:VSANS:ABS
206        NewDataFolder/O root:Packages:NIST:VSANS:CAL
207        NewDataFolder/O root:Packages:NIST:VSANS:STO
208        NewDataFolder/O root:Packages:NIST:VSANS:SUB
209        NewDataFolder/O root:Packages:NIST:VSANS:DRK
210        NewDataFolder/O root:Packages:NIST:VSANS:ADJ
211        NewDataFolder/O root:Packages:NIST:VSANS:RealTime
212        NewDataFolder/O root:Packages:NIST:VSANS:VCALC
213        NewDataFolder/O root:Packages:NIST:VSANS:ReadNoise
214
215
216// ?? anything else
217
218// for simulation
219//      NewDataFolder/O root:Packages:NIST:VSANS:SAS
220
221
222       
223        Return(0)
224End
225
226
227
228
229//
230//Global folder already exists...
231//adds appropriate globals to the newly created myGlobals folder
232//return data folder to root: before leaving
233//
234//
235Function V_InitGlobals()
236       
237       
238        Variable/G root:Packages:NIST:VSANS:Globals:gIsLogScale = 0
239        String/G root:Packages:NIST:VSANS:Globals:gCurDispType = "RAW"
240       
241        //check platform, so Angstrom can be drawn correctly
242
243        //TODO  -- this is different on Igor 7. Macintosh # has been updated, but Windows has not
244        // use Print char2num("Å") to find the magic number
245        if(cmpstr("Macintosh",IgorInfo(2)) == 0)
246                String/G root:Packages:NIST:VSANS:Globals:gAngstStr = num2char(197)
247                String/G root:Packages:NIST:gAngstStr = num2char(197)
248                Variable/G root:Packages:NIST:VSANS:Globals:gIsMac = 1
249        else
250                //either Windows or Windows NT
251                String/G root:Packages:NIST:VSANS:Globals:gAngstStr = num2char(-59)
252                String/G root:Packages:NIST:gAngstStr = num2char(-59)
253                Variable/G root:Packages:NIST:VSANS:Globals:gIsMac = 0
254                //SetIgorOption to keep some PC's (graphics cards?) from smoothing the 2D image
255                // SRK APRIL 2019 - removed this, does not exist in Igor 8 on WIN, and cause an error.
256//              Execute "SetIgorOption WinDraw,forceCOLORONCOLOR=1"
257        endif
258       
259        // TODO x- find the SANS preferences, copy over and update for VSANS
260        // x- these are all in PlotUtilsMacro_v40.ipf as the preferences are set up as common
261        // to all packages. I'm not sure that I want to do this with VSANS, but make the packages
262        // separate entities. I'm seeing little benefit of the crossover, especially now that
263        // Analysis is not mine. So for VSANS, there is a new, separate file: V_VSANS_Preferences.ipf
264
265        //this is critical to initialize now - as it has the y/n flags for the detector correction steps
266        Execute "Initialize_VSANSPreferences()"
267
268        Execute "V_TubeZeroPointTables()"                       // correction to the beam center
269       
270        // set the lookup waves for log/lin display of the detector images
271        V_MakeImageLookupTables(10000,0,1)
272
273
274
275        //set flag if Demo Version is detected
276        Variable/G root:Packages:NIST:VSANS:Globals:isDemoVersion = V_isDemo()
277
278
279// for testing
280// if this is set to 1, the OLD (incorrect) cos^3 solid angle will be applied to the tubes
281// and a lot of alerts will pop up...
282        Variable/G root:Packages:NIST:VSANS:Globals:gDo_OLD_SolidAngleCor = 0
283       
284        //set XML globals
285//      String/G root:Packages:NIST:gXMLLoader_Title = ""
286       
287        Return(0)
288End
289
290//
291//num = number of points (10000 seeems to be a good number so far)
292// lo = lower value (between 0 and 1)
293// hi = upper value (between 0 and 1)
294//
295// note that it is currenty NOT OK for lo > hi (!= reversed color scale, right now log(negative) == bad)
296//
297// TODO hi, lo not used properly here, seems to mangle log display now that I'm switching the lo,hi of the ctab
298//
299Function V_MakeImageLookupTables(num,lo,hi)
300        Variable num,lo,hi
301
302                // lookup waves for log and linear display of images
303        // this is used for the main data display. With this, I can use the original
304        // detector data (no copy) and the zeros in the data set are tolerated when displaying
305        // on log scale
306        SetDataFolder root:Packages:NIST:VSANS:Globals
307        Variable val,offset
308       
309        offset = 1/num          //can't use 1/lo if lo == 0
310       
311        Make/O/D/N=(num) logLookupWave,linearLookupWave
312       
313        linearLookupWave = (p+1)/num
314       
315       
316        logLookupWave = log(linearLookupWave)
317        val = logLookupWave[0]
318        logLookupWave += -val + offset
319        val = logLookupWave[num-1]
320        logLookupWave /= val
321       
322        SetDataFolder root:
323       
324        return(0)
325end
326
327//
328// initializes globals that are specific to VSANS
329//
330// there really should be nothing here... all of this should now be in the Nexus data file
331// and not tethered to hard-wired constants.
332//
333// -- what was here was:
334// number of detector pixels
335// pixel size
336// deadtime
337// beamstop "tolerance" to identify Trans files
338// sample aperture offset
339//
340Function V_InitFacilityGlobals()
341
342//      //Detector -specific globals
343//      Variable/G root:myGlobals:gNPixelsX=128
344//      Variable/G root:myGlobals:gNPixelsY=128
345//     
346//      // as of Jan2008, detector pixel sizes are read directly from the file header, so they MUST
347//      // be set correctly in instr.cfg - these values are not used, but declared to avoid errors
348//      Variable/G root:myGlobals:PixelResNG3_ILL = 1.0         //pixel resolution in cm
349//      Variable/G root:myGlobals:PixelResNG5_ILL = 1.0
350//      Variable/G root:myGlobals:PixelResNG7_ILL = 1.0
351//      Variable/G root:myGlobals:PixelResNG3_ORNL = 0.5
352//      Variable/G root:myGlobals:PixelResNG5_ORNL = 0.5
353//      Variable/G root:myGlobals:PixelResNG7_ORNL = 0.5
354//      Variable/G root:myGlobals:PixelResNGB_ORNL = 0.5
355////    Variable/G root:myGlobals:PixelResCGB_ORNL = 0.5                // fiction
356//
357//      Variable/G root:myGlobals:PixelResDefault = 0.5
358//     
359//      Variable/G root:myGlobals:DeadtimeNG3_ILL = 3.0e-6              //deadtime in seconds
360//      Variable/G root:myGlobals:DeadtimeNG5_ILL = 3.0e-6
361//      Variable/G root:myGlobals:DeadtimeNG7_ILL = 3.0e-6
362//      Variable/G root:myGlobals:DeadtimeNGB_ILL = 4.0e-6              // fictional
363//      Variable/G root:myGlobals:DeadtimeNG3_ORNL_VAX = 3.4e-6         //pre - 23-JUL-2009 used VAX
364//      Variable/G root:myGlobals:DeadtimeNG3_ORNL_ICE = 1.5e-6         //post - 23-JUL-2009 used ICE
365//      Variable/G root:myGlobals:DeadtimeNG5_ORNL = 0.6e-6                     //as of 9 MAY 2002
366//      Variable/G root:myGlobals:DeadtimeNG7_ORNL_VAX = 3.4e-6         //pre 25-FEB-2010 used VAX
367//      Variable/G root:myGlobals:DeadtimeNG7_ORNL_ICE = 2.3e-6         //post 25-FEB-2010 used ICE
368//      Variable/G root:myGlobals:DeadtimeNGB_ORNL_ICE = 4.0e-6         //per JGB 16-JAN-2013, best value we have for the oscillating data
369//
370////    Variable/G root:myGlobals:DeadtimeCGB_ORNL_ICE = 1.5e-6         // fiction
371//
372//      Variable/G root:myGlobals:DeadtimeDefault = 3.4e-6
373//
374//      //new 11APR07
375//      Variable/G root:myGlobals:BeamstopXTol = -8                     // (cm) is BS Xpos is -5 cm or less, it's a trans measurement
376//      // sample aperture offset is NOT stored in the VAX header, but it should be
377//      // - when it is, remove the global and write an accessor AND make a place for
378//      // it in the RealsRead
379//      Variable/G root:myGlobals:apOff = 5.0                           // (cm) distance from sample aperture to sample position
380
381End
382
383///////////////////////////////////////////////
384// TODO
385////////////// everything below needs to be re-written for VSANS
386//
387//////////////////////////////////////////////
388
389
390//
391// do I need to make the protocols any longer for VSANS? (yes -- now 12 points)
392// What other options for processing / averaging / saving are needed??
393//  TODO
394// x- likely that I'll want to have #pts to cut from I(q) as input to NSORT within the protocol so that the
395// entire reduction can be automatic
396//
397//
398// x- creates the "base" protocols that should be available, after creating the data folder
399// x- all protocols are kept in the root:Packages:NIST:VSANS:Globals:Protocols folder, created here
400//
401//
402//*****as of 05_2017, protocols are 12 points long, [6] is used for work.drk, [7,8] are for trimmig points, and [9,11] are currently unused
403//
404Function V_InitFakeProtocols()
405       
406        NewDataFolder/O root:Packages:NIST:VSANS:Globals:Protocols
407        Make/O/T $"root:Packages:NIST:VSANS:Globals:Protocols:Base"={"none","none","ask","ask","none","AVTYPE=Circular;SAVE=Yes;NAME=Auto;PLOT=Yes;BINTYPE=F4-M4-B;","DRK=none,DRKMODE=0,","","","","",""}
408        Make/O/T $"root:Packages:NIST:VSANS:Globals:Protocols:DoAll"={"ask","ask","ask","ask","ask","AVTYPE=Circular;SAVE=Yes;NAME=Auto;PLOT=Yes;BINTYPE=F4-M4-B;","DRK=none,DRKMODE=0,","","","","",""}
409        Make/O/T/N=(kNumProtocolSteps) $"root:Packages:NIST:VSANS:Globals:Protocols:CreateNew"                  //null wave
410        //Initialize waves to store values in
411       
412        String/G root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr=""
413        String/G root:Packages:NIST:VSANS:Globals:Protocols:gNewStr=""
414        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr = "AVTYPE=Circular;SAVE=Yes;NAME=Auto;PLOT=Yes;BINTYPE=F4-M4-B;"
415       
416        String/G root:Packages:NIST:VSANS:Globals:Protocols:gBegPtsStr=""
417        String/G root:Packages:NIST:VSANS:Globals:Protocols:gEndPtsStr=""
418        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr=""
419       
420        Return(0)
421End
422
423//simple function to resize the comand window to a nice size, no matter what the resolution
424//need to test out on several different monitors and both platforms
425//
426// could easily be incorporated into the initialization routines to ensure that the
427// command window is always visible at startup of the macros. No need for a hook function
428//
429Function V_ResizeCmdWindow()
430
431        String str=IgorInfo(0),rect="",platform=igorinfo(2)
432        Variable depth,left,top,right,bottom,factor
433       
434        if(cmpstr(platform,"Macintosh")==0)
435                factor=1
436        else
437                factor = 0.6            //fudge factor to get command window on-screen on Windows
438        endif
439        rect = StringByKey("SCREEN1", str  ,":",";")   
440        sscanf rect,"DEPTH=%d,RECT=%d,%d,%d,%d",depth, left,top,right,bottom
441        MoveWindow/C  (left+3)*factor,(bottom-150)*factor,(right-50)*factor,(bottom-10)*factor
442End
443
444// since the NCNR procedures can't be loaded concurrently with the other facility functions,
445// unload this procedure file, and add this to the functions that run at initialization of the
446// experiment
447//
448// TODO - be sure that this unloads correctly
449Function UnloadNCNR_VSANS_Procedures()
450
451#if (exists("NCNR_VSANS")==6)                   //defined in the main #includes file.
452        //do nothing if an NCNR reduction experiment
453#else
454        if(ItemsInList(WinList("NCNR_Package_Loader.ipf", ";","WIN:128")))
455                Execute/P "CloseProc /NAME=\"NCNR_Package_Loader.ipf\""
456                Execute/P "COMPILEPROCEDURES "
457        endif
458#endif
459
460End
461
462//returns 1 if demo version, 0 if full version
463Function V_IsDemo()
464
465        // create small offscreen graph
466        Display/W=(3000,3000,3010,3010)
467        DoWindow/C IsDemoGraph
468
469        // try to save a PICT or bitmap of it to the clipboard
470        SavePICT/Z  as "Clipboard"
471        Variable isDemo= V_Flag != 0    // if error: must be demo
472        DoWindow/K IsDemoGraph
473        return isDemo
474End
475
476// Clean out the RawVSANS folder before saving
477Function BeforeExperimentSaveHook(rN,fileName,path,type,creator,kind)
478        Variable rN,kind
479        String fileName,path,type,creator
480
481        // clean out, so that the file SAVE is not slow due to the large experiment size
482        // TODO -- decide if this is really necessary
483//     
484//      V_CleanOutRawVSANS()
485// present a progress window
486        V_CleanupData_w_Progress(0,1)
487        Printf "Hook cleaned out RawVSANS, experiment saved\r"
488
489        NVAR/Z gHighResBinning = root:Packages:NIST:VSANS:Globals:gHighResBinning
490        if(gHighResBinning == 1)
491// these KillDF are a bad idea - it wipes out all of the current work
492// whenever a save is done - which is the opposite of what you want
493// to happen when you save!
494       
495                Printf "Hook cleaned out WORK folders, experiment saved\r"
496
497                KillDataFolder/Z root:Packages:NIST:VSANS:RAW
498                KillDataFolder/Z root:Packages:NIST:VSANS:SAM
499                KillDataFolder/Z root:Packages:NIST:VSANS:EMP
500                KillDataFolder/Z root:Packages:NIST:VSANS:BGD
501                KillDataFolder/Z root:Packages:NIST:VSANS:COR
502                KillDataFolder/Z root:Packages:NIST:VSANS:DIV
503                KillDataFolder/Z root:Packages:NIST:VSANS:MSK
504                KillDataFolder/Z root:Packages:NIST:VSANS:ABS
505                KillDataFolder/Z root:Packages:NIST:VSANS:CAL
506                KillDataFolder/Z root:Packages:NIST:VSANS:STO
507                KillDataFolder/Z root:Packages:NIST:VSANS:SUB
508                KillDataFolder/Z root:Packages:NIST:VSANS:DRK
509                KillDataFolder/Z root:Packages:NIST:VSANS:ADJ
510                KillDataFolder/Z root:Packages:NIST:VSANS:VCALC
511
512        endif
513// re-create anthing that was killed
514        V_initFolders()
515
516End
Note: See TracBrowser for help on using the repository browser.