source: sasmodels/sasmodels/models/elliptical_cylinder.py @ fcb33e4

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

new model core_shell_bicelle_elliptical, not tested for 2d, docu changes for other cylinder models

  • Property mode set to 100644
File size: 5.7 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 against the $q$ plane.
60For example, $\Psi = 0$ when the $r_\text{minor}$ axis is parallel to the
61$x$ axis of the detector.
62
63All angle parameters are valid and given only for 2D calculation; ie, an
64oriented system.
65
66.. figure:: img/elliptical_cylinder_angle_definition.jpg
67
68    Definition of angles for 2D
69
70.. figure:: img/cylinder_angle_projection.jpg
71
72    Examples of the angles for oriented elliptical cylinders against the
73    detector plane.
74
75NB: The 2nd virial coefficient of the cylinder is calculated based on the
76averaged radius $(=\sqrt{r_\text{minor}^2 * \text{axis ratio}})$ and length
77values, and used as the effective radius for $S(Q)$ when $P(Q)*S(Q)$ is applied.
78
79
80Validation
81----------
82
83Validation of our code was done by comparing the output of the 1D calculation
84to the angular average of the output of the 2D calculation over all possible
85angles.
86
87In the 2D average, more binning in the angle $\phi$ is necessary to get the
88proper result. The following figure shows the results of the averaging by
89varying the number of angular bins.
90
91.. figure:: img/elliptical_cylinder_averaging.png
92
93    The intensities averaged from 2D over different numbers of bins and angles.
94
95References
96----------
97
98L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and
99Neutron Scattering*, Plenum, New York, (1987) [see table 3.4]
100
101Authorship and Verification
102----------------------------
103
104* **Author:**
105* **Last Modified by:**
106* **Last Reviewed by:**  Richard Heenan - corrected equation in docs **Date:** December 21, 2016
107
108"""
109
110from numpy import pi, inf, sqrt
111
112name = "elliptical_cylinder"
113title = "Form factor for an elliptical cylinder."
114description = """
115    Form factor for an elliptical cylinder.
116    See L A Feigin and D I Svergun, Structure Analysis by Small-Angle X-Ray and Neutron Scattering, Plenum, New York, (1987).
117"""
118category = "shape:cylinder"
119
120# pylint: disable=bad-whitespace, line-too-long
121#             ["name", "units", default, [lower, upper], "type","description"],
122parameters = [["radius_minor",     "Ang",        20.0,  [0, inf],    "volume",      "Ellipse minor radius"],
123              ["axis_ratio",   "",          1.5,   [1, inf],    "volume",      "Ratio of major radius over minor radius"],
124              ["length",      "Ang",        400.0, [1, inf],    "volume",      "Length of the cylinder"],
125              ["sld",         "1e-6/Ang^2", 4.0,   [-inf, inf], "sld",         "Cylinder scattering length density"],
126              ["sld_solvent", "1e-6/Ang^2", 1.0,   [-inf, inf], "sld",         "Solvent scattering length density"],
127              ["theta",       "degrees",    90.0,  [-360, 360], "orientation", "In plane angle"],
128              ["phi",         "degrees",    0,     [-360, 360], "orientation", "Out of plane angle"],
129              ["psi",         "degrees",    0,     [-360, 360], "orientation", "Major axis angle relative to Q"]]
130
131# pylint: enable=bad-whitespace, line-too-long
132
133source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "lib/gauss20.c",
134          "elliptical_cylinder.c"]
135
136demo = dict(scale=1, background=0, radius_minor=100, axis_ratio=1.5, length=400.0,
137            sld=4.0, sld_solvent=1.0, theta=10.0, phi=20, psi=30,
138            theta_pd=10, phi_pd=2, psi_pd=3)
139
140def ER(radius_minor, axis_ratio, length):
141    """
142        Equivalent radius
143        @param radius_minor: Ellipse minor radius
144        @param axis_ratio: Ratio of major radius over minor radius
145        @param length: Length of the cylinder
146    """
147    radius = sqrt(radius_minor * radius_minor * axis_ratio)
148    ddd = 0.75 * radius * (2 * radius * length
149                           + (length + radius) * (length + pi * radius))
150    return 0.5 * (ddd) ** (1. / 3.)
151
152tests = [
153    [{'radius_minor': 20.0, 'axis_ratio': 1.5, 'length':400.0}, 'ER', 79.89245454155024],
154    [{'radius_minor': 20.0, 'axis_ratio': 1.2, 'length':300.0}, 'VR', 1],
155
156    # The SasView test result was 0.00169, with a background of 0.001
157    [{'radius_minor': 20.0, 'axis_ratio': 1.5, 'sld': 4.0, 'length':400.0,
158      'sld_solvent':1.0, 'background':0.0},
159     0.001, 675.504402],
160]
Note: See TracBrowser for help on using the repository browser.