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

Last change on this file since 938 was 938, checked in by ilavsky, 2 years ago

Igor 9 related changes

  • Property svn:eol-style set to native
File size: 125.3 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=1.11
3constant IR3JversionNumber = 0.3                        //Simple Fit panel version number
4
5//*************************************************************************\
6//* Copyright (c) 2005 - 2020, 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
15//1.1 combined this ipf with "Simple fits models"
16//1.0 Simple Fits tool first release version
17
18
19//To add new function:
20//at this moment we have:       ListOfSimpleModels="Guinier;Porod;Sphere;Spheroid;Guinier Rod;Guinier Sheet;"
21//IR3J_InitSimpleFits()
22//                      add to: ListOfSimpleModels list as new data type ("Guinier")
23//                      add any new parameters, which will need to be fit. Keep in mind, all will be fit.
24//IR3J_SimpleFitsPanelFnct()
25//                      set controsl for the new parameters.
26//IR3J_PopMenuProc()
27//                      make sure controls show as needed only
28//IR3J_CreateLinearizedData()
29//                      create new linearized data if needed. Example: Guiniers, Porod...
30//IR3J_AppendDataToGraphModel()
31//                      if linearized data exist, append them here...
32//IR3J_CalculateModel()
33//                      Add model calculations here...
34//IR3J_FitData()
35//                      Add fitting function and fit here.                             
36//IR3J_SaveResultsToNotebook()
37//IR3J_SaveResultsToFolder()
38//IR3J_SaveResultsToWaves()
39//                      Add to both of these above string results in appropriate media...
40//IR3J_GetTableWithResults()
41//                      here create proper table to present to users...
42//IR3J_DeleteExistingModelResults()
43//                      add here how to delete new data types being created...
44//add also results type to IR2_PanelControLProcedures.ipf
45//                      Procedrfue is IR2C_InitControls
46//existing:     AllCurrentlyAllowedTypes+="SimFitYGuinier;SimFitYGuinierR;SimFitYGuinierS;SimFitYSphere;SimFitYSpheroid;"
47
48///******************************************************************************************
49///******************************************************************************************
50///******************************************************************************************
51///******************************************************************************************
52Function IR3J_SimpleFits()
53
54        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
55        IN2G_CheckScreenSize("width",1200)
56        DoWIndow IR3J_SimpleFitsPanel
57        if(V_Flag)
58                DoWindow/F IR3J_SimpleFitsPanel
59        else
60                IR3J_InitSimpleFits()
61                IR1T_InitFormFactors()
62                IR3J_SimpleFitsPanelFnct()
63                ING2_AddScrollControl()
64                IR1_UpdatePanelVersionNumber("IR3J_SimpleFitsPanel", IR3JversionNumber,1)
65                IR3C_MultiUpdListOfAvailFiles("Irena:SimpleFits")       
66        endif
67        IR3J_CreateCheckGraphs()
68end
69//************************************************************************************************************
70Function IR1B_SimpleFitsMainCheckVersion()     
71        DoWindow IR3J_SimpleFitsPanel
72        if(V_Flag)
73                if(!IR1_CheckPanelVersionNumber("IR3J_SimpleFitsPanel", IR3JversionNumber))
74                        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?"
75                        if(V_flag==1)
76                                KillWIndow/Z IR3J_SimpleFitsPanel
77                                IR3J_SimpleFits()
78                        else            //at least reinitialize the variables so we avoid major crashes...
79                                IR3J_InitSimpleFits()
80                                IR1T_InitFormFactors()
81                        endif
82                endif
83        endif
84end
85
86//************************************************************************************************************
87//************************************************************************************************************
88//************************************************************************************************************
89//************************************************************************************************************
90Function IR3J_SimpleFitsPanelFnct()
91        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
92        PauseUpdate; Silent 1           // building window...
93        NewPanel /K=1 /W=(2.25,43.25,530,800) as "Multi Sample Fits"
94        DoWIndow/C IR3J_SimpleFitsPanel
95        TitleBox MainTitle title="Simple & Basic Analysis tool",pos={140,2},frame=0,fstyle=3, fixedSize=1,font= "Times New Roman", size={360,30},fSize=22,fColor=(0,0,52224)
96        string UserDataTypes=""
97        string UserNameString=""
98        string XUserLookup=""
99        string EUserLookup=""
100        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)
101        IR3C_MultiAppendControls("Irena:SimpleFits","IR3J_SimpleFitsPanel", "IR3J_CopyAndAppendData","",1,0)
102        //hide what is not needed
103        checkbox UseResults, disable=0
104        SetVariable DataQEnd,pos={290,90},size={170,15}, proc=IR3J_SetVarProc,title="Q max for fitting    "
105        Setvariable DataQEnd, variable=root:Packages:Irena:SimpleFits:DataQEnd, limits={-inf,inf,0}
106        SetVariable DataQstart,pos={290,110},size={170,15}, proc=IR3J_SetVarProc,title="Q min for fitting     "
107        Setvariable DataQstart, variable=root:Packages:Irena:SimpleFits:DataQstart, limits={-inf,inf,0}
108        SetVariable DataBackground,pos={280,130},size={170,15}, proc=IR3J_SetVarProc,title="Background    "
109        Setvariable DataBackground, variable=root:Packages:Irena:SimpleFits:DataBackground, limits={-inf,inf,0}
110
111        Button SelectAll,pos={200,680},size={80,15}, proc=IR3J_ButtonProc,title="SelectAll", help={"Select All data in Listbox"}
112
113        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"}
114
115        PopupMenu SimpleModel,pos={280,175},size={200,20},fStyle=2,proc=IR3J_PopMenuProc,title="Model to fit : "
116        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
117        PopupMenu SimpleModel,mode=1,popvalue=SimpleModel,value= #"root:Packages:Irena:SimpleFits:ListOfSimpleModels"
118       
119        //Guinier controls
120        SetVariable Guinier_I0,pos={240,230},size={220,15}, proc=IR3J_SetVarProc,title="Scaling I0  ", bodywidth=80
121        Setvariable Guinier_I0, variable=root:Packages:Irena:SimpleFits:Guinier_I0, limits={1e-20,inf,0}, help={"Guinier prefactor I0"}
122        SetVariable Guinier_Rg,pos={240,260},size={220,15}, proc=IR3J_SetVarProc,title="Rg [A] ", bodywidth=80
123        Setvariable Guinier_Rg, variable=root:Packages:Irena:SimpleFits:Guinier_Rg, limits={3,inf,0}, help={"Guinier Rg value"}
124        //Porod
125        SetVariable Porod_Constant,pos={240,230},size={220,15}, proc=IR3J_SetVarProc,title="Porod Constant ", bodywidth=80
126        Setvariable Porod_Constant, variable=root:Packages:Irena:SimpleFits:Porod_Constant, limits={1e-20,inf,0}, help={"Porod constant"}
127        //Sphere controls
128        SetVariable Sphere_ScalingConstant,pos={240,230},size={220,15}, proc=IR3J_SetVarProc,title="Scaling ", bodywidth=80
129        Setvariable Sphere_ScalingConstant, variable=root:Packages:Irena:SimpleFits:Sphere_ScalingConstant, limits={1e-20,inf,0}, help={"Scaling prefactor, I0"}
130        SetVariable Sphere_Radius,pos={240,260},size={220,15}, proc=IR3J_SetVarProc,title="Radius [A] ", bodywidth=80
131        Setvariable Sphere_Radius, variable=root:Packages:Irena:SimpleFits:Sphere_Radius, limits={3,inf,0}, help={"Radius of a sphere"}
132
133        //Guinier controls
134        SetVariable Spheroid_ScalingConstant,pos={240,230},size={220,15}, proc=IR3J_SetVarProc,title="Scaling ", bodywidth=80
135        Setvariable Spheroid_ScalingConstant, variable=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant, limits={1e-20,inf,0}, help={"Scaling constant"}
136        SetVariable Spheroid_Radius,pos={240,260},size={220,15}, proc=IR3J_SetVarProc,title="Radius [A] ", bodywidth=80
137        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"}
138        SetVariable Spheroid_Beta,pos={240,290},size={220,15}, proc=IR3J_SetVarProc,title="Beta (RxRxBR)", bodywidth=80
139        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"}
140        SetVariable DataBackground,pos={240,320},size={220,15}, proc=IR3J_SetVarProc,title="Flat Background ", bodywidth=80
141        Setvariable DataBackground, variable=root:Packages:Irena:SimpleFits:DataBackground, limits={-inf,inf,0}, help={"Flat background for scattering intensity"}
142        Button FitCurrentDataSet,pos={280,450},size={180,20}, proc=IR3J_ButtonProc,title="Fit Current (one) Dataset", help={"Fit current data set"}
143
144        Button FitSelectionDataSet,pos={280,480},size={180,20}, proc=IR3J_ButtonProc,title="Fit (All) Selected Data", help={"Fit all data selected in listbox"}
145
146        SetVariable AchievedChiSquare,pos={270,510},size={220,15}, noproc,title="Achieved chi-square"
147        Setvariable AchievedChiSquare, variable=root:Packages:Irena:SimpleFits:AchievedChiSquare, disable=2, limits={0,inf,0}, format="%3.2f"
148
149        Checkbox SaveToNotebook, pos={280,537},size={76,14},title="Record to Notebook?", noproc, variable=root:Packages:Irena:SimpleFits:SaveToNotebook, help={"Record results in notebook"}
150        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"}
151        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"}
152
153        Button RecordCurrentresults,pos={280,590},size={180,20}, proc=IR3J_ButtonProc,title="Record Results", help={"Record results in notebook and table"}
154
155        Button GetTableWithResults,pos={280,620},size={180,20}, proc=IR3J_ButtonProc,title="Get Table With Results", help={"Open Table with results for current Model"}
156
157        Button GetNotebookWithResults,pos={280,650},size={180,20}, proc=IR3J_ButtonProc,title="Get Notebook With Results", help={"Open Notebook with results for current Model"}
158
159        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)
160
161        SetVariable DelayBetweenProcessing,pos={260,735},size={220,15}, noproc,title="Delay between Processing ", bodywidth=80
162        Setvariable DelayBetweenProcessing, variable=root:Packages:Irena:SimpleFits:DelayBetweenProcessing, limits={0,20,0.2}, help={"Delay between two processing steps, set o 0 for none. "}
163
164
165        TitleBox Instructions1 title="\Zr100Double click to add data to graph",size={330,15},pos={4,680},frame=0,fColor=(0,0,65535),labelBack=0
166        TitleBox Instructions2 title="\Zr100Shift-click to select range of data",size={330,15},pos={4,695},frame=0,fColor=(0,0,65535),labelBack=0
167        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
168        TitleBox Instructions4 title="\Zr100Regex for not contain: ^((?!string).)*$",size={330,15},pos={4,725},frame=0,fColor=(0,0,65535),labelBack=0
169        TitleBox Instructions5 title="\Zr100Regex for contain:  string, two: str2.*str1",size={330,15},pos={4,740},frame=0,fColor=(0,0,65535),labelBack=0
170        TitleBox Instructions6 title="\Zr100Regex for case independent:  (?i)string",size={330,15},pos={4,755},frame=0,fColor=(0,0,65535),labelBack=0
171       
172        //and fix which controls are displayed:
173       
174        IR3J_SetupControlsOnMainpanel()
175end
176
177//************************************************************************************************************
178//************************************************************************************************************
179Function IR3J_CreateCheckGraphs()
180       
181        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
182        variable exists1=0
183        DoWIndow IR3J_LogLogDataDisplay
184        if(V_Flag)
185                DoWIndow/hide=? IR3J_LogLogDataDisplay
186                if(V_Flag==2)
187                        DoWIndow/F IR3J_LogLogDataDisplay
188                endif
189        else
190                Display /W=(521,10,1183,400)/K=1 /N=IR3J_LogLogDataDisplay
191                ShowInfo/W=IR3J_LogLogDataDisplay
192                exists1=1
193        endif
194
195        variable exists2=0
196        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
197        if(StringMatch(SimpleModel,"Guinier*") || StringMatch(SimpleModel,"Porod*"))
198                DoWIndow IR3J_LinDataDisplay
199                if(V_Flag)
200                        DoWIndow/hide=? IR3J_LinDataDisplay
201                        if(V_Flag==2)
202                                DoWIndow/F IR3J_LinDataDisplay
203                        endif
204                else
205                        Display /W=(521,10,1183,400)/K=1 /N=IR3J_LinDataDisplay
206                        ShowInfo/W=IR3J_LinDataDisplay
207                        exists2=1
208                endif
209        else
210                KillWindow/Z IR3J_LinDataDisplay
211                exists2=0
212        endif
213        if(exists1 && exists2)
214                AutoPositionWindow/M=0/R=IR3J_SimpleFitsPanel IR3J_LogLogDataDisplay   
215                AutoPositionWindow/M=1/R=IR3J_LogLogDataDisplay IR3J_LinDataDisplay     
216        elseif(exists1 && exists2==0)
217                AutoPositionWindow/M=0/R=IR3J_SimpleFitsPanel IR3J_LogLogDataDisplay   
218        endif
219end
220
221//**********************************************************************************************************
222//**********************************************************************************************************
223
224Function IR3J_InitSimpleFits() 
225
226
227        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
228        DFref oldDf= GetDataFolderDFR()
229        string ListOfVariables
230        string ListOfStrings
231        variable i
232               
233        if (!DataFolderExists("root:Packages:Irena:SimpleFits"))                //create folder
234                NewDataFolder/O root:Packages
235                NewDataFolder/O root:Packages:Irena
236                NewDataFolder/O root:Packages:Irena:SimpleFits
237        endif
238        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
239
240        //here define the lists of variables and strings needed, separate names by ;...
241        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;dQWavename;DataUnits;"
242        ListOfStrings+="DataStartFolder;DataMatchString;FolderSortString;FolderSortStringAll;"
243        ListOfStrings+="UserMessageString;SavedDataMessage;"
244        ListOfStrings+="SimpleModel;ListOfSimpleModels;"
245
246        ListOfVariables="UseIndra2Data1;UseQRSdata1;"
247        ListOfVariables+="DataBackground;AchievedChiSquare;"
248        ListOfVariables+="Guinier_Rg;Guinier_I0;"
249        ListOfVariables+="Porod_Constant;Sphere_Radius;Sphere_ScalingConstant;"
250        ListOfVariables+="Spheroid_Radius;Spheroid_ScalingConstant;Spheroid_Beta;"
251        ListOfVariables+="ProcessManually;ProcessSequentially;OverwriteExistingData;AutosaveAfterProcessing;DelayBetweenProcessing;"
252        ListOfVariables+="DataQEnd;DataQstart;DataQEndPoint;DataQstartPoint;"
253        ListOfVariables+="SaveToNotebook;SaveToWaves;SaveToFolder;"
254        ListOfVariables+="VOlSD_Rg;VolSD_Volume;VolSD_MeanDiameter;VolSD_MedianDiameter;VOlSD_ModeDiamater;"
255        ListOfVariables+="NumSD_NumPartPerCm3;NumSD_MeanDiameter;NumSD_MedianDiameter;NumSD_ModeDiamater;"
256
257        //and here we create them
258        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
259                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
260        endfor         
261                                                               
262        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
263                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
264        endfor 
265
266        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;dQWavename;"
267//      ListOfStrings+="NewDataFolderName;NewIntensityWaveName;NewQWavename;NewErrorWaveName;"
268        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
269                SVAR teststr=$(StringFromList(i,ListOfStrings))
270                teststr =""
271        endfor         
272        ListOfStrings="DataMatchString;FolderSortString;FolderSortStringAll;"
273        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
274                SVAR teststr=$(StringFromList(i,ListOfStrings))
275                if(strlen(teststr)<1)
276                        teststr =""
277                endif
278        endfor         
279        ListOfStrings="DataStartFolder;"
280        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
281                SVAR teststr=$(StringFromList(i,ListOfStrings))
282                if(strlen(teststr)<1)
283                        teststr ="root:"
284                endif
285        endfor         
286        SVAR ListOfSimpleModels
287        ListOfSimpleModels="Guinier;Porod;Sphere;Spheroid;Guinier Rod;Guinier Sheet;Volume Size Distribution;Number Size Distribution;"
288        SVAR SimpleModel
289        if(strlen(SimpleModel)<1)
290                SimpleModel="Guinier"
291        endif
292        NVAR Guinier_Rg
293        NVAR Guinier_I0
294        if(Guinier_Rg<5)
295                Guinier_Rg=50
296        endif
297        if(Guinier_I0<1e-22)
298                Guinier_I0 = 10
299        endif
300        NVAR Porod_Constant
301        if(Porod_Constant<1e-22)
302                Porod_Constant = 1
303        endif
304        NVAR Sphere_Radius
305        if(Sphere_Radius<5)
306                Sphere_Radius = 50
307        endif
308        NVAR Sphere_ScalingConstant
309        if(Sphere_ScalingConstant<1e-22)
310                Sphere_ScalingConstant=1
311        endif
312        NVAR Spheroid_Radius
313        if(Spheroid_Radius<5)
314                Spheroid_Radius = 50
315        endif
316        NVAR Spheroid_ScalingConstant
317        if(Spheroid_ScalingConstant<1e-22)
318                Spheroid_ScalingConstant = 1
319        endif
320        NVAR Spheroid_Beta
321        if(Spheroid_Beta<0.001)
322                Spheroid_Beta = 1
323        endif
324        NVAR DelayBetweenProcessing
325        if(DelayBetweenProcessing<=0)
326                DelayBetweenProcessing = 2
327        endif
328
329        Make/O/T/N=(0) ListOfAvailableData
330        Make/O/N=(0) SelectionOfAvailableData
331        SetDataFolder oldDf
332
333end
334//**************************************************************************************
335//**************************************************************************************
336//**************************************************************************************
337
338//*****************************************************************************************************************
339//*****************************************************************************************************************
340//**************************************************************************************
341//**************************************************************************************
342
343Function IR3J_CheckProc(cba) : CheckBoxControl
344        STRUCT WMCheckboxAction &cba
345
346        switch( cba.eventCode )
347                case 2: // mouse up
348                        Variable checked = cba.checked
349                        NVAR UseIndra2Data =  root:Packages:Irena:SimpleFits:UseIndra2Data
350                        NVAR UseQRSData =  root:Packages:Irena:SimpleFits:UseQRSData
351                        SVAR DataStartFolder = root:Packages:Irena:SimpleFits:DataStartFolder
352               
353                        break
354                case -1: // control being killed
355                        break
356        endswitch
357
358        return 0
359End
360//**************************************************************************************
361//**************************************************************************************
362//**************************************************************************************
363//**************************************************************************************
364//**************************************************************************************
365
366//**************************************************************************************
367//**************************************************************************************
368//**************************************************************************************
369//**************************************************************************************
370//**************************************************************************************
371//**************************************************************************************
372//**************************************************************************************
373
374Function IR3J_SetVarProc(sva) : SetVariableControl
375        STRUCT WMSetVariableAction &sva
376
377        variable tempP
378        switch( sva.eventCode )
379                case 1: // mouse up
380                case 2: // Enter key
381                        NVAR DataQstart=root:Packages:Irena:SimpleFits:DataQstart
382                        NVAR DataQEnd=root:Packages:Irena:SimpleFits:DataQEnd
383                        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
384                        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
385                       
386                        if(stringmatch(sva.ctrlName,"DataQEnd"))
387                                WAVE OriginalDataQWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
388                                tempP = BinarySearch(OriginalDataQWave, DataQEnd )
389                                if(tempP<1)
390                                        print "Wrong Q value set, Data Q max must be at most 1 point before the end of Data"
391                                        tempP = numpnts(OriginalDataQWave)-2
392                                        DataQEnd = OriginalDataQWave[tempP]
393                                endif
394                                DataQEndPoint = tempP                   
395                                IR3J_SyncCursorsTogether("OriginalDataIntWave","B",tempP)
396                                IR3J_SyncCursorsTogether("LinModelDataIntWave","B",tempP)
397                        endif
398                        if(stringmatch(sva.ctrlName,"DataQstart"))
399                                WAVE OriginalDataQWave = root:Packages:Irena:SimpleFits:OriginalDataQWave
400                                tempP = BinarySearch(OriginalDataQWave, DataQstart )
401                                if(tempP<1)
402                                        print "Wrong Q value set, Data Q min must be at least 1 point from the start of Data"
403                                        tempP = 1
404                                        DataQstart = OriginalDataQWave[tempP]
405                                endif
406                                DataQstartPoint=tempP
407                                IR3J_SyncCursorsTogether("OriginalDataIntWave","A",tempP)
408                                IR3J_SyncCursorsTogether("LinModelDataIntWave","A",tempP)
409                endif
410                        break
411
412                case 3: // live update
413                        break
414                case -1: // control being killed
415                        break
416        endswitch
417
418        return 0
419End
420
421//**************************************************************************************
422//**************************************************************************************
423Function IR3J_CopyAndAppendData(FolderNameStr)
424        string FolderNameStr
425       
426        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
427        DFref oldDf= GetDataFolderDFR()
428        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
429                SVAR DataStartFolder=root:Packages:Irena:SimpleFits:DataStartFolder
430                SVAR DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
431                SVAR IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
432                SVAR QWavename=root:Packages:Irena:SimpleFits:QWavename
433                SVAR ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
434                SVAR dQWavename=root:Packages:Irena:SimpleFits:dQWavename
435                NVAR UseIndra2Data=root:Packages:Irena:SimpleFits:UseIndra2Data
436                NVAR UseQRSdata=root:Packages:Irena:SimpleFits:UseQRSdata
437                //these are variables used by the control procedure
438                NVAR  UseResults=  root:Packages:Irena:SimpleFits:UseResults
439                NVAR  UseUserDefinedData=  root:Packages:Irena:SimpleFits:UseUserDefinedData
440                NVAR  UseModelData = root:Packages:Irena:SimpleFits:UseModelData
441                SVAR DataFolderName  = root:Packages:Irena:SimpleFits:DataFolderName
442                SVAR IntensityWaveName = root:Packages:Irena:SimpleFits:IntensityWaveName
443                SVAR QWavename = root:Packages:Irena:SimpleFits:QWavename
444                SVAR ErrorWaveName = root:Packages:Irena:SimpleFits:ErrorWaveName
445                UseUserDefinedData = 0
446                UseModelData = 0
447                //get the names of waves, assume this tool actually works. May not under some conditions. In that case this tool will not work.
448                IR3C_SelectWaveNamesData("Irena:SimpleFits", FolderNameStr)                     //this routine will preset names in strings as needed,         
449                Wave/Z SourceIntWv=$(DataFolderName+IntensityWaveName)
450                Wave/Z SourceQWv=$(DataFolderName+QWavename)
451                Wave/Z SourceErrorWv=$(DataFolderName+ErrorWaveName)
452                Wave/Z SourcedQWv=$(DataFolderName+dQWavename)
453                if(!WaveExists(SourceIntWv)||   !WaveExists(SourceQWv))//||!WaveExists(SourceErrorWv))
454                        Abort "Data selection failed for Data in Simple/basic fits routine IR3J_CopyAndAppendData"
455                endif
456                Duplicate/O SourceIntWv, OriginalDataIntWave
457                Duplicate/O SourceQWv, OriginalDataQWave
458                if(WaveExists(SourceErrorWv))
459                        Duplicate/O SourceErrorWv, OriginalDataErrorWave
460                else
461                        Duplicate/O SourceIntWv, OriginalDataErrorWave
462                        OriginalDataErrorWave = 0
463                endif
464                if(WaveExists(SourcedQWv))
465                        Duplicate/O SourcedQWv, OriginalDatadQWave
466                else
467                        dQWavename=""
468                endif
469                IR3J_CreateCheckGraphs()
470                //clear obsolete data:
471                Wave/Z NormRes1=root:Packages:Irena:SimpleFits:NormalizedResidualLinLin
472                Wave/Z NormRes2=root:Packages:Irena:SimpleFits:NormalizedResidualLogLog
473                if(WaveExists(NormRes1))
474                        NormRes1=0
475                endif
476                if(WaveExists(NormRes2))
477                        NormRes2=0
478                endif
479                //done cleaning...
480                DoWIndow IR3J_LogLogDataDisplay
481                if(V_Flag)
482                        RemoveFromGraph /W=IR3J_LogLogDataDisplay /Z NormalizedResidualLogLog
483                        DoWIndow/F IR3J_LogLogDataDisplay
484                endif
485                DoWIndow IR3J_LinDataDisplay
486                if(V_Flag)
487                        RemoveFromGraph /W=IR3J_LinDataDisplay /Z NormalizedResidualLinLin
488                        DoWIndow/F IR3J_LinDataDisplay
489                endif
490                pauseUpdate
491                IR3J_AppendDataToGraphLogLog()
492                //now this deals with linearized data, if needed...
493                IR3J_CreateLinearizedData()
494                IR3J_AppendDataToGraphModel()
495                DoUpdate
496                print "Added Data from folder : "+DataFolderName
497        SetDataFolder oldDf
498end
499//**********************************************************************************************************
500//**********************************************************************************************************
501//**********************************************************************************************************
502Function IR3J_CreateLinearizedData()
503
504        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
505        DFref oldDf= GetDataFolderDFR()
506
507        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
508        Wave OriginalDataIntWave=root:Packages:Irena:SimpleFits:OriginalDataIntWave
509        Wave OriginalDataQWave=root:Packages:Irena:SimpleFits:OriginalDataQWave
510        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
511        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
512        Duplicate/O OriginalDataIntWave, LinModelDataIntWave   
513        Duplicate/O OriginalDataQWave, LinModelDataQWave
514        Duplicate/O OriginalDataErrorWave, LinModelDataEWave
515       
516        strswitch(SimpleModel)                          // string switch
517                case "Guinier":                                         // execute if case matches expression
518                        LinModelDataIntWave = ln(OriginalDataIntWave)
519                        LinModelDataEWave = OriginalDataErrorWave/OriginalDataIntWave                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
520                        LinModelDataQWave = OriginalDataQWave^2
521                        break                                                           // exit from switch
522                case "Guinier Rod":                             // execute if case matches expression
523                        LinModelDataIntWave = ln(OriginalDataIntWave*LinModelDataQWave)
524                        LinModelDataEWave = OriginalDataErrorWave/OriginalDataIntWave                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
525                        LinModelDataQWave = OriginalDataQWave^2
526                        break
527                case "Guinier Sheet":                           // execute if case matches expression
528                        LinModelDataIntWave = ln(OriginalDataIntWave*LinModelDataQWave^2)
529                        LinModelDataEWave = OriginalDataErrorWave/OriginalDataIntWave                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
530                        LinModelDataQWave = OriginalDataQWave^2
531                        break
532                case "Porod":                           // execute if case matches expression
533                        LinModelDataIntWave = OriginalDataIntWave*OriginalDataQWave^4
534                        LinModelDataEWave = OriginalDataErrorWave*OriginalDataQWave^4                   //error propagation, see: https://terpconnect.umd.edu/~toh/models/ErrorPropagation.pdf
535                        LinModelDataQWave = OriginalDataQWave^4
536                        break
537                default:                                                        // optional default expression executed
538                        //no linearization graphs needed for "Sphere", "Spheroid",...
539                        KillWaves/Z LinModelDataIntWave, LinModelDataEWave, LinModelDataQWave                   // when no case matches
540        endswitch
541        SetDataFolder oldDf
542end
543
544//**********************************************************************************************************
545//**********************************************************************************************************
546//**********************************************************************************************************
547
548
549
550Function IR3J_AppendDataToGraphModel()
551       
552        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
553        IR3J_CreateCheckGraphs()
554        variable WhichLegend=0
555        variable startQp, endQp, tmpStQ
556
557        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
558        if(StringMatch(SimpleModel,"Guinier*") || StringMatch(SimpleModel,"Porod*"))           
559                Wave LinModelDataIntWave=root:Packages:Irena:SimpleFits:LinModelDataIntWave
560                Wave LinModelDataQWave=root:Packages:Irena:SimpleFits:LinModelDataQWave
561                Wave LinModelDataEWave=root:Packages:Irena:SimpleFits:LinModelDataEWave
562                CheckDisplayed /W=IR3J_LinDataDisplay LinModelDataIntWave
563                if(!V_flag)
564                        AppendToGraph /W=IR3J_LinDataDisplay  LinModelDataIntWave  vs LinModelDataQWave
565                        ErrorBars /W=IR3J_LinDataDisplay LinModelDataIntWave Y,wave=(LinModelDataEWave,LinModelDataEWave)               
566                endif
567                NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
568                NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
569                NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
570                NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
571                SetWindow IR3J_LinDataDisplay, hook(SimpleFitsLinCursorMoved) = $""
572                cursor /W=IR3J_LinDataDisplay B, LinModelDataIntWave, DataQEndPoint
573                cursor /W=IR3J_LinDataDisplay A, LinModelDataIntWave, DataQstartPoint
574                SetWindow IR3J_LinDataDisplay, hook(SimpleFitsLinCursorMoved) = IR3J_GraphWindowHook
575                SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
576                strswitch(SimpleModel)  // string switch
577                        case "Guinier":                 // execute if case matches expression
578                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
579                                        ModifyGraph /W=IR3J_LinDataDisplay  mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
580                                        SetAxis/A/W=IR3J_LinDataDisplay
581                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Intensity)"
582                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
583                                break           // exit from switch
584                        case "Guinier rod":                     // execute if case matches expression
585                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
586                                        ModifyGraph /W=IR3J_LinDataDisplay  mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
587                                        SetAxis/A/W=IR3J_LinDataDisplay
588                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Q*Intensity)"
589                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
590                                break           // exit from switch
591                        case "Guinier sheet":                   // execute if case matches expression
592                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
593                                        ModifyGraph /W=IR3J_LinDataDisplay  mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
594                                        SetAxis/A/W=IR3J_LinDataDisplay
595                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"*Intensity)"
596                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
597                                break           // exit from switch
598                                //                      case "Sphere":                  // execute if case matches expression
599                                //                                      ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
600                                //                                      SetAxis/A/W=IR3J_LinDataDisplay
601                                //                                      Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Intensity)"
602                                //                                      Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
603                                //                              break           // exit from switch
604                                //                      case "Spheroid":                        // execute if case matches expression
605                                //                                      ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
606                                //                                      SetAxis/A/W=IR3J_LinDataDisplay
607                                //                                      Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"ln(Intensity)"
608                                //                                      Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S2\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-2\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
609                                //                              break           // exit from switch
610                        case "Porod":   // execute if case matches expression
611                                        ModifyGraph /W=IR3J_LinDataDisplay log=0, mirror(bottom)=1
612                                        ModifyGraph /W=IR3J_LinDataDisplay mode(LinModelDataIntWave)=3,marker(LinModelDataIntWave)=8
613                                        SetAxis/A/W=IR3J_LinDataDisplay
614                                        SetAxis/W=IR3J_LinDataDisplay left 0,*
615                                        Label /W=IR3J_LinDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Int * Q\\S4"
616                                        Label /W=IR3J_LinDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q\\S4\\M\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"[A\\S-4\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
617                                break
618                        default:                        // optional default expression executed
619                                //<code>]               // when no case matches
620                endswitch
621                //and set limtis on axis
622                variable tempMaxQ
623                tempMaxQ = LinModelDataQWave[DataQEndPoint]
624                SetAxis/W=IR3J_LinDataDisplay bottom 0,tempMaxQ*SimpleFitsLinPlotMaxScale
625                variable tempMaxQY, tempMinQY, maxY, minY
626                tempMaxQY = LinModelDataIntWave[DataQstartPoint]
627                tempMinQY = LinModelDataIntWave[DataQEndPoint]
628                maxY = max(tempMaxQY, tempMinQY)
629                minY = min(tempMaxQY, tempMinQY)
630                if(maxY>0)
631                        maxY*=SimpleFitsLinPlotMaxScale
632                else
633                        maxY*=SimpleFitsLinPlotMinScale
634                endif
635                if(minY>0)
636                        minY*=SimpleFitsLinPlotMinScale
637                else
638                        minY*=SimpleFitsLinPlotMaxScale
639                endif
640                SetAxis/W=IR3J_LinDataDisplay left minY, maxY
641        else
642                KillWindow/Z IR3J_LinDataDisplay
643        endif
644end
645//**********************************************************************************************************
646//**********************************************************************************************************
647//**********************************************************************************************************
648
649
650Function IR3J_AppendDataToGraphLogLog()
651       
652        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
653        IR3J_CreateCheckGraphs()
654        variable WhichLegend=0
655        Wave OriginalDataIntWave=root:Packages:Irena:SimpleFits:OriginalDataIntWave
656        Wave OriginalDataQWave=root:Packages:Irena:SimpleFits:OriginalDataQWave
657        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
658        CheckDisplayed /W=IR3J_LogLogDataDisplay OriginalDataIntWave
659        if(!V_flag)
660                AppendToGraph /W=IR3J_LogLogDataDisplay  OriginalDataIntWave  vs OriginalDataQWave
661                ModifyGraph /W=IR3J_LogLogDataDisplay log=1, mirror(bottom)=1
662                Label /W=IR3J_LogLogDataDisplay left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Intensity"
663                Label /W=IR3J_LogLogDataDisplay bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Q[A\\S-1\\M"+"\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"]"
664                ErrorBars /W=IR3J_LogLogDataDisplay OriginalDataIntWave Y,wave=(OriginalDataErrorWave,OriginalDataErrorWave)           
665        endif
666        // for "Size Distribution" use linear left axis. 
667        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
668        if(StringMatch(SimpleModel, "*size distribution"))
669                                ModifyGraph /W=IR3J_LogLogDataDisplay log(left)=0, mirror=1
670        endif
671       
672        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
673        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
674        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
675        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
676        if(DataQstart>0)                        //old Q min already set.
677                DataQstartPoint = BinarySearch(OriginalDataQWave, DataQstart)
678        endif
679        if(DataQstartPoint<1)   //Qmin not set or not found. Set to point 2 on that wave.
680                DataQstart = OriginalDataQWave[1]
681                DataQstartPoint = 1
682        endif
683        if(DataQEnd>0)                  //old Q max already set.
684                DataQEndPoint = BinarySearch(OriginalDataQWave, DataQEnd)
685        endif
686        if(DataQEndPoint<1)     //Qmax not set or not found. Set to last point-1 on that wave.
687                DataQEnd = OriginalDataQWave[numpnts(OriginalDataQWave)-2]
688                DataQEndPoint = numpnts(OriginalDataQWave)-2
689        endif
690        SetWindow IR3J_LogLogDataDisplay, hook(SimpleFitsLogCursorMoved) = $""
691        cursor /W=IR3J_LogLogDataDisplay B, OriginalDataIntWave, DataQEndPoint
692        cursor /W=IR3J_LogLogDataDisplay A, OriginalDataIntWave, DataQstartPoint
693        SetWindow IR3J_LogLogDataDisplay, hook(SimpleFitsLogCursorMoved) = IR3J_GraphWindowHook
694
695       
696        switch(V_Flag)  // numeric switch
697                case 0:         // execute if case matches expression
698                        Legend/W=IR3J_LogLogDataDisplay /N=text0/K
699                        break                                           // exit from switch
700//              case 1:         // execute if case matches expression
701//                      SVAR DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
702//                      Shortname1 = StringFromList(ItemsInList(DataFolderName1, ":")-1, DataFolderName1  ,":")
703//                      Legend/W=IR3J_LogLogDataDisplay /C/N=text0/J/A=LB "\\s(OriginalData1IntWave) "+Shortname1
704//                      break
705//              case 2:
706//                      SVAR DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
707//                      Shortname2 = StringFromList(ItemsInList(DataFolderName2, ":")-1, DataFolderName2  ,":")
708//                      Legend/W=IR3J_LogLogDataDisplay /C/N=text0/J/A=LB "\\s(OriginalData2IntWave) " + Shortname2             
709//                      break
710//              case 3:
711//                      SVAR DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
712//                      Shortname1 = StringFromList(ItemsInList(DataFolderName1, ":")-1, DataFolderName1  ,":")
713//                      Legend/W=IR3J_LogLogDataDisplay /C/N=text0/J/A=LB "\\s(OriginalData1IntWave) "+Shortname1+"\r\\s(OriginalData2IntWave) "+Shortname2
714//                      break
715//              case 7:
716//                      SVAR DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
717//                      Shortname1 = StringFromList(ItemsInList(DataFolderName1, ":")-1, DataFolderName1  ,":")
718//                      Legend/W=IR3J_LogLogDataDisplay /C/N=text0/J/A=LB "\\s(OriginalData1IntWave) "+Shortname1+"\r\\s(OriginalData2IntWave) "+Shortname2+"\r\\s(ResultIntensity) Merged Data"
719                        break
720        endswitch
721
722       
723end
724//**********************************************************************************************************
725//**********************************************************************************************************
726//**********************************************************************************************************
727//**********************************************************************************************************
728//**********************************************************************************************************
729//**********************************************************************************************************
730
731Function IR3J_ButtonProc(ba) : ButtonControl
732        STRUCT WMButtonAction &ba
733
734        switch( ba.eventCode )
735                case 2: // mouse up
736                        // click code here
737                        if(stringmatch(ba.ctrlName,"FitCurrentDataSet"))
738                                IR3J_FitData()
739                        endif
740                        if(stringmatch(ba.ctrlName,"RecordCurrentresults"))
741                                NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
742                                NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
743                                NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
744                                if(SaveToNotebook+SaveToWaves+SaveToFolder<1)
745                                        Abort "Nothing is selected to Record, check at least on checkbox above"
746                                endif   
747                                IR3J_SaveResultsToNotebook()
748                                IR3J_SaveResultsToWaves()
749                                IR3J_SaveResultsToFolder()
750                        endif
751                        if(stringmatch(ba.ctrlName,"FitSelectionDataSet"))
752                                IR3J_FitSequenceOfData()
753                        endif
754                        if(stringmatch(ba.ctrlName,"GetTableWithResults"))
755                                IR3J_GetTableWithresults()     
756                        endif
757                        if(stringmatch(ba.ctrlName,"DeleteOldResults"))
758                                IR3J_DeleteExistingModelResults()       
759                        endif
760                        if(stringmatch(ba.ctrlName,"GetNotebookWithResults"))
761                                IR1_CreateResultsNbk()
762                        endif
763                        if(stringmatch(ba.ctrlName,"SelectAll"))
764                                Wave/Z SelectionOfAvailableData = root:Packages:Irena:SimpleFits:SelectionOfAvailableData
765                                if(WaveExists(SelectionOfAvailableData))
766                                        SelectionOfAvailableData=1
767                                endif
768                        endif
769
770                        if(stringmatch(ba.ctrlName,"GetHelp"))
771                                IN2G_OpenWebManual("Irena/bioSAXS.html#basic-fits")                             //fix me!!                     
772                        endif
773
774                       
775                        break
776                case -1: // control being killed
777                        break
778        endswitch
779
780        return 0
781End
782
783
784//      Display /W=(521,10,1183,340) /HOST=# /N=LogLogDataDisplay
785//      SetActiveSubwindow ##
786//      Display /W=(521,420,1183,750) /HOST=# /N=LinearizedDataDisplay
787//      SetActiveSubwindow ##
788//**********************************************************************************************************
789//**********************************************************************************************************
790//**********************************************************************************************************
791
792static Function IR3J_FitData()
793
794        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
795        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
796        strswitch(SimpleModel)  // string switch
797                case "Guinier":                         // Regular Guinier, aka: Sphere, globular.
798                        IR3J_FitGuinier("Sphere")
799                        IR3J_CalculateModel()           
800                        break                   
801                case "Guinier Rod":             // Guinier for rod
802                        IR3J_FitGuinier("Rod")
803                        IR3J_CalculateModel()           
804                        break                   
805                case "Guinier Sheet":           // Guinier for sheet
806                        IR3J_FitGuinier("Sheet")
807                        IR3J_CalculateModel()           
808                        break           
809                case "Porod":                           // Porod
810                        IR3J_FitPorod()
811                        IR3J_CalculateModel()           
812                        break
813                case "Sphere":                          // Sphere
814                        IR3J_FitSphere()
815                        IR3J_CalculateModel()           
816                        break
817                case "Spheroid":                        // Spheroid
818                        IR3J_FitSpheroid()
819                        IR3J_CalculateModel()           
820                        break
821                case "Volume Size Distribution":                        // Spheroid
822                        IR3J_FitSizeDistribution("Volume")
823                        //IR3J_CalculateModel()         
824                        break
825                case "Number Size Distribution":                        // Spheroid
826                        IR3J_FitSizeDistribution("Number")
827                        //IR3J_CalculateModel()         
828                        break
829                default:                       
830                //nothing here.
831                Abort "No model calculated in static IR3J_FitData()"
832        endswitch
833
834end
835
836//**********************************************************************************************************
837//**********************************************************************************************************
838//**********************************************************************************************************
839
840static Function IR3J_FitSequenceOfData()
841
842                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
843                //warn user if not saving results...
844                NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
845                NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
846                NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
847                NVAR DelayBetweenProcessing=root:Packages:Irena:SimpleFits:DelayBetweenProcessing
848                if(SaveToNotebook+SaveToWaves+SaveToFolder<1)
849                        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)?"
850                        if(V_Flag==2)
851                                abort
852                        endif
853                endif   
854                if(SaveToFolder)
855                        print "Fit results will be saved in original fits as Intensity and Q vector"
856                endif
857                if(SaveToWaves)
858                        print "Fit results will be saved in waves to create a table"
859                endif
860                if(SaveToNotebook)
861                        print "Fit results will be saved in notebook"
862                endif
863                Wave SelectionOfAvailableData = root:Packages:Irena:SimpleFits:SelectionOfAvailableData
864                Wave/T ListOfAvailableData = root:Packages:Irena:SimpleFits:ListOfAvailableData
865                variable i, imax
866                imax = numpnts(ListOfAvailableData)
867                For(i=0;i<imax;i+=1)
868                        if(SelectionOfAvailableData[i]>0.5)             //data set selected
869                                IR3J_CopyAndAppendData(ListOfAvailableData[i])
870                                IR3J_FitData()
871                                IR3J_SaveResultsToNotebook()
872                                IR3J_SaveResultsToWaves()
873                                IR3J_SaveResultsToFolder()
874                                DoUpdate
875                                sleep/S/C=6/M="Fitted data for "+ListOfAvailableData[i] DelayBetweenProcessing
876                        endif
877                endfor
878                print "all selected data processed"
879end
880//**********************************************************************************************************
881//**********************************************************************************************************
882//**********************************************************************************************************
883
884Function IR3J_GraphWindowHook(s)
885        STRUCT WMWinHookStruct &s
886
887        Variable hookResult = 0
888
889        switch(s.eventCode)
890                case 0:                         // Activate
891                        // Handle activate
892                        break
893
894                case 1:                         // Deactivate
895                        // Handle deactivate
896                        break
897                case 7:                         //coursor moved
898                        IR3J_SyncCursorsTogether(s.traceName,s.cursorName,s.pointNumber)
899                        hookResult = 1
900                // And so on . . .
901        endswitch
902
903        return hookResult       // 0 if nothing done, else 1
904End
905
906//**********************************************************************************************************
907//**********************************************************************************************************
908//**********************************************************************************************************
909
910static Function IR3J_SyncCursorsTogether(traceName,CursorName,PointNumber)
911        string traceName,CursorName
912        variable PointNumber
913
914        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
915        IR3J_CreateCheckGraphs()
916        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
917        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
918        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
919        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
920        Wave OriginalDataQWave=root:Packages:Irena:SimpleFits:OriginalDataQWave
921        Wave/Z LinModelDataIntWave=root:Packages:Irena:SimpleFits:LinModelDataIntWave
922        Wave OriginalDataIntWave=root:Packages:Irena:SimpleFits:OriginalDataIntWave
923        Wave/Z LinModelDataQWave=root:Packages:Irena:SimpleFits:LinModelDataQWave
924        variable tempMaxQ, tempMaxQY, tempMinQY, maxY, minY
925        variable LinDataExist = 0
926        DoWIndow IR3J_LinDataDisplay            //does linearization graph even exist???
927        if(V_Flag)
928                LinDataExist = 1
929        endif
930        //check if user removed cursor from graph, in which case do nothing for now...
931        if(numtype(PointNumber)==0)
932                if(stringmatch(CursorName,"A"))         //moved cursor A, which is start of Q range
933                        DataQstartPoint = PointNumber
934                        DataQstart = OriginalDataQWave[PointNumber]
935                        //now move the cursor in the other graph...
936                        if(StringMatch(traceName, "OriginalDataIntWave" ))
937                                if(LinDataExist)
938                                        checkDisplayed /W=IR3J_LinDataDisplay LinModelDataIntWave
939                                        if(V_Flag)
940                                                //GetAxis/W=IR3J_LinDataDisplay /Q left
941                                                cursor /W=IR3J_LinDataDisplay A, LinModelDataIntWave, DataQstartPoint
942                                                tempMaxQ = LinModelDataQWave[DataQEndPoint]
943                                                tempMaxQY = LinModelDataIntWave[DataQstartPoint]
944                                                tempMinQY = LinModelDataIntWave[DataQEndPoint]
945                                                maxY = max(tempMaxQY, tempMinQY)
946                                                minY = min(tempMaxQY, tempMinQY)
947                                                if(maxY>0)
948                                                        maxY*=SimpleFitsLinPlotMaxScale
949                                                else
950                                                        maxY*=SimpleFitsLinPlotMinScale
951                                                endif
952                                                if(minY>0)
953                                                        minY*=SimpleFitsLinPlotMinScale
954                                                else
955                                                        minY*=SimpleFitsLinPlotMaxScale
956                                                endif
957                                                if(maxY>0)
958                                                        maxY*=SimpleFitsLinPlotMaxScale
959                                                else
960                                                        maxY*=SimpleFitsLinPlotMinScale
961                                                endif
962                                                SetAxis /W=IR3J_LinDataDisplay left minY, maxY
963                                                SetAxis/W=IR3J_LinDataDisplay bottom 0,tempMaxQ*SimpleFitsLinPlotMaxScale
964                                        endif
965                                endif
966                        elseif(StringMatch(traceName, "LinModelDataIntWave" ))
967                                checkDisplayed /W=IR3J_LogLogDataDisplay OriginalDataIntWave
968                                if(V_Flag)
969                                        cursor /W=IR3J_LogLogDataDisplay A, OriginalDataIntWave, DataQstartPoint
970                                endif
971                        endif
972                endif
973                if(stringmatch(CursorName,"B"))         //moved cursor B, which is end of Q range
974                        DataQEndPoint = PointNumber
975                        DataQEnd = OriginalDataQWave[PointNumber]
976                        //now move the cursor in the other graph...
977                        if(StringMatch(traceName, "OriginalDataIntWave" ))
978                                if(LinDataExist)
979                                        checkDisplayed /W=IR3J_LinDataDisplay LinModelDataIntWave
980                                        if(V_Flag)
981                                                cursor /W=IR3J_LinDataDisplay B, LinModelDataIntWave, DataQEndPoint
982                                                tempMaxQ = LinModelDataQWave[DataQEndPoint]
983                                                tempMaxQY = LinModelDataIntWave[DataQstartPoint]
984                                                tempMinQY = LinModelDataIntWave[DataQEndPoint]
985                                                maxY = max(tempMaxQY, tempMinQY)
986                                                minY = min(tempMaxQY, tempMinQY)
987                                                if(maxY>0)
988                                                        maxY*=SimpleFitsLinPlotMaxScale
989                                                else
990                                                        maxY*=SimpleFitsLinPlotMinScale
991                                                endif
992                                                if(minY>0)
993                                                        minY*=SimpleFitsLinPlotMinScale
994                                                else
995                                                        minY*=SimpleFitsLinPlotMaxScale
996                                                endif
997                                                SetAxis/W=IR3J_LinDataDisplay left minY, maxY
998                                                GetAxis/W=IR3J_LinDataDisplay/Q bottom
999                                                SetAxis/W=IR3J_LinDataDisplay bottom V_min, SimpleFitsLinPlotMaxScale*LinModelDataQWave[DataQEndPoint]
1000                                        endif
1001                                endif
1002                        elseif(StringMatch(traceName, "LinModelDataIntWave" ))
1003                                checkDisplayed /W=IR3J_LogLogDataDisplay OriginalDataIntWave
1004                                if(V_Flag)
1005                                        cursor /W=IR3J_LogLogDataDisplay B, OriginalDataIntWave, DataQEndPoint
1006                                endif
1007                        endif
1008                endif
1009        endif
1010end
1011//**********************************************************************************************************
1012//**********************************************************************************************************
1013//**********************************************************************************************************
1014
1015static Function IR3J_FitGuinier(which)
1016        string which                    //Sphere, Rod, Sheet
1017        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1018        IR3J_CreateCheckGraphs()
1019        DFref oldDf= GetDataFolderDFR()
1020        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1021        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1022        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1023        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1024        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1025        NVAR Guinier_I0 = root:Packages:Irena:SimpleFits:Guinier_I0
1026        NVAR Guinier_Rg=root:Packages:Irena:SimpleFits:Guinier_Rg
1027        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1028        Make/D/N=0/O W_coef, LocalEwave
1029        Make/D/T/N=0/O T_Constraints
1030        Wave/Z W_sigma
1031        Redimension /N=2 W_coef, LocalEwave
1032        Redimension/N=2 T_Constraints
1033        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1034        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1035        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1036                Abort "Daat do not exist or cursors are not properly set on same wave"
1037        endif
1038        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1039        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1040        //make a good starting guesses:
1041        Guinier_I0 = CursorAXWave[DataQstartPoint]
1042        Guinier_Rg = pi/(DataQEnd/2)
1043        W_coef[0]=Guinier_I0    //G
1044        W_coef[1]=Guinier_Rg            //Rg
1045        T_Constraints[0] = {"K1 > "+num2str(Guinier_Rg/10)}
1046        T_Constraints[1] = {"K0 > 0"}
1047        LocalEwave[0]=(Guinier_I0/20)
1048        LocalEwave[1]=(Guinier_Rg/20)
1049        variable QminFit, QmaxFit
1050        QminFit = CursorAXWave[DataQstartPoint]
1051        QmaxFit = CursorAXWave[DataQEndPoint]
1052        variable/g V_FitError
1053       
1054        V_FitError=0                    //This should prevent errors from being generated
1055        strswitch(which)                // string switch
1056                case "Sphere":          // execute if case matches expression
1057                        FuncFit IR1_GuinierFit W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1058                        break                                   // exit from switch
1059                case "Rod":     // execute if case matches expression
1060                        FuncFit IR1_GuinierRodFit W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1061                        break
1062                case "Sheet":   // execute if case matches expression
1063                        FuncFit IR1_GuinierSheetFit W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1064                        break
1065                default:                        // optional default expression executed
1066                        abort
1067        endswitch
1068        if (V_FitError!=0)      //there was error in fitting
1069                RemoveFromGraph $("fit_"+NameOfWave(CursorAWave))
1070                beep
1071                Abort "Fitting error, check starting parameters and fitting limits"
1072        endif
1073        Wave W_sigma
1074        string TagText, TagTextLin
1075        AchievedChiSquare = V_chisq/(DataQEndPoint-DataQstartPoint)
1076        string QminRg, QmaxRg, AchiCHiStr
1077        sprintf QminRg, "%2.2f",(W_coef[1]*QminFit)
1078        sprintf QmaxRg, "%2.2f",(W_coef[1]*QmaxFit)
1079        sprintf AchiCHiStr, "%2.2f",(AchievedChiSquare)
1080        strswitch(which)                // string switch
1081                case "Sphere":          // execute if case matches expression
1082                        TagText = "Fited Guinier : I(Q) = I(0)*exp(-q\\S2\\M*Rg\\S2\\M/3)\rI(0) = "+num2str(W_coef[0])+"\t\tRg = "+num2str(W_coef[1])
1083                        TagText+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1084                        TagText+="\rχ\\S2\\M  = "+AchiCHiStr
1085                        TagTextLin = "I(0) = "+num2str(W_coef[0])+"\t\tRg = "+num2str(W_coef[1])
1086                        TagTextLin+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1087                        TagTextLin +="\rχ\\S2\\M  = "+AchiCHiStr
1088                        break                                   // exit from switch
1089                case "Rod":     // execute if case matches expression
1090//                      TagText = "Fitted Guinier  "+"Int*Q = G*exp(-q^2*Rg^2/2))"+" \r G = "+num2str(W_coef[0])+"\r Rc = "+num2str(W_coef[1])
1091//                      TagText+="\rchi-square = "+num2str(V_chisq)
1092                        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])
1093                        TagText+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1094                        TagText+="\rχ\\S2\\M  = "+AchiCHiStr
1095                        TagTextLin = "I(0) = "+num2str(W_coef[0])+"\t\tRc = "+num2str(W_coef[1])
1096                        TagTextLin+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1097                        TagTextLin +="\rχ\\S2\\M  = "+AchiCHiStr
1098                        break
1099                case "Sheet":   // execute if case matches expression
1100//                      TagText = "Fitted Guinier  "+"Int*Q^2 = G*exp(-q^2*Rg^2))"+" \r G = "+num2str(W_coef[0])+"\r Rg = "+num2str(W_coef[1])
1101//                      TagText+="\r Thickness = "+num2str(W_coef[1]*sqrt(12))
1102//                      TagText+="\r chi-square = "+num2str(V_chisq)
1103                        TagText = "Fited Guinier : I(Q)*Q\S2\M = I(0)*exp(-q\\S2\\M*Rg\\S2\\M)\rI(0) = "+num2str(W_coef[0])+"\t\tRg = "+num2str(W_coef[1])
1104                        TagText+="\rThickness = "+num2str(W_coef[1]*sqrt(12))
1105                        TagText+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1106                        TagText+="\rχ\\S2\\M  = "+AchiCHiStr
1107                        TagTextLin = "I(0) = "+num2str(W_coef[0])+"\t\tRg = "+num2str(W_coef[1])
1108                        TagTextLin+="\rThickness = "+num2str(W_coef[1]*sqrt(12))
1109                        TagTextLin+="\rQ\Bmin\MRg = "+QminRg+"\tQ\Bmax\MRg = "+QmaxRg
1110                        TagTextLin +="\rχ\\S2\\M  = "+AchiCHiStr
1111                        break
1112                default:                        // optional default expression executed
1113                        abort
1114        endswitch
1115        string TagName= "GuinierFit" //UniqueName("GuinierFit",14,0,"IR3J_LogLogDataDisplay")
1116        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1117       
1118        DoWindow IR3J_LinDataDisplay
1119        if(V_Flag)
1120                Wave/Z CursorAWaveLin = CsrWaveRef(A, "IR3J_LinDataDisplay")   
1121                Tag/C/W=IR3J_LinDataDisplay/N=$(TagName)/L=2/X=15.00/Y=15.00  $NameOfWave(CursorAWaveLin), ((DataQstartPoint + DataQEndPoint)/2),TagTextLin     
1122        endif
1123       
1124        Guinier_I0=W_coef[0]    //G
1125        Guinier_Rg=W_coef[1]    //Rg
1126
1127        SetDataFolder oldDf
1128
1129end
1130
1131
1132//**********************************************************************************************************
1133//**********************************************************************************************************
1134Function IR1_GuinierRodFit(w,q) : FitFunc
1135        Wave w
1136        Variable q
1137
1138        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1139        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1140        //CurveFitDialog/ Equation:
1141        //CurveFitDialog/ Prefactor=abs(Prefactor)
1142        //CurveFitDialog/ Rg=abs(Rg)
1143        //CurveFitDialog/ f(q) = Prefactor*exp(-q^2*Rg^2/3))
1144        //CurveFitDialog/ End of Equation
1145        //CurveFitDialog/ Independent Variables 1
1146        //CurveFitDialog/ q
1147        //CurveFitDialog/ Coefficients 2
1148        //CurveFitDialog/ w[0] = Prefactor
1149        //CurveFitDialog/ w[1] = Rg
1150
1151        w[0]=abs(w[0])
1152        w[1]=abs(w[1])
1153        return w[0]/q * exp(-0.5 * q^2*w[1]^2)
1154End
1155//**********************************************************************************************************
1156Function IR1_GuinierSheetFit(w,q) : FitFunc
1157        Wave w
1158        Variable q
1159
1160        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1161        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1162        //CurveFitDialog/ Equation:
1163        //CurveFitDialog/ Prefactor=abs(Prefactor)
1164        //CurveFitDialog/ Rg=abs(Rg)
1165        //CurveFitDialog/ f(q) = Prefactor*exp(-q^2*Rg^2/3))
1166        //CurveFitDialog/ End of Equation
1167        //CurveFitDialog/ Independent Variables 1
1168        //CurveFitDialog/ q
1169        //CurveFitDialog/ Coefficients 2
1170        //CurveFitDialog/ w[0] = Prefactor
1171        //CurveFitDialog/ w[1] = Rg
1172
1173        w[0]=abs(w[0])
1174        w[1]=abs(w[1])
1175        return w[0]/(q*q) * exp(-q^2*w[1]^2)
1176End
1177
1178//**********************************************************************************************************
1179//**********************************************************************************************************
1180
1181static Function IR3J_FitPorod()
1182       
1183        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1184        IR3J_CreateCheckGraphs()
1185        DFref oldDf= GetDataFolderDFR()
1186        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1187        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1188        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1189        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1190        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1191        NVAR Porod_Constant = root:Packages:Irena:SimpleFits:Porod_Constant
1192        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1193        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1194        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1195        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1196        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1197        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1198        Make/D/N=0/O W_coef, LocalEwave
1199        Make/D/T/N=0/O T_Constraints
1200        Wave/Z W_sigma
1201        Redimension /N=2 W_coef, LocalEwave
1202        Redimension/N=1 T_Constraints
1203        T_Constraints[0] = {"K1 > 0"}
1204        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1205                Abort "Cursors are not properly set on same wave"
1206        endif
1207        //make a good starting guesses:
1208        Porod_Constant=CursorAWave[DataQstartPoint]/(CursorAXWave[DataQstartPoint]^(-4))
1209        DataBackground=CursorAwave[DataQEndPoint]
1210        W_coef = {Porod_Constant,DataBackground}
1211        LocalEwave[0]=(Porod_Constant/20)
1212        LocalEwave[1]=(DataBackground/20)
1213
1214        variable/g V_FitError=0                 //This should prevent errors from being generated
1215        FuncFit PorodInLogLog W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1216        if (V_FitError==0)      // fitting was fine...
1217                Wave W_sigma
1218                AchievedChiSquare = V_chisq/(DataQEndPoint-DataQstartPoint)
1219                string QminRg, QmaxRg, AchiCHiStr
1220                sprintf AchiCHiStr, "%2.2f",(AchievedChiSquare)
1221                string TagText
1222                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])
1223                TagText +="\rχ\\S2\\M  = "+AchiCHiStr
1224                string TagName= "PorodFit"
1225                Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1226                Porod_Constant=W_coef[0]        //PC
1227                DataBackground=W_coef[1]        //Background
1228        else
1229                RemoveFromGraph/Z $("fit_"+NameOfWave(CursorAWave))
1230                beep
1231                Print "Fitting error, check starting parameters and fitting limits"
1232                Porod_Constant=0        //PC
1233                DataBackground=0        //Background
1234                AchievedChiSquare = 0
1235        endif
1236        SetDataFolder oldDf
1237end
1238
1239
1240
1241//**********************************************************************************************************
1242//**********************************************************************************************************
1243
1244Function IR3J_FitSizeDistribution(Which)
1245        string Which                    //"Volume" or "Number"
1246        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1247        IR3J_CreateCheckGraphs()
1248        DFref oldDf= GetDataFolderDFR()
1249        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1250        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1251        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1252        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1253        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1254        NVAR Spheroid_Beta = root:Packages:Irena:SimpleFits:Spheroid_Beta
1255        NVAR Spheroid_Radius = root:Packages:Irena:SimpleFits:Spheroid_Radius
1256        NVAR Spheroid_ScalingConstant = root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1257        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1258        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1259        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1260        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1261        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1262        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1263        NVAR VOlSD_Rg                                   =root:Packages:Irena:SimpleFits:VOlSD_Rg
1264        NVAR VolSD_Volume                               =root:Packages:Irena:SimpleFits:VolSD_Volume
1265        NVAR VolSD_MeanDiameter         =root:Packages:Irena:SimpleFits:VolSD_MeanDiameter
1266        NVAR VolSD_MedianDiameter       =root:Packages:Irena:SimpleFits:VolSD_MedianDiameter
1267        NVAR VOlSD_ModeDiamater         =root:Packages:Irena:SimpleFits:VOlSD_ModeDiamater
1268        NVAR NumSD_NumPartPerCm3                =root:Packages:Irena:SimpleFits:NumSD_NumPartPerCm3
1269        NVAR NumSD_MeanDiameter         =root:Packages:Irena:SimpleFits:NumSD_MeanDiameter
1270        NVAR NumSD_MedianDiameter       =root:Packages:Irena:SimpleFits:NumSD_MedianDiameter
1271        NVAR NumSD_ModeDiamater         =root:Packages:Irena:SimpleFits:NumSD_ModeDiamater
1272        SVAR QWavename                                  =root:Packages:Irena:SimpleFits:QWavename
1273
1274        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1275                Abort "Cursors are not properly set on same wave"
1276        endif
1277        Duplicate/Free/R=[DataQstartPoint, DataQEndPoint] CursorAXWave, TempXWave
1278        Duplicate/Free/R=[DataQstartPoint, DataQEndPoint] CursorAWave, TempYWave, temp_cumulative, temp_probability, Another_temp
1279        Another_temp=temp_probability*tempXwave
1280        variable Rg, MeanDia, MedianDia, modeDia
1281        string TagText
1282        variable AreaUnderTheCurve = areaXY(CursorAXWave, CursorAWave, DataQstart, DataQEnd)
1283        if(StringMatch(QWavename, "*Diame*" ))
1284                Rg=IR2L_CalculateRg(TempXWave,TempYWave,1)              //Dimension is diameter, 3rd parameter is 1 if DimensionIsDiameter
1285                MeanDia=areaXY(tempXwave, Another_temp,0,inf)   / areaXY(tempXwave, temp_probability,0,inf)                             //Sum P(D)*D*deltaD/P(D)*deltaD
1286                //median
1287                Temp_Cumulative=areaXY(tempXwave, Temp_Probability, tempXwave[0], tempXwave[p] )
1288                MedianDia = tempXwave[BinarySearchInterp(Temp_Cumulative, 0.5*Temp_Cumulative[numpnts(Temp_Cumulative)-1] )]            //R for which cumulative probability=0.5
1289                //mode
1290                FindPeak/P/Q Temp_Probability
1291                modeDia=tempXwave[V_PeakLoc]                                                            //location of maximum on the P(R)
1292        else
1293                Rg=IR2L_CalculateRg(TempXWave,TempYWave,0)              //Dimension is radius, 3rd parameter is 0
1294                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
1295                //median
1296                Temp_Cumulative=areaXY(tempXwave, Temp_Probability, tempXwave[0], tempXwave[p] )
1297                MedianDia = 2* tempXwave[BinarySearchInterp(Temp_Cumulative, 0.5*Temp_Cumulative[numpnts(Temp_Cumulative)-1] )]         //Diameter for which cumulative probability=0.5
1298                //mode
1299                FindPeak/P/Q Temp_Probability
1300                modeDia=2* tempXwave[V_PeakLoc]                                                         //location of maximum on the P(D)
1301        endif
1302        if(StringMatch(Which, "Number" ))
1303                NumSD_NumPartPerCm3     = AreaUnderTheCurve
1304                NumSD_MeanDiameter      = MeanDia
1305                NumSD_MedianDiameter    = MedianDia
1306                NumSD_ModeDiamater              = modeDia
1307                TagText = "Number Size Distribution analysis \r"+"Number of particles/cm3 = "+num2str(AreaUnderTheCurve)
1308                TagText+="\r Mean Diameter [A] = "+num2str(MeanDia)
1309                TagText+="\r Mode Dia [A] = "+num2str(modeDia)+"\tMedian Diameter [A] = "+num2str(MedianDia)
1310        else            //default is volume
1311                VOlSD_Rg                                        = Rg
1312                VolSD_Volume                            = AreaUnderTheCurve
1313                VolSD_MeanDiameter              = MeanDia
1314                VolSD_MedianDiameter    = MedianDia
1315                VOlSD_ModeDiamater              = modeDia
1316                TagText = "Volume Size Distribution analysis \r"+"Volume fraction = "+num2str(AreaUnderTheCurve)
1317                TagText+="\r Rg = "+num2str(Rg)+"\tMean Diameter [A] = "+num2str(MeanDia)
1318                TagText+="\r Mode Dia [A] = "+num2str(modeDia)+"\tMedian Diameter [A] = "+num2str(MedianDia)
1319        endif
1320        //make a good starting guesses:
1321        AchievedChiSquare = 0
1322        string TagName= "SizeDistribution"
1323        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1324        SetDataFolder oldDf
1325
1326end
1327
1328//**********************************************************************************************************
1329//**********************************************************************************************************
1330
1331static Function IR3J_FitSphere()
1332       
1333        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1334        IR3J_CreateCheckGraphs()
1335        DFref oldDf= GetDataFolderDFR()
1336        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1337        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1338        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1339        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1340        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1341        NVAR SphereRadius = root:Packages:Irena:SimpleFits:Sphere_Radius
1342        NVAR SphereScalingConst = root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
1343        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1344        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1345        Make/D/N=0/O W_coef, LocalEwave
1346        Make/D/T/N=0/O T_Constraints
1347        Wave/Z W_sigma
1348        Redimension /N=3 W_coef, LocalEwave
1349        Redimension/N=2 T_Constraints
1350        T_Constraints[0] = {"K0 > 0"}
1351        T_Constraints[1] = {"K1 > 3"}
1352        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1353        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1354        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1355        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1356        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1357                Abort "Cursors are not properly set on same wave"
1358        endif
1359        //make a good starting guesses:
1360        SphereScalingConst=CursorAWave[DataQstartPoint]
1361        SphereRadius=2*pi/CursorAWave[DataQstartPoint]
1362        DataBackground=0.05*CursorAwave[DataQEndPoint]
1363        W_coef = {SphereScalingConst, SphereRadius,DataBackground}     
1364        LocalEwave[0]=(SphereScalingConst/20)
1365        LocalEwave[1]=(SphereRadius/20)
1366        LocalEwave[2]=(DataBackground/20)
1367
1368        variable/g V_FitError=0                 //This should prevent errors from being generated
1369//              if (FitUseErrors && WaveExists(ErrorWave))
1370        FuncFit IR3J_SphereFormfactor W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1371//              else
1372//                      FuncFit PorodInLogLog W_coef CursorAWave[pcsr(A),pcsr(B)] /X=CursorAXWave /D /C=T_Constraints                   
1373//              endif
1374        if (V_FitError!=0)      //there was error in fitting
1375                RemoveFromGraph $("fit_"+NameOfWave(CursorAWave))
1376                beep
1377                Abort "Fitting error, check starting parameters and fitting limits"
1378        endif
1379        Wave W_sigma
1380        string TagText
1381        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])
1382        TagText+="\r chi-square = "+num2str(V_chisq)
1383        string TagName= "SphereFit"
1384        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1385        SphereScalingConst=W_coef[0]    //PC
1386        SphereRadius=W_coef[1]  //Radius
1387        DataBackground=W_coef[2]        //Background
1388        SetDataFolder oldDf
1389
1390end
1391
1392//**********************************************************************************************************
1393//**********************************************************************************************************
1394Function IR3J_SphereFormfactor(w,Q) : FitFunc
1395        Wave w
1396        Variable Q
1397
1398        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1399        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1400        //CurveFitDialog/ Equation:
1401        //CurveFitDialog/ f(Q) = ScalingParameter * BesJ(QR) + Background
1402        //CurveFitDialog/ End of Equation
1403        //CurveFitDialog/ Independent Variables 1
1404        //CurveFitDialog/ Q
1405        //CurveFitDialog/ Coefficients 2
1406        //CurveFitDialog/ w[0] = ScalingParameter
1407        //CurveFitDialog/ w[1] = Radius
1408        //CurveFitDialog/ w[2] = Background
1409
1410        variable QR=Q*w[1]
1411
1412        return w[0] * (3/(QR*QR*QR))*(sin(QR)-(QR*cos(QR))) + w[2]
1413End
1414
1415//**********************************************************************************************************
1416//**********************************************************************************************************
1417
1418static Function IR3J_FitSpheroid()
1419       
1420        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1421        IR3J_CreateCheckGraphs()
1422        DFref oldDf= GetDataFolderDFR()
1423        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1424        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1425        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1426        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1427        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1428        NVAR Spheroid_Beta = root:Packages:Irena:SimpleFits:Spheroid_Beta
1429        NVAR Spheroid_Radius = root:Packages:Irena:SimpleFits:Spheroid_Radius
1430        NVAR Spheroid_ScalingConstant = root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1431        NVAR DataBackground=root:Packages:Irena:SimpleFits:DataBackground
1432        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1433        Make/D/N=0/O W_coef, LocalEwave
1434        Make/D/T/N=0/O T_Constraints
1435        Wave/Z W_sigma
1436        Redimension /N=4 W_coef, LocalEwave
1437        Redimension/N=4 T_Constraints
1438        T_Constraints[0] = {"K0 > 0"}
1439        T_Constraints[1] = {"K1 > 3"}
1440        T_Constraints[2] = {"K2 < 20"}
1441        T_Constraints[3] = {"K2 > 0.05"}
1442        T_Constraints[4] = {"K3 < K0/20"}
1443        Wave/Z CursorAWave = CsrWaveRef(A, "IR3J_LogLogDataDisplay")
1444        Wave/Z CursorBWave = CsrWaveRef(B, "IR3J_LogLogDataDisplay")
1445        Wave CursorAXWave= CsrXWaveRef(A, "IR3J_LogLogDataDisplay")
1446        Wave OriginalDataErrorWave=root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1447        if(!WaveExists(CursorAWave)||!WaveExists(CursorBWave))
1448                Abort "Cursors are not properly set on same wave"
1449        endif
1450        //make a good starting guesses:
1451        Spheroid_ScalingConstant=CursorAWave[DataQstartPoint]
1452        Spheroid_Radius=2*pi/CursorAWave[DataQstartPoint]
1453        DataBackground=0.01*CursorAwave[DataQEndPoint]
1454        Spheroid_Beta = 1
1455        W_coef = {Spheroid_ScalingConstant, Spheroid_Radius,Spheroid_Beta,DataBackground}
1456       
1457        LocalEwave[0]=(Spheroid_ScalingConstant/20)
1458        LocalEwave[1]=(Spheroid_Radius/20)
1459        LocalEwave[2]=(1/20)
1460        LocalEwave[3]=(DataBackground/20)
1461
1462        variable/g V_FitError=0                 //This should prevent errors from being generated
1463//              if (FitUseErrors && WaveExists(ErrorWave))
1464        FuncFit IR3J_SpheroidFormfactor W_coef CursorAWave[DataQstartPoint,DataQEndPoint] /X=CursorAXWave /C=T_Constraints /W=OriginalDataErrorWave /I=1
1465//              else
1466//                      FuncFit PorodInLogLog W_coef CursorAWave[pcsr(A),pcsr(B)] /X=CursorAXWave /D /C=T_Constraints                   
1467//              endif
1468        if (V_FitError!=0)      //there was error in fitting
1469                RemoveFromGraph $("fit_"+NameOfWave(CursorAWave))
1470                beep
1471                Abort "Fitting error, check starting parameters and fitting limits"
1472        endif
1473        Wave W_sigma
1474        AchievedChiSquare = V_chisq/(DataQEndPoint-DataQstartPoint)
1475        string TagText
1476        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])
1477        TagText+="\r Background = "+num2str(W_coef[3])
1478        TagText+="\r chi-square = "+num2str(V_chisq)
1479        string TagName= "SpheroidFit"
1480        Tag/C/W=IR3J_LogLogDataDisplay/N=$(TagName)/L=2/X=-15.00/Y=-15.00  $NameOfWave(CursorAWave), ((DataQstartPoint + DataQEndPoint)/2),TagText     
1481        Spheroid_ScalingConstant        =W_coef[0]      //scale
1482        Spheroid_Radius                         =W_coef[1]      //Radius
1483        Spheroid_Beta                           =W_coef[2]      //beta
1484        DataBackground                          =W_coef[3]      //Background
1485        SetDataFolder oldDf
1486
1487end
1488//**********************************************************************************************************
1489//**********************************************************************************************************
1490Function IR3J_SpheroidFormfactor(w,Q) : FitFunc
1491        Wave w
1492        Variable Q
1493
1494        //CurveFitDialog/ These comments were created by the Curve Fitting dialog. Altering them will
1495        //CurveFitDialog/ make the function less convenient to work with in the Curve Fitting dialog.
1496        //CurveFitDialog/ Equation:
1497        //CurveFitDialog/ f(Q) = ScalingParameter * SpheroidFF(Q, R, beta) + Background
1498        //CurveFitDialog/ End of Equation
1499        //CurveFitDialog/ Independent Variables 1
1500        //CurveFitDialog/ Q
1501        //CurveFitDialog/ Coefficients 2
1502        //CurveFitDialog/ w[0] = ScalingParameter
1503        //CurveFitDialog/ w[1] = Radius
1504        //CurveFitDialog/ w[2] = Beta - aspect ratio
1505        //CurveFitDialog/ w[3] = Background
1506
1507        return w[0]*IR1T_CalcIntgSpheroidFFPoints(Q,w[1],w[2])+w[3]
1508End
1509
1510
1511
1512
1513//**********************************************************************************************************
1514//**********************************************************************************************************
1515//**********************************************************************************************************
1516static Function IR3J_CalculateModel()
1517
1518        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1519        IR3J_CreateCheckGraphs()
1520        DFref oldDf= GetDataFolderDFR()
1521        SetDataFolder root:Packages:Irena:SimpleFits                                    //go into the folder
1522        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1523        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1524        NVAR DataQEndPoint = root:Packages:Irena:SimpleFits:DataQEndPoint
1525        NVAR DataQstartPoint = root:Packages:Irena:SimpleFits:DataQstartPoint
1526        Wave OriginalDataIntWave                =root:Packages:Irena:SimpleFits:OriginalDataIntWave
1527        Wave OriginalDataQWave          =root:Packages:Irena:SimpleFits:OriginalDataQWave
1528        Wave OriginalDataErrorWave      =root:Packages:Irena:SimpleFits:OriginalDataErrorWave
1529        Wave/Z LinModelDataIntWave              =root:Packages:Irena:SimpleFits:LinModelDataIntWave
1530        Wave/Z LinModelDataQWave                =root:Packages:Irena:SimpleFits:LinModelDataQWave
1531        Wave/Z LinModelDataEWave                =root:Packages:Irena:SimpleFits:LinModelDataEWave
1532        NVAR AchievedChiSquare          =root:Packages:Irena:SimpleFits:AchievedChiSquare
1533        NVAR Guinier_I0                                 = root:Packages:Irena:SimpleFits:Guinier_I0
1534        NVAR Guinier_Rg                                 =root:Packages:Irena:SimpleFits:Guinier_Rg
1535        NVAR Porod_Constant                     =root:Packages:Irena:SimpleFits:Porod_Constant
1536        NVAR Sphere_Radius                              =root:Packages:Irena:SimpleFits:Sphere_Radius
1537        NVAR Sphere_ScalingConstant     =root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
1538        NVAR Spheroid_Radius                    =root:Packages:Irena:SimpleFits:Spheroid_Radius
1539        NVAR Spheroid_ScalingConstant=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1540        NVAR Spheroid_Beta                              =root:Packages:Irena:SimpleFits:Spheroid_Beta
1541        NVAR DataBackground                     =root:Packages:Irena:SimpleFits:DataBackground
1542        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
1543
1544        Duplicate/O/R=[DataQstartPoint,DataQEndPoint] OriginalDataQWave, ModelLogLogQ, ModelLogLogInt, NormalizedResidualLogLogQ
1545        Duplicate/O/R=[DataQstartPoint,DataQEndPoint] OriginalDataIntWave, NormalizedResidualLogLog, ZeroLineResidualLogLog
1546        ZeroLineResidualLogLog = 0
1547        //do we need linearized data?
1548        variable UsingLinearizedModel=0
1549        if(WaveExists(LinModelDataIntWave))
1550                UsingLinearizedModel=1
1551                Duplicate/O/R=[DataQstartPoint,DataQEndPoint] LinModelDataQWave, ModelLlinLinQ2, ModelLinLinLogInt, NormalizedResidualLinLinQ
1552                Duplicate/O/R=[DataQstartPoint,DataQEndPoint] LinModelDataIntWave, NormalizedResidualLinLin, ZeroLineResidualLinLin
1553                ZeroLineResidualLinLin = 0
1554        else
1555                UsingLinearizedModel=0
1556                KillWaves/Z ModelLlinLinQ2, ModelLinLinLogInt, NormalizedResidualLinLinQ, NormalizedResidualLinLin, ZeroLineResidualLinLin
1557        endif
1558
1559        Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] OriginalDataIntWave, TempOriginalIntensity
1560        Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] OriginalDataErrorWave, TempOriginalError
1561        if(UsingLinearizedModel)
1562                Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] LinModelDataEWave, TempLinError
1563                Duplicate/Free/R=[DataQstartPoint,DataQEndPoint] LinModelDataIntWave, TempLinIntensity
1564        endif
1565        //now calculate the data...
1566        strswitch(SimpleModel)                          // Guinier
1567                case "Guinier":                                         // execute if case matches expression
1568                        ModelLogLogInt = Guinier_I0 *exp(-ModelLogLogQ[p]^2*Guinier_Rg^2/3)
1569                        if(UsingLinearizedModel)
1570                                ModelLinLinLogInt = ln(ModelLogLogInt) 
1571                        endif
1572                        break                                                           // exit from switch
1573                case "Guinier Rod":                             // Guinier rod
1574                        ModelLogLogInt = Guinier_I0*exp(-ModelLogLogQ[p]^2*Guinier_Rg^2/2)/ModelLogLogQ
1575                        if(UsingLinearizedModel)
1576                                ModelLinLinLogInt = ln(ModelLogLogInt*ModelLogLogQ)     
1577                        endif
1578                        break           
1579                case "Guinier Sheet":                           // Guinier Sheet
1580                        ModelLogLogInt = Guinier_I0 *exp(-ModelLogLogQ[p]^2*Guinier_Rg^2)/ModelLogLogQ^2
1581                        if(UsingLinearizedModel)
1582                                ModelLinLinLogInt = ln(ModelLogLogInt*ModelLogLogQ^2)   
1583                        endif
1584                        break           
1585                case "Porod":                                           // Porod
1586                        ModelLogLogInt = DataBackground+Porod_Constant * ModelLogLogQ^(-4)
1587                        if(UsingLinearizedModel)
1588                                ModelLinLinLogInt = ModelLogLogInt*ModelLogLogQ^4       
1589                        endif
1590                        break
1591                case "Sphere":                                          // spehre calculation
1592                        ModelLogLogInt = DataBackground +       Sphere_ScalingConstant * (3/(ModelLogLogQ[p]*Sphere_Radius)^3)*(sin(ModelLogLogQ[p]*Sphere_Radius)-(ModelLogLogQ[p]*Sphere_Radius*cos(ModelLogLogQ[p]*Sphere_Radius)))
1593                        break
1594                case "Spheroid":                                        // spheroid
1595                        ModelLogLogInt =        DataBackground +  Spheroid_ScalingConstant*IR1T_CalcIntgSpheroidFFPoints(ModelLogLogQ[p],Spheroid_Radius,Spheroid_Beta)
1596                        break
1597                default:                                                // optional default expression executed
1598                //nothing is default here, so set values to 0 to know there is problem.
1599                ModelLogLogInt = 0
1600                if(UsingLinearizedModel)
1601                        ModelLinLinLogInt = 0   
1602                endif           
1603        endswitch
1604        //calculate residuals, chi^2 and append to graph
1605        NormalizedResidualLogLog = (TempOriginalIntensity-ModelLogLogInt)/TempOriginalError
1606        Duplicate/Free NormalizedResidualLogLog, ChiSquareTemp
1607        ChiSquareTemp = ((TempOriginalIntensity-ModelLogLogInt)/TempOriginalError)^2
1608        AchievedChiSquare = (sum(ChiSquareTemp)/numpnts(ChiSquareTemp))
1609        CheckDisplayed /W=IR3J_LogLogDataDisplay ModelLogLogInt
1610        if(!V_flag)
1611                AppendToGraph /W=IR3J_LogLogDataDisplay  ModelLogLogInt  vs ModelLogLogQ
1612                ModifyGraph/W=IR3J_LogLogDataDisplay  lsize(ModelLogLogInt)=3,rgb(ModelLogLogInt)=(0,0,0)
1613        endif
1614        CheckDisplayed /W=IR3J_LogLogDataDisplay NormalizedResidualLogLog
1615        if(!V_flag)
1616                        //ModifyGraph /W=IR3J_LogLogDataDisplay standoff(left)=0,axisEnab(left)={0,1}
1617                        AppendToGraph /W=IR3J_LogLogDataDisplay /L=VertCrossing NormalizedResidualLogLog vs NormalizedResidualLogLogQ
1618                        ModifyGraph/W=IR3J_LogLogDataDisplay mode(NormalizedResidualLogLog)=2,rgb(NormalizedResidualLogLog)=(0,0,0)
1619                        ModifyGraph/W=IR3J_LogLogDataDisplay  mirror=1,nticks(VertCrossing)=0,axisEnab(VertCrossing)={0,0.1},freePos(VertCrossing)=0
1620                        SetAxis/W=IR3J_LogLogDataDisplay /A/E=2 VertCrossing
1621                        ModifyGraph/W=IR3J_LogLogDataDisplay standoff=0
1622                        //Label/W=IR3J_LogLogDataDisplay VertCrossing "Norm res"
1623                        AppendToGraph /W=IR3J_LogLogDataDisplay /L=VertCrossing ZeroLineResidualLogLog vs NormalizedResidualLogLogQ
1624                        ModifyGraph/W=IR3J_LogLogDataDisplay rgb(ZeroLineResidualLogLog)=(0,0,0)
1625        endif
1626        //now same, if we are using linearized data
1627        if(UsingLinearizedModel)
1628                NormalizedResidualLinLin = (TempLinIntensity-ModelLinLinLogInt)/TempLinError
1629                CheckDisplayed /W=IR3J_LinDataDisplay ModelLinLinLogInt
1630                if(!V_flag)
1631                        AppendToGraph /W=IR3J_LinDataDisplay  ModelLinLinLogInt  vs ModelLlinLinQ2
1632                        ModifyGraph/W=IR3J_LinDataDisplay  lsize(ModelLinLinLogInt)=2,rgb(ModelLinLinLogInt)=(0,0,0)
1633                endif
1634       
1635                CheckDisplayed /W=IR3J_LinDataDisplay NormalizedResidualLinLin
1636                if(!V_flag)
1637                        //AppendToGraph /W=IR3J_LinDataDisplay/R  NormalizedResidualLinLin  vs NormalizedResidualLinLinQ
1638                        //ModifyGraph/W=IR3J_LinDataDisplay mode(NormalizedResidualLinLin)=2,lsize(NormalizedResidualLinLin)=3,rgb(NormalizedResidualLinLin)=(0,0,0)
1639                        //Label/W=IR3J_LinDataDisplay right "Norm res"
1640                        //ModifyGraph /W=IR3J_LinDataDisplay standoff(left)=0,axisEnab(left)={0,1}
1641                        AppendToGraph /W=IR3J_LinDataDisplay /L=VertCrossing NormalizedResidualLinLin vs NormalizedResidualLinLinQ
1642                        ModifyGraph/W=IR3J_LinDataDisplay mode(NormalizedResidualLinLin)=2,rgb(NormalizedResidualLinLin)=(0,0,0)
1643                        ModifyGraph/W=IR3J_LinDataDisplay  mirror=1,nticks(VertCrossing)=0,axisEnab(VertCrossing)={0,0.1},freePos(VertCrossing)=0
1644                        SetAxis/W=IR3J_LinDataDisplay /A/E=2 VertCrossing
1645                        ModifyGraph/W=IR3J_LinDataDisplay standoff=0
1646                        AppendToGraph /W=IR3J_LinDataDisplay /L=VertCrossing ZeroLineResidualLinLin vs NormalizedResidualLinLinQ
1647                        ModifyGraph /W=IR3J_LinDataDisplay rgb(ZeroLineResidualLinLin)=(0,0,0)
1648                endif
1649
1650        endif
1651        SetDataFolder oldDf
1652
1653end
1654//**********************************************************************************************************
1655//**********************************************************************************************************
1656//**********************************************************************************************************
1657static Function IR3J_SaveResultsToNotebook()
1658
1659        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1660        IR1_CreateResultsNbk()
1661        DFref oldDf= GetDataFolderDFR()
1662        SetDataFolder root:Packages:Irena:SimpleFits                                                            //go into the folder
1663        SVAR  DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
1664        SVAR  IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
1665        SVAR  QWavename=root:Packages:Irena:SimpleFits:QWavename
1666        SVAR  ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
1667        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
1668        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1669        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1670        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1671        NVAR Guinier_I0                                 = root:Packages:Irena:SimpleFits:Guinier_I0
1672        NVAR Guinier_Rg                                 =root:Packages:Irena:SimpleFits:Guinier_Rg
1673        NVAR Porod_Constant                     =root:Packages:Irena:SimpleFits:Porod_Constant
1674        NVAR Sphere_Radius                              =root:Packages:Irena:SimpleFits:Sphere_Radius
1675        NVAR Sphere_ScalingConstant     =root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
1676        NVAR Spheroid_Radius                    =root:Packages:Irena:SimpleFits:Spheroid_Radius
1677        NVAR Spheroid_ScalingConstant=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1678        NVAR Spheroid_Beta                              =root:Packages:Irena:SimpleFits:Spheroid_Beta
1679        NVAR DataBackground                     =root:Packages:Irena:SimpleFits:DataBackground
1680        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
1681        NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
1682        NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
1683        NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
1684        NVAR VOlSD_Rg                                   =root:Packages:Irena:SimpleFits:VOlSD_Rg
1685        NVAR VolSD_Volume                               =root:Packages:Irena:SimpleFits:VolSD_Volume
1686        NVAR VolSD_MeanDiameter         =root:Packages:Irena:SimpleFits:VolSD_MeanDiameter
1687        NVAR VolSD_MedianDiameter       =root:Packages:Irena:SimpleFits:VolSD_MedianDiameter
1688        NVAR VOlSD_ModeDiamater         =root:Packages:Irena:SimpleFits:VOlSD_ModeDiamater
1689        NVAR NumSD_NumPartPerCm3                =root:Packages:Irena:SimpleFits:NumSD_NumPartPerCm3
1690        NVAR NumSD_MeanDiameter         =root:Packages:Irena:SimpleFits:NumSD_MeanDiameter
1691        NVAR NumSD_MedianDiameter       =root:Packages:Irena:SimpleFits:NumSD_MedianDiameter
1692        NVAR NumSD_ModeDiamater         =root:Packages:Irena:SimpleFits:NumSD_ModeDiamater
1693
1694        if(!SaveToNotebook)
1695                return 0
1696        endif   
1697        Wave/Z ModelInt = root:Packages:Irena:SimpleFits:ModelLogLogInt
1698        Wave/Z ModelQ = root:Packages:Irena:SimpleFits:ModelLogLogQ
1699        //others can be created via Simple polots as needed...
1700        //if(!WaveExists(modelInt)||!WaveExists(ModelQ))
1701        //      return 0                        //cannot do anything, bail out.
1702        //endif
1703
1704        IR1_AppendAnyText("\r Results of "+SimpleModel+" fitting\r",1) 
1705        IR1_AppendAnyText("Date & time: \t"+Date()+"   "+time(),0)     
1706        IR1_AppendAnyText("Data from folder: \t"+DataFolderName,0)     
1707        IR1_AppendAnyText("Intensity: \t"+IntensityWaveName,0) 
1708        IR1_AppendAnyText("Q: \t"+QWavename,0) 
1709        IR1_AppendAnyText("Error: \t"+ErrorWaveName,0) 
1710        IR1_AppendAnyText(" ",0)       
1711        if(stringmatch(SimpleModel,"Guinier"))
1712                IR1_AppendAnyText("\tRg                  = "+num2str(Guinier_Rg),0)
1713                IR1_AppendAnyText("\tI0                  = "+num2str(Guinier_I0),0)
1714        elseif(stringmatch(SimpleModel,"Guinier Rod"))
1715                IR1_AppendAnyText("\tRc                  = "+num2str(Guinier_Rg),0)
1716                IR1_AppendAnyText("\tI0                  = "+num2str(Guinier_I0),0)
1717        elseif(stringmatch(SimpleModel,"Guinier Sheet"))
1718                IR1_AppendAnyText("\tThickness           = "+num2str(sqrt(12)*Guinier_Rg),0)
1719                IR1_AppendAnyText("\tI0                  = "+num2str(Guinier_I0),0)
1720        elseif(stringmatch(SimpleModel,"Porod"))
1721                IR1_AppendAnyText("\tPorod Constant      = "+num2str(Porod_Constant),0)
1722                IR1_AppendAnyText("\tBackground          = "+num2str(DataBackground),0)
1723        elseif(stringmatch(SimpleModel,"Sphere"))
1724                IR1_AppendAnyText("\tSphere Radius [A]   = "+num2str(Sphere_Radius),0)
1725                IR1_AppendAnyText("\tScaling constant    = "+num2str(Sphere_ScalingConstant),0)
1726                IR1_AppendAnyText("\tBackground = "+num2str(DataBackground),0)
1727        elseif(stringmatch(SimpleModel,"Spheroid"))
1728                IR1_AppendAnyText("\tSpheroid Radius [A] = "+num2str(Spheroid_Radius),0)
1729                IR1_AppendAnyText("\tScaling constant    = "+num2str(Spheroid_ScalingConstant),0)
1730                IR1_AppendAnyText("\tSpheroid Beta       = "+num2str(Spheroid_Beta),0)
1731                IR1_AppendAnyText("\tBackground          = "+num2str(DataBackground),0)
1732        elseif(stringmatch(SimpleModel,"Volume Size Distribution"))
1733                IR1_AppendAnyText("\tRg [A]              =  "+num2str(VOlSD_Rg),0)
1734                IR1_AppendAnyText("\tVolume fraction     =  "+num2str(VolSD_Volume),0)
1735                IR1_AppendAnyText("\tMean Diameter [A]   =  "+num2str(VolSD_MeanDiameter),0)
1736                IR1_AppendAnyText("\tMedian Diameter [A] =  "+num2str(VolSD_MedianDiameter),0)
1737                IR1_AppendAnyText("\tMode Diameter [A]   =  "+num2str(VOlSD_ModeDiamater),0)
1738        elseif(stringmatch(SimpleModel,"Number Size Distribution"))
1739                IR1_AppendAnyText("\tNum Particles/cm3   =  "+num2str(NumSD_NumPartPerCm3),0)
1740                IR1_AppendAnyText("\tMean Diameter [A]   =  "+num2str(NumSD_MeanDiameter),0)
1741                IR1_AppendAnyText("\tMedian Diameter [A] =  "+num2str(NumSD_MedianDiameter),0)
1742                IR1_AppendAnyText("\tMode Diameter [A]   =  "+num2str(NumSD_ModeDiamater),0)
1743        endif
1744
1745        IR1_AppendAnyText("Achieved Normalized chi-square = "+num2str(AchievedChiSquare),0)
1746        IR1_AppendAnyText("Qmin = "+num2str(DataQstart),0)
1747        IR1_AppendAnyText("Qmax = "+num2str(DataQEnd),0)
1748        IR1_AppendAnyGraph("IR3J_LogLogDataDisplay")
1749        DOWIndow IR3J_LinDataDisplay
1750        if(V_Flag)
1751                IR1_AppendAnyGraph("IR3J_LinDataDisplay")
1752        endif
1753        IR1_AppendAnyText("******************************************\r",0)     
1754        SetDataFolder OldDf
1755        SVAR/Z nbl=root:Packages:Irena:ResultsNotebookName     
1756        DoWindow/F $nbl
1757end
1758//**********************************************************************************************************
1759//**********************************************************************************************************
1760//**********************************************************************************************************
1761static Function IR3J_SaveResultsToFolder()
1762       
1763        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1764        DFref oldDf= GetDataFolderDFR()
1765        SetDataFolder root:Packages:Irena:SimpleFits                                                            //go into the folder
1766        SVAR  DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
1767        SVAR  IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
1768        SVAR  QWavename=root:Packages:Irena:SimpleFits:QWavename
1769        SVAR  ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
1770        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
1771        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1772        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1773        NVAR Guinier_I0 = root:Packages:Irena:SimpleFits:Guinier_I0
1774        NVAR Guinier_Rg=root:Packages:Irena:SimpleFits:Guinier_Rg
1775        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1776        NVAR Guinier_I0                                 = root:Packages:Irena:SimpleFits:Guinier_I0
1777        NVAR Guinier_Rg                                 =root:Packages:Irena:SimpleFits:Guinier_Rg
1778        NVAR Porod_Constant                     =root:Packages:Irena:SimpleFits:Porod_Constant
1779        NVAR Sphere_Radius                              =root:Packages:Irena:SimpleFits:Sphere_Radius
1780        NVAR Sphere_ScalingConstant     =root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
1781        NVAR Spheroid_Radius                    =root:Packages:Irena:SimpleFits:Spheroid_Radius
1782        NVAR Spheroid_ScalingConstant=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1783        NVAR Spheroid_Beta                              =root:Packages:Irena:SimpleFits:Spheroid_Beta
1784        NVAR DataBackground                     =root:Packages:Irena:SimpleFits:DataBackground
1785        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
1786        NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
1787        NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
1788        NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
1789        if(!SaveToFolder)
1790                return 0
1791        endif   
1792        //create new results names...
1793        //AllCurrentlyAllowedTypes+="SimFitGuinierY;SimFitGuinierRY;SimFitGuinierSY;SimFitSphereY;SimFitSpheroidY;"
1794        //save these waves here:
1795        Wave/Z ModelInt = root:Packages:Irena:SimpleFits:ModelLogLogInt
1796        Wave/Z ModelQ = root:Packages:Irena:SimpleFits:ModelLogLogQ
1797        //others can be created via Simple polots as needed...
1798        if(!WaveExists(modelInt)||!WaveExists(ModelQ))
1799                return 0                        //cannot do anything, bail out.
1800        endif
1801        //note, there is nothng to do here for :
1802        // Volume Size Distribution and Number Size Distribution
1803        //get old note here...
1804        Wave/Z SourceIntWv=$(DataFolderName+IntensityWaveName)
1805        string OldNote=note(SourceIntWv)
1806        string NoteWithResults=""
1807        variable generation=0
1808        NoteWithResults="Results of "+SimpleModel+" fitting;"+date()+";"+time()+";DataFolder="+DataFolderName+";Intensity="+IntensityWaveName+";"
1809        NoteWithResults+="Q="+QWavename+";"+"Error="+ErrorWaveName+";"+"ChiSquared="+num2str(AchievedChiSquare)+";"
1810        strswitch(SimpleModel) 
1811                case "Guinier":
1812                        NoteWithResults+="Rg="+num2str(Guinier_Rg)+";"+"I0="+num2str(Guinier_I0)+";"
1813                        NoteWithResults+=OldNote
1814                        generation=IN2G_FindAVailableResultsGen("SimFitGuinierI", DataFolderName)
1815                        Duplicate/O ModelInt, $(DataFolderName+"SimFitGuinierI_"+num2str(generation))
1816                        Duplicate/O ModelQ, $(DataFolderName+"SimFitGuinierQ_"+num2str(generation))
1817                        Wave ResultInt=$(DataFolderName+"SimFitGuinierI_"+num2str(generation))
1818                        Wave ResuldQ = $(DataFolderName+"SimFitGuinierQ_"+num2str(generation))
1819                        Note /K/NOCR ResultInt, NoteWithResults
1820                        Note /K/NOCR ResuldQ, NoteWithResults
1821                        break   
1822                case "Guinier Rod":     // execute if case matches expression
1823                        NoteWithResults+="Rc="+num2str(Guinier_Rg)+";"+"I0="+num2str(Guinier_I0)+";"
1824                        NoteWithResults+=OldNote
1825                        generation=IN2G_FindAVailableResultsGen("SimFitGuinierRI", DataFolderName)
1826                        Duplicate/O ModelInt, $(DataFolderName+"SimFitGuinierRI_"+num2str(generation))
1827                        Duplicate/O ModelQ, $(DataFolderName+"SimFitGuinierRQ_"+num2str(generation))
1828                        Wave ResultInt=$(DataFolderName+"SimFitGuinierRI_"+num2str(generation))
1829                        Wave ResuldQ = $(DataFolderName+"SimFitGuinierRQ_"+num2str(generation))
1830                        Note /K/NOCR ResultInt, NoteWithResults
1831                        Note /K/NOCR ResuldQ, NoteWithResults
1832                        break   
1833                case "Guinier Sheet":   // execute if case matches expression
1834                        NoteWithResults+="Thickness="+num2str(sqrt(12)*Guinier_Rg)+";"+"I0="+num2str(Guinier_I0)+";"
1835                        NoteWithResults+=OldNote
1836                        generation=IN2G_FindAVailableResultsGen("SimFitGuinierSI", DataFolderName)
1837                        Duplicate/O ModelInt, $(DataFolderName+"SimFitGuinierSI_"+num2str(generation))
1838                        Duplicate/O ModelQ, $(DataFolderName+"SimFitGuinierSQ_"+num2str(generation))
1839                        Wave ResultInt=$(DataFolderName+"SimFitGuinierSI_"+num2str(generation))
1840                        Wave ResuldQ = $(DataFolderName+"SimFitGuinierSQ_"+num2str(generation))
1841                        Note /K/NOCR ResultInt, NoteWithResults
1842                        Note /K/NOCR ResuldQ, NoteWithResults
1843                        break   
1844                case "Porod":   // execute if case matches expression
1845                        NoteWithResults+="PorodConstant="+num2str(Porod_Constant)+";"+"DataBackground="+num2str(DataBackground)+";"
1846                        NoteWithResults+=OldNote
1847                        generation=IN2G_FindAVailableResultsGen("SimFitPorodI_", DataFolderName)
1848                        Duplicate/O ModelInt, $(DataFolderName+"SimFitPorodI_"+num2str(generation))
1849                        Duplicate/O ModelQ, $(DataFolderName+"SimFitPorodQ_"+num2str(generation))
1850                        Wave ResultInt=$(DataFolderName+"SimFitPorodI_"+num2str(generation))
1851                        Wave ResuldQ = $(DataFolderName+"SimFitPorodQ_"+num2str(generation))
1852                        Note /K/NOCR ResultInt, NoteWithResults
1853                        Note /K/NOCR ResuldQ, NoteWithResults
1854                        break   
1855                case "Sphere":  // execute if case matches expression
1856                        NoteWithResults+="SphereRadius="+num2str(Sphere_Radius)+";"+"SphereScalingFactor="+num2str(Sphere_ScalingConstant)+";"+"SphereBackground="+num2str(DataBackground)+";"
1857                        NoteWithResults+=OldNote
1858                        generation=IN2G_FindAVailableResultsGen("SimFitSphereI_", DataFolderName)
1859                        Duplicate/O ModelInt, $(DataFolderName+"SimFitSphereI_"+num2str(generation))
1860                        Duplicate/O ModelQ, $(DataFolderName+"SimFitSphereQ_"+num2str(generation))
1861                        Wave ResultInt=$(DataFolderName+"SimFitSphereI_"+num2str(generation))
1862                        Wave ResuldQ = $(DataFolderName+"SimFitSphereQ_"+num2str(generation))
1863                        Note /K/NOCR ResultInt, NoteWithResults
1864                        Note /K/NOCR ResuldQ, NoteWithResults
1865                        break   
1866                case "Spheroid":        // execute if case matches expression
1867                        NoteWithResults+="SpheroidRadius="+num2str(Spheroid_Radius)+";"+"SpheroidAspectRatio="+num2str(Spheroid_Beta)+";"
1868                        NoteWithResults+="SpheroidScalingFactor="+num2str(Spheroid_ScalingConstant)+";"+"SpheroidBackground="+num2str(DataBackground)+";"
1869                        NoteWithResults+=OldNote
1870                        generation=IN2G_FindAVailableResultsGen("SimFitSpheroidI_", DataFolderName)
1871                        Duplicate/O ModelInt, $(DataFolderName+"SimFitSpheroidI_"+num2str(generation))
1872                        Duplicate/O ModelQ, $(DataFolderName+"SimFitSpheroidQ_"+num2str(generation))
1873                        Wave ResultInt=$(DataFolderName+"SimFitSpheroidI_"+num2str(generation))
1874                        Wave ResuldQ = $(DataFolderName+"SimFitSpheroidQ_"+num2str(generation))
1875                        Note /K/NOCR ResultInt, NoteWithResults
1876                        Note /K/NOCR ResuldQ, NoteWithResults
1877                        break
1878                case "Volume Size Distribution":        // nothing to do here...
1879                        break
1880                case "Number Size Distribution":        // nothing to do here...
1881                        break
1882                default:                        // optional default expression executed
1883                        Abort "Unknown data type, cannot save the data"
1884        endswitch       
1885end
1886//*****************************************************************************************************************
1887//**********************************************************************************************************
1888//**********************************************************************************************************
1889static Function IR3J_SaveResultsToWaves()
1890       
1891        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1892        DFref oldDf= GetDataFolderDFR()
1893        SetDataFolder root:Packages:Irena:SimpleFits                                                            //go into the folder
1894        SVAR  DataFolderName=root:Packages:Irena:SimpleFits:DataFolderName
1895        SVAR  IntensityWaveName=root:Packages:Irena:SimpleFits:IntensityWaveName
1896        SVAR  QWavename=root:Packages:Irena:SimpleFits:QWavename
1897        SVAR  ErrorWaveName=root:Packages:Irena:SimpleFits:ErrorWaveName
1898        SVAR SimpleModel=root:Packages:Irena:SimpleFits:SimpleModel
1899        NVAR DataQEnd = root:Packages:Irena:SimpleFits:DataQEnd
1900        NVAR DataQstart = root:Packages:Irena:SimpleFits:DataQstart
1901        NVAR Guinier_I0 = root:Packages:Irena:SimpleFits:Guinier_I0
1902        NVAR Guinier_Rg=root:Packages:Irena:SimpleFits:Guinier_Rg
1903        NVAR AchievedChiSquare=root:Packages:Irena:SimpleFits:AchievedChiSquare
1904        NVAR Guinier_I0                                 = root:Packages:Irena:SimpleFits:Guinier_I0
1905        NVAR Guinier_Rg                                 =root:Packages:Irena:SimpleFits:Guinier_Rg
1906        NVAR Porod_Constant                     =root:Packages:Irena:SimpleFits:Porod_Constant
1907        NVAR Sphere_Radius                              =root:Packages:Irena:SimpleFits:Sphere_Radius
1908        NVAR Sphere_ScalingConstant     =root:Packages:Irena:SimpleFits:Sphere_ScalingConstant
1909        NVAR Spheroid_Radius                    =root:Packages:Irena:SimpleFits:Spheroid_Radius
1910        NVAR Spheroid_ScalingConstant=root:Packages:Irena:SimpleFits:Spheroid_ScalingConstant
1911        NVAR Spheroid_Beta                              =root:Packages:Irena:SimpleFits:Spheroid_Beta
1912        NVAR DataBackground                     =root:Packages:Irena:SimpleFits:DataBackground
1913        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
1914        NVAR VOlSD_Rg                                   =root:Packages:Irena:SimpleFits:VOlSD_Rg
1915        NVAR VolSD_Volume                               =root:Packages:Irena:SimpleFits:VolSD_Volume
1916        NVAR VolSD_MeanDiameter         =root:Packages:Irena:SimpleFits:VolSD_MeanDiameter
1917        NVAR VolSD_MedianDiameter       =root:Packages:Irena:SimpleFits:VolSD_MedianDiameter
1918        NVAR VOlSD_ModeDiamater         =root:Packages:Irena:SimpleFits:VOlSD_ModeDiamater
1919        NVAR NumSD_NumPartPerCm3                =root:Packages:Irena:SimpleFits:NumSD_NumPartPerCm3
1920        NVAR NumSD_MeanDiameter         =root:Packages:Irena:SimpleFits:NumSD_MeanDiameter
1921        NVAR NumSD_MedianDiameter       =root:Packages:Irena:SimpleFits:NumSD_MedianDiameter
1922        NVAR NumSD_ModeDiamater         =root:Packages:Irena:SimpleFits:NumSD_ModeDiamater
1923        NVAR SaveToNotebook=root:Packages:Irena:SimpleFits:SaveToNotebook
1924        NVAR SaveToWaves=root:Packages:Irena:SimpleFits:SaveToWaves
1925        NVAR SaveToFolder=root:Packages:Irena:SimpleFits:SaveToFolder
1926        if(!SaveToWaves)
1927                return 0
1928        endif   
1929        Wave/Z ModelInt = root:Packages:Irena:SimpleFits:ModelLogLogInt
1930        Wave/Z ModelQ = root:Packages:Irena:SimpleFits:ModelLogLogQ
1931        //others can be created via Simple polots as needed...
1932        //if(!WaveExists(modelInt)||!WaveExists(ModelQ))                //Volume Size Distribution;Number Size Distribution do not have output waqves...
1933        //      return 0                        //cannot do anything, bail out.
1934        //endif
1935
1936        variable curlength
1937        if(stringmatch(SimpleModel,"Guinier"))
1938                //tabulate data for Guinier
1939                NewDATAFolder/O/S root:GuinierFitResults
1940                Wave/Z GuinierRg
1941                if(!WaveExists(GuinierRg))
1942                        make/O/N=0 GuinierRg, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
1943                        make/O/N=0/T SampleName
1944                        SetScale/P x 0,1,"A", GuinierRg
1945                        SetScale/P x 0,1,"1/A", GuinierQmin, GuinierQmax
1946                endif
1947                curlength = numpnts(GuinierRg)
1948                redimension/N=(curlength+1) SampleName,GuinierRg, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
1949                SampleName[curlength] = DataFolderName
1950                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
1951                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
1952                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
1953                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
1954                GuinierRg[curlength]                            = Guinier_Rg
1955                GuinierI0[curlength]                            = Guinier_I0
1956                GuinierQmin[curlength]                  = DataQstart
1957                GuinierQmax[curlength]                  = DataQEnd
1958                GuinierChiSquare[curlength]     = AchievedChiSquare
1959                IR3J_GetTableWithresults()
1960        elseif(stringmatch(SimpleModel,"Guinier Rod"))
1961                //tabulate data for Guinier
1962                NewDATAFolder/O/S root:GuinierRodFitResults
1963                Wave/Z GuinierRc
1964                if(!WaveExists(GuinierRc))
1965                        make/O/N=0 GuinierRc, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
1966                        make/O/N=0/T SampleName
1967                        SetScale/P x 0,1,"A", GuinierRc
1968                        SetScale/P x 0,1,"1/A", GuinierQmin, GuinierQmax
1969                endif
1970                curlength = numpnts(GuinierRc)
1971                redimension/N=(curlength+1) SampleName,GuinierRc, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
1972                SampleName[curlength] = DataFolderName
1973                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
1974                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
1975                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
1976                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
1977                GuinierRc[curlength] = Guinier_Rg
1978                GuinierI0[curlength] = Guinier_I0
1979                GuinierQmin[curlength] = DataQstart
1980                GuinierQmax[curlength] = DataQEnd
1981                GuinierChiSquare[curlength] = AchievedChiSquare
1982                IR3J_GetTableWithresults()
1983        elseif(stringmatch(SimpleModel,"Guinier Sheet"))
1984                //tabulate data for Guinier
1985                NewDATAFolder/O/S root:GuinierSheetFitResults
1986                Wave/Z GuinierTh
1987                if(!WaveExists(GuinierTh))
1988                        make/O/N=0 GuinierTh, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
1989                        make/O/N=0/T SampleName
1990                        SetScale/P x 0,1,"A", GuinierTh
1991                        SetScale/P x 0,1,"1/A", GuinierQmin, GuinierQmax
1992                endif
1993                curlength = numpnts(GuinierTh)
1994                redimension/N=(curlength+1) SampleName,GuinierTh, GuinierI0, GuinierQmin, GuinierQmax, GuinierChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
1995                SampleName[curlength] = DataFolderName
1996                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
1997                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
1998                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
1999                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2000                GuinierTh[curlength] = sqrt(12)*Guinier_Rg
2001                GuinierI0[curlength] = Guinier_I0
2002                GuinierQmin[curlength] = DataQstart
2003                GuinierQmax[curlength] = DataQEnd
2004                GuinierChiSquare[curlength] = AchievedChiSquare
2005                IR3J_GetTableWithresults()
2006        elseif(stringmatch(SimpleModel,"Porod"))
2007                //tabulate data for Porod
2008                NewDATAFolder/O/S root:PorodFitResults
2009                Wave/Z PorodConstant
2010                if(!WaveExists(PorodConstant))
2011                        make/O/N=0 PorodConstant, PorodBackground, PorodQmin, PorodQmax, PorodChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2012                        make/O/N=0/T SampleName
2013                        SetScale/P x 0,1,"cm3/A", PorodConstant                 //this may be worng, I suspect
2014                        SetScale/P x 0,1,"1/A", PorodQmin, PorodQmax
2015                endif
2016                curlength = numpnts(PorodConstant)
2017                redimension/N=(curlength+1) SampleName,PorodConstant, PorodBackground, PorodQmin, PorodQmax, PorodChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2018                SampleName[curlength] = DataFolderName
2019                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2020                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2021                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2022                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2023                PorodConstant[curlength] = Porod_Constant
2024                PorodBackground[curlength]=DataBackground
2025                PorodQmin[curlength] = DataQstart
2026                PorodQmax[curlength] = DataQEnd
2027                PorodChiSquare[curlength] = AchievedChiSquare
2028                IR3J_GetTableWithresults()
2029        elseif(stringmatch(SimpleModel,"Sphere"))
2030                //tabulate data for Porod
2031                NewDATAFolder/O/S root:SphereFitResults
2032                Wave/Z SphereRadius
2033                if(!WaveExists(SphereRadius))
2034                        make/O/N=0 SphereRadius, SphereScalingFactor, SphereBackground, SphereQmin, SphereQmax, SphereChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2035                        make/O/N=0/T SampleName
2036                        SetScale/P x 0,1,"A", SphereRadius
2037                        SetScale/P x 0,1,"1/A", SphereQmin, SphereQmax
2038                endif
2039                curlength = numpnts(SphereRadius)
2040                redimension/N=(curlength+1) SampleName,SphereRadius, SphereScalingFactor, SphereBackground, SphereQmin, SphereQmax, SphereChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2041                SampleName[curlength] = DataFolderName
2042                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2043                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2044                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2045                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2046                SphereRadius[curlength] = Sphere_Radius
2047                SphereScalingFactor[curlength] = Sphere_ScalingConstant
2048                SphereBackground[curlength]=DataBackground
2049                SphereQmin[curlength] = DataQstart
2050                SphereQmax[curlength] = DataQEnd
2051                SphereChiSquare[curlength] = AchievedChiSquare
2052                IR3J_GetTableWithresults()
2053        elseif(stringmatch(SimpleModel,"Spheroid"))
2054                //tabulate data for Porod
2055                NewDATAFolder/O/S root:SpheroidFitResults
2056                Wave/Z SpheroidRadius
2057                if(!WaveExists(SpheroidRadius))
2058                        make/O/N=0 SpheroidRadius, SpheroidScalingFactor, SpheroidAspectRatio, SpheroidBackground, SpheroidQmin, SpheroidQmax, SpheroidChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2059                        make/O/N=0/T SampleName
2060                        SetScale/P x 0,1,"A", SpheroidRadius
2061                        SetScale/P x 0,1,"1/A", SpheroidQmin, SpheroidQmax
2062                endif
2063                curlength = numpnts(SpheroidRadius)
2064                redimension/N=(curlength+1) SampleName,SpheroidRadius, SpheroidScalingFactor, SpheroidAspectRatio, SpheroidBackground, SpheroidQmin, SpheroidQmax, SpheroidChiSquare, TimeWave, TemperatureWave, PercentWave, OrderWave
2065                SampleName[curlength]                   = DataFolderName
2066                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2067                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2068                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2069                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2070                SpheroidRadius[curlength]                       = Spheroid_Radius
2071                SpheroidScalingFactor[curlength] = Spheroid_ScalingConstant
2072                SpheroidAspectRatio[curlength]  = Spheroid_Beta
2073                SpheroidBackground[curlength]   = DataBackground
2074                SpheroidQmin[curlength]                 = DataQstart
2075                SpheroidQmax[curlength]                         = DataQEnd
2076                SpheroidChiSquare[curlength]    = AchievedChiSquare
2077                IR3J_GetTableWithresults()
2078        elseif(stringmatch(SimpleModel,"Volume Size Distribution"))
2079                //tabulate data for Porod
2080                NewDATAFolder/O/S root:VolSizeDistResults
2081                Wave/Z Rg
2082                if(!WaveExists(Rg))
2083                        make/O/N=0 Rg, VolumeFraction, MeanDiaVolDist, ModeDiaVolDist, MeadianDiaVolDist, TimeWave, TemperatureWave, PercentWave, OrderWave
2084                        make/O/N=0/T SampleName
2085                        SetScale/P x 0,1,"A", Rg, MeanDiaVolDist, ModeDiaVolDist, MeadianDiaVolDist
2086                        SetScale/P x 0,1,"Fraction", VolumeFraction             
2087                endif
2088                curlength = numpnts(Rg)
2089                redimension/N=(curlength+1) SampleName,Rg, VolumeFraction, MeanDiaVolDist, ModeDiaVolDist, MeadianDiaVolDist, TimeWave, TemperatureWave, PercentWave, OrderWave
2090                SampleName[curlength]                   = DataFolderName
2091                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2092                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2093                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2094                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2095                Rg[curlength]                                           = VOlSD_Rg
2096                VolumeFraction[curlength]               = VolSD_Volume
2097                MeanDiaVolDist[curlength]               = VolSD_MeanDiameter
2098                ModeDiaVolDist[curlength]               = VOlSD_ModeDiamater
2099                MeadianDiaVolDist[curlength]    = VolSD_MedianDiameter
2100
2101                //IR3J_GetTableWithresults()
2102        elseif(stringmatch(SimpleModel,"Number Size Distribution"))
2103                //tabulate data for Porod
2104                NewDATAFolder/O/S root:NumbSizeDistResults
2105                Wave/Z NumPartsPercm3
2106                if(!WaveExists(NumPartsPercm3))
2107                        make/O/N=0 NumPartsPercm3, MeanDiaNumDist, ModeDiaNumDist, MeadianDiaNumDist, TimeWave, TemperatureWave, PercentWave, OrderWave
2108                        make/O/N=0/T SampleName
2109                        SetScale/P x 0,1,"A", MeanDiaNumDist, ModeDiaNumDist, MeadianDiaNumDist
2110                        SetScale/P x 0,1,"1/cm3", NumPartsPercm3               
2111                endif
2112                curlength = numpnts(NumPartsPercm3)
2113                redimension/N=(curlength+1) SampleName, NumPartsPercm3, MeanDiaNumDist, ModeDiaNumDist, MeadianDiaNumDist, TimeWave, TemperatureWave, PercentWave, OrderWave
2114                SampleName[curlength]                   = DataFolderName
2115                TimeWave[curlength]                             =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzmin")
2116                TemperatureWave[curlength]      =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzC")
2117                PercentWave[curlength]                  =       IN2G_IdentifyNameComponent(DataFolderName, "_xyzpct")
2118                OrderWave[curlength]                            =       IN2G_IdentifyNameComponent(DataFolderName, "_xyz")
2119                NumPartsPercm3[curlength]               = NumSD_NumPartPerCm3
2120                MeanDiaNumDist[curlength]               = NumSD_MeanDiameter
2121                ModeDiaNumDist[curlength]               = NumSD_ModeDiamater
2122                MeadianDiaNumDist[curlength]    = NumSD_MedianDiameter
2123
2124                //IR3J_GetTableWithresults()
2125        endif
2126        if(sum(TimeWave)<=0 || numtype(sum(TimeWave))!=0)
2127                KillWaves/Z  TimeWave
2128        endif
2129        if(sum(TemperatureWave)<=0 || numtype(sum(TemperatureWave))!=0)
2130                KillWaves/Z  TemperatureWave
2131        endif
2132        if(sum(PercentWave)<=0|| numtype(sum(PercentWave))!=0)
2133                KillWaves/Z  PercentWave
2134        endif
2135        if(sum(OrderWave)<=0|| numtype(sum(OrderWave))!=0)
2136                KillWaves/Z  OrderWave
2137        endif
2138       
2139end
2140//*****************************************************************************************************************
2141//*****************************************************************************************************************
2142
2143static Function IR3J_GetTableWithResults()
2144
2145        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2146        SVAR SimpleModel                                = root:Packages:Irena:SimpleFits:SimpleModel
2147        strswitch(SimpleModel)  // string switch
2148                case "Guinier": // execute if case matches expression
2149                        DoWindow IR3J_GuinierFitResultsTable
2150                        if(V_Flag)
2151                                DoWIndow/F IR3J_GuinierFitResultsTable
2152                        else
2153                                IR3J_GuinierFitResultsTableFnct()
2154                        endif           
2155                        break           // exit from switch
2156                case "Guinier Rod":     // execute if case matches expression
2157                        DoWindow IR3J_GuinierRodFitResultsTable
2158                        if(V_Flag)
2159                                DoWIndow/F IR3J_GuinierRodFitResultsTable
2160                        else
2161                                IR3J_GuinRodFitResTblFnct()
2162                        endif           
2163                        break           // exit from switch
2164                case "Guinier Sheet":   // execute if case matches expression
2165                        DoWindow IR3J_GuinierSheetFitResTable
2166                        if(V_Flag)
2167                                DoWIndow/F IR3J_GuinierSheetFitResTable
2168                        else
2169                                IR3J_GuinSheetFitResTblFnct()
2170                        endif           
2171                        break           // exit from switch
2172                case "Porod":   // execute if case matches expression
2173                        DoWindow IR3J_PorodFitResultsTable
2174                        if(V_Flag)
2175                                DoWindow/F IR3J_PorodFitResultsTable
2176                        else
2177                                IR3J_PorodFitResultsTableFnct()
2178                        endif
2179                        break
2180                case "Sphere":  // execute if case matches expression
2181                        DoWindow IR3J_SphereFFFitResultsTable
2182                        if(V_Flag)
2183                                DoWindow/F IR3J_SphereFFFitResultsTable
2184                        else
2185                                IR3J_SphFFFitResTblFnct()
2186                        endif
2187                        break
2188                case "Spheroid":        // execute if case matches expression
2189                        DoWindow IR3J_SpheroidFFFitResultsTable
2190                        if(V_Flag)
2191                                DoWindow/F IR3J_SpheroidFFFitResultsTable
2192                        else
2193                                IR3J_SpheroidFFFitResTblFnct()
2194                        endif
2195                        break
2196                case "Volume Size Distribution":        // execute if case matches expression
2197                        DoWindow IR3J_VolSDResultsTable
2198                        if(V_Flag)
2199                                DoWindow/F IR3J_VolSDResultsTable
2200                        else
2201                                IR3J_VolumeSDResTblFnct()
2202                        endif
2203                        break
2204                case "Number Size Distribution":        // execute if case matches expression
2205                        DoWindow IR3J_NumberSDResultsTable
2206                        if(V_Flag)
2207                                DoWindow/F IR3J_NumberSDResultsTable
2208                        else
2209                                IR3J_NumberSDResTblFnct()
2210                        endif
2211                        break
2212
2213                default:                        // optional default expression executed
2214
2215        endswitch
2216
2217end
2218//*****************************************************************************************************************
2219//*****************************************************************************************************************
2220
2221Function IR3J_DeleteExistingModelResults()
2222
2223        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2224        SVAR SimpleModel        = root:Packages:Irena:SimpleFits:SimpleModel
2225        DoAlert /T="This is delete resutls warning" 1, "This will delete all existing results for model : "+SimpleModel+". Do you WANT to continue?"
2226        if(V_Flag==1)
2227                strswitch(SimpleModel)  // string switch
2228                        case "Guinier": // execute if case matches expression
2229                                DoWindow/K/Z IR3J_GuinierFitResultsTable
2230                                if(DataFolderExists("root:GuinierFitResults"))
2231                                        KillDataFolder/Z root:GuinierFitResults:
2232                                        if(V_Flag!=0)
2233                                                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."
2234                                        endif
2235                                endif
2236                                break           // exit from switch
2237                        case "Guinier Rod":     // execute if case matches expression
2238                                DoWindow/K/Z IR3J_GuinierRodFitResultsTable
2239                                if(DataFolderExists("root:GuinierRodFitResults"))
2240                                        KillDataFolder/Z root:GuinierRodFitResults:
2241                                        if(V_Flag!=0)
2242                                                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."
2243                                        endif
2244                                endif
2245                                break           // exit from switch
2246                        case "Guinier Sheet":   // execute if case matches expression
2247                                DoWindow/K/Z IR3J_GuinierSheetFitResTable
2248                                if(DataFolderExists("root:GuinierSheetFitResults"))
2249                                        KillDataFolder/Z root:GuinierSheetFitResults:
2250                                        if(V_Flag!=0)
2251                                                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."
2252                                        endif
2253                                endif
2254                                break           // exit from switch
2255                        case "Porod":   // execute if case matches expression
2256                                DoWindow/K/Z  IR3J_PorodFitResultsTable
2257                                if(DataFolderExists("root:PorodFitResults"))
2258                                        KillDataFolder/Z root:PorodFitResults:
2259                                        if(V_Flag!=0)
2260                                                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."
2261                                        endif
2262                                endif
2263                                break
2264                        case "Sphere":  // execute if case matches expression
2265                                DoWindow/K/Z  IR3J_SphereFFFitResultsTable
2266                                if(DataFolderExists("root:SphereFitResults"))
2267                                        KillDataFolder/Z root:SphereFitResults:
2268                                        if(V_Flag!=0)
2269                                                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."
2270                                        endif
2271                                endif
2272                                break
2273                        case "Spheroid":        // execute if case matches expression
2274                                DoWindow/K/Z IR3J_SpheroidFFFitResultsTable
2275                                if(DataFolderExists("root:SpheroidFitResults"))
2276                                        KillDataFolder/Z root:SpheroidFitResults:
2277                                        if(V_Flag!=0)
2278                                                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."
2279                                        endif
2280                                endif
2281                                break
2282                        case "Volume Size Distribution":        // execute if case matches expression
2283                                DoWindow/K/Z IR3J_VolSDResultsTable
2284                                if(DataFolderExists("root:VolSizeDistResults"))
2285                                        KillDataFolder/Z root:VolSizeDistResults:
2286                                        if(V_Flag!=0)
2287                                                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."
2288                                        endif
2289                                endif
2290                                break
2291                        case "Number Size Distribution":        // execute if case matches expression
2292                                DoWindow/K/Z IR3J_NumberSDResultsTable
2293                                if(DataFolderExists("root:NumbSizeDistResults"))
2294                                        KillDataFolder/Z root:NumbSizeDistResults:
2295                                        if(V_Flag!=0)
2296                                                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."
2297                                        endif
2298                                endif
2299                                break
2300                        default:                        // optional default expression executed
2301                endswitch
2302        endif
2303end
2304
2305
2306//*****************************************************************************************************************
2307//*****************************************************************************************************************
2308static Function IR3J_GuinierFitResultsTableFnct() : Table
2309        PauseUpdate; Silent 1           // building window...
2310        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2311        DFref oldDf= GetDataFolderDFR()
2312        if(!DataFolderExists("root:GuinierFitResults:"))
2313                Abort "No Guinier Fit data exist."
2314        endif
2315        SetDataFolder root:GuinierFitResults:
2316        Wave/T SampleName
2317        Wave GuinierRg,GuinierI0,GuinierChiSquare,GuinierQmax,GuinierQmin
2318        Edit/K=1/W=(860,772,1831,1334)/N=IR3J_GuinierFitResultsTable SampleName,GuinierRg,GuinierI0,GuinierChiSquare,GuinierQmax as "Guinier fitting results Table"
2319        AppendToTable GuinierQmin
2320        ModifyTable format(Point)=1,width(SampleName)=304,title(SampleName)="Sample Folder"
2321        ModifyTable alignment(GuinierRg)=1,sigDigits(GuinierRg)=4,title(GuinierRg)="Rg [A]"
2322        ModifyTable alignment(GuinierI0)=1,sigDigits(GuinierI0)=4,width(GuinierI0)=100,title(GuinierI0)="Guinier I0"
2323        ModifyTable alignment(GuinierChiSquare)=1,sigDigits(GuinierChiSquare)=4,width(GuinierChiSquare)=104
2324        ModifyTable title(GuinierChiSquare)="Chi^2",alignment(GuinierQmax)=1,sigDigits(GuinierQmax)=4
2325        ModifyTable width(GuinierQmax)=92,title(GuinierQmax)="Qmax [1/A]",alignment(GuinierQmin)=1
2326        ModifyTable sigDigits(GuinierQmin)=4,width(GuinierQmin)=110,title(GuinierQmin)="Qmin [1/A]"
2327        SetDataFolder oldDf
2328EndMacro
2329//*****************************************************************************************************************
2330static Function IR3J_GuinRodFitResTblFnct() : Table
2331        PauseUpdate; Silent 1           // building window...
2332        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2333        DFref oldDf= GetDataFolderDFR()
2334        if(!DataFolderExists("root:GuinierRodFitResults:"))
2335                Abort "No Guinier Rod Fit data exist."
2336        endif
2337        SetDataFolder root:GuinierRodFitResults:
2338        Wave/T SampleName
2339        Wave GuinierRc,GuinierI0,GuinierChiSquare,GuinierQmax,GuinierQmin
2340        Edit/K=1/W=(860,772,1831,1334)/N=IR3J_GuinierRodFitResultsTable SampleName,GuinierRc,GuinierI0,GuinierChiSquare,GuinierQmax as "Guinier Rod fitting results Table"
2341        AppendToTable GuinierQmin
2342        ModifyTable format(Point)=1,width(SampleName)=304,title(SampleName)="Sample Folder"
2343        ModifyTable alignment(GuinierRc)=1,sigDigits(GuinierRc)=4,title(GuinierRc)="Rc [A]"
2344        ModifyTable alignment(GuinierI0)=1,sigDigits(GuinierI0)=4,width(GuinierI0)=100,title(GuinierI0)="Guinier I0"
2345        ModifyTable alignment(GuinierChiSquare)=1,sigDigits(GuinierChiSquare)=4,width(GuinierChiSquare)=104
2346        ModifyTable title(GuinierChiSquare)="Chi^2",alignment(GuinierQmax)=1,sigDigits(GuinierQmax)=4
2347        ModifyTable width(GuinierQmax)=92,title(GuinierQmax)="Qmax [1/A]",alignment(GuinierQmin)=1
2348        ModifyTable sigDigits(GuinierQmin)=4,width(GuinierQmin)=110,title(GuinierQmin)="Qmin [1/A]"
2349        SetDataFolder oldDf
2350EndMacro
2351//*****************************************************************************************************************
2352static Function IR3J_GuinSheetFitResTblFnct() : Table
2353        PauseUpdate; Silent 1           // building window...
2354        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2355        DFref oldDf= GetDataFolderDFR()
2356        if(!DataFolderExists("root:GuinierSheetFitResults:"))
2357                Abort "No Guinier Sheet Fit data exist."
2358        endif
2359        SetDataFolder root:GuinierSheetFitResults:
2360        Wave/T SampleName
2361        Wave GuinierTh,GuinierI0,GuinierChiSquare,GuinierQmax,GuinierQmin
2362        Edit/K=1/W=(860,772,1831,1334)/N=IR3J_GuinierSheetFitResTable SampleName,GuinierTh,GuinierI0,GuinierChiSquare,GuinierQmax as "Guinier Sheet fitting results Table"
2363        AppendToTable GuinierQmin
2364        ModifyTable format(Point)=1,width(SampleName)=304,title(SampleName)="Sample Folder"
2365        ModifyTable alignment(GuinierTh)=1,sigDigits(GuinierTh)=4,title(GuinierTh)="Tc [A]"
2366        ModifyTable alignment(GuinierI0)=1,sigDigits(GuinierI0)=4,width(GuinierI0)=100,title(GuinierI0)="Guinier I0"
2367        ModifyTable alignment(GuinierChiSquare)=1,sigDigits(GuinierChiSquare)=4,width(GuinierChiSquare)=104
2368        ModifyTable title(GuinierChiSquare)="Chi^2",alignment(GuinierQmax)=1,sigDigits(GuinierQmax)=4
2369        ModifyTable width(GuinierQmax)=92,title(GuinierQmax)="Qmax [1/A]",alignment(GuinierQmin)=1
2370        ModifyTable sigDigits(GuinierQmin)=4,width(GuinierQmin)=110,title(GuinierQmin)="Qmin [1/A]"
2371        SetDataFolder oldDf
2372EndMacro
2373
2374//*****************************************************************************************************************
2375Function IR3J_PorodFitResultsTableFnct() : Table
2376        PauseUpdate; Silent 1           // building window...
2377        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2378        String fldrSav0= GetDataFolder(1)
2379        if(!DataFolderExists("root:PorodFitResults:"))
2380                Abort "No Porod Fit data exist."
2381        endif
2382        SetDataFolder root:PorodFitResults:
2383        Wave/T SampleName
2384        Wave PorodConstant,PorodBackground,PorodChiSquare, PorodQmax,PorodQmin
2385        Edit/K=1/W=(576,346,1528,878)/N=IR3J_PorodFitResultsTable SampleName,PorodConstant,PorodBackground,PorodChiSquare as "Porod fitting results Table"
2386        AppendToTable PorodQmax,PorodQmin
2387        ModifyTable format(Point)=1,width(SampleName)=314,title(SampleName)="Sample Folder"
2388        ModifyTable alignment(PorodConstant)=1,sigDigits(PorodConstant)=4,width(PorodConstant)=122
2389        ModifyTable title(PorodConstant)="Porod Constant",alignment(PorodBackground)=1,sigDigits(PorodBackground)=4
2390        ModifyTable width(PorodBackground)=110,title(PorodBackground)="Background",alignment(PorodChiSquare)=1
2391        ModifyTable sigDigits(PorodChiSquare)=4,width(PorodChiSquare)=106,title(PorodChiSquare)="Chi^2"
2392        ModifyTable alignment(PorodQmax)=1,sigDigits(PorodQmax)=4,title(PorodQmax)="Qmax [1/A]"
2393        ModifyTable alignment(PorodQmin)=1,sigDigits(PorodQmin)=4,width(PorodQmin)=94,title(PorodQmin)="Qmin [1/A]"
2394        SetDataFolder fldrSav0
2395EndMacro
2396//*****************************************************************************************************************
2397Function IR3J_SphFFFitResTblFnct() : Table
2398        PauseUpdate; Silent 1           // building window...
2399        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2400        String fldrSav0= GetDataFolder(1)
2401        if(!DataFolderExists("root:SphereFitResults:"))
2402                Abort "No Sphere FF Fit data exist."
2403        endif
2404        SetDataFolder root:SphereFitResults:
2405        Wave/T SampleName
2406        Wave SphereRadius,SphereScalingFactor,SphereBackground,SphereChiSquare,SphereQmax,SphereQmin
2407        Edit/K=1/W=(576,784,1527,1226)/N=IR3J_SphereFFFitResultsTable SampleName,SphereRadius,SphereScalingFactor,SphereBackground as "Sphere FF fiting results table"
2408        AppendToTable SphereChiSquare,SphereQmax,SphereQmin
2409        ModifyTable format(Point)=1,width(SampleName)=330,title(SampleName)="Sample Folder"
2410        ModifyTable alignment(SphereRadius)=1,sigDigits(SphereRadius)=4,width(SphereRadius)=86
2411        ModifyTable title(SphereRadius)="Radius [A]",alignment(SphereScalingFactor)=1,sigDigits(SphereScalingFactor)=4
2412        ModifyTable title(SphereScalingFactor)="Scaling fact.",alignment(SphereBackground)=1
2413        ModifyTable sigDigits(SphereBackground)=4,title(SphereBackground)="Background",alignment(SphereChiSquare)=1
2414        ModifyTable sigDigits(SphereChiSquare)=4,title(SphereChiSquare)="Chi^2",alignment(SphereQmax)=1
2415        ModifyTable sigDigits(SphereQmax)=4,title(SphereQmax)="Qmax [1/A]",alignment(SphereQmin)=1
2416        ModifyTable sigDigits(SphereQmin)=4,width(SphereQmin)=88,title(SphereQmin)="Qmin [1/A]"
2417        SetDataFolder fldrSav0
2418EndMacro
2419//*****************************************************************************************************************
2420
2421Function IR3J_SpheroidFFFitResTblFnct() : Table
2422        PauseUpdate; Silent 1           // building window...
2423        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2424        String fldrSav0= GetDataFolder(1)
2425        if(!DataFolderExists("root:SpheroidFitResults:"))
2426                Abort "No Spheroid FF Fit data exist."
2427        endif
2428        SetDataFolder root:SpheroidFitResults:
2429        Wave/T SampleName
2430        Wave SpheroidRadius,SpheroidAspectRatio,SpheroidScalingFactor,SpheroidChiSquare,SpheroidBackground,SpheroidQmax,SpheroidQmin
2431        Edit/K=1/W=(528,552,1494,1048)/N=IR3J_SpheroidFFFitResultsTable SampleName,SpheroidRadius,SpheroidAspectRatio,SpheroidScalingFactor as "Spheroid FF fitting results table"
2432        AppendToTable SpheroidChiSquare,SpheroidBackground,SpheroidQmax,SpheroidQmin
2433        ModifyTable format(Point)=1,width(SampleName)=306,title(SampleName)="Sample Folder"
2434        ModifyTable alignment(SpheroidRadius)=1,sigDigits(SpheroidRadius)=4,title(SpheroidRadius)="Radius [A]"
2435        ModifyTable alignment(SpheroidAspectRatio)=1,sigDigits(SpheroidAspectRatio)=3,title(SpheroidAspectRatio)="Aspect Ratio"
2436        ModifyTable alignment(SpheroidScalingFactor)=1,sigDigits(SpheroidScalingFactor)=4
2437        ModifyTable title(SpheroidScalingFactor)="Scaling fact.",alignment(SpheroidChiSquare)=1
2438        ModifyTable sigDigits(SpheroidChiSquare)=4,title(SpheroidChiSquare)="Chi^2",alignment(SpheroidBackground)=1
2439        ModifyTable sigDigits(SpheroidBackground)=4,title(SpheroidBackground)="Background"
2440        ModifyTable alignment(SpheroidQmax)=1,sigDigits(SpheroidQmax)=4,title(SpheroidQmax)="Qmax [1/A]"
2441        ModifyTable alignment(SpheroidQmin)=1,sigDigits(SpheroidQmin)=4,title(SpheroidQmin)="Qmin [1/A]"
2442        SetDataFolder fldrSav0
2443EndMacro
2444//*****************************************************************************************************************
2445
2446Function IR3J_VolumeSDResTblFnct() : Table
2447        PauseUpdate; Silent 1           // building window...
2448        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2449        String fldrSav0= GetDataFolder(1)
2450        if(!DataFolderExists("root:VolSizeDistResults:"))
2451                Abort "No Volume Size Distribution analysis data exist."
2452        endif
2453        SetDataFolder root:VolSizeDistResults:
2454        Wave/T SampleName
2455        Wave Rg,VolumeFraction,MeanDiaVolDist,ModeDiaVolDist,MeadianDiaVolDist 
2456        Edit/K=1/W=(238,397,1078,679)/N=IR3J_VolSDResultsTable SampleName,Rg,VolumeFraction,MeanDiaVolDist,ModeDiaVolDist as "Volume Size Distribution Analysis"
2457        AppendToTable MeadianDiaVolDist
2458        ModifyTable format(Point)=1,width(SampleName)=264,title(SampleName)="Sample name"
2459        ModifyTable alignment(Rg)=1,sigDigits(Rg)=4,title(Rg)="Rg [A]",alignment(VolumeFraction)=1
2460        ModifyTable sigDigits(VolumeFraction)=3,title(VolumeFraction)="Vol. Fraction",alignment(MeanDiaVolDist)=1
2461        ModifyTable sigDigits(MeanDiaVolDist)=4,title(MeanDiaVolDist)="Mean Dia [A]",alignment(ModeDiaVolDist)=1
2462        ModifyTable sigDigits(ModeDiaVolDist)=4,title(ModeDiaVolDist)="Mode dia [A]",alignment(MeadianDiaVolDist)=1
2463        ModifyTable sigDigits(MeadianDiaVolDist)=4,width(MeadianDiaVolDist)=100,title(MeadianDiaVolDist)="Meadian Dia [A]"
2464        SetDataFolder fldrSav0
2465EndMacro
2466
2467//*****************************************************************************************************************
2468
2469Function IR3J_NumberSDResTblFnct() : Table
2470        PauseUpdate; Silent 1           // building window...
2471        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2472        String fldrSav0= GetDataFolder(1)
2473        if(!DataFolderExists("root:NumbSizeDistResults:"))
2474                Abort "No Number Size Distribution analysis data exist."
2475        endif
2476        SetDataFolder root:NumbSizeDistResults:
2477        Wave/T SampleName
2478        Wave NumPartsPercm3,MeanDiaNumDist,ModeDiaNumDist,MeadianDiaNumDist
2479        Edit/K=1/W=(238,397,1078,679)/N=IR3J_NumberSDResultsTable SampleName,NumPartsPercm3,MeanDiaNumDist,ModeDiaNumDist,MeadianDiaNumDist as "Volume Size Distribution Analysis"
2480        ModifyTable format(Point)=1,width(SampleName)=264,title(SampleName)="Sample name"
2481        ModifyTable alignment(NumPartsPercm3)=1,sigDigits(NumPartsPercm3)=4,title(NumPartsPercm3)="Num Particles [1/cm3]"
2482        ModifyTable alignment(MeanDiaNumDist)=1, width(NumPartsPercm3)=120
2483        ModifyTable sigDigits(MeanDiaNumDist)=4,title(MeanDiaNumDist)="Mean Dia [A]",alignment(ModeDiaNumDist)=1
2484        ModifyTable sigDigits(ModeDiaNumDist)=4,title(ModeDiaNumDist)="Mode dia [A]",alignment(MeadianDiaNumDist)=1
2485        ModifyTable sigDigits(MeadianDiaNumDist)=4,width(MeadianDiaNumDist)=100,title(MeadianDiaNumDist)="Meadian Dia [A]"
2486        SetDataFolder fldrSav0
2487EndMacro
2488
2489
2490
2491//*****************************************************************************************************************
2492//*****************************************************************************************************************
2493
2494Function IR3J_PopMenuProc(pa) : PopupMenuControl
2495        STRUCT WMPopupAction &pa
2496
2497        switch( pa.eventCode )
2498                case 2: // mouse up
2499                        Variable popNum = pa.popNum
2500                        String popStr = pa.popStr
2501                        if(StringMatch(pa.ctrlName, "SimpleModel" ))
2502                                SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
2503                                SimpleModel = popStr
2504                                IR3J_SetupControlsOnMainpanel()
2505                                KillWaves/Z $("root:Packages:Irena:SimpleFits:ModelLogLogInt")
2506                                KillWaves/Z $("root:Packages:Irena:SimpleFits:ModelLogLogQ")
2507                                KillWIndow/Z IR3J_LinDataDisplay
2508                                KillWindow/Z IR3J_LogLogDataDisplay
2509                                IR3J_CreateCheckGraphs()
2510                        endif
2511                       
2512                        break
2513                case -1: // control being killed
2514                        break
2515        endswitch
2516
2517        return 0
2518End
2519
2520//*****************************************************************************************************************
2521//*****************************************************************************************************************
2522//*****************************************************************************************************************
2523
2524static Function IR3J_SetupControlsOnMainpanel()
2525       
2526        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2527        SVAR SimpleModel = root:Packages:Irena:SimpleFits:SimpleModel
2528        DoWindow IR3J_SimpleFitsPanel
2529        if(V_Flag)
2530
2531                Setvariable Guinier_I0, disable=1
2532                SetVariable Guinier_Rg, disable=1
2533                SetVariable Porod_Constant, disable=1
2534                Setvariable Sphere_ScalingConstant,  disable=1
2535                SetVariable Sphere_Radius, disable=1
2536                Setvariable Spheroid_ScalingConstant,  disable=1
2537                SetVariable Spheroid_Radius, disable=1
2538                Setvariable Spheroid_Beta,  disable=1
2539                SetVariable DataBackground,  disable=1
2540
2541                strswitch(SimpleModel)  // string switch
2542                        case "Guinier": // execute if case matches expression
2543                                Setvariable Guinier_I0, disable=0
2544                                SetVariable Guinier_Rg, disable=0
2545                                break           // exit from switch
2546                        case "Porod":   // execute if case matches expression
2547                                SetVariable Porod_Constant, disable=0
2548                                SetVariable DataBackground,  disable=0
2549                                break
2550                        case "Sphere":  // execute if case matches expression
2551                                Setvariable Sphere_ScalingConstant,  disable=0
2552                                SetVariable Sphere_Radius, disable=0
2553                                SetVariable DataBackground,  disable=0
2554                                break
2555                        case "Spheroid":        // execute if case matches expression
2556                                Setvariable Spheroid_ScalingConstant,  disable=0
2557                                SetVariable Spheroid_Radius, disable=0
2558                                Setvariable Spheroid_Beta,  disable=0
2559                                SetVariable DataBackground,  disable=0
2560                                break
2561                        default:                        // optional default expression executed
2562
2563                endswitch
2564        endif
2565end
2566
2567//*****************************************************************************************************************
2568//*****************************************************************************************************************
2569//*****************************************************************************************************************
2570//              SetWindow IR3J_LogLogDataDisplay, hook(SimpleFitsLogCursorMoved) = IR3J_GraphWindowHook
2571//              SetWindow IR3J_LinDataDisplay, hook(SimpleFitsLinCursorMoved) = IR3J_GraphWindowHook
Note: See TracBrowser for help on using the repository browser.