source: sasmodels/sasmodels/models/core_shell_parallelepiped.py @ 14207bb

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 14207bb was 14207bb, checked in by richardh, 7 years ago

doc changes and 2d test in parallelepipeds so will perhaps build

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