source: sasmodels/sasmodels/models/elliptical_cylinder.py @ 99658f6

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 99658f6 was 99658f6, checked in by grethevj, 5 years ago

updated ER functions including cylinder excluded volume, to match 4.x

  • Property mode set to 100644
File size: 6.0 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
[74768cb]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]
[99658f6]90L. Onsager, Ann. New York Acad. Sci. 51, 627-659 (1949).
[fcb33e4]91
92Authorship and Verification
93----------------------------
94
95* **Author:**
[404ebbd]96* **Last Modified by:**
[fcb33e4]97* **Last Reviewed by:**  Richard Heenan - corrected equation in docs **Date:** December 21, 2016
[a8b3cdb]98"""
99
[2d81cfe]100import numpy as np
[0b56f38]101from numpy import pi, inf, sqrt, sin, cos
[a8b3cdb]102
103name = "elliptical_cylinder"
104title = "Form factor for an elliptical cylinder."
105description = """
[c612162]106    Form factor for an elliptical cylinder.
107    See L A Feigin and D I Svergun, Structure Analysis by Small-Angle X-Ray and Neutron Scattering, Plenum, New York, (1987).
[a8b3cdb]108"""
109category = "shape:cylinder"
110
111# pylint: disable=bad-whitespace, line-too-long
112#             ["name", "units", default, [lower, upper], "type","description"],
[a807206]113parameters = [["radius_minor",     "Ang",        20.0,  [0, inf],    "volume",      "Ellipse minor radius"],
[42356c8]114              ["axis_ratio",   "",          1.5,   [1, inf],    "volume",      "Ratio of major radius over minor radius"],
[a8b3cdb]115              ["length",      "Ang",        400.0, [1, inf],    "volume",      "Length of the cylinder"],
[42356c8]116              ["sld",         "1e-6/Ang^2", 4.0,   [-inf, inf], "sld",         "Cylinder scattering length density"],
117              ["sld_solvent", "1e-6/Ang^2", 1.0,   [-inf, inf], "sld",         "Solvent scattering length density"],
[9b79f29]118              ["theta",       "degrees",    90.0,  [-360, 360], "orientation", "cylinder axis to beam angle"],
119              ["phi",         "degrees",    0,     [-360, 360], "orientation", "rotation about beam"],
120              ["psi",         "degrees",    0,     [-360, 360], "orientation", "rotation about cylinder axis"]]
[a8b3cdb]121
122# pylint: enable=bad-whitespace, line-too-long
123
[74768cb]124source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "elliptical_cylinder.c"]
[71b751d]125have_Fq = True
[ee60aa7]126effective_radius_type = [
[99658f6]127    "equivalent cylinder excluded volume", "equivalent volume sphere", "average radius", "min radius", "max radius",
[ee60aa7]128    "equivalent circular cross-section",
129    "half length", "half min dimension", "half max dimension", "half diagonal",
130    ]
[a8b3cdb]131
[a807206]132demo = dict(scale=1, background=0, radius_minor=100, axis_ratio=1.5, length=400.0,
[40a87fa]133            sld=4.0, sld_solvent=1.0, theta=10.0, phi=20, psi=30,
134            theta_pd=10, phi_pd=2, psi_pd=3)
[a8b3cdb]135
[404ebbd]136def random():
137    # V = pi * radius_major * radius_minor * length;
[2d81cfe]138    volume = 10**np.random.uniform(3, 9)
[404ebbd]139    length = 10**np.random.uniform(1, 3)
[d9ec8f9]140    axis_ratio = 10**np.random.uniform(0, 2)
[2d81cfe]141    radius_minor = np.sqrt(volume/length/axis_ratio)
142    volfrac = 10**np.random.uniform(-4, -2)
[404ebbd]143    pars = dict(
144        #background=0, sld=0, sld_solvent=1,
[2d81cfe]145        scale=1e9*volfrac/volume,
[404ebbd]146        length=length,
147        radius_minor=radius_minor,
148        axis_ratio=axis_ratio,
149    )
150    return pars
151
[0b56f38]152q = 0.1
153# april 6 2017, rkh added a 2d unit test, NOT READY YET pull #890 branch assume correct!
154qx = q*cos(pi/6.0)
155qy = q*sin(pi/6.0)
[a8b3cdb]156
[40a87fa]157tests = [
[2cc8aa2]158#    [{'radius_minor': 20.0, 'axis_ratio': 1.5, 'length':400.0}, 'ER', 79.89245454155024],
159#    [{'radius_minor': 20.0, 'axis_ratio': 1.2, 'length':300.0}, 'VR', 1],
[40a87fa]160
161    # The SasView test result was 0.00169, with a background of 0.001
[a807206]162    [{'radius_minor': 20.0, 'axis_ratio': 1.5, 'sld': 4.0, 'length':400.0,
[40a87fa]163      'sld_solvent':1.0, 'background':0.0},
164     0.001, 675.504402],
[2d81cfe]165    #[{'theta':80., 'phi':10.}, (qx, qy), 7.88866563001 ],
[40a87fa]166]
Note: See TracBrowser for help on using the repository browser.