Changeset 0d5dc05 in sasmodels for doc


Ignore:
Timestamp:
Mar 31, 2019 9:33:49 AM (6 years ago)
Author:
GitHub <noreply@…>
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)
Message:

Merge branch 'master' into ticket-1263-source-link

Location:
doc
Files:
1 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • doc/guide/fitting_sq.rst

    rd57b06c r0d5dc05  
    1414   This help document is under development 
    1515 
    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** 
     18of 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 
     23Parameters 
     24^^^^^^^^^^ 
     25 
     26Many parameters are common amongst $P@S$ models, but take on specific meanings: 
    2427 
    2528* *scale*: 
    2629 
    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. 
    3248 
    3349* *volfraction*: 
    3450 
    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)$. 
    4461 
    4562* *radius_effective*: 
    4663 
    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)**. 
    61118 
    62119* *structure_factor_mode*: 
    63120 
    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 
     153Theory 
     154^^^^^^ 
     155 
     156Scattering at vector $\mathbf Q$ for an individual particle with 
     157shape parameters $\mathbf\xi$ and contrast $\rho_c(\mathbf r, \mathbf\xi)$ 
     158is 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 
     164with 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 
     170The 1-D scattering pattern for monodisperse particles uses the orientation 
     171average 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 
     178where $F(\mathbf Q,\mathbf\xi)$ uses 
     179$\mathbf Q = [Q \sin\theta\cos\phi, Q \sin\theta\sin\phi, Q \cos\theta]^T$. 
     180A $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$. 
     183Here, 
     184 
     185.. math:: n = V_f/V(\mathbf\xi) 
     186 
     187is the number density of scatterers estimated from the volume fraction $V_f$ 
     188of particles in solution. In this formalism, each incoming 
     189wave interacts with exactly one particle before being scattered into the 
     190detector. All interference effects are within the particle itself. 
     191The detector accumulates counts in proportion to the relative probability 
     192at each pixel. The extension to heterogeneous systems is simply a matter of 
     193adding the scattering patterns in proportion to the number density of each 
     194particle. 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 
     203This approximation is valid in the dilute limit, where particles are 
     204sufficiently far apart that the interaction between them can be ignored. 
     205 
     206As concentration increases, a structure factor term $S(Q)$ can be included, 
     207giving the monodisperse approximation for the interaction between particles, 
     208with 
     209 
     210.. math:: I(Q) = n \langle F F^* \rangle S(Q) 
     211 
     212For particles without spherical symmetry, the decoupling approximation 
     213is 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 
     220Or equivalently, 
     221 
     222.. math:: I(Q) = P(Q)[1 + \beta\,(S(Q) - 1)] 
     223 
     224with the form factor $P(Q) = n \langle F F^* \rangle$ and 
     225$\beta = \langle F \rangle \langle F \rangle^* \big/ \langle F F^* \rangle$. 
     226These approximations can be extended to heterogeneous systems using averages 
     227over 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 
     230Further improvements can be made using the local monodisperse 
     231approximation (LMA) or using partial structure factors [2]. 
    90232 
    91233References 
     
    94236.. [#] Kotlarchyk, M.; Chen, S.-H. *J. Chem. Phys.*, 1983, 79, 2461 
    95237 
     238.. [#] Bressler I., Kohlbrecher J., Thunemann A.F. *J. Appl. Crystallogr.* 
     239   48 (2015) 1587-1598 
     240 
    96241.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 
    97242 
    98243*Document History* 
    99244 
    100 | 2019-03-30 Paul Kienzle & Steve King 
     245| 2019-03-31 Paul Kienzle, Steve King & Richard Heenan 
  • doc/conf.py

    r30b60d2 rc1e44e5  
    3636              #'only_directives', 
    3737              #'matplotlib.sphinxext.mathmpl', 
    38               'matplotlib.sphinxext.only_directives', 
     38              #'matplotlib.sphinxext.only_directives', 
    3939              'matplotlib.sphinxext.plot_directive', 
    4040              'dollarmath', 
  • doc/genmodel.py

    rb866abf rbe0942c  
    77import matplotlib.pyplot as plt 
    88sys.path.insert(0, os.path.abspath('..')) 
     9import sasmodels 
    910from sasmodels import generate, core 
    1011from sasmodels.direct_model import DirectModel, call_profile 
     
    127128    #print("figure saved in",path) 
    128129 
     130def 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 
     141def 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 
    129187def gen_docs(model_info): 
    130188    # type: (ModelInfo) -> None 
     
    150208    match = re.search(pattern, docstr.upper()) 
    151209 
     210    sources = link_sources(model_info) 
     211 
     212    insertion = captionstr + sources 
     213 
    152214    if match: 
    153215        docstr1 = docstr[:match.start()] 
    154216        docstr2 = docstr[match.start():] 
    155         docstr = docstr1 + captionstr + docstr2 
     217        docstr = docstr1 + insertion + docstr2 
    156218    else: 
    157219        print('------------------------------------------------------------------') 
    158220        print('References NOT FOUND for model: ', model_info.id) 
    159221        print('------------------------------------------------------------------') 
    160         docstr += captionstr 
    161  
    162     open(sys.argv[2],'w').write(docstr) 
     222        docstr += insertion 
     223 
     224    open(sys.argv[2], 'w').write(docstr) 
    163225 
    164226def process_model(path): 
Note: See TracChangeset for help on using the changeset viewer.