Changes in / [be0942c:0d5dc05] in sasmodels
- Files:
-
- 1 deleted
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/guide/fitting_sq.rst
re62c019 r694c6d0 14 14 This help document is under development 15 15 16 .. figure:: p_and_s_buttons.png 17 18 **Product models**, or $P@S$ models for short, multiply the structure factor 19 $S(Q)$ by the form factor $P(Q)$, modulated by the **effective radius** of the 20 form factor. 21 22 Many of the parameters in $P@S$ models take on specific meanings so that they 23 can be handled correctly inside SasView: 16 **Product models**, or $P@S$ models for short, multiply the form factor 17 $P(Q)$ by the structure factor $S(Q)$, modulated by the **effective radius** 18 of the form factor. For the theory behind this, see :ref:`PStheory` later. 19 20 **If writing your own** $P@S$ **models, DO NOT give your model parameters** 21 **these names!** 22 23 Parameters 24 ^^^^^^^^^^ 25 26 Many parameters are common amongst $P@S$ models, but take on specific meanings: 24 27 25 28 * *scale*: 26 29 27 In simple $P(Q)$ models **scale** often represents the volume fraction of 28 material. 29 30 In $P@S$ models **scale** should be set to 1.0, as the $P@S$ model contains a 31 **volfraction** parameter. 30 Overall model scale factor. 31 32 To compute number density $n$ the volume fraction $V_f$ (parameterised as 33 **volfraction**) is needed. In most $P(Q)$ models $V_f$ is not defined and 34 **scale** is used instead. Some $P(Q)$ models, such as the *vesicle*, do 35 define **volfraction** and so can leave **scale** at 1.0. 36 37 Structure factor models $S(Q)$ contain **volfraction**. In $P@S$ models 38 this is *also* used as the volume fraction for the form factor model 39 $P(Q)$, *replacing* any **volfraction** parameter in $P(Q)$. This means 40 that $P@S$ models can also leave **scale** at 1.0. 41 42 If the volume fraction required for $S(Q)$ is *not* the volume fraction 43 needed to compute the $n$ for $P(Q)$, then leave **volfraction** as the 44 $V_f$ for $S(Q)$ and use **scale** to define the $V_f$ for $P(Q)$ as 45 $V_f$ = **scale** $\cdot$ **volfraction**. This situation may occur in 46 a mixed phase system where the effective volume fraction needed to compute 47 the structure is much higher than the true volume fraction. 32 48 33 49 * *volfraction*: 34 50 35 The volume fraction of material. 36 37 For hollow shapes, **volfraction** still represents the volume fraction of 38 material but the $S(Q)$ calculation needs the volume fraction *enclosed by* 39 *the shape.* SasView scales the user-specified volume fraction by the ratio 40 form:shell computed from the average form volume and average shell volume 41 returned from the $P(Q)$ calculation (the original volfraction is divided 42 by the shell volume to compute the number density, and then $P@S$ is scaled 43 by that to get the absolute scaling on the final $I(Q)$). 51 The volume fraction of material, $V_f$. 52 53 For hollow shapes, **volfraction** still represents the volume fraction of 54 material but the $S(Q)$ calculation needs the volume fraction *enclosed by* 55 *the shape.* To remedy this the user-specified **volfraction** is scaled 56 by the ratio form:shell computed from the average form volume and average 57 shell volume returned from the $P(Q)$ calculation when calculating $S(Q)$. 58 The original **volfraction** is divided by the shell volume to compute the 59 number density $n$ used in the $P@S$ model to get the absolute scaling on 60 the final $I(Q)$. 44 61 45 62 * *radius_effective*: 46 63 47 The radial distance determining the range of the $S(Q)$ interaction. 48 49 This may, or may not, be the same as any "size" parameters describing the 50 form of the shape. For example, in a system containing freely-rotating 51 cylinders, the volume of space each cylinder requires to tumble will be 52 much larger than the volume of the cylinder itself. Thus the effective 53 radius will be larger than either the radius or half-length of the 54 cylinder. It may be sensible to tie or constrain **radius_effective** to one 55 or other of these "size" parameters. 56 57 If just part of the $S(Q)$ calculation, the value of **radius_effective** may 58 be polydisperse. If it is calculated by $P(Q)$, then it will be the weighted 59 average of the effective radii computed for the polydisperse shape 60 parameters. 64 The radial distance determining the range of the $S(Q)$ interaction. 65 66 This may be estimated from the "size" parameters $\mathbf \xi$ describing 67 the form of the shape. For example, in a system containing freely-rotating 68 cylinders, the volume of space each cylinder requires to tumble will be 69 much larger than the volume of the cylinder itself. Thus the *effective* 70 radius of a cylinder will be larger than either its actual radius or half- 71 length. 72 73 In use, it may be sensible to tie or constrain **radius_effective** 74 to one or other of the "size" parameters describing the form of the shape. 75 76 **radius_effective** may also be specified directly, independent of the 77 estimate from $P(Q)$. 78 79 If **radius_effective** is calculated by $P(Q)$, it will be the 80 weighted average of the effective radii computed for the polydisperse 81 shape parameters, and that average is used to compute $S(Q)$. When 82 specified directly, the value of **radius_effective** may be 83 polydisperse, and $S(Q)$ will be averaged over a range of effective 84 radii. Whether this makes any physical sense will depend on the system. 85 86 .. note:: 87 88 The following additional parameters are only available in SasView 5.0 and 89 later. 90 91 *radius_effective_mode*: 92 93 Defines how the effective radius (parameter **radius_effective**) should 94 be computed from the parameters of the shape. 95 96 When **radius_effective_mode = 0** then unconstrained **radius_effective** 97 parameter in the $S(Q)$ model is used. *This is the default in SasView* 98 *versions 4.x and earlier*. Otherwise, in SasView 5.0 and later, 99 **radius_effective_mode = k** represents an index in a list of alternative 100 **radius_effective** calculations which will appear in a drop-down box. 101 102 For example, the *ellipsoid* model defines the following 103 **radius_effective_modes**:: 104 105 1 => average curvature 106 2 => equivalent volume sphere 107 3 => min radius 108 4 => max radius 109 110 Note: **radius_effective_mode** will only appear in the parameter table if 111 the model defines the list of modes, otherwise it will be set permanently 112 to 0 for the user-defined effective radius. 113 114 **WARNING! If** $P(Q)$ **is multiplied by** $S(Q)$ **in the FitPage,** 115 **instead of being generated in the Sum|Multi dialog, the** 116 **radius_effective used is constrained (equivalent to** 117 **radius_effective_mode = 1)**. 61 118 62 119 * *structure_factor_mode*: 63 120 64 If the $P@S$ model supports the $\beta(Q)$ *decoupling correction* [1] then 65 **structure_factor_mode** will appear in the parameter table after the $S(Q)$ 66 parameters. 67 68 If **structure_factor_mode = 0** then the *local monodisperse approximation* 69 will be used, i.e.: 70 71 $I(Q)$ = $(scale$ / $volume)$ x $P(Q)$ x $S(Q)$ + $background$ 72 73 If **structure_factor_mode = 1** then the $\beta(q)$ correction will be 74 used, i.e.: 75 76 $I(Q)$ = $(scale$ x $volfraction$ / $volume)$ x $( <F(Q)^2>$ + $<F(Q)>^2$ x $(S(Q)$ - $1) )$ + $background$ 77 78 where $P(Q)$ = $<|F(Q)|^2>$. 79 80 This is equivalent to: 81 82 $I(Q)$ = $(scale$ / $volume)$ x $P(Q)$ x $( 1$ + $\beta(Q)$ x $(S(Q)$ - $1) )$ + $background$ 83 84 The $\beta(Q)$ decoupling approximation has the effect of damping the 85 oscillations in the normal (local monodisperse) $S(Q)$. When $\beta(Q)$ = 1 86 the local monodisperse approximation is recovered. 87 88 More mode options may appear in future as more complicated operations are 89 added. 121 The type of structure factor calculation to use. 122 123 If the $P@S$ model supports the $\beta(Q)$ *decoupling correction* [1] 124 then **structure_factor_mode** will appear in the parameter table after 125 the $S(Q)$ parameters. 126 127 If **structure_factor_mode = 0** then the 128 *local monodisperse approximation* will be used, i.e.: 129 130 .. math:: 131 I(Q) = \text{scale} \frac{V_f}{V} P(Q) S(Q) + \text{background} 132 133 where $P(Q) = \langle F(Q)^2 \rangle$. *This is the default in SasView* 134 *versions 4.x and earlier*. 135 136 If **structure_factor_mode = 1** then the $\beta(Q)$ correction will be 137 used, i.e.: 138 139 .. math:: 140 I(Q) = \text{scale} \frac{V_f}{V} P(Q) [ 1 + \beta(Q) (S(Q) - 1) ] 141 + \text{background} 142 143 The $\beta(Q)$ decoupling approximation has the effect of damping the 144 oscillations in the normal (local monodisperse) $S(Q)$. When $\beta(Q) = 1$ 145 the local monodisperse approximation is recovered. *This mode is only* 146 *available in SasView 5.0 and later*. 147 148 More mode options may appear in future as more complicated operations are 149 added. 150 151 .. _PStheory: 152 153 Theory 154 ^^^^^^ 155 156 Scattering at vector $\mathbf Q$ for an individual particle with 157 shape parameters $\mathbf\xi$ and contrast $\rho_c(\mathbf r, \mathbf\xi)$ 158 is computed from the square of the amplitude, $F(\mathbf Q, \mathbf\xi)$, as 159 160 .. math:: 161 I(\mathbf Q) = F(\mathbf Q, \mathbf\xi) F^*(\mathbf Q, \mathbf\xi) 162 \big/ V(\mathbf\xi) 163 164 with the particle volume $V(\mathbf \xi)$ and 165 166 .. math:: 167 F(\mathbf Q, \mathbf\xi) = \int_{\mathbb R^3} \rho_c(\mathbf r, \mathbf\xi) 168 e^{i \mathbf Q \cdot \mathbf r} \,\mathrm d \mathbf r = F 169 170 The 1-D scattering pattern for monodisperse particles uses the orientation 171 average in spherical coordinates, 172 173 .. math:: 174 I(Q) = n \langle F F^*\rangle = \frac{n}{4\pi} 175 \int_{\theta=0}^{\pi} \int_{\phi=0}^{2\pi} 176 F F^* \sin(\theta) \,\mathrm d\phi \mathrm d\theta 177 178 where $F(\mathbf Q,\mathbf\xi)$ uses 179 $\mathbf Q = [Q \sin\theta\cos\phi, Q \sin\theta\sin\phi, Q \cos\theta]^T$. 180 A $u$-substitution may be used, with $\alpha = \cos \theta$, 181 $\surd(1 - \alpha^2) = \sin \theta$, and 182 $\mathrm d\alpha = -\sin\theta\,\mathrm d\theta$. 183 Here, 184 185 .. math:: n = V_f/V(\mathbf\xi) 186 187 is the number density of scatterers estimated from the volume fraction $V_f$ 188 of particles in solution. In this formalism, each incoming 189 wave interacts with exactly one particle before being scattered into the 190 detector. All interference effects are within the particle itself. 191 The detector accumulates counts in proportion to the relative probability 192 at each pixel. The extension to heterogeneous systems is simply a matter of 193 adding the scattering patterns in proportion to the number density of each 194 particle. That is, given shape parameters $\mathbf\xi$ with probability 195 $P_\mathbf{\xi}$, 196 197 .. math:: 198 199 I(Q) = \int_\Xi n(\mathbf\xi) \langle F F^* \rangle \,\mathrm d\xi 200 = V_f\frac{\int_\Xi P_\mathbf{\xi} \langle F F^* \rangle 201 \,\mathrm d\mathbf\xi}{\int_\Xi P_\mathbf\xi V(\mathbf\xi)\,\mathrm d\mathbf\xi} 202 203 This approximation is valid in the dilute limit, where particles are 204 sufficiently far apart that the interaction between them can be ignored. 205 206 As concentration increases, a structure factor term $S(Q)$ can be included, 207 giving the monodisperse approximation for the interaction between particles, 208 with 209 210 .. math:: I(Q) = n \langle F F^* \rangle S(Q) 211 212 For particles without spherical symmetry, the decoupling approximation 213 is more accurate, with 214 215 .. math:: 216 217 I(Q) = n [\langle F F^* \rangle 218 + \langle F \rangle \langle F \rangle^* (S(Q) - 1)] 219 220 Or equivalently, 221 222 .. math:: I(Q) = P(Q)[1 + \beta\,(S(Q) - 1)] 223 224 with the form factor $P(Q) = n \langle F F^* \rangle$ and 225 $\beta = \langle F \rangle \langle F \rangle^* \big/ \langle F F^* \rangle$. 226 These approximations can be extended to heterogeneous systems using averages 227 over size, $\langle \cdot \rangle_\mathbf\xi = \int_\Xi P_\mathbf\xi \langle\cdot\rangle\,\mathrm d\mathbf\xi \big/ \int_\Xi P_\mathbf\xi \,\mathrm d\mathbf\xi$ and setting 228 $n = V_f\big/\langle V \rangle_\mathbf\xi$. 229 230 Further improvements can be made using the local monodisperse 231 approximation (LMA) or using partial structure factors [2]. 90 232 91 233 References … … 94 236 .. [#] Kotlarchyk, M.; Chen, S.-H. *J. Chem. Phys.*, 1983, 79, 2461 95 237 238 .. [#] Bressler I., Kohlbrecher J., Thunemann A.F. *J. Appl. Crystallogr.* 239 48 (2015) 1587-1598 240 96 241 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 97 242 98 243 *Document History* 99 244 100 | 2019-03-3 0 Paul Kienzle & Steve King245 | 2019-03-31 Paul Kienzle, Steve King & Richard Heenan -
sasmodels/kernelcl.py
ra34b811 r9fac5f5 158 158 ENV = None 159 159 def reset_environment(): 160 # type: () -> None161 """ 162 Call to createa new OpenCL context, such as after a change to SAS_OPENCL.160 # type: () -> "GpuEnvironment" 161 """ 162 Return a new OpenCL context, such as after a change to SAS_OPENCL. 163 163 """ 164 164 global ENV 165 165 ENV = GpuEnvironment() if use_opencl() else None 166 166 return ENV 167 167 168 168 def environment(): -
sasmodels/models/hardsphere.py
rc1e44e5 r4d00de6 16 16 Earlier versions of SasView did not incorporate the so-called 17 17 $\beta(q)$ ("beta") correction [1] for polydispersity and non-sphericity. 18 This is only available in SasView versions 4.2.2and higher.18 This is only available in SasView versions 5.0 and higher. 19 19 20 20 radius_effective is the effective hard sphere radius. -
sasmodels/models/hayter_msa.py
rc1e44e5 r4d00de6 18 18 Earlier versions of SasView did not incorporate the so-called 19 19 $\beta(q)$ ("beta") correction [3] for polydispersity and non-sphericity. 20 This is only available in SasView versions 4.2.2and higher.20 This is only available in SasView versions 5.0 and higher. 21 21 22 22 The salt concentration is used to compute the ionic strength of the solution -
sasmodels/models/squarewell.py
rc1e44e5 r4d00de6 20 20 Earlier versions of SasView did not incorporate the so-called 21 21 $\beta(q)$ ("beta") correction [2] for polydispersity and non-sphericity. 22 This is only available in SasView versions 4.2.2and higher.22 This is only available in SasView versions 5.0 and higher. 23 23 24 24 The well width $(\lambda)$ is defined as multiples of the particle diameter -
sasmodels/models/stickyhardsphere.py
rc1e44e5 r4d00de6 56 56 Earlier versions of SasView did not incorporate the so-called 57 57 $\beta(q)$ ("beta") correction [3] for polydispersity and non-sphericity. 58 This is only available in SasView versions 4.2.2and higher.58 This is only available in SasView versions 5.0 and higher. 59 59 60 60 In SasView the effective radius may be calculated from the parameters -
sasmodels/sesans.py
rb297ba9 rda33725 15 15 from numpy import pi # type: ignore 16 16 from scipy.special import j0 17 17 18 18 19 class SesansTransform(object): … … 38 39 39 40 # transform arrays 40 _H = None # type: np.ndarray41 _H0 = None # type: np.ndarray41 _H = None # type: np.ndarray 42 _H0 = None # type: np.ndarray 42 43 43 def __init__(self, z, SElength, lam, zaccept, Rmax ):44 def __init__(self, z, SElength, lam, zaccept, Rmax, log_spacing=1.0003): 44 45 # type: (np.ndarray, float, float) -> None 45 #import logging; logging.info("creating SESANS transform")46 46 self.q = z 47 self.log_spacing = log_spacing 47 48 self._set_hankel(SElength, lam, zaccept, Rmax) 48 49 … … 59 60 def _set_hankel(self, SElength, lam, zaccept, Rmax): 60 61 # type: (np.ndarray, float, float) -> None 61 # Force float32 arrays, otherwise run into memory problems on some machines 62 SElength = np.asarray(SElength, dtype='float32') 63 64 #Rmax = #value in text box somewhere in FitPage? 62 SElength = np.asarray(SElength) 65 63 q_max = 2*pi / (SElength[1] - SElength[0]) 66 64 q_min = 0.1 * 2*pi / (np.size(SElength) * SElength[-1]) 67 q = np. arange(q_min, q_max, q_min, dtype='float32')68 dq = q_min65 q = np.exp(np.arange(np.log(q_min), np.log(q_max), 66 np.log(self.log_spacing))) 69 67 70 H0 = np.float32(dq/(2*pi)) * q 68 dq = np.diff(q) 69 dq = np.insert(dq, 0, dq[0]) 71 70 72 repq = np.tile(q, (SElength.size, 1)).T 73 repSE = np.tile(SElength, (q.size, 1)) 74 H = np.float32(dq/(2*pi)) * j0(repSE*repq) * repq 71 H0 = dq/(2*pi) * q 75 72 76 replam = np.tile(lam, (q.size, 1)) 77 reptheta = np.arcsin(repq*replam/2*np.pi) 73 H = np.outer(q, SElength) 74 j0(H, out=H) 75 H *= (dq * q / (2*pi)).reshape((-1, 1)) 76 77 reptheta = np.outer(q, lam/(2*pi)) 78 np.arcsin(reptheta, out=reptheta) 78 79 mask = reptheta > zaccept 79 80 H[mask] = 0
Note: See TracChangeset
for help on using the changeset viewer.