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

Last change on this file since 939 was 939, checked in by ilavsky, 3 years ago

minor fixes

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