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

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

some addtions:

DIV file generation is now aware of the High resolution detector, but the procedures are still awaiting data for testing.

Read Noise file can now be read in and stored in the (RAW) folder ReadNoise?. This is not a work folder and the data isnot changed from the RAW state. This image is then subtracted from other raw data as it is converted to a work file (SAM, EMP, etc.) Previously, only a constant value was subtracted. If the ReadNoise? data is not present, the constant will be subtracted. There is a menu option to load the ReadNoise? data.

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