Changes in / [eb63414:a57b31d] in sasmodels
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
example/fit.py
rf4b36fa r1182da5 24 24 % section) 25 25 data = radial_data if section != "tangential" else tan_data 26 theta = 89.9 if section != "tangential" else 0 27 phi = 90 26 phi = 0 if section != "tangential" else 90 28 27 kernel = load_model(name, dtype="single") 29 28 cutoff = 1e-3 … … 31 30 if name == "ellipsoid": 32 31 model = Model(kernel, 33 scale=0.08, background=35,34 r adius_polar=15, radius_equatorial=800,32 scale=0.08, 33 r_polar=15, r_equatorial=800, 35 34 sld=.291, sld_solvent=7.105, 36 theta=theta, phi=phi, 37 theta_pd=0, theta_pd_n=0, theta_pd_nsigma=3, 35 background=0, 36 theta=90, phi=phi, 37 theta_pd=15, theta_pd_n=40, theta_pd_nsigma=3, 38 r_polar_pd=0.222296, r_polar_pd_n=1, r_polar_pd_nsigma=0, 39 r_equatorial_pd=.000128, r_equatorial_pd_n=1, r_equatorial_pd_nsigma=0, 38 40 phi_pd=0, phi_pd_n=20, phi_pd_nsigma=3, 39 radius_polar_pd=0.222296, radius_polar_pd_n=1, radius_polar_pd_nsigma=0,40 radius_equatorial_pd=.000128, radius_equatorial_pd_n=1, radius_equatorial_pd_nsigma=0,41 41 ) 42 42 43 43 44 # SET THE FITTING PARAMETERS 44 model.radius_polar.range(15, 1000) 45 model.radius_equatorial.range(15, 1000) 46 #model.theta.range(0, 90) 47 #model.theta_pd.range(0,10) 48 model.phi_pd.range(0,20) 49 model.phi.range(0, 180) 45 model.r_polar.range(15, 1000) 46 model.r_equatorial.range(15, 1000) 47 model.theta_pd.range(0, 360) 50 48 model.background.range(0,1000) 51 49 model.scale.range(0, 10) 52 50 53 51 52 54 53 elif name == "lamellar": 55 54 model = Model(kernel, 56 scale=0.08, background=0.003,55 scale=0.08, 57 56 thickness=19.2946, 58 57 sld=5.38,sld_sol=7.105, 58 background=0.003, 59 59 thickness_pd= 0.37765, thickness_pd_n=10, thickness_pd_nsigma=3, 60 60 ) 61 61 62 62 63 # SET THE FITTING PARAMETERS … … 76 77 radius_pd=.0084, radius_pd_n=10, radius_pd_nsigma=3, 77 78 length_pd=0.493, length_pd_n=10, length_pd_nsigma=3, 78 phi_pd=0, phi_pd_n=5 phi_pd_nsigma=3,)79 phi_pd=0, phi_pd_n=5, phi_pd_nsigma=3,) 79 80 """ 80 81 pars = dict( 81 82 scale=.01, background=35, 82 83 sld=.291, sld_solvent=5.77, 83 radius=250, length=178, 84 radius=250, length=178, 85 theta=90, phi=phi, 84 86 radius_pd=0.1, radius_pd_n=5, radius_pd_nsigma=3, 85 87 length_pd=0.1,length_pd_n=5, length_pd_nsigma=3, 86 theta=theta, phi=phi, 87 theta_pd=0, theta_pd_n=0, theta_pd_nsigma=3, 88 phi_pd=10, phi_pd_n=20, phi_pd_nsigma=3) 88 theta_pd=10, theta_pd_n=50, theta_pd_nsigma=3, 89 phi_pd=0, phi_pd_n=10, phi_pd_nsigma=3) 89 90 model = Model(kernel, **pars) 90 91 … … 92 93 model.radius.range(1, 500) 93 94 model.length.range(1, 5000) 94 #model.theta.range(0, 90)95 model. phi.range(0, 180)96 model. phi_pd.range(0, 30)95 model.theta.range(-90,100) 96 model.theta_pd.range(0, 30) 97 model.theta_pd_n = model.theta_pd + 5 97 98 model.radius_pd.range(0, 1) 98 model.length_pd.range(0, 1)99 model.length_pd.range(0, 2) 99 100 model.scale.range(0, 10) 100 101 model.background.range(0, 100) … … 103 104 elif name == "core_shell_cylinder": 104 105 model = Model(kernel, 105 scale= .031, background=0, 106 radius=19.5, thickness=30, length=22, 107 sld_core=7.105, sld_shell=.291, sld_solvent=7.105, 106 scale= .031, radius=19.5, thickness=30, length=22, 107 sld_core=7.105, sld_shell=.291, sdl_solvent=7.105, 108 background=0, theta=0, phi=phi, 109 108 110 radius_pd=0.26, radius_pd_n=10, radius_pd_nsigma=3, 109 111 length_pd=0.26, length_pd_n=10, length_pd_nsigma=3, 110 112 thickness_pd=1, thickness_pd_n=1, thickness_pd_nsigma=1, 111 theta=theta, phi=phi, 112 theta_pd=1, theta_pd_n=1, theta_pd_nsigma=3, 113 phi_pd=0, phi_pd_n=20, phi_pd_nsigma=3, 113 theta_pd=1, theta_pd_n=10, theta_pd_nsigma=3, 114 phi_pd=0.1, phi_pd_n=1, phi_pd_nsigma=1, 114 115 ) 115 116 116 117 # SET THE FITTING PARAMETERS 117 model.radius.range(115, 1000)118 model.length.range(0, 2500)118 #model.radius.range(115, 1000) 119 #model.length.range(0, 2500) 119 120 #model.thickness.range(18, 38) 120 121 #model.thickness_pd.range(0, 1) 121 122 #model.phi.range(0, 90) 122 model.phi_pd.range(0,20)123 123 #model.radius_pd.range(0, 1) 124 124 #model.length_pd.range(0, 1) … … 131 131 elif name == "capped_cylinder": 132 132 model = Model(kernel, 133 scale=.08, background=35, 134 radius=20, cap_radius=40, length=400, 133 scale=.08, radius=20, cap_radius=40, length=400, 135 134 sld=1, sld_solvent=6.3, 135 background=0, theta=0, phi=phi, 136 136 radius_pd=.1, radius_pd_n=5, radius_pd_nsigma=3, 137 137 cap_radius_pd=.1, cap_radius_pd_n=5, cap_radius_pd_nsigma=3, 138 138 length_pd=.1, length_pd_n=1, length_pd_nsigma=0, 139 theta=theta, phi=phi, 140 theta_pd=0, theta_pd_n=1, theta_pd_nsigma=0, 141 phi_pd=10, phi_pd_n=20, phi_pd_nsigma=0, 139 theta_pd=.1, theta_pd_n=1, theta_pd_nsigma=0, 140 phi_pd=.1, phi_pd_n=1, phi_pd_nsigma=0, 142 141 ) 143 142 144 model.radius.range(115, 1000)145 model.length.range(0, 2500)146 #model.thickness.range(18, 38)147 #model.thickness_pd.range(0, 1)148 #model.phi.range(0, 90)149 model.phi_pd.range(0,20)150 #model.radius_pd.range(0, 1)151 #model.length_pd.range(0, 1)152 #model.theta_pd.range(0, 360)153 #model.background.range(0,5)154 143 model.scale.range(0, 1) 155 144 … … 157 146 elif name == "triaxial_ellipsoid": 158 147 model = Model(kernel, 159 scale=0.08, background=35, 160 radius_equat_minor=15, radius_equat_major=20, radius_polar=500, 148 scale=0.08, req_minor=15, req_major=20, rpolar=500, 161 149 sld=7.105, solvent_sld=.291, 162 radius_equat_minor_pd=.1, radius_equat_minor_pd_n=1, radius_equat_minor_pd_nsigma=0, 163 radius_equat_major_pd=.1, radius_equat_major_pd_n=1, radius_equat_major_pd_nsigma=0, 164 radius_polar_pd=.1, radius_polar_pd_n=1, radius_polar_pd_nsigma=0, 165 theta=theta, phi=phi, psi=0, 150 background=5, theta=0, phi=phi, psi=0, 166 151 theta_pd=20, theta_pd_n=40, theta_pd_nsigma=3, 167 152 phi_pd=.1, phi_pd_n=1, phi_pd_nsigma=0, 168 153 psi_pd=30, psi_pd_n=1, psi_pd_nsigma=0, 154 req_minor_pd=.1, req_minor_pd_n=1, req_minor_pd_nsigma=0, 155 req_major_pd=.1, req_major_pd_n=1, req_major_pd_nsigma=0, 156 rpolar_pd=.1, rpolar_pd_n=1, rpolar_pd_nsigma=0, 169 157 ) 170 158 171 159 # SET THE FITTING PARAMETERS 172 model.r adius_equat_minor.range(15, 1000)173 model.r adius_equat_major.range(15, 1000)174 #model.r adius_polar.range(15, 1000)160 model.req_minor.range(15, 1000) 161 model.req_major.range(15, 1000) 162 #model.rpolar.range(15, 1000) 175 163 #model.background.range(0,1000) 176 164 #model.theta_pd.range(0, 360) … … 185 173 M = Experiment(data=data, model=model) 186 174 if section == "both": 187 tan_model = Model(model. sasmodel, **model.parameters())175 tan_model = Model(model.kernel, **model.parameters()) 188 176 tan_model.phi = model.phi - 90 189 177 tan_model.cutoff = cutoff -
sasmodels/models/rpa.c
r20c856a rfa4a994 39 39 double S31,S32,S33,S34,S41,S42,S43,S44; 40 40 double Lad,Lbd,Lcd,Nav,Intg; 41 42 // Set values for non existent parameters (eg. no A or B in case 0 and 1 etc) 41 43 42 //icase was shifted to N-1 from the original code 44 43 if (icase <= 1){ … … 58 57 Kab = Kac = Kad = -0.0004; 59 58 } 60 61 // Set volume fraction of component D based on constraint that sum of vol frac =1 62 Phi[3]=1.0-Phi[0]-Phi[1]-Phi[2]; 63 64 //set up values for cross terms in case of block copolymers (1,3,4,6,7,8,9) 59 65 60 Nab=sqrt(N[0]*N[1]); 66 61 Nac=sqrt(N[0]*N[2]); … … 84 79 Phicd=sqrt(Phi[2]*Phi[3]); 85 80 86 // Calculate Q^2 * Rg^2 for each homopolymer assuming random walk87 81 Xa=q*q*b[0]*b[0]*N[0]/6.0; 88 82 Xb=q*q*b[1]*b[1]*N[1]/6.0; … … 90 84 Xd=q*q*b[3]*b[3]*N[3]/6.0; 91 85 92 //calculate all partial structure factors Pij and normalize n^2 93 Paa=2.0*(exp(-Xa)-1.0+Xa)/(Xa*Xa); // free A chain form factor 94 S0aa=N[0]*Phi[0]*v[0]*Paa; // Phi * Vp * P(Q)= I(Q0)/delRho^2 95 Pab=((1.0-exp(-Xa))/Xa)*((1.0-exp(-Xb))/Xb); //AB diblock (anchored Paa * anchored Pbb) partial form factor 86 Paa=2.0*(exp(-Xa)-1.0+Xa)/(Xa*Xa); 87 S0aa=N[0]*Phi[0]*v[0]*Paa; 88 Pab=((1.0-exp(-Xa))/Xa)*((1.0-exp(-Xb))/Xb); 96 89 S0ab=(Phiab*vab*Nab)*Pab; 97 Pac=((1.0-exp(-Xa))/Xa)*exp(-Xb)*((1.0-exp(-Xc))/Xc); //ABC triblock AC partial form factor90 Pac=((1.0-exp(-Xa))/Xa)*exp(-Xb)*((1.0-exp(-Xc))/Xc); 98 91 S0ac=(Phiac*vac*Nac)*Pac; 99 Pad=((1.0-exp(-Xa))/Xa)*exp(-Xb-Xc)*((1.0-exp(-Xd))/Xd); //ABCD four block92 Pad=((1.0-exp(-Xa))/Xa)*exp(-Xb-Xc)*((1.0-exp(-Xd))/Xd); 100 93 S0ad=(Phiad*vad*Nad)*Pad; 101 94 102 95 S0ba=S0ab; 103 Pbb=2.0*(exp(-Xb)-1.0+Xb)/(Xb*Xb); // free B chain96 Pbb=2.0*(exp(-Xb)-1.0+Xb)/(Xb*Xb); 104 97 S0bb=N[1]*Phi[1]*v[1]*Pbb; 105 Pbc=((1.0-exp(-Xb))/Xb)*((1.0-exp(-Xc))/Xc); // BC diblock98 Pbc=((1.0-exp(-Xb))/Xb)*((1.0-exp(-Xc))/Xc); 106 99 S0bc=(Phibc*vbc*Nbc)*Pbc; 107 Pbd=((1.0-exp(-Xb))/Xb)*exp(-Xc)*((1.0-exp(-Xd))/Xd); // BCD triblock100 Pbd=((1.0-exp(-Xb))/Xb)*exp(-Xc)*((1.0-exp(-Xd))/Xd); 108 101 S0bd=(Phibd*vbd*Nbd)*Pbd; 109 102 110 103 S0ca=S0ac; 111 104 S0cb=S0bc; 112 Pcc=2.0*(exp(-Xc)-1.0+Xc)/(Xc*Xc); // Free C chain105 Pcc=2.0*(exp(-Xc)-1.0+Xc)/(Xc*Xc); 113 106 S0cc=N[2]*Phi[2]*v[2]*Pcc; 114 Pcd=((1.0-exp(-Xc))/Xc)*((1.0-exp(-Xd))/Xd); // CD diblock107 Pcd=((1.0-exp(-Xc))/Xc)*((1.0-exp(-Xd))/Xd); 115 108 S0cd=(Phicd*vcd*Ncd)*Pcd; 116 109 … … 118 111 S0db=S0bd; 119 112 S0dc=S0cd; 120 Pdd=2.0*(exp(-Xd)-1.0+Xd)/(Xd*Xd); // free D chain113 Pdd=2.0*(exp(-Xd)-1.0+Xd)/(Xd*Xd); 121 114 S0dd=N[3]*Phi[3]*v[3]*Pdd; 122 123 // Reset all unused partial structure factors to 0 (depends on case)124 115 //icase was shifted to N-1 from the original code 125 116 switch(icase){ … … 202 193 S0dc=S0cd; 203 194 204 // self chi parameter is 0 ... of course205 195 Kaa=0.0; 206 196 Kbb=0.0; … … 253 243 ZZ=S0ad*(T11*S0ad+T12*S0bd+T13*S0cd)+S0bd*(T21*S0ad+T22*S0bd+T23*S0cd)+S0cd*(T31*S0ad+T32*S0bd+T33*S0cd); 254 244 255 // D is considered the matrix or background component so enters here256 245 m=1.0/(S0dd-ZZ); 257 246 … … 308 297 S44=S11+S22+S33+2.0*S12+2.0*S13+2.0*S23; 309 298 310 //calculate contrast where L[i] is the scattering length of i and D is the matrix311 //Note that should multiply by Nav to get units of SLD which will become312 // Nav*2 in the next line (SLD^2) but then normalization in that line would313 //need to divide by Nav leaving only Nav or sqrt(Nav) before squaring.314 299 Nav=6.022045e+23; 315 300 Lad=(L[0]/v[0]-L[3]/v[3])*sqrt(Nav); … … 318 303 319 304 Intg=Lad*Lad*S11+Lbd*Lbd*S22+Lcd*Lcd*S33+2.0*Lad*Lbd*S12+2.0*Lbd*Lcd*S23+2.0*Lad*Lcd*S13; 320 321 //rescale for units of Lij^2 (fm^2 to cm^2)322 Intg *= 1.0e-26;323 305 324 306 return Intg; -
sasmodels/models/rpa.py
r20c856a rfa4a994 1 1 r""" 2 Definition3 ----------4 5 2 Calculates the macroscopic scattering intensity for a multi-component 6 3 homogeneous mixture of polymers using the Random Phase Approximation. … … 27 24 Case 9: A-B-C-D tetra-block copolymer 28 25 29 .. note:: 30 These case numbers are different from those in the NIST SANS package! 26 **NB: these case numbers are different from those in the NIST SANS package!** 31 27 32 USAGE NOTES: 28 Only one case can be used at any one time. 33 29 34 * Only one case can be used at any one time. 35 * The RPA (mean field) formalism only applies only when the multicomponent 36 polymer mixture is in the homogeneous mixed-phase region. 37 * **Component D is assumed to be the "background" component (ie, all contrasts 38 are calculated with respect to component D).** So the scattering contrast 39 for a C/D blend = [SLD(component C) - SLD(component D)]\ :sup:`2`. 40 * Depending on which case is being used, the number of fitting parameters can 41 vary. Note that in general the degrees of polymerization, the volume 42 fractions, the molar volumes, and the neutron scattering lengths for each 43 component are obtained from other methods and held fixed while the segment 44 lengths (b\ :sub:`a`, b\ :sub:`b`, etc) and $\chi$ parameters (K\ :sub:`ab`, 45 K\ :sub:`ac`, etc). The *scale* parameter should be held equal to unity. 30 The RPA (mean field) formalism only applies only when the multicomponent 31 polymer mixture is in the homogeneous mixed-phase region. 32 33 **Component D is assumed to be the "background" component (ie, all contrasts 34 are calculated with respect to component D).** So the scattering contrast 35 for a C/D blend = [SLD(component C) - SLD(component D)]\ :sup:`2`. 36 37 Depending on which case is being used, the number of fitting parameters - the 38 segment lengths (ba, bb, etc) and $\chi$ parameters (Kab, Kac, etc) - vary. 39 The *scale* parameter should be held equal to unity. 40 41 The input parameters are the degrees of polymerization, the volume fractions, 42 the specific volumes, and the neutron scattering length densities for each 43 component. 46 44 47 45 … … 49 47 ---------- 50 48 51 .. [#]A Z Akcasu, R Klein and B Hammouda, *Macromolecules*, 26 (1993) 413649 A Z Akcasu, R Klein and B Hammouda, *Macromolecules*, 26 (1993) 4136 52 50 """ 53 51 … … 55 53 56 54 name = "rpa" 57 title = "Random Phase Approximation "55 title = "Random Phase Approximation - unfinished work in progress" 58 56 description = """ 59 57 This formalism applies to multicomponent polymer mixtures in the … … 92 90 ["N[4]", "", 1000.0, [1, inf], "", "Degree of polymerization"], 93 91 ["Phi[4]", "", 0.25, [0, 1], "", "volume fraction"], 94 ["v[4]", "mL/mol", 100.0, [0, inf], "", " molarvolume"],92 ["v[4]", "mL/mol", 100.0, [0, inf], "", "specific volume"], 95 93 ["L[4]", "fm", 10.0, [-inf, inf], "", "scattering length"], 96 94 ["b[4]", "Ang", 5.0, [0, inf], "", "segment length"], … … 109 107 110 108 control = "case_num" 111 HIDE_ ALL = set("Phi4".split())112 HIDE_A = set("N1 Phi1 v1 L1 b1 K12 K13 K14".split()) .union(HIDE_ALL)109 HIDE_NONE = set() 110 HIDE_A = set("N1 Phi1 v1 L1 b1 K12 K13 K14".split()) 113 111 HIDE_AB = set("N2 Phi2 v2 L2 b2 K23 K24".split()).union(HIDE_A) 114 112 def hidden(case_num): … … 122 120 return HIDE_A 123 121 else: 124 return HIDE_ ALL122 return HIDE_NONE 125 123
Note: See TracChangeset
for help on using the changeset viewer.