- Timestamp:
- Mar 31, 2019 9:33:49 AM (6 years ago)
- Branches:
- master
- Children:
- f8060c5
- Parents:
- be0942c (diff), 7050455 (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. - git-author:
- Steve K <smk78@…> (03/31/19 09:33:49)
- git-committer:
- GitHub <noreply@…> (03/31/19 09:33:49)
- Location:
- doc
- Files:
-
- 1 deleted
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/guide/fitting_sq.rst
rd57b06c r0d5dc05 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 -
doc/conf.py
r30b60d2 rc1e44e5 36 36 #'only_directives', 37 37 #'matplotlib.sphinxext.mathmpl', 38 'matplotlib.sphinxext.only_directives',38 #'matplotlib.sphinxext.only_directives', 39 39 'matplotlib.sphinxext.plot_directive', 40 40 'dollarmath', -
doc/genmodel.py
rb866abf rbe0942c 7 7 import matplotlib.pyplot as plt 8 8 sys.path.insert(0, os.path.abspath('..')) 9 import sasmodels 9 10 from sasmodels import generate, core 10 11 from sasmodels.direct_model import DirectModel, call_profile … … 127 128 #print("figure saved in",path) 128 129 130 def copy_if_newer(src, dst): 131 from os.path import dirname, exists, getmtime 132 import shutil 133 if not exists(dst): 134 path = dirname(dst) 135 if not exists(path): 136 os.makedirs(path) 137 shutil.copy2(src, dst) 138 elif getmtime(src) > getmtime(dst): 139 shutil.copy2(src, dst) 140 141 def link_sources(model_info): 142 from os.path import basename, dirname, realpath, join as joinpath 143 144 # List source files in reverse order of dependency. 145 model_file = basename(model_info.filename) 146 sources = list(reversed(model_info.source + [model_file])) 147 148 # Copy files to src dir under models directory. Need to do this 149 # because sphinx can't link to an absolute path. 150 root = dirname(dirname(realpath(__file__))) 151 src = joinpath(root, "sasmodels", "models") 152 dst = joinpath(root, "doc", "model", "src") 153 for path in sources: 154 copy_if_newer(joinpath(src, path), joinpath(dst, path)) 155 156 # Link to local copy of the files 157 downloads = [":download:`%s <src/%s>`"%(path, path) for path in sources] 158 159 # Could do syntax highlighting on the model files by creating a rst file 160 # beside each source file named containing source file with 161 # 162 # src/path.rst: 163 # 164 # .. {{ path.replace('/','_') }}: 165 # 166 # .. literalinclude:: {{ src/path }} 167 # :language: {{ "python" if path.endswith('.py') else "c" }} 168 # :linenos: 169 # 170 # and link to it using 171 # 172 # colors = [":ref:`%s`"%(path.replace('/','_')) for path in sources] 173 # 174 # Probably need to dump all the rst files into an index.rst to build them. 175 176 # Link to github repo (either the tagged sasmodels version or master) 177 url = "https://github.com/SasView/sasmodels/blob/v%s"%sasmodels.__version__ 178 #url = "https://github.com/SasView/sasmodels/blob/master"%sasmodels.__version__ 179 links = ["`%s <%s/sasmodels/models/%s>`_"%(path, url, path) for path in sources] 180 181 sep = "\n$\\ \\star\\ $ " # bullet 182 body = "\n**Source**\n" 183 #body += "\n" + sep.join(links) + "\n\n" 184 body += "\n" + sep.join(downloads) + "\n\n" 185 return body 186 129 187 def gen_docs(model_info): 130 188 # type: (ModelInfo) -> None … … 150 208 match = re.search(pattern, docstr.upper()) 151 209 210 sources = link_sources(model_info) 211 212 insertion = captionstr + sources 213 152 214 if match: 153 215 docstr1 = docstr[:match.start()] 154 216 docstr2 = docstr[match.start():] 155 docstr = docstr1 + captionstr+ docstr2217 docstr = docstr1 + insertion + docstr2 156 218 else: 157 219 print('------------------------------------------------------------------') 158 220 print('References NOT FOUND for model: ', model_info.id) 159 221 print('------------------------------------------------------------------') 160 docstr += captionstr161 162 open(sys.argv[2], 'w').write(docstr)222 docstr += insertion 223 224 open(sys.argv[2], 'w').write(docstr) 163 225 164 226 def process_model(path):
Note: See TracChangeset
for help on using the changeset viewer.