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

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

Bug fixes, close to version 1beta for PDDF

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