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

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

use np.sqrt rather than math.sqrt for vector functions

  • Property mode set to 100644
File size: 5.5 KB
RevLine 
[c612162]1# pylint: disable=line-too-long
[a8b3cdb]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
[5111921]12.. figure:: img/elliptical_cylinder_geometry.png
[a8b3cdb]13
[0cc31e1]14   Elliptical cylinder geometry $a$ = $r_{minor}$ and \ |nu|\  = $axis\_ratio$ = $r_{major} / r_{minor}$
[a8b3cdb]15
16The function calculated is
17
18.. math::
[fa8011eb]19
[a8b3cdb]20    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}
21
22with the functions
23
24.. math::
[fa8011eb]25
[b7c2fce]26    F(\mathbf{q},\alpha,\psi)=2\frac{J_1(a)\sin(b)}{ab}
[a8b3cdb]27    \\
[e65a3e7]28    where  a = \mathbf{q}\sin(\alpha)\left[ r^2_{major}\sin^2(\psi)+r^2_{minor}\cos(\psi) \right]^{1/2}
[a8b3cdb]29    \\
30    b=\mathbf{q}\frac{L}{2}\cos(\alpha)
31
[b7c2fce]32and the angle |bigpsi| is defined as the orientation of the major axis of the ellipse with respect to the vector $\vec q$ .
33The angle $\alpha$ is the angle between the axis of the cylinder and $\vec q$.
[a8b3cdb]34
35
36Definition for 1D (no preferred orientation)
37--------------------------------------------
38
39The form factor is averaged over all possible orientation before normalized by the particle volume
40
41.. math::
42    P(q) = scale  <F^2> / V
43
44To provide easy access to the orientation of the elliptical cylinder, we define the axis of the cylinder using two
[2f0c07d]45angles |theta|, |phi| and |bigpsi| (see :ref:`cylinder orientation <cylinder-angle-definition>`).
46The angle |bigpsi| is the rotational angle around its own long_c axis against the *q* plane.
[a8b3cdb]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
[2f0c07d]51.. figure:: img/elliptical_cylinder_angle_definition.jpg
[a8b3cdb]52
[fa8011eb]53    Definition of angles for 2D
[a8b3cdb]54
[2f0c07d]55.. figure:: img/cylinder_angle_projection.jpg
[a8b3cdb]56
[fa8011eb]57    Examples of the angles for oriented elliptical cylinders against the detector plane.
[a8b3cdb]58
[74fd96f]59NB: The 2nd virial coefficient of the cylinder is calculated based on the averaged radius (= sqrt(*r_minor*\ :sup:`2` \* *axis_ratio*))
[a8b3cdb]60and length values, and used as the effective radius for *S(Q)* when *P(Q)* \* *S(Q)* is applied.
61
62
63Validation
64----------
65
[aa2edb2]66Validation of our code was done by comparing the output of the 1D calculation to the
67angular average of the output of the 2D calculation over all possible angles.
[a8b3cdb]68
[aa2edb2]69In the 2D average, more binning in the angle |phi| is necessary to get the proper result.
70The following figure shows the results of the averaging by varying the number of angular bins.
[a8b3cdb]71
[5111921]72.. figure:: img/elliptical_cylinder_averaging.png
[a8b3cdb]73
[fa8011eb]74    The intensities averaged from 2D over different numbers of bins and angles.
[a8b3cdb]75
[e65a3e7]76References
77----------
[a8b3cdb]78
79L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and Neutron Scattering*, Plenum,
80New York, (1987)
81"""
82
[416609b]83from numpy import pi, inf, sqrt
[a8b3cdb]84
85name = "elliptical_cylinder"
86title = "Form factor for an elliptical cylinder."
87description = """
[c612162]88    Form factor for an elliptical cylinder.
89    See L A Feigin and D I Svergun, Structure Analysis by Small-Angle X-Ray and Neutron Scattering, Plenum, New York, (1987).
[a8b3cdb]90"""
91category = "shape:cylinder"
92
93# pylint: disable=bad-whitespace, line-too-long
94#             ["name", "units", default, [lower, upper], "type","description"],
95parameters = [["r_minor",     "Ang",        20.0,  [0, inf],    "volume",      "Ellipse minor radius"],
[74fd96f]96              ["axis_ratio",     "",           1.5,   [1, inf],    "volume",      "Ratio of major radius over minor radius"],
[a8b3cdb]97              ["length",      "Ang",        400.0, [1, inf],    "volume",      "Length of the cylinder"],
98              ["sld",         "1e-6/Ang^2", 4.0,   [-inf, inf], "",            "Cylinder scattering length density"],
[e65a3e7]99              ["sld_solvent", "1e-6/Ang^2", 1.0,   [-inf, inf], "",            "Solvent scattering length density"],
[a8b3cdb]100              ["theta",       "degrees",    90.0,  [-360, 360], "orientation", "In plane angle"],
101              ["phi",         "degrees",    0,     [-360, 360], "orientation", "Out of plane angle"],
102              ["psi",         "degrees",    0,     [-360, 360], "orientation", "Major axis angle relative to Q"]]
103
104# pylint: enable=bad-whitespace, line-too-long
105
[43b7eea]106source = ["lib/polevl.c","lib/sas_J1.c", "lib/gauss76.c", "lib/gauss20.c", "elliptical_cylinder.c"]
[a8b3cdb]107
[74fd96f]108demo = dict(scale=1, background=0, r_minor=100, axis_ratio=1.5, length=400.0,
[e65a3e7]109            sld=4.0, sld_solvent=1.0, theta=10.0, phi=20, psi=30, theta_pd=10, phi_pd=2, psi_pd=3)
[a8b3cdb]110
[74fd96f]111def ER(r_minor, axis_ratio, length):
[a8b3cdb]112    """
113        Equivalent radius
114        @param r_minor: Ellipse minor radius
[74fd96f]115        @param axis_ratio: Ratio of major radius over minor radius
[a8b3cdb]116        @param length: Length of the cylinder
117    """
[416609b]118    radius = sqrt(r_minor * r_minor * axis_ratio)
[b7c2fce]119    ddd = 0.75 * radius * (2 * radius * length + (length + radius) * (length + pi * radius))
[a8b3cdb]120    return 0.5 * (ddd) ** (1. / 3.)
121
[74fd96f]122tests = [[{'r_minor': 20.0, 'axis_ratio': 1.5, 'length':400.0}, 'ER', 79.89245454155024],
123         [{'r_minor': 20.0, 'axis_ratio': 1.2, 'length':300.0}, 'VR', 1],
[a8b3cdb]124
125         # The SasView test result was 0.00169, with a background of 0.001
126         [{'r_minor': 20.0,
[74fd96f]127           'axis_ratio': 1.5,
[a8b3cdb]128           'sld': 4.0,
129           'length':400.0,
[e65a3e7]130           'sld_solvent':1.0,
[a8b3cdb]131           'background':0.0
132          }, 0.001, 675.504402]]
Note: See TracBrowser for help on using the repository browser.