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

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

Fix for Igor 7.08

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