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

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

FIxes for GetHelp? button and manuals

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