source: trunk/User Procedures/Irena/IR3_SimpleFits.ipf @ 1171

Last change on this file since 1171 was 1171, checked in by ilavsky, 9 months ago

Add Search for optimal solution to 3D aggregates

  • Property svn:eol-style set to native
File size: 173.5 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=1.15
3constant IR3JversionNumber = 0.5                        //Simple Fit panel version number
4
5//*************************************************************************\
6//* Copyright (c) 2005 - 2021, Argonne National Laboratory
7//* This file is distributed subject to a Software License Agreement found
8//* in the file LICENSE that is included with this distribution.
9//*************************************************************************/
10
11constant SimpleFitsLinPlotMaxScale = 1.07
12constant SimpleFitsLinPlotMinScale = 0.8
13
14//1.15  add 1D Correlation function
15//1.14          add handling of USAXS M_... waves
16//1.13  Added SMR USAXS data (not QRS), checked (and fixed) Sphere and spheroid models.
17//1.12  Added Invariant calculation.
18//1.1           combined this ipf with "Simple fits models"
19//1.0           Simple Fits tool first release version
20
21
22//To add new function:
23//at this moment we have:       ListOfSimpleModels="Guinier;Porod;Sphere;Spheroid;Guinier Rod;Guinier Sheet;1DCorrelation;"
24//IR3J_InitSimpleFits()
25//                      add to: ListOfSimpleModels list as new data type ("Guinier")
26//                      add any new parameters, which will need to be fit. Keep in mind, all will be fit.
27//IR3J_SimpleFitsPanelFnct()
28//                      set controls for the new parameters.
29//IR3J_PopMenuProc()
30//                      make sure controls show as needed only
31//IR3J_CreateLinearizedData()
32//                      create new linearized data if needed. Example: Guiniers, Porod...
33//IR3J_AppendDataToGraphModel()
34//                      if linearized data exist, append them here...
35//IR3J_CalculateModel()
36//                      Add model calculations here...
37//IR3J_FitData()
38//                      Add fitting function and fit here.                             
39//IR3J_SaveResultsToNotebook()
40//IR3J_SaveResultsToFolder()
41//IR3J_SaveResultsToWaves()
42//                      Add to both of these above string results in appropriate media...
43//IR3J_GetTableWithResults()
44//                      here create proper table to present to users...
45//IR3J_DeleteExistingModelResults()
46//                      add here how to delete new data types being created...
47//add also results type to IR2_PanelControLProcedures.ipf
48//                      Procedure is IR2C_InitControls
49//existing:     AllCurrentlyAllowedTypes+="SimFitYGuinier;SimFitYGuinierR;SimFitYGuinierS;SimFitYSphere;SimFitYSpheroid;"
50// and more:            Corr1DK;Corr1DGammaA;Corr1DGammaI
51
52//Invariant background definitions:
53//InvBackgModelList = "Porod+y0;PowerLaw+y0;Constant;Gauss y0+A*exp((X-X0)^2/width;Ruland A*exp(B*X^2)+y0;None;"
54//InvBackgModelList = "Porod+y0;PowerLaw+y0;Constant;Gauss Peak;Exponential;None;"
55//      Gauss y0+A*exp((X-X0)^2/width   =       Gauss Peak
56//      Ruland A*exp(B*X^2)+y0                  =  Exponential
57//**********************
58// 1D Correlation procedure calculates the 1D correlation function as typically seen used to analyze
59// lamellar structures. 
60//      Code p[rovided by RIck Beyer, included 9/30/2021
61//      There are 3 choices:
62//1) Calculate K(z) as typically reported by Strobl.  The result is reported in units of (mol e-/cm^3)^2.
63//              I'm not confident in the data scaling in this case.
64//2) For an anisotropic (highly oritented) lamellar morphoplogy, calculate Gamma(z) as derived by Vonk
65//              & Kortleve, but following Roe's book. 
66//3) For an isotropic lamellar morphology (very common), calculate gamma(z) as in #2 but applying a
67//              Lorentz-type correction to I(q) first.
68//
69//References:
70//Litvinov et al, Macromolecules 2011, 44, 9254.
71//Vonk, C. G.; Kortleve, G. Kolloid-Zeitschrift und Zeitschrift fÃŒr Polymere 1967, 220(1), 19-24.
72//Strobl, G. R. Journal of Applied Crystallography 1973, 6(5), 365-370.
73//Strobl, G. R.; Schneider, M. Journal of Polymer Science Part B-Polymer Physics 1980, 18(6), 1343-1359.
74//Roe, R.J. Methods of X-ray and Neutron Scattering in Polymer Science.
75//
76//Clasical electron radius = re = 2.8179e-15 m = 2.8179e-13 cm
77//
78//Z input (maximum Z in real space) must be in same units as q (nm and 1/nm, or Ang and 1/Ang)
79//results in Corr1DZ_N, Corr1DK_N or Corr1DGammaA_N or Corr1DGammaI_N
80//              Wave ZWave = root:Packages:Irena:SimpleFits:ZWave
81//                      Duplicate/O ZWave, $(DataFolderName+"Corr1DZ_"+num2str(generation))
82//                      Wave ResultX=$(DataFolderName+"Corr1DZ_"+num2str(generation))
83//                      If(StringMatch(Corr1DMethod, "Anisotropic (abs, Strobl)"))                                                             
84//                              //Strobl approach
85//                              Wave Kwave = root:Packages:Irena:SimpleFits:Kwave
86//                              Duplicate/O Kwave, $(DataFolderName+"Corr1DK_"+num2str(generation))
87//                              Wave ResultY = $(DataFolderName+"Corr1DK_"+num2str(generation))
88//                      ElseIf(StringMatch(Corr1DMethod, "Anisotropic (norm)"))                                                         
89//                              //Roe approach for anisotropic data
90//                              Wave GammaA_wave = root:Packages:Irena:SimpleFits:GammaA_wave
91//                              Duplicate/O GammaA_wave, $(DataFolderName+"Corr1DGammaA_"+num2str(generation))
92//                              Wave ResultY = $(DataFolderName+"Corr1DGammaA_"+num2str(generation))
93//                      ElseIf(StringMatch(Corr1DMethod, "Isotropic (norm)"))                                                   
94//                              //Roe approach for isotropic data
95//                              Wave GammaI_wave = root:Packages:Irena:SimpleFits:GammaI_wave
96//                              Duplicate/O GammaI_wave, $(DataFolderName+"Corr1DGammaI_"+num2str(generation))
97//                              Wave ResultY = $(DataFolderName+"Corr1DGammaI_"+num2str(generation))
98
99
100//**********************
101
102
103///******************************************************************************************
104///******************************************************************************************
105///******************************************************************************************
106///******************************************************************************************
107Function IR3J_SimpleFits()
108
109        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
110        IN2G_CheckScreenSize("width",1200)
111        DoWIndow IR3J_SimpleFitsPanel
112        if(V_Flag)
113                DoWindow/F IR3J_SimpleFitsPanel
114        else
115                IR3J_InitSimpleFits()
116                IR1T_InitFormFactors()
117                IR3J_SimpleFitsPanelFnct()
118                ING2_AddScrollControl()
119                IR1_UpdatePanelVersionNumber("IR3J_SimpleFitsPanel", IR3JversionNumber,1)
120                IR3C_MultiUpdListOfAvailFiles("Irena:SimpleFits")       
121        endif
122        IR3J_CreateCheckGraphs()
123end
124//************************************************************************************************************
125Function IR1B_SimpleFitsMainCheckVersion()     
126        DoWindow IR3J_SimpleFitsPanel
127        if(V_Flag)
128                if(!IR1_CheckPanelVersionNumber("IR3J_SimpleFitsPanel", IR3JversionNumber))
129                        DoAlert /T="The Simple Fits panel was created by incorrect version of Irena " 1, "Import Simple Fits needa to be restarted to work properly. Restart now?"
130                        if(V_flag==1)
131                                KillWIndow/Z IR3J_SimpleFitsPanel
132                                IR3J_SimpleFits()
133                        else            //at least reinitialize the variables so we avoid major crashes...
134                                IR3J_InitSimpleFits()
135                                IR1T_InitFormFactors() 
136                        endif
137                endif
138        endif
139end
140
141//************************************************************************************************************
142//************************************************************************************************************
143//************************************************************************************************************
144//************************************************************************************************************
145Function IR3J_SimpleFitsPanelFnct()
146        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
147        PauseUpdate             // building window...
148        NewPanel /K=1 /W=(2.25,43.25,530,800) as "Simple Fits & Analysis tool"
149        DoWIndow/C IR3J_SimpleFitsPanel
150        TitleBox MainTitle title="Simple Fits & Analysis tool",pos={120,2},frame=0,fstyle=3, fixedSize=1,font= "Times New Roman", size={360,30},fSize=22,fColor=(0,0,52224)
151        string UserDataTypes=""
152        string UserNameString=""
153        string XUserLookup=""
154        string EUserLookup=""
155        IR2C_AddDataControls("Irena:SimpleFits","IR3J_SimpleFitsPanel","DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;","AllCurrentlyAllowedTypes",UserDataTypes,UserNameString,XUserLookup,EUserLookup, 0,1, DoNotAddControls=1)
156        IR3C_MultiAppendControls("Irena:SimpleFits","IR3J_SimpleFitsPanel", "IR3J_CopyAndAppendData","",1,1)
157        //hide what is not needed
158        checkbox UseResults, disable=0
159        SetVariable DataQEnd,pos={290,90},size={190,15}, proc=IR3J_SetVarProc,title="Q max for fitting    "
160        Setvariable DataQEnd, variable=root:Packages:Irena:SimpleFits:DataQEnd, limits={-inf,inf,0}
161        SetVariable DataQstart,pos={290,110},size={190,15}, proc=IR3J_SetVarProc,title="Q min for fitting     "
162        Setvariable DataQstart, variable=root:Packages:Irena:SimpleFits:DataQstart, limits={-inf,inf,0}
163        SetVariable DataFolderName,noproc,title=" ",pos={260,160},size={270,17},frame=0, fstyle=1,valueColor=(0,0,65535)
164        Setvariable DataFolderName, variable=root:Packages:Irena:SimpleFits:DataFolderName, noedit=1
165
166        Button SelectAll,pos={200,680},size={80,15}, proc=IR3J_ButtonProc,title="SelectAll", help={"Select All data in Listbox"}
167        Button GetHelp,pos={430,50},size={80,15},fColor=(65535,32768,32768), proc=IR3J_ButtonProc,title="Get Help", help={"Open www manual page for this tool"}
168
169        PopupMenu SimpleModel,pos={280,175},size={200,20},fStyle=2,proc=IR3J_PopMenuProc,title="Model to fit : "
170        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
171        PopupMenu SimpleModel,mode=1,popvalue=SimpleModel,value= #"root:Packages:Irena:SimpleFits:ListOfSimpleModels"
172       
173        //Guinier controls
174        SetVariable Guinier_I0,pos={240,230},size={220,15}, proc=IR3J_SetVarProc,title="Scaling I0  ", bodywidth=80
175        Setvariable Guinier_I0, variable=root:Packages:Irena:SimpleFits:Guinier_I0, limits={1e-20,inf,0}, help={"Guinier prefactor I0"}
176        SetVariable Guinier_Rg,pos={240,260},size={220,15}, proc=IR3J_SetVarProc,title="Rg [A] ", bodywidth=80
177        Setvariable Guinier_Rg, variable=root:Packages:Irena:SimpleFits:Guinier_Rg, limits={3,inf,0}, help={"Guinier Rg value"}
178        //Porod
179        SetVariable Porod_Constant,pos={290,230},size={220,15}, proc=IR3J_SetVarProc,title="Porod Con. [cm2/cm3/A^4] ", bodywidth=80
180        Setvariable Porod_Constant, variable=root:Packages:Irena:SimpleFits:Porod_Constant, limits={1e-20,inf,0}, help={"Porod constant"}
181        SetVariable ScatteringContrast,pos={290,260},size={220,15}, proc=IR3J_SetVarProc,title="Contrast [10^20 cm^-4]", bodywidth=80
182        Setvariable ScatteringContrast, variable=root:Packages:Irena:SimpleFits:ScatteringContrast, limits={1,inf,0}, help={"Scattering Contrast for the scatterers"}
183        SetVariable Porod_SpecificSurface,pos={290,290},size={220,15}, proc=IR3J_SetVarProc,title="Spec. Sfc area [cm2/cm3]", bodywidth=80, limits={0,inf,0}
184        Setvariable Porod_SpecificSurface, variable=root:Packages:Irena:SimpleFits:Porod_SpecificSurface, disable=0, noedit=1, help={"Porod constant"}
185        //Sphere controls
186        SetVariable Sphere_ScalingConstant,pos={240,230},size={220,15}, proc=IR3J_SetVarProc,title="Scaling ", bodywidth=80
187        Setvariable Sphere_ScalingConstant, variable=root:Packages:Irena:SimpleFits:Sphere_ScalingConstant, limits={1e-20,inf,0}, help={"Scaling prefactor, I0"}
188        SetVariable Sphere_Radius,pos={240,260},size={220,15}, proc=IR3J_SetVarProc,title="Radius [A] ", bodywidth=80
189        Setvariable Sphere_Radius, variable=root:Packages:Irena:SimpleFits:Sphere_Radius, limits={3,inf,0}, help={"Radius of a sphere"}
190
191        //Guinier controls
192        SetVariable Spheroid_ScalingConstant,pos={240,230},size={220,15}, proc=IR3J_SetVarProc,title="Scaling ", bodywidth=80
193        Setvariable Spheroid_ScalingConstant, variable=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant, limits={1e-20,inf,0}, help={"Scaling constant"}
194        SetVariable Spheroid_Radius,pos={240,260},size={220,15}, proc=IR3J_SetVarProc,title="Radius [A] ", bodywidth=80
195        Setvariable Spheroid_Radius, variable=root:Packages:Irena:SimpleFits:Spheroid_Radius, limits={3,inf,0}, help={"Radius of particle, particle is R x R x Beta*R"}
196        SetVariable Spheroid_Beta,pos={240,290},size={220,15}, proc=IR3J_SetVarProc,title="Beta (RxRxBR)", bodywidth=80
197        Setvariable Spheroid_Beta, variable=root:Packages:Irena:SimpleFits:Spheroid_Beta, limits={0.001,1000,0}, help={"Particle aspect ratio, beta, particle is R x R x Beta*R"}
198        SetVariable DataBackground,pos={240,320},size={220,15}, proc=IR3J_SetVarProc,title="Flat Background ", bodywidth=80
199        Setvariable DataBackground, variable=root:Packages:Irena:SimpleFits:DataBackground, limits={-inf,inf,0}, help={"Flat background for scattering intensity"}
200
201        //Invariant controls
202        Checkbox InvExtrapolateLowQ, pos={280,200},size={76,14},title="Extrapolate to Q=0?", proc=IR3J_CheckProc, variable=root:Packages:Irena:SimpleFits:InvExtrapolateLowQ, help={"Extrapolate from Qmin to Q=0 with constant intensity"}
203        SetVariable InvContrast,pos={240,220},size={220,15}, proc=IR3J_SetVarProc,title="Contrast = ", bodywidth=80
204        Setvariable InvContrast, variable=root:Packages:Irena:SimpleFits:InvContrast, limits={-inf,inf,0}, help={"Scattering contrast (delta-rho^2) to calculate volume fraction"}
205
206        PopupMenu InvBackgModel,pos={280,252},size={200,20},fStyle=2,proc=IR3J_PopMenuProc,title="Bckg model: "
207        SVAR InvBackgModel = root:Packages:Irena:SimpleFits:InvBackgModel
208        SVAR InvBackgModelList = root:Packages:Irena:SimpleFits:InvBackgModelList
209        PopupMenu InvBackgModel,value= #"root:Packages:Irena:SimpleFits:InvBackgModelList" ,mode=(WhichListItem(InvBackgModel, InvBackgModelList)+1)
210        SetVariable InvBckgMinQ,pos={240,285},size={220,15}, proc=IR3J_SetVarProc,title="Backg Fit Qmin", bodywidth=80
211        Setvariable InvBckgMinQ, variable=root:Packages:Irena:SimpleFits:InvBckgMinQ, limits={0,10,0}, help={"Start of range to fit background"}
212        SetVariable InvBckgMaxQ,pos={240,305},size={220,15}, proc=IR3J_SetVarProc,title="Bckg Fit Qmax ", bodywidth=80
213        Setvariable InvBckgMaxQ, variable=root:Packages:Irena:SimpleFits:InvBckgMaxQ, limits={-inf,inf,0}, help={"End of Q range to fit background"}
214       
215        TitleBox invariantInfo title="\Zr100Inv. units: [(mol e-^2/cm^3)^3]",size={330,15},pos={300,335},frame=0,fColor=(0,0,65535),labelBack=0
216        SetVariable invariant,pos={240,355},size={220,15}, noproc,title="Invariant = ", bodywidth=80, noedit=1, limits={0,inf,0}, format="%4.3e",frame=0
217        Setvariable invariant, variable=root:Packages:Irena:SimpleFits:invariant, help={"Invariant in [(mol e-^2/cm^3)^3]"}
218        SetVariable InvariantIrena,pos={240,375},size={220,15}, noproc,title="Invariant [1/cm4]= ", bodywidth=80, noedit=1, limits={0,inf,0}, format="%4.3e",frame=0
219        Setvariable InvariantIrena, variable=root:Packages:Irena:SimpleFits:InvariantIrena, help={"Invariant in [1/cm4]"}, format="%4.3e"
220
221
222        SetVariable InvVolumeFraction,pos={240,400},size={220,15}, noproc,title="Volume Fraction = ", bodywidth=80, format="%3.2g",frame=0
223        Setvariable InvVolumeFraction, variable=root:Packages:Irena:SimpleFits:InvVolumeFraction, noedit=1, limits={0,inf,0},help={"Volume fraction from contrast"}
224        SetVariable InvQmaxUsed,pos={240,420},size={220,15}, noproc,title="Qmax used = ", bodywidth=80, noedit=1, limits={0,inf,0}, format="%4.3g",frame=0
225        Setvariable InvQmaxUsed, variable=root:Packages:Irena:SimpleFits:InvQmaxUsed,  help={"Calculated Qmax used in evaluation"}
226
227        //1DCorrelation controls
228        SVAR Corr1DMethod = root:Packages:Irena:SimpleFits:Corr1DMethod
229        SVAR ListOfCorr1DMethod = root:Packages:Irena:SimpleFits:ListOfCorr1DMethod
230        PopupMenu Corr1DMethodSel,pos={280,252},size={200,20},fStyle=2,proc=IR3J_PopMenuProc,title="Model: "
231        PopupMenu Corr1DMethodSel,value= #"root:Packages:Irena:SimpleFits:ListOfCorr1DMethod" ,mode=(WhichListItem(Corr1DMethod, ListOfCorr1DMethod)+1)
232        SetVariable Corr1DZmax,pos={240,285},size={220,15}, proc=IR3J_SetVarProc, title="Max dim [A]", bodywidth=80
233        Setvariable Corr1DZmax, variable=root:Packages:Irena:SimpleFits:Corr1DZmax, limits={10,inf,0}, help={"Maximum real space dimension [A]"}
234        SetVariable Corr1DWavelength,pos={240,305},size={220,15}, proc=IR3J_SetVarProc, title="Wavelngth [A]", bodywidth=80
235        Setvariable Corr1DWavelength, variable=root:Packages:Irena:SimpleFits:Corr1DWavelength, limits={0.01,10,0}, help={"X-ray wavelength [A]"}
236
237        //other stuff...
238        Button FitCurrentDataSet,pos={280,450},size={180,20}, proc=IR3J_ButtonProc,title="Fit Current (one) Dataset", help={"Fit current data set"}
239        Button FitSelectionDataSet,pos={280,480},size={180,20}, proc=IR3J_ButtonProc,title="Fit (All) Selected Data", help={"Fit all data selected in listbox"}
240        SetVariable AchievedChiSquare,pos={270,510},size={220,15}, noproc,title="Achieved chi-square"
241        Setvariable AchievedChiSquare, variable=root:Packages:Irena:SimpleFits:AchievedChiSquare, disable=2, limits={0,inf,0}, format="%3.2f"
242
243        Checkbox SaveToNotebook, pos={280,537},size={76,14},title="Record to Notebook?", noproc, variable=root:Packages:Irena:SimpleFits:SaveToNotebook, help={"Record results in notebook"}
244        Checkbox SaveToWaves, pos={280,552},size={76,14},title="Record to Waves?", noproc, variable=root:Packages:Irena:SimpleFits:SaveToWaves, help={"Record results in waves, can then create a table"}
245        Checkbox SaveToFolder, pos={280,567},size={76,14},title="Record to Folder?", noproc, variable=root:Packages:Irena:SimpleFits:SaveToFolder, help={"Saves Intensity and Q in teh data folder"}
246
247        Button RecordCurrentresults,pos={280,590},size={180,20}, proc=IR3J_ButtonProc,title="Record Results", help={"Record results in notebook and table"}
248        Button GetTableWithResults,pos={280,620},size={180,20}, proc=IR3J_ButtonProc,title="Get Table With Results", help={"Open Table with results for current Model"}
249        Button GetNotebookWithResults,pos={280,650},size={180,20}, proc=IR3J_ButtonProc,title="Get Notebook With Results", help={"Open Notebook with results for current Model"}
250        Button DeleteOldResults,pos={280,705},size={180,20}, proc=IR3J_ButtonProc,title="Delete Existing Results", help={"Delete results for the current model"}, fColor=(34952,34952,34952)
251
252        SetVariable DelayBetweenProcessing,pos={260,735},size={220,15}, noproc,title="Delay between Processing ", bodywidth=80
253        Setvariable DelayBetweenProcessing, variable=root:Packages:Irena:SimpleFits:DelayBetweenProcessing, limits={0,20,0.2}, help={"Delay between two processing steps, set o 0 for none. "}
254
255
256        TitleBox Instructions1 title="\Zr100Double click to add data to graph",size={330,15},pos={4,680},frame=0,fColor=(0,0,65535),labelBack=0
257        TitleBox Instructions2 title="\Zr100Shift-click to select range of data",size={330,15},pos={4,695},frame=0,fColor=(0,0,65535),labelBack=0
258        TitleBox Instructions3 title="\Zr100Ctrl/Cmd-click to select one data set",size={330,15},pos={4,710},frame=0,fColor=(0,0,65535),labelBack=0
259        TitleBox Instructions4 title="\Zr100Regex for not contain: ^((?!string).)*$",size={330,15},pos={4,725},frame=0,fColor=(0,0,65535),labelBack=0
260        TitleBox Instructions5 title="\Zr100Regex for contain:  string, two: str2.*str1",size={330,15},pos={4,740},frame=0,fColor=(0,0,65535),labelBack=0
261        TitleBox Instructions6 title="\Zr100Regex for case independent:  (?i)string",size={330,15},pos={4,755},frame=0,fColor=(0,0,65535),labelBack=0
262       
263        //and fix which controls are displayed:
264       
265        IR3J_SetupControlsOnMainpanel()
266end
267
268//************************************************************************************************************
269//************************************************************************************************************
270Function IR3J_CreateCheckGraphs()
271       
272        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
273        variable exists1=0
274        DoWIndow IR3J_LogLogDataDisplay
275        if(V_Flag)
276                DoWIndow/hide=? IR3J_LogLogDataDisplay
277                if(V_Flag==2)
278                        DoWIndow/F IR3J_LogLogDataDisplay
279                endif
280        else
281                Display /W=(521,10,1183,400)/K=1 /N=IR3J_LogLogDataDisplay
282                ShowInfo/W=IR3J_LogLogDataDisplay
283                exists1=1
284        endif
285
286        variable exists2=0
287        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
288
289        if(StringMatch(SimpleModel,"Guinier*") || StringMatch(SimpleModel,"Porod*") || StringMatch(SimpleModel,"1DCorrelation"))
290                DoWIndow IR3J_LinDataDisplay
291                if(V_Flag)
292                        DoWIndow/hide=? IR3J_LinDataDisplay
293                        if(V_Flag==2)
294                                DoWIndow/F IR3J_LinDataDisplay
295                        endif
296                else
297                        Display /W=(521,10,1183,400)/K=1 /N=IR3J_LinDataDisplay
298                        ShowInfo/W=IR3J_LinDataDisplay
299                        exists2=1
300                endif
301        else
302                KillWindow/Z IR3J_LinDataDisplay
303                exists2=0
304        endif
305        if(exists1 && exists2)
306                AutoPositionWindow/M=0/R=IR3J_SimpleFitsPanel IR3J_LogLogDataDisplay   
307                AutoPositionWindow/M=1/R=IR3J_LogLogDataDisplay IR3J_LinDataDisplay     
308        elseif(exists1 && exists2==0)
309                AutoPositionWindow/M=0/R=IR3J_SimpleFitsPanel IR3J_LogLogDataDisplay   
310        endif
311end
312
313//**********************************************************************************************************
314//**********************************************************************************************************
315
316Function IR3J_InitSimpleFits() 
317
318
319        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
320        DFref oldDf= GetDataFolderDFR()
321        string ListOfVariables
322        string ListOfStrings
323        variable i
324               
325        if (!DataFolderExists("root:Packages:Irena:SimpleFits"))                //create folder
326                NewDataFolder/O root:Packages
327                NewDataFolder/O root:Packages:Irena
328                NewDataFolder/O root:Packages:Irena:SimpleFits
329        endif
330        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
331
332        //here define the lists of variables and strings needed, separate names by ;...
333        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;dQWavename;DataUnits;"
334        ListOfStrings+="DataStartFolder;DataMatchString;FolderSortString;FolderSortStringAll;"
335        ListOfStrings+="UserMessageString;SavedDataMessage;"
336        ListOfStrings+="SimpleModel;ListOfSimpleModels;"
337        //parameters for Invariant and 1DCorrelation
338        ListOfStrings+="InvBackgModel;InvBackgModelList;Corr1DMethod;ListOfCorr1DMethod;"
339
340        ListOfVariables="UseIndra2Data1;UseQRSdata1;SlitLength;UseSMRData;"
341        ListOfVariables+="DataBackground;AchievedChiSquare;ScatteringContrast;"
342        ListOfVariables+="Guinier_Rg;Guinier_I0;"
343        ListOfVariables+="Porod_Constant;Porod_SpecificSurface;Sphere_Radius;Sphere_ScalingConstant;"
344        ListOfVariables+="Spheroid_Radius;Spheroid_ScalingConstant;Spheroid_Beta;"
345        ListOfVariables+="ProcessManually;ProcessSequentially;OverwriteExistingData;AutosaveAfterProcessing;DelayBetweenProcessing;"
346        ListOfVariables+="DataQEnd;DataQstart;DataQEndPoint;DataQstartPoint;"
347        ListOfVariables+="SaveToNotebook;SaveToWaves;SaveToFolder;"
348        //parameters for Invariant and 1DCorrelation
349        ListOfVariables+="InvBckgMinQ;InvBckgMaxQ;Invariant;InvQmaxUsed;InvExtrapolateLowQ;InvContrast;InvVolumeFraction;"
350        ListOfVariables+="InvariantIrena;Corr1DZmax;Corr1DWavelength;"
351        //InvariantIrena is in 1/cm4
352         
353//      ListOfVariables+="VOlSD_Rg;VolSD_Volume;VolSD_MeanDiameter;VolSD_MedianDiameter;VOlSD_ModeDiamater;"
354//      ListOfVariables+="NumSD_NumPartPerCm3;NumSD_MeanDiameter;NumSD_MedianDiameter;NumSD_ModeDiamater;"
355
356        //and here we create them
357        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
358                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
359        endfor         
360                                                               
361        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
362                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
363        endfor 
364
365        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;dQWavename;"
366        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
367                SVAR teststr=$(StringFromList(i,ListOfStrings))
368                teststr =""
369        endfor         
370        ListOfStrings="DataMatchString;FolderSortString;FolderSortStringAll;"
371        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
372                SVAR teststr=$(StringFromList(i,ListOfStrings))
373                if(strlen(teststr)<1)
374                        teststr =""
375                endif
376        endfor         
377        ListOfStrings="DataStartFolder;"
378        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
379                SVAR teststr=$(StringFromList(i,ListOfStrings))
380                if(strlen(teststr)<1)
381                        teststr ="root:"
382                endif
383        endfor         
384        SVAR InvBackgModelList
385        SVAR InvBackgModel
386        InvBackgModelList = "Porod+y0;PowerLaw+y0;Constant;Gauss Peak;Exponential;None;"
387        if(strlen(InvBackgModel)<2)
388                InvBackgModel = "Constant"
389        endif
390        SVAR ListOfSimpleModels
391        ListOfSimpleModels="Guinier;Porod;Sphere;Spheroid;Guinier Rod;Guinier Sheet;"
392        ListOfSimpleModels+="Invariant;1DCorrelation;"
393        SVAR ListOfCorr1DMethod
394        ListOfCorr1DMethod = "Anisotropic (abs, Strobl);Anisotropic (norm);Isotropic (norm);"
395        SVAR SimpleModel
396        if(strlen(SimpleModel)<1)
397                SimpleModel="Guinier"
398        endif
399        SVAR Corr1DMethod
400        if(strlen(Corr1DMethod)<1)
401                Corr1DMethod="Anisotropic (abs, Strobl)"
402        endif
403       
404        NVAR Guinier_Rg
405        NVAR Guinier_I0
406        if(Guinier_Rg<5)
407                Guinier_Rg=50
408        endif
409        if(Guinier_I0<1e-22)
410                Guinier_I0 = 10
411        endif
412        NVAR Porod_Constant
413        if(Porod_Constant<1e-22)
414                Porod_Constant = 1
415        endif
416        NVAR Sphere_Radius
417        if(Sphere_Radius<5)
418                Sphere_Radius = 50
419        endif
420        NVAR Sphere_ScalingConstant
421        if(Sphere_ScalingConstant<1e-22)
422                Sphere_ScalingConstant=1
423        endif
424        NVAR Spheroid_Radius
425        if(Spheroid_Radius<5)
426                Spheroid_Radius = 50
427        endif
428        NVAR Spheroid_ScalingConstant
429        if(Spheroid_ScalingConstant<1e-22)
430                Spheroid_ScalingConstant = 1
431        endif
432        NVAR Spheroid_Beta
433        if(Spheroid_Beta<0.001)
434                Spheroid_Beta = 1
435        endif
436        NVAR DelayBetweenProcessing
437        if(DelayBetweenProcessing<=0)
438                DelayBetweenProcessing = 2
439        endif
440        NVAR ScatteringContrast
441        if(ScatteringContrast<1)
442                ScatteringContrast = 1
443        endif
444        NVAR Corr1DZmax
445        if(Corr1DZmax<50)
446                Corr1DZmax = 200
447        endif
448        NVAR Corr1DWavelength
449        if(Corr1DWavelength<0.05)
450                Corr1DWavelength = 1.542
451        endif
452       
453        NVAR InvBckgMinQ
454        //InvBckgMinQ = 0
455        NVAR InvBckgMaxQ
456        //InvBckgMaxQ = 0
457        NVAR Invariant
458        Invariant = 0
459        NVAR InvQmaxUsed
460        InvQmaxUsed = 0
461        Make/O/T/N=(0) ListOfAvailableData
462        Make/O/N=(0) SelectionOfAvailableData
463        SetDataFolder oldDf
464
465end
466//**************************************************************************************
467//**************************************************************************************
468//**************************************************************************************
469
470//*****************************************************************************************************************
471//*****************************************************************************************************************
472//**************************************************************************************
473//**************************************************************************************
474
475Function IR3J_CheckProc(cba) : CheckBoxControl
476        STRUCT WMCheckboxAction &cba
477
478        switch( cba.eventCode )
479                case 2: // mouse up
480                        Variable checked = cba.checked
481                        NVAR UseIndra2Data =  root:Packages:Irena:SimpleFits:UseIndra2Data
482                        NVAR UseQRSData =  root:Packages:Irena:SimpleFits:UseQRSData
483                        SVAR DataStartFolder = root:Packages:Irena:SimpleFits:DataStartFolder
484                        if(StringMatch(cba.ctrlName, "InvExtrapolateLowQ") )
485                                IR3J_CalculateInvariant()
486                        endif
487                        break
488                case -1: // control being killed
489                        break
490        endswitch
491
492        return 0
493End
494//**************************************************************************************
495//**************************************************************************************
496//**************************************************************************************
497//**************************************************************************************
498//**************************************************************************************
499
500//**************************************************************************************
501//**************************************************************************************
502//**************************************************************************************
503//**************************************************************************************
504//**************************************************************************************
505//**************************************************************************************
506//**************************************************************************************
507
508Function IR3J_SetVarProc(sva) : SetVariableControl
509        STRUCT WMSetVariableAction &sva
510
511        variable tempP
512        switch( sva.eventCode )
513                case 1: // mouse up
514                case 2: // Enter key
515                        NVAR DataQstart=root:Packages:Irena:SimpleFits:DataQstart
516                        NVAR DataQEnd=root:Packages:Irena:SimpleFits:DataQEnd
517                        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
518                        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
519                       
520                        if(stringmatch(sva.ctrlName,"DataQEnd"))
521                                WAVE OriginalDataQWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
522                                tempP = BinarySearch(OriginalDataQWave, DataQEnd )
523                                if(tempP>numpnts(OriginalDataQWave)-2)
524                                        print "Wrong Q value set, Data Q max must be at most 1 point before the end of Data"
525                                        tempP = numpnts(OriginalDataQWave)-2
526                                        DataQEnd = OriginalDataQWave[tempP]
527                                endif
528                                DataQEndPoint = tempP                   
529                                IR3J_SyncCursorsTogether("OriginalDataIntWave","B",tempP)
530                                IR3J_SyncCursorsTogether("LinModelDataIntWave","B",tempP)
531                        endif
532                        if(stringmatch(sva.ctrlName,"DataQstart"))
533                                WAVE OriginalDataQWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
534                                tempP = BinarySearch(OriginalDataQWave, DataQstart )
535                                if(tempP<1)
536                                        print "Wrong Q value set, Data Q min must be at least 1 point from the start of Data"
537                                        tempP = 1
538                                        DataQstart = OriginalDataQWave[tempP]
539                                endif
540                                DataQstartPoint=tempP
541                                IR3J_SyncCursorsTogether("OriginalDataIntWave","A",tempP)
542                                IR3J_SyncCursorsTogether("LinModelDataIntWave","A",tempP)
543                        endif
544                        if(stringmatch(sva.ctrlName,"InvBckgMinQ"))             //invariant background fitting function
545                                NVAR InvBckgMinQ = root:Packages:Irena:SimpleFits:InvBckgMinQ
546                                WAVE OriginalDataQWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
547                                tempP = BinarySearch(OriginalDataQWave, InvBckgMinQ )
548                                if(tempP<1)
549                                        print "Wrong Q value set, Data Q min must be at least 1 point from the start of Data"
550                                        tempP = 1
551                                        InvBckgMinQ = OriginalDataQWave[tempP]
552                                endif
553                                IR3J_InvSyncBckgCursors(0)
554                        endif
555                        if(stringmatch(sva.ctrlName,"InvBckgMaxQ"))             //invariant background fitting function
556                                NVAR InvBckgMaxQ = root:Packages:Irena:SimpleFits:InvBckgMaxQ
557                                WAVE OriginalDataQWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
558                                tempP = BinarySearch(OriginalDataQWave, InvBckgMaxQ )
559                                if(tempP>numpnts(OriginalDataQWave)-2)
560                                        print "Wrong Q value set, Data Q max must be at most 1 point before the end of Data"
561                                        tempP = numpnts(OriginalDataQWave)-2
562                                        InvBckgMaxQ = OriginalDataQWave[tempP]
563                                endif
564                                IR3J_InvSyncBckgCursors(0)
565                        endif                   
566                        if(stringmatch(sva.ctrlName,"InvContrast"))             //contrast changed
567                                IR3J_CalculateInvariant()
568                        endif
569                        //update model to allow some playing...
570                        if(stringmatch(sva.ctrlName,"Sphere_Radius") || stringmatch(sva.ctrlName,"DataBackground") || stringmatch(sva.ctrlName,"Sphere_ScalingConstant") )              //update model..
571                                IR3J_CalculateModel()
572                        endif
573                        if(stringmatch(sva.ctrlName,"Porod_Constant") || stringmatch(sva.ctrlName,"ScatteringContrast") || stringmatch(sva.ctrlName,"Spheroid_ScalingConstant") )               //update model..
574                                IR3J_CalculateModel()
575                        endif
576                        if(stringmatch(sva.ctrlName,"Guinier_I0") || stringmatch(sva.ctrlName,"Guinier_Rg") || stringmatch(sva.ctrlName,"Spheroid_Beta") )              //update model..
577                                IR3J_CalculateModel()
578                        endif
579                        if(stringmatch(sva.ctrlName,"Spheroid_Radius"))         //update model..
580                                IR3J_CalculateModel()
581                        endif
582                        if(stringmatch(sva.ctrlName,"Corr1DZmax") || stringmatch(sva.ctrlName,"Corr1DWavelength") )             //update model..
583                                IR3J_Calculate1DCorrelation()
584                        endif
585
586
587                        break
588                       
589
590                case 3: // live update
591                        break
592                case -1: // control being killed
593                        break
594        endswitch
595
596        return 0
597End
598
599//**************************************************************************************
600//**************************************************************************************
601Function IR3J_CopyAndAppendData(FolderNameStr)
602        string FolderNameStr
603       
604        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
605        DFref oldDf= GetDataFolderDFR()
606        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
607                SVAR DataStartFolder=root:Packages:Irena:SimpleFits:DataStartFolder
608                SVAR DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
609                SVAR IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
610                SVAR QWavename=root:Packages:Irena:SimpleFits:QWavename
611                SVAR ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
612                SVAR dQWavename=root:Packages:Irena:SimpleFits:dQWavename
613                NVAR UseIndra2Data=root:Packages:Irena:SimpleFits:UseIndra2Data
614                NVAR UseQRSdata=root:Packages:Irena:SimpleFits:UseQRSdata
615                NVAR UseSMRData = root:Packages:Irena:SimpleFits:UseSMRData
616                NVAR SlitLength = root:Packages:Irena:SimpleFits:SlitLength
617                //these are variables used by the control procedure
618                NVAR  UseResults=  root:Packages:Irena:SimpleFits:UseResults
619                NVAR  UseUserDefinedData=  root:Packages:Irena:SimpleFits:UseUserDefinedData
620                NVAR  UseModelData = root:Packages:Irena:SimpleFits:UseModelData
621                SVAR DataFolderName  = root:Packages:Irena:SimpleFits:DataFolderName
622                SVAR IntensityWaveName = root:Packages:Irena:SimpleFits:IntensityWaveName
623                SVAR QWavename = root:Packages:Irena:SimpleFits:QWavename
624                SVAR ErrorWaveName = root:Packages:Irena:SimpleFits:ErrorWaveName
625                UseUserDefinedData = 0
626                UseModelData = 0
627                //get the names of waves, assume this tool actually works. May not under some conditions. In that case this tool will not work.
628                IR3C_SelectWaveNamesData("Irena:SimpleFits", FolderNameStr)                     //this routine will preset names in strings as needed,         
629                Wave/Z SourceIntWv=$(DataFolderName+possiblyQUoteName(IntensityWaveName))
630                Wave/Z SourceQWv=$(DataFolderName+possiblyQUoteName(QWavename))
631                Wave/Z SourceErrorWv=$(DataFolderName+possiblyQUoteName(ErrorWaveName))
632                Wave/Z SourcedQWv=$(DataFolderName+possiblyQUoteName(dQWavename))
633                if(!WaveExists(SourceIntWv) &&  !WaveExists(SourceQWv) && UseIndra2Data)                //may be we heve M_... data here?
634                        Wave/Z SourceIntWv=$(DataFolderName+possiblyQUoteName("M_"+IntensityWaveName))
635                        Wave/Z SourceQWv=$(DataFolderName+possiblyQUoteName("M_"+QWavename))
636                        Wave/Z SourceErrorWv=$(DataFolderName+possiblyQUoteName("M_"+ErrorWaveName))
637                        Wave/Z SourcedQWv=$(DataFolderName+possiblyQUoteName("M_"+dQWavename))
638                endif
639                if(!WaveExists(SourceIntWv)||   !WaveExists(SourceQWv))//||!WaveExists(SourceErrorWv))
640                        Abort "Data selection failed for Data in Simple/basic fits routine IR3J_CopyAndAppendData"
641                endif
642                Duplicate/O SourceIntWv, OriginalDataIntWave
643                Duplicate/O SourceQWv, OriginalDataQWave
644                if(WaveExists(SourceErrorWv))
645                        Duplicate/O SourceErrorWv, OriginalDataErrorWave
646                else
647                        Duplicate/O SourceIntWv, OriginalDataErrorWave
648                        OriginalDataErrorWave = 0
649                endif
650                if(WaveExists(SourcedQWv))
651                        Duplicate/O SourcedQWv, OriginalDatadQWave
652                else
653                        dQWavename=""
654                endif
655                //support slit smeared data for USAXS
656                UseSMRData = 0
657                if(UseIndra2Data)
658                        if(StringMatch(IntensityWaveName, "*SMR_Int" ))
659                                UseSMRData = 1
660                                SlitLength = NumberByKey("SlitLength", note(OriginalDataIntWave), "=",";")
661                        endif
662                endif
663                //done slit smeared support.   
664                IR3J_CreateCheckGraphs()
665                //clear obsolete data:
666                Wave/Z NormRes1=root:Packages:Irena:SimpleFits:NormalizedResidualLinLin
667                Wave/Z NormRes2=root:Packages:Irena:SimpleFits:NormalizedResidualLogLog
668                if(WaveExists(NormRes1))
669                        NormRes1=0
670                endif
671                if(WaveExists(NormRes2))
672                        NormRes2=0
673                endif
674                //done cleaning...
675                DoWIndow IR3J_LogLogDataDisplay
676                if(V_Flag)
677                        RemoveFromGraph /W=IR3J_LogLogDataDisplay /Z NormalizedResidualLogLog
678                        DoWIndow/F IR3J_LogLogDataDisplay
679                endif
680                DoWIndow IR3J_LinDataDisplay
681                if(V_Flag)
682                        RemoveFromGraph /W=IR3J_LinDataDisplay /Z NormalizedResidualLinLin
683                        DoWIndow/F IR3J_LinDataDisplay
684                endif
685                pauseUpdate
686                IR3J_AppendDataToGraphLogLog()
687                //now this deals with linearized data, if needed...
688                IR3J_CreateLinearizedData()
689                IR3J_AppendDataToGraphModel()
690                SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
691                IR3J_RecalculateIfAppropriate()
692                DoUpdate
693                print "Added Data from folder : "+DataFolderName
694        SetDataFolder oldDf
695end
696//**********************************************************************************************************
697//**********************************************************************************************************
698//**********************************************************************************************************
699Function IR3J_CreateLinearizedData()
700
701        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
702        DFref oldDf= GetDataFolderDFR()
703
704        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
705        Wave OriginalDataIntWave=root:Packages:Irena:SimpleFits:OriginalDataIntWave
706        Wave OriginalDataQWave=root:Packages:Irena:SimpleFits:OriginalDataQWave
707        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
708        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
709        Duplicate/O OriginalDataIntWave, LinModelDataIntWave   
710        Duplicate/O OriginalDataQWave, LinModelDataQWave
711        Duplicate/O OriginalDataErrorWave, LinModelDataEWave
712       
713        strswitch(SimpleModel)                          // string switch
714                case "Guinier":                                         // execute if case matches expression
715                        LinModelDataIntWave = ln(OriginalDataIntWave)
716                        LinModelDataEWave = OriginalDataErrorWave/OriginalDataIntWave                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
717                        LinModelDataQWave = OriginalDataQWave^2
718                        break                                                           // exit from switch
719                case "Guinier Rod":                             // execute if case matches expression
720                        LinModelDataIntWave = ln(OriginalDataIntWave*LinModelDataQWave)
721                        LinModelDataEWave = OriginalDataErrorWave/OriginalDataIntWave                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
722                        LinModelDataQWave = OriginalDataQWave^2
723                        break
724                case "Guinier Sheet":                           // execute if case matches expression
725                        LinModelDataIntWave = ln(OriginalDataIntWave*LinModelDataQWave^2)
726                        LinModelDataEWave = OriginalDataErrorWave/OriginalDataIntWave                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
727                        LinModelDataQWave = OriginalDataQWave^2
728                        break
729                case "Porod":                           // execute if case matches expression
730                        LinModelDataIntWave = OriginalDataIntWave*OriginalDataQWave^4
731                        LinModelDataEWave = OriginalDataErrorWave*OriginalDataQWave^4                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
732                        LinModelDataQWave = OriginalDataQWave^4
733                        break
734                default:                                                        // optional default expression executed
735                        //no linearization graphs needed for "Sphere", "Spheroid",...
736                        KillWaves/Z LinModelDataIntWave, LinModelDataEWave, LinModelDataQWave                   // when no case matches
737        endswitch
738        SetDataFolder oldDf
739end
740
741//**********************************************************************************************************
742//**********************************************************************************************************
743//**********************************************************************************************************
744
745
746
747Function IR3J_AppendDataToGraphModel()
748        //this deals with lin-lin model.
749        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
750        IR3J_CreateCheckGraphs()
751        variable WhichLegend=0
752        variable startQp, endQp, tmpStQ
753
754        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
755        SVAR DataFolderName = root:Packages:Irena:SimpleFits:DataFolderName
756        if(StringMatch(SimpleModel,"Guinier*") || StringMatch(SimpleModel,"Porod*"))           
757                Wave LinModelDataIntWave=root:Packages:Irena:SimpleFits:LinModelDataIntWave
758                Wave LinModelDataQWave=root:Packages:Irena:SimpleFits:LinModelDataQWave
759                Wave LinModelDataEWave=root:Packages:Irena:SimpleFits:LinModelDataEWave
760                CheckDisplayed /W=IR3J_LinDataDisplay LinModelDataIntWave
761                if(!V_flag)
762                        AppendToGraph /W=IR3J_LinDataDisplay  LinModelDataIntWave  vs LinModelDataQWave
763                        ErrorBars /W=IR3J_LinDataDisplay LinModelDataIntWave Y,wave=(LinModelDataEWave,LinModelDataEWave)               
764                endif
765                Legend/C/W=IR3J_LinDataDisplay/N=text0/F=0/A=RT "\\s(LinModelDataIntWave)"+DataFolderName
766                NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
767                NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
768                NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
769                NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
770                SetWindow IR3J_LinDataDisplay, hook(SimpleFitsLinCursorMoved) = $""
771                cursor /W=IR3J_LinDataDisplay B, LinModelDataIntWave, DataQEndPoint
772                cursor /W=IR3J_LinDataDisplay A, LinModelDataIntWave, DataQstartPoint
773                SetWindow IR3J_LinDataDisplay, hook(SimpleFitsLinCursorMoved) = IR3J_GraphWindowHook
774                SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
775                strswitch(SimpleModel)  // string switch
776                        case "Guinier":                 // execute if case matches expression
777                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
778                                        ModifyGraph /W=IR3J_LinDataDisplay  mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
779                                        SetAxis/A/W=IR3J_LinDataDisplay
780                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Intensity)"
781                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
782                                break           // exit from switch
783                        case "Guinier rod":                     // execute if case matches expression
784                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
785                                        ModifyGraph /W=IR3J_LinDataDisplay  mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
786                                        SetAxis/A/W=IR3J_LinDataDisplay
787                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Q*Intensity)"
788                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
789                                break           // exit from switch
790                        case "Guinier sheet":                   // execute if case matches expression
791                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
792                                        ModifyGraph /W=IR3J_LinDataDisplay  mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
793                                        SetAxis/A/W=IR3J_LinDataDisplay
794                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"*Intensity)"
795                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
796                                break           // exit from switch
797                        case "Porod":   // execute if case matches expression
798                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
799                                        ModifyGraph /W=IR3J_LinDataDisplay mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
800                                        SetAxis/A/W=IR3J_LinDataDisplay
801                                        SetAxis/W=IR3J_LinDataDisplay left 0,*
802                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Int * Q\\S4"
803                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S4\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-4\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
804                                break
805                        default:                        // optional default expression executed
806                                //<code>]               // when no case matches
807                endswitch
808                //and set limtis on axis
809                variable tempMaxQ
810                tempMaxQ = LinModelDataQWave[DataQEndPoint]
811                SetAxis/W=IR3J_LinDataDisplay bottom 0,tempMaxQ*SimpleFitsLinPlotMaxScale
812                variable tempMaxQY, tempMinQY, maxY, minY
813                tempMaxQY = LinModelDataIntWave[DataQstartPoint]
814                tempMinQY = LinModelDataIntWave[DataQEndPoint]
815                maxY = max(tempMaxQY, tempMinQY)
816                minY = min(tempMaxQY, tempMinQY)
817                if(maxY>0)
818                        maxY*=SimpleFitsLinPlotMaxScale
819                else
820                        maxY*=SimpleFitsLinPlotMinScale
821                endif
822                if(minY>0)
823                        minY*=SimpleFitsLinPlotMinScale
824                else
825                        minY*=SimpleFitsLinPlotMaxScale
826                endif
827                SetAxis/W=IR3J_LinDataDisplay left minY, maxY
828        elseif(StringMatch(SimpleModel,"1DCorrelation"))       
829                //      IR3J_LinDataDisplay will be used to display results
830               
831        else
832                KillWindow/Z IR3J_LinDataDisplay
833        endif
834end
835//**********************************************************************************************************
836//**********************************************************************************************************
837//**********************************************************************************************************
838
839
840Function IR3J_AppendDataToGraphLogLog()
841       
842        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
843        IR3J_CreateCheckGraphs()
844        variable WhichLegend=0
845        Wave OriginalDataIntWave=root:Packages:Irena:SimpleFits:OriginalDataIntWave
846        Wave OriginalDataQWave=root:Packages:Irena:SimpleFits:OriginalDataQWave
847        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
848        SVAR DataFolderName = root:Packages:Irena:SimpleFits:DataFolderName
849        CheckDisplayed /W=IR3J_LogLogDataDisplay OriginalDataIntWave
850        if(!V_flag)
851                AppendToGraph /W=IR3J_LogLogDataDisplay  OriginalDataIntWave  vs OriginalDataQWave
852                ModifyGraph /W=IR3J_LogLogDataDisplay log=1, mirror(bottom)=1
853                Label /W=IR3J_LogLogDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Intensity"
854                Label /W=IR3J_LogLogDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q[A\\S-1\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
855                ErrorBars /W=IR3J_LogLogDataDisplay OriginalDataIntWave Y,wave=(OriginalDataErrorWave,OriginalDataErrorWave)           
856        endif
857        RemoveFromGraph/Z/W=IR3J_LogLogDataDisplay IntegrantInt, InvBckgWave, InvariantIntWaveCorr
858        Legend/C/W=IR3J_LogLogDataDisplay/N=text0/F=0/A=RT "\\s(OriginalDataIntWave)"+DataFolderName
859        ModifyGraph /W=IR3J_LogLogDataDisplay mirror=1
860        // for "Size Distribution" use linear left axis. 
861        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
862        if(StringMatch(SimpleModel, "*size distribution"))
863                ModifyGraph /W=IR3J_LogLogDataDisplay log(left)=0, mirror=1
864        endif
865        //this is from Invariant and needs to be removed if it exists..
866        Wave/Z InvBckgWaveModel = root:Packages:Irena:SimpleFits:InvBckgWaveModel
867        if(WaveExists(InvBckgWaveModel))        //this is used to show how Porod and Powerlaw fit...
868                RemoveFromGraph /W=IR3J_LogLogDataDisplay /Z InvBckgWaveModel
869                KillWaves/Z InvBckgWaveModel, QWaveModel       
870        endif
871       
872        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
873        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
874        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
875        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
876        if(DataQstart>0)                        //old Q min already set.
877                DataQstartPoint = BinarySearch(OriginalDataQWave, DataQstart)
878        endif
879        if(DataQstartPoint<1)   //Qmin not set or not found. Set to point 2 on that wave.
880                DataQstart = OriginalDataQWave[1]
881                DataQstartPoint = 1
882        endif
883        if(DataQEnd>0)                  //old Q max already set.
884                DataQEndPoint = BinarySearch(OriginalDataQWave, DataQEnd)
885        endif
886        if(DataQEndPoint<1)     //Qmax not set or not found. Set to last point-1 on that wave.
887                DataQEnd = OriginalDataQWave[numpnts(OriginalDataQWave)-2]
888                DataQEndPoint = numpnts(OriginalDataQWave)-2
889        endif
890        SetWindow IR3J_LogLogDataDisplay, hook(SimpleFitsLogCursorMoved) = $""
891        cursor /W=IR3J_LogLogDataDisplay B, OriginalDataIntWave, DataQEndPoint
892        cursor /W=IR3J_LogLogDataDisplay A, OriginalDataIntWave, DataQstartPoint
893        SetWindow IR3J_LogLogDataDisplay, hook(SimpleFitsLogCursorMoved) = IR3J_GraphWindowHook
894
895        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
896        if(StringMatch(SimpleModel, "Invariant" ))
897                IR3J_InvInitializeBackground()                  //init background and add CD cursors in graph
898        else
899                SetWindow IR3J_LogLogDataDisplay, hook(InvariantBackgroundHook) = $""
900        endif   
901       
902end
903//**********************************************************************************************************
904//**********************************************************************************************************
905//**********************************************************************************************************
906//**********************************************************************************************************
907//**********************************************************************************************************
908//**********************************************************************************************************
909
910Function IR3J_ButtonProc(ba) : ButtonControl
911        STRUCT WMButtonAction &ba
912
913        switch( ba.eventCode )
914                case 2: // mouse up
915                        // click code here
916                        if(stringmatch(ba.ctrlName,"FitCurrentDataSet"))
917                                IR3J_FitData()
918                        endif
919                        if(stringmatch(ba.ctrlName,"RecordCurrentresults"))
920                                NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
921                                NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
922                                NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
923                                if(SaveToNotebook+SaveToWaves+SaveToFolder<1)
924                                        Abort "Nothing is selected to Record, check at least on checkbox above"
925                                endif   
926                                IR3J_SaveResultsToNotebook()
927                                IR3J_SaveResultsToWaves()
928                                //IR3J_CleanUnusedParamWaves()
929                                IR3J_SaveResultsToFolder()
930                        endif
931                        if(stringmatch(ba.ctrlName,"FitSelectionDataSet"))
932                                IR3J_FitSequenceOfData()
933                        endif
934                        if(stringmatch(ba.ctrlName,"GetTableWithResults"))
935                                IR3J_GetTableWithresults()     
936                        endif
937                        if(stringmatch(ba.ctrlName,"DeleteOldResults"))
938                                IR3J_DeleteExistingModelResults()       
939                        endif
940                        if(stringmatch(ba.ctrlName,"GetNotebookWithResults"))
941                                IR1_CreateResultsNbk()
942                        endif
943                        if(stringmatch(ba.ctrlName,"SelectAll"))
944                                Wave/Z SelectionOfAvailableData = root:Packages:Irena:SimpleFits:SelectionOfAvailableData
945                                if(WaveExists(SelectionOfAvailableData))
946                                        SelectionOfAvailableData=1
947                                endif
948                        endif
949
950                        if(stringmatch(ba.ctrlName,"GetHelp"))
951                                IN2G_OpenWebManual("Irena/SimpleFits.html#simple-fits")                         //fix me!!                     
952                        endif
953
954                       
955                        break
956                case -1: // control being killed
957                        break
958        endswitch
959
960        return 0
961End
962
963
964//      Display /W=(521,10,1183,340) /HOST=# /N=LogLogDataDisplay
965//      SetActiveSubwindow ##
966//      Display /W=(521,420,1183,750) /HOST=# /N=LinearizedDataDisplay
967//      SetActiveSubwindow ##
968//**********************************************************************************************************
969static Function IR3J_CleanUnusedParamWaves()
970
971        Wave/Z TimeWave
972        if(sum(TimeWave)<=0 || numtype(sum(TimeWave))!=0)
973                KillWaves/Z  TimeWave
974        endif
975        Wave/Z TemperatureWave
976        if(sum(TemperatureWave)<=0 || numtype(sum(TemperatureWave))!=0)
977                KillWaves/Z  TemperatureWave
978        endif
979        Wave/Z PercentWave
980        if(sum(PercentWave)<=0|| numtype(sum(PercentWave))!=0)
981                KillWaves/Z  PercentWave
982        endif
983        Wave/Z OrderWave
984        if(sum(OrderWave)<=0|| numtype(sum(OrderWave))!=0)
985                KillWaves/Z  OrderWave
986        endif
987
988end
989//
990////**********************************************************************************************************
991//**********************************************************************************************************
992
993static Function IR3J_FitData()
994
995        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
996        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
997        strswitch(SimpleModel)  // string switch
998                case "Guinier":                         // Regular Guinier, aka: Sphere, globular.
999                        IR3J_FitGuinier("Sphere")
1000                        IR3J_CalculateModel()           
1001                        break                   
1002                case "Guinier Rod":             // Guinier for rod
1003                        IR3J_FitGuinier("Rod")
1004                        IR3J_CalculateModel()           
1005                        break                   
1006                case "Guinier Sheet":           // Guinier for sheet
1007                        IR3J_FitGuinier("Sheet")
1008                        IR3J_CalculateModel()           
1009                        break           
1010                case "Porod":                           // Porod
1011                        IR3J_FitPorod()
1012                        IR3J_CalculateModel()           
1013                        break
1014                case "Sphere":                          // Sphere
1015                        IR3J_FitSphere()
1016                        IR3J_CalculateModel()           
1017                        break
1018                case "Spheroid":                        // Spheroid
1019                        IR3J_FitSpheroid()
1020                        IR3J_CalculateModel()           
1021                        break
1022                case "Invariant":                       // Invariant
1023                        IR3J_InvFitBackground()
1024                        IR3J_CalculateInvariant()       
1025                        break
1026                case "1DCorrelation":                   // 1DCorrelation
1027                        IR3J_Calculate1DCorrelation()           
1028                        break
1029//              case "Number Size Distribution":                        // Spheroid
1030//                      IR3J_FitSizeDistribution("Number")
1031//                      //IR3J_CalculateModel()         
1032//                      break
1033                default:                       
1034                //nothing here.
1035                Abort "No model calculated in static IR3J_FitData()"
1036        endswitch
1037
1038end
1039
1040//**********************************************************************************************************
1041//**********************************************************************************************************
1042//**********************************************************************************************************
1043
1044static Function IR3J_FitSequenceOfData()
1045
1046                //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1047                //warn user if not saving results...
1048                NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
1049                NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
1050                NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
1051                NVAR DelayBetweenProcessing=root:Packages:Irena:SimpleFits:DelayBetweenProcessing
1052                if(SaveToNotebook+SaveToWaves+SaveToFolder<1)
1053                        DoAlert /T="Results not being saved anywhere" 1, "Results of the fits are not being saved anywhere. Do you want to continue (Yes) or abort (No)?"
1054                        if(V_Flag==2)
1055                                abort
1056                        endif
1057                endif   
1058                if(SaveToFolder)
1059                        print "Fit results will be saved in original fits as Intensity and Q vector"
1060                endif
1061                if(SaveToWaves)
1062                        print "Fit results will be saved in waves to create a table"
1063                endif
1064                if(SaveToNotebook)
1065                        print "Fit results will be saved in notebook"
1066                endif
1067                Wave SelectionOfAvailableData = root:Packages:Irena:SimpleFits:SelectionOfAvailableData
1068                Wave/T ListOfAvailableData = root:Packages:Irena:SimpleFits:ListOfAvailableData
1069                variable i, imax
1070                imax = numpnts(ListOfAvailableData)
1071                For(i=0;i<imax;i+=1)
1072                        if(SelectionOfAvailableData[i]>0.5)             //data set selected
1073                                IR3J_CopyAndAppendData(ListOfAvailableData[i])
1074                                IR3J_FitData()
1075                                IR3J_SaveResultsToNotebook()
1076                                IR3J_SaveResultsToWaves()
1077                                IR3J_SaveResultsToFolder()
1078                                DoUpdate
1079                                sleep/S/C=6/M="Fitted data for "+ListOfAvailableData[i] DelayBetweenProcessing
1080                        endif
1081                endfor
1082                //IR3J_CleanUnusedParamWaves()
1083                print "all selected data processed"
1084end
1085//**********************************************************************************************************
1086//**********************************************************************************************************
1087//**********************************************************************************************************
1088
1089Function IR3J_GraphWindowHook(s)
1090        STRUCT WMWinHookStruct &s
1091
1092        Variable hookResult = 0
1093        switch(s.eventCode)
1094                case 0:                         // Activate
1095                        // Handle activate
1096                        break
1097
1098                case 1:                         // Deactivate
1099                        // Handle deactivate
1100                        break
1101                case 7:                         //cursor moved
1102                        if(StringMatch(s.cursorName, "A")||StringMatch(s.cursorName, "B"))
1103                                IR3J_SyncCursorsTogether(s.traceName,s.cursorName,s.pointNumber)
1104                                IR3J_RecalculateIfAppropriate()
1105                        elseif(StringMatch(s.cursorName, "C")||StringMatch(s.cursorName, "D"))
1106                                //this resets Qmin and Qmax even when added through code and cursors moved due to
1107                                //code setting cursor to nearest point. There does not seem to be any way to catch this
1108                                //in both cases we get cursor moved event 7 and no other info
1109                                //the only thing which seems to be useful is, that mouse loc may be outside the graph... 
1110                                //still will fail, if user moves mouse inside the graph while running sequence. Not sur ehow to fix that.
1111                                GetWindow /Z IR3J_LogLogDataDisplay  gsize
1112                                //V_left, V_right, V_top, and V_bottom
1113                                if( s.mouseLoc.v>V_top && s.mouseLoc.v<(V_bottom-V_top) && s.mouseLoc.h>V_left && s.mouseLoc.h<(V_right-V_left))
1114                                        //print "fixed position"
1115                                        //print s.mouseLoc.v
1116                                        //print s.mouseLoc.h
1117                                        IR3J_InvSyncBckgCursors(1)
1118                                endif
1119                        endif
1120                        hookResult = 1
1121                // And so on . . .
1122        endswitch
1123
1124        return hookResult       // 0 if nothing done, else 1
1125End
1126
1127//**********************************************************************************************************
1128//**********************************************************************************************************
1129static Function IR3J_RecalculateIfAppropriate()
1130
1131        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
1132        if(StringMatch(SimpleModel, "1DCorrelation"))
1133                IR3J_Calculate1DCorrelation()
1134        elseif(StringMatch(SimpleModel, "Invariant" ))
1135                IR3J_InvInitializeBackground()
1136                IR3J_InvFitBackground()
1137        endif   
1138
1139end
1140//**********************************************************************************************************
1141//**********************************************************************************************************
1142
1143static Function IR3J_SyncCursorsTogether(traceName,CursorName,PointNumber)
1144        string traceName,CursorName
1145        variable PointNumber
1146
1147        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1148        IR3J_CreateCheckGraphs()
1149        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1150        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1151        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1152        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1153        Wave OriginalDataQWave=root:Packages:Irena:SimpleFits:OriginalDataQWave
1154        Wave/Z LinModelDataIntWave=root:Packages:Irena:SimpleFits:LinModelDataIntWave
1155        Wave OriginalDataIntWave=root:Packages:Irena:SimpleFits:OriginalDataIntWave
1156        Wave/Z LinModelDataQWave=root:Packages:Irena:SimpleFits:LinModelDataQWave
1157        variable tempMaxQ, tempMaxQY, tempMinQY, maxY, minY
1158        variable LinDataExist = 0
1159        DoWIndow IR3J_LinDataDisplay            //does linearization graph even exist???
1160        if(V_Flag)
1161                LinDataExist = 1
1162        endif
1163        //check if user removed cursor from graph, in which case do nothing for now...
1164        if(numtype(PointNumber)==0)
1165                if(stringmatch(CursorName,"A"))         //moved cursor A, which is start of Q range
1166                        DataQstartPoint = PointNumber
1167                        DataQstart = OriginalDataQWave[PointNumber]
1168                        //now move the cursor in the other graph...
1169                        if(StringMatch(traceName, "OriginalDataIntWave" ))
1170                                if(LinDataExist)
1171                                        checkDisplayed /W=IR3J_LinDataDisplay LinModelDataIntWave
1172                                        if(V_Flag)
1173                                                //GetAxis/W=IR3J_LinDataDisplay /Q left
1174                                                cursor /W=IR3J_LinDataDisplay A, LinModelDataIntWave, DataQstartPoint
1175                                                tempMaxQ = LinModelDataQWave[DataQEndPoint]
1176                                                tempMaxQY = LinModelDataIntWave[DataQstartPoint]
1177                                                tempMinQY = LinModelDataIntWave[DataQEndPoint]
1178                                                maxY = max(tempMaxQY, tempMinQY)
1179                                                minY = min(tempMaxQY, tempMinQY)
1180                                                if(maxY>0)
1181                                                        maxY*=SimpleFitsLinPlotMaxScale
1182                                                else
1183                                                        maxY*=SimpleFitsLinPlotMinScale
1184                                                endif
1185                                                if(minY>0)
1186                                                        minY*=SimpleFitsLinPlotMinScale
1187                                                else
1188                                                        minY*=SimpleFitsLinPlotMaxScale
1189                                                endif
1190                                                if(maxY>0)
1191                                                        maxY*=SimpleFitsLinPlotMaxScale
1192                                                else
1193                                                        maxY*=SimpleFitsLinPlotMinScale
1194                                                endif
1195                                                SetAxis /W=IR3J_LinDataDisplay left minY, maxY
1196                                                SetAxis/W=IR3J_LinDataDisplay bottom 0,tempMaxQ*SimpleFitsLinPlotMaxScale
1197                                        endif
1198                                endif
1199                        elseif(StringMatch(traceName, "LinModelDataIntWave" ))
1200                                checkDisplayed /W=IR3J_LogLogDataDisplay OriginalDataIntWave
1201                                if(V_Flag)
1202                                        cursor /W=IR3J_LogLogDataDisplay A, OriginalDataIntWave, DataQstartPoint
1203                                endif
1204                        endif
1205                endif
1206                if(stringmatch(CursorName,"B"))         //moved cursor B, which is end of Q range
1207                        DataQEndPoint = PointNumber
1208                        DataQEnd = OriginalDataQWave[PointNumber]
1209                        //now move the cursor in the other graph...
1210                        if(StringMatch(traceName, "OriginalDataIntWave" ))
1211                                if(LinDataExist)
1212                                        checkDisplayed /W=IR3J_LinDataDisplay LinModelDataIntWave
1213                                        if(V_Flag)
1214                                                cursor /W=IR3J_LinDataDisplay B, LinModelDataIntWave, DataQEndPoint
1215                                                tempMaxQ = LinModelDataQWave[DataQEndPoint]
1216                                                tempMaxQY = LinModelDataIntWave[DataQstartPoint]
1217                                                tempMinQY = LinModelDataIntWave[DataQEndPoint]
1218                                                maxY = max(tempMaxQY, tempMinQY)
1219                                                minY = min(tempMaxQY, tempMinQY)
1220                                                if(maxY>0)
1221                                                        maxY*=SimpleFitsLinPlotMaxScale
1222                                                else
1223                                                        maxY*=SimpleFitsLinPlotMinScale
1224                                                endif
1225                                                if(minY>0)
1226                                                        minY*=SimpleFitsLinPlotMinScale
1227                                                else
1228                                                        minY*=SimpleFitsLinPlotMaxScale
1229                                                endif
1230                                                SetAxis/W=IR3J_LinDataDisplay left minY, maxY
1231                                                GetAxis/W=IR3J_LinDataDisplay/Q bottom
1232                                                SetAxis/W=IR3J_LinDataDisplay bottom V_min, SimpleFitsLinPlotMaxScale*LinModelDataQWave[DataQEndPoint]
1233                                        endif
1234                                endif
1235                        elseif(StringMatch(traceName, "LinModelDataIntWave" ))
1236                                checkDisplayed /W=IR3J_LogLogDataDisplay OriginalDataIntWave
1237                                if(V_Flag)
1238                                        cursor /W=IR3J_LogLogDataDisplay B, OriginalDataIntWave, DataQEndPoint
1239                                endif
1240                        endif
1241                endif
1242        endif
1243end
1244//**********************************************************************************************************
1245//**********************************************************************************************************
1246//**********************************************************************************************************
1247
1248static Function IR3J_FitGuinier(which)
1249        string which                    //Sphere, Rod, Sheet
1250        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1251        IR3J_CreateCheckGraphs()
1252        DFref oldDf= GetDataFolderDFR()
1253        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1254        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1255        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1256        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1257        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1258        NVAR Guinier_I0 = root:Packages:Irena:SimpleFits:Guinier_I0
1259        NVAR Guinier_Rg=root:Packages:Irena:SimpleFits:Guinier_Rg
1260        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1261        NVAR UseSMRData =       root:Packages:Irena:SimpleFits:UseSMRData
1262
1263        Make/D/N=0/O W_coef, LocalEwave
1264        Make/D/T/N=0/O T_Constraints
1265        Wave/Z W_sigma
1266        Redimension /N=2 W_coef, LocalEwave
1267        Redimension/N=2 T_Constraints
1268        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1269        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1270        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1271                Abort "Daat do not exist or cursors are not properly set on same wave"
1272        endif
1273        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1274        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1275        //make a good starting guesses:
1276        Guinier_I0 = CursorAXWave[DataQstartPoint]
1277        Guinier_Rg = pi/(DataQEnd/2)
1278        W_coef[0]=Guinier_I0    //G
1279        W_coef[1]=Guinier_Rg            //Rg
1280        T_Constraints[0] = {"K0 > 0"}
1281        T_Constraints[1] = {"K1 > "+num2str(Guinier_Rg/10)}
1282        LocalEwave[0]=(Guinier_I0/50)
1283        LocalEwave[1]=(Guinier_Rg/50)
1284        variable QminFit, QmaxFit
1285        QminFit = CursorAXWave[DataQstartPoint]
1286        QmaxFit = CursorAXWave[DataQEndPoint]
1287        variable/g V_FitError
1288       
1289        V_FitError=0                    //This should prevent errors from being generated
1290        strswitch(which)                // string switch
1291                case "Sphere":          // execute if case matches expression   
1292                        if(UseSMRData)
1293                                FuncFit IR3J_FitGuinierSMR W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1 /E=LocalEwave
1294                        else
1295                                FuncFit IR1_GuinierFit W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1 /E=LocalEwave
1296                        endif
1297                        break                                   // exit from switch
1298                case "Rod":     // execute if case matches expression
1299                        if(UseSMRData)
1300                                FuncFit IR3J_FitGuinierRodSMR W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1 /E=LocalEwave
1301                        else
1302                                FuncFit IR1_GuinierRodFit W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1 /E=LocalEwave
1303                        endif
1304                        break
1305                case "Sheet":   // execute if case matches expression
1306                        if(UseSMRData)
1307                                FuncFit IR3J_FitGuinierSheetSMR W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1 /E=LocalEwave
1308                        else
1309                                FuncFit IR1_GuinierSheetFit W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1 /E=LocalEwave
1310                        endif
1311                        break
1312                default:                        // optional default expression executed
1313                        abort
1314        endswitch
1315        if (V_FitError!=0)      //there was error in fitting
1316                RemoveFromGraph/W=IR3J_LogLogDataDisplay /Z $("fit_"+NameOfWave(CursorAWave))
1317                beep
1318                Abort "Fitting error, check starting parameters and fitting limits"
1319        endif
1320        Wave W_sigma
1321        W_coef =  abs(W_coef)
1322        string TagText, TagTextLin
1323        AchievedChiSquare = V_chisq/(DataQEndPoint-DataQstartPoint)
1324        string QminRg, QmaxRg, AchiCHiStr
1325        sprintf QminRg, "%2.2f",(W_coef[1]*QminFit)
1326        sprintf QmaxRg, "%2.2f",(W_coef[1]*QmaxFit)
1327        sprintf AchiCHiStr, "%2.2f",(AchievedChiSquare)
1328        strswitch(which)                // string switch
1329                case "Sphere":          // execute if case matches expression
1330                        TagText = "Fited Guinier : I(Q) = I(0)*exp(-q\\S2\\M*Rg\\S2\\M/3)\rI(0) = "+num2str(W_coef[0])+"\tRg = "+num2str(W_coef[1])
1331                        TagText+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1332                        TagText+="\rχ\\S2\\M  = "+AchiCHiStr
1333                        TagTextLin = "I(0) = "+num2str(W_coef[0])+"\tRg = "+num2str(W_coef[1])
1334                        TagTextLin+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1335                        TagTextLin +="\rχ\\S2\\M  = "+AchiCHiStr
1336                        break                                   // exit from switch
1337                case "Rod":     // execute if case matches expression
1338//                      TagText = "Fitted Guinier  "+"Int*Q = G*exp(-q^2*Rg^2/2))"+" \r G = "+num2str(W_coef[0])+"\r Rc = "+num2str(W_coef[1])
1339//                      TagText+="\rchi-square = "+num2str(V_chisq)
1340                        TagText = "Fited Guinier : I(Q)*Q = I(0)*exp(-q\\S2\\M*Rg\\S2\\M/2)\rI(0) = "+num2str(W_coef[0])+";   Rc = "+num2str(W_coef[1])
1341                        TagText+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1342                        TagText+="\rχ\\S2\\M  = "+AchiCHiStr
1343                        TagTextLin = "I(0) = "+num2str(W_coef[0])+"\t\tRc = "+num2str(W_coef[1])
1344                        TagTextLin+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1345                        TagTextLin +="\rχ\\S2\\M  = "+AchiCHiStr
1346                        break
1347                case "Sheet":   // execute if case matches expression
1348//                      TagText = "Fitted Guinier  "+"Int*Q^2 = G*exp(-q^2*Rg^2))"+" \r G = "+num2str(W_coef[0])+"\r Rg = "+num2str(W_coef[1])
1349//                      TagText+="\r Thickness = "+num2str(W_coef[1]*sqrt(12))
1350//                      TagText+="\r chi-square = "+num2str(V_chisq)
1351                        TagText = "Fited Guinier : I(Q)*Q\S2\M = I(0)*exp(-q\\S2\\M*Rg\\S2\\M)\rI(0) = "+num2str(W_coef[0])+"\tRg = "+num2str(W_coef[1])
1352                        TagText+="\rThickness = "+num2str(W_coef[1]*sqrt(12))
1353                        TagText+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1354                        TagText+="\rχ\\S2\\M  = "+AchiCHiStr
1355                        TagTextLin = "I(0) = "+num2str(W_coef[0])+"\tRg = "+num2str(W_coef[1])
1356                        TagTextLin+="\rThickness = "+num2str(W_coef[1]*sqrt(12))
1357                        TagTextLin+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1358                        TagTextLin +="\rχ\\S2\\M  = "+AchiCHiStr
1359                        break
1360                default:                        // optional default expression executed
1361                        abort
1362        endswitch
1363        string TagName= "GuinierFit" //UniqueName("GuinierFit",14,0,"IR3J_LogLogDataDisplay")
1364        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1365       
1366        DoWindow IR3J_LinDataDisplay
1367        if(V_Flag)
1368                Wave/Z CursorAWaveLin = CsrWaveRef(A, "IR3J_LinDataDisplay")   
1369                Tag/C/W=IR3J_LinDataDisplay/N=$(TagName)/L=2/X=15.00/Y=15.00  $NameOfWave(CursorAWaveLin), ((DataQstartPoint + DataQEndPoint)/2),TagTextLin     
1370        endif
1371       
1372        Guinier_I0=W_coef[0]    //G
1373        Guinier_Rg=W_coef[1]    //Rg
1374
1375        SetDataFolder oldDf
1376
1377end
1378
1379
1380//**********************************************************************************************************
1381//**********************************************************************************************************
1382Function IR1_GuinierRodFit(w,q) : FitFunc
1383        Wave w
1384        Variable q
1385
1386        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1387        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1388        //CurveFitDialog/ Equation:
1389        //CurveFitDialog/ Prefactor=abs(Prefactor)
1390        //CurveFitDialog/ Rg=abs(Rg)
1391        //CurveFitDialog/ f(q) = Prefactor*exp(-q^2*Rg^2/3))
1392        //CurveFitDialog/ End of Equation
1393        //CurveFitDialog/ Independent Variables 1
1394        //CurveFitDialog/ q
1395        //CurveFitDialog/ Coefficients 2
1396        //CurveFitDialog/ w[0] = Prefactor
1397        //CurveFitDialog/ w[1] = Rg
1398
1399        w[0]=abs(w[0])
1400        w[1]=abs(w[1])
1401        return w[0]*exp(-q^2 * w[1]^2/2)/q
1402End
1403//**********************************************************************************************************
1404Function IR1_GuinierSheetFit(w,q) : FitFunc
1405        Wave w
1406        Variable q
1407
1408        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1409        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1410        //CurveFitDialog/ Equation:
1411        //CurveFitDialog/ Prefactor=abs(Prefactor)
1412        //CurveFitDialog/ Rg=abs(Rg)
1413        //CurveFitDialog/ f(q) = Prefactor*exp(-q^2*Rg^2/3))
1414        //CurveFitDialog/ End of Equation
1415        //CurveFitDialog/ Independent Variables 1
1416        //CurveFitDialog/ q
1417        //CurveFitDialog/ Coefficients 2
1418        //CurveFitDialog/ w[0] = Prefactor
1419        //CurveFitDialog/ w[1] = Rg
1420
1421        w[0]=abs(w[0])
1422        w[1]=abs(w[1])
1423        return w[0]/(q*q) * exp(-q^2*w[1]^2)
1424End
1425//*****************************************************************************************************************
1426Function IR3J_Gauss1D(w,q) : FitFunc
1427        Wave w
1428        Variable q
1429
1430        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1431        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1432        //CurveFitDialog/ Equation:
1433        //CurveFitDialog/ f(q) = (A / (sigma*sqrt(2*pi)) * exp((-1/2)*((q-q0)/sigma)^2)+y0
1434        //CurveFitDialog/ End of Equation
1435        //CurveFitDialog/ Independent Variables 1
1436        //CurveFitDialog/ q
1437        //CurveFitDialog/ Coefficients 4
1438        //CurveFitDialog/ w[0] = A
1439        //CurveFitDialog/ w[1] = q0
1440        //CurveFitDialog/ w[2] = sigma
1441        //CurveFitDialog/ w[3] = y0
1442
1443        return w[0]/(w[2]*sqrt(2*pi))*exp((-1/2)*((q-w[1])/w[2])^2) + w[3]
1444End
1445//*****************************************************************************************************************
1446Function IR3J_FitPorodSMR(w,yw,xw) : FitFunc
1447        Wave w,yw,xw
1448        NVAR SlitLength  =      root:Packages:Irena:SimpleFits:SlitLength
1449        duplicate/free yw, ywSM
1450        yw = PorodInLogLog(w,xw[p])
1451        IR1B_SmearData(yw, xw, SlitLength, ywSM)
1452        yw=ywSM
1453End
1454
1455//*****************************************************************************************************************
1456Function IR3J_FitGuinierSMR(w,yw,xw) : FitFunc
1457        Wave w,yw,xw
1458        NVAR SlitLength  =      root:Packages:Irena:SimpleFits:SlitLength
1459        duplicate/free yw, ywSM
1460        yw = IR1_GuinierFit(w,xw[p])
1461        IR1B_SmearData(yw, xw, SlitLength, ywSM)
1462        yw=ywSM
1463End
1464
1465//*****************************************************************************************************************
1466Function IR3J_FitGuinierRodSMR(w,yw,xw) : FitFunc
1467        Wave w,yw,xw
1468        NVAR SlitLength  =      root:Packages:Irena:SimpleFits:SlitLength
1469        duplicate/free yw, ywSM
1470        yw = IR1_GuinierRodFit(w,xw[p])
1471        IR1B_SmearData(yw, xw, SlitLength, ywSM)
1472        yw=ywSM
1473End
1474
1475//*****************************************************************************************************************
1476Function IR3J_FitGuinierSheetSMR(w,yw,xw) : FitFunc
1477        Wave w,yw,xw
1478        NVAR SlitLength  =      root:Packages:Irena:SimpleFits:SlitLength
1479        duplicate/free yw, ywSM
1480        yw = IR1_GuinierSheetFit(w,xw[p])
1481        IR1B_SmearData(yw, xw, SlitLength, ywSM)
1482        yw=ywSM
1483End
1484
1485//*****************************************************************************************************************
1486Function IR3J_Porod_Ruland(w,q) : FitFunc
1487        Wave w
1488        Variable q
1489
1490        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1491        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1492        //CurveFitDialog/ Equation:
1493        //CurveFitDialog/ f(q) = A*exp(B*q^2)+y0
1494        //CurveFitDialog/ End of Equation
1495        //CurveFitDialog/ Independent Variables 1
1496        //CurveFitDialog/ q
1497        //CurveFitDialog/ Coefficients 3
1498        //CurveFitDialog/ w[0] = A
1499        //CurveFitDialog/ w[1] = B
1500        //CurveFitDialog/ w[2] = y0
1501
1502        return w[0]*exp(w[1]*q^2)+w[2]
1503End
1504
1505
1506//**********************************************************************************************************
1507//**********************************************************************************************************
1508
1509static Function IR3J_FitPorod()
1510       
1511        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1512        IR3J_CreateCheckGraphs()
1513        DFref oldDf= GetDataFolderDFR()
1514        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1515        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1516        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1517        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1518        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1519        NVAR Porod_Constant = root:Packages:Irena:SimpleFits:Porod_Constant
1520        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1521        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1522        NVAR UseSMRData                                 =       root:Packages:Irena:SimpleFits:UseSMRData
1523        NVAR SlitLength                                 =       root:Packages:Irena:SimpleFits:SlitLength
1524        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1525        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1526        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1527        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1528        Make/D/N=0/O W_coef, LocalEwave
1529        Make/D/T/N=0/O T_Constraints
1530        Wave/Z W_sigma
1531        Redimension /N=2 W_coef, LocalEwave
1532        Redimension/N=1 T_Constraints
1533        T_Constraints[0] = {"K1 > 0"}
1534        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1535                Abort "Cursors are not properly set on same wave"
1536        endif
1537        //make a good starting guesses:
1538        if(UseSMRData)
1539                Porod_Constant=CursorAWave[DataQstartPoint]/(CursorAXWave[DataQstartPoint]^(-3))
1540        else
1541                Porod_Constant=CursorAWave[DataQstartPoint]/(CursorAXWave[DataQstartPoint]^(-4))
1542        endif
1543        DataBackground=CursorAwave[DataQEndPoint]
1544        W_coef = {Porod_Constant,DataBackground}
1545        LocalEwave[0]=(Porod_Constant/20)
1546        LocalEwave[1]=(DataBackground/20)
1547
1548        variable/g V_FitError=0                 //This should prevent errors from being generated
1549        if(UseSMRData)
1550                FuncFit IR3J_FitPorodSMR W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1551        else
1552                FuncFit PorodInLogLog W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1553        endif
1554        if (V_FitError==0)      // fitting was fine...
1555                Wave W_sigma
1556                AchievedChiSquare = V_chisq/(DataQEndPoint-DataQstartPoint)
1557                string QminRg, QmaxRg, AchiCHiStr
1558                sprintf AchiCHiStr, "%2.2f",(AchievedChiSquare)
1559                string TagText
1560                TagText = "Fitted Porod  "+"I(Q) = P\BC\M * Q\S-4\M + background"+" \r P\BC\M = "+num2str(W_coef[0])+"\r Background = "+num2str(W_coef[1])
1561                TagText +="\rχ\\S2\\M  = "+AchiCHiStr
1562                string TagName= "PorodFit"
1563                Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1564                Porod_Constant=W_coef[0]        //PC
1565                DataBackground=W_coef[1]                //Background
1566        else
1567                RemoveFromGraph/Z $("fit_"+NameOfWave(CursorAWave))
1568                beep
1569                Print "Fitting error, check starting parameters and fitting limits"
1570                Porod_Constant=0        //PC
1571                DataBackground=0        //Background
1572                AchievedChiSquare = 0
1573        endif
1574        SetDataFolder oldDf
1575end
1576
1577
1578
1579//**********************************************************************************************************
1580//**********************************************************************************************************
1581
1582Function IR3J_FitSizeDistribution(Which)
1583        string Which                    //"Volume" or "Number"
1584        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1585        IR3J_CreateCheckGraphs()
1586        DFref oldDf= GetDataFolderDFR()
1587        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1588        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1589        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1590        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1591        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1592        NVAR Spheroid_Beta = root:Packages:Irena:SimpleFits:Spheroid_Beta
1593        NVAR Spheroid_Radius = root:Packages:Irena:SimpleFits:Spheroid_Radius
1594        NVAR Spheroid_ScalingConstant = root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1595        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1596        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1597        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1598        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1599        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1600        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1601//      NVAR VOlSD_Rg                                   =root:Packages:Irena:SimpleFits:VOlSD_Rg
1602//      NVAR VolSD_Volume                               =root:Packages:Irena:SimpleFits:VolSD_Volume
1603//      NVAR VolSD_MeanDiameter         =root:Packages:Irena:SimpleFits:VolSD_MeanDiameter
1604//      NVAR VolSD_MedianDiameter       =root:Packages:Irena:SimpleFits:VolSD_MedianDiameter
1605//      NVAR VOlSD_ModeDiamater         =root:Packages:Irena:SimpleFits:VOlSD_ModeDiamater
1606//      NVAR NumSD_NumPartPerCm3                =root:Packages:Irena:SimpleFits:NumSD_NumPartPerCm3
1607//      NVAR NumSD_MeanDiameter         =root:Packages:Irena:SimpleFits:NumSD_MeanDiameter
1608//      NVAR NumSD_MedianDiameter       =root:Packages:Irena:SimpleFits:NumSD_MedianDiameter
1609//      NVAR NumSD_ModeDiamater         =root:Packages:Irena:SimpleFits:NumSD_ModeDiamater
1610        SVAR QWavename                                  =root:Packages:Irena:SimpleFits:QWavename
1611
1612        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1613                Abort "Cursors are not properly set on same wave"
1614        endif
1615        Duplicate/Free/R=[DataQstartPoint, DataQEndPoint] CursorAXWave, TempXWave
1616        Duplicate/Free/R=[DataQstartPoint, DataQEndPoint] CursorAWave, TempYWave, temp_cumulative, temp_probability, Another_temp
1617        Another_temp=temp_probability*tempXwave
1618        variable Rg, MeanDia, MedianDia, modeDia
1619        string TagText
1620        variable AreaUnderTheCurve = areaXY(CursorAXWave, CursorAWave, DataQstart, DataQEnd)
1621        if(StringMatch(QWavename, "*Diame*" ))
1622                Rg=IR2L_CalculateRg(TempXWave,TempYWave,1)              //Dimension is diameter, 3rd parameter is 1 if DimensionIsDiameter
1623                MeanDia=areaXY(tempXwave, Another_temp,0,inf)   / areaXY(tempXwave, temp_probability,0,inf)                             //Sum P(D)*D*deltaD/P(D)*deltaD
1624                //median
1625                Temp_Cumulative=areaXY(tempXwave, Temp_Probability, tempXwave[0], tempXwave[p] )
1626                MedianDia = tempXwave[BinarySearchInterp(Temp_Cumulative, 0.5*Temp_Cumulative[numpnts(Temp_Cumulative)-1] )]            //R for which cumulative probability=0.5
1627                //mode
1628                FindPeak/P/Q Temp_Probability
1629                modeDia=tempXwave[V_PeakLoc]                                                            //location of maximum on the P(R)
1630        else
1631                Rg=IR2L_CalculateRg(TempXWave,TempYWave,0)              //Dimension is radius, 3rd parameter is 0
1632                MeanDia=2*areaXY(tempXwave, Another_temp,0,inf) / areaXY(tempXwave, temp_probability,0,inf)                             //Sum P(D)*D*deltaD/P(D)*deltaD, corrected to diameter
1633                //median
1634                Temp_Cumulative=areaXY(tempXwave, Temp_Probability, tempXwave[0], tempXwave[p] )
1635                MedianDia = 2* tempXwave[BinarySearchInterp(Temp_Cumulative, 0.5*Temp_Cumulative[numpnts(Temp_Cumulative)-1] )]         //Diameter for which cumulative probability=0.5
1636                //mode
1637                FindPeak/P/Q Temp_Probability
1638                modeDia=2* tempXwave[V_PeakLoc]                                                         //location of maximum on the P(D)
1639        endif
1640//      if(StringMatch(Which, "Number" ))
1641//              NumSD_NumPartPerCm3     = AreaUnderTheCurve
1642//              NumSD_MeanDiameter      = MeanDia
1643//              NumSD_MedianDiameter    = MedianDia
1644//              NumSD_ModeDiamater              = modeDia
1645//              TagText = "Number Size Distribution analysis \r"+"Number of particles/cm3 = "+num2str(AreaUnderTheCurve)
1646//              TagText+="\r Mean Diameter [A] = "+num2str(MeanDia)
1647//              TagText+="\r Mode Dia [A] = "+num2str(modeDia)+"\tMedian Diameter [A] = "+num2str(MedianDia)
1648//      else            //default is volume
1649//              VOlSD_Rg                                        = Rg
1650//              VolSD_Volume                            = AreaUnderTheCurve
1651//              VolSD_MeanDiameter              = MeanDia
1652//              VolSD_MedianDiameter    = MedianDia
1653//              VOlSD_ModeDiamater              = modeDia
1654//              TagText = "Volume Size Distribution analysis \r"+"Volume fraction = "+num2str(AreaUnderTheCurve)
1655//              TagText+="\r Rg = "+num2str(Rg)+"\tMean Diameter [A] = "+num2str(MeanDia)
1656//              TagText+="\r Mode Dia [A] = "+num2str(modeDia)+"\tMedian Diameter [A] = "+num2str(MedianDia)
1657//      endif
1658        //make a good starting guesses:
1659        AchievedChiSquare = 0
1660        string TagName= "SizeDistribution"
1661        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1662        SetDataFolder oldDf
1663
1664end
1665
1666//**********************************************************************************************************
1667//**********************************************************************************************************
1668
1669static Function IR3J_FitSphere()
1670       
1671        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1672        IR3J_CreateCheckGraphs()
1673        DFref oldDf= GetDataFolderDFR()
1674        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1675        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1676        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1677        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1678        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1679        NVAR SphereRadius = root:Packages:Irena:SimpleFits:Sphere_Radius
1680        NVAR SphereScalingConst = root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
1681        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1682        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1683        NVAR UseSMRData =       root:Packages:Irena:SimpleFits:UseSMRData
1684        Make/D/N=0/O W_coef, LocalEwave
1685        Make/D/T/N=0/O T_Constraints
1686        Wave/Z W_sigma
1687        Redimension /N=3 W_coef, LocalEwave
1688        Redimension/N=2 T_Constraints
1689        T_Constraints[0] = {"K0 > 0"}
1690        T_Constraints[1] = {"K1 > 3"}
1691        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1692        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1693        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1694        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1695        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1696                Abort "Cursors are not properly set on same wave"
1697        endif
1698        //make a good starting guesses:
1699        SphereScalingConst=CursorAWave[DataQstartPoint]
1700        SphereRadius=0.2 * 2*pi/CursorAXWave[DataQstartPoint]
1701        DataBackground=0.05*CursorAwave[DataQEndPoint]
1702        W_coef = {SphereScalingConst, SphereRadius,DataBackground}     
1703        LocalEwave[0]=(SphereScalingConst/20)
1704        LocalEwave[1]=(SphereRadius/20)
1705        LocalEwave[2]=(DataBackground/20)
1706
1707        variable/g V_FitError=0                 //This should prevent errors from being generated
1708        if(UseSMRData)
1709                FuncFit IR3J_SphereFormfactorSMR W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1710        else
1711                FuncFit IR3J_SphereFormfactor W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1712        endif
1713        if (V_FitError!=0)      //there was error in fitting
1714                RemoveFromGraph/Z $("fit_"+NameOfWave(CursorAWave))
1715                beep
1716                Abort "Fitting error, check starting parameters and fitting limits"
1717        endif
1718        Wave W_sigma
1719        string TagText
1720        TagText = "Fitted Sphere Form Factor   \r"+"Int=Scale*3/(QR*QR*QR))*(sin(QR)-(QR*cos(QR)))+bck"+" \r Radius [A] = "+num2str(W_coef[1])+" \r Scale = "+num2str(W_coef[0])+"\r Background = "+num2str(W_coef[2])
1721        TagText+="\r chi-square = "+num2str(V_chisq)
1722        string TagName= "SphereFit"
1723        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1724        SphereScalingConst=W_coef[0]    //PC
1725        SphereRadius=W_coef[1]  //Radius
1726        DataBackground=W_coef[2]        //Background
1727        SetDataFolder oldDf
1728
1729end
1730
1731//**********************************************************************************************************
1732//**********************************************************************************************************
1733Function IR3J_SphereFormfactor(w,Q) : FitFunc
1734        Wave w
1735        Variable Q
1736
1737        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1738        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1739        //CurveFitDialog/ Equation:
1740        //CurveFitDialog/ f(Q) = ScalingParameter * BesJ(QR) + Background
1741        //CurveFitDialog/ End of Equation
1742        //CurveFitDialog/ Independent Variables 1
1743        //CurveFitDialog/ Q
1744        //CurveFitDialog/ Coefficients 2
1745        //CurveFitDialog/ w[0] = ScalingParameter
1746        //CurveFitDialog/ w[1] = Radius
1747        //CurveFitDialog/ w[2] = Background
1748
1749        variable QR=Q*w[1]
1750        variable FF = (3/(QR*QR*QR))*(sin(QR)-(QR*cos(QR)))
1751        return w[0] * FF * FF + w[2]
1752End
1753
1754//**********************************************************************************************************
1755//**********************************************************************************************************
1756Function IR3J_SphereFormfactorSMR(w,yw,xw) : FitFunc
1757        Wave w,yw,xw
1758        NVAR SlitLength  =      root:Packages:Irena:SimpleFits:SlitLength
1759        duplicate/free yw, ywSM
1760        yw = IR3J_SphereFormfactor(w,xw[p])
1761        IR1B_SmearData(yw, xw, SlitLength, ywSM)
1762        yw=ywSM
1763End
1764
1765//**********************************************************************************************************
1766//**********************************************************************************************************
1767
1768static Function IR3J_FitSpheroid()
1769       
1770        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1771        IR3J_CreateCheckGraphs()
1772        DFref oldDf= GetDataFolderDFR()
1773        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1774        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1775        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1776        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1777        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1778        NVAR Spheroid_Beta = root:Packages:Irena:SimpleFits:Spheroid_Beta
1779        NVAR Spheroid_Radius = root:Packages:Irena:SimpleFits:Spheroid_Radius
1780        NVAR Spheroid_ScalingConstant = root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1781        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1782        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1783        NVAR UseSMRData =       root:Packages:Irena:SimpleFits:UseSMRData
1784        Make/D/N=0/O W_coef, LocalEwave
1785        Make/D/T/N=0/O T_Constraints
1786        Wave/Z W_sigma
1787        Redimension /N=4 W_coef, LocalEwave
1788        Redimension/N=4 T_Constraints
1789        T_Constraints[0] = {"K0 > 0"}
1790        T_Constraints[1] = {"K1 > 3"}
1791        T_Constraints[2] = {"K2 < 20"}
1792        T_Constraints[3] = {"K2 > 0.05"}
1793        T_Constraints[4] = {"K3 < K0/20"}
1794        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1795        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1796        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1797        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1798        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1799                Abort "Cursors are not properly set on same wave"
1800        endif
1801        //make a good starting guesses:
1802        Spheroid_ScalingConstant=CursorAWave[DataQstartPoint]
1803        Spheroid_Radius=0.2*2*pi/CursorAXWave[DataQstartPoint]
1804        DataBackground=0.01*CursorAwave[DataQEndPoint]
1805        Spheroid_Beta = 1
1806        W_coef = {Spheroid_ScalingConstant, Spheroid_Radius,Spheroid_Beta,DataBackground}
1807       
1808        LocalEwave[0]=(Spheroid_ScalingConstant/20)
1809        LocalEwave[1]=(Spheroid_Radius/20)
1810        LocalEwave[2]=(1/20)
1811        LocalEwave[3]=(DataBackground/20)
1812
1813        variable/g V_FitError=0                 //This should prevent errors from being generated
1814        if(UseSMRData)
1815                FuncFit IR3J_SpheroidFormfactorSMR W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1816        else
1817                FuncFit IR3J_SpheroidFormfactor W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1818        endif
1819        if (V_FitError!=0)      //there was error in fitting
1820                RemoveFromGraph/Z $("fit_"+NameOfWave(CursorAWave))
1821                beep
1822                Abort "Fitting error, check starting parameters and fitting limits"
1823        endif
1824        Wave W_sigma
1825        AchievedChiSquare = V_chisq/(DataQEndPoint-DataQstartPoint)
1826        string TagText
1827        TagText = "Fitted Spheroid Form Factor   \r"+"Int=Scale*SpheroidFF(Q,R,beta)+bck"+" \r Radius [A] = "+num2str(W_coef[1])+" \r Aspect ratio = "+num2str(W_coef[2])+" \r Scale = "+num2str(W_coef[0])
1828        TagText+="\r Background = "+num2str(W_coef[3])
1829        TagText+="\r chi-square = "+num2str(V_chisq)
1830        string TagName= "SpheroidFit"
1831        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1832        Spheroid_ScalingConstant        =W_coef[0]      //scale
1833        Spheroid_Radius                         =W_coef[1]      //Radius
1834        Spheroid_Beta                           =W_coef[2]      //beta
1835        DataBackground                          =W_coef[3]      //Background
1836        SetDataFolder oldDf
1837
1838end
1839//**********************************************************************************************************
1840//**********************************************************************************************************
1841Function IR3J_SpheroidFormfactor(w,Q) : FitFunc
1842        Wave w
1843        Variable Q
1844
1845        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1846        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1847        //CurveFitDialog/ Equation:
1848        //CurveFitDialog/ f(Q) = ScalingParameter * SpheroidFF(Q, R, beta) + Background
1849        //CurveFitDialog/ End of Equation
1850        //CurveFitDialog/ Independent Variables 1
1851        //CurveFitDialog/ Q
1852        //CurveFitDialog/ Coefficients 2
1853        //CurveFitDialog/ w[0] = ScalingParameter
1854        //CurveFitDialog/ w[1] = Radius
1855        //CurveFitDialog/ w[2] = Beta - aspect ratio
1856        //CurveFitDialog/ w[3] = Background
1857        variable FF = IR1T_CalcIntgSpheroidFFPoints(Q,w[1],w[2])
1858
1859        return w[0]*FF*FF + w[3]
1860End
1861
1862//**********************************************************************************************************
1863//**********************************************************************************************************
1864
1865Function IR3J_SpheroidFormfactorSMR(w,yw,xw) : FitFunc
1866        Wave w,yw,xw
1867        NVAR SlitLength  =      root:Packages:Irena:SimpleFits:SlitLength
1868        duplicate/free yw, ywSM
1869        yw = IR3J_SpheroidFormfactor(w,xw[p])
1870        IR1B_SmearData(yw, xw, SlitLength, ywSM)
1871        yw=ywSM
1872End
1873
1874
1875//**********************************************************************************************************
1876//**********************************************************************************************************
1877//**********************************************************************************************************
1878//static
1879Function IR3J_CalculateModel()
1880
1881        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1882        IR3J_CreateCheckGraphs()
1883        DFref oldDf= GetDataFolderDFR()
1884        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1885        NVAR DataQEnd                                   =       root:Packages:Irena:SimpleFits:DataQEnd
1886        NVAR DataQstart                                 =       root:Packages:Irena:SimpleFits:DataQstart
1887        NVAR DataQEndPoint                      =       root:Packages:Irena:SimpleFits:DataQEndPoint
1888        NVAR DataQstartPoint                    =       root:Packages:Irena:SimpleFits:DataQstartPoint
1889        Wave OriginalDataIntWave                =       root:Packages:Irena:SimpleFits:OriginalDataIntWave
1890        Wave OriginalDataQWave          =       root:Packages:Irena:SimpleFits:OriginalDataQWave
1891        Wave OriginalDataErrorWave      =       root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1892        Wave/Z LinModelDataIntWave      =       root:Packages:Irena:SimpleFits:LinModelDataIntWave
1893        Wave/Z LinModelDataQWave                =       root:Packages:Irena:SimpleFits:LinModelDataQWave
1894        Wave/Z LinModelDataEWave                =       root:Packages:Irena:SimpleFits:LinModelDataEWave
1895        NVAR AchievedChiSquare          =       root:Packages:Irena:SimpleFits:AchievedChiSquare
1896        NVAR Guinier_I0                                 =       root:Packages:Irena:SimpleFits:Guinier_I0
1897        NVAR Guinier_Rg                                 =       root:Packages:Irena:SimpleFits:Guinier_Rg
1898        NVAR Porod_Constant                     =       root:Packages:Irena:SimpleFits:Porod_Constant
1899        NVAR Porod_SpecificSurface      =       root:Packages:Irena:SimpleFits:Porod_SpecificSurface
1900        NVAR ScatteringContrast         =       root:Packages:Irena:SimpleFits:ScatteringContrast
1901        NVAR Sphere_Radius                              =       root:Packages:Irena:SimpleFits:Sphere_Radius
1902        NVAR Sphere_ScalingConstant     =       root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
1903        NVAR Spheroid_Radius                    =       root:Packages:Irena:SimpleFits:Spheroid_Radius
1904        NVAR Spheroid_ScalingConstant=  root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1905        NVAR Spheroid_Beta                              =       root:Packages:Irena:SimpleFits:Spheroid_Beta
1906        NVAR DataBackground                     =       root:Packages:Irena:SimpleFits:DataBackground
1907        SVAR SimpleModel                                =       root:Packages:Irena:SimpleFits:SimpleModel
1908        NVAR UseSMRData                                 =       root:Packages:Irena:SimpleFits:UseSMRData
1909        NVAR SlitLength                                 =       root:Packages:Irena:SimpleFits:SlitLength
1910        SVAR DataFolderName                     =       root:Packages:Irena:SimpleFits:DataFolderName
1911
1912        Duplicate/O/R=[DataQstartPoint,DataQEndPoint] OriginalDataQWave, ModelLogLogQ, ModelLogLogInt, NormalizedResidualLogLogQ
1913        Duplicate/O/R=[DataQstartPoint,DataQEndPoint] OriginalDataIntWave, NormalizedResidualLogLog, ZeroLineResidualLogLog
1914        ZeroLineResidualLogLog = 0
1915        //do we need linearized data?
1916        variable UsingLinearizedModel=0
1917        if(WaveExists(LinModelDataIntWave))
1918                UsingLinearizedModel=1
1919                Duplicate/O/R=[DataQstartPoint,DataQEndPoint] LinModelDataQWave, ModelLlinLinQ2, ModelLinLinLogInt, NormalizedResidualLinLinQ
1920                Duplicate/O/R=[DataQstartPoint,DataQEndPoint] LinModelDataIntWave, NormalizedResidualLinLin, ZeroLineResidualLinLin
1921                ZeroLineResidualLinLin = 0
1922        else
1923                UsingLinearizedModel=0
1924                KillWaves/Z ModelLinLinQ2, ModelLinLinLogInt, NormalizedResidualLinLinQ, NormalizedResidualLinLin, ZeroLineResidualLinLin
1925        endif
1926
1927        Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] OriginalDataIntWave, TempOriginalIntensity
1928        Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] OriginalDataErrorWave, TempOriginalError
1929        if(UsingLinearizedModel)
1930                Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] LinModelDataEWave, TempLinError
1931                Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] LinModelDataIntWave, TempLinIntensity
1932        endif
1933        //now calculate the data...
1934        strswitch(SimpleModel)                          // Guinier
1935                case "Guinier":                                         // execute if case matches expression
1936                        ModelLogLogInt = Guinier_I0 *exp(-ModelLogLogQ[p]^2*Guinier_Rg^2/3)
1937                                //slit smearing, 
1938                                if(UseSMRData)
1939                                        duplicate/free ModelLogLogInt, ModelLogLogIntSM
1940                                        IR1B_SmearData(ModelLogLogInt, ModelLogLogQ, SlitLength, ModelLogLogIntSM)
1941                                        ModelLogLogInt=ModelLogLogIntSM
1942                                endif
1943                                //end of slit smearing
1944                        if(UsingLinearizedModel)
1945                                ModelLinLinLogInt = ln(ModelLogLogInt) 
1946                        endif
1947                        break                                                           // exit from switch
1948                case "Guinier Rod":                             // Guinier rod
1949                        ModelLogLogInt = Guinier_I0*exp(-ModelLogLogQ[p]^2*Guinier_Rg^2/2)/ModelLogLogQ
1950                                //slit smearing, 
1951                                if(UseSMRData)
1952                                        duplicate/free ModelLogLogInt, ModelLogLogIntSM
1953                                        IR1B_SmearData(ModelLogLogInt, ModelLogLogQ, SlitLength, ModelLogLogIntSM)
1954                                        ModelLogLogInt=ModelLogLogIntSM
1955                                endif
1956                                //end of slit smearing
1957                        if(UsingLinearizedModel)
1958                                ModelLinLinLogInt = ln(ModelLogLogInt*ModelLogLogQ)     
1959                        endif
1960                        break           
1961                case "Guinier Sheet":                           // Guinier Sheet
1962                        ModelLogLogInt = Guinier_I0 *exp(-ModelLogLogQ[p]^2*Guinier_Rg^2)*ModelLogLogQ^(-2)
1963                                //slit smearing, 
1964                                if(UseSMRData)
1965                                        duplicate/free ModelLogLogInt, ModelLogLogIntSM
1966                                        IR1B_SmearData(ModelLogLogInt, ModelLogLogQ, SlitLength, ModelLogLogIntSM)
1967                                        ModelLogLogInt=ModelLogLogIntSM
1968                                endif
1969                                //end of slit smearing
1970                        if(UsingLinearizedModel)
1971                                ModelLinLinLogInt = ln(ModelLogLogInt*ModelLogLogQ^2)   
1972                        endif
1973                        break           
1974                case "Porod":                                           // Porod
1975                        Porod_SpecificSurface =Porod_Constant *1e32 / (2*pi*ScatteringContrast*1e20)
1976                        ModelLogLogInt = DataBackground+Porod_Constant * ModelLogLogQ^(-4)
1977                                //slit smearing, 
1978                                if(UseSMRData)
1979                                        duplicate/free ModelLogLogInt, ModelLogLogIntSM
1980                                        IR1B_SmearData(ModelLogLogInt, ModelLogLogQ, SlitLength, ModelLogLogIntSM)
1981                                        ModelLogLogInt=ModelLogLogIntSM
1982                                endif
1983                                //end of slit smearing
1984                        if(UsingLinearizedModel)
1985                                ModelLinLinLogInt = ModelLogLogInt*ModelLogLogQ^4       
1986                        endif
1987                        break
1988                case "Sphere":                                          // sphere calculation
1989                        //ModelLogLogInt = DataBackground +     Sphere_ScalingConstant * (3/(ModelLogLogQ[p]*Sphere_Radius)^3)*(sin(ModelLogLogQ[p]*Sphere_Radius)-(ModelLogLogQ[p]*Sphere_Radius*cos(ModelLogLogQ[p]*Sphere_Radius)))
1990                        ModelLogLogInt = IR3J_SphereFormfactor({Sphere_ScalingConstant,Sphere_Radius,DataBackground},ModelLogLogQ[p])
1991                                //slit smearing, 
1992                                if(UseSMRData)
1993                                        duplicate/free ModelLogLogInt, ModelLogLogIntSM
1994                                        IR1B_SmearData(ModelLogLogInt, ModelLogLogQ, SlitLength, ModelLogLogIntSM)
1995                                        ModelLogLogInt=ModelLogLogIntSM
1996                                endif
1997                                //end of slit smearing
1998                        break
1999                case "Spheroid":                                        // spheroid
2000                        //ModelLogLogInt =      DataBackground +  Spheroid_ScalingConstant*IR1T_CalcIntgSpheroidFFPoints(ModelLogLogQ[p],Spheroid_Radius,Spheroid_Beta)
2001                        ModelLogLogInt =        IR3J_SpheroidFormfactor({Spheroid_ScalingConstant,Spheroid_Radius,Spheroid_Beta,DataBackground},ModelLogLogQ[p])
2002                                //slit smearing, 
2003                                if(UseSMRData)
2004                                        duplicate/free ModelLogLogInt, ModelLogLogIntSM
2005                                        IR1B_SmearData(ModelLogLogInt, ModelLogLogQ, SlitLength, ModelLogLogIntSM)
2006                                        ModelLogLogInt=ModelLogLogIntSM
2007                                endif
2008                                //end of slit smearing
2009                        break
2010                default:                                                // optional default expression executed
2011                //nothing is default here, so set values to 0 to know there is problem.
2012                ModelLogLogInt = 0
2013                if(UsingLinearizedModel)
2014                        ModelLinLinLogInt = 0   
2015                endif           
2016        endswitch
2017        //calculate residuals, chi^2 and append to graph
2018        NormalizedResidualLogLog = (TempOriginalIntensity-ModelLogLogInt)/TempOriginalError
2019        Duplicate/Free NormalizedResidualLogLog, ChiSquareTemp
2020        ChiSquareTemp = ((TempOriginalIntensity-ModelLogLogInt)/TempOriginalError)^2
2021        AchievedChiSquare = (sum(ChiSquareTemp)/numpnts(ChiSquareTemp))
2022        CheckDisplayed /W=IR3J_LogLogDataDisplay ModelLogLogInt
2023        if(!V_flag)
2024                AppendToGraph /W=IR3J_LogLogDataDisplay  ModelLogLogInt  vs ModelLogLogQ
2025                ModifyGraph/W=IR3J_LogLogDataDisplay  lsize(ModelLogLogInt)=3,rgb(ModelLogLogInt)=(0,0,0)
2026        endif
2027        CheckDisplayed /W=IR3J_LogLogDataDisplay NormalizedResidualLogLog
2028        if(!V_flag)
2029                        //ModifyGraph /W=IR3J_LogLogDataDisplay standoff(left)=0,axisEnab(left)={0,1}
2030                        AppendToGraph /W=IR3J_LogLogDataDisplay /L=VertCrossing NormalizedResidualLogLog vs NormalizedResidualLogLogQ
2031                        ModifyGraph/W=IR3J_LogLogDataDisplay mode(NormalizedResidualLogLog)=2,rgb(NormalizedResidualLogLog)=(0,0,0)
2032                        ModifyGraph/W=IR3J_LogLogDataDisplay  mirror=1,nticks(VertCrossing)=0,axisEnab(VertCrossing)={0,0.1},freePos(VertCrossing)=0
2033                        SetAxis/W=IR3J_LogLogDataDisplay /A/E=2 VertCrossing
2034                        ModifyGraph/W=IR3J_LogLogDataDisplay standoff=0
2035                        //Label/W=IR3J_LogLogDataDisplay VertCrossing "Norm res"
2036                        AppendToGraph /W=IR3J_LogLogDataDisplay /L=VertCrossing ZeroLineResidualLogLog vs NormalizedResidualLogLogQ
2037                        ModifyGraph/W=IR3J_LogLogDataDisplay rgb(ZeroLineResidualLogLog)=(0,0,0)
2038        endif
2039        //now same, if we are using linearized data
2040        if(UsingLinearizedModel)
2041                NormalizedResidualLinLin = (TempLinIntensity-ModelLinLinLogInt)/TempLinError
2042                CheckDisplayed /W=IR3J_LinDataDisplay ModelLinLinLogInt
2043                if(!V_flag)
2044                        AppendToGraph /W=IR3J_LinDataDisplay  ModelLinLinLogInt  vs ModelLlinLinQ2
2045                        ModifyGraph/W=IR3J_LinDataDisplay  lsize(ModelLinLinLogInt)=2,rgb(ModelLinLinLogInt)=(0,0,0)
2046                endif
2047       
2048                CheckDisplayed /W=IR3J_LinDataDisplay NormalizedResidualLinLin
2049                if(!V_flag)
2050                        //AppendToGraph /W=IR3J_LinDataDisplay/R  NormalizedResidualLinLin  vs NormalizedResidualLinLinQ
2051                        //ModifyGraph/W=IR3J_LinDataDisplay mode(NormalizedResidualLinLin)=2,lsize(NormalizedResidualLinLin)=3,rgb(NormalizedResidualLinLin)=(0,0,0)
2052                        //Label/W=IR3J_LinDataDisplay right "Norm res"
2053                        //ModifyGraph /W=IR3J_LinDataDisplay standoff(left)=0,axisEnab(left)={0,1}
2054                        AppendToGraph /W=IR3J_LinDataDisplay /L=VertCrossing NormalizedResidualLinLin vs NormalizedResidualLinLinQ
2055                        ModifyGraph/W=IR3J_LinDataDisplay mode(NormalizedResidualLinLin)=2,rgb(NormalizedResidualLinLin)=(0,0,0)
2056                        ModifyGraph/W=IR3J_LinDataDisplay  mirror=1,nticks(VertCrossing)=0,axisEnab(VertCrossing)={0,0.1},freePos(VertCrossing)=0
2057                        SetAxis/W=IR3J_LinDataDisplay /A/E=2 VertCrossing
2058                        ModifyGraph/W=IR3J_LinDataDisplay standoff=0
2059                        AppendToGraph /W=IR3J_LinDataDisplay /L=VertCrossing ZeroLineResidualLinLin vs NormalizedResidualLinLinQ
2060                        ModifyGraph /W=IR3J_LinDataDisplay rgb(ZeroLineResidualLinLin)=(0,0,0)
2061                endif
2062
2063        endif
2064        SetDataFolder oldDf
2065
2066end
2067//**********************************************************************************************************
2068//**********************************************************************************************************
2069//**********************************************************************************************************
2070static Function IR3J_SaveResultsToNotebook()
2071
2072        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2073        NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
2074        NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
2075        NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
2076        if(!SaveToNotebook)
2077                return 0
2078        endif   
2079        IR1_CreateResultsNbk()
2080        DFref oldDf= GetDataFolderDFR()
2081        SetDataFolder root:Packages:Irena:SimpleFits                                                            //go into the folder
2082        SVAR  DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
2083        SVAR  IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
2084        SVAR  QWavename=root:Packages:Irena:SimpleFits:QWavename
2085        SVAR  ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
2086        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
2087        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
2088        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
2089        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
2090        NVAR Guinier_I0                                 = root:Packages:Irena:SimpleFits:Guinier_I0
2091        NVAR Guinier_Rg                                 =root:Packages:Irena:SimpleFits:Guinier_Rg
2092        NVAR Porod_Constant                     =root:Packages:Irena:SimpleFits:Porod_Constant
2093        NVAR Porod_SpecificSurface                      =root:Packages:Irena:SimpleFits:Porod_SpecificSurface
2094        NVAR ScatteringContrast                 =root:Packages:Irena:SimpleFits:ScatteringContrast
2095        NVAR Sphere_Radius                              =root:Packages:Irena:SimpleFits:Sphere_Radius
2096        NVAR Sphere_ScalingConstant     =root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
2097        NVAR Spheroid_Radius                    =root:Packages:Irena:SimpleFits:Spheroid_Radius
2098        NVAR Spheroid_ScalingConstant=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
2099        NVAR Spheroid_Beta                              =root:Packages:Irena:SimpleFits:Spheroid_Beta
2100        NVAR DataBackground                     =root:Packages:Irena:SimpleFits:DataBackground
2101        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
2102        NVAR InvQmaxUsed =      root:Packages:Irena:SimpleFits:InvQmaxUsed
2103        NVAR Invariant =        root:Packages:Irena:SimpleFits:invariant
2104        NVAR DataQEnd =         root:Packages:Irena:SimpleFits:DataQEnd
2105        NVAR DataQstart =       root:Packages:Irena:SimpleFits:DataQstart
2106        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
2107        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
2108        SVAR InvBackgModel = root:Packages:Irena:SimpleFits:InvBackgModel
2109        NVAR InvBckgMinQ = root:Packages:Irena:SimpleFits:InvBckgMinQ
2110        NVAR InvBckgMaxQ = root:Packages:Irena:SimpleFits:InvBckgMaxQ
2111        SVAR Corr1DMethod = root:Packages:Irena:SimpleFits:Corr1DMethod
2112        NVAR Zmax = root:Packages:Irena:SimpleFits:Corr1DZmax
2113        NVAR Corr1DWavelength = root:Packages:Irena:SimpleFits:Corr1DWavelength
2114
2115        Wave/Z ModelInt = root:Packages:Irena:SimpleFits:ModelLogLogInt
2116        Wave/Z ModelQ = root:Packages:Irena:SimpleFits:ModelLogLogQ
2117        //others can be created via Simple plots as needed...
2118        //if(!WaveExists(modelInt)||!WaveExists(ModelQ))
2119        //      return 0                        //cannot do anything, bail out.
2120        //endif
2121
2122        IR1_AppendAnyText("\r Results of "+SimpleModel+" fitting\r",1) 
2123        IR1_AppendAnyText("Date & time: \t"+Date()+"   "+time(),0)     
2124        IR1_AppendAnyText("Data from folder: \t"+DataFolderName,0)     
2125        IR1_AppendAnyText("Intensity: \t"+IntensityWaveName,0) 
2126        IR1_AppendAnyText("Q: \t"+QWavename,0) 
2127        IR1_AppendAnyText("Error: \t"+ErrorWaveName,0) 
2128        IR1_AppendAnyText("Qmin = "+num2str(DataQstart),0)
2129        IR1_AppendAnyText("Qmax = "+num2str(DataQEnd),0)
2130        IR1_AppendAnyText(" ",0)       
2131        if(stringmatch(SimpleModel,"Guinier"))
2132                IR1_AppendAnyText("\tRg                  = "+num2str(Guinier_Rg),0)
2133                IR1_AppendAnyText("\tI0                  = "+num2str(Guinier_I0),0)
2134                IR1_AppendAnyText("Achieved Normalized chi-square = "+num2str(AchievedChiSquare),0)
2135        elseif(stringmatch(SimpleModel,"Guinier Rod"))
2136                IR1_AppendAnyText("\tRc                  = "+num2str(Guinier_Rg),0)
2137                IR1_AppendAnyText("\tI0                  = "+num2str(Guinier_I0),0)
2138                IR1_AppendAnyText("Achieved Normalized chi-square = "+num2str(AchievedChiSquare),0)
2139        elseif(stringmatch(SimpleModel,"Guinier Sheet"))
2140                IR1_AppendAnyText("\tThickness           = "+num2str(sqrt(12)*Guinier_Rg),0)
2141                IR1_AppendAnyText("\tI0                  = "+num2str(Guinier_I0),0)
2142                IR1_AppendAnyText("Achieved Normalized chi-square = "+num2str(AchievedChiSquare),0)
2143        elseif(stringmatch(SimpleModel,"Porod"))
2144                IR1_AppendAnyText("\tPorod Constant [1/cm 1/A^4] = "+num2str(Porod_Constant),0)
2145                IR1_AppendAnyText("\tSpecific Surface [cm2/cm3] = "+num2str(Porod_SpecificSurface),0)
2146                IR1_AppendAnyText("\tContrast [10^20 cm^-4] = "+num2str(Porod_Constant),0)
2147                IR1_AppendAnyText("\tBackground          = "+num2str(DataBackground),0)
2148                IR1_AppendAnyText("Achieved Normalized chi-square = "+num2str(AchievedChiSquare),0)
2149        elseif(stringmatch(SimpleModel,"Sphere"))
2150                IR1_AppendAnyText("\tSphere Radius [A]   = "+num2str(Sphere_Radius),0)
2151                IR1_AppendAnyText("\tScaling constant    = "+num2str(Sphere_ScalingConstant),0)
2152                IR1_AppendAnyText("\tBackground = "+num2str(DataBackground),0)
2153                IR1_AppendAnyText("Achieved Normalized chi-square = "+num2str(AchievedChiSquare),0)
2154        elseif(stringmatch(SimpleModel,"Spheroid"))
2155                IR1_AppendAnyText("\tSpheroid Radius [A] = "+num2str(Spheroid_Radius),0)
2156                IR1_AppendAnyText("\tScaling constant    = "+num2str(Spheroid_ScalingConstant),0)
2157                IR1_AppendAnyText("\tSpheroid Beta       = "+num2str(Spheroid_Beta),0)
2158                IR1_AppendAnyText("\tBackground          = "+num2str(DataBackground),0)
2159                IR1_AppendAnyText("Achieved Normalized chi-square = "+num2str(AchievedChiSquare),0)
2160        elseif(stringmatch(SimpleModel,"Invariant"))
2161                IR1_AppendAnyText("\tInvariant [(mol e-^2/cm^3)^3]      = "+num2str(Invariant),0)
2162                IR1_AppendAnyText("\tQmax used for calc.                                = "+num2str(InvQmaxUsed),0)
2163                IR1_AppendAnyText("\tBackground Model                           = "+InvBackgModel,0)
2164                IR1_AppendAnyText("\tBckg Q start                                               = "+num2str(InvBckgMinQ),0)
2165                IR1_AppendAnyText("\tBckg Q end                                                 = "+num2str(InvBckgMaxQ),0)
2166        elseif(stringmatch(SimpleModel,"1DCorrelation"))
2167                IR1_AppendAnyText("\tMethod              =  "+Corr1DMethod,0)
2168                IR1_AppendAnyText("\tWavelength          =  "+num2str(Corr1DWavelength),0)
2169                IR1_AppendAnyText("\tZ max [A]           =  "+num2str(Zmax),0)
2170//      elseif(stringmatch(SimpleModel,"Number Size Distribution"))
2171//              IR1_AppendAnyText("\tNum Particles/cm3   =  "+num2str(NumSD_NumPartPerCm3),0)
2172//              IR1_AppendAnyText("\tMean Diameter [A]   =  "+num2str(NumSD_MeanDiameter),0)
2173//              IR1_AppendAnyText("\tMedian Diameter [A] =  "+num2str(NumSD_MedianDiameter),0)
2174//              IR1_AppendAnyText("\tMode Diameter [A]   =  "+num2str(NumSD_ModeDiamater),0)
2175        endif
2176
2177        IR1_AppendAnyGraph("IR3J_LogLogDataDisplay")
2178        DOWIndow IR3J_LinDataDisplay
2179        if(V_Flag)
2180                IR1_AppendAnyGraph("IR3J_LinDataDisplay")
2181        endif
2182        IR1_AppendAnyText("******************************************\r",0)     
2183        SetDataFolder OldDf
2184        SVAR/Z nbl=root:Packages:Irena:ResultsNotebookName     
2185        DoWindow/F $nbl
2186end
2187//**********************************************************************************************************
2188//**********************************************************************************************************
2189//**********************************************************************************************************
2190static Function IR3J_SaveResultsToFolder()
2191       
2192        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2193        DFref oldDf= GetDataFolderDFR()
2194        SetDataFolder root:Packages:Irena:SimpleFits                                                            //go into the folder
2195        NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
2196        if(!SaveToFolder)
2197                return 0
2198        endif   
2199        SVAR  DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
2200        SVAR  IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
2201        SVAR  QWavename=root:Packages:Irena:SimpleFits:QWavename
2202        SVAR  ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
2203        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
2204        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
2205        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
2206        NVAR Guinier_I0 = root:Packages:Irena:SimpleFits:Guinier_I0
2207        NVAR Guinier_Rg=root:Packages:Irena:SimpleFits:Guinier_Rg
2208        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
2209        NVAR Guinier_I0                                 = root:Packages:Irena:SimpleFits:Guinier_I0
2210        NVAR Guinier_Rg                                 =root:Packages:Irena:SimpleFits:Guinier_Rg
2211        NVAR Porod_Constant                     =root:Packages:Irena:SimpleFits:Porod_Constant
2212        NVAR Porod_SpecificSurface                      =root:Packages:Irena:SimpleFits:Porod_SpecificSurface
2213        NVAR ScatteringContrast                 =root:Packages:Irena:SimpleFits:ScatteringContrast
2214        NVAR Sphere_Radius                              =root:Packages:Irena:SimpleFits:Sphere_Radius
2215        NVAR Sphere_ScalingConstant     =root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
2216        NVAR Spheroid_Radius                    =root:Packages:Irena:SimpleFits:Spheroid_Radius
2217        NVAR Spheroid_ScalingConstant=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
2218        NVAR Spheroid_Beta                              =root:Packages:Irena:SimpleFits:Spheroid_Beta
2219        NVAR DataBackground                     =root:Packages:Irena:SimpleFits:DataBackground
2220        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
2221        NVAR SaveToNotebook                     =root:Packages:Irena:SimpleFits:SaveToNotebook
2222        NVAR SaveToWaves                                =root:Packages:Irena:SimpleFits:SaveToWaves
2223        SVAR Corr1DMethod = root:Packages:Irena:SimpleFits:Corr1DMethod
2224        NVAR Zmax = root:Packages:Irena:SimpleFits:Corr1DZmax
2225        NVAR Corr1DWavelength = root:Packages:Irena:SimpleFits:Corr1DWavelength
2226
2227        //create new results names...
2228        //AllCurrentlyAllowedTypes+="SimFitGuinierY;SimFitGuinierRY;SimFitGuinierSY;SimFitSphereY;SimFitSpheroidY;"
2229        //save these waves here:
2230        Wave/Z ModelInt = root:Packages:Irena:SimpleFits:ModelLogLogInt
2231        Wave/Z ModelQ = root:Packages:Irena:SimpleFits:ModelLogLogQ
2232        //others can be created via Simple polots as needed...
2233        if(!WaveExists(modelInt)||!WaveExists(ModelQ)&&!StringMatch(SimpleModel, "Invariant" )&&!StringMatch(SimpleModel, "1DCorrelation" ))
2234                return 0                        //cannot do anything, bail out.
2235        endif
2236        //note, there is nothing to do here for :
2237        // Volume Size Distribution and Number Size Distribution
2238        //get old note here...
2239        Wave/Z SourceIntWv=$(DataFolderName+IntensityWaveName)
2240        string OldNote=note(SourceIntWv)
2241        string NoteWithResults=""
2242        variable generation=0
2243        NoteWithResults="Results of "+SimpleModel+" fitting;"+date()+";"+time()+";DataFolder="+DataFolderName+";Intensity="+IntensityWaveName+";"
2244        NoteWithResults+="Q="+QWavename+";"+"Error="+ErrorWaveName+";"+"ChiSquared="+num2str(AchievedChiSquare)+";"
2245        strswitch(SimpleModel) 
2246                case "Guinier":
2247                        NoteWithResults+="Rg="+num2str(Guinier_Rg)+";"+"I0="+num2str(Guinier_I0)+";"
2248                        NoteWithResults+=OldNote
2249                        generation=IN2G_FindAVailableResultsGen("SimFitGuinierI", DataFolderName)
2250                        Duplicate/O ModelInt, $(DataFolderName+"SimFitGuinierI_"+num2str(generation))
2251                        Duplicate/O ModelQ, $(DataFolderName+"SimFitGuinierQ_"+num2str(generation))
2252                        Wave ResultInt=$(DataFolderName+"SimFitGuinierI_"+num2str(generation))
2253                        Wave ResuldQ = $(DataFolderName+"SimFitGuinierQ_"+num2str(generation))
2254                        Note /K/NOCR ResultInt, NoteWithResults
2255                        Note /K/NOCR ResuldQ, NoteWithResults
2256                        break   
2257                case "Guinier Rod":     // execute if case matches expression
2258                        NoteWithResults+="Rc="+num2str(Guinier_Rg)+";"+"I0="+num2str(Guinier_I0)+";"
2259                        NoteWithResults+=OldNote
2260                        generation=IN2G_FindAVailableResultsGen("SimFitGuinierRI", DataFolderName)
2261                        Duplicate/O ModelInt, $(DataFolderName+"SimFitGuinierRI_"+num2str(generation))
2262                        Duplicate/O ModelQ, $(DataFolderName+"SimFitGuinierRQ_"+num2str(generation))
2263                        Wave ResultInt=$(DataFolderName+"SimFitGuinierRI_"+num2str(generation))
2264                        Wave ResuldQ = $(DataFolderName+"SimFitGuinierRQ_"+num2str(generation))
2265                        Note /K/NOCR ResultInt, NoteWithResults
2266                        Note /K/NOCR ResuldQ, NoteWithResults
2267                        break   
2268                case "Guinier Sheet":   // execute if case matches expression
2269                        NoteWithResults+="Thickness="+num2str(sqrt(12)*Guinier_Rg)+";"+"I0="+num2str(Guinier_I0)+";"
2270                        NoteWithResults+=OldNote
2271                        generation=IN2G_FindAVailableResultsGen("SimFitGuinierSI", DataFolderName)
2272                        Duplicate/O ModelInt, $(DataFolderName+"SimFitGuinierSI_"+num2str(generation))
2273                        Duplicate/O ModelQ, $(DataFolderName+"SimFitGuinierSQ_"+num2str(generation))
2274                        Wave ResultInt=$(DataFolderName+"SimFitGuinierSI_"+num2str(generation))
2275                        Wave ResuldQ = $(DataFolderName+"SimFitGuinierSQ_"+num2str(generation))
2276                        Note /K/NOCR ResultInt, NoteWithResults
2277                        Note /K/NOCR ResuldQ, NoteWithResults
2278                        break   
2279                case "Porod":   // execute if case matches expression
2280                        NoteWithResults+="PorodConstant="+num2str(Porod_Constant)+";"+"DataBackground="+num2str(DataBackground)+";"
2281                        NoteWithResults+="ScatteringContrast="+num2str(ScatteringContrast)+";"+"Porod_SpecificSurface="+num2str(Porod_SpecificSurface)+";"
2282                        NoteWithResults+=OldNote
2283                        generation=IN2G_FindAVailableResultsGen("SimFitPorodI_", DataFolderName)
2284                        Duplicate/O ModelInt, $(DataFolderName+"SimFitPorodI_"+num2str(generation))
2285                        Duplicate/O ModelQ, $(DataFolderName+"SimFitPorodQ_"+num2str(generation))
2286                        Wave ResultInt=$(DataFolderName+"SimFitPorodI_"+num2str(generation))
2287                        Wave ResuldQ = $(DataFolderName+"SimFitPorodQ_"+num2str(generation))
2288                        Note /K/NOCR ResultInt, NoteWithResults
2289                        Note /K/NOCR ResuldQ, NoteWithResults
2290                        break   
2291                case "Sphere":  // execute if case matches expression
2292                        NoteWithResults+="SphereRadius="+num2str(Sphere_Radius)+";"+"SphereScalingFactor="+num2str(Sphere_ScalingConstant)+";"+"SphereBackground="+num2str(DataBackground)+";"
2293                        NoteWithResults+=OldNote
2294                        generation=IN2G_FindAVailableResultsGen("SimFitSphereI_", DataFolderName)
2295                        Duplicate/O ModelInt, $(DataFolderName+"SimFitSphereI_"+num2str(generation))
2296                        Duplicate/O ModelQ, $(DataFolderName+"SimFitSphereQ_"+num2str(generation))
2297                        Wave ResultInt=$(DataFolderName+"SimFitSphereI_"+num2str(generation))
2298                        Wave ResuldQ = $(DataFolderName+"SimFitSphereQ_"+num2str(generation))
2299                        Note /K/NOCR ResultInt, NoteWithResults
2300                        Note /K/NOCR ResuldQ, NoteWithResults
2301                        break   
2302                case "Spheroid":        // execute if case matches expression
2303                        NoteWithResults+="SpheroidRadius="+num2str(Spheroid_Radius)+";"+"SpheroidAspectRatio="+num2str(Spheroid_Beta)+";"
2304                        NoteWithResults+="SpheroidScalingFactor="+num2str(Spheroid_ScalingConstant)+";"+"SpheroidBackground="+num2str(DataBackground)+";"
2305                        NoteWithResults+=OldNote
2306                        generation=IN2G_FindAVailableResultsGen("SimFitSpheroidI_", DataFolderName)
2307                        Duplicate/O ModelInt, $(DataFolderName+"SimFitSpheroidI_"+num2str(generation))
2308                        Duplicate/O ModelQ, $(DataFolderName+"SimFitSpheroidQ_"+num2str(generation))
2309                        Wave ResultInt=$(DataFolderName+"SimFitSpheroidI_"+num2str(generation))
2310                        Wave ResuldQ = $(DataFolderName+"SimFitSpheroidQ_"+num2str(generation))
2311                        Note /K/NOCR ResultInt, NoteWithResults
2312                        Note /K/NOCR ResuldQ, NoteWithResults
2313                        break
2314                case "Invariant":       // nothing to do here...
2315                        variable/g  $(DataFolderName+"Invariant")
2316                        NVAR InvariantResult = $(DataFolderName+"Invariant")
2317                        variable/g  $(DataFolderName+"Invariantcm4")
2318                        NVAR InvariantResultcm4 = $(DataFolderName+"Invariantcm4")
2319                        NVAR Invariant =        root:Packages:Irena:SimpleFits:invariant
2320                        NVAR InvariantIrena =   root:Packages:Irena:SimpleFits:InvariantIrena
2321                        InvariantResult = Invariant
2322                        InvariantResultcm4 = InvariantIrena
2323                        break
2324                case  "1DCorrelation":
2325                        NoteWithResults+="1DCorrelation method="+Corr1DMethod+";"+"Zmax="+num2str(Zmax)+";"
2326                        NoteWithResults+="1DCorrWavelength="+num2str(Corr1DWavelength)+";"
2327                        NoteWithResults+=OldNote
2328                        generation=IN2G_FindAVailableResultsGen("Corr1DZ_", DataFolderName)
2329                        Wave ZWave = root:Packages:Irena:SimpleFits:ZWave
2330                        Duplicate/O ZWave, $(DataFolderName+"Corr1DZ_"+num2str(generation))
2331                        Wave ResultX=$(DataFolderName+"Corr1DZ_"+num2str(generation))
2332                        //      Duplicate/O ZwaveTemp, ZWave
2333                        If(StringMatch(Corr1DMethod, "Anisotropic (abs, Strobl)"))                                                             
2334                                //Strobl approach
2335                                Wave Kwave = root:Packages:Irena:SimpleFits:Kwave
2336                                Duplicate/O Kwave, $(DataFolderName+"Corr1DK_"+num2str(generation))
2337                                Wave ResultY = $(DataFolderName+"Corr1DK_"+num2str(generation))
2338                        ElseIf(StringMatch(Corr1DMethod, "Anisotropic (norm)"))                                                         
2339                                //Roe approach for anisotropic data
2340                                Wave GammaA_wave = root:Packages:Irena:SimpleFits:GammaA_wave
2341                                Duplicate/O GammaA_wave, $(DataFolderName+"Corr1DGammaA_"+num2str(generation))
2342                                Wave ResultY = $(DataFolderName+"Corr1DGammaA_"+num2str(generation))
2343                        ElseIf(StringMatch(Corr1DMethod, "Isotropic (norm)"))                                                   
2344                                //Roe approach for isotropic data
2345                                Wave GammaI_wave = root:Packages:Irena:SimpleFits:GammaI_wave
2346                                Duplicate/O GammaI_wave, $(DataFolderName+"Corr1DGammaI_"+num2str(generation))
2347                                Wave ResultY = $(DataFolderName+"Corr1DGammaI_"+num2str(generation))
2348                        EndIf
2349                        Note /K/NOCR ResultY, NoteWithResults
2350                        Note /K/NOCR ResultX, NoteWithResults
2351                        break
2352                default:                        // optional default expression executed
2353                        Abort "Unknown data type, cannot save the data"
2354        endswitch       
2355end
2356//*****************************************************************************************************************
2357//**********************************************************************************************************
2358//**********************************************************************************************************
2359static Function IR3J_SaveResultsToWaves()
2360       
2361        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2362        DFref oldDf= GetDataFolderDFR()
2363        NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
2364        NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
2365        NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
2366        if(!SaveToWaves)
2367                return 0
2368        endif
2369        SetDataFolder root:Packages:Irena:SimpleFits                                                            //go into the folder
2370        SVAR  DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
2371        SVAR  IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
2372        SVAR  QWavename=root:Packages:Irena:SimpleFits:QWavename
2373        SVAR  ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
2374        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
2375        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
2376        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
2377        NVAR Guinier_I0 = root:Packages:Irena:SimpleFits:Guinier_I0
2378        NVAR Guinier_Rg=root:Packages:Irena:SimpleFits:Guinier_Rg
2379        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
2380        NVAR Guinier_I0                                 = root:Packages:Irena:SimpleFits:Guinier_I0
2381        NVAR Guinier_Rg                                 =root:Packages:Irena:SimpleFits:Guinier_Rg
2382        NVAR Porod_Constant                     =root:Packages:Irena:SimpleFits:Porod_Constant
2383        NVAR Porod_SpecificSurface                      =root:Packages:Irena:SimpleFits:Porod_SpecificSurface
2384        NVAR ScatteringContrast                 =root:Packages:Irena:SimpleFits:ScatteringContrast
2385        NVAR Sphere_Radius                              =root:Packages:Irena:SimpleFits:Sphere_Radius
2386        NVAR Sphere_ScalingConstant     =root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
2387        NVAR Spheroid_Radius                    =root:Packages:Irena:SimpleFits:Spheroid_Radius
2388        NVAR Spheroid_ScalingConstant=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
2389        NVAR Spheroid_Beta                              =root:Packages:Irena:SimpleFits:Spheroid_Beta
2390        NVAR DataBackground                     =root:Packages:Irena:SimpleFits:DataBackground
2391
2392        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
2393
2394        NVAR InvQmaxUsed                =       root:Packages:Irena:SimpleFits:InvQmaxUsed
2395        NVAR Invariant                  =       root:Packages:Irena:SimpleFits:invariant
2396        NVAR DataQEnd                   =       root:Packages:Irena:SimpleFits:DataQEnd
2397        NVAR DataQstart                 =       root:Packages:Irena:SimpleFits:DataQstart
2398        NVAR DataQEndPoint      = root:Packages:Irena:SimpleFits:DataQEndPoint
2399        NVAR DataQstartPoint    = root:Packages:Irena:SimpleFits:DataQstartPoint
2400        SVAR InvBackgModel      = root:Packages:Irena:SimpleFits:InvBackgModel
2401        NVAR InvBckgMinQ                = root:Packages:Irena:SimpleFits:InvBckgMinQ
2402        NVAR InvBckgMaxQ                = root:Packages:Irena:SimpleFits:InvBckgMaxQ
2403        NVAR InvariantIrena     = root:Packages:Irena:SimpleFits:InvariantIrena
2404        NVAR InvContrast                = root:Packages:Irena:SimpleFits:InvContrast
2405        NVAR InvVolumeFraction = root:Packages:Irena:SimpleFits:InvVolumeFraction
2406
2407        Wave/Z ModelInt = root:Packages:Irena:SimpleFits:ModelLogLogInt
2408        Wave/Z ModelQ = root:Packages:Irena:SimpleFits:ModelLogLogQ
2409        //others can be created via Simple polots as needed...
2410        //if(!WaveExists(modelInt)||!WaveExists(ModelQ))                //Volume Size Distribution;Number Size Distribution do not have output waqves...
2411        //      return 0                        //cannot do anything, bail out.
2412        //endif
2413
2414        variable curlength
2415        if(stringmatch(SimpleModel,"Guinier"))
2416                //tabulate data for Guinier
2417                NewDATAFolder/O/S root:GuinierFitResults
2418                Wave/Z GuinierRg
2419                if(!WaveExists(GuinierRg))
2420                        make/O/N=0 GuinierRg, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2421                        make/O/N=0/T SampleName
2422                        SetScale/P x 0,1,"A", GuinierRg
2423                        SetScale/P x 0,1,"1/A", GuinierQmin, GuinierQmax
2424                endif
2425                curlength = numpnts(GuinierRg)
2426                redimension/N=(curlength+1) SampleName,GuinierRg, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2427                SampleName[curlength] = DataFolderName
2428                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2429                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2430                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2431                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2432                GuinierRg[curlength]                            = Guinier_Rg
2433                GuinierI0[curlength]                            = Guinier_I0
2434                GuinierQmin[curlength]                  = DataQstart
2435                GuinierQmax[curlength]                  = DataQEnd
2436                GuinierChiSquare[curlength]     = AchievedChiSquare
2437                IR3J_GetTableWithresults()
2438        elseif(stringmatch(SimpleModel,"Invariant"))
2439                //tabulate data for Invariant
2440                NewDATAFolder/O/S root:InvariantFitResults
2441                Wave/Z InvariantWV
2442                if(!WaveExists(InvariantWV))
2443                        make/O/N=0 InvariantWV, InvariantQmax, TimeWave, TemperatureWave, PercentWave, OrderWave, InvariantIrenaWV, InvContrastWv, InvVolumeFractionWv
2444                        make/O/N=0/T SampleName
2445                        SetScale/P x 0,1,"(mol e-^2/cm^3)^3", InvariantWV
2446                        SetScale/P x 0,1,"1/A", InvariantQmax
2447                        SetScale/P x 0,1,"1/cm4", InvariantIrenaWV     
2448                endif
2449                curlength = numpnts(InvariantWV)
2450                redimension/N=(curlength+1) SampleName, InvariantWV, InvariantQmax, TimeWave, TemperatureWave, PercentWave, OrderWave , InvariantIrenaWV, InvContrastWv, InvVolumeFractionWv
2451                SampleName[curlength] = DataFolderName
2452                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2453                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2454                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2455                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2456                InvariantWV[curlength]                  = Invariant
2457                InvariantQmax[curlength]                = InvQmaxUsed
2458                InvariantIrenaWV[curlength]     = InvariantIrena
2459                InvContrastWv[curlength]                = InvContrast
2460                InvVolumeFractionWv[curlength]  = InvVolumeFraction
2461                IR3J_GetTableWithresults()
2462        elseif(stringmatch(SimpleModel,"Guinier Rod"))
2463                //tabulate data for Guinier
2464                NewDATAFolder/O/S root:GuinierRodFitResults
2465                Wave/Z GuinierRc
2466                if(!WaveExists(GuinierRc))
2467                        make/O/N=0 GuinierRc, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2468                        make/O/N=0/T SampleName
2469                        SetScale/P x 0,1,"A", GuinierRc
2470                        SetScale/P x 0,1,"1/A", GuinierQmin, GuinierQmax
2471                endif
2472                curlength = numpnts(GuinierRc)
2473                redimension/N=(curlength+1) SampleName,GuinierRc, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2474                SampleName[curlength] = DataFolderName
2475                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2476                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2477                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2478                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2479                GuinierRc[curlength] = Guinier_Rg
2480                GuinierI0[curlength] = Guinier_I0
2481                GuinierQmin[curlength] = DataQstart
2482                GuinierQmax[curlength] = DataQEnd
2483                GuinierChiSquare[curlength] = AchievedChiSquare
2484                IR3J_GetTableWithresults()
2485        elseif(stringmatch(SimpleModel,"Guinier Sheet"))
2486                //tabulate data for Guinier
2487                NewDATAFolder/O/S root:GuinierSheetFitResults
2488                Wave/Z GuinierTh
2489                if(!WaveExists(GuinierTh))
2490                        make/O/N=0 GuinierTh, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2491                        make/O/N=0/T SampleName
2492                        SetScale/P x 0,1,"A", GuinierTh
2493                        SetScale/P x 0,1,"1/A", GuinierQmin, GuinierQmax
2494                endif
2495                curlength = numpnts(GuinierTh)
2496                redimension/N=(curlength+1) SampleName,GuinierTh, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2497                SampleName[curlength] = DataFolderName
2498                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2499                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2500                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2501                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2502                GuinierTh[curlength] = sqrt(12)*Guinier_Rg
2503                GuinierI0[curlength] = Guinier_I0
2504                GuinierQmin[curlength] = DataQstart
2505                GuinierQmax[curlength] = DataQEnd
2506                GuinierChiSquare[curlength] = AchievedChiSquare
2507                IR3J_GetTableWithresults()
2508        elseif(stringmatch(SimpleModel,"Porod"))
2509                //tabulate data for Porod
2510                NewDATAFolder/O/S root:PorodFitResults
2511                Wave/Z PorodConstant
2512                if(!WaveExists(PorodConstant))
2513                        make/O/N=0 PorodConstant, PorodBackground, PorodQmin, PorodQmax, PorodChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave, ScatteringContrastWave, PorodSpecificSurfaceWave
2514                        make/O/N=0/T SampleName
2515                        SetScale/P x 0,1,"1/cm 1/A^4", PorodConstant                    //Unified fit GUI source
2516                        SetScale/P x 0,1,"1/A", PorodQmin, PorodQmax
2517                endif
2518                curlength = numpnts(PorodConstant)
2519                redimension/N=(curlength+1) SampleName, PorodConstant, PorodBackground, PorodQmin, PorodQmax, PorodChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave, ScatteringContrastWave, PorodSpecificSurfaceWave
2520                SampleName[curlength] = DataFolderName
2521                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2522                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2523                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2524                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2525                PorodConstant[curlength] = Porod_Constant
2526                PorodBackground[curlength]=DataBackground
2527                PorodQmin[curlength] = DataQstart
2528                PorodQmax[curlength] = DataQEnd
2529                PorodChiSquare[curlength] = AchievedChiSquare
2530                ScatteringContrastWave[curlength] = ScatteringContrast
2531                PorodSpecificSurfaceWave[curlength] = Porod_SpecificSurface
2532                IR3J_GetTableWithresults()
2533        elseif(stringmatch(SimpleModel,"Sphere"))
2534                //tabulate data for Porod
2535                NewDATAFolder/O/S root:SphereFitResults
2536                Wave/Z SphereRadius
2537                if(!WaveExists(SphereRadius))
2538                        make/O/N=0 SphereRadius, SphereScalingFactor, SphereBackground, SphereQmin, SphereQmax, SphereChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2539                        make/O/N=0/T SampleName
2540                        SetScale/P x 0,1,"A", SphereRadius
2541                        SetScale/P x 0,1,"1/A", SphereQmin, SphereQmax
2542                endif
2543                curlength = numpnts(SphereRadius)
2544                redimension/N=(curlength+1) SampleName,SphereRadius, SphereScalingFactor, SphereBackground, SphereQmin, SphereQmax, SphereChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2545                SampleName[curlength] = DataFolderName
2546                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2547                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2548                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2549                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2550                SphereRadius[curlength] = Sphere_Radius
2551                SphereScalingFactor[curlength] = Sphere_ScalingConstant
2552                SphereBackground[curlength]=DataBackground
2553                SphereQmin[curlength] = DataQstart
2554                SphereQmax[curlength] = DataQEnd
2555                SphereChiSquare[curlength] = AchievedChiSquare
2556                IR3J_GetTableWithresults()
2557        elseif(stringmatch(SimpleModel,"Spheroid"))
2558                //tabulate data for Porod
2559                NewDATAFolder/O/S root:SpheroidFitResults
2560                Wave/Z SpheroidRadius
2561                if(!WaveExists(SpheroidRadius))
2562                        make/O/N=0 SpheroidRadius, SpheroidScalingFactor, SpheroidAspectRatio, SpheroidBackground, SpheroidQmin, SpheroidQmax, SpheroidChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2563                        make/O/N=0/T SampleName
2564                        SetScale/P x 0,1,"A", SpheroidRadius
2565                        SetScale/P x 0,1,"1/A", SpheroidQmin, SpheroidQmax
2566                endif
2567                curlength = numpnts(SpheroidRadius)
2568                redimension/N=(curlength+1) SampleName,SpheroidRadius, SpheroidScalingFactor, SpheroidAspectRatio, SpheroidBackground, SpheroidQmin, SpheroidQmax, SpheroidChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2569                SampleName[curlength]                   = DataFolderName
2570                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2571                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2572                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2573                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2574                SpheroidRadius[curlength]                       = Spheroid_Radius
2575                SpheroidScalingFactor[curlength] = Spheroid_ScalingConstant
2576                SpheroidAspectRatio[curlength]  = Spheroid_Beta
2577                SpheroidBackground[curlength]   = DataBackground
2578                SpheroidQmin[curlength]                 = DataQstart
2579                SpheroidQmax[curlength]                         = DataQEnd
2580                SpheroidChiSquare[curlength]    = AchievedChiSquare
2581                IR3J_GetTableWithresults()
2582        else
2583                print "This model : "+SimpleModel+" cannot be stored in waves, there are no suitable results"
2584
2585        endif
2586       
2587end
2588//*****************************************************************************************************************
2589//*****************************************************************************************************************
2590
2591static Function IR3J_GetTableWithResults()
2592
2593        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2594        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
2595        strswitch(SimpleModel)  // string switch
2596                case "Guinier": // execute if case matches expression
2597                        DoWindow IR3J_GuinierFitResultsTable
2598                        if(V_Flag)
2599                                DoWIndow/F IR3J_GuinierFitResultsTable
2600                        else
2601                                IR3J_GuinierFitResultsTableFnct()
2602                        endif           
2603                        break           // exit from switch
2604                case "Guinier Rod":     // execute if case matches expression
2605                        DoWindow IR3J_GuinierRodFitResultsTable
2606                        if(V_Flag)
2607                                DoWIndow/F IR3J_GuinierRodFitResultsTable
2608                        else
2609                                IR3J_GuinRodFitResTblFnct()
2610                        endif           
2611                        break           // exit from switch
2612                case "Guinier Sheet":   // execute if case matches expression
2613                        DoWindow IR3J_GuinierSheetFitResTable
2614                        if(V_Flag)
2615                                DoWIndow/F IR3J_GuinierSheetFitResTable
2616                        else
2617                                IR3J_GuinSheetFitResTblFnct()
2618                        endif           
2619                        break           // exit from switch
2620                case "Porod":   // execute if case matches expression
2621                        DoWindow IR3J_PorodFitResultsTable
2622                        if(V_Flag)
2623                                DoWindow/F IR3J_PorodFitResultsTable
2624                        else
2625                                IR3J_PorodFitResultsTableFnct()
2626                        endif
2627                        break
2628                case "Sphere":  // execute if case matches expression
2629                        DoWindow IR3J_SphereFFFitResultsTable
2630                        if(V_Flag)
2631                                DoWindow/F IR3J_SphereFFFitResultsTable
2632                        else
2633                                IR3J_SphFFFitResTblFnct()
2634                        endif
2635                        break
2636                case "Spheroid":        // execute if case matches expression
2637                        DoWindow IR3J_SpheroidFFFitResultsTable
2638                        if(V_Flag)
2639                                DoWindow/F IR3J_SpheroidFFFitResultsTable
2640                        else
2641                                IR3J_SpheroidFFFitResTblFnct()
2642                        endif
2643                        break
2644                case "Invariant":       // execute if case matches expression
2645                        DoWindow IR3J_InvResultsTable
2646                        if(V_Flag)
2647                                DoWindow/F IR3J_InvResultsTable
2648                        else
2649                                IR3J_InvResultsTableFnct()
2650                        endif
2651                        break
2652                default:                        // optional default expression executed
2653                        print "This model : "+SimpleModel+" cannot be stored in waves, there are no suitable results"
2654
2655        endswitch
2656
2657end
2658//*****************************************************************************************************************
2659//*****************************************************************************************************************
2660
2661Function IR3J_DeleteExistingModelResults()
2662
2663        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2664        SVAR SimpleModel        = root:Packages:Irena:SimpleFits:SimpleModel
2665        DoAlert /T="This is delete resutls warning" 1, "This will delete all existing results for model : "+SimpleModel+". Do you WANT to continue?"
2666        if(V_Flag==1)
2667                strswitch(SimpleModel)  // string switch
2668                        case "Guinier": // execute if case matches expression
2669                                DoWindow/K/Z IR3J_GuinierFitResultsTable
2670                                if(DataFolderExists("root:GuinierFitResults"))
2671                                        KillDataFolder/Z root:GuinierFitResults:
2672                                        if(V_Flag!=0)
2673                                                DoAlert/T="Could not delete data folder" 0, "Guinier results folder root:GuinierFitResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2674                                        endif
2675                                endif
2676                                break           // exit from switch
2677                        case "Guinier Rod":     // execute if case matches expression
2678                                DoWindow/K/Z IR3J_GuinierRodFitResultsTable
2679                                if(DataFolderExists("root:GuinierRodFitResults"))
2680                                        KillDataFolder/Z root:GuinierRodFitResults:
2681                                        if(V_Flag!=0)
2682                                                DoAlert/T="Could not delete data folder" 0, "Guinier results folder root:GuinierRodFitResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2683                                        endif
2684                                endif
2685                                break           // exit from switch
2686                        case "Guinier Sheet":   // execute if case matches expression
2687                                DoWindow/K/Z IR3J_GuinierSheetFitResTable
2688                                if(DataFolderExists("root:GuinierSheetFitResults"))
2689                                        KillDataFolder/Z root:GuinierSheetFitResults:
2690                                        if(V_Flag!=0)
2691                                                DoAlert/T="Could not delete data folder" 0, "Guinier results folder root:GuinierSheetFitResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2692                                        endif
2693                                endif
2694                                break           // exit from switch
2695                        case "Porod":   // execute if case matches expression
2696                                DoWindow/K/Z  IR3J_PorodFitResultsTable
2697                                if(DataFolderExists("root:PorodFitResults"))
2698                                        KillDataFolder/Z root:PorodFitResults:
2699                                        if(V_Flag!=0)
2700                                                DoAlert/T="Could not delete data folder" 0, "Porod results folder root:PorodFitResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2701                                        endif
2702                                endif
2703                                break
2704                        case "Sphere":  // execute if case matches expression
2705                                DoWindow/K/Z  IR3J_SphereFFFitResultsTable
2706                                if(DataFolderExists("root:SphereFitResults"))
2707                                        KillDataFolder/Z root:SphereFitResults:
2708                                        if(V_Flag!=0)
2709                                                DoAlert/T="Could not delete data folder" 0, "Sphere FF results folder root:SphereFitResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2710                                        endif
2711                                endif
2712                                break
2713                        case "Spheroid":        // execute if case matches expression
2714                                DoWindow/K/Z IR3J_SpheroidFFFitResultsTable
2715                                if(DataFolderExists("root:SpheroidFitResults"))
2716                                        KillDataFolder/Z root:SpheroidFitResults:
2717                                        if(V_Flag!=0)
2718                                                DoAlert/T="Could not delete data folder" 0, "Spheroid FF results folder root:SpheroidFitResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2719                                        endif
2720                                endif
2721                                break
2722                        case "Invariant":       // execute if case matches expression
2723                                DoWindow/K/Z IR3J_InvResultsTable
2724                                if(DataFolderExists("root:InvariantFitResults:"))
2725                                        KillDataFolder/Z root:InvariantFitResults:
2726                                        if(V_Flag!=0)
2727                                                DoAlert/T="Could not delete data folder" 0, "Invariant results folder root:InvariantFitResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2728                                        endif
2729                                endif
2730                                break
2731//                      case "Volume Size Distribution":        // execute if case matches expression
2732//                              DoWindow/K/Z IR3J_VolSDResultsTable
2733//                              if(DataFolderExists("root:VolSizeDistResults"))
2734//                                      KillDataFolder/Z root:VolSizeDistResults:
2735//                                      if(V_Flag!=0)
2736//                                              DoAlert/T="Could not delete data folder" 0, "Volume Size distribution analysis results folder root:VolSizeDistResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2737//                                      endif
2738//                              endif
2739//                              break
2740//                      case "Number Size Distribution":        // execute if case matches expression
2741//                              DoWindow/K/Z IR3J_NumberSDResultsTable
2742//                              if(DataFolderExists("root:NumbSizeDistResults"))
2743//                                      KillDataFolder/Z root:NumbSizeDistResults:
2744//                                      if(V_Flag!=0)
2745//                                              DoAlert/T="Could not delete data folder" 0, "Number Size distribution analysis results folder root:NumbSizeDistResults could not be deleted. It is likely used in some graph or table. Close graphs/tables and try again."
2746//                                      endif
2747//                              endif
2748//                              break
2749                        default:                        // optional default expression executed
2750                endswitch
2751        endif
2752end
2753
2754
2755//*****************************************************************************************************************
2756//*****************************************************************************************************************
2757static Function IR3J_GuinierFitResultsTableFnct() : Table
2758        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2759        DoWIndow IR3J_GuinierFitResultsTable
2760        if(V_Flag)
2761                DoWIndow/F IR3J_GuinierFitResultsTable
2762        else
2763                PauseUpdate             // building window...
2764                DFref oldDf= GetDataFolderDFR()
2765                if(!DataFolderExists("root:GuinierFitResults:"))
2766                        Abort "No Guinier Fit data exist."
2767                endif
2768                SetDataFolder root:GuinierFitResults:
2769                Wave/T SampleName
2770                Wave GuinierRg,GuinierI0,GuinierChiSquare,GuinierQmax,GuinierQmin
2771                Edit/K=1/W=(860,772,1831,1334)/N=IR3J_GuinierFitResultsTable SampleName,GuinierRg,GuinierI0,GuinierChiSquare,GuinierQmax as "Guinier fitting results Table"
2772                AppendToTable GuinierQmin
2773                ModifyTable format(Point)=1,width(SampleName)=304,title(SampleName)="Sample Folder"
2774                ModifyTable alignment(GuinierRg)=1,sigDigits(GuinierRg)=4,title(GuinierRg)="Rg [A]"
2775                ModifyTable alignment(GuinierI0)=1,sigDigits(GuinierI0)=4,width(GuinierI0)=100,title(GuinierI0)="Guinier I0"
2776                ModifyTable alignment(GuinierChiSquare)=1,sigDigits(GuinierChiSquare)=4,width(GuinierChiSquare)=104
2777                ModifyTable title(GuinierChiSquare)="Chi^2",alignment(GuinierQmax)=1,sigDigits(GuinierQmax)=4
2778                ModifyTable width(GuinierQmax)=92,title(GuinierQmax)="Qmax [1/A]",alignment(GuinierQmin)=1
2779                ModifyTable sigDigits(GuinierQmin)=4,width(GuinierQmin)=110,title(GuinierQmin)="Qmin [1/A]"
2780                SetDataFolder oldDf
2781        endif
2782EndMacro
2783//*****************************************************************************************************************
2784static Function IR3J_GuinRodFitResTblFnct() : Table
2785        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2786        DoWIndow IR3J_GuinierRodFitResultsTable
2787        if(V_Flag)
2788                DoWIndow/F IR3J_GuinierRodFitResultsTable
2789        else
2790                PauseUpdate             // building window...
2791                DFref oldDf= GetDataFolderDFR()
2792                if(!DataFolderExists("root:GuinierRodFitResults:"))
2793                        Abort "No Guinier Rod Fit data exist."
2794                endif
2795                SetDataFolder root:GuinierRodFitResults:
2796                Wave/T SampleName
2797                Wave GuinierRc,GuinierI0,GuinierChiSquare,GuinierQmax,GuinierQmin
2798                Edit/K=1/W=(860,772,1831,1334)/N=IR3J_GuinierRodFitResultsTable SampleName,GuinierRc,GuinierI0,GuinierChiSquare,GuinierQmax as "Guinier Rod fitting results Table"
2799                AppendToTable GuinierQmin
2800                ModifyTable format(Point)=1,width(SampleName)=304,title(SampleName)="Sample Folder"
2801                ModifyTable alignment(GuinierRc)=1,sigDigits(GuinierRc)=4,title(GuinierRc)="Rc [A]"
2802                ModifyTable alignment(GuinierI0)=1,sigDigits(GuinierI0)=4,width(GuinierI0)=100,title(GuinierI0)="Guinier I0"
2803                ModifyTable alignment(GuinierChiSquare)=1,sigDigits(GuinierChiSquare)=4,width(GuinierChiSquare)=104
2804                ModifyTable title(GuinierChiSquare)="Chi^2",alignment(GuinierQmax)=1,sigDigits(GuinierQmax)=4
2805                ModifyTable width(GuinierQmax)=92,title(GuinierQmax)="Qmax [1/A]",alignment(GuinierQmin)=1
2806                ModifyTable sigDigits(GuinierQmin)=4,width(GuinierQmin)=110,title(GuinierQmin)="Qmin [1/A]"
2807                SetDataFolder oldDf
2808        endif
2809EndMacro
2810//*****************************************************************************************************************
2811static Function IR3J_GuinSheetFitResTblFnct() : Table
2812        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2813        DoWIndow IR3J_GuinierSheetFitResTable
2814        if(V_Flag)
2815                DoWIndow/F IR3J_GuinierSheetFitResTable
2816        else
2817                PauseUpdate             // building window...
2818                DFref oldDf= GetDataFolderDFR()
2819                if(!DataFolderExists("root:GuinierSheetFitResults:"))
2820                        Abort "No Guinier Sheet Fit data exist."
2821                endif
2822                SetDataFolder root:GuinierSheetFitResults:
2823                Wave/T SampleName
2824                Wave GuinierTh,GuinierI0,GuinierChiSquare,GuinierQmax,GuinierQmin
2825                Edit/K=1/W=(860,772,1831,1334)/N=IR3J_GuinierSheetFitResTable SampleName,GuinierTh,GuinierI0,GuinierChiSquare,GuinierQmax as "Guinier Sheet fitting results Table"
2826                AppendToTable GuinierQmin
2827                ModifyTable format(Point)=1,width(SampleName)=304,title(SampleName)="Sample Folder"
2828                ModifyTable alignment(GuinierTh)=1,sigDigits(GuinierTh)=4,title(GuinierTh)="Tc [A]"
2829                ModifyTable alignment(GuinierI0)=1,sigDigits(GuinierI0)=4,width(GuinierI0)=100,title(GuinierI0)="Guinier I0"
2830                ModifyTable alignment(GuinierChiSquare)=1,sigDigits(GuinierChiSquare)=4,width(GuinierChiSquare)=104
2831                ModifyTable title(GuinierChiSquare)="Chi^2",alignment(GuinierQmax)=1,sigDigits(GuinierQmax)=4
2832                ModifyTable width(GuinierQmax)=92,title(GuinierQmax)="Qmax [1/A]",alignment(GuinierQmin)=1
2833                ModifyTable sigDigits(GuinierQmin)=4,width(GuinierQmin)=110,title(GuinierQmin)="Qmin [1/A]"
2834                SetDataFolder oldDf
2835        endif
2836EndMacro
2837
2838//*****************************************************************************************************************
2839Function IR3J_PorodFitResultsTableFnct() : Table
2840        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2841        DoWIndow IR3J_PorodFitResultsTable
2842        if(V_Flag)
2843                DoWIndow/F IR3J_PorodFitResultsTable
2844        else
2845                PauseUpdate             // building window...
2846                String fldrSav0= GetDataFolder(1)
2847                if(!DataFolderExists("root:PorodFitResults:"))
2848                        Abort "No Porod Fit data exist."
2849                endif
2850                SetDataFolder root:PorodFitResults:
2851                Wave/T SampleName
2852                Wave PorodConstant,PorodBackground,PorodChiSquare, PorodQmax,PorodQmin, ScatteringContrastWave, PorodSpecificSurfaceWave
2853                Edit/K=1/W=(576,346,1528,878)/N=IR3J_PorodFitResultsTable SampleName,PorodConstant,PorodSpecificSurfaceWave, PorodBackground,PorodChiSquare as "Porod fitting results Table"
2854                AppendToTable PorodQmax,PorodQmin, ScatteringContrastWave
2855                ModifyTable format(Point)=1,width(SampleName)=314,title(SampleName)="Sample Folder"
2856                ModifyTable alignment(PorodConstant)=1,sigDigits(PorodConstant)=4,width(PorodConstant)=122
2857                ModifyTable title(PorodConstant)="Porod Constant",alignment(PorodBackground)=1,sigDigits(PorodBackground)=4
2858                ModifyTable width(PorodBackground)=110,title(PorodBackground)="Background",alignment(PorodChiSquare)=1
2859                ModifyTable sigDigits(PorodChiSquare)=4,width(PorodChiSquare)=106,title(PorodChiSquare)="Chi^2"
2860                ModifyTable alignment(PorodQmax)=1,sigDigits(PorodQmax)=4,title(PorodQmax)="Qmax [1/A]"
2861                ModifyTable alignment(PorodQmin)=1,sigDigits(PorodQmin)=4,width(PorodQmin)=94,title(PorodQmin)="Qmin [1/A]"
2862                ModifyTable alignment(PorodSpecificSurfaceWave)=1,sigDigits(PorodSpecificSurfaceWave)=7,width(PorodSpecificSurfaceWave)=94,title(PorodQmin)="Spec Surface [cm2/cm3]"
2863                ModifyTable alignment(ScatteringContrastWave)=1,sigDigits(ScatteringContrastWave)=4,width(ScatteringContrastWave)=94,title(ScatteringContrastWave)="Contrast [10^20 cm^-4]"
2864                SetDataFolder fldrSav0
2865        endif
2866EndMacro
2867//*****************************************************************************************************************
2868Function IR3J_SphFFFitResTblFnct() : Table
2869        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2870        DoWIndow IR3J_SphereFFFitResultsTable
2871        if(V_Flag)
2872                DoWIndow/F IR3J_SphereFFFitResultsTable
2873        else
2874                PauseUpdate             // building window...
2875                String fldrSav0= GetDataFolder(1)
2876                if(!DataFolderExists("root:SphereFitResults:"))
2877                        Abort "No Sphere FF Fit data exist."
2878                endif
2879                SetDataFolder root:SphereFitResults:
2880                Wave/T SampleName
2881                Wave SphereRadius,SphereScalingFactor,SphereBackground,SphereChiSquare,SphereQmax,SphereQmin
2882                Edit/K=1/W=(576,784,1527,1226)/N=IR3J_SphereFFFitResultsTable SampleName,SphereRadius,SphereScalingFactor,SphereBackground as "Sphere FF fiting results table"
2883                AppendToTable SphereChiSquare,SphereQmax,SphereQmin
2884                ModifyTable format(Point)=1,width(SampleName)=330,title(SampleName)="Sample Folder"
2885                ModifyTable alignment(SphereRadius)=1,sigDigits(SphereRadius)=4,width(SphereRadius)=86
2886                ModifyTable title(SphereRadius)="Radius [A]",alignment(SphereScalingFactor)=1,sigDigits(SphereScalingFactor)=4
2887                ModifyTable title(SphereScalingFactor)="Scaling fact.",alignment(SphereBackground)=1
2888                ModifyTable sigDigits(SphereBackground)=4,title(SphereBackground)="Background",alignment(SphereChiSquare)=1
2889                ModifyTable sigDigits(SphereChiSquare)=4,title(SphereChiSquare)="Chi^2",alignment(SphereQmax)=1
2890                ModifyTable sigDigits(SphereQmax)=4,title(SphereQmax)="Qmax [1/A]",alignment(SphereQmin)=1
2891                ModifyTable sigDigits(SphereQmin)=4,width(SphereQmin)=88,title(SphereQmin)="Qmin [1/A]"
2892                SetDataFolder fldrSav0
2893        endif
2894EndMacro
2895//*****************************************************************************************************************
2896
2897Function IR3J_SpheroidFFFitResTblFnct() : Table
2898        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2899        DoWIndow IR3J_SpheroidFFFitResultsTable
2900        if(V_Flag)
2901                DoWIndow/F IR3J_SpheroidFFFitResultsTable
2902        else
2903                PauseUpdate             // building window...
2904                String fldrSav0= GetDataFolder(1)
2905                if(!DataFolderExists("root:SpheroidFitResults:"))
2906                        Abort "No Spheroid FF Fit data exist."
2907                endif
2908                SetDataFolder root:SpheroidFitResults:
2909                Wave/T SampleName
2910                Wave SpheroidRadius,SpheroidAspectRatio,SpheroidScalingFactor,SpheroidChiSquare,SpheroidBackground,SpheroidQmax,SpheroidQmin
2911                Edit/K=1/W=(528,552,1494,1048)/N=IR3J_SpheroidFFFitResultsTable SampleName,SpheroidRadius,SpheroidAspectRatio,SpheroidScalingFactor as "Spheroid FF fitting results table"
2912                AppendToTable SpheroidChiSquare,SpheroidBackground,SpheroidQmax,SpheroidQmin
2913                ModifyTable format(Point)=1,width(SampleName)=306,title(SampleName)="Sample Folder"
2914                ModifyTable alignment(SpheroidRadius)=1,sigDigits(SpheroidRadius)=4,title(SpheroidRadius)="Radius [A]"
2915                ModifyTable alignment(SpheroidAspectRatio)=1,sigDigits(SpheroidAspectRatio)=3,title(SpheroidAspectRatio)="Aspect Ratio"
2916                ModifyTable alignment(SpheroidScalingFactor)=1,sigDigits(SpheroidScalingFactor)=4
2917                ModifyTable title(SpheroidScalingFactor)="Scaling fact.",alignment(SpheroidChiSquare)=1
2918                ModifyTable sigDigits(SpheroidChiSquare)=4,title(SpheroidChiSquare)="Chi^2",alignment(SpheroidBackground)=1
2919                ModifyTable sigDigits(SpheroidBackground)=4,title(SpheroidBackground)="Background"
2920                ModifyTable alignment(SpheroidQmax)=1,sigDigits(SpheroidQmax)=4,title(SpheroidQmax)="Qmax [1/A]"
2921                ModifyTable alignment(SpheroidQmin)=1,sigDigits(SpheroidQmin)=4,title(SpheroidQmin)="Qmin [1/A]"
2922                SetDataFolder fldrSav0
2923        endif
2924EndMacro
2925//*****************************************************************************************************************
2926//
2927//Function IR3J_VolumeSDResTblFnct() : Table
2928//      //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2929//      DoWIndow IR3J_SpheroidFFFitResultsTable
2930//      if(V_Flag)
2931//              DoWIndow/F IR3J_SpheroidFFFitResultsTable
2932//      else
2933//              PauseUpdate             // building window...
2934//              String fldrSav0= GetDataFolder(1)
2935//              if(!DataFolderExists("root:VolSizeDistResults:"))
2936//                      Abort "No Volume Size Distribution analysis data exist."
2937//              endif
2938//              SetDataFolder root:VolSizeDistResults:
2939//              Wave/T SampleName
2940//              Wave Rg,VolumeFraction,MeanDiaVolDist,ModeDiaVolDist,MeadianDiaVolDist 
2941//              Edit/K=1/W=(238,397,1078,679)/N=IR3J_VolSDResultsTable SampleName,Rg,VolumeFraction,MeanDiaVolDist,ModeDiaVolDist as "Volume Size Distribution Analysis"
2942//              AppendToTable MeadianDiaVolDist
2943//              ModifyTable format(Point)=1,width(SampleName)=264,title(SampleName)="Sample name"
2944//              ModifyTable alignment(Rg)=1,sigDigits(Rg)=4,title(Rg)="Rg [A]",alignment(VolumeFraction)=1
2945//              ModifyTable sigDigits(VolumeFraction)=3,title(VolumeFraction)="Vol. Fraction",alignment(MeanDiaVolDist)=1
2946//              ModifyTable sigDigits(MeanDiaVolDist)=4,title(MeanDiaVolDist)="Mean Dia [A]",alignment(ModeDiaVolDist)=1
2947//              ModifyTable sigDigits(ModeDiaVolDist)=4,title(ModeDiaVolDist)="Mode dia [A]",alignment(MeadianDiaVolDist)=1
2948//              ModifyTable sigDigits(MeadianDiaVolDist)=4,width(MeadianDiaVolDist)=100,title(MeadianDiaVolDist)="Meadian Dia [A]"
2949//              SetDataFolder fldrSav0
2950//      endif
2951//EndMacro
2952//*****************************************************************************************************************
2953
2954Function IR3J_InvResultsTableFnct() : Table
2955        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2956        DoWIndow IR3J_InvResultsTable
2957        if(V_Flag)
2958                DoWIndow/F IR3J_InvResultsTable
2959        else
2960                PauseUpdate             // building window...
2961                String fldrSav0= GetDataFolder(1)
2962                if(!DataFolderExists("root:InvariantFitResults:"))
2963                        Abort "No Invariant data exist."
2964                endif
2965                SetDataFolder root:InvariantFitResults:
2966                Wave/T SampleName
2967                Wave InvariantWV, InvariantQmax, TimeWave, TemperatureWave, PercentWave, OrderWave, InvariantIrenaWV, InvContrastWv, InvVolumeFractionWv 
2968                Edit/K=1/W=(238,397,1078,679)/N=IR3J_InvResultsTable SampleName,InvariantWV, InvariantQmax as "Invariant calculation"
2969                AppendToTable  InvariantIrenaWV, InvContrastWv, InvVolumeFractionWv, OrderWave, TimeWave, TemperatureWave, PercentWave
2970                ModifyTable format(Point)=1,width(SampleName)=264,title(SampleName)="Sample name"
2971                ModifyTable alignment(InvariantWV)=1,sigDigits(InvariantWV)=4,title(InvariantWV)="Invariant",alignment(InvariantQmax)=1
2972                ModifyTable sigDigits(InvariantQmax)=3,title(InvariantQmax)="Invariant Qmax"
2973        //      alignment(MeanDiaVolDist)=1
2974        //      ModifyTable sigDigits(MeanDiaVolDist)=4,title(MeanDiaVolDist)="Mean Dia [A]",alignment(ModeDiaVolDist)=1
2975        //      ModifyTable sigDigits(ModeDiaVolDist)=4,title(ModeDiaVolDist)="Mode dia [A]",alignment(MeadianDiaVolDist)=1
2976        //      ModifyTable sigDigits(MeadianDiaVolDist)=4,width(MeadianDiaVolDist)=100,title(MeadianDiaVolDist)="Meadian Dia [A]"
2977                SetDataFolder fldrSav0
2978        endif
2979EndMacro
2980
2981//*****************************************************************************************************************
2982//
2983//Function IR3J_NumberSDResTblFnct() : Table
2984//      PauseUpdate             // building window...
2985//      //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2986//      String fldrSav0= GetDataFolder(1)
2987//      if(!DataFolderExists("root:NumbSizeDistResults:"))
2988//              Abort "No Number Size Distribution analysis data exist."
2989//      endif
2990//      SetDataFolder root:NumbSizeDistResults:
2991//      Wave/T SampleName
2992//      Wave NumPartsPercm3,MeanDiaNumDist,ModeDiaNumDist,MeadianDiaNumDist
2993//      Edit/K=1/W=(238,397,1078,679)/N=IR3J_NumberSDResultsTable SampleName,NumPartsPercm3,MeanDiaNumDist,ModeDiaNumDist,MeadianDiaNumDist as "Volume Size Distribution Analysis"
2994//      ModifyTable format(Point)=1,width(SampleName)=264,title(SampleName)="Sample name"
2995//      ModifyTable alignment(NumPartsPercm3)=1,sigDigits(NumPartsPercm3)=4,title(NumPartsPercm3)="Num Particles [1/cm3]"
2996//      ModifyTable alignment(MeanDiaNumDist)=1, width(NumPartsPercm3)=120
2997//      ModifyTable sigDigits(MeanDiaNumDist)=4,title(MeanDiaNumDist)="Mean Dia [A]",alignment(ModeDiaNumDist)=1
2998//      ModifyTable sigDigits(ModeDiaNumDist)=4,title(ModeDiaNumDist)="Mode dia [A]",alignment(MeadianDiaNumDist)=1
2999//      ModifyTable sigDigits(MeadianDiaNumDist)=4,width(MeadianDiaNumDist)=100,title(MeadianDiaNumDist)="Meadian Dia [A]"
3000//      SetDataFolder fldrSav0
3001//EndMacro
3002//
3003
3004
3005//*****************************************************************************************************************
3006//*****************************************************************************************************************
3007
3008Function IR3J_PopMenuProc(pa) : PopupMenuControl
3009        STRUCT WMPopupAction &pa
3010
3011        switch( pa.eventCode )
3012                case 2: // mouse up
3013                        Variable popNum = pa.popNum
3014                        String popStr = pa.popStr
3015                        if(StringMatch(pa.ctrlName, "SimpleModel" ))
3016                                SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
3017                                SimpleModel = popStr
3018                                IR3J_SetupControlsOnMainpanel()
3019                                KillWaves/Z $("root:Packages:Irena:SimpleFits:ModelLogLogInt")
3020                                KillWaves/Z $("root:Packages:Irena:SimpleFits:ModelLogLogQ")
3021                                KillWIndow/Z IR3J_LinDataDisplay
3022                                KillWindow/Z IR3J_LogLogDataDisplay
3023                                IR3J_CreateCheckGraphs()
3024                                if(StringMatch(SimpleModel, "Invariant" ))
3025                                        IR3J_InvInitializeBackground()
3026                                        IR3J_InvFitBackground()
3027                                endif   
3028                        endif
3029                        if(StringMatch(pa.ctrlName, "InvBackgModel" ))
3030                                SVAR InvBackgModel = root:Packages:Irena:SimpleFits:InvBackgModel
3031                                InvBackgModel = popStr
3032                                IR3J_InvFitBackground()
3033                        endif                   
3034                       
3035                        if(StringMatch(pa.ctrlName, "Corr1DMethodSel" ))
3036                                SVAR Corr1DMethod = root:Packages:Irena:SimpleFits:Corr1DMethod
3037                                Corr1DMethod = popStr
3038                                IR3J_Calculate1DCorrelation()
3039                        endif                   
3040
3041                                                       
3042
3043                        break
3044                case -1: // control being killed
3045                        break
3046        endswitch
3047
3048        return 0
3049End
3050
3051//*****************************************************************************************************************
3052//*****************************************************************************************************************
3053//*****************************************************************************************************************
3054
3055static Function IR3J_SetupControlsOnMainpanel()
3056       
3057        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3058        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
3059        SVAR Corr1DMethod = root:Packages:Irena:SimpleFits:Corr1DMethod
3060        DoWindow IR3J_SimpleFitsPanel
3061        if(V_Flag)
3062
3063                Setvariable Guinier_I0, disable=1
3064                SetVariable Guinier_Rg, disable=1
3065                SetVariable Porod_Constant, disable=1
3066                Setvariable Sphere_ScalingConstant,  disable=1
3067                SetVariable Sphere_Radius, disable=1
3068                Setvariable Spheroid_ScalingConstant,  disable=1
3069                SetVariable Spheroid_Radius, disable=1
3070                Setvariable Spheroid_Beta,  disable=1
3071                SetVariable DataBackground,  disable=1
3072                SetVariable Porod_SpecificSurface, disable=1
3073                SetVariable ScatteringContrast, disable=1
3074                PopupMenu InvBackgModel, disable=1
3075                SetVariable InvBckgMinQ, disable=1
3076                Setvariable InvBckgMaxQ, disable=1
3077                Setvariable invariant, disable=1
3078                TitleBox invariantInfo, disable=1
3079                Setvariable InvQmaxUsed, disable=1
3080                Checkbox InvExtrapolateLowQ, disable=1
3081                SetVariable InvContrast, disable=1
3082                SetVariable InvVolumeFraction, disable=1
3083                SetVariable InvariantIrena, disable=1
3084                PopupMenu Corr1DMethodSel, disable=1
3085                Setvariable Corr1DZmax, disable=1
3086                Setvariable Corr1DWavelength, disable=1
3087               
3088
3089                strswitch(SimpleModel)  // string switch
3090                        case "Guinier": // execute if case matches expression
3091                                Setvariable Guinier_I0, disable=0
3092                                SetVariable Guinier_Rg, disable=0
3093                                break           // exit from switch
3094                        case "Porod":   // execute if case matches expression
3095                                SetVariable Porod_Constant, disable=0
3096                                SetVariable Porod_SpecificSurface, disable=0
3097                                SetVariable ScatteringContrast, disable=0
3098                                SetVariable DataBackground,  disable=0
3099                                break
3100                        case "Sphere":  // execute if case matches expression
3101                                Setvariable Sphere_ScalingConstant,  disable=0
3102                                SetVariable Sphere_Radius, disable=0
3103                                SetVariable DataBackground,  disable=0
3104                                break
3105                        case "Spheroid":        // execute if case matches expression
3106                                Setvariable Spheroid_ScalingConstant,  disable=0
3107                                SetVariable Spheroid_Radius, disable=0
3108                                Setvariable Spheroid_Beta,  disable=0
3109                                SetVariable DataBackground,  disable=0
3110                                break
3111                        case "Invariant":       // execute if case matches expression
3112                                PopupMenu InvBackgModel, disable=0
3113                                SetVariable InvBckgMinQ, disable=0
3114                                Setvariable InvBckgMaxQ, disable=0
3115                                Setvariable invariant, disable=0
3116                                TitleBox invariantInfo, disable=0
3117                                Setvariable InvQmaxUsed, disable=0
3118                                Checkbox InvExtrapolateLowQ, disable=0
3119                                SetVariable InvContrast, disable=0
3120                                SetVariable InvVolumeFraction, disable=0
3121                                SetVariable InvariantIrena, disable=0
3122                                break
3123                        case "1DCorrelation":   // execute if case matches expression
3124                                PopupMenu Corr1DMethodSel, disable=0
3125                                Setvariable Corr1DZmax, disable=0
3126                                Setvariable Corr1DWavelength, disable=0
3127
3128                        default:                        // optional default expression executed
3129
3130                endswitch
3131        endif
3132end
3133
3134//*****************************************************************************************************************
3135//*****************************************************************************************************************
3136//*****************************************************************************************************************
3137
3138FUnction IR3J_InvInitializeBackground()
3139        DoWIndow IR3J_LogLogDataDisplay
3140        if(!V_Flag)
3141                return 0 //nothing to do here... 
3142        endif
3143       
3144        NVAR InvBckgMinQ = root:Packages:Irena:SimpleFits:InvBckgMinQ
3145        NVAR InvBckgMaxQ = root:Packages:Irena:SimpleFits:InvBckgMaxQ
3146        SVAR InvBackgModel = root:Packages:Irena:SimpleFits:InvBackgModel
3147        Wave/Z IntWave = root:Packages:Irena:SimpleFits:OriginalDataIntWave
3148       
3149        if(WaveExists(IntWave))
3150                Wave QWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
3151                variable DataPoints=numpnts(QWave)
3152                if((InvBckgMinQ<QWave[0] || InvBckgMaxQ<QWave[0] || InvBckgMinQ>QWave[DataPoints-1] || InvBckgMaxQ>QWave[DataPoints-1] || InvBckgMinQ>=InvBckgMaxQ) && !(StringMatch(InvBackgModel, "none" )))
3153                        //bad setting for fitting background range.
3154                        InvBckgMinQ= QWave[2*DataPoints/3]
3155                        InvBckgMaxQ= QWave[DataPoints-2]       
3156                endif
3157                CheckDisplayed /W=IR3J_LogLogDataDisplay  IntWave
3158                if(V_Flag>0)
3159                        Cursor/W=IR3J_LogLogDataDisplay /A=1/N=1/P  C  OriginalDataIntWave  BinarySearch(QWave, InvBckgMinQ )
3160                        Cursor/W=IR3J_LogLogDataDisplay /A=1/N=1/P  D  OriginalDataIntWave  BinarySearch(QWave, InvBckgMaxQ )
3161                endif
3162        endif
3163end
3164//*****************************************************************************************************************
3165//*****************************************************************************************************************
3166
3167Function IR3J_InvSyncBckgCursors(variable PreferCursors)
3168        //if PreferCursors=1 overwrite variables with cursors, 0 opposite
3169        DoWIndow IR3J_LogLogDataDisplay
3170        if(!V_Flag)
3171                return 0 //nothing to do here... 
3172        endif
3173        //cursor positions now:
3174        variable MinQcsrP
3175        if(strlen(CsrInfo(C, "IR3J_LogLogDataDisplay")) > 0 && stringMatch(CsrWave(C, "IR3J_LogLogDataDisplay", 0),"OriginalDataIntWave"))
3176                MinQcsrP = pcsr(C, "IR3J_LogLogDataDisplay")
3177        else
3178                MinQcsrP = 0
3179                PreferCursors = 0
3180        endif
3181        variable MaxQcsrP
3182        if(strlen(CsrInfo(D, "IR3J_LogLogDataDisplay")) > 0&& stringMatch(CsrWave(D, "IR3J_LogLogDataDisplay", 0),"OriginalDataIntWave"))
3183                MaxQcsrP = pcsr(D, "IR3J_LogLogDataDisplay")
3184        else
3185                MaxQcsrP = 0
3186                PreferCursors = 0
3187        endif
3188       
3189        NVAR InvBckgMinQ = root:Packages:Irena:SimpleFits:InvBckgMinQ
3190        NVAR InvBckgMaxQ = root:Packages:Irena:SimpleFits:InvBckgMaxQ
3191        Wave QWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
3192        if(PreferCursors)
3193                if(MinQcsrP>0)
3194                        InvBckgMinQ = QWave[MinQcsrP]
3195                endif   
3196                if(MaxQcsrP>0)
3197                        InvBckgMaxQ = QWave[MaxQcsrP]
3198                endif   
3199        else
3200                //set cursors...
3201                Cursor/W=IR3J_LogLogDataDisplay /A=1/N=1/P  C  OriginalDataIntWave  BinarySearch(QWave, InvBckgMinQ )
3202                Cursor/W=IR3J_LogLogDataDisplay /A=1/N=1/P  D  OriginalDataIntWave  BinarySearch(QWave, InvBckgMaxQ )
3203        endif
3204        IR3J_InvFitBackground()
3205
3206end
3207//*****************************************************************************************************************
3208//*****************************************************************************************************************
3209
3210Function IR3J_InvFitBackground()
3211
3212        //check we are doing Invariant and if not, get out...
3213        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
3214        if(!Stringmatch(SimpleModel,"Invariant"))
3215                return 0
3216        endif
3217        dfref OldDf
3218        OldDf = GetDataFolderDFR
3219        setDataFolder root:Packages:Irena:SimpleFits:
3220        SVAR InvBackgModel = root:Packages:Irena:SimpleFits:InvBackgModel
3221        Wave/Z IntWave = root:Packages:Irena:SimpleFits:OriginalDataIntWave
3222        Wave/Z QWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
3223        if(!WaveExists(IntWave)||!WaveExists(QWave))
3224                return 0
3225        endif
3226       
3227        NVAR InvBckgMinQ = root:Packages:Irena:SimpleFits:InvBckgMinQ
3228        NVAR InvBckgMaxQ = root:Packages:Irena:SimpleFits:InvBckgMaxQ
3229        Duplicate/O IntWave, root:Packages:Irena:SimpleFits:InvBckgWave
3230        Wave InvBckgWave = root:Packages:Irena:SimpleFits:InvBckgWave
3231        Wave/Z Ewave = root:Packages:Irena:SimpleFits:OriginalDataErrorWave
3232        if(!WaveExists(Ewave))
3233                Duplicate/Free IntWave, Ewave
3234                Ewave*=0.01
3235        endif
3236        variable StartPnt, EndPnt, V_FitError
3237        StartPnt = BinarySearch(QWave, InvBckgMinQ )
3238        EndPnt   = BinarySearch(QWave, InvBckgMaxQ )
3239        variable A, B, C, D
3240        Wave/Z InvBckgWaveModel = root:Packages:Irena:SimpleFits:InvBckgWaveModel
3241        if(WaveExists(InvBckgWaveModel))        //this is used to show how Porod and Powerlaw fit...
3242                RemoveFromGraph /W=IR3J_LogLogDataDisplay /Z InvBckgWaveModel
3243                KillWaves/Z InvBckgWaveModel, QWaveModel       
3244        endif
3245        //Calculate background to be subtracted based on user input for fn type
3246        If (StringMatch(InvBackgModel, "Gauss Peak" ))
3247                //Print "Fit Function is 'Gaussian'."
3248                Make/N=4/O/D r_bkgd_coef
3249                WaveStats/Q/R=[StartPnt,EndPnt]  IntWave
3250                //A=0.1;B=0.48;C=0.1;D=0.05
3251                //Prompt A,"Coefficient A"
3252                //Prompt B,"Coefficient X0"
3253                //Prompt C,"Coefficient width"
3254                //Prompt D,"Coefficient y0"
3255                A = V_max
3256                B = QWave[V_maxloc]
3257                C = (QWave[EndPnt]-QWave[StartPnt])/5
3258                D = V_min/10   
3259                r_bkgd_coef = {A,B,C,D}
3260                FuncFit/X=1/Q IR3J_Gauss1D kwCWave=r_bkgd_coef IntWave[StartPnt,EndPnt] /X=QWave/W=Ewave/I=1
3261                if(V_FitError>0)
3262                        print "Background function Gauss Peak fit failed"
3263                        InvBckgWave = V_min
3264                else
3265                        InvBckgWave = IR3J_Gauss1D(r_bkgd_coef,QWave)
3266                endif
3267        ElseIf (StringMatch(InvBackgModel, "Exponential" ))
3268                //Print "Fit Function is 'Ruland'."
3269                Make/N=3/O/D r_bkgd_coef
3270                WaveStats/Q/R=[StartPnt,EndPnt]  IntWave
3271                //A=0.1;B=0.48;C=0.1;D=0.05
3272                //Prompt A,"Coefficient A"
3273                //Prompt B,"Coefficient B"
3274                //Prompt D,"Coefficient y0"
3275                A = V_max
3276                B = (ln(IntWave[EndPnt-1]/A))/(QWave[EndPnt-1])^2
3277                D = V_min       
3278                r_bkgd_coef = {A,B,D}
3279                FuncFit/X=1/Q IR3J_Porod_Ruland, r_bkgd_coef, IntWave[StartPnt,EndPnt] /X=QWave/W=Ewave/I=1
3280                if(V_FitError>0)
3281                        print "Background function Exponential fit failed"
3282                        InvBckgWave = V_min
3283                else
3284                        InvBckgWave = IR3J_Porod_Ruland(r_bkgd_coef,QWave)     
3285                endif
3286        ElseIf (StringMatch(InvBackgModel, "Porod+y0" ))
3287                //Print "Fit Function is 'Ruland'."
3288                Make/N=2/O/D r_bkgd_coef, ewaveStep
3289                WaveStats/Q/R=[StartPnt,EndPnt]  IntWave
3290                A = (V_max-V_min)*(QWave[StartPnt]^4)
3291                D = V_min       
3292                r_bkgd_coef = {A,D}
3293                ewaveStep = {0.1*A,0.1*D}
3294                Make/D/T/N=0/O T_Constraints
3295                //find the error wave and make it available, if exists
3296                //Variable V_FitError=0                 //This should prevent errors from being generated
3297                Redimension/N=1 T_Constraints
3298                T_Constraints[0] = {"K1 > 0"}
3299                FuncFit/Q PorodInLogLog, r_bkgd_coef, IntWave[StartPnt,EndPnt]  /C=T_Constraints /X=QWave /E=ewaveStep /W=Ewave /I=1
3300                //InvBckgWave = PorodInLogLog(r_bkgd_coef,QWave)
3301                InvBckgWave = r_bkgd_coef[1]
3302                Duplicate/O/R=[StartPnt,EndPnt] InvBckgWave, InvBckgWaveModel
3303                Duplicate/O/R=[StartPnt,EndPnt] QWave, QWaveModel
3304                InvBckgWaveModel = PorodInLogLog(r_bkgd_coef,QWaveModel)
3305        ElseIf (StringMatch(InvBackgModel, "PowerLaw+y0" ))
3306                //Print "Fit Function is 'Ruland'."
3307                Make/N=3/O/D r_bkgd_coef, ewaveStep
3308                WaveStats/Q/R=[StartPnt,EndPnt]  IntWave
3309                Make/D/T/N=0/O T_Constraints
3310                //find the error wave and make it available, if exists
3311                //Variable V_FitError=0                 //This should prevent errors from being generated
3312                A = (V_max-V_min)*(QWave[StartPnt]^3.7)
3313                B = 3.5
3314                D = V_min       >0 ? V_min : abs(IntWave[EndPnt-3])
3315                Redimension/N=4 T_Constraints
3316                T_Constraints[0] = {"K0 > 0"}
3317                T_Constraints[1] = {"K1 > 1"}
3318                T_Constraints[2] = {"K1 < 5"}
3319                T_Constraints[3] = {"K2 > 0"}
3320                r_bkgd_coef = {A,B,D}
3321                ewaveStep = {0.1*A,0.03*B,0.1*D}
3322                //print " "
3323                //print r_bkgd_coef
3324                FuncFit/Q IR3J_PowerLawAndFlat, r_bkgd_coef, IntWave[StartPnt,EndPnt] /C=T_Constraints /X=QWave /E=ewaveStep /W=Ewave /I=1
3325                //print r_bkgd_coef
3326                InvBckgWave = r_bkgd_coef[2]
3327                Duplicate/O/R=[StartPnt,EndPnt] InvBckgWave, InvBckgWaveModel
3328                Duplicate/O/R=[StartPnt,EndPnt] QWave, QWaveModel
3329                InvBckgWaveModel = IR3J_PowerLawAndFlat(r_bkgd_coef,QWaveModel)
3330        ElseIf (StringMatch(InvBackgModel, "Constant" ))
3331                InvBckgWave = sum(IntWave, StartPnt, EndPnt) / (EndPnt - StartPnt)
3332        ElseIf (StringMatch(InvBackgModel, "None" ))
3333                WaveStats/Q/R=[StartPnt,EndPnt]  IntWave
3334                InvBckgWave = V_min/10
3335        EndIf
3336       
3337        CheckDisplayed /W=IR3J_LogLogDataDisplay IntWave, InvBckgWave
3338        if(V_Flag==1)
3339                AppendToGraph /W=IR3J_LogLogDataDisplay InvBckgWave vs QWave
3340                ModifyGraph rgb(InvBckgWave)=(0,0,0)
3341        endif
3342        Wave/Z InvBckgWaveModel
3343        if(WaveExists(InvBckgWaveModel))
3344                CheckDisplayed /W=IR3J_LogLogDataDisplay IntWave, InvBckgWaveModel
3345                if(V_Flag)
3346                        AppendToGraph /W=IR3J_LogLogDataDisplay InvBckgWaveModel vs QWaveModel
3347                        ModifyGraph lstyle(InvBckgWaveModel)=3,rgb(InvBckgWaveModel)=(1,12815,52428)
3348                endif
3349        endif
3350        setDataFolder OldDf
3351end
3352
3353//*****************************************************************************************************************
3354//*****************************************************************************************************************
3355Function IR3J_PowerLawAndFlat(w,q) : FitFunc
3356        Wave w
3357        Variable q
3358
3359        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
3360        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
3361        //CurveFitDialog/ Equation:
3362        //CurveFitDialog/ Prefactor=abs(Prefactor)
3363        //CurveFitDialog/ Slope=abs(slope)
3364        //CurveFitDialog/ f(q) = Prefactor*q^(-Slope)
3365        //CurveFitDialog/ End of Equation
3366        //CurveFitDialog/ Independent Variables 1
3367        //CurveFitDialog/ q
3368        //CurveFitDialog/ Coefficients 2
3369        //CurveFitDialog/ w[0] = Prefactor
3370        //CurveFitDialog/ w[1] = Slope
3371        //CurveFitDialog/ w[2] = Flat Background
3372
3373        w[0]=abs(w[0])
3374        w[1]=abs(w[1])
3375        return w[0]*q^(-w[1])+w[2]
3376End
3377
3378//*****************************************************************************************************************
3379//*****************************************************************************************************************
3380Function IR3J_CalculateInvariant()
3381
3382        dfref oldDF
3383        OldDf = GetDataFolderDFR
3384        setDataFolder root:Packages:Irena:SimpleFits:
3385        NVAR Invariant =        root:Packages:Irena:SimpleFits:invariant
3386        NVAR DataQEnd =         root:Packages:Irena:SimpleFits:DataQEnd
3387        NVAR DataQstart =       root:Packages:Irena:SimpleFits:DataQstart
3388        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
3389        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
3390        SVAR InvBackgModel = root:Packages:Irena:SimpleFits:InvBackgModel
3391        Wave IntWave = root:Packages:Irena:SimpleFits:OriginalDataIntWave
3392        Wave QWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
3393        NVAR InvBckgMinQ = root:Packages:Irena:SimpleFits:InvBckgMinQ
3394        NVAR InvBckgMaxQ = root:Packages:Irena:SimpleFits:InvBckgMaxQ
3395        NVAR InvQmaxUsed =      root:Packages:Irena:SimpleFits:InvQmaxUsed
3396        NVAR InvExtrapolateLowQ = root:Packages:Irena:SimpleFits:InvExtrapolateLowQ
3397        NVAR InvariantIrena = root:Packages:Irena:SimpleFits:InvariantIrena                                                     //this is in 1/cm4
3398       
3399        Wave InvBckgWave = root:Packages:Irena:SimpleFits:InvBckgWave
3400        variable StartPnt, EndPnt
3401        StartPnt = BinarySearch(QWave, InvBckgMinQ )
3402        EndPnt   = BinarySearch(QWave, InvBckgMaxQ )
3403       
3404        DoWIndow IR3J_LogLogDataDisplay
3405        if(V_Flag!=1)
3406                return 0
3407        endif
3408
3409        Duplicate/O IntWave, InvariantIntWaveCorr
3410        //Correct data for background and add corrected data to graph
3411        InvariantIntWaveCorr = IntWave - InvBckgWave
3412        CheckDisplayed /W=IR3J_LogLogDataDisplay InvariantIntWaveCorr
3413        if(!V_Flag)
3414                AppendToGraph/W=IR3J_LogLogDataDisplay InvariantIntWaveCorr vs QWave
3415                ModifyGraph/W=IR3J_LogLogDataDisplay rgb(InvariantIntWaveCorr)=(0,65535,0)
3416        endif
3417        //Calculate q^2*I(q) for integral
3418        Duplicate/Free InvariantIntWaveCorr, Integrand
3419        Integrand = InvariantIntWaveCorr*QWave^2
3420        //endforce use of A and B cursors to limit Q range if needed
3421        Duplicate/Free/R=[DataQstartPoint, DataQEndPoint] Integrand, IntegrandTrimmed
3422        Duplicate/O/R=[DataQstartPoint, DataQEndPoint] QWave, QWaveTrimmed
3423        if(InvExtrapolateLowQ)          //this will add Q=0 point with intensity of Q[1] point
3424                InsertPoints  0, 0, IntegrandTrimmed, QWaveTrimmed
3425                QWaveTrimmed[0] = 0
3426                IntegrandTrimmed[0]=IntegrandTrimmed[1]
3427        endif
3428        Duplicate/O Integrand, IntegrantInt
3429        //Integrate, divide by 2*pi^2 when calculating from 1D I(q) data.
3430        Integrate/T IntegrandTrimmed /X=QWaveTrimmed/D=IntegrantInt
3431        IntegrantInt = IntegrantInt/(2*pi^2)           
3432        //Correct Output for unit
3433        //Divide twice by re to put I(q) in terms of e-^2/cm^3
3434        //Divide twice by Avogadro's Number to convert # of e- into mol e-
3435        //Convert from 1/A to 1/cm for q (three times)
3436        //Final units should be (mol e-/cm^3)^2
3437        variable COnversionScale=(1e8)^3/(2.81794e-13)^2/(6.022e23)^2
3438        IntegrantInt = IntegrantInt*COnversionScale
3439                       
3440        //Add Integrand_int to graph with Iq^2
3441        CheckDisplayed /W=IR3J_LogLogDataDisplay IntegrantInt
3442        if(!V_Flag)
3443                AppendToGraph/R/W=IR3J_LogLogDataDisplay IntegrantInt vs QWaveTrimmed
3444                //Label/W=IR3J_LogLogDataDisplay right "\\K(65535,0,0)\\Z14Invariant (cm\\S-1\\M\\Z14A\\S-3\\M\\Z14)"
3445                //SetAxis/W=IR3J_LogLogDataDisplay right 8.0271834e-10,8.792794e-05
3446                ModifyGraph/W=IR3J_LogLogDataDisplay log(right)=1,standoff(right)=0
3447                Label/W=IR3J_LogLogDataDisplay right "(mol e\\S-2\\Mcm\\S3\\M)\\S3"
3448        endif
3449        //Determine point at which slope of integral becomes zero and use that value as Q
3450        //checks value of integrand_int_DIF_smth at [index], and if is < 0, records Q
3451        //Need to use < 0 because is unlikely to be exactly 0, but will go from (+) to (-)
3452        Duplicate/Free IntegrantInt IntegrantInt_DIF IntegrantInt_DIF_smth
3453        Differentiate IntegrantInt /X=QWaveTrimmed/D=IntegrantInt_DIF
3454        IntegrantInt_DIF_smth = IntegrantInt_DIF
3455        Smooth/EVEN/B 20, IntegrantInt_DIF_smth
3456
3457        variable index, NumPntsMax=numpnts(IntegrantInt_DIF_smth)
3458        invariant=0
3459        index=0
3460        do
3461                if(IntegrantInt_DIF_smth[index]<0)               
3462                        invariant=IntegrantInt[index]
3463                endif
3464                index = index+1
3465        while(invariant==0 && index<NumPntsMax )                                                               
3466        if(invariant==0)
3467                invariant = IntegrantInt[NumPntsMax-1]  //no cross o ver with 0 found.
3468                index = NumPntsMax-1
3469        endif
3470        //now calculate volume fraction
3471        InvariantIrena= invariant * (2*pi^2) * 10^24 / ConversionScale
3472        NVAR InvContrast = root:Packages:Irena:SimpleFits:InvContrast
3473        NVAR InvVolumeFraction = root:Packages:Irena:SimpleFits:InvVolumeFraction
3474        InvVolumeFraction = (InvariantIrena / InvContrast) *1e-20/(2*pi^2)              //4/14/2014, JIL, this is really phi*(1-phi).
3475        if(InvVolumeFraction>0.249)
3476                print "Calculated volume is too large when we do phi*(1-phi). Seems like there is problem with calibration of contrast"
3477                InvVolumeFraction = NaN
3478        else
3479                InvVolumeFraction = (1-sqrt(1-4*InvVolumeFraction))/2                                   //this is quadratic equation solver
3480        endif
3481       
3482
3483
3484        //this is now done higher above to get output data in same units.
3485        //Correct Output for unit
3486        //Divide twice by re to put I(q) in terms of e-^2/cm^3
3487        //Divide twice by Avogadro's Number to convert # of e- into mol e-
3488        //Convert from 1/A to 1/cm for q (three times)
3489        //Final units should be (mol e-/cm^3)^2
3490        //invariant = invariant*(1e8)^3/(2.81794e-13)^2/(6.022e23)^2
3491        InvQmaxUsed = QWaveTrimmed[index-1]
3492//      //Report final values
3493//      Print "**********************************************"
3494//      //Print "Input wave is",rwave_str
3495//      Print "The invariant is",invariant,"(mol e-^2/cm^3)^3"
3496//      Print "Value of q for invariant is",QWaveTrimmed[index-1]
3497//      Print "**********************************************" 
3498        setDataFolder OldDf
3499end
3500
3501
3502
3503//*****************************************************************************************************************
3504//*****************************************************************************************************************
3505//*****************************************************************************************************************
3506Function IR3J_Calculate1DCorrelation()
3507
3508        dfref oldDF
3509        OldDf = GetDataFolderDFR
3510        setDataFolder root:Packages:Irena:SimpleFits:
3511        NVAR DataQEnd =         root:Packages:Irena:SimpleFits:DataQEnd
3512        NVAR DataQstart =       root:Packages:Irena:SimpleFits:DataQstart
3513        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
3514        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
3515        SVAR Corr1DMethod = root:Packages:Irena:SimpleFits:Corr1DMethod
3516        NVAR Zmax = root:Packages:Irena:SimpleFits:Corr1DZmax
3517        SVAR DataFolderName = root:Packages:Irena:SimpleFits:DataFolderName
3518        //SVAR ListOfCorr1DMethod = "Anisotropic (abs, Strobl);Anisotropic (norm);Isotropic (norm);"
3519
3520        Wave IntWave = root:Packages:Irena:SimpleFits:OriginalDataIntWave
3521        Wave QWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
3522       
3523        DoWIndow IR3J_LogLogDataDisplay
3524        if(V_Flag!=1)
3525                return 0
3526        endif
3527
3528        //Create output waves for integration
3529        Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] IntWave, IntWaveTemp, KwaveTemp,integrand,integrand_int, rwave_eu,rwave_meu
3530        Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] IntWave, GammawaveTemp,upper,lower,upper_int,lower_int
3531        Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] Qwave, QwaveTemp, ZwaveTemp, be,X2T
3532
3533        Variable index,counter
3534
3535        //Create wave of Z values from 0 to Zmax
3536        index = numpnts(ZwaveTemp)-1
3537        ZwaveTemp = x*Zmax/index                                               
3538
3539        //Convert I(q) from units of cm^-1 to electron units (See Roe, pp. 12-13)
3540        //Need wavelength, use 1.542 for Cu-ka in Angstroms.
3541        //Calculating be is almost pointless b/c be is almost exactly equal to re
3542        //Need to convert units of rwave_eu into mol e- TWICE.  Can only do once here b/c
3543        //IGOR can't handle number size.
3544        X2T = 2*asin(1.542*QwaveTemp/4/pi)                             
3545        be = (2.81794e-13)*sqrt((1+cos(X2T))/2)         //in units of cm
3546        rwave_eu = IntWaveTemp/be^2                                             //in units of (# electrons)^2/cm^3
3547        rwave_meu = rwave_eu/6.022e23                                   //Convert from electrons to mol e- (first time)
3548               
3549        //Create a loop that calculates K(z) or Gamma(z) for each value of z in zwave.
3550        counter = 0
3551        Do
3552                //Strobl approach
3553                If(StringMatch(Corr1DMethod, "Anisotropic (abs, Strobl)"))                                                             
3554                        Integrand = 4*pi*QwaveTemp^2*rwave_meu*cos(QwaveTemp*ZwaveTemp[counter])
3555                        Integrate/T Integrand /X=QwaveTemp/D=Integrand_int
3556                        KwaveTemp[counter]=Integrand_int[index]/(2*pi)^3
3557               
3558                //Roe approach for anisotropic data
3559                ElseIf(StringMatch(Corr1DMethod, "Anisotropic (norm)"))                                                         
3560                        Upper = IntWaveTemp*cos(QwaveTemp*ZwaveTemp[counter])
3561                        Integrate/T Upper /X=QwaveTemp/D=Upper_int
3562                        Lower = IntWaveTemp
3563                        Integrate/T Lower /X=QwaveTemp/D=Lower_int
3564                        GammawaveTemp[counter]=Upper_int[index]/Lower_int[index]
3565               
3566                //Roe approach for isotropic data
3567                ElseIf(StringMatch(Corr1DMethod, "Isotropic (norm)"))                                                   
3568                        Upper = QwaveTemp^2*IntWaveTemp*cos(QwaveTemp*ZwaveTemp[counter])
3569                        Integrate/T Upper /X=QwaveTemp/D=Upper_int
3570                        Lower = QwaveTemp^2*IntWaveTemp
3571                        Integrate/T Lower /X=QwaveTemp/D=Lower_int
3572                        GammawaveTemp[counter]=Upper_int[index]/Lower_int[index]
3573               
3574                EndIf
3575                counter = counter+1
3576        While(counter<=index)
3577
3578        Print "1D correlation function calculated for ",DataFolderName
3579        //Strobl approach
3580        If(StringMatch(Corr1DMethod, "Anisotropic (abs, Strobl)"))                                                             
3581                Print "Method: anisotropic scattering with absolute units (Strobl)."           
3582        //Roe approach for anisotropic data
3583        ElseIf(StringMatch(Corr1DMethod, "Anisotropic (norm)"))                                                         
3584                Print "Method: anisotropic scattering, normalized (Roe, Vonk & Kortleve)"               
3585        //Roe approach for isotropic data
3586        ElseIf(StringMatch(Corr1DMethod, "Isotropic (norm)"))                                                   
3587                Print "Method: isotropic scattering, normalized (Roe, Vonk & Kortleve)"         
3588        EndIf
3589
3590        //Correct intensity scaling
3591        KwaveTemp = KwaveTemp*1e24                                                      //Change units of q from 1/A to 1/cm (^3)
3592        KwaveTemp = KwaveTemp/6.022e23                                          //Second conversion to mol e- from number e-
3593       
3594        //output in graph...
3595        DoWindow IR3J_LinDataDisplay
3596        if(V_Flag)
3597                GetWindow IR3J_LinDataDisplay wsize
3598        endif
3599        KillWindow/Z IR3J_LinDataDisplay
3600        IR3J_CreateCheckGraphs()
3601        if(V_left+V_right+V_top+V_bottom >200)
3602                moveWindow /W=IR3J_LinDataDisplay V_left, V_top,V_right, V_bottom
3603        else
3604                AutoPositionWindow/M=1/R=IR3J_LogLogDataDisplay IR3J_LinDataDisplay     
3605        endif
3606        Duplicate/O ZwaveTemp, ZWave
3607        //Strobl approach
3608        If(StringMatch(Corr1DMethod, "Anisotropic (abs, Strobl)"))                     
3609                DoWindow/T IR3J_LinDataDisplay,"Corr. Func. Aniso. Scat. abs. Strobl : K vs Z"                                 
3610                Duplicate/O KwaveTemp Kwave             
3611                AppendToGraph/L/W=IR3J_LinDataDisplay Kwave vs ZWave
3612                ModifyGraph/W=IR3J_LinDataDisplay log=0,standoff(left)=0
3613                Label/W=IR3J_LinDataDisplay left "K(z) [(mol e\\S-\\M/cm\\S3\\M)\\S2\\M]"
3614                Label/W=IR3J_LinDataDisplay bottom "z [A]"
3615                ModifyGraph log(left)=0,log(bottom)=0,tick=2,tick(left)=2,zero(left)=2,standoff(left)=0
3616                Legend/C/N=text0/F=0/A=RT "\\s(Kwave) "+DataFolderName
3617
3618        //Roe approach for anisotropic data
3619        ElseIf(StringMatch(Corr1DMethod, "Anisotropic (norm)"))                                                         
3620                DoWindow/T IR3J_LinDataDisplay,"Corr. Func. Aniso. Scat. norm. (Roe, Vonk & Kortleve) : GammaA vs Z"                                   
3621                Duplicate/O GammawaveTemp GammaA_wave                   
3622                AppendToGraph/L/W=IR3J_LinDataDisplay GammaA_wave vs ZWave
3623                ModifyGraph/W=IR3J_LinDataDisplay log=0,standoff(left)=0
3624                Label/W=IR3J_LinDataDisplay left "Gamma(z) (dimensionless)"
3625                Label/W=IR3J_LinDataDisplay bottom "z [A]"
3626                ModifyGraph log(left)=0,log(bottom)=0,tick=2,tick(left)=2,zero(left)=2,standoff(left)=0
3627                Legend/C/N=text0/F=0/A=RT "\\s(Kwave) "+DataFolderName
3628
3629        //Roe approach for isotropic data
3630        ElseIf(StringMatch(Corr1DMethod, "Isotropic (norm)"))                                                   
3631                DoWindow/T IR3J_LinDataDisplay,"Corr. Func. Iso. Scat. norm. (Roe, Vonk & Kortleve) : GammaI vs Z"                                     
3632                Duplicate/O GammawaveTemp GammaI_wave                           
3633                AppendToGraph/L/W=IR3J_LinDataDisplay GammaI_wave vs ZWave
3634                ModifyGraph/W=IR3J_LinDataDisplay log=0,standoff(left)=0
3635                Label/W=IR3J_LinDataDisplay left "Gamma(z) (dimensionless)"
3636                Label/W=IR3J_LinDataDisplay bottom "z [A]"
3637                ModifyGraph log(left)=0,log(bottom)=0,tick=2,tick(left)=2,zero(left)=2,standoff(left)=0
3638                Legend/C/N=text0/F=0/A=RT "\\s(Kwave) "+DataFolderName
3639
3640        EndIf
3641        setDataFolder OldDf
3642end
3643
3644
3645//*****************************************************************************************************************
3646//*****************************************************************************************************************
Note: See TracBrowser for help on using the repository browser.