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

Last change on this file since 1074 was 1074, checked in by srkline, 5 years ago

Important change -- re-worked the calculation of how the detector panel "gap" is treated. It is now split equally between the panels rather than assigned to one panel. Makes no difference in the q calculation, simply a philosophical change that should make the measured beam centers make a little more sense, as they will be symmetric.

Changed the appearance and function of the panel to select the "trim" values for the combined 1D data sets. Data no longer needs to be saved as ITX and re-read into the panel. Simply uses the data binning popup and the current data.

File size: 15.1 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
24
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
32Constant kBCTR_CM = 1                   //set to 1 to use beam center in cm. O to use pixels
33
34// // TODO: -- replace this constant with V_getDet_panel_gap(fname,detStr)
35//Constant kPanelTouchingGap = 10                       // TODO -- measure this gap when panels "touch", UNITS OF mm, not cm
36
37
38// the base data folder path where the raw data is loaded
39Strconstant ksBaseDFPath = "root:Packages:NIST:VSANS:RawVSANS:"
40
41
42// the list of WORK Folders
43// RawVSANS does not behave as a WORK folder, but it is local. so add it in explicitly to the list if needed
44// VCALC behaves *almost* as a WORK folder, but it is local. so add it in explicitly to the list if needed
45//Strconstant ksWorkFolderList = "RAW;SAM;EMP;BGD;COR;DIV;ABS;MSK;CAL;STO;SUB;DRK;ADJ;VCALC;RawVSANS;"
46Strconstant ksWorkFolderListShort = "RAW;SAM;EMP;BGD;COR;DIV;ABS;MSK;CAL;STO;SUB;DRK;ADJ;"
47
48
49// for defining which "bin type" corresponds to which set of extensions for I(q) data
50// !! see V_BinTypeStr2Num() for the numbering, not the order of the list
51//
52//////////////////
53//Strconstant ksBinTypeStr = "One;Two;Four;Slit Mode;"
54Strconstant ksBinTypeStr = "F4-M4-B;F2-M2-B;F1-M1-B;F2-M1-B;F1-M2xTB-B;F2-M2xTB-B;SLIT-F2-M2-B;"
55Strconstant ksBinType1 = "FT;FB;FL;FR;MT;MB;ML;MR;B;"           //these are the "active" extensions
56Strconstant ksBinType2 = "FTB;FLR;MTB;MLR;B;"
57Strconstant ksBinType3 = "FLRTB;MLRTB;B;"
58//Strconstant ksBinType4 = "FT;FB;FL;FR;MT;MB;ML;MR;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
81Proc Initialize_VSANS()
82        V_Initialize()
83End
84
85//this is the main initualization procedure that must be the first thing
86//done when opening a new Data reduction experiment
87//
88//sets up data folders, globals, protocols, and draws the main panel
89Proc V_Initialize()
90
91        Variable curVersion = 0.1
92        Variable oldVersion = NumVarOrDefault("root:VSANS_RED_VERSION",curVersion)
93               
94        if(oldVersion == curVersion)
95                //must just be a new startup with the current version
96                Variable/G root:VSANS_RED_VERSION=0.1
97        endif
98       
99        if(oldVersion < curVersion)
100                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"
101                DoAlert 0,str
102        endif
103       
104        V_InitFolders()
105        V_InitFakeProtocols()
106        V_InitGlobals()
107        V_InitFacilityGlobals()
108        DoWindow/F Main_VSANS_Panel
109        If(V_flag == 0)
110                //draw panel
111                Main_VSANS_Panel()
112        Endif
113//      ResizeCmdWindow()
114
115// TODO - be sure that NCNR is defined correctly       
116        //unload the NCNR_Package_Loader, if NCNR not defined
117        UnloadNCNR_VSANS_Procedures()
118
119End
120
121//creates all the necessary data folders in the root folder
122//does not overwrite any existing folders of the same name
123//it leaves data in them untouched
124//
125// x-- make sure that I have all of the folders that I need
126//
127Function V_InitFolders()
128       
129        NewDataFolder/O root:Packages
130        NewDataFolder/O root:Packages:NIST
131        NewDataFolder/O root:Packages:NIST:VSANS
132       
133// for the file catalog
134        NewDataFolder/O root:Packages:NIST:VSANS:CatVSHeaderInfo
135// for the globals
136        NewDataFolder/O root:Packages:NIST:VSANS:Globals
137// for the raw nexus data (so I don't need to reload to get a single value)
138        NewDataFolder/O root:Packages:NIST:VSANS:RawVSANS
139
140// folders for the reduction steps             
141        NewDataFolder/O root:Packages:NIST:VSANS:RAW
142        NewDataFolder/O root:Packages:NIST:VSANS:SAM
143        NewDataFolder/O root:Packages:NIST:VSANS:EMP
144        NewDataFolder/O root:Packages:NIST:VSANS:BGD
145        NewDataFolder/O root:Packages:NIST:VSANS:COR
146        NewDataFolder/O root:Packages:NIST:VSANS:DIV
147        NewDataFolder/O root:Packages:NIST:VSANS:MSK
148        NewDataFolder/O root:Packages:NIST:VSANS:ABS
149        NewDataFolder/O root:Packages:NIST:VSANS:CAL
150        NewDataFolder/O root:Packages:NIST:VSANS:STO
151        NewDataFolder/O root:Packages:NIST:VSANS:SUB
152        NewDataFolder/O root:Packages:NIST:VSANS:DRK
153        NewDataFolder/O root:Packages:NIST:VSANS:ADJ
154
155
156// ?? anything else
157
158// for simulation
159//      NewDataFolder/O root:Packages:NIST:VSANS:SAS
160
161
162       
163        Return(0)
164End
165
166
167
168
169//
170//Global folder already exists...
171//adds appropriate globals to the newly created myGlobals folder
172//return data folder to root: before leaving
173//
174//
175Function V_InitGlobals()
176       
177       
178        Variable/G root:Packages:NIST:VSANS:Globals:gIsLogScale = 0
179        String/G root:Packages:NIST:VSANS:Globals:gCurDispType = "RAW"
180       
181        //check platform, so Angstrom can be drawn correctly
182
183        //TODO  -- this is different on Igor 7. Macintosh # has been updated, but Windows has not
184        // use Print char2num("Å") to find the magic number
185        if(cmpstr("Macintosh",IgorInfo(2)) == 0)
186                String/G root:Packages:NIST:VSANS:Globals:gAngstStr = num2char(197)
187                String/G root:Packages:NIST:gAngstStr = num2char(197)
188                Variable/G root:Packages:NIST:VSANS:Globals:gIsMac = 1
189        else
190                //either Windows or Windows NT
191                String/G root:Packages:NIST:VSANS:Globals:gAngstStr = num2char(-59)
192                String/G root:Packages:NIST:gAngstStr = num2char(-59)
193                Variable/G root:Packages:NIST:VSANS:Globals:gIsMac = 0
194                //SetIgorOption to keep some PC's (graphics cards?) from smoothing the 2D image
195                Execute "SetIgorOption WinDraw,forceCOLORONCOLOR=1"
196        endif
197       
198        // TODO x- find the SANS preferences, copy over and update for VSANS
199        // x- these are all in PlotUtilsMacro_v40.ipf as the preferences are set up as common
200        // to all packages. I'm not sure that I want to do this with VSANS, but make the packages
201        // separate entities. I'm seeing little benefit of the crossover, especially now that
202        // Analysis is not mine. So for VSANS, there is a new, separate file: V_VSANS_Preferences.ipf
203
204        //this is critical to initialize now - as it has the y/n flags for the detector correction steps
205        Execute "Initialize_VSANSPreferences()"
206
207       
208        // set the lookup waves for log/lin display of the detector images
209        V_MakeImageLookupTables(10000,0,1)
210
211
212
213        //set flag if Demo Version is detected
214        Variable/G root:Packages:NIST:VSANS:Globals:isDemoVersion = V_isDemo()
215       
216        //set XML globals
217//      String/G root:Packages:NIST:gXMLLoader_Title = ""
218       
219        Return(0)
220End
221
222//
223//num = number of points (10000 seeems to be a good number so far)
224// lo = lower value (between 0 and 1)
225// hi = upper value (between 0 and 1)
226//
227// note that it is currenty NOT OK for lo > hi (!= reversed color scale, right now log(negative) == bad)
228//
229// TODO hi, lo not used properly here, seems to mangle log display now that I'm switching the lo,hi of the ctab
230//
231Function V_MakeImageLookupTables(num,lo,hi)
232        Variable num,lo,hi
233
234                // lookup waves for log and linear display of images
235        // this is used for the main data display. With this, I can use the original
236        // detector data (no copy) and the zeros in the data set are tolerated when displaying
237        // on log scale
238        SetDataFolder root:Packages:NIST:VSANS:Globals
239        Variable val,offset
240       
241        offset = 1/num          //can't use 1/lo if lo == 0
242       
243        Make/O/D/N=(num) logLookupWave,linearLookupWave
244       
245        linearLookupWave = (p+1)/num
246       
247       
248        logLookupWave = log(linearLookupWave)
249        val = logLookupWave[0]
250        logLookupWave += -val + offset
251        val = logLookupWave[num-1]
252        logLookupWave /= val
253       
254        SetDataFolder root:
255       
256        return(0)
257end
258
259//
260// initializes globals that are specific to VSANS
261//
262// there really should be nothing here... all of this should now be in the Nexus data file
263// and not tethered to hard-wired constants.
264//
265// -- what was here was:
266// number of detector pixels
267// pixel size
268// deadtime
269// beamstop "tolerance" to identify Trans files
270// sample aperture offset
271//
272Function V_InitFacilityGlobals()
273
274//      //Detector -specific globals
275//      Variable/G root:myGlobals:gNPixelsX=128
276//      Variable/G root:myGlobals:gNPixelsY=128
277//     
278//      // as of Jan2008, detector pixel sizes are read directly from the file header, so they MUST
279//      // be set correctly in instr.cfg - these values are not used, but declared to avoid errors
280//      Variable/G root:myGlobals:PixelResNG3_ILL = 1.0         //pixel resolution in cm
281//      Variable/G root:myGlobals:PixelResNG5_ILL = 1.0
282//      Variable/G root:myGlobals:PixelResNG7_ILL = 1.0
283//      Variable/G root:myGlobals:PixelResNG3_ORNL = 0.5
284//      Variable/G root:myGlobals:PixelResNG5_ORNL = 0.5
285//      Variable/G root:myGlobals:PixelResNG7_ORNL = 0.5
286//      Variable/G root:myGlobals:PixelResNGB_ORNL = 0.5
287////    Variable/G root:myGlobals:PixelResCGB_ORNL = 0.5                // fiction
288//
289//      Variable/G root:myGlobals:PixelResDefault = 0.5
290//     
291//      Variable/G root:myGlobals:DeadtimeNG3_ILL = 3.0e-6              //deadtime in seconds
292//      Variable/G root:myGlobals:DeadtimeNG5_ILL = 3.0e-6
293//      Variable/G root:myGlobals:DeadtimeNG7_ILL = 3.0e-6
294//      Variable/G root:myGlobals:DeadtimeNGB_ILL = 4.0e-6              // fictional
295//      Variable/G root:myGlobals:DeadtimeNG3_ORNL_VAX = 3.4e-6         //pre - 23-JUL-2009 used VAX
296//      Variable/G root:myGlobals:DeadtimeNG3_ORNL_ICE = 1.5e-6         //post - 23-JUL-2009 used ICE
297//      Variable/G root:myGlobals:DeadtimeNG5_ORNL = 0.6e-6                     //as of 9 MAY 2002
298//      Variable/G root:myGlobals:DeadtimeNG7_ORNL_VAX = 3.4e-6         //pre 25-FEB-2010 used VAX
299//      Variable/G root:myGlobals:DeadtimeNG7_ORNL_ICE = 2.3e-6         //post 25-FEB-2010 used ICE
300//      Variable/G root:myGlobals:DeadtimeNGB_ORNL_ICE = 4.0e-6         //per JGB 16-JAN-2013, best value we have for the oscillating data
301//
302////    Variable/G root:myGlobals:DeadtimeCGB_ORNL_ICE = 1.5e-6         // fiction
303//
304//      Variable/G root:myGlobals:DeadtimeDefault = 3.4e-6
305//
306//      //new 11APR07
307//      Variable/G root:myGlobals:BeamstopXTol = -8                     // (cm) is BS Xpos is -5 cm or less, it's a trans measurement
308//      // sample aperture offset is NOT stored in the VAX header, but it should be
309//      // - when it is, remove the global and write an accessor AND make a place for
310//      // it in the RealsRead
311//      Variable/G root:myGlobals:apOff = 5.0                           // (cm) distance from sample aperture to sample position
312
313End
314
315///////////////////////////////////////////////
316// TODO
317////////////// everything below needs to be re-written for VSANS
318//
319//////////////////////////////////////////////
320
321
322//
323// do I need to make the protocols any longer for VSANS? (yes -- now 12 points)
324// What other options for processing / averaging / saving are needed??
325//  TODO
326// x- likely that I'll want to have #pts to cut from I(q) as input to NSORT within the protocol so that the
327// entire reduction can be automatic
328//
329//
330// x- creates the "base" protocols that should be available, after creating the data folder
331// x- all protocols are kept in the root:Packages:NIST:VSANS:Globals:Protocols folder, created here
332//
333//
334//*****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
335//
336Function V_InitFakeProtocols()
337       
338        NewDataFolder/O root:Packages:NIST:VSANS:Globals:Protocols
339        Make/O/T $"root:Packages:NIST:VSANS:Globals:Protocols:Base"={"none","none","ask","ask","none","AVTYPE=Circular;SAVE=Yes;NAME=Manual;PLOT=Yes","DRK=none,DRKMODE=0,","","","","",""}
340        Make/O/T $"root:Packages:NIST:VSANS:Globals:Protocols:DoAll"={"ask","ask","ask","ask","ask","AVTYPE=Circular;SAVE=Yes;NAME=Manual;PLOT=Yes","DRK=none,DRKMODE=0,","","","","",""}
341        Make/O/T/N=(kNumProtocolSteps) $"root:Packages:NIST:VSANS:Globals:Protocols:CreateNew"                  //null wave
342        //Initialize waves to store values in
343       
344        String/G root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr=""
345        String/G root:Packages:NIST:VSANS:Globals:Protocols:gNewStr=""
346        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr = "AVTYPE=Circular;SAVE=Yes;NAME=Auto;PLOT=Yes;BINTYPE=One;"
347       
348        String/G root:Packages:NIST:VSANS:Globals:Protocols:gBegPtsStr=""
349        String/G root:Packages:NIST:VSANS:Globals:Protocols:gEndPtsStr=""
350       
351        Return(0)
352End
353
354//simple function to resize the comand window to a nice size, no matter what the resolution
355//need to test out on several different monitors and both platforms
356//
357// could easily be incorporated into the initialization routines to ensure that the
358// command window is always visible at startup of the macros. No need for a hook function
359//
360Function ResizeCmdWindow()
361
362        String str=IgorInfo(0),rect="",platform=igorinfo(2)
363        Variable depth,left,top,right,bottom,factor
364       
365        if(cmpstr(platform,"Macintosh")==0)
366                factor=1
367        else
368                factor = 0.6            //fudge factor to get command window on-screen on Windows
369        endif
370        rect = StringByKey("SCREEN1", str  ,":",";")   
371        sscanf rect,"DEPTH=%d,RECT=%d,%d,%d,%d",depth, left,top,right,bottom
372        MoveWindow/C  (left+3)*factor,(bottom-150)*factor,(right-50)*factor,(bottom-10)*factor
373End
374
375// since the NCNR procedures can't be loaded concurrently with the other facility functions,
376// unload this procedure file, and add this to the functions that run at initialization of the
377// experiment
378//
379// TODO - be sure that this unloads correctly
380Function UnloadNCNR_VSANS_Procedures()
381
382#if (exists("NCNR_VSANS")==6)                   //defined in the main #includes file.
383        //do nothing if an NCNR reduction experiment
384#else
385        if(ItemsInList(WinList("NCNR_Package_Loader.ipf", ";","WIN:128")))
386                Execute/P "CloseProc /NAME=\"NCNR_Package_Loader.ipf\""
387                Execute/P "COMPILEPROCEDURES "
388        endif
389#endif
390
391End
392
393//returns 1 if demo version, 0 if full version
394Function V_IsDemo()
395
396        // create small offscreen graph
397        Display/W=(3000,3000,3010,3010)
398        DoWindow/C IsDemoGraph
399
400        // try to save a PICT or bitmap of it to the clipboard
401        SavePICT/Z  as "Clipboard"
402        Variable isDemo= V_Flag != 0    // if error: must be demo
403        DoWindow/K IsDemoGraph
404        return isDemo
405End
406
407// Clean out the RawVSANS folder before saving
408Function BeforeExperimentSaveHook(rN,fileName,path,type,creator,kind)
409        Variable rN,kind
410        String fileName,path,type,creator
411
412        // clean out, so that the file SAVE is not slow due to the large experiment size
413        // TODO -- decide if this is really necessary
414//     
415//      V_CleanOutRawVSANS()
416// present a progress window
417        V_CleanupData_w_Progress(0,1)
418        Printf "Hook cleaned out RawVSANS, experiment saved\r"
419
420End
Note: See TracBrowser for help on using the repository browser.