source: sasmodels/sasmodels/models/core_shell_parallelepiped.py @ 92dfe0c

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 92dfe0c was 92dfe0c, checked in by Paul Kienzle <pkienzle@…>, 7 years ago

core shell parallelepiped: adjust to new asymmetric orientation definition; start fixing docs. Refs #890.

  • Property mode set to 100644
File size: 7.6 KB
Line 
1r"""
2Definition
3----------
4
5Calculates the form factor for a rectangular solid with a core-shell structure.
6**The thickness and the scattering length density of the shell or "rim"
7can be different on all three (pairs) of faces.**
8
9The form factor is normalized by the particle volume $V$ such that
10
11.. math::
12
13    I(q) = \text{scale}\frac{\langle f^2 \rangle}{V} + \text{background}
14
15where $\langle \ldots \rangle$ is an average over all possible orientations
16of the rectangular solid.
17
18
19The function calculated is the form factor of the rectangular solid below.
20The core of the solid is defined by the dimensions $A$, $B$, $C$ such that
21$A < B < C$.
22
23.. image:: img/core_shell_parallelepiped_geometry.jpg
24
25There are rectangular "slabs" of thickness $t_A$ that add to the $A$ dimension
26(on the $BC$ faces). There are similar slabs on the $AC$ $(=t_B)$ and $AB$
27$(=t_C)$ faces. The projection in the $AB$ plane is then
28
29.. image:: img/core_shell_parallelepiped_projection.jpg
30
31The volume of the solid is
32
33.. math::
34
35    V = ABC + 2t_ABC + 2t_BAC + 2t_CAB
36
37**meaning that there are "gaps" at the corners of the solid.**
38
39The intensity calculated follows the :ref:`parallelepiped` model, with the
40core-shell intensity being calculated as the square of the sum of the
41amplitudes of the core and shell, in the same manner as a core-shell model.
42
43.. math::
44
45    F_{a}(Q,\alpha,\beta)=
46    \left[\frac{\sin(Q(L_A+2t_A)/2\sin\alpha \sin\beta)}{Q(L_A+2t_A)/2\sin\alpha\sin\beta}
47    - \frac{\sin(QL_A/2\sin\alpha \sin\beta)}{QL_A/2\sin\alpha \sin\beta} \right]
48    \left[\frac{\sin(QL_B/2\sin\alpha \sin\beta)}{QL_B/2\sin\alpha \sin\beta} \right]
49    \left[\frac{\sin(QL_C/2\sin\alpha \sin\beta)}{QL_C/2\sin\alpha \sin\beta} \right]
50
51.. note::
52
53    For the calculation of the form factor to be valid, the sides of the solid
54    MUST be chosen such that** $A < B < C$.
55    If this inequality is not satisfied, the model will not report an error,
56    but the calculation will not be correct and thus the result wrong.
57
58FITTING NOTES
59If the scale is set equal to the particle volume fraction, $\phi$, the returned
60value is the scattered intensity per unit volume, $I(q) = \phi P(q)$.
61However, **no interparticle interference effects are included in this
62calculation.**
63
64There are many parameters in this model. Hold as many fixed as possible with
65known values, or you will certainly end up at a solution that is unphysical.
66
67Constraints must be applied during fitting to ensure that the inequality
68$A < B < C$ is not violated. The calculation will not report an error,
69but the results will not be correct.
70
71The returned value is in units of |cm^-1|, on absolute scale.
72
73NB: The 2nd virial coefficient of the core_shell_parallelepiped is calculated
74based on the the averaged effective radius $(=\sqrt{(A+2t_A)(B+2t_B)/\pi})$
75and length $(C+2t_C)$ values, and used as the effective radius
76for $S(Q)$ when $P(Q) * S(Q)$ is applied.
77
78To provide easy access to the orientation of the parallelepiped, we define the
79axis of the cylinder using three angles $\theta$, $\phi$ and $\Psi$.
80(see :ref:`cylinder orientation <cylinder-angle-definition>`).
81The angle $\Psi$ is the rotational angle around the *long_c* axis against the
82$q$ plane. For example, $\Psi = 0$ when the *short_b* axis is parallel to the
83*x*-axis of the detector.
84
85.. figure:: img/parallelepiped_angle_definition.jpg
86
87    Definition of the angles for oriented core-shell parallelepipeds.
88
89.. figure:: img/parallelepiped_angle_projection.jpg
90
91    Examples of the angles for oriented core-shell parallelepipeds against the
92    detector plane.
93
94Validation
95----------
96
97The model uses the form factor calculations implemented in a c-library provided
98by the NIST Center for Neutron Research (Kline, 2006).
99
100References
101----------
102
103.. [#] P Mittelbach and G Porod, *Acta Physica Austriaca*, 14 (1961) 185-211
104    Equations (1), (13-14). (in German)
105.. [#] D Singh (2009). *Small angle scattering studies of self assembly in
106   lipid mixtures*, John's Hopkins University Thesis (2009) 223-225. `Available
107   from Proquest <http://search.proquest.com/docview/304915826?accountid
108   =26379>`_
109
110Authorship and Verification
111----------------------------
112
113* **Author:** NIST IGOR/DANSE **Date:** pre 2010
114* **Last Modified by:** Paul Butler **Date:** September 30, 2016
115* **Last Reviewed by:** Miguel Gonzales **Date:** March 21, 2016
116"""
117
118import numpy as np
119from numpy import pi, inf, sqrt
120
121name = "core_shell_parallelepiped"
122title = "Rectangular solid with a core-shell structure."
123description = """
124     P(q)=
125"""
126category = "shape:parallelepiped"
127
128#             ["name", "units", default, [lower, upper], "type","description"],
129parameters = [["sld_core", "1e-6/Ang^2", 1, [-inf, inf], "sld",
130               "Parallelepiped core scattering length density"],
131              ["sld_a", "1e-6/Ang^2", 2, [-inf, inf], "sld",
132               "Parallelepiped A rim scattering length density"],
133              ["sld_b", "1e-6/Ang^2", 4, [-inf, inf], "sld",
134               "Parallelepiped B rim scattering length density"],
135              ["sld_c", "1e-6/Ang^2", 2, [-inf, inf], "sld",
136               "Parallelepiped C rim scattering length density"],
137              ["sld_solvent", "1e-6/Ang^2", 6, [-inf, inf], "sld",
138               "Solvent scattering length density"],
139              ["length_a", "Ang", 35, [0, inf], "volume",
140               "Shorter side of the parallelepiped"],
141              ["length_b", "Ang", 75, [0, inf], "volume",
142               "Second side of the parallelepiped"],
143              ["length_c", "Ang", 400, [0, inf], "volume",
144               "Larger side of the parallelepiped"],
145              ["thick_rim_a", "Ang", 10, [0, inf], "volume",
146               "Thickness of A rim"],
147              ["thick_rim_b", "Ang", 10, [0, inf], "volume",
148               "Thickness of B rim"],
149              ["thick_rim_c", "Ang", 10, [0, inf], "volume",
150               "Thickness of C rim"],
151              ["theta", "degrees", 0, [-inf, inf], "orientation",
152               "In plane angle"],
153              ["phi", "degrees", 0, [-inf, inf], "orientation",
154               "Out of plane angle"],
155              ["psi", "degrees", 0, [-inf, inf], "orientation",
156               "Rotation angle around its own c axis against q plane"],
157             ]
158
159source = ["lib/gauss76.c", "core_shell_parallelepiped.c"]
160
161
162def ER(length_a, length_b, length_c, thick_rim_a, thick_rim_b, thick_rim_c):
163    """
164        Return equivalent radius (ER)
165    """
166
167    # surface average radius (rough approximation)
168    surf_rad = sqrt((length_a + 2.0*thick_rim_a) * (length_b + 2.0*thick_rim_b) / pi)
169
170    height = length_c + 2.0*thick_rim_c
171
172    ddd = 0.75 * surf_rad * (2 * surf_rad * height + (height + surf_rad) * (height + pi * surf_rad))
173    return 0.5 * (ddd) ** (1. / 3.)
174
175# VR defaults to 1.0
176
177# parameters for demo
178demo = dict(scale=1, background=0.0,
179            sld_core=1, sld_a=2, sld_b=4, sld_c=2, sld_solvent=6,
180            length_a=35, length_b=75, length_c=400,
181            thick_rim_a=10, thick_rim_b=10, thick_rim_c=10,
182            theta=0, phi=0, psi=0,
183            length_a_pd=0.1, length_a_pd_n=1,
184            length_b_pd=0.1, length_b_pd_n=1,
185            length_c_pd=0.1, length_c_pd_n=1,
186            thick_rim_a_pd=0.1, thick_rim_a_pd_n=1,
187            thick_rim_b_pd=0.1, thick_rim_b_pd_n=1,
188            thick_rim_c_pd=0.1, thick_rim_c_pd_n=1,
189            theta_pd=10, theta_pd_n=1,
190            phi_pd=10, phi_pd_n=1,
191            psi_pd=10, psi_pd_n=1)
192
193qx, qy = 0.2 * np.cos(2.5), 0.2 * np.sin(2.5)
194tests = [[{}, 0.2, 0.533149288477],
195         [{}, [0.2], [0.533149288477]],
196         [{'theta':10.0, 'phi':10.0}, (qx, qy), 0.032102135569],
197         [{'theta':10.0, 'phi':10.0}, [(qx, qy)], [0.032102135569]],
198        ]
199del qx, qy  # not necessary to delete, but cleaner
Note: See TracBrowser for help on using the repository browser.