source: sans/Dev/trunk/NCNR_User_Procedures/SANS/Analysis/Models/NewModels_2006/LamellarPS_HG_v40.ipf @ 391

Last change on this file since 391 was 391, checked in by srkline, 14 years ago

Lamellar_PS models now set the epsilon wave properly, and it doesn't get overwritten

Small fic to the wrapper to have better behavior with cursors. This issue is not done yet.

File size: 8.6 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma IgorVersion = 6.0
3
4////////////////////////////////////////////////////
5//
6// model function that calculates the scattering from
7// lamellar surfactant structures. contrast includes the
8// bilayer core, headgroups, and solvent. Integer numbers of
9// repeating bilayers (at a repeat spacing) leads to the
10// familiar lamellar peaks. Bending constant information
11// can be extracted from the Caille parameter with moderate
12// success. A number of the parameters should be held
13// fixed during the fitting procedure, as they should be well
14// known:
15//              repeat spacing D = 2*pi/Qo
16//              contrast = calculated value
17//              polydispersity should be close to 0.1-0.3
18//   Caille parameter <0.8 or 1.0
19//
20// NOTES for Curve Fitting:
21// the epsilon wave "epsilon_LamellarPS_HG" should be used to force a
22// larger derivative step for the # of repeat units, which is an integer.
23// a singular matix error will always result if you don't follow this.
24// Also, the # of repeats should be constrained to ~3<N<200, otherwise
25// the optimization can pick a VERY large N, and waste lots of time
26// in the summation loop
27//
28// instrumental resolution is taken into account in the REGULAR
29// model calculation. resolution of ONLY the S(Q) peaks are
30// included. performing the typical smearing calculation would
31// be "double smearing", so is not done.
32//
33// the delta Q parameter "gDelQ" or "dQ" is taken from the q-dependent
34// instrument resolution "abssq" column as this is the identical definition
35// as in the original reference. If the real resolution function cannot be
36// found, a default value, typical of a "medium" q-range on the NG3 SANS is
37// used, although the real values are highly preferred
38//
39// REFERENCE:   Nallet, Laversanne, and Roux, J. Phys. II France, 3, (1993) 487-502.
40//              also in J. Phys. Chem. B, 105, (2001) 11081-11088.
41//
42// 14 JULY 2003 SRK
43//
44////////////////////////////////////////////////////
45
46//this macro sets up all the necessary parameters and waves that are
47//needed to calculate the model function.
48//
49Proc PlotLamellarPS_HG(num,qmin,qmax)
50        Variable num=128, qmin=.001, qmax=.5
51        Prompt num "Enter number of data points for model: "
52        Prompt qmin "Enter minimum q-value (A^1) for model: "
53        Prompt qmax "Enter maximum q-value (A^1) for model: "
54//
55        // constants
56//      Variable/G root:gEuler = 0.5772156649           // Euler's constant
57//      Variable/G root:gDelQ = 0.0025          //[=] 1/A, q-resolution, default value
58       
59        Make/O/D/n=(num) xwave_LamellarPS_HG, ywave_LamellarPS_HG
60        xwave_LamellarPS_HG =  alog(log(qmin) + x*((log(qmax)-log(qmin))/num))
61        Make/O/D coef_LamellarPS_HG = {1,40,10,2,0.4e-6,2e-6,6e-6,30,0.001,0.001}                       //CH#2
62        make/o/t parameters_LamellarPS_HG = {"Scale","Lamellar spacing, D (A)","Tail Thick (delT) (A)","HG Thick (delH) (A)","SLD of tails (A^-2)","SLD of HG (A^-2)","SLD of solvent (A^-2)","# of Lamellar plates","Caille parameter","Incoherent Bgd (cm-1)"}        //CH#3
63        Edit parameters_LamellarPS_HG, coef_LamellarPS_HG
64        ModifyTable width(parameters_LamellarPS_HG)=160
65       
66        Variable/G root:g_LamellarPS_HG
67        g_LamellarPS_HG := LamellarPS_HG(coef_LamellarPS_HG, ywave_LamellarPS_HG,xwave_LamellarPS_HG)
68        Display ywave_LamellarPS_HG vs xwave_LamellarPS_HG
69        ModifyGraph marker=29, msize=2, mode=4
70        ModifyGraph log=1
71        Label bottom "q (A\\S-1\\M) "
72        Label left "I(q) (cm\\S-1\\M)"
73        //
74        // make epsilon wave appropriate for integer number of lamellar repeats
75        Duplicate/O coef_LamellarPS_HG epsilon_LamellarPS_HG
76        epsilon_LamellarPS_HG = 1e-4*coef_LamellarPS_HG
77        epsilon_LamellarPS_HG[7] = 1            //to make the derivative useful
78        AutoPositionWindow/M=1/R=$(WinName(0,1)) $WinName(0,2)
79       
80        AddModelToStrings("LamellarPS_HG","coef_LamellarPS_HG","LamellarPS_HG")
81End
82
83// - sets up a dependency to a wrapper, not the actual SmearedModelFunction
84Proc PlotSmearedLamellarPS_HG(str)                                                             
85        String str
86        Prompt str,"Pick the data folder containing the resolution you want",popup,getAList(4)
87       
88        // if any of the resolution waves are missing => abort
89        if(ResolutionWavesMissingDF(str))               //updated to NOT use global strings (in GaussUtils)
90                Abort
91        endif
92       
93        SetDataFolder $("root:"+str)
94       
95        // constants
96//      Variable/G root:gEuler = 0.5772156649           // Euler's constant
97//      Variable/G root:gDelQ = 0.0025          //[=] 1/A, q-resolution, default value
98        // Setup parameter table for model function
99        Make/O/D smear_coef_LamellarPS_HG = {1,40,10,2,0.4e-6,2e-6,6e-6,30,0.001,0.001}         //CH#4
100        make/o/t smear_parameters_LamellarPS_HG = {"Scale","Lamellar spacing, D (A)","Tail Thick (delT) (A)","HG Thick (delH) (A)","SLD of tails (A^-2)","SLD of HG (A^-2)","SLD of solvent (A^-2)","# of Lamellar plates","Caille parameter","Incoherent Bgd (cm-1)"}
101        Edit smear_parameters_LamellarPS_HG,smear_coef_LamellarPS_HG                                    //display parameters in a table
102       
103        // output smeared intensity wave, dimensions are identical to experimental QSIG values
104        // make extra copy of experimental q-values for easy plotting
105        Duplicate/O $(str+"_q") smeared_LamellarPS_HG,smeared_qvals                             //
106        SetScale d,0,0,"1/cm",smeared_LamellarPS_HG                                                     //
107                                       
108        Variable/G gs_LamellarPS_HG     =0
109        gs_LamellarPS_HG         := fSmearedLamellarPS_HG(smear_coef_LamellarPS_HG      ,smeared_LamellarPS_HG  ,smeared_qvals) //this wrapper fills the STRUCT
110       
111        Display smeared_LamellarPS_HG vs smeared_qvals                                                          //
112        ModifyGraph log=1,marker=29,msize=2,mode=4
113        Label bottom "q (A\\S-1\\M)"
114        Label left "I(q) (cm\\S-1\\M)"
115       
116        // make epsilon wave appropriate for integer number of lamellar repeats
117        Duplicate/O smear_coef_LamellarPS_HG epsilon_LamellarPS_HG
118        epsilon_LamellarPS_HG = 1e-4*smear_coef_LamellarPS_HG
119        epsilon_LamellarPS_HG[7] = 1            //to make the derivative useful
120       
121        SetDataFolder root:
122        AddModelToStrings("SmearedLamellarPS_HG","smear_coef_LamellarPS_HG","LamellarPS_HG")
123End
124       
125
126
127//AAO version, uses XOP if available
128// simply calls the original single point calculation with
129// a wave assignment (this will behave nicely if given point ranges)
130Function LamellarPS_HG(cw,yw,xw) : FitFunc
131        Wave cw,yw,xw
132       
133#if exists("LamellarPS_HGX")
134        yw = LamellarPS_HGX(cw,xw)
135#else
136        yw = fLamellarPS_HG(cw,xw)
137#endif
138        return(0)
139End
140
141//
142Function fLamellarPS_HG(w,x) : FitFunc
143        Wave w
144        Variable x
145//       Input (fitting) variables are:
146//[0]Scale
147//[1]repeat spacing, D
148//[2]Tail Thickness (delT)
149//[3]HG thickness (delH)
150//[4]SLD tails
151//[5]SLD HG
152//[6]SLD solvent
153//[7]# of Lam plates
154//[8]Caille parameter
155//[9]Incoherent Bgd (cm-1)
156       
157//      give them nice names
158        Variable scale,dd,delT,delH,SLD_T,SLD_H,SLD_S,NN,Cp,bkg
159        scale = w[0]
160        dd = w[1]
161        delT = w[2]
162        delH = w[3]
163        SLD_T = w[4]
164        SLD_H = w[5]
165        SLD_S = w[6]
166        NN = trunc(w[7])                //be sure that NN is an integer
167        Cp = w[8]
168        bkg = w[9]
169       
170//      local variables
171        Variable inten, qval,Pq,Sq,ii,alpha,temp,t1,t2,t3,dQ,drh,drt
172        Variable Euler = 0.5772156649
173        Variable dQDefault = 0
174        dQ = dQDefault
175//      NVAR Euler = root:gEuler
176//      NVAR dQDefault = root:gDelQ
177        //      x is the q-value for the calculation
178        qval = x
179        //get the instrument resolution
180//      SVAR/Z sigQ = gSig_Q
181//      SVAR/Z qStr = gQVals
182//     
183//      if(SVAR_Exists(sigQ) && SVAR_Exists(qStr))
184//              Wave/Z sigWave=$sigQ
185//              Wave/Z sig_Qwave = $qStr
186//              if(waveexists(sigWave)&&waveexists(sig_qwave))
187//                      dQ = interp(qval, sig_Qwave, sigWave )
188//              else
189//                      if(qval>0.01 && qval<0.012)
190//                              print "using default resolution"
191//                      endif
192//                      dQ = dQDefault
193//              endif
194//      else
195//              dQ = dQDefault
196//      endif
197       
198        drh = SLD_H - SLD_S
199//      drt = SLD_T - SLD_H             //original
200        drt = SLD_T - SLD_S             //matches Lionel's changes in the Lamellar_HG model
201       
202        Pq = drh*(sin(qval*(delH+delT))-sin(qval*delT)) + drt*sin(qval*delT)
203        Pq *= Pq
204        Pq *= 4/(qval^2)
205       
206        ii=0
207        Sq = 0
208        for(ii=1;ii<(NN-1);ii+=1)
209                temp = 0
210                alpha = Cp/4/pi/pi*(ln(pi*ii) + Euler)
211                t1 = 2*dQ*dQ*dd*dd*alpha
212                t2 = 2*qval*qval*dd*dd*alpha
213                t3 = dQ*dQ*dd*dd*ii*ii
214               
215                temp = 1-ii/NN
216                temp *= cos(dd*qval*ii/(1+t1))
217                temp *= exp(-1*(t2 + t3)/(2*(1+t1)) )
218                temp /= sqrt(1+t1)
219               
220                Sq += temp
221        endfor
222        Sq *= 2
223        Sq += 1
224       
225        inten = 2*Pi*scale*Pq*Sq/(dd*Qval^2)
226       
227        inten *= 1e8            // 1/A to 1/cm
228        //inten = Sq
229        Return (inten+bkg)
230End
231
232//wrapper to calculate the smeared model as an AAO-Struct
233// fills the struct and calls the ususal function with the STRUCT parameter
234//
235// used only for the dependency, not for fitting
236//
237Function fSmearedLamellarPS_HG(coefW,yW,xW)
238        Wave coefW,yW,xW
239       
240        String str = getWavesDataFolder(yW,0)
241        String DF="root:"+str+":"
242       
243        WAVE resW = $(DF+str+"_res")
244       
245        STRUCT ResSmearAAOStruct fs
246        WAVE fs.coefW = coefW   
247        WAVE fs.yW = yW
248        WAVE fs.xW = xW
249        WAVE fs.resW = resW
250       
251        Variable err
252        err = SmearedLamellarPS_HG(fs)
253       
254        return (0)
255End
256
257////the smeared model calculation
258Function SmearedLamellarPS_HG(s) :FitFunc
259        Struct ResSmearAAOStruct &s
260
261//      the name of your unsmeared model (AAO) is the first argument
262        Smear_Model_76(LamellarPS_HG,s.coefW,s.xW,s.yW,s.resW)
263
264        return(0)
265End
266       
Note: See TracBrowser for help on using the repository browser.