source: sasmodels/sasmodels/models/core_shell_parallelepiped.py @ cb0dc22

core_shell_microgelscostrafo411magnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since cb0dc22 was cb0dc22, checked in by butler, 7 years ago

document known issue in cs parallelepiped and the fact that it is not
completely understood and under review. ticken #786 can now be moved to
release 4.2

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