source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/USANS/U_CALC.ipf @ 564

Last change on this file since 564 was 564, checked in by srkline, 13 years ago

A variety of changes...

  • fixed model strings for Sum_Model
  • /Z flag for RTHelp, Transmission help, FIT help, MRED help
  • added help and done buttons to SASCALC
  • added comments in MonteCarlo?
  • restored the 2-line buttons in USANS panels, now supported in Igor 6.1 (COR_Graph and Main_USANS)
  • added simple text notebook of UCALC configuration, and a save of PNG of the whole panel
  • added help and done buttons to UCALC
  • added links in SANS_Reduction_Help to the simluation help file (not added to SVN yet)
File size: 54.2 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2
3
4// USANS version of SASCALC
5
6// to simulate the intensity from a USANS experiment for planning
7// see John's instrument paper:
8//
9// J. Appl. Cryst. (2005) 38 1004-1011.
10//
11// SRK JUL 2009
12
13
14// ideas:
15//
16// - more presets
17//
18// - NEED -
19// - printable output that makes sense to an instrument scientist at least
20//   for instrument setup
21//
22// - make sure that the # points <-> increment relation meshes with ICP
23
24//
25// X plot as countrate, not absolute scale
26// X 3e-5 cutoff
27// X ? don't plot lowest angle range (but needs to be in the count time)
28// - need empty beam and empty cell count rate vs. aperture (Cd vs. Gd?)
29//
30
31
32// need to add in empty and background corrections to see "reduced" data
33// or at least compare to what the empty cell would give in the same count time
34//
35// -? model the direct beam?? currently the "red" region from -1 to 0.6 is almost entirely
36// the primary beam, so it's a bit artificial (qmin is really ~ 3e-5)
37//
38
39//
40// Need T_wide, T_rock, I peak for proper absolute scaling, but I don't know if it's really important
41// to be able to simlulate to this extent
42//
43
44
45//#include "MultScatter_MonteCarlo_2D"
46
47
48
49// Bring the UCALC panel to the front
50// ALWAYS initializes the folders and variables
51// then draws the panel if necessary
52Proc Show_UCALC()
53
54        Init_UCALC()
55        DoWindow/F UCALC
56        if(V_Flag==0)
57                UCALC_Panel()
58                CalcTotalCountTime()
59                ControlUpdate/W=UCALC U_popup0          //force a pop of the function list
60        Endif
61       
62End
63
64
65//set up the global values for the angles, # points, and count time
66Proc Init_UCALC()
67       
68        //
69        NewDataFolder/O root:Simulation                         // required to calculate the RandomDeviate
70        NewDataFolder/O root:Packages:NIST:SAS                          // required to calculate the RandomDeviate
71
72//
73        NewDataFolder/O root:Packages:NIST:USANS:SIM            //for the fake raw data
74        NewDataFolder/O/S root:Packages:NIST:USANS:Globals:U_Sim                //for constants, panel, etc
75
76        Variable/G gAngLow1 = -1
77        Variable/G gAngHigh1 = 0.6
78        Variable/G gNumPts1 = 33
79        Variable/G gCtTime1 = 25
80        Variable/G gIncr1 = 0.05       
81       
82        Variable/G gAngLow2 = 0.7
83        Variable/G gAngHigh2 = 1.9
84        Variable/G gNumPts2 = 13
85        Variable/G gCtTime2 = 100
86        Variable/G gIncr2 = 0.1
87       
88        Variable/G gAngLow3 = 2
89        Variable/G gAngHigh3 = 4.8
90        Variable/G gNumPts3 = 15
91        Variable/G gCtTime3 = 300
92        Variable/G gIncr3 = 0.2
93       
94        Variable/G gAngLow4 = 5
95        Variable/G gAngHigh4 = 9.5
96        Variable/G gNumPts4 = 10
97        Variable/G gCtTime4 = 600
98        Variable/G gIncr4 = 0.5
99       
100        Variable/G gAngLow5 = 10
101        Variable/G gAngHigh5 = 19
102        Variable/G gNumPts5 = 10
103        Variable/G gCtTime5 = 1200
104        Variable/G gIncr5 = 1
105       
106        Variable/G gAngLow6 = 20
107        Variable/G gAngHigh6 = 48
108        Variable/G gNumPts6 = 15
109        Variable/G gCtTime6 = 2000
110        Variable/G gIncr6 = 2   
111       
112        Variable/G gAngLow7 = 50
113        Variable/G gAngHigh7 = 95
114        Variable/G gNumPts7 = 10
115        Variable/G gCtTime7 = 3000
116        Variable/G gIncr7 = 5   
117       
118        // results, setup values
119        String/G gFuncStr=""
120        String/G gTotTimeStr=""
121        Variable/G gAnalyzerOmega = 7.1e-7              //solid angle of the analyzer, in steradians
122        Variable/G gBeamCurrent=25000           //beam current Ed*I     (n/s) for 5/8" diam = 25000 n/s
123        Variable/G gThick=0.1           //sample thickness (cm)
124        Variable/G gSamTrans=0.8
125        Variable/G g_1D_DoABS = 0               //=1 for abs scale, 0 for just counts
126        Variable/G g_1D_PlotCR = 1              //=1 to plot countrate
127        Variable/G g_1D_AddNoise = 1            // add in appropriate noise to simulation
128       
129// a box for the results
130        // ??   maybe not useful to report
131        Variable/G g_1DEstDetCR  = 0            // estimated detector count rate
132        Variable/G g_1DTotCts = 0               
133        Variable/G g_1DFracScatt= 0     // ??
134        Variable/G g_1DEstTrans = 0     // ? can I calculate this?
135
136// not on panel yet
137        Variable/G g_Empirical_EMP = 0          // use an emperical model for empty cell subtraction
138        Variable/G g_EmptyLevel = 0.7
139        Variable/G g_BkgLevel = 0.6
140
141        SetDataFolder root:
142       
143End
144
145//// make the display panel a graph with a control bar just as in SASCALC
146//// so that the subwindow syntax doesn't break all of the other functionality
147////
148//Window UCALC_Panel() : Graph
149//      PauseUpdate; Silent 1           // building window...
150//      Display /W=(55,44,670,850) /K=1
151//      ModifyGraph cbRGB=(36929,50412,31845)
152//      DoWindow/C UCALC
153//      DoWindow/T UCALC,"USANS Simulation"
154//      ControlBar 320
155//     
156//      GroupBox group0,pos={5,0},size={577,159},title="Instrument Setup"
157//      GroupBox group1,pos={5,165},size={240,147},title="Sample Setup"
158//      GroupBox group2,pos={327,165},size={259,147},title="Results"
159//     
160//      PopupMenu popup0,pos={17,18},size={165,20},title="Sample Aperture Diam (in)"
161//      PopupMenu popup0,mode=3,popvalue="0.625",value="0.25;0.50;0.625;0.75;1.0;1.75;2.0;"
162//      PopupMenu popup2,pos={220,18},size={165,20},title="Presets"
163//      PopupMenu popup2,mode=3,popvalue="Long Count",value="Short Count;Medium Count;Long Count;"
164//      PopupMenu popup2,proc=UCALC_PresetPopup
165//
166//      SetDataFolder root:Packages:NIST:USANS:Globals:U_Sim
167//     
168//      Variable top=44,pt=0,inc=18
169//      SetVariable setvar1a,pos={12,top},size={100,15},title="theta min",value= gAngLow1
170//      SetVariable setvar1b,pos={119,top},size={100,15},title="theta max",value= gAngHigh1
171//      SetVariable setvar1c,pos={227,top},size={100,15},title="increm",value= gIncr1
172//      SetVariable setvar1d,pos={335,top},size={100,15},title="# points",value= gNumPts1
173//      SetVariable setvar1e,pos={443,top},size={100,15},title="count (s)",value= gCtTime1
174//      SetVariable setvar1a,labelBack=(65535,32768,32768)
175//     
176//      pt += inc
177//      SetVariable setvar2a,pos={12,top+pt},size={100,15},title="theta min",value= gAngLow2
178//      SetVariable setvar2b,pos={119,top+pt},size={100,15},title="theta max",value= gAngHigh2
179//      SetVariable setvar2c,pos={227,top+pt},size={100,15},title="increm",value= gIncr2
180//      SetVariable setvar2d,pos={335,top+pt},size={100,15},title="# points",value= gNumPts2
181//      SetVariable setvar2e,pos={443,top+pt},size={100,15},title="count (s)",value= gCtTime2
182//      SetVariable setvar2a labelBack=(65535,65533,32768)
183//     
184//      pt += inc
185//      SetVariable setvar3a,pos={12,top+pt},size={100,15},title="theta min",value= gAngLow3
186//      SetVariable setvar3b,pos={119,top+pt},size={100,15},title="theta max",value= gAngHigh3
187//      SetVariable setvar3c,pos={227,top+pt},size={100,15},title="increm",value= gIncr3
188//      SetVariable setvar3d,pos={335,top+pt},size={100,15},title="# points",value= gNumPts3
189//      SetVariable setvar3e,pos={443,top+pt},size={100,15},title="count (s)",value= gCtTime3
190//      SetVariable setvar3a labelBack=(32769,65535,32768)
191//     
192//      pt += inc
193//      SetVariable setvar4a,pos={12,top+pt},size={100,15},title="theta min",value= gAngLow4
194//      SetVariable setvar4b,pos={119,top+pt},size={100,15},title="theta max",value= gAngHigh4
195//      SetVariable setvar4c,pos={227,top+pt},size={100,15},title="increm",value= gIncr4
196//      SetVariable setvar4d,pos={335,top+pt},size={100,15},title="# points",value= gNumPts4
197//      SetVariable setvar4e,pos={443,top+pt},size={100,15},title="count (s)",value= gCtTime4
198//      SetVariable setvar4a labelBack=(32768,65535,65535)
199//     
200//      pt += inc
201//      SetVariable setvar5a,pos={12,top+pt},size={100,15},title="theta min",value= gAngLow5
202//      SetVariable setvar5b,pos={119,top+pt},size={100,15},title="theta max",value= gAngHigh5
203//      SetVariable setvar5c,pos={227,top+pt},size={100,15},title="increm",value= gIncr5
204//      SetVariable setvar5d,pos={335,top+pt},size={100,15},title="# points",value= gNumPts5
205//      SetVariable setvar5e,pos={443,top+pt},size={100,15},title="count (s)",value= gCtTime5
206//      SetVariable setvar5a labelBack=(32768,54615,65535)
207//     
208//      pt += inc
209//      SetVariable setvar6a,pos={12,top+pt},size={100,15},title="theta min",value= gAngLow6
210//      SetVariable setvar6b,pos={119,top+pt},size={100,15},title="theta max",value= gAngHigh6
211//      SetVariable setvar6c,pos={227,top+pt},size={100,15},title="increm",value= gIncr6
212//      SetVariable setvar6d,pos={335,top+pt},size={100,15},title="# points",value= gNumPts6
213//      SetVariable setvar6e,pos={443,top+pt},size={100,15},title="count (s)",value= gCtTime6
214//      SetVariable setvar6a labelBack=(44253,29492,58982)
215//
216//// the action procedures and limits/increments
217//      SetVariable setvar1a proc=ThetaMinSetVarProc            //,limits={-2,0,0.1}
218//      SetVariable setvar2a proc=ThetaMinSetVarProc
219//      SetVariable setvar3a proc=ThetaMinSetVarProc
220//      SetVariable setvar4a proc=ThetaMinSetVarProc
221//      SetVariable setvar5a proc=ThetaMinSetVarProc
222//      SetVariable setvar6a proc=ThetaMinSetVarProc
223//
224////
225//      SetVariable setvar1b proc=ThetaMaxSetVarProc            //,limits={0.4,1,0.1}
226//      SetVariable setvar2b proc=ThetaMaxSetVarProc
227//      SetVariable setvar3b proc=ThetaMaxSetVarProc
228//      SetVariable setvar4b proc=ThetaMaxSetVarProc
229//      SetVariable setvar5b proc=ThetaMaxSetVarProc
230//      SetVariable setvar6b proc=ThetaMaxSetVarProc
231////
232//      SetVariable setvar1c proc=IncrSetVarProc,limits={0.01,0.1,0.01}
233//      SetVariable setvar2c proc=IncrSetVarProc,limits={0.02,0.2,0.02}
234//      SetVariable setvar3c proc=IncrSetVarProc,limits={0.05,0.4,0.05}
235//      SetVariable setvar4c proc=IncrSetVarProc,limits={0.1,1,0.1}
236//      SetVariable setvar5c proc=IncrSetVarProc,limits={0.5,5,1}
237//      SetVariable setvar6c proc=IncrSetVarProc,limits={1,10,2}
238////
239//      SetVariable setvar1d proc=NumPtsSetVarProc,limits={2,50,1}
240//      SetVariable setvar2d proc=NumPtsSetVarProc,limits={2,50,1}
241//      SetVariable setvar3d proc=NumPtsSetVarProc,limits={2,50,1}
242//      SetVariable setvar4d proc=NumPtsSetVarProc,limits={2,50,1}
243//      SetVariable setvar5d proc=NumPtsSetVarProc,limits={2,50,1}
244//      SetVariable setvar6d proc=NumPtsSetVarProc,limits={2,50,1}
245////
246//      SetVariable setvar1e proc=CtTimeSetVarProc,limits={-1,50000,1}
247//      SetVariable setvar2e proc=CtTimeSetVarProc,limits={-1,50000,10}
248//      SetVariable setvar3e proc=CtTimeSetVarProc,limits={-1,50000,10}
249//      SetVariable setvar4e proc=CtTimeSetVarProc,limits={-1,50000,30}
250//      SetVariable setvar5e proc=CtTimeSetVarProc,limits={-1,50000,100}
251//      SetVariable setvar6e proc=CtTimeSetVarProc,limits={-1,50000,100}
252//     
253//      Button button0,pos={255,180},size={60,20},fColor=(65535,65535,0),proc=U_SimPlotButtonProc,title="Plot"
254//      Button button1,pos={260,286},size={50,20},proc=U_SaveButtonProc,title="Save"
255//
256////checkbox for "easy" mode
257//      CheckBox check0 title="Simple mode?",pos={400,19},proc=EnterModeCheckProc,value=1
258//      ThetaEditMode(2)                //checked on startup
259//     
260////    instrument setup
261//      SetVariable U_setvar0_1,pos={20,211},size={160,15},title="Thickness (cm)"
262//      SetVariable U_setvar0_1,limits={0,inf,0.1},value= root:Packages:NIST:USANS:Globals:U_Sim:gThick
263//      SetVariable U_setvar0_3,pos={20,235},size={160,15},title="Sample Transmission"
264//      SetVariable U_setvar0_3,limits={0,1,0.01},value= root:Packages:NIST:USANS:Globals:U_Sim:gSamTrans
265//      PopupMenu U_popup0,pos={20,185},size={165,20},proc=Sim_USANS_ModelPopMenuProc,title="Model"
266//      PopupMenu U_popup0,mode=1,value= #"U_FunctionPopupList()"
267//      SetVariable setvar0,pos={20,259},size={120,15},title="Empty Level"
268//      SetVariable setvar0,limits={0,10,0.01},value= root:Packages:NIST:USANS:Globals:U_Sim:g_EmptyLevel
269//      SetVariable setvar0_1,pos={20,284},size={120,15},title="Bkg Level"
270//      SetVariable setvar0_1,limits={0,10,0.01},value= root:Packages:NIST:USANS:Globals:U_Sim:g_BkgLevel
271//     
272//      CheckBox check0_4 title="Show EMP?",pos={160,260},proc=ShowEMPCheckProc,value=0
273//     
274//      CheckBox check0_2,pos={253,239},size={60,14},title="CountRate?",variable= root:Packages:NIST:USANS:Globals:U_Sim:g_1D_PlotCR
275//      CheckBox check0_3,pos={262,264},size={60,14},title="Noise?",variable= root:Packages:NIST:USANS:Globals:U_Sim:g_1D_AddNoise
276//     
277//// a box for the results
278//      SetVariable totalTime,pos={338,185},size={150,15},title="Count time (h:m)",value= gTotTimeStr
279////    ValDisplay valdisp0,pos={338,210},size={220,13},title="Total detector counts"
280////    ValDisplay valdisp0,limits={0,0,0},barmisc={0,1000},value= root:Packages:NIST:USANS:Globals:U_Sim:g_1DTotCts
281//      ValDisplay valdisp0_2,pos={338,234},size={220,13},title="Fraction of beam scattered"
282//      ValDisplay valdisp0_2,limits={0,0,0},barmisc={0,1000},value= root:Packages:NIST:USANS:Globals:U_Sim:g_1DFracScatt
283//      ValDisplay valdisp0_3,pos={338,259},size={220,13},title="Estimated transmission"
284//      ValDisplay valdisp0_3,limits={0,0,0},barmisc={0,1000},value=root:Packages:NIST:USANS:Globals:U_Sim:g_1DEstTrans
285//
286//     
287//      SetDataFolder root:
288//
289//EndMacro
290
291// ??make the USANS simulation results into a graph and a separate panel.
292// the control bar at the top makes the whole thing too large, and control bars are limited
293// to 500 pix wide, which is really tight
294// left of 1055 is good for Mac, 955 is better for Win
295//
296Window UCALC_Panel() : Graph
297        PauseUpdate; Silent 1           // building window...
298        String platform=UpperStr(IgorInfo(2))
299        Variable pos=strsearch(platform,"WINDOWS",0)
300        if(pos >= 0)            //windows
301                Display /W=(55,44,855,450) /K=1
302        else            //mac
303                Display /W=(55,44,1055,544) /K=1
304        endif
305       
306        ModifyGraph cbRGB=(36929,50412,31845)
307        DoWindow/C UCALC
308        DoWindow/T UCALC,"USANS Simulation"
309        ControlBar/L 500
310       
311        GroupBox group0,pos={5,1},size={493,177},title="Instrument Setup"
312        GroupBox group1,pos={5,183},size={240,147},title="Sample Setup"
313        GroupBox group2,pos={5,343},size={259,147},title="Results"
314       
315        PopupMenu popup0,pos={17,19},size={165,20},title="Sample Aperture Diam (in)"
316        PopupMenu popup0,mode=3,popvalue="0.625",value="0.25;0.50;0.625;0.75;1.0;1.75;2.0;"
317        PopupMenu popup0,proc=UCALC_SampleAperturePopup
318        PopupMenu popup2,pos={220,19},size={165,20},title="Presets"
319        PopupMenu popup2,mode=3,popvalue="Long Count",value="Short Count;Medium Count;Long Count;"
320        PopupMenu popup2,proc=UCALC_PresetPopup
321
322        SetDataFolder root:Packages:NIST:USANS:Globals:U_Sim
323       
324        Variable top=46,pt=0,inc=18,left=0//left=533
325        SetVariable setvar1a,pos={left+17,top},size={90,15},title="theta min",value= gAngLow1
326        SetVariable setvar1b,pos={left+113,top},size={89,15},title="theta max",value= gAngHigh1
327        SetVariable setvar1c,pos={left+209,top},size={89,15},title="increm",value= gIncr1
328        SetVariable setvar1d,pos={left+299,top},size={100,15},title="# points",value= gNumPts1
329        SetVariable setvar1e,pos={left+399,top},size={93,15},title="count (s)",value= gCtTime1
330//      SetVariable setvar1a,labelBack=(65535,32768,32768)              //old rainbow
331        SetVariable setvar1a,labelBack=(49858,65535,65535)
332       
333        pt += inc
334        SetVariable setvar2a,pos={left+17,top+pt},size={90,15},title="theta min",value= gAngLow2
335        SetVariable setvar2b,pos={left+113,top+pt},size={89,15},title="theta max",value= gAngHigh2
336        SetVariable setvar2c,pos={left+209,top+pt},size={89,15},title="increm",value= gIncr2
337        SetVariable setvar2d,pos={left+299,top+pt},size={100,15},title="# points",value= gNumPts2
338        SetVariable setvar2e,pos={left+399,top+pt},size={93,15},title="count (s)",value= gCtTime2
339//      SetVariable setvar2a labelBack=(65535,65533,32768)              //old rainbow
340        SetVariable setvar2a labelBack=(21074,8995,21074)
341       
342        pt += inc
343        SetVariable setvar3a,pos={left+17,top+pt},size={90,15},title="theta min",value= gAngLow3
344        SetVariable setvar3b,pos={left+113,top+pt},size={89,15},title="theta max",value= gAngHigh3
345        SetVariable setvar3c,pos={left+209,top+pt},size={89,15},title="increm",value= gIncr3
346        SetVariable setvar3d,pos={left+299,top+pt},size={100,15},title="# points",value= gNumPts3
347        SetVariable setvar3e,pos={left+399,top+pt},size={93,15},title="count (s)",value= gCtTime3
348//      SetVariable setvar3a labelBack=(32769,65535,32768)              //old rainbow
349        SetVariable setvar3a labelBack=(0,60652,60652)
350       
351        pt += inc
352        SetVariable setvar4a,pos={left+17,top+pt},size={90,15},title="theta min",value= gAngLow4
353        SetVariable setvar4b,pos={left+113,top+pt},size={89,15},title="theta max",value= gAngHigh4
354        SetVariable setvar4c,pos={left+209,top+pt},size={89,15},title="increm",value= gIncr4
355        SetVariable setvar4d,pos={left+299,top+pt},size={100,15},title="# points",value= gNumPts4
356        SetVariable setvar4e,pos={left+399,top+pt},size={93,15},title="count (s)",value= gCtTime4
357//      SetVariable setvar4a labelBack=(32768,65535,65535)              //old rainbow
358        SetVariable setvar4a labelBack=(0,51400,0)
359       
360        pt += inc
361        SetVariable setvar5a,pos={left+17,top+pt},size={90,15},title="theta min",value= gAngLow5
362        SetVariable setvar5b,pos={left+113,top+pt},size={89,15},title="theta max",value= gAngHigh5
363        SetVariable setvar5c,pos={left+209,top+pt},size={89,15},title="increm",value= gIncr5
364        SetVariable setvar5d,pos={left+299,top+pt},size={100,15},title="# points",value= gNumPts5
365        SetVariable setvar5e,pos={left+399,top+pt},size={93,15},title="count (s)",value= gCtTime5
366//      SetVariable setvar5a labelBack=(32768,54615,65535)              //old rainbow
367        SetVariable setvar5a labelBack=(59367,49344,0)
368       
369        pt += inc
370        SetVariable setvar6a,pos={left+17,top+pt},size={90,15},title="theta min",value= gAngLow6
371        SetVariable setvar6b,pos={left+113,top+pt},size={89,15},title="theta max",value= gAngHigh6
372        SetVariable setvar6c,pos={left+209,top+pt},size={89,15},title="increm",value= gIncr6
373        SetVariable setvar6d,pos={left+299,top+pt},size={100,15},title="# points",value= gNumPts6
374        SetVariable setvar6e,pos={left+399,top+pt},size={93,15},title="count (s)",value= gCtTime6
375//      SetVariable setvar6a labelBack=(44253,29492,58982)              //old rainbow
376        SetVariable setvar6a labelBack=(54998,0,0)
377
378        pt += inc
379        SetVariable setvar7a,pos={left+17,top+pt},size={90,15},title="theta min",value= gAngLow7
380        SetVariable setvar7b,pos={left+113,top+pt},size={89,15},title="theta max",value= gAngHigh7
381        SetVariable setvar7c,pos={left+209,top+pt},size={89,15},title="increm",value= gIncr7
382        SetVariable setvar7d,pos={left+299,top+pt},size={100,15},title="# points",value= gNumPts7
383        SetVariable setvar7e,pos={left+399,top+pt},size={93,15},title="count (s)",value= gCtTime7
384//      SetVariable setvar7a labelBack=(44253,29492,58982)              //old rainbow
385        SetVariable setvar7a labelBack=(39321,21845,51657)
386
387// the action procedures and limits/increments
388        SetVariable setvar1a proc=ThetaMinSetVarProc            //,limits={-2,0,0.1}
389        SetVariable setvar2a proc=ThetaMinSetVarProc
390        SetVariable setvar3a proc=ThetaMinSetVarProc
391        SetVariable setvar4a proc=ThetaMinSetVarProc
392        SetVariable setvar5a proc=ThetaMinSetVarProc
393        SetVariable setvar6a proc=ThetaMinSetVarProc
394        SetVariable setvar7a proc=ThetaMinSetVarProc
395
396//
397        SetVariable setvar1b proc=ThetaMaxSetVarProc            //,limits={0.4,1,0.1}
398        SetVariable setvar2b proc=ThetaMaxSetVarProc
399        SetVariable setvar3b proc=ThetaMaxSetVarProc
400        SetVariable setvar4b proc=ThetaMaxSetVarProc
401        SetVariable setvar5b proc=ThetaMaxSetVarProc
402        SetVariable setvar6b proc=ThetaMaxSetVarProc
403        SetVariable setvar7b proc=ThetaMaxSetVarProc
404//
405        SetVariable setvar1c proc=IncrSetVarProc,limits={0.01,0.1,0.01}
406        SetVariable setvar2c proc=IncrSetVarProc,limits={0.02,0.2,0.02}
407        SetVariable setvar3c proc=IncrSetVarProc,limits={0.05,0.4,0.05}
408        SetVariable setvar4c proc=IncrSetVarProc,limits={0.1,1,0.1}
409        SetVariable setvar5c proc=IncrSetVarProc,limits={0.5,5,1}
410        SetVariable setvar6c proc=IncrSetVarProc,limits={1,10,2}
411        SetVariable setvar7c proc=IncrSetVarProc,limits={1,20,2}
412//
413        SetVariable setvar1d proc=NumPtsSetVarProc,limits={2,50,1}
414        SetVariable setvar2d proc=NumPtsSetVarProc,limits={2,50,1}
415        SetVariable setvar3d proc=NumPtsSetVarProc,limits={2,50,1}
416        SetVariable setvar4d proc=NumPtsSetVarProc,limits={2,50,1}
417        SetVariable setvar5d proc=NumPtsSetVarProc,limits={2,50,1}
418        SetVariable setvar6d proc=NumPtsSetVarProc,limits={2,50,1}
419        SetVariable setvar7d proc=NumPtsSetVarProc,limits={2,50,1}
420//
421        SetVariable setvar1e proc=CtTimeSetVarProc,limits={-1,50000,1}
422        SetVariable setvar2e proc=CtTimeSetVarProc,limits={-1,50000,10}
423        SetVariable setvar3e proc=CtTimeSetVarProc,limits={-1,50000,10}
424        SetVariable setvar4e proc=CtTimeSetVarProc,limits={-1,50000,30}
425        SetVariable setvar5e proc=CtTimeSetVarProc,limits={-1,50000,100}
426        SetVariable setvar6e proc=CtTimeSetVarProc,limits={-1,50000,100}
427        SetVariable setvar7e proc=CtTimeSetVarProc,limits={-1,50000,100}
428       
429        Button button0,pos={left+280,200},size={130,20},fColor=(65535,65535,0),proc=U_SimPlotButtonProc,title="Simulate USANS"
430        CheckBox check0_2,pos={left+280,250},size={60,14},title="CountRate?",variable= root:Packages:NIST:USANS:Globals:U_Sim:g_1D_PlotCR
431        CheckBox check0_3,pos={left+280,270},size={60,14},title="Noise?",variable= root:Packages:NIST:USANS:Globals:U_Sim:g_1D_AddNoise
432        CheckBox check0_4 title="Show EMP?",pos={left+280,290},proc=ShowEMPCheckProc,value=0
433
434
435//checkbox for "easy" mode
436        CheckBox check0 title="Simple mode?",pos={left+400,19},proc=EnterModeCheckProc,value=1
437        ThetaEditMode(2)                //checked on startup
438       
439//      sample setup
440        SetVariable U_setvar0_1,pos={left+20,231},size={160,15},title="Thickness (cm)"
441        SetVariable U_setvar0_1,limits={0,inf,0.1},value= root:Packages:NIST:USANS:Globals:U_Sim:gThick
442        SetVariable U_setvar0_3,pos={left+20,255},size={160,15},title="Sample Transmission"
443        SetVariable U_setvar0_3,limits={0,1,0.01},value= root:Packages:NIST:USANS:Globals:U_Sim:gSamTrans
444        PopupMenu U_popup0,pos={left+20,205},size={165,20},proc=Sim_USANS_ModelPopMenuProc,title="Model"
445        PopupMenu U_popup0,mode=1,value= #"U_FunctionPopupList()"
446        SetVariable setvar0,pos={left+20,279},size={120,15},title="Empty Level",disable=2
447        SetVariable setvar0,limits={0,10,0.01},value= root:Packages:NIST:USANS:Globals:U_Sim:g_EmptyLevel
448        SetVariable setvar0_1,pos={left+20,304},size={120,15},title="Bkg Level",disable=2
449        SetVariable setvar0_1,limits={0,10,0.01},value= root:Packages:NIST:USANS:Globals:U_Sim:g_BkgLevel
450       
451       
452       
453// a box for the results
454        SetVariable totalTime,pos={left+20,370},size={150,15},title="Count time (h:m)",value= gTotTimeStr
455        ValDisplay valdisp0_2,pos={left+20,395},size={220,13},title="Fraction of beam scattered"
456        ValDisplay valdisp0_2,limits={0,0,0},barmisc={0,1000},value= root:Packages:NIST:USANS:Globals:U_Sim:g_1DFracScatt
457        ValDisplay valdisp0_2,disable=1
458        ValDisplay valdisp0_3,pos={left+20,420},size={220,13},title="Estimated transmission"
459        ValDisplay valdisp0_3,limits={0,0,0},barmisc={0,1000},value=root:Packages:NIST:USANS:Globals:U_Sim:g_1DEstTrans
460        ValDisplay valdisp0_3,disable=1
461        Button button1,pos={left+20,400},size={150,20},proc=U_SavePanelProc,title="Save PNG"
462        Button button2,pos={left+20,430},size={150,20},proc=U_ConfigTextProc,title="Config Text"
463        Button button3,pos={left+20,460},size={150,20},proc=U_SaveButtonProc,title="Save Simulated Data"
464
465// help, done buttons
466        Button U_helpButton,pos={300,440},size={25,20},proc=showUCALCHelp,title="?"
467        Button U_helpButton,help={"Show help file for simulation of USANS Data"}
468        Button U_DoneButton,pos={350,440},size={50,20},proc=UCALCDoneButton,title="Done"
469        Button U_DoneButton,help={"This button will close the panel"}
470               
471        SetDataFolder root:
472
473EndMacro
474
475Proc UCALCDoneButton(ctrlName): ButtonControl
476        String ctrlName
477        DoWindow/K UCALC
478end
479
480Proc showUCALCHelp(ctrlName): ButtonControl
481        String ctrlName
482        DisplayHelpTopic/K=1/Z "UCALC"
483        if(V_flag !=0)
484                DoAlert 0,"The USANS Simulation Help file could not be found"
485        endif
486end
487
488// changing theta min - hold incr and #, result is new theta max
489Function ThetaMinSetVarProc(sva) : SetVariableControl
490        STRUCT WMSetVariableAction &sva
491
492        switch( sva.eventCode )
493                case 1: // mouse up
494                case 2: // Enter key
495                case 3: // Live update
496                        Variable ThetaMin = sva.dval
497                        String ns=CtrlNumber(sva.ctrlName)              //control number as a string
498                        NVAR incr = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gIncr"+ns)
499                        NVAR NumPts = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gNumPts"+ns)
500                        NVAR thetaMax = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gAngHigh"+ns)
501                       
502                        thetaMax = ThetaMin + incr*NumPts
503                       
504                        break
505        endswitch
506
507        return 0
508End
509
510
511// changing theta max - hold min and incr, result is new # of points
512// then need to recalculate the total counting time
513Function ThetaMaxSetVarProc(sva) : SetVariableControl
514        STRUCT WMSetVariableAction &sva
515
516        switch( sva.eventCode )
517                case 1: // mouse up
518                case 2: // Enter key
519                case 3: // Live update
520                        Variable ThetaMax = sva.dval
521                        String ns=CtrlNumber(sva.ctrlName)              //control number as a string
522                        NVAR thetaMin = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gAngLow"+ns)
523                        NVAR NumPts = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gNumPts"+ns)
524                        NVAR Incr = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gIncr"+ns)
525                       
526                        NumPts = trunc( (thetaMax - ThetaMin) / incr )
527               
528                        CalcTotalCountTime()
529                       
530                        break
531        endswitch
532
533        return 0
534End
535
536// changing increment - hold min and #, result is new max
537Function IncrSetVarProc(sva) : SetVariableControl
538        STRUCT WMSetVariableAction &sva
539
540        switch( sva.eventCode )
541                case 1: // mouse up
542                case 2: // Enter key
543                case 3: // Live update
544                        Variable incr = sva.dval
545                        String ns=CtrlNumber(sva.ctrlName)              //control number as a string
546                        NVAR thetaMin = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gAngLow"+ns)
547                        NVAR NumPts = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gNumPts"+ns)
548                        NVAR thetaMax = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gAngHigh"+ns)
549                       
550                        thetaMax = ThetaMin + incr*NumPts
551               
552                        break
553        endswitch
554
555        return 0
556End
557
558// changing #pts - hold min and incr, result is new max
559// then recalculate the total count time
560Function NumPtsSetVarProc(sva) : SetVariableControl
561        STRUCT WMSetVariableAction &sva
562
563        switch( sva.eventCode )
564                case 1: // mouse up
565                case 2: // Enter key
566                case 3: // Live update
567                        Variable NumPts = sva.dval
568                        String ns=CtrlNumber(sva.ctrlName)              //control number as a string
569                        NVAR thetaMin = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gAngLow"+ns)
570                        NVAR incr = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gIncr"+ns)
571                        NVAR thetaMax = $("root:Packages:NIST:USANS:Globals:U_Sim:"+"gAngHigh"+ns)
572
573// old way, like ICP                   
574//                      thetaMax = ThetaMin + incr*NumPts
575
576// new way - to spread the points out over the specified angle range
577                        incr = (thetaMax - thetaMin) / numpts
578                       
579                        CalcTotalCountTime()
580                       
581                        break
582        endswitch
583
584        return 0
585End
586
587// changing count time -
588// then recalculate the total count time
589Function CtTimeSetVarProc(sva) : SetVariableControl
590        STRUCT WMSetVariableAction &sva
591
592        switch( sva.eventCode )
593                case 1: // mouse up
594                case 2: // Enter key
595                case 3: // Live update
596                        CalcTotalCountTime()
597                        break
598        endswitch
599
600        return 0
601End
602
603// hard-wired for 7 controls
604// return value is in seconds
605// global display string is set with hrs:min
606Function CalcTotalCountTime()
607
608        Variable ii,num,totTime=0
609        String pathStr="root:Packages:NIST:USANS:Globals:U_Sim:"
610        num=7
611       
612        for(ii=1;ii<=num;ii+=1)
613                NVAR ctTime = $(pathStr+"gCtTime"+num2str(ii))
614                NVAR numPts = $(pathStr+"gNumPts"+num2str(ii))
615                if(ctTime>0)
616                        totTime += ctTime*numPts
617                endif
618        endfor
619        Variable hrs,mins
620        hrs = trunc(totTime/3600)
621        mins = trunc(mod(totTime,3600)/60)
622//      Printf "Counting time (hr:min) = %d:%d\r",hrs,mins
623       
624        SVAR str = $(pathStr+"gTotTimeStr")
625        sprintf str,"%d:%d",hrs,mins
626       
627        return(totTime)
628End
629
630//returns the control number from the name string
631// all are setvarNa
632Function/S CtrlNumber(str)
633        String str
634       
635        return(str[6])
636End
637
638// changes edit mode of the theta min/max boxes and increment for simplified setup
639// val = 2 = disable
640// val = 0 = edit enabled
641Function ThetaEditMode(val)
642        Variable val
643       
644        SetVariable setvar1a,win=UCALC,disable=val
645        SetVariable setvar1b,win=UCALC,disable=val
646        SetVariable setvar1c,win=UCALC,disable=val
647       
648        SetVariable setvar2a,win=UCALC,disable=val
649        SetVariable setvar2b,win=UCALC,disable=val
650        SetVariable setvar2c,win=UCALC,disable=val
651       
652        SetVariable setvar3a,win=UCALC,disable=val
653        SetVariable setvar3b,win=UCALC,disable=val
654        SetVariable setvar3c,win=UCALC,disable=val
655       
656        SetVariable setvar4a,win=UCALC,disable=val
657        SetVariable setvar4b,win=UCALC,disable=val
658        SetVariable setvar4c,win=UCALC,disable=val
659       
660        SetVariable setvar5a,win=UCALC,disable=val
661        SetVariable setvar5b,win=UCALC,disable=val
662        SetVariable setvar5c,win=UCALC,disable=val
663       
664        SetVariable setvar6a,win=UCALC,disable=val
665        SetVariable setvar6b,win=UCALC,disable=val
666        SetVariable setvar6c,win=UCALC,disable=val
667       
668        SetVariable setvar7a,win=UCALC,disable=val
669        SetVariable setvar7b,win=UCALC,disable=val
670        SetVariable setvar7c,win=UCALC,disable=val
671        return(0)
672End
673
674
675
676Function EnterModeCheckProc(cba) : CheckBoxControl
677        STRUCT WMCheckboxAction &cba
678
679        switch( cba.eventCode )
680                case 2: // mouse up
681                        Variable checked = cba.checked
682                       
683                        if(checked)
684                                ThetaEditMode(2)
685                        else
686                                ThetaEditMode(0)
687                        endif
688                       
689                        break
690        endswitch
691
692        return 0
693End
694
695
696Function ShowEMPCheckProc(cba) : CheckBoxControl
697        STRUCT WMCheckboxAction &cba
698
699        switch( cba.eventCode )
700                case 2: // mouse up
701                        Variable checked = cba.checked
702
703                        String list,item,popStr,qval,CR
704                        Variable OK=1
705
706                        if(exists("root:Packages:NIST:USANS:Globals:Q_2p0")==0)                 //
707                                MakeUSANSEmptyWaves()
708                        endif
709                       
710                       
711                        if(checked)
712                                // put it on the graph
713                                SetDataFolder root:Packages:NIST:USANS:Globals
714                                ControlInfo/W=UCALC popup0
715                                popStr = S_Value
716                                strswitch(popStr)       // string switch
717                                        case "0.25":            // execute if case matches expression
718                                                qval = "Q_0p25"
719                                                CR = "CR_0p25"
720                                                break           
721                                        case "0.50":   
722                                                qval = "Q_0p50"
723                                                CR = "CR_0p50"
724                                                break   
725                                        case "0.625":           
726                                                qval = "Q_0p625"
727                                                CR = "CR_0p625"
728                                                break   
729                                        case "1.75":           
730                                                qval = "Q_1p75"
731                                                CR = "CR_1p75"
732                                                break   
733                                        case "2.0":             
734                                                qval = "Q_2p0"
735                                                CR = "CR_2p0"
736                                                break   
737                                        default:                                                        // optional default expression executed
738                                                OK=0
739                                endswitch
740                               
741                                if(OK)
742                                        AppendToGraph/W=UCALC $CR vs $qval
743                                        ModifyGraph marker=19,mode($CR)=4,msize($CR)=3,rgb($CR)=(0,0,0)
744                                endif
745                               
746                        else
747                                //take it off of the graph
748                                SetDataFolder root:Packages:NIST:USANS:Globals
749                                list=WaveList("CR*", ";", "WIN:UCALC")
750                                item=StringFromList(0, list ,";")               //should be one item
751                                if(strlen(item) != 0)
752                                        RemoveFromGraph/W=UCALC $item
753                                endif
754                        endif
755                       
756                        break
757        endswitch
758
759        SetDataFolder root:
760        return 0
761End
762
763
764
765// based on the angle ranges above (with non-zero count times)
766// plot where the data points would be
767//
768Function U_SimPlotButtonProc(ba) : ButtonControl
769        STRUCT WMButtonAction &ba
770
771       
772        switch( ba.eventCode )
773                case 2: // mouse up
774                        // click code here
775                       
776                        CalcUSANS()
777                       
778                        break
779        endswitch
780
781        return 0
782End
783
784
785
786// Fills a fake USANS folder with the concatenated ranges, and converts to Q
787// root:Packages:NIST:USANS:SIM
788//
789// does the work of calculating and smearing the simluated USANS data set
790Function CalcUSANS()   
791
792        Variable num,ii,firstSet=0
793        String pathStr="root:Packages:NIST:USANS:Globals:U_Sim:gCtTime"
794        String fromType="SWAP",toType="SIM"
795        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder
796       
797        num = 7                 //# of angular ranges
798       
799        // only try to plot ranges with non-zero count times
800        firstSet=0
801        for(ii=1;ii<=num;ii+=1)
802                NVAR dum = $(pathStr+num2str(ii))
803                if(dum>0)                                               
804//                      print "CtTime = ",dum
805                        firstSet += 1
806                        LoadSimulatedAngleRange(ii,"SWAP")      //overwrite what's in the SWAP folder
807                       
808                        // did not do this step
809                        //Convert2Countrate("SWAP")
810                        //
811                       
812                        if(firstSet==1) //first time, overwrite
813                                NewDataWaves("SWAP","SIM")
814                                //plus my two waves
815                                Duplicate/O $(USANSFolder+":"+fromType+":countingTime"),$(USANSFolder+":"+toType+":countingTime")
816                                Duplicate/O $(USANSFolder+":"+fromType+":SetNumber"),$(USANSFolder+":"+toType+":SetNumber")
817
818                        else            //append to waves in "SIM"
819                                AppendDataWaves("SWAP","SIM")
820                                // and my two waves
821                                ConcatenateData( (USANSFolder+":"+toType+":countingTime"),(USANSFolder+":"+fromType+":countingTime") )
822                                ConcatenateData( (USANSFolder+":"+toType+":SetNumber"),(USANSFolder+":"+fromType+":SetNumber") )
823
824                        endif
825                       
826                endif
827        endfor
828
829
830        //sort after all loaded - not by angle, but by Q
831// Get rid of the negative angles - the smearing integration does not like these!
832// (may add them back in later, but probably not)
833        UDoAngleSort("SIM")
834       
835        ConvertAngle2Qvals("SIM",0)
836       
837       
838       
839        //fill the data with something
840        WAVE qvals = root:Packages:NIST:USANS:SIM:qvals
841        WAVE DetCts = root:Packages:NIST:USANS:SIM:DetCts
842       
843
844        //find the Trans Cts for T_Wide
845//      FindTWideCts("EMP")
846
847//generate a "fake" 1d data folder/set named "Sim_USANS" that can be used for smearing
848// DOES NOT calculate a matrix, but instead fills 4-5-6 columns with -dQv
849// so that the trapezoid rule is used
850//     
851
852        FakeUSANSDataFolder(qvals,DetCts,0.117,"Sim_USANS")
853
854        // now calculate the smearing... instead of the counts
855        SVAR funcStr = root:Packages:NIST:USANS:Globals:U_Sim:gFuncStr          //set by the popup     
856       
857        Wave inten = root:Sim_USANS:Sim_USANS_i
858        Wave sigave = root:Sim_USANS:Sim_USANS_s
859        Wave countingTime = root:Sim_USANS:countingTime         //counting time per point in the set
860
861        Duplicate/O inten root:Sim_USANS:Smeared_inten          // a place for the smeared result for probabilities
862        Wave Smeared_inten = root:Sim_USANS:Smeared_inten
863
864        String coefStr=""
865        Variable sig_sas=0,wavelength = 2.4
866        Variable Imon
867       
868
869        NVAR omega = root:Packages:NIST:USANS:Globals:U_Sim:gAnalyzerOmega
870       
871        if(exists(funcStr) != 0)
872                FUNCREF SANSModelAAO_proto func=$("fSmeared"+funcStr)                   //a wrapper for the structure version
873                FUNCREF SANSModelAAO_proto funcUnsmeared=$(funcStr)             //unsmeared
874                coefStr = MC_getFunctionCoef(funcStr)
875               
876                if(!MC_CheckFunctionAndCoef(funcStr,coefStr))
877                        Abort "Function and coefficients do not match. You must plot the unsmeared function before simulation."
878                endif
879               
880                // do the smearing calculation
881                func($coefStr,Smeared_inten,qvals)
882
883
884                NVAR thick = root:Packages:NIST:USANS:Globals:U_Sim:gThick
885                NVAR trans = root:Packages:NIST:USANS:Globals:U_Sim:gSamTrans
886                NVAR SimDetCts = root:Packages:NIST:USANS:Globals:U_Sim:g_1DTotCts                      //summed counts (simulated)
887                NVAR estDetCR = root:Packages:NIST:USANS:Globals:U_Sim:g_1DEstDetCR                     // estimated detector count rate
888                NVAR fracScat = root:Packages:NIST:USANS:Globals:U_Sim:g_1DFracScatt            // fraction of beam captured on detector
889                NVAR estTrans = root:Packages:NIST:USANS:Globals:U_Sim:g_1DEstTrans             // estimated transmission of sample
890//              NVAR SimCountTime = root:Packages:NIST:USANS:Globals:U_Sim:gCntTime             //counting time used for simulation
891               
892                Imon = GetUSANSBeamIntensity()                          //based on the aperture size, select the beam intensity
893                Print "imon=",imon
894               
895                // calculate the scattering cross section simply to be able to estimate the transmission
896                // unfortunately, this calculation is useless in the USANS range. So although it's calculated, the
897                // results are never reported.
898                // -- the main issue is that the integration range is optimized for SANS, and is not useful for USANS
899                // -there are only a few points in the USANS range, and extending it lower caused issues before.
900                CalculateRandomDeviate(funcUnsmeared,$coefStr,wavelength,"root:Packages:NIST:SAS:ran_dev",sig_sas)
901               
902//              if(sig_sas > 100)
903//                      sprintf abortStr,"sig_sas = %g. Please check that the model coefficients have a zero background, or the low q is well-behaved.",sig_sas
904//              endif
905                estTrans = exp(-1*thick*sig_sas)                //thickness and sigma both in units of cm
906                Print "Sig_sas = ",sig_sas
907               
908               
909                Duplicate/O qvals prob_i
910                                       
911                prob_i = trans*thick*omega*Smeared_inten                        //probability of a neutron in q-bin(i)
912               
913//              Variable P_on = sum(prob_i,-inf,inf)
914//              Print "P_on = ",P_on
915                fracScat = 1-estTrans
916               
917                inten = (Imon*countingTime)*prob_i
918               
919                // do I round to an integer?
920                inten = round(inten)
921
922//              SimDetCts = sum(inten,-inf,inf)
923//              estDetCR = SimDetCts/SimCountTime
924               
925               
926                NVAR doABS = root:Packages:NIST:USANS:Globals:U_Sim:g_1D_DoABS
927                NVAR plotCR = root:Packages:NIST:USANS:Globals:U_Sim:g_1D_PlotCR
928                NVAR addNoise = root:Packages:NIST:USANS:Globals:U_Sim:g_1D_AddNoise
929                                       
930                sigave = sqrt(inten)            // assuming that N is large
931               
932                // add in random error in aveint based on the sigave
933                if(addNoise)
934                        inten += gnoise(sigave)
935                       
936                        //round to an integer again
937                        inten = round(inten)           
938                endif
939
940                // convert to absolute scale? Maybe not needed
941                // does nothing yet - need Ipeak, Twide
942//              if(doABS)
943//                      Variable kappa = thick*omega*trans*iMon*ctTime
944//                      inten /= kappa
945//                      inten /= kappa
946//              endif
947
948                // plot as countrate - maybe easier to visualize, and all of the data overlaps
949                if(plotCR)
950                        inten /= countingTime
951                        sigave /= countingTime
952                endif
953               
954                GraphSIM()
955
956        else
957                //no function plotted, no simulation can be done
958                DoAlert 0,"No function is selected or plotted, so no simulation is done. The default power law function is used."
959
960                inten = U_Power_Law_Model(1e-6,3,0,qvals)
961//              inten = U_SphereForm(1,9000,6e-6,0,qvals)               
962       
963                GraphSIM()
964
965        endif
966       
967
968end
969
970
971//sort the data in the "type"folder, based on angle
972//carry along all associated waves
973//
974// ---a duplicate of DoAngleSort(), by modified to
975// include counting time and setNumber
976//
977// also trims the beginning of each data set so that it does not include any negative or zero angles
978//
979Function UDoAngleSort(type)
980        String type
981       
982        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder
983       
984        Wave angle = $(USANSFolder+":"+Type+":Angle")
985        Wave detCts = $(USANSFolder+":"+Type+":DetCts")
986        Wave ErrdetCts = $(USANSFolder+":"+Type+":ErrDetCts")
987        Wave MonCts = $(USANSFolder+":"+Type+":MonCts")
988        Wave TransCts = $(USANSFolder+":"+Type+":TransCts")
989        Wave countingTime = $(USANSFolder+":"+Type+":countingTime")
990        Wave SetNumber = $(USANSFolder+":"+Type+":SetNumber")
991       
992        Sort Angle DetCts,ErrDetCts,MonCts,TransCts,Angle,countingTime,SetNumber
993       
994        Variable ii,num,numBad,ang,val
995        num=numpnts(angle)
996        ii=0
997        numBad=0
998        val = 0         //cutoff value
999        do
1000                ang = angle[ii]
1001                if(ang <= val)
1002                        numBad += 1
1003                else            //keep the points
1004                        Angle[ii-numBad] = ang
1005                        DetCts[ii-numBad] = DetCts[ii]
1006                        ErrDetCts[ii-numBad] = ErrDetCts[ii]
1007                        MonCts[ii-numBad] = MonCts[ii]
1008                        TransCts[ii-numBad] = TransCts[ii]
1009                        countingTime[ii-numBad] = countingTime[ii]
1010                        SetNumber[ii-numBad] = SetNumber[ii]
1011                endif
1012                ii += 1
1013        while(ii<num)
1014        //trim the end of the waves
1015        DeletePoints num-numBad, numBad, DetCts,ErrDetCts,MonCts,TransCts,Angle,countingTime,SetNumber
1016       
1017       
1018        return(0)
1019End
1020
1021// a simple default function
1022//
1023Function U_SphereForm(scale,radius,delrho,bkg,x)                               
1024        Variable scale,radius,delrho,bkg
1025        Variable x
1026       
1027        // variables are:                                                       
1028        //[0] scale
1029        //[1] radius (A)
1030        //[2] delrho (A-2)
1031        //[3] background (cm-1)
1032
1033       
1034        // calculates scale * f^2/Vol where f=Vol*3*delrho*((sin(qr)-qrcos(qr))/qr^3
1035        // and is rescaled to give [=] cm^-1
1036       
1037        Variable bes,f,vol,f2
1038        //
1039        //handle q==0 separately
1040        If(x==0)
1041                f = 4/3*pi*radius^3*delrho*delrho*scale*1e8 + bkg
1042                return(f)
1043        Endif
1044       
1045        bes = 3*(sin(x*radius)-x*radius*cos(x*radius))/x^3/radius^3
1046        vol = 4*pi/3*radius^3
1047        f = vol*bes*delrho              // [=] A
1048        // normalize to single particle volume, convert to 1/cm
1049        f2 = f * f / vol * 1.0e8                // [=] 1/cm
1050       
1051        return (scale*f2+bkg)   // Scale, then add in the background
1052       
1053End
1054
1055// better default function
1056Function U_Power_Law_Model(A,m,bgd,x) : FitFunc
1057        Variable A, m,bgd,x
1058//       Input (fitting) variables are:
1059        //[0] Coefficient
1060        //[1] (-) Power
1061        //[2] incoherent background
1062       
1063//      local variables
1064        Variable inten, qval
1065//      x is the q-value for the calculation
1066        qval = x
1067//      do the calculation and return the function value
1068       
1069        inten = A*qval^-m + bgd
1070        Return (inten)
1071End
1072
1073
1074// mimics LoadBT5File
1075// creates two other waves to identify the set and the counting time for that set
1076//
1077Function LoadSimulatedAngleRange(set,type)
1078        Variable set
1079        String type
1080
1081        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder
1082       
1083        String s=num2str(set)
1084        NVAR angLow = $("root:Packages:NIST:USANS:Globals:U_Sim:gAngLow"+s)
1085        NVAR angHigh = $("root:Packages:NIST:USANS:Globals:U_Sim:gAngHigh"+s)
1086        NVAR numPts = $("root:Packages:NIST:USANS:Globals:U_Sim:gNumPts"+s)
1087        NVAR ctTime = $("root:Packages:NIST:USANS:Globals:U_Sim:gCtTime"+s)
1088        NVAR incr = $("root:Packages:NIST:USANS:Globals:U_Sim:gIncr"+s)
1089       
1090        Variable ii, err=0
1091       
1092        // generate q-points based on angular range from panel
1093       
1094        Make/O/D/N=(numPts) $(USANSFolder+":"+type+":Angle")
1095        Make/O/D/N=(numPts) $(USANSFolder+":"+type+":DetCts")
1096        Make/O/D/N=(numPts) $(USANSFolder+":"+type+":ErrDetCts")
1097        Make/O/D/N=(numPts) $(USANSFolder+":"+type+":MonCts")
1098        Make/O/D/N=(numPts) $(USANSFolder+":"+type+":TransCts")
1099        //
1100        Make/O/D/N=(numPts) $(USANSFolder+":"+type+":CountingTime")
1101        Make/O/D/N=(numPts) $(USANSFolder+":"+type+":SetNumber")
1102       
1103        Wave Angle = $(USANSFolder+":"+type+":Angle")
1104        Wave DetCts = $(USANSFolder+":"+type+":DetCts")
1105        Wave ErrDetCts = $(USANSFolder+":"+type+":ErrDetCts")
1106        Wave MonCts = $(USANSFolder+":"+type+":MonCts")
1107        Wave TransCts = $(USANSFolder+":"+type+":TransCts")
1108        Wave countingTime = $(USANSFolder+":"+type+":countingTime")
1109        Wave SetNumber = $(USANSFolder+":"+type+":SetNumber")
1110       
1111        countingTime = ctTime
1112        SetNumber = set
1113       
1114        for(ii=0;ii<numPts;ii+=1)
1115                Angle[ii] = angLow + ii*incr
1116                DetCts[ii] = set
1117        endfor
1118       
1119        //set the wave note for the DetCts
1120        String str=""
1121        str = "FILE:Sim "+s+";"
1122        str += "TIMEPT:"+num2str(ctTime)+";"
1123        str += "PEAKANG:0;"             //no value yet
1124        str += "STATUS:;"               //no value yet
1125        str += "LABEL:SimSet "+s+";"
1126        str += "PEAKVAL:;"              //no value yet
1127        str += "TWIDE:0;"               //no value yet
1128        Note DetCts,str
1129       
1130        return err                      // Zero signifies no error.     
1131End
1132
1133// add SIM data to the graph if it exists and is not already on the graph
1134//
1135//
1136// ** currently, I have changed the graph to not display the angle at the top. I have not yet
1137// found a way to keep the scaling of the two axes in-sync when the empty cell data is added to the
1138// graph (versus Q)
1139//
1140Function GraphSIM()
1141
1142//      SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder
1143//      SetDataFolder $(USANSFolder+":SIM")
1144
1145        SetDataFolder root:Sim_USANS
1146        //is it already on the graph?
1147        String list=""
1148        list = Wavelist("Sim_USANS*",";","WIN:UCALC")
1149       
1150        if(strlen(list)!=0)
1151//              Print "SIM already on graph"
1152                SetDataFolder root:
1153                return(0)
1154        Endif
1155       
1156        //append the data if it exists
1157        If(waveExists($"Sim_USANS_i")==1)
1158                DoWindow/F UCALC
1159
1160// lines for the no-noise result vs angle
1161//              AppendToGraph/T Smeared_inten vs angle
1162                AppendToGraph Smeared_inten vs Sim_USANS_q
1163                ModifyGraph rgb(Smeared_inten)=(1,12815,52428)
1164                ModifyGraph mode(Smeared_inten)=4,marker(Smeared_inten)=19,msize(Smeared_inten)=2
1165                ModifyGraph tickUnit=1
1166
1167// colored points for the simulation with noise on top
1168                AppendToGraph Sim_USANS_i vs Sim_USANS_q
1169                ModifyGraph mode(Sim_USANS_i)=3,marker(Sim_USANS_i)=19,msize(Sim_USANS_i)=4
1170                //don't reverse the dbZ21 or the highest angle will have "invisible" light blue error bars
1171                ModifyGraph zColor(Sim_USANS_i)={setNumber,1,7,dBZ21,0}                         //better for 7 colors
1172//              ModifyGraph zColor(Sim_USANS_i)={setNumber,1,7,Rainbow,0}                       //force the colors from 1->7
1173                ModifyGraph useMrkStrokeRGB(Sim_USANS_i)=1
1174                ErrorBars/T=0 Sim_USANS_i Y,wave=(Sim_USANS_s,Sim_USANS_s)
1175               
1176                ModifyGraph log=1
1177                ModifyGraph mirror(left)=1
1178                // if no top axis, then
1179//              ModifyGraph mirror(bottom)=1
1180                ModifyGraph grid=2
1181                ModifyGraph standoff=0
1182               
1183                // to make sure that the scales are the same (but fails on zoom)
1184                NewFreeAxis/O/T top_angle
1185                ModifyFreeAxis/Z top_angle,master= bottom,hook= TransformAngleAxisHook
1186                ModifyGraph lblPos(top_angle)=50,freePos(top_angle)=0
1187                ModifyGraph log(top_angle)=1
1188               
1189                SetDrawEnv linefgc= (39321,1,1),dash= 3,linethick= 3
1190                SetDrawEnv xcoord= bottom
1191                DrawLine 3e-05,0.01,3e-05,0.99
1192               
1193                Label top_angle "Angle"
1194                Label bottom "Q (1/A)"
1195                Label left "Counts or Count Rate"
1196               
1197                Legend
1198        endif
1199       
1200        SetDataFolder root:
1201End
1202
1203Function TransformAngleAxisHook(s)
1204        STRUCT WMAxisHookStruct &s
1205
1206        s.max= s.max/5.55e-5
1207        s.min= s.min/5.55e-5
1208       
1209        return 0
1210End
1211
1212//fakes a folder with loaded 1-d usans data, no calculation of the matrix
1213Function        FakeUSANSDataFolder(qval,aveint,dqv,dataFolder)
1214        WAVE qval,aveint
1215        Variable dqv
1216        String dataFolder
1217       
1218
1219        String baseStr=dataFolder
1220        if(DataFolderExists("root:"+baseStr))
1221                SetDataFolder $("root:"+baseStr)
1222        else
1223                NewDataFolder/S $("root:"+baseStr)
1224        endif
1225
1226        ////overwrite the existing data, if it exists
1227        Duplicate/O qval, $(baseStr+"_q")
1228        Duplicate/O aveint, $(baseStr+"_i")
1229       
1230        Duplicate/O qval, $(baseStr+"_s")
1231        Wave sigave = $(baseStr+"_s")
1232
1233        sigave = sqrt(aveint)
1234
1235        // make a resolution matrix for SANS data
1236        Variable np=numpnts(qval)
1237        Make/D/O/N=(np,4) $(baseStr+"_res")
1238        Wave res=$(baseStr+"_res")
1239       
1240        res[][0] = -dQv         //sigQ
1241        res[][1] = -dQv         //qBar
1242        res[][2] = -dQv         //fShad
1243        res[][3] = qval[p]              //Qvalues
1244       
1245        // extra waves of set number and counting time for the simulation
1246        WAVE ctW = root:Packages:NIST:USANS:SIM:countingTime
1247        WAVE setW = root:Packages:NIST:USANS:SIM:setNumber
1248        WAVE ang = root:Packages:NIST:USANS:SIM:Angle
1249        Duplicate/O ctW countingTime
1250        Duplicate/O setW setNumber
1251        Duplicate/O ang Angle
1252
1253
1254        //clean up             
1255        SetDataFolder root:
1256       
1257End
1258
1259
1260Function/S U_FunctionPopupList()
1261        String list,tmp
1262        list = User_FunctionPopupList()
1263       
1264        //simplify the display, forcing smeared calculations behind the scenes
1265        tmp = FunctionList("Smear*",";","NPARAMS:1")    //smeared dependency calculations
1266        list = RemoveFromList(tmp, list ,";")
1267
1268
1269        if(strlen(list)==0)
1270                list = "No functions plotted"
1271        endif
1272       
1273        list = SortList(list)
1274       
1275        return(list)
1276End     
1277
1278Function Sim_USANS_ModelPopMenuProc(pa) : PopupMenuControl
1279        STRUCT WMPopupAction &pa
1280
1281        switch( pa.eventCode )
1282                case 2: // mouse up
1283                        Variable popNum = pa.popNum
1284                        String popStr = pa.popStr
1285                        SVAR gStr = root:Packages:NIST:USANS:Globals:U_Sim:gFuncStr
1286                        gStr = popStr
1287                       
1288                        break
1289        endswitch
1290
1291        return 0
1292End         
1293
1294// if the sample aperture is changed, AND the empty data is displayed, change to the proper data
1295Function UCALC_SampleAperturePopup(pa) : PopupMenuControl
1296        STRUCT WMPopupAction &pa
1297
1298        switch( pa.eventCode )
1299                case 2: // mouse up
1300                        Variable popNum = pa.popNum
1301                        String popStr = pa.popStr
1302
1303                        ControlInfo/W=UCALC check0_4
1304                        if(V_Value==1)          //currently checked, need to update
1305                               
1306                                STRUCT WMCheckboxAction cba
1307                                cba.checked=0           //"un-check"
1308                                cba.eventCode=2
1309                                ShowEMPCheckProc(cba)
1310                               
1311                                cba.checked=1           //"re-check"
1312                                ShowEMPCheckProc(cba)
1313                       
1314                        endif
1315                        break
1316                       
1317        endswitch
1318       
1319        return 0
1320End 
1321
1322
1323Function UCALC_PresetPopup(pa) : PopupMenuControl
1324        STRUCT WMPopupAction &pa
1325
1326        switch( pa.eventCode )
1327                case 2: // mouse up
1328                        Variable popNum = pa.popNum
1329                        String popStr = pa.popStr
1330
1331                        SetDataFolder root:Packages:NIST:USANS:Globals:U_Sim
1332                       
1333                        NVAR gAngLow1 = gAngLow1
1334                        NVAR gAngHigh1 = gAngHigh1
1335                        NVAR gNumPts1 = gNumPts1
1336                        NVAR gCtTime1 = gCtTime1
1337                        NVAR gIncr1 = gIncr1
1338                       
1339                        NVAR gAngLow2 = gAngLow2
1340                        NVAR gAngHigh2 = gAngHigh2
1341                        NVAR gNumPts2 = gNumPts2
1342                        NVAR gCtTime2 = gCtTime2
1343                        NVAR gIncr2 = gIncr2
1344                       
1345                        NVAR gAngLow3 = gAngLow3
1346                        NVAR gAngHigh3 = gAngHigh3
1347                        NVAR gNumPts3 = gNumPts3
1348                        NVAR gCtTime3 = gCtTime3
1349                        NVAR gIncr3 = gIncr3
1350                       
1351                        NVAR gAngLow4 = gAngLow4
1352                        NVAR gAngHigh4 = gAngHigh4
1353                        NVAR gNumPts4 = gNumPts4
1354                        NVAR gCtTime4 = gCtTime4
1355                        NVAR gIncr4 = gIncr4
1356                       
1357                        NVAR gAngLow5 = gAngLow5
1358                        NVAR gAngHigh5 = gAngHigh5
1359                        NVAR gNumPts5 = gNumPts5
1360                        NVAR gCtTime5 = gCtTime5
1361                        NVAR gIncr5 = gIncr5
1362                       
1363                        NVAR gAngLow6 = gAngLow6
1364                        NVAR gAngHigh6 = gAngHigh6
1365                        NVAR gNumPts6 = gNumPts6
1366                        NVAR gCtTime6 = gCtTime6
1367                        NVAR gIncr6 = gIncr6
1368                       
1369                        NVAR gAngLow7 = gAngLow7
1370                        NVAR gAngHigh7 = gAngHigh7
1371                        NVAR gNumPts7 = gNumPts7
1372                        NVAR gCtTime7 = gCtTime7
1373                        NVAR gIncr7 = gIncr7
1374                       
1375                        strswitch(popStr)       // string switch
1376                                case "Short Count":             // execute if case matches expression
1377                                       
1378                                        gAngLow1 = -1
1379                                        gAngHigh1 = 0.6
1380                                        gNumPts1 = 33
1381                                        gCtTime1 = 10
1382                                        gIncr1 = 0.05   
1383                                       
1384                                        gAngLow2 = 0.7
1385                                        gAngHigh2 = 1.9
1386                                        gNumPts2 = 6
1387                                        gCtTime2 = 60
1388                                        gIncr2 = 0.2   
1389                                       
1390                                        gAngLow3 = 2
1391                                        gAngHigh3 = 4.8
1392                                        gNumPts3 = 7
1393                                        gCtTime3 = 120
1394                                        gIncr3 = 0.4   
1395                                       
1396                                        gAngLow4 = 5
1397                                        gAngHigh4 = 9.5
1398                                        gNumPts4 = 5
1399                                        gCtTime4 = 180
1400                                        gIncr4 = 0.9   
1401                                       
1402                                        gAngLow5 = 10
1403                                        gAngHigh5 = 19
1404                                        gNumPts5 = 5
1405                                        gCtTime5 = 240
1406                                        gIncr5 = 1.8
1407                                       
1408                                        gAngLow6 = 20
1409                                        gAngHigh6 = 48
1410                                        gNumPts6 = 15
1411                                        gCtTime6 = 0
1412                                        gIncr6 = 2
1413                                       
1414                                        gAngLow7 = 50
1415                                        gAngHigh7 = 95
1416                                        gNumPts7 = 10
1417                                        gCtTime7 = 0
1418                                        gIncr7 = 5
1419                                       
1420                                        break                                           
1421                                case "Medium Count":   
1422                       
1423                                        gAngLow1 = -1
1424                                        gAngHigh1 = 0.6
1425                                        gNumPts1 = 33
1426                                        gCtTime1 = 10
1427                                        gIncr1 = 0.05   
1428                                       
1429                                        gAngLow2 = 0.7
1430                                        gAngHigh2 = 1.9
1431                                        gNumPts2 = 13
1432                                        gCtTime2 = 60
1433                                        gIncr2 = 0.1   
1434                                       
1435                                        gAngLow3 = 2
1436                                        gAngHigh3 = 4.8
1437                                        gNumPts3 = 15
1438                                        gCtTime3 = 120
1439                                        gIncr3 = 0.2   
1440                                       
1441                                        gAngLow4 = 5
1442                                        gAngHigh4 = 9.5
1443                                        gNumPts4 = 10
1444                                        gCtTime4 = 300
1445                                        gIncr4 = 0.5   
1446                                       
1447                                        gAngLow5 = 10
1448                                        gAngHigh5 = 19
1449                                        gNumPts5 = 10
1450                                        gCtTime5 = 600
1451                                        gIncr5 = 1
1452                                       
1453                                        gAngLow6 = 20
1454                                        gAngHigh6 = 48
1455                                        gNumPts6 = 15
1456                                        gCtTime6 = 1200
1457                                        gIncr6 = 2     
1458                                       
1459                                        gAngLow7 = 50
1460                                        gAngHigh7 = 95
1461                                        gNumPts7 = 10
1462                                        gCtTime7 = 0
1463                                        gIncr7 = 5
1464                                                               
1465                                        break
1466                                case "Long Count":     
1467                                       
1468                                        gAngLow1 = -1
1469                                        gAngHigh1 = 0.6
1470                                        gNumPts1 = 33
1471                                        gCtTime1 = 25
1472                                        gIncr1 = 0.05   
1473                                       
1474                                        gAngLow2 = 0.7
1475                                        gAngHigh2 = 1.9
1476                                        gNumPts2 = 13
1477                                        gCtTime2 = 100
1478                                        gIncr2 = 0.1   
1479                                       
1480                                        gAngLow3 = 2
1481                                        gAngHigh3 = 4.8
1482                                        gNumPts3 = 15
1483                                        gCtTime3 = 300
1484                                        gIncr3 = 0.2   
1485                                       
1486                                        gAngLow4 = 5
1487                                        gAngHigh4 = 9.5
1488                                        gNumPts4 = 10
1489                                        gCtTime4 = 600
1490                                        gIncr4 = 0.5   
1491                                       
1492                                        gAngLow5 = 10
1493                                        gAngHigh5 = 19
1494                                        gNumPts5 = 10
1495                                        gCtTime5 = 1200
1496                                        gIncr5 = 1
1497                                       
1498                                        gAngLow6 = 20
1499                                        gAngHigh6 = 48
1500                                        gNumPts6 = 15
1501                                        gCtTime6 = 2000
1502                                        gIncr6 = 2
1503                                       
1504                                        gAngLow7 = 50
1505                                        gAngHigh7 = 95
1506                                        gNumPts7 = 10
1507                                        gCtTime7 = 3000
1508                                        gIncr7 = 5
1509                                       
1510                                        break
1511                                default:                       
1512                        endswitch
1513                       
1514                        break
1515        endswitch
1516
1517        //update the count time
1518        CalcTotalCountTime()
1519
1520        SetDataFolder root:
1521       
1522        return 0
1523End     
1524
1525
1526// return the beam intensity based on the sample aperture diameter
1527//
1528// based on the equation in John's instrument paper
1529//
1530Function GetUSANSBeamIntensity()       
1531
1532        String popStr
1533        Variable flux,diam,rad
1534       
1535        ControlInfo/W=UCALC popup0
1536        popStr = S_Value
1537        diam=str2num(popStr)            //in inches
1538        rad = diam/2*25.4                       //radius in mm
1539       
1540        flux = 662*rad*rad-39.9*rad*rad*rad+0.70*rad*rad*rad*rad
1541       
1542        return(flux)
1543End
1544
1545// based on the angle ranges above (with non-zero count times)
1546// save fake data points into a fake BT5 data file
1547//
1548Function U_SaveButtonProc(ba) : ButtonControl
1549        STRUCT WMButtonAction &ba
1550
1551       
1552        switch( ba.eventCode )
1553                case 2: // mouse up
1554                        // click code here
1555                       
1556                        Variable num,ii,baseNumber=100,firstSet=0
1557                        String pathStr="root:Packages:NIST:USANS:Globals:U_Sim:gCtTime"
1558                        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder
1559                        String baseName="SIMUL"
1560                       
1561                        num = 7                 //# of angular ranges
1562                       
1563                        // only try to plot ranges with non-zero count times
1564                        firstSet=0
1565                        for(ii=1;ii<=num;ii+=1)
1566                                NVAR dum = $(pathStr+num2str(ii))
1567                                if(dum>0)                                               
1568                                        firstSet += 1
1569                                        if(firstSet==1) //first time, ask for base name
1570                                                Prompt baseName,"Enter a base name for the files"
1571                                                Prompt baseNumber,"Enter the starting index"
1572                                                DoPrompt "Enter Information for Save",baseName,baseNumber
1573                                               
1574                                                if(V_Flag==1)           //user canceled
1575                                                        return(1)
1576                                                endif
1577                                        endif
1578                                               
1579                                        SaveFakeUSANS(baseName,baseNumber-1,ii)
1580                                       
1581                                endif
1582                        endfor
1583                                                                       
1584                        break
1585        endswitch
1586
1587        return 0
1588End
1589
1590
1591//
1592// duplicates the BT5 file format
1593//
1594Function SaveFakeUSANS(nameStr,num,set)
1595        String nameStr
1596        Variable num,set
1597               
1598        String folder = "root:Packages:NIST:USANS:SIM:"
1599        String pathStr="root:Packages:NIST:USANS:Globals:U_Sim:"
1600        String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX
1601       
1602//      WAVE DetCts = $(folder+"DetCts")                //these are only dummy values
1603        WAVE DetCts = root:Sim_USANS:Sim_USANS_i
1604        WAVE angle = $(folder+"Angle")
1605        WAVE SetNumber = $(folder+"SetNumber")
1606        WAVE countingTime = $(folder+"countingTime")
1607       
1608        NVAR ang1 = $(pathStr+"gAngLow"+num2str(set))
1609        NVAR ang2 = $(pathStr+"gAngHigh"+num2str(set))
1610        NVAR incr = $(pathStr+"gIncr"+num2str(set))
1611       
1612        Variable refNum,ii,wavePts,numPts,first,last,ctTime,monCt,transDet
1613        String str,fileStr,dateStr
1614       
1615        wavePts = numpnts(angle)
1616        for(ii=0;ii<wavePts;ii+=1)
1617                if(setNumber[ii] == set)
1618                        first = ii
1619                        break
1620                endif
1621        endfor
1622               
1623        for(ii=wavePts-1;ii>=0;ii-=1)
1624                if(setNumber[ii] == set)
1625                        last = ii
1626                        break
1627                endif
1628        endfor
1629       
1630//      Print "First, last = ",first,last
1631       
1632        // set up some of the strings needed
1633        fileStr=nameStr+num2str(num+set)+".bt5"
1634        dateStr = date()// + " "+Secs2Time(DateTime,2)
1635        ctTime = countingTime[first]
1636        numPts = last-first+1
1637       
1638        MonCt = ctTime*GetUSANSBeamIntensity()
1639       
1640        transDet = 999          //bogus and constant value
1641               
1642        //actually open the file
1643        Open refNum as fileStr
1644       
1645        sprintf str,"'%s' '%s' 'I'        %d    1  'TIME'   %d  'RAW'",fileStr,dateStr,ctTime,numpts
1646        fprintf refnum,"%s"+termStr,str
1647        fprintf refnum,"%s"+termStr,"  Filename         Date            Scan       Mon    Prf  Base   #pts  Type"
1648       
1649        fprintf refnum,"Simulated USANS data"+termStr
1650
1651        fprintf refnum,"%s"+termStr,"   0    0    0    0   0  0  0     0.0000     0.00000 0.00000   0.00000    2"
1652        fprintf refnum,"%s"+termStr," Collimation      Mosaic    Wavelength   T-Start   Incr.   H-field #Det    "
1653        fprintf refnum,"%s"+termStr,"  1       0.00000    0.00000    0.00000"
1654        fprintf refnum,"  2       %9.5f    %9.5f    %9.5f"+termStr,ang1,incr,ang2
1655        fprintf refnum,"%s"+termStr,"  3      10.00000    0.00000   10.00000"
1656        fprintf refnum,"%s"+termStr,"  4      10.00000    0.00000   10.00000"
1657        fprintf refnum,"%s"+termStr,"  5       0.00000    0.00000    0.00000"
1658        fprintf refnum,"%s"+termStr,"  6       0.00000    0.00000    0.00000"
1659        fprintf refnum,"%s"+termStr," Mot:    Start       Step      End"
1660        fprintf refnum,"%s"+termStr,"     A2       MIN       COUNTS "
1661
1662        //loop over the waves, picking out the desired set
1663        //write 2 lines each time
1664        for(ii=first;ii<=last;ii+=1)
1665                sprintf str,"      %6.3f    %6.2f         %d",angle[ii],ctTime/60,DetCts[ii]
1666                fprintf refnum,"%s"+termStr,str
1667
1668                sprintf str,"%d,%d,0,%d,0,0,0,0",MonCt,DetCts[ii],transDet
1669                fprintf refnum,"%s"+termStr,str
1670        endfor
1671       
1672        Close refnum
1673
1674        return(0)
1675end
1676
1677
1678// print out the USANS configuration in some reasonable format
1679Function/S USANSConfigurationText()
1680
1681        String str="",temp
1682
1683        SetDataFolder root:Packages:NIST:USANS:Globals:U_Sim
1684       
1685        // results, setup values
1686        SVAR gTotTimeStr=gTotTimeStr
1687       
1688        Variable ii,num
1689        String pathStr="root:Packages:NIST:USANS:Globals:U_Sim:"
1690        num=7
1691       
1692        str += "USANS Instrument Configuration:\r\r"
1693        str += "Theta Min  Theta Max   Increment   # Points   Count Time\r"
1694       
1695       
1696        for(ii=1;ii<=num;ii+=1)
1697                NVAR ctTime = $(pathStr+"gCtTime"+num2str(ii))
1698                if(ctTime>0)
1699                        NVAR angLow = $(pathStr+"gAngLow"+num2str(ii))
1700                        NVAR angHigh = $(pathStr+"gAngHigh"+num2str(ii))
1701                        NVAR incr = $(pathStr+"gIncr"+num2str(ii))
1702                        NVAR numPts = $(pathStr+"gNumPts"+num2str(ii))
1703                       
1704                        sprintf temp,"%9.3f  %9.3f  %9.3f  %9d  %9d\r",angLow,angHigh,incr,numPts,ctTime
1705                        str += temp
1706                endif
1707        endfor
1708       
1709       
1710        sprintf temp,"\r\rTotal Counting Time (HR:MIN) = %s\r",gTotTimeStr
1711        str += temp
1712
1713       
1714   setDataFolder root:
1715   return str                   
1716End
1717
1718Function DisplayUCALCText()
1719
1720        if(WinType("USANS_Configuration")==0)
1721                NewNotebook/F=0/K=1/N=USANS_Configuration /W=(480,44,880,369)
1722        endif
1723        //replace the text
1724        Notebook USANS_Configuration selection={startOfFile, endOfFile}
1725        Notebook USANS_Configuration font="Monaco",fSize=10,text=USANSConfigurationText()
1726        return(0)
1727end
1728
1729
1730//
1731Function U_ConfigTextProc(ba) : ButtonControl
1732        STRUCT WMButtonAction &ba
1733
1734       
1735        switch( ba.eventCode )
1736                case 2: // mouse up
1737                        // click code here
1738                       
1739                                DisplayUCALCText()                                     
1740                        break
1741        endswitch
1742
1743        return 0
1744End
1745
1746// this will save a graphic of the whole panel that then needs to be opened and printed
1747// must be a PNG @ screen resolution
1748//
1749Function U_SavePanelProc(ba) : ButtonControl
1750        STRUCT WMButtonAction &ba
1751
1752       
1753        switch( ba.eventCode )
1754                case 2: // mouse up
1755                        // click code here
1756                       
1757                        SavePICT/P=home/E=-5/B=72/SNAP=1       
1758                       
1759                        // can I reload and print?
1760                        // how will the users know where this went and what to do with it?
1761                        //                     
1762                        break
1763        endswitch
1764
1765        return 0
1766End
Note: See TracBrowser for help on using the repository browser.