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

Last change on this file since 1141 was 1141, checked in by srkline, 4 years ago

updates to the beam center corrections that take into account the lateral variation of zero points of the tubes. This is an important correction to the reference beam center, especially when the graphite monochrmoator is used.

various bug fixes included as part of reduction , largely to catch missing or incorrect information in the file header.

New "patch" functions have been added for number of guides, beam stops, source aperture, etc. which were missing in the file and caused the resolution calculation to be totally incorrect.

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