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

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since b7c2fce was b7c2fce, checked in by Doucet, Mathieu <doucetm@…>, 7 years ago

Fix pylint and add clarity to description.

  • Property mode set to 100644
File size: 6.2 KB
Line 
1# pylint: disable=line-too-long
2r"""
3This function calculates the scattering from an elliptical cylinder.
4
5Definition for 2D (orientated system)
6-------------------------------------
7
8The angles |theta| and |phi| define the orientation of the axis of the cylinder. The angle |bigpsi| is defined as the
9orientation of the major axis of the ellipse with respect to the vector *Q*\ . A gaussian polydispersity can be added
10to any of the orientation angles, and also for the minor radius and the ratio of the ellipse radii.
11
12.. image:: img/elliptical_cylinder_geometry.gif
13
14    *Figure.* *a* = *r_minor* and |nu|\ :sub:`n` = $r_ratio$ (i.e., $r_major / r_minor$).
15
16The function calculated is
17
18.. math::
19    I(\mathbf{q})=\frac{1}{V_{cyl}}\int{d\psi}\int{d\phi}\int{p(\theta,\phi,\psi)F^2(\mathbf{q},\alpha,\psi)\sin(\theta)d\theta}
20
21with the functions
22
23.. math::
24    F(\mathbf{q},\alpha,\psi)=2\frac{J_1(a)\sin(b)}{ab}
25    \\
26    a = \mathbf{q}\sin(\alpha)\left[ r^2_{major}\sin^2(\psi)+r^2_{minor}\cos(\psi) \right]^{1/2}
27    \\
28    b=\mathbf{q}\frac{L}{2}\cos(\alpha)
29
30and the angle |bigpsi| is defined as the orientation of the major axis of the ellipse with respect to the vector $\vec q$ .
31The angle $\alpha$ is the angle between the axis of the cylinder and $\vec q$.
32
33
34Definition for 1D (no preferred orientation)
35--------------------------------------------
36
37The form factor is averaged over all possible orientation before normalized by the particle volume
38
39.. math::
40    P(q) = scale  <F^2> / V
41
42The returned value is scaled to units of |cm^-1|.
43
44To provide easy access to the orientation of the elliptical cylinder, we define the axis of the cylinder using two
45angles |theta|, |phi| and |bigpsi|. As for the case of the cylinder, the angles |theta| and |phi| are defined on
46Figure 2 of CylinderModel. The angle |bigpsi| is the rotational angle around its own long_c axis against the *q* plane.
47For example, |bigpsi| = 0 when the *r_minor* axis is parallel to the *x*\ -axis of the detector.
48
49All angle parameters are valid and given only for 2D calculation; ie, an oriented system.
50
51.. image:: img/elliptical_cylinder_geometry_2d.jpg
52
53    *Figure. Definition of angles for 2D*
54
55.. image:: img/core_shell_bicelle_fig2.jpg
56
57    *Figure. Examples of the angles for oriented elliptical cylinders against the detector plane.*
58
59NB: The 2nd virial coefficient of the cylinder is calculated based on the averaged radius (= sqrt(*r_minor*\ :sup:`2` \* *r_ratio*))
60and length values, and used as the effective radius for *S(Q)* when *P(Q)* \* *S(Q)* is applied.
61
62
63.. image:: img/elliptical_cylinder_comparison_1d.jpg
64
65    *Figure. 1D plot using the default values (w/1000 data point).*
66
67Validation
68----------
69
70Validation of our code was done by comparing the output of the 1D calculation to the angular average of the output of
71the 2D calculation over all possible angles. The figure below shows the comparison where the solid dot refers to
72averaged 2D values while the line represents the result of the 1D calculation (for the 2D averaging, values of 76, 180,
73and 76 degrees are taken for the angles of |theta|, |phi|, and |bigpsi| respectively).
74
75.. image:: img/elliptical_cylinder_validation_1d.gif
76
77    *Figure. Comparison between 1D and averaged 2D.*
78
79In the 2D average, more binning in the angle |phi| is necessary to get the proper result. The following figure shows
80the results of the averaging by varying the number of angular bins.
81
82.. image:: img/elliptical_cylinder_averaging.gif
83
84    *Figure. The intensities averaged from 2D over different numbers of bins and angles.*
85
86Reference
87---------
88
89L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and Neutron Scattering*, Plenum,
90New York, (1987)
91"""
92
93import math
94from numpy import pi, inf
95
96name = "elliptical_cylinder"
97title = "Form factor for an elliptical cylinder."
98description = """
99    Form factor for an elliptical cylinder.
100    See L A Feigin and D I Svergun, Structure Analysis by Small-Angle X-Ray and Neutron Scattering, Plenum, New York, (1987).
101"""
102category = "shape:cylinder"
103
104# pylint: disable=bad-whitespace, line-too-long
105#             ["name", "units", default, [lower, upper], "type","description"],
106parameters = [["r_minor",     "Ang",        20.0,  [0, inf],    "volume",      "Ellipse minor radius"],
107              ["r_ratio",     "",           1.5,   [1, inf],    "volume",      "Ratio of major radius over minor radius"],
108              ["length",      "Ang",        400.0, [1, inf],    "volume",      "Length of the cylinder"],
109              ["sld",         "1e-6/Ang^2", 4.0,   [-inf, inf], "",            "Cylinder scattering length density"],
110              ["solvent_sld", "1e-6/Ang^2", 1.0,   [-inf, inf], "",            "Solvent scattering length density"],
111              ["theta",       "degrees",    90.0,  [-360, 360], "orientation", "In plane angle"],
112              ["phi",         "degrees",    0,     [-360, 360], "orientation", "Out of plane angle"],
113              ["psi",         "degrees",    0,     [-360, 360], "orientation", "Major axis angle relative to Q"]]
114
115# pylint: enable=bad-whitespace, line-too-long
116
117source = ["lib/nr_bess_j1.c", "lib/gauss76.c", "lib/gauss20.c", "elliptical_cylinder.c"]
118
119demo = dict(scale=1, background=0, r_minor=100, r_ratio=1.5, length=400.0,
120            sld=4.0, solvent_sld=1.0, theta=10.0, phi=20, psi=30, theta_pd=10, phi_pd=2, psi_pd=3)
121
122oldname = 'EllipticalCylinderModel'
123oldpars = dict(theta='cyl_theta', phi='cyl_phi', psi='cyl_psi', sld='sldCyl', solvent_sld='sldSolv')
124
125def ER(r_minor, r_ratio, length):
126    """
127        Equivalent radius
128        @param r_minor: Ellipse minor radius
129        @param r_ratio: Ratio of major radius over minor radius
130        @param length: Length of the cylinder
131    """
132    radius = math.sqrt(r_minor * r_minor * r_ratio)
133    ddd = 0.75 * radius * (2 * radius * length + (length + radius) * (length + pi * radius))
134    return 0.5 * (ddd) ** (1. / 3.)
135
136tests = [[{'r_minor': 20.0, 'r_ratio': 1.5, 'length':400.0}, 'ER', 79.89245454155024],
137         [{'r_minor': 20.0, 'r_ratio': 1.2, 'length':300.0}, 'VR', 1],
138
139         # The SasView test result was 0.00169, with a background of 0.001
140         [{'r_minor': 20.0,
141           'r_ratio': 1.5,
142           'sld': 4.0,
143           'length':400.0,
144           'solvent_sld':1.0,
145           'background':0.0
146          }, 0.001, 675.504402]]
Note: See TracBrowser for help on using the repository browser.