# source:sasmodels/sasmodels/models/elliptical_cylinder.py@c612162

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

fix pylint

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