source: sasmodels/sasmodels/models/guinier_porod.py @ 6cefbc9

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 6cefbc9 was 40a87fa, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

lint and latex cleanup

  • Property mode set to 100644
File size: 3.8 KB
Line 
1r"""
2Calculates the scattering for a generalized Guinier/power law object.
3This is an empirical model that can be used to determine the size
4and dimensionality of scattering objects, including asymmetric objects
5such as rods or platelets, and shapes intermediate between spheres
6and rods or between rods and platelets.
7
8Definition
9----------
10
11The following functional form is used
12
13.. math::
14
15    I(q) = \begin{cases}
16    \frac{G}{Q^s}\ \exp{\left[\frac{-Q^2R_g^2}{3-s} \right]} & Q \leq Q_1 \\
17    D / Q^m  & Q \geq Q_1
18    \end{cases}
19
20This is based on the generalized Guinier law for such elongated objects
21(see the Glatter reference below). For 3D globular objects (such as spheres),
22$s = 0$ and one recovers the standard Guinier formula. For 2D symmetry
23(such as for rods) $s = 1$, and for 1D symmetry (such as for lamellae or
24platelets) $s = 2$. A dimensionality parameter ($3-s$) is thus defined,
25and is 3 for spherical objects, 2 for rods, and 1 for plates.
26
27Enforcing the continuity of the Guinier and Porod functions and their
28derivatives yields
29
30.. math::
31
32    Q_1 = \frac{1}{R_g} \sqrt{(m-s)(3-s)/2}
33
34and
35
36.. math::
37
38    D &= G \ \exp{ \left[ \frac{-Q_1^2 R_g^2}{3-s} \right]} \ Q_1^{m-s}
39
40      &= \frac{G}{R_g^{m-s}} \ \exp \left[ -\frac{m-s}{2} \right]
41          \left( \frac{(m-s)(3-s)}{2} \right)^{\frac{m-s}{2}}
42
43
44Note that the radius of gyration for a sphere of radius $R$ is given
45by $R_g = R \sqrt{3/5}$. For a cylinder of radius $R$ and length $L$,
46$R_g^2 = \frac{L^2}{12} + \frac{R^2}{2}$ from which the cross-sectional
47radius of gyration for a randomly oriented thin cylinder is $R_g = R/\sqrt{2}$
48and the cross-sectional radius of gyration of a randomly oriented lamella
49of thickness $T$ is given by $R_g = T / \sqrt{12}$.
50
51For 2D data: The 2D scattering intensity is calculated in the same way as 1D,
52where the q vector is defined as
53
54.. math::
55    q = \sqrt{q_x^2+q_y^2}
56
57
58Reference
59---------
60
61A Guinier, G Fournet, *Small-Angle Scattering of X-Rays*,
62John Wiley and Sons, New York, (1955)
63
64O Glatter, O Kratky, *Small-Angle X-Ray Scattering*, Academic Press (1982)
65Check out Chapter 4 on Data Treatment, pages 155-156.
66"""
67
68from numpy import inf, sqrt, exp, errstate
69
70name = "guinier_porod"
71title = "Guinier-Porod function"
72description = """\
73         I(q) = scale/q^s* exp ( - R_g^2 q^2 / (3-s) ) for q<= ql
74         = scale/q^m*exp((-ql^2*Rg^2)/(3-s))*ql^(m-s) for q>=ql
75                        where ql = sqrt((m-s)(3-s)/2)/Rg.
76                        List of parameters:
77                        scale = Guinier Scale
78                        s = Dimension Variable
79                        Rg = Radius of Gyration [A]
80                        m = Porod Exponent
81                        background  = Background [1/cm]"""
82
83category = "shape-independent"
84
85# pylint: disable=bad-whitespace, line-too-long
86#             ["name", "units", default, [lower, upper], "type","description"],
87parameters = [["rg", "Ang", 60.0, [0, inf], "", "Radius of gyration"],
88              ["s",  "",    1.0,  [0, inf], "", "Dimension variable"],
89              ["m",  "",    3.0,  [0, inf], "", "Porod exponent"]]
90# pylint: enable=bad-whitespace, line-too-long
91
92# pylint: disable=C0103
93def Iq(q, rg, s, m):
94    """
95    @param q: Input q-value
96    """
97    n = 3.0 - s
98    ms = 0.5*(m-s) # =(n-3+m)/2
99
100    # preallocate return value
101    iq = 0.0*q
102
103    # Take care of the singular points
104    if rg <= 0.0 or ms <= 0.0:
105        return iq
106
107    # Do the calculation and return the function value
108    idx = q < sqrt(n*ms)/rg
109    with errstate(divide='ignore'):
110        iq[idx] = q[idx]**-s * exp(-(q[idx]*rg)**2/n)
111        iq[~idx] = q[~idx]**-m * (exp(-ms) * (n*ms/rg**2)**ms)
112    return iq
113
114Iq.vectorized = True # Iq accepts an array of q values
115
116demo = dict(scale=1.5, background=0.5, rg=60, s=1.0, m=3.0)
117
118tests = [[{'scale': 1.5, 'background':0.5}, 0.04, 5.290096890253155]]
Note: See TracBrowser for help on using the repository browser.