source: sasmodels/sasmodels/models/core_shell_parallelepiped.py @ 933af72

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

Merge branch 'master' into ticket-890

  • Property mode set to 100644
File size: 7.8 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.jpg
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{\sin(Q(L_A+2t_A)/2\sin\alpha \sin\beta)}{Q(L_A+2t_A)/2\sin\alpha\sin\beta}
54    - \frac{\sin(QL_A/2\sin\alpha \sin\beta)}{QL_A/2\sin\alpha \sin\beta} \right]
55    \left[\frac{\sin(QL_B/2\sin\alpha \sin\beta)}{QL_B/2\sin\alpha \sin\beta} \right]
56    \left[\frac{\sin(QL_C/2\sin\alpha \sin\beta)}{QL_C/2\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, and used as the effective radius
83for $S(Q)$ when $P(Q) * S(Q)$ is applied.
84
85To provide easy access to the orientation of the parallelepiped, we define the
86axis of the cylinder using three angles $\theta$, $\phi$ and $\Psi$.
87(see :ref:`cylinder orientation <cylinder-angle-definition>`).
88The angle $\Psi$ is the rotational angle around the *long_c* axis against the
89$q$ plane. For example, $\Psi = 0$ when the *short_b* axis is parallel to the
90*x*-axis of the detector.
91
92.. figure:: img/parallelepiped_angle_definition.jpg
93
94    Definition of the angles for oriented core-shell parallelepipeds.
95
96.. figure:: img/parallelepiped_angle_projection.jpg
97
98    Examples of the angles for oriented core-shell parallelepipeds against the
99    detector plane.
100
101References
102----------
103
104.. [#] P Mittelbach and G Porod, *Acta Physica Austriaca*, 14 (1961) 185-211
105    Equations (1), (13-14). (in German)
106.. [#] D Singh (2009). *Small angle scattering studies of self assembly in
107   lipid mixtures*, John's Hopkins University Thesis (2009) 223-225. `Available
108   from Proquest <http://search.proquest.com/docview/304915826?accountid
109   =26379>`_
110
111Authorship and Verification
112----------------------------
113
114* **Author:** NIST IGOR/DANSE **Date:** pre 2010
115* **Converted to sasmodels by:** Miguel Gonzales **Date:** February 26, 2016
116* **Last Modified by:** Wojciech Potrzebowski **Date:** January 11, 2017
117* **Currently Under review by:** Paul Butler
118"""
119
120import numpy as np
121from numpy import pi, inf, sqrt
122
123name = "core_shell_parallelepiped"
124title = "Rectangular solid with a core-shell structure."
125description = """
126     P(q)=
127"""
128category = "shape:parallelepiped"
129
130#             ["name", "units", default, [lower, upper], "type","description"],
131parameters = [["sld_core", "1e-6/Ang^2", 1, [-inf, inf], "sld",
132               "Parallelepiped core scattering length density"],
133              ["sld_a", "1e-6/Ang^2", 2, [-inf, inf], "sld",
134               "Parallelepiped A rim scattering length density"],
135              ["sld_b", "1e-6/Ang^2", 4, [-inf, inf], "sld",
136               "Parallelepiped B rim scattering length density"],
137              ["sld_c", "1e-6/Ang^2", 2, [-inf, inf], "sld",
138               "Parallelepiped C rim scattering length density"],
139              ["sld_solvent", "1e-6/Ang^2", 6, [-inf, inf], "sld",
140               "Solvent scattering length density"],
141              ["length_a", "Ang", 35, [0, inf], "volume",
142               "Shorter side of the parallelepiped"],
143              ["length_b", "Ang", 75, [0, inf], "volume",
144               "Second side of the parallelepiped"],
145              ["length_c", "Ang", 400, [0, inf], "volume",
146               "Larger side of the parallelepiped"],
147              ["thick_rim_a", "Ang", 10, [0, inf], "volume",
148               "Thickness of A rim"],
149              ["thick_rim_b", "Ang", 10, [0, inf], "volume",
150               "Thickness of B rim"],
151              ["thick_rim_c", "Ang", 10, [0, inf], "volume",
152               "Thickness of C rim"],
153              ["theta", "degrees", 0, [-inf, inf], "orientation",
154               "In plane angle"],
155              ["phi", "degrees", 0, [-inf, inf], "orientation",
156               "Out of plane angle"],
157              ["psi", "degrees", 0, [-inf, inf], "orientation",
158               "Rotation angle around its own c axis against q plane"],
159             ]
160
161source = ["lib/gauss76.c", "core_shell_parallelepiped.c"]
162
163
164def ER(length_a, length_b, length_c, thick_rim_a, thick_rim_b, thick_rim_c):
165    """
166        Return equivalent radius (ER)
167    """
168
169    # surface average radius (rough approximation)
170    surf_rad = sqrt((length_a + 2.0*thick_rim_a) * (length_b + 2.0*thick_rim_b) / pi)
171
172    height = length_c + 2.0*thick_rim_c
173
174    ddd = 0.75 * surf_rad * (2 * surf_rad * height + (height + surf_rad) * (height + pi * surf_rad))
175    return 0.5 * (ddd) ** (1. / 3.)
176
177# VR defaults to 1.0
178
179# parameters for demo
180demo = dict(scale=1, background=0.0,
181            sld_core=1, sld_a=2, sld_b=4, sld_c=2, sld_solvent=6,
182            length_a=35, length_b=75, length_c=400,
183            thick_rim_a=10, thick_rim_b=10, thick_rim_c=10,
184            theta=0, phi=0, psi=0,
185            length_a_pd=0.1, length_a_pd_n=1,
186            length_b_pd=0.1, length_b_pd_n=1,
187            length_c_pd=0.1, length_c_pd_n=1,
188            thick_rim_a_pd=0.1, thick_rim_a_pd_n=1,
189            thick_rim_b_pd=0.1, thick_rim_b_pd_n=1,
190            thick_rim_c_pd=0.1, thick_rim_c_pd_n=1,
191            theta_pd=10, theta_pd_n=1,
192            phi_pd=10, phi_pd_n=1,
193            psi_pd=10, psi_pd_n=1)
194
195qx, qy = 0.2 * np.cos(2.5), 0.2 * np.sin(2.5)
196tests = [[{}, 0.2, 0.533149288477],
197         [{}, [0.2], [0.533149288477]],
198         [{'theta':10.0, 'phi':10.0}, (qx, qy), 0.032102135569],
199         [{'theta':10.0, 'phi':10.0}, [(qx, qy)], [0.032102135569]],
200        ]
201del qx, qy  # not necessary to delete, but cleaner
Note: See TracBrowser for help on using the repository browser.