- Timestamp:
- Mar 17, 2016 10:48:04 AM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 8898d0f, bdb653c
- Parents:
- 84db7a5 (diff), 54954e1 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- sasmodels
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/models/adsorbed_layer.py
rcb97bff r54954e1 17 17 I(q) = \text{scale} \cdot(\rho_\text{poly}-\rho_\text{solvent})^2 \left[\frac{6\pi\phi_\text{core}}{Q^2}\frac{\Gamma^2}{\delta_\text{poly}^2R_\text{core}} \exp(-Q^2\sigma^2)\right] + \text{background} 18 18 19 where *scale* is a scale factor, |rho|\ :sub:`poly` is the sld of the polymer (or surfactant) layer, |rho|\ :sub:`solv` is the sld of the solvent/medium and cores, |phi|\ :sub:`core` is the volume fraction of the core par aticles, |delta|\ :sub:`poly` is the bulk density of the polymer, |biggamma| is the adsorbed amount, and |sigma| is the second moment of the thickness distribution.19 where *scale* is a scale factor, |rho|\ :sub:`poly` is the sld of the polymer (or surfactant) layer, |rho|\ :sub:`solv` is the sld of the solvent/medium and cores, |phi|\ :sub:`core` is the volume fraction of the core particles, |delta|\ :sub:`poly` is the bulk density of the polymer, |biggamma| is the adsorbed amount, and |sigma| is the second moment of the thickness distribution. 20 20 21 21 Note that all parameters except the |sigma| are correlated so fitting more than one of these parameters will generally fail. Also note that unlike other shape models, no volume normalization is applied to this model (the calculation is exact). … … 46 46 ["density_poly", "g/cm3", 0.7, [0.0, inf], "", "Polymer density"], 47 47 ["radius", "Ang", 500.0, [0.0, inf], "", "Particle radius"], 48 ["vol _frac", "None", 0.14, [0.0, inf], "", "Particle vol fraction"],48 ["volfraction", "None", 0.14, [0.0, inf], "", "Particle vol fraction"], 49 49 ["polymer_sld", "1/Ang^2", 1.5e-06, [-inf, inf], "", "Polymer SLD"], 50 50 ["solvent_sld", "1/Ang^2", 6.3e-06, [-inf, inf], "", "Solvent SLD"]] … … 52 52 # NB: Scale and Background are implicit parameters on every model 53 53 def Iq(q, second_moment, adsorbed_amount, density_poly, radius, 54 vol _frac, polymer_sld, solvent_sld):54 volfraction, polymer_sld, solvent_sld): 55 55 # pylint: disable = missing-docstring 56 56 deltarhosqrd = (polymer_sld - solvent_sld) * (polymer_sld - solvent_sld) 57 numerator = 6.0 * pi * vol _frac* (adsorbed_amount * adsorbed_amount)57 numerator = 6.0 * pi * volfraction * (adsorbed_amount * adsorbed_amount) 58 58 denominator = (q * q) * (density_poly * density_poly) * radius 59 59 eterm = exp(-1.0 * (q * q) * (second_moment * second_moment)) … … 73 73 density_poly = 0.7, 74 74 radius = 500.0, 75 vol _frac= 0.14,75 volfraction = 0.14, 76 76 polymer_sld = 1.5e-06, 77 77 solvent_sld = 6.3e-06, … … 84 84 density_poly = 'density_poly', 85 85 radius = 'radius_core', 86 vol _frac= 'volf_cores',86 volfraction = 'volf_cores', 87 87 polymer_sld = 'sld_poly', 88 88 solvent_sld = 'sld_solv', … … 91 91 tests = [ 92 92 [{'scale': 1.0, 'second_moment': 23.0, 'adsorbed_amount': 1.9, 93 'density_poly': 0.7, 'radius': 500.0, 'vol _frac': 0.14,93 'density_poly': 0.7, 'radius': 500.0, 'volfraction': 0.14, 94 94 'polymer_sld': 1.5e-06, 'solvent_sld': 6.3e-06, 'background': 0.0}, 95 95 [0.0106939, 0.469418], [73.741, 9.65391e-53]], -
sasmodels/models/hayter_msa.py
rd529d93 r54954e1 51 51 # dp[2] = volfraction(); 52 52 # dp[3] = temperature(); 53 # dp[4] = salt conc();53 # dp[4] = salt_concentration(); 54 54 # dp[5] = dielectconst(); 55 55 … … 76 76 ["volfraction", "None", 0.0192, [0, 0.74], "", "volume fraction of spheres"], 77 77 ["temperature", "K", 318.16, [0, inf], "", "temperature, in Kelvin, for Debye length calculation"], 78 ["salt conc", "M", 0.0, [-inf, inf], "", "conc of salt, moles/litre, 1:1 electolyte, for Debye length"],78 ["salt_concentration", "M", 0.0, [-inf, inf], "", "conc of salt, moles/litre, 1:1 electolyte, for Debye length"], 79 79 ["dielectconst", "None", 71.08, [-inf, inf], "", "dielectric constant (relative permittivity) of solvent, default water, for Debye length"] 80 80 ] … … 96 96 oldname = 'HayterMSAStructure' 97 97 #oldpars = dict(effect_radius="radius_effective",effect_radius_pd="radius_effective_pd",effect_radius_pd_n="radius_effective_pd_n") 98 oldpars = dict(radius_effective="effect_radius",radius_effective_pd="effect_radius_pd",radius_effective_pd_n="effect_radius_pd_n" )98 oldpars = dict(radius_effective="effect_radius",radius_effective_pd="effect_radius_pd",radius_effective_pd_n="effect_radius_pd_n",salt_concentration="saltconc") 99 99 #oldpars = dict( ) 100 100 # default parameter set, use compare.sh -midQ -linear 101 101 # note the calculation varies in different limiting cases so a wide range of 102 102 # parameters will be required for a thorough test! 103 # odd that the default st has salt conczero103 # odd that the default st has salt_concentration zero 104 104 demo = dict(radius_effective=20.75, 105 105 charge=19.0, 106 106 volfraction=0.0192, 107 107 temperature=318.16, 108 salt conc=0.05,108 salt_concentration=0.05, 109 109 dielectconst=71.08, 110 110 radius_effective_pd=0.1, … … 120 120 'volfraction': 0.0192, 121 121 'temperature': 298.0, 122 'salt conc': 0,122 'salt_concentration': 0, 123 123 'dielectconst': 78.0, 124 124 'radius_effective_pd': 0}, … … 130 130 'volfraction': 0.0192, 131 131 'temperature': 298.0, 132 'salt conc': 0.05,132 'salt_concentration': 0.05, 133 133 'dielectconst': 78.0, 134 134 'radius_effective_pd': 0.1, -
sasmodels/models/mono_gauss_coil.py
raa2edb2 r15bd6e7 14 14 15 15 *I(q)* = *scale* |cdot| *I* \ :sub:`0` |cdot| *P(q)* + *background* 16 16 17 17 where 18 18 … … 20 20 21 21 *P(q)* = 2 [exp(-Z) + Z - 1] / Z \ :sup:`2` 22 23 22 23 *Z* = (*q R* \ :sub:`g`)\ :sup:`2` 24 24 25 25 and 26 26 27 28 27 *V* = *M* / (*N*\ :sub:`A` |delta|) 28 29 29 Here, |phi|\ :sub:`poly` is the volume fraction of polymer, *V* is the volume of a polymer coil, *M* is the molecular weight of the polymer, *N*\ :sub:`A` is Avogadro's Number, |delta| is the bulk density of the polymer, |rho|\ :sub:`poly` is the sld of the polymer, |rho|\ :sub:`solv` is the sld of the solvent, and *R*\ :sub:`g` is the radius of gyration of the polymer coil. 30 30 … … 52 52 description = """ 53 53 Evaluates the scattering from 54 54 monodisperse polymer chains. 55 55 """ 56 56 category = "shape-independent" 57 57 58 58 # ["name", "units", default, [lower, upper], "type", "description"], 59 parameters = [["i_zero", "1/cm", 1.0, [-inf, inf], "", "Intensity at q=0"],60 ["radius_gyration", "Ang", 50.0, [0.0, inf], "", "Radius of gyration"]]59 parameters = [["i_zero", "1/cm", 70.0, [0.0, inf], "", "Intensity at q=0"], 60 ["radius_gyration", "Ang", 75.0, [0.0, inf], "", "Radius of gyration"]] 61 61 62 62 # NB: Scale and Background are implicit parameters on every model 63 63 def Iq(q, i_zero, radius_gyration): 64 64 # pylint: disable = missing-docstring 65 z = (q * radius_gyration) * * 266 if q == 0:67 inten = 1.065 z = (q * radius_gyration) * (q * radius_gyration) 66 if (q == 0).any(): 67 inten = i_zero 68 68 else: 69 69 inten = i_zero * 2.0 * (exp(-z) + z - 1.0 ) / (z * z) … … 77 77 78 78 demo = dict(scale = 1.0, 79 i_zero = 1.0,80 radius_gyration = 50.0,79 i_zero = 70.0, 80 radius_gyration = 75.0, 81 81 background = 0.0) 82 82 … … 87 87 88 88 tests = [ 89 [{'scale': 1.0, 'radius_gyration': 50.0, 'background': 0.0},90 [0.0106939, 0.469418], [ 0.911141, 0.00362394]],89 [{'scale': 70.0, 'radius_gyration': 75.0, 'background': 0.0}, 90 [0.0106939, 0.469418], [57.1241, 0.112859]], 91 91 ] -
sasmodels/models/poly_gauss_coil.py
raa2edb2 r15bd6e7 14 14 15 15 *I(q)* = *scale* |cdot| *I* \ :sub:`0` |cdot| *P(q)* + *background* 16 16 17 17 where 18 18 … … 20 20 21 21 *P(q)* = 2 [(1 + UZ)\ :sup:`-1/U` + Z - 1] / [(1 + U) Z\ :sup:`2`] 22 23 24 25 22 23 *Z* = [(*q R*\ :sub:`g`)\ :sup:`2`] / (1 + 2U) 24 25 *U* = (Mw / Mn) - 1 = (*polydispersity ratio*) - 1 26 26 27 27 and 28 28 29 30 29 *V* = *M* / (*N*\ :sub:`A` |delta|) 30 31 31 Here, |phi|\ :sub:`poly`, is the volume fraction of polymer, *V* is the volume of a polymer coil, *M* is the molecular weight of the polymer, *N*\ :sub:`A` is Avogadro's Number, |delta| is the bulk density of the polymer, |rho|\ :sub:`poly` is the sld of the polymer, |rho|\ :sub:`solv` is the sld of the solvent, and *R*\ :sub:`g` is the radius of gyration of the polymer coil. 32 32 … … 57 57 description = """ 58 58 Evaluates the scattering from 59 59 polydisperse polymer chains. 60 60 """ 61 61 category = "shape-independent" 62 62 63 63 # ["name", "units", default, [lower, upper], "type", "description"], 64 parameters = [["i_zero", "1/cm", 1.0, [-inf, inf], "", "Intensity at q=0"],65 ["radius_gyration", "Ang", 50.0, [0.0, inf], "", "Radius of gyration"],64 parameters = [["i_zero", "1/cm", 70.0, [0.0, inf], "", "Intensity at q=0"], 65 ["radius_gyration", "Ang", 75.0, [0.0, inf], "", "Radius of gyration"], 66 66 ["polydispersity", "None", 2.0, [1.0, inf], "", "Polymer Mw/Mn"]] 67 67 … … 69 69 def Iq(q, i_zero, radius_gyration, polydispersity): 70 70 # pylint: disable = missing-docstring 71 # need to trap the case of the polydispersity being 1 (ie, monodispersity) 71 72 u = polydispersity - 1.0 72 # TO DO 73 # should trap the case of polydispersity = 1 by switching to a taylor expansion 74 minusoneonu = -1.0 / u 75 z = (q * radius_gyration) ** 2 / (1.0 + 2.0 * u) 76 if q == 0: 77 inten = i_zero * 1.0 73 if polydispersity == 1: 74 minusoneonu = -1.0 / u 78 75 else: 79 inten = i_zero * 2.0 * (power((1.0 + u * z),minusoneonu) + z - 1.0 ) / ((1.0 + u) * (z * z)) 76 minusoneonu = -1.0 / u 77 z = ((q * radius_gyration) * (q * radius_gyration)) / (1.0 + 2.0 * u) 78 if (q == 0).any(): 79 inten = i_zero 80 else: 81 inten = i_zero * 2.0 * (power((1.0 + u * z),minusoneonu) + z - 1.0 ) / ((1.0 + u) * (z * z)) 80 82 return inten 81 #Iq.vectorized = True# Iq accepts an array of q values83 Iq.vectorized = True # Iq accepts an array of q values 82 84 83 85 def Iqxy(qx, qy, *args): … … 87 89 88 90 demo = dict(scale = 1.0, 89 i_zero = 1.0,90 radius_gyration = 50.0,91 i_zero = 70.0, 92 radius_gyration = 75.0, 91 93 polydispersity = 2.0, 92 94 background = 0.0) … … 99 101 100 102 tests = [ 101 [{'scale': 1.0, 'radius_gyration': 50.0, 'polydispersity': 2.0, 'background': 0.0},102 [0.0106939, 0.469418], [ 0.912993, 0.0054163]],103 [{'scale': 70.0, 'radius_gyration': 75.0, 'polydispersity': 2.0, 'background': 0.0}, 104 [0.0106939, 0.469418], [57.6405, 0.169016]], 103 105 ] -
sasmodels/models/stickyhardsphere.py
r0784c18 r54954e1 88 88 # [ "name", "units", default, [lower, upper], "type", 89 89 # "description" ], 90 [" effect_radius", "Ang", 50.0, [0, inf], "volume",90 ["radius_effective", "Ang", 50.0, [0, inf], "volume", 91 91 "effective radius of hard sphere"], 92 92 ["volfraction", "", 0.2, [0, 0.74], "", … … 113 113 eta = volfraction/onemineps/onemineps/onemineps; 114 114 115 sig = 2.0 * effect_radius;115 sig = 2.0 * radius_effective; 116 116 aa = sig/onemineps; 117 117 etam1 = 1.0 - eta; … … 179 179 180 180 oldname = 'StickyHSStructure' 181 oldpars = dict( )182 demo = dict( effect_radius=200, volfraction=0.2, perturb=0.05,183 stickiness=0.2, effect_radius_pd=0.1, effect_radius_pd_n=40)181 oldpars = dict(radius_effective="effect_radius",radius_effective_pd="effect_radius_pd",radius_effective_pd_n="effect_radius_pd_n") 182 demo = dict(radius_effective=200, volfraction=0.2, perturb=0.05, 183 stickiness=0.2, radius_effective_pd=0.1, radius_effective_pd_n=40) 184 184 # 185 185 tests = [ 186 [ {'scale': 1.0, 'background' : 0.0, ' effect_radius' : 50.0, 'perturb' : 0.05, 'stickiness' : 0.2, 'volfraction' : 0.1,187 ' effect_radius_pd' : 0}, [0.001, 0.003], [1.09718, 1.087830]]186 [ {'scale': 1.0, 'background' : 0.0, 'radius_effective' : 50.0, 'perturb' : 0.05, 'stickiness' : 0.2, 'volfraction' : 0.1, 187 'radius_effective_pd' : 0}, [0.001, 0.003], [1.09718, 1.087830]] 188 188 ] 189 189 -
sasmodels/data.py
r7824276 r84db7a5 440 440 441 441 if use_data or use_theory: 442 is_tof = np.any(data.lam!=data.lam[0]) 442 443 if num_plots > 1: 443 444 plt.subplot(1, num_plots, 1) 444 445 if use_data: 445 plt.errorbar(data.x, data.y, yerr=data.dy) 446 if is_tof: 447 plt.errorbar(data.x, np.log(data.y)/(data.lam*data.lam), yerr=data.dy/data.y/(data.lam*data.lam)) 448 else: 449 plt.errorbar(data.x, data.y, yerr=data.dy) 446 450 if theory is not None: 447 plt.plot(data.x, theory, '-', hold=True) 451 if is_tof: 452 plt.plot(data.x, np.log(theory)/(data.lam*data.lam), '-', hold=True) 453 else: 454 plt.plot(data.x, theory, '-', hold=True) 448 455 if limits is not None: 449 456 plt.ylim(*limits) 450 plt.xlabel('spin echo length (nm)') 451 plt.ylabel('polarization (P/P0)') 457 458 plt.xlabel('spin echo length ({})'.format(data._xunit)) 459 if is_tof: 460 plt.ylabel('(Log (P/P$_0$))/$\lambda^2$') 461 else: 462 plt.ylabel('polarization (P/P0)') 463 452 464 453 465 if resid is not None: … … 455 467 plt.subplot(1, num_plots, (use_data or use_theory) + 1) 456 468 plt.plot(data.x, resid, 'x') 457 plt.xlabel('spin echo length ( nm)')469 plt.xlabel('spin echo length ({})'.format(data._xunit)) 458 470 plt.ylabel('residuals (P/P0)') 459 471 -
sasmodels/models/hardsphere.py
raa2edb2 r84db7a5 7 7 the maths needs to be modified (no \Beta(Q) correction yet in sasview). 8 8 9 radius_effectiveis the effective hard sphere radius.9 effect_radius is the effective hard sphere radius. 10 10 volfraction is the volume fraction occupied by the spheres. 11 11 … … 53 53 systems. Though strictly the maths needs to be modified - 54 54 which sasview does not do yet. 55 radius_effectiveis the hard sphere radius55 effect_radius is the hard sphere radius 56 56 volfraction is the volume fraction occupied by the spheres. 57 57 """ … … 60 60 61 61 # ["name", "units", default, [lower, upper], "type","description"], 62 parameters = [[" radius_effective", "Ang", 50.0, [0, inf], "volume",62 parameters = [["effect_radius", "Ang", 50.0, [0, inf], "volume", 63 63 "effective radius of hard sphere"], 64 64 ["volfraction", "", 0.2, [0, 0.74], "", … … 75 75 double D,A,B,G,X,X2,X4,S,C,FF,HARDSPH; 76 76 77 if(fabs( radius_effective) < 1.E-12) {77 if(fabs(effect_radius) < 1.E-12) { 78 78 HARDSPH=1.0; 79 79 return(HARDSPH); … … 84 84 A= (1.+2.*volfraction)*D; 85 85 A *=A; 86 X=fabs(q* radius_effective*2.0);86 X=fabs(q*effect_radius*2.0); 87 87 88 88 if(X < 5.E-06) { … … 147 147 # VR defaults to 1.0 148 148 149 demo = dict( radius_effective=200, volfraction=0.2, radius_effective_pd=0.1, radius_effective_pd_n=40)149 demo = dict(effect_radius=200, volfraction=0.2, effect_radius_pd=0.1, effect_radius_pd_n=40) 150 150 oldname = 'HardsphereStructure' 151 oldpars = dict( radius_effective="effect_radius",radius_effective_pd="effect_radius_pd",radius_effective_pd_n="effect_radius_pd_n")151 oldpars = dict(effect_radius="effect_radius",effect_radius_pd="effect_radius_pd",effect_radius_pd_n="effect_radius_pd_n") 152 152 # Q=0.001 is in the Taylor series, low Q part, so add Q=0.1, assuming double precision sasview is correct 153 153 tests = [ 154 [ {'scale': 1.0, 'background' : 0.0, ' radius_effective' : 50.0, 'volfraction' : 0.2,155 ' radius_effective_pd' : 0}, [0.001,0.1], [0.209128,0.930587]]154 [ {'scale': 1.0, 'background' : 0.0, 'effect_radius' : 50.0, 'volfraction' : 0.2, 155 'effect_radius_pd' : 0}, [0.001,0.1], [0.209128,0.930587]] 156 156 ] 157 157 # ADDED by: RKH ON: 16Mar2016 using equations from FISH as better than orig sasview, see notes above. Added Taylor expansions at small Q,
Note: See TracChangeset
for help on using the changeset viewer.