source: sasmodels/sasmodels/models/elliptical_cylinder.py @ 2d81cfe

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 2d81cfe was 2d81cfe, checked in by Paul Kienzle <pkienzle@…>, 6 years ago

lint

  • Property mode set to 100644
File size: 6.1 KB
RevLine 
[c612162]1# pylint: disable=line-too-long
[a8b3cdb]2r"""
3
[5111921]4.. figure:: img/elliptical_cylinder_geometry.png
[a8b3cdb]5
[40a87fa]6   Elliptical cylinder geometry $a = r_\text{minor}$
7   and $\nu = r_\text{major} / r_\text{minor}$ is the *axis_ratio*.
[a8b3cdb]8
9The function calculated is
10
11.. math::
[fa8011eb]12
[40a87fa]13    I(\vec q)=\frac{1}{V_\text{cyl}}\int{d\psi}\int{d\phi}\int{
[fcb33e4]14        p(\theta,\phi,\psi)F^2(\vec q,\alpha,\psi)\sin(\alpha)d\alpha}
[a8b3cdb]15
16with the functions
17
18.. math::
[fa8011eb]19
[fcb33e4]20    F(q,\alpha,\psi) = 2\frac{J_1(a)\sin(b)}{ab}
[40a87fa]21
22where
23
24.. math::
25
[fcb33e4]26    a = qr'\sin(\alpha)
[404ebbd]27
[fcb33e4]28    b = q\frac{L}{2}\cos(\alpha)
[404ebbd]29
[fcb33e4]30    r'=\frac{r_{minor}}{\sqrt{2}}\sqrt{(1+\nu^{2}) + (1-\nu^{2})cos(\psi)}
[40a87fa]31
[a8b3cdb]32
[fcb33e4]33and the angle $\psi$ is defined as the orientation of the major axis of the
[40a87fa]34ellipse with respect to the vector $\vec q$. The angle $\alpha$ is the angle
35between the axis of the cylinder and $\vec q$.
[a8b3cdb]36
37
[eda8b30]38For 1D scattering, with no preferred orientation, the form factor is averaged over all possible orientations and normalized
[40a87fa]39by the particle volume
[a8b3cdb]40
41.. math::
42
[40a87fa]43    P(q) = \text{scale}  <F^2> / V
[a8b3cdb]44
[2d81cfe]45For 2d data the orientation of the particle is required, described using a different set
46of angles as in the diagrams below, for further details of the calculation and angular
[eda8b30]47dispersions  see :ref:`orientation` .
[40a87fa]48
[a8b3cdb]49
[15a90c1]50.. figure:: img/elliptical_cylinder_angle_definition.png
[a8b3cdb]51
[eda8b30]52    Note that the angles here are not the same as in the equations for the scattering function.
53    Rotation $\theta$, initially in the $xz$ plane, is carried out first, then
54    rotation $\phi$ about the $z$ axis, finally rotation $\Psi$ is now around the axis of the cylinder.
55    The neutron or X-ray beam is along the $z$ axis.
[a8b3cdb]56
[15a90c1]57.. figure:: img/elliptical_cylinder_angle_projection.png
[a8b3cdb]58
[40a87fa]59    Examples of the angles for oriented elliptical cylinders against the
[15a90c1]60    detector plane, with $\Psi$ = 0.
[a8b3cdb]61
[404ebbd]62The $\theta$ and $\phi$ parameters to orient the cylinder only appear in the model when fitting 2d data.
[eda8b30]63
[9802ab3]64
[40a87fa]65NB: The 2nd virial coefficient of the cylinder is calculated based on the
66averaged radius $(=\sqrt{r_\text{minor}^2 * \text{axis ratio}})$ and length
67values, and used as the effective radius for $S(Q)$ when $P(Q)*S(Q)$ is applied.
[a8b3cdb]68
69
70Validation
71----------
72
[40a87fa]73Validation of our code was done by comparing the output of the 1D calculation
74to the angular average of the output of the 2D calculation over all possible
75angles.
[a8b3cdb]76
[40a87fa]77In the 2D average, more binning in the angle $\phi$ is necessary to get the
78proper result. The following figure shows the results of the averaging by
79varying the number of angular bins.
[a8b3cdb]80
[5111921]81.. figure:: img/elliptical_cylinder_averaging.png
[a8b3cdb]82
[fa8011eb]83    The intensities averaged from 2D over different numbers of bins and angles.
[a8b3cdb]84
[e65a3e7]85References
86----------
[a8b3cdb]87
[40a87fa]88L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and
[fcb33e4]89Neutron Scattering*, Plenum, New York, (1987) [see table 3.4]
90
91Authorship and Verification
92----------------------------
93
94* **Author:**
[404ebbd]95* **Last Modified by:**
[fcb33e4]96* **Last Reviewed by:**  Richard Heenan - corrected equation in docs **Date:** December 21, 2016
[a8b3cdb]97"""
98
[2d81cfe]99import numpy as np
[0b56f38]100from numpy import pi, inf, sqrt, sin, cos
[a8b3cdb]101
102name = "elliptical_cylinder"
103title = "Form factor for an elliptical cylinder."
104description = """
[c612162]105    Form factor for an elliptical cylinder.
106    See L A Feigin and D I Svergun, Structure Analysis by Small-Angle X-Ray and Neutron Scattering, Plenum, New York, (1987).
[a8b3cdb]107"""
108category = "shape:cylinder"
109
110# pylint: disable=bad-whitespace, line-too-long
111#             ["name", "units", default, [lower, upper], "type","description"],
[a807206]112parameters = [["radius_minor",     "Ang",        20.0,  [0, inf],    "volume",      "Ellipse minor radius"],
[42356c8]113              ["axis_ratio",   "",          1.5,   [1, inf],    "volume",      "Ratio of major radius over minor radius"],
[a8b3cdb]114              ["length",      "Ang",        400.0, [1, inf],    "volume",      "Length of the cylinder"],
[42356c8]115              ["sld",         "1e-6/Ang^2", 4.0,   [-inf, inf], "sld",         "Cylinder scattering length density"],
116              ["sld_solvent", "1e-6/Ang^2", 1.0,   [-inf, inf], "sld",         "Solvent scattering length density"],
[9b79f29]117              ["theta",       "degrees",    90.0,  [-360, 360], "orientation", "cylinder axis to beam angle"],
118              ["phi",         "degrees",    0,     [-360, 360], "orientation", "rotation about beam"],
119              ["psi",         "degrees",    0,     [-360, 360], "orientation", "rotation about cylinder axis"]]
[a8b3cdb]120
121# pylint: enable=bad-whitespace, line-too-long
122
[40a87fa]123source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "lib/gauss20.c",
124          "elliptical_cylinder.c"]
[a8b3cdb]125
[a807206]126demo = dict(scale=1, background=0, radius_minor=100, axis_ratio=1.5, length=400.0,
[40a87fa]127            sld=4.0, sld_solvent=1.0, theta=10.0, phi=20, psi=30,
128            theta_pd=10, phi_pd=2, psi_pd=3)
[a8b3cdb]129
[a807206]130def ER(radius_minor, axis_ratio, length):
[a8b3cdb]131    """
132        Equivalent radius
[a807206]133        @param radius_minor: Ellipse minor radius
[74fd96f]134        @param axis_ratio: Ratio of major radius over minor radius
[a8b3cdb]135        @param length: Length of the cylinder
136    """
[a807206]137    radius = sqrt(radius_minor * radius_minor * axis_ratio)
[40a87fa]138    ddd = 0.75 * radius * (2 * radius * length
139                           + (length + radius) * (length + pi * radius))
[a8b3cdb]140    return 0.5 * (ddd) ** (1. / 3.)
[404ebbd]141
142def random():
143    # V = pi * radius_major * radius_minor * length;
[2d81cfe]144    volume = 10**np.random.uniform(3, 9)
[404ebbd]145    length = 10**np.random.uniform(1, 3)
[d9ec8f9]146    axis_ratio = 10**np.random.uniform(0, 2)
[2d81cfe]147    radius_minor = np.sqrt(volume/length/axis_ratio)
148    volfrac = 10**np.random.uniform(-4, -2)
[404ebbd]149    pars = dict(
150        #background=0, sld=0, sld_solvent=1,
[2d81cfe]151        scale=1e9*volfrac/volume,
[404ebbd]152        length=length,
153        radius_minor=radius_minor,
154        axis_ratio=axis_ratio,
155    )
156    return pars
157
[0b56f38]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)
[a8b3cdb]162
[40a87fa]163tests = [
[a807206]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],
[40a87fa]166
167    # The SasView test result was 0.00169, with a background of 0.001
[a807206]168    [{'radius_minor': 20.0, 'axis_ratio': 1.5, 'sld': 4.0, 'length':400.0,
[40a87fa]169      'sld_solvent':1.0, 'background':0.0},
170     0.001, 675.504402],
[2d81cfe]171    #[{'theta':80., 'phi':10.}, (qx, qy), 7.88866563001 ],
[40a87fa]172]
Note: See TracBrowser for help on using the repository browser.