source: sasmodels/sasmodels/models/unified_power_Rg.py @ 0542fe1

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 0542fe1 was 0542fe1, checked in by Paul Kienzle <pkienzle@…>, 7 years ago

round to the nearest level rather than truncate

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