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

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

in SASCALC - changed some of the logic to allow 2D simulation

in MultiScatter_MC:

  • changed results wave to report coherent multiple scattering counters correctly (also changed XOP)
  • added save of 1D sim data

in U_CALC:

  • adjusted display for optimal view on windows
  • 7 angle ranges now (added defaults, propagated where all controls are modified)
  • added the angle axis correctly now as a free axis, with a hook linked to the bottom axis
  • removed XS and trans calculations, as integration of ran_dev isn't well

in USANS_EmptyWaves:

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