source: sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v3.00/NewModels_2006/LamellarPS_HG.ipf @ 153

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

Changed Plot* and PlotSmeared?* naming schemes to be all consistent prefixes for the actual function name, so that the macros can be constructed from the function name, or vice versa.

also some tweaks to the wrapper to make sure that plot and append really work

File size: 8.2 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 (^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_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 (\\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
77        epsilon_LamellarPS_HG[7] = 1            //to make the derivative useful
78        AutoPositionWindow/M=1/R=$(WinName(0,1)) $WinName(0,2)
79End
80
81// - sets up a dependency to a wrapper, not the actual SmearedModelFunction
82//Proc PlotSmeared_LamellarPS_HG(str)                                                           
83//      String str
84//      Prompt str,"Pick the data folder containing the resolution you want",popup,getAList(4)
85//     
86//      // if any of the resolution waves are missing => abort
87//      if(ResolutionWavesMissingDF(str))               //updated to NOT use global strings (in GaussUtils)
88//              Abort
89//      endif
90//     
91//      SetDataFolder $("root:"+str)
92//     
93//      // constants
94//      Variable/G root:gEuler = 0.5772156649           // Euler's constant
95//      Variable/G root:gDelQ = 0.0025          //[=] 1/A, q-resolution, default value
96//      // Setup parameter table for model function
97//      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
98//      make/o/t smear_parameters_LamellarPS_HG = {"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)"}
99//      Edit smear_parameters_LamellarPS_HG,smear_coef_LamellarPS_HG                                    //display parameters in a table
100//     
101//      // output smeared intensity wave, dimensions are identical to experimental QSIG values
102//      // make extra copy of experimental q-values for easy plotting
103//      Duplicate/O $(str+"_q") smeared_LamellarPS_HG,smeared_qvals                             //
104//      SetScale d,0,0,"1/cm",smeared_LamellarPS_HG                                                     //
105//                                     
106//      Variable/G gs_LamellarPS_HG     =0
107//      gs_LamellarPS_HG         := fLamellarPS_HG_Smeared(smear_coef_LamellarPS_HG     ,smeared_LamellarPS_HG  ,smeared_qvals) //this wrapper fills the STRUCT
108//     
109//      Display smeared_LamellarPS_HG vs smeared_qvals                                                          //
110//      ModifyGraph log=1,marker=29,msize=2,mode=4
111//      Label bottom "q (\\S-1\\M)"
112//      Label left "I(q) (cm\\S-1\\M)"
113//     
114//      SetDataFolder root:
115//End
116       
117
118
119//AAO version, uses XOP if available
120// simply calls the original single point calculation with
121// a wave assignment (this will behave nicely if given point ranges)
122Function LamellarPS_HG(cw,yw,xw) : FitFunc
123        Wave cw,yw,xw
124       
125#if exists("LamellarPS_HGX")
126        yw = LamellarPS_HGX(cw,xw)
127#else
128        yw = fLamellarPS_HG(cw,xw)
129#endif
130        return(0)
131End
132
133//
134Function fLamellarPS_HG(w,x) : FitFunc
135        Wave w
136        Variable x
137//       Input (fitting) variables are:
138//[0]Scale
139//[1]repeat spacing, D
140//[2]Tail Thickness (delT)
141//[3]HG thickness (delH)
142//[4]SLD tails
143//[5]SLD HG
144//[6]SLD solvent
145//[7]# of Lam plates
146//[8]Caille parameter
147//[9]Incoherent Bgd (cm-1)
148       
149//      give them nice names
150        Variable scale,dd,delT,delH,SLD_T,SLD_H,SLD_S,NN,Cp,bkg
151        scale = w[0]
152        dd = w[1]
153        delT = w[2]
154        delH = w[3]
155        SLD_T = w[4]
156        SLD_H = w[5]
157        SLD_S = w[6]
158        NN = trunc(w[7])                //be sure that NN is an integer
159        Cp = w[8]
160        bkg = w[9]
161       
162//      local variables
163        Variable inten, qval,Pq,Sq,ii,alpha,temp,t1,t2,t3,dQ,drh,drt
164       
165        NVAR Euler = root:gEuler
166        NVAR dQDefault = root:gDelQ
167        //      x is the q-value for the calculation
168        qval = x
169        //get the instrument resolution
170        SVAR/Z sigQ = gSig_Q
171        SVAR/Z qStr = gQVals
172       
173        if(SVAR_Exists(sigQ) && SVAR_Exists(qStr))
174                Wave/Z sigWave=$sigQ
175                Wave/Z sig_Qwave = $qStr
176                if(waveexists(sigWave)&&waveexists(sig_qwave))
177                        dQ = interp(qval, sig_Qwave, sigWave )
178                else
179                        if(qval>0.01 && qval<0.012)
180                                print "using default resolution"
181                        endif
182                        dQ = dQDefault
183                endif
184        else
185                dQ = dQDefault
186        endif
187       
188        drh = SLD_H - SLD_S
189//      drt = SLD_T - SLD_H             //original
190        drt = SLD_T - SLD_S             //matches Lionel's changes in the Lamellar_HG model
191       
192        Pq = drh*(sin(qval*(delH+delT))-sin(qval*delT)) + drt*sin(qval*delT)
193        Pq *= Pq
194        Pq *= 4/(qval^2)
195       
196        ii=0
197        Sq = 0
198        for(ii=1;ii<(NN-1);ii+=1)
199                temp = 0
200                alpha = Cp/4/pi/pi*(ln(pi*ii) + Euler)
201                t1 = 2*dQ*dQ*dd*dd*alpha
202                t2 = 2*qval*qval*dd*dd*alpha
203                t3 = dQ*dQ*dd*dd*ii*ii
204               
205                temp = 1-ii/NN
206                temp *= cos(dd*qval*ii/(1+t1))
207                temp *= exp(-1*(t2 + t3)/(2*(1+t1)) )
208                temp /= sqrt(1+t1)
209               
210                Sq += temp
211        endfor
212        Sq *= 2
213        Sq += 1
214       
215        inten = 2*Pi*scale*Pq*Sq/(dd*Qval^2)
216       
217        inten *= 1e8            // 1/A to 1/cm
218        //inten = Sq
219        Return (inten+bkg)
220End
221
222//wrapper to calculate the smeared model as an AAO-Struct
223// fills the struct and calls the ususal function with the STRUCT parameter
224//
225// used only for the dependency, not for fitting
226//
227//Function fLamellarPS_HG_Smeared(coefW,yW,xW)
228//      Wave coefW,yW,xW
229//     
230//      String str = getWavesDataFolder(yW,0)
231//      String DF="root:"+str+":"
232//     
233//      WAVE resW = $(DF+str+"_res")
234//     
235//      STRUCT ResSmearAAOStruct fs
236//      WAVE fs.coefW = coefW   
237//      WAVE fs.yW = yW
238//      WAVE fs.xW = xW
239//      WAVE fs.resW = resW
240//     
241//      Variable err
242//      err = LamellarPS_HG_Smeared(fs)
243//     
244//      return (0)
245//End
246
247//////the smeared model calculation
248//Function LamellarPS_HG_Smeared(s) :FitFunc
249//      Struct ResSmearAAOStruct &s
250//
251////    the name of your unsmeared model (AAO) is the first argument
252//      Smear_Model_20(LamellarPS_HG,s.coefW,s.xW,s.yW,s.resW)
253//
254//      return(0)
255//End
256       
Note: See TracBrowser for help on using the repository browser.