source: sasmodels/sasmodels/models/elliptical_cylinder.py @ 9802ab3

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 9802ab3 was 9802ab3, checked in by richardh, 7 years ago

changes to docs, anticipating new orientation angle integrals

  • Property mode set to 100644
File size: 6.8 KB
Line 
1# pylint: disable=line-too-long
2r"""
3Definition for 2D (orientated system)
4-------------------------------------
5
6The angles $\theta$ and $\phi$ define the orientation of the axis of the
7cylinder. The angle $\Psi$ is defined as the orientation of the major
8axis of the ellipse with respect to the vector $Q$. A gaussian polydispersity
9can be added to any of the orientation angles, and also for the minor
10radius and the ratio of the ellipse radii.
11
12.. figure:: img/elliptical_cylinder_geometry.png
13
14   Elliptical cylinder geometry $a = r_\text{minor}$
15   and $\nu = r_\text{major} / r_\text{minor}$ is the *axis_ratio*.
16
17The function calculated is
18
19.. math::
20
21    I(\vec q)=\frac{1}{V_\text{cyl}}\int{d\psi}\int{d\phi}\int{
22        p(\theta,\phi,\psi)F^2(\vec q,\alpha,\psi)\sin(\alpha)d\alpha}
23
24with the functions
25
26.. math::
27
28    F(q,\alpha,\psi) = 2\frac{J_1(a)\sin(b)}{ab}
29
30where
31
32.. math::
33
34    a = qr'\sin(\alpha)
35   
36    b = q\frac{L}{2}\cos(\alpha)
37   
38    r'=\frac{r_{minor}}{\sqrt{2}}\sqrt{(1+\nu^{2}) + (1-\nu^{2})cos(\psi)}
39
40
41and the angle $\psi$ is defined as the orientation of the major axis of the
42ellipse with respect to the vector $\vec q$. The angle $\alpha$ is the angle
43between the axis of the cylinder and $\vec q$.
44
45
46Definition for 1D (no preferred orientation)
47--------------------------------------------
48
49The form factor is averaged over all possible orientation before normalized
50by the particle volume
51
52.. math::
53
54    P(q) = \text{scale}  <F^2> / V
55
56To provide easy access to the orientation of the elliptical cylinder, we
57define the axis of the cylinder using two angles $\theta$, $\phi$ and $\Psi$
58(see :ref:`cylinder orientation <cylinder-angle-definition>`). The angle
59$\Psi$ is the rotational angle around its own long_c axis.
60
61All angle parameters are valid and given only for 2D calculation; ie, an
62oriented system.
63
64.. figure:: img/elliptical_cylinder_angle_definition.png
65
66    Definition of angles for oriented elliptical cylinder, where axis_ratio is drawn >1,
67    and angle $\Psi$ is now a rotation around the axis of the cylinder.
68
69.. figure:: img/elliptical_cylinder_angle_projection.png
70
71    Examples of the angles for oriented elliptical cylinders against the
72    detector plane, with $\Psi$ = 0.
73
74The $\theta$ and $\phi$ parameters to orient the cylinder only appear in the model when fitting 2d data.
75On introducing "Orientational Distribution" in the angles, "distribution of theta" and "distribution of phi" parameters will
76appear. These are actually rotations about the axes $\delta_1$ and $\delta_2$ of the cylinder, the $b$ and $a$ axes of the
77cylinder cross section. (When $\theta = \phi = 0$ these are parallel to the $Y$ and $X$ axes of the instrument.)
78The third orientation distribution, in $\psi$, is about the $c$ axis of the particle. Some experimentation may be required to
79understand the 2d patterns fully. (Earlier implementations had numerical integration issues in some circumstances when orientation
80distributions passed through 90 degrees, such situations, with very broad distributions, should still be approached with care.)
81
82NB: The 2nd virial coefficient of the cylinder is calculated based on the
83averaged radius $(=\sqrt{r_\text{minor}^2 * \text{axis ratio}})$ and length
84values, and used as the effective radius for $S(Q)$ when $P(Q)*S(Q)$ is applied.
85
86
87Validation
88----------
89
90Validation of our code was done by comparing the output of the 1D calculation
91to the angular average of the output of the 2D calculation over all possible
92angles.
93
94In the 2D average, more binning in the angle $\phi$ is necessary to get the
95proper result. The following figure shows the results of the averaging by
96varying the number of angular bins.
97
98.. figure:: img/elliptical_cylinder_averaging.png
99
100    The intensities averaged from 2D over different numbers of bins and angles.
101
102References
103----------
104
105L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and
106Neutron Scattering*, Plenum, New York, (1987) [see table 3.4]
107
108Authorship and Verification
109----------------------------
110
111* **Author:**
112* **Last Modified by:**
113* **Last Reviewed by:**  Richard Heenan - corrected equation in docs **Date:** December 21, 2016
114
115"""
116
117from numpy import pi, inf, sqrt, sin, cos
118
119name = "elliptical_cylinder"
120title = "Form factor for an elliptical cylinder."
121description = """
122    Form factor for an elliptical cylinder.
123    See L A Feigin and D I Svergun, Structure Analysis by Small-Angle X-Ray and Neutron Scattering, Plenum, New York, (1987).
124"""
125category = "shape:cylinder"
126
127# pylint: disable=bad-whitespace, line-too-long
128#             ["name", "units", default, [lower, upper], "type","description"],
129parameters = [["radius_minor",     "Ang",        20.0,  [0, inf],    "volume",      "Ellipse minor radius"],
130              ["axis_ratio",   "",          1.5,   [1, inf],    "volume",      "Ratio of major radius over minor radius"],
131              ["length",      "Ang",        400.0, [1, inf],    "volume",      "Length of the cylinder"],
132              ["sld",         "1e-6/Ang^2", 4.0,   [-inf, inf], "sld",         "Cylinder scattering length density"],
133              ["sld_solvent", "1e-6/Ang^2", 1.0,   [-inf, inf], "sld",         "Solvent scattering length density"],
134              ["theta",       "degrees",    90.0,  [-360, 360], "orientation", "cylinder axis to beam angle"],
135              ["phi",         "degrees",    0,     [-360, 360], "orientation", "rotation about beam"],
136              ["psi",         "degrees",    0,     [-360, 360], "orientation", "rotation about cylinder axis"]]
137
138# pylint: enable=bad-whitespace, line-too-long
139
140source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "lib/gauss20.c",
141          "elliptical_cylinder.c"]
142
143demo = dict(scale=1, background=0, radius_minor=100, axis_ratio=1.5, length=400.0,
144            sld=4.0, sld_solvent=1.0, theta=10.0, phi=20, psi=30,
145            theta_pd=10, phi_pd=2, psi_pd=3)
146
147def ER(radius_minor, axis_ratio, length):
148    """
149        Equivalent radius
150        @param radius_minor: Ellipse minor radius
151        @param axis_ratio: Ratio of major radius over minor radius
152        @param length: Length of the cylinder
153    """
154    radius = sqrt(radius_minor * radius_minor * axis_ratio)
155    ddd = 0.75 * radius * (2 * radius * length
156                           + (length + radius) * (length + pi * radius))
157    return 0.5 * (ddd) ** (1. / 3.)
158q = 0.1
159# april 6 2017, rkh added a 2d unit test, NOT READY YET pull #890 branch assume correct!
160qx = q*cos(pi/6.0)
161qy = q*sin(pi/6.0)
162
163tests = [
164    [{'radius_minor': 20.0, 'axis_ratio': 1.5, 'length':400.0}, 'ER', 79.89245454155024],
165    [{'radius_minor': 20.0, 'axis_ratio': 1.2, 'length':300.0}, 'VR', 1],
166
167    # The SasView test result was 0.00169, with a background of 0.001
168    [{'radius_minor': 20.0, 'axis_ratio': 1.5, 'sld': 4.0, 'length':400.0,
169      'sld_solvent':1.0, 'background':0.0},
170     0.001, 675.504402],
171#    [{'theta':80., 'phi':10.}, (qx, qy), 7.88866563001 ],
172]
Note: See TracBrowser for help on using the repository browser.