source: sans/Release/trunk/NCNR_User_Procedures/SANS/Analysis/Models/NewModels_2006/LamellarPS_v40.ipf @ 345

Last change on this file since 345 was 345, checked in by srkline, 15 years ago

Merging NewModels_2006 back into where it belongs

File size: 7.9 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 is two-phase,
8// from the solvent and uniform bilayer. 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_Lamellar" 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(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 (^1) for model: "
53        Prompt qmax "Enter maximum q-value (^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, ywave_LamellarPS
60        xwave_LamellarPS =  alog(log(qmin) + x*((log(qmax)-log(qmin))/num))
61        Make/O/D coef_LamellarPS = {1,400,30,0.15,1e-6,6.3e-6,20,0.1,0}                 //CH#2
62        make/o/t parameters_LamellarPS = {"Scale","Lamellar spacing, D (A)","Bilayer Thick (delta) (A)","polydisp of Bilayer Thickness","SLD bilayer (A^-2)","SLD solvent (A^-2)","# of Lamellar plates","Caille parameter","Incoherent Bgd (cm-1)"}    //CH#3
63        Edit parameters_LamellarPS, coef_LamellarPS
64        ModifyTable width(parameters_LamellarPS)=160
65       
66        Variable/G root:g_LamellarPS
67        g_LamellarPS := LamellarPS(coef_LamellarPS, ywave_LamellarPS, xwave_LamellarPS)
68        Display ywave_LamellarPS vs xwave_LamellarPS
69        ModifyGraph marker=29, msize=2, mode=4
70        ModifyGraph log=1
71        Label bottom "q (\\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 epsilon_LamellarPS
76        epsilon_LamellarPS = 1e-4
77        epsilon_LamellarPS[6] = 1               //to make the derivative useful
78        AutoPositionWindow/M=1/R=$(WinName(0,1)) $WinName(0,2)
79       
80        AddModelToStrings("LamellarPS","coef_LamellarPS","LamellarPS")
81End
82
83// - sets up a dependency to a wrapper, not the actual SmearedModelFunction
84//Proc PlotSmeared_LamellarPS(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 = {1,400,30,0.15,6e-6,20,0.1,0}          //CH#4
100//      make/o/t smear_parameters_LamellarPS = {"Scale","Lamellar spacing, D (A)","Bilayer Thick (delta) (A)","polydisp of Bilayer Thickness","contrast (A^-2)","# of Lamellar plates","Caille parameter","Incoherent Bgd (cm-1)"}
101//      Edit smear_parameters_LamellarPS,smear_coef_LamellarPS                                  //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,smeared_qvals                                //
106//      SetScale d,0,0,"1/cm",smeared_LamellarPS                                                        //
107//                                     
108//      Variable/G gs_LamellarPS=0
109//      gs_LamellarPS := fLamellarPS_Smeared(smear_coef_LamellarPS,smeared_LamellarPS,smeared_qvals)    //this wrapper fills the STRUCT
110//     
111//      Display smeared_LamellarPS vs smeared_qvals                                                                     //
112//      ModifyGraph log=1,marker=29,msize=2,mode=4
113//      Label bottom "q (\\S-1\\M)"
114//      Label left "I(q) (cm\\S-1\\M)"
115//     
116//      SetDataFolder root:
117//End
118
119
120
121
122
123//AAO version, uses XOP if available
124// simply calls the original single point calculation with
125// a wave assignment (this will behave nicely if given point ranges)
126Function LamellarPS(cw,yw,xw) : FitFunc
127        Wave cw,yw,xw
128       
129#if exists("LamellarPSX")
130        yw = LamellarPSX(cw,xw)
131#else
132        yw = fLamellarPS(cw,xw)
133#endif
134        return(0)
135End
136
137// instrument resolution IS included here in S(Q)
138Function fLamellarPS(w,x) : FitFunc
139        Wave w
140        Variable x
141//       Input (fitting) variables are:
142//[0]Scale
143//[1]Lam spacing, D
144//[2]Bilay Thick (delta)
145//[3]polydisp of the bilayer thickness
146//[4]contrast
147//[5]# of Lam plates
148//[6]Caille parameter
149//[7]Incoherent Bgd (cm-1)
150       
151//      give them nice names
152        Variable scale,dd,del,sig,contr,NN,Cp,bkg,sldb,slds
153        scale = w[0]
154        dd = w[1]
155        del = w[2]
156        sig = w[3]*del
157        sldb = w[4]
158        slds = w[5]
159        contr = sldb-slds
160        NN = trunc(w[6])                //be sure that NN is an integer
161        Cp = w[7]
162        bkg = w[8]
163       
164//      local variables
165        Variable inten, qval,Pq,Sq,ii,alpha,temp,t1,t2,t3,dQ
166       
167        NVAR Euler = root:gEuler
168        NVAR dQDefault = root:gDelQ
169        //      x is the q-value for the calculation
170        qval = x
171        //get the instrument resolution
172        SVAR/Z sigQ = gSig_Q
173        SVAR/Z qStr = gQVals
174       
175        if(SVAR_Exists(sigQ) && SVAR_Exists(qStr))
176                Wave/Z sigWave=$sigQ
177                Wave/Z sig_Qwave = $qStr
178                if(waveexists(sigWave)&&waveexists(sig_qwave))
179                        dQ = interp(qval, sig_Qwave, sigWave )
180                else
181//                      if(qval>0.01 && qval<0.012)
182//                              print "using default resolution"
183//                      endif
184                        dQ = dQDefault
185                endif
186        else
187                dQ = dQDefault
188        endif
189       
190        Pq = 2*contr^2/qval/qval*(1-cos(qval*del)*exp(-0.5*qval^2*sig^2))
191       
192        ii=0
193        Sq = 0
194        for(ii=1;ii<(NN-1);ii+=1)
195                temp = 0
196                alpha = Cp/4/pi/pi*(ln(pi*ii) + Euler)
197                t1 = 2*dQ*dQ*dd*dd*alpha
198                t2 = 2*qval*qval*dd*dd*alpha
199                t3 = dQ*dQ*dd*dd*ii*ii
200               
201                temp = 1-ii/NN
202                temp *= cos(dd*qval*ii/(1+t1))
203                temp *= exp(-1*(t2 + t3)/(2*(1+t1)) )
204                temp /= sqrt(1+t1)
205               
206                Sq += temp
207        endfor
208        Sq *= 2
209        Sq += 1
210       
211        inten = 2*Pi*scale*Pq*Sq/(dd*Qval^2)
212       
213        inten *= 1e8            // 1/A to 1/cm
214        //inten = Sq
215        Return (inten+bkg)
216End
217
218//wrapper to calculate the smeared model as an AAO-Struct
219// fills the struct and calls the ususal function with the STRUCT parameter
220//
221// used only for the dependency, not for fitting
222//
223//Function fLamellarPS_Smeared(coefW,yW,xW)
224//      Wave coefW,yW,xW
225//     
226//      String str = getWavesDataFolder(yW,0)
227//      String DF="root:"+str+":"
228//     
229//      WAVE resW = $(DF+str+"_res")
230//     
231//      STRUCT ResSmearAAOStruct fs
232//      WAVE fs.coefW = coefW   
233//      WAVE fs.yW = yW
234//      WAVE fs.xW = xW
235//      WAVE fs.resW = resW
236//     
237//      Variable err
238//      err = LamellarPS_Smeared(fs)
239//     
240//      return (0)
241//End
242
243//the smeared model calculation
244//Function LamellarPS_Smeared(s) :FitFunc
245//      Struct ResSmearAAOStruct &s
246//
247////    the name of your unsmeared model (AAO) is the first argument
248//      Smear_Model_20(LamellarPS,s.coefW,s.xW,s.yW,s.resW)
249//
250//      return(0)
251//End
252////
Note: See TracBrowser for help on using the repository browser.