source: sasmodels/sasmodels/models/triaxial_ellipsoid.py @ 3c56da87

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

lint cleanup

  • Property mode set to 100644
File size: 4.7 KB
Line 
1# triaxial ellipsoid model
2# Note: model title and parameter table are inserted automatically
3r"""
4All three axes are of different lengths with $R_a \le R_b <= R_c$
5**Users should maintain this inequality for all calculations**.
6
7.. math::
8
9    P(Q) = \text{scale} V \left< F^2(Q) \right> + \text{background}
10
11where the volume $V = 4/3 \pi R_a R_b R_c$, and the averaging
12$\left< \cdots \right>$ is applied over all orientations for 1D.
13
14.. figure:: img/triaxial_ellipsoid_geometry.jpg
15
16    Ellipsoid schematic.
17
18The returned value is in units of |cm^-1|, on absolute scale.
19
20Definition
21----------
22
23The form factor calculated is
24
25.. math::
26
27    P(Q) = \frac{\text{scale}}{V}\int_0^1\int_0^1
28        \Phi^2(QR_a^2\cos^2( \pi x/2) + QR_b^2\sin^2(\pi y/2)(1-y^2) + c^2y^2)
29        dx dy
30
31where
32
33.. math::
34
35    \Phi(u) = 3 u^{-3} (\sin u - u \cos u)
36
37To provide easy access to the orientation of the triaxial ellipsoid,
38we define the axis of the cylinder using the angles $\theta$, $\phi$
39and $\psi$. These angles are defined on
40:num:`figure #triaxial-ellipsoid-angles`.
41The angle $\psi$ is the rotational angle around its own $c$ axis
42against the $Q$ plane. For example, $\psi = 0$ when the
43$a$ axis is parallel to the $x$ axis of the detector.
44
45.. _triaxial-ellipsoid-angles:
46
47.. figure:: img/triaxial_ellipsoid_angles.jpg
48
49    The angles for oriented ellipsoid.
50
51The radius-of-gyration for this system is  $R_g^2 = (R_a R_b R_c)^2/5$.
52
53The contrast is defined as SLD(ellipsoid) - SLD(solvent).  In the
54parameters, *a* is the minor equatorial radius, *b* is the major
55equatorial radius, and c is the polar radius of the ellipsoid.
56
57NB: The 2nd virial coefficient of the triaxial solid ellipsoid is
58calculated based on the polar radius $R_p = R_c$ and equatorial
59radius $R_e = \sqrt{R_a R_b}$, and used as the effective radius for
60$S(Q)$ when $P(Q) \cdot S(Q)$ is applied.
61
62.. figure:: img/triaxial_ellipsoid_1d.jpg
63
64    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
701D calculation to the angular average of the output of 2D calculation
71over all possible angles.
72:num:`Figure #triaxial-ellipsoid-comparison` shows the comparison where
73the solid dot refers to averaged 2D while the line represents the
74result of 1D calculation (for 2D averaging, 76, 180, and 76 points
75are taken for the angles of $\theta$, $\phi$, and $\psi$ respectively).
76
77.. _triaxial-ellipsoid-comparison:
78
79.. figure:: img/triaxial_ellipsoid_comparison.png
80
81    Comparison between 1D and averaged 2D.
82
83Our model uses the form factor calculations implemented in a c-library provided by the NIST Center for Neutron Research
84(Kline, 2006)
85
86REFERENCE
87
88L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and Neutron Scattering*, Plenum,
89New York, 1987.
90"""
91
92from numpy import inf
93
94name = "triaxial_ellipsoid"
95title = "Ellipsoid of uniform scattering length density with three independent axes."
96
97description = """\
98Note: During fitting ensure that the inequality ra<rb<rc is not
99        violated. Otherwise the calculation will
100        not be correct.
101"""
102category = "shape:ellipsoid"
103
104parameters = [
105#   [ "name", "units", default, [lower, upper], "type",
106#     "description" ],
107    [ "sld", "1e-6/Ang^2", 4, [-inf,inf], "",
108      "Ellipsoid scattering length density" ],
109    [ "solvent_sld", "1e-6/Ang^2", 1, [-inf,inf], "",
110      "Solvent scattering length density" ],
111    [ "req_minor", "Ang",  20, [0, inf], "volume",
112      "Minor equitorial radius" ],
113    [ "req_major", "Ang",  400, [0, inf], "volume",
114      "Major equatorial radius" ],
115    [ "rpolar", "Ang",  10, [0, inf], "volume",
116      "Polar radius" ],
117    [ "theta", "degrees", 60, [-inf, inf], "orientation",
118      "In plane angle" ],
119    [ "phi", "degrees", 60, [-inf, inf], "orientation",
120      "Out of plane angle" ],
121    [ "psi", "degrees", 60, [-inf, inf], "orientation",
122      "Out of plane angle" ],
123    ]
124
125source = [ "lib/J1.c", "lib/gauss76.c", "triaxial_ellipsoid.c"]
126
127def ER(req_minor, req_major, rpolar):
128    import numpy as np
129    from .ellipsoid import ER as ellipsoid_ER
130    return ellipsoid_ER(rpolar, np.sqrt(req_minor*req_major))
131
132demo = dict(
133        scale=1, background=0,
134        sld=6, solvent_sld=1,
135        theta=30, phi=15, psi=5,
136        req_minor=25, req_major=36, rpolar=50,
137        req_minor_pd=0, req_minor_pd_n=1,
138        req_major_pd=0, req_major_pd_n=1,
139        rpolar_pd=.2, rpolar_pd_n=30,
140        theta_pd=15, theta_pd_n=45,
141        phi_pd=15, phi_pd_n=1,
142        psi_pd=15, psi_pd_n=1,
143        )
144oldname = 'TriaxialEllipsoidModel'
145oldpars = dict(theta='axis_theta', phi='axis_phi', psi='axis_psi',
146               sld='sldEll',  solvent_sld='sldSolv',
147               req_minor='semi_axisA', req_major='semi_axisB',
148               rpolar='semi_axisC')
Note: See TracBrowser for help on using the repository browser.