source: sasmodels/sasmodels/models/unified_power_Rg.py @ 6431056

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 6431056 was 6431056, checked in by smk78, 7 years ago

Updated model docstrings for guinier_porod and unified_power_rg models
to explain relationship to one another, deficiency of unified_power_rg,
and add Hammouda references. (Relates to issue raised in email from
Jurrian, Jan 2017).

  • Property mode set to 100644
File size: 3.6 KB
Line 
1r"""
2Definition
3----------
4
5This model employs the empirical multiple level unified Exponential/Power-law
6fit method developed by Beaucage. Four functions are included so that 1, 2, 3,
7or 4 levels can be used. In addition a 0 level has been added which simply
8calculates
9
10.. math::
11
12    I(q) = \text{scale} / q + \text{background}
13
14The Beaucage method is able to reasonably approximate the scattering from
15many different types of particles, including fractal clusters, random coils
16(Debye equation), ellipsoidal particles, etc.
17
18The model works best for *mass* fractal systems characterized by Porod exponents
19between 5/3 and 3. It should not be used for *surface* fractal systems. Hammouda
20(2010) has pointed out a deficiency in the way this model handles the
21transitioning between the Guinier and Porod regimes and which can create
22artefacts that appear as kinks in the fitted model function.
23
24Also see the Guinier_Porod model.
25
26The empirical fit function is:
27
28.. math::
29
30    I(q) = \text{background}
31    + \sum_{i=1}^N \Bigl[
32        G_i \exp\Bigl(-\frac{q^2R_{gi}^2}{3}\Bigr)
33       + B_i \exp\Bigl(-\frac{q^2R_{g(i+1)}^2}{3}\Bigr)
34             \Bigl(\frac{1}{q_i^*}\Bigr)^{P_i} \Bigr]
35
36where
37
38.. math::
39
40    q_i^* = \frac{q}{\operatorname{erf}^3(q R_{gi}/\sqrt{6}}
41
42
43For each level, the four parameters $G_i$, $R_{gi}$, $B_i$ and $P_i$ must
44be chosen.  Beaucage has an additional factor $k$ in the definition of
45$q_i^*$ which is ignored here.
46
47For example, to approximate the scattering from random coils (Debye equation),
48set $R_{gi}$ as the Guinier radius, $P_i = 2$, and $B_i = 2 G_i / R_{gi}$
49
50See the references for further information on choosing the parameters.
51
52For 2D data: The 2D scattering intensity is calculated in the same way as 1D,
53where the $q$ vector is defined as
54
55.. math::
56
57    q = \sqrt{q_x^2 + q_y^2}
58
59
60References
61----------
62
63G Beaucage, *J. Appl. Cryst.*, 28 (1995) 717-728
64
65G Beaucage, *J. Appl. Cryst.*, 29 (1996) 134-146
66
67B Hammouda, *Analysis of the Beaucage model*,
68*J. Appl. Cryst.*, (2010), 43, 1474–1478
69
70"""
71
72from __future__ import division
73
74import numpy as np
75from numpy import inf, exp, sqrt, errstate
76from scipy.special import erf
77
78category = "shape-independent"
79name = "unified_power_Rg"
80title = "Unified Power Rg"
81description = """
82        The Beaucage model employs the empirical multiple level unified
83        Exponential/Power-law fit method developed by G. Beaucage. Four functions
84        are included so that 1, 2, 3, or 4 levels can be used.
85        """
86
87# pylint: disable=bad-whitespace, line-too-long
88parameters = [
89    ["level",     "",     1,      [0, 6], "", "Level number"],
90    ["rg[level]", "Ang",  15.8,   [0, inf], "", "Radius of gyration"],
91    ["power[level]", "",  4,      [-inf, inf], "", "Power"],
92    ["B[level]",  "1/cm", 4.5e-6, [-inf, inf], "", ""],
93    ["G[level]",  "1/cm", 400,    [0, inf], "", ""],
94    ]
95# pylint: enable=bad-whitespace, line-too-long
96
97def Iq(q, level, rg, power, B, G):
98    ilevel = int(level)
99    if ilevel == 0:
100        with errstate(divide='ignore'):
101            return 1./q
102
103    with errstate(divide='ignore', invalid='ignore'):
104        result = np.zeros(q.shape, 'd')
105        for i in range(ilevel):
106            exp_now = exp(-(q*rg[i])**2/3.)
107            pow_now = (erf(q*rg[i]/sqrt(6.))**3/q)**power[i]
108            if i < ilevel-1:
109                exp_next = exp(-(q*rg[i+1])**2/3.)
110            else:
111                exp_next = 1
112            result += G[i]*exp_now + B[i]*exp_next*pow_now
113
114    result[q == 0] = np.sum(G[:ilevel])
115    return result
116
117Iq.vectorized = True
118
119demo = dict(
120    level=2,
121    rg=[15.8, 21],
122    power=[4, 2],
123    B=[4.5e-6, 0.0006],
124    G=[400, 3],
125    scale=1.,
126    background=0.,
127)
Note: See TracBrowser for help on using the repository browser.