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
RevLine 
[44bd2be]1r"""
[5810f00]2Definition
3----------
4
[44bd2be]5Calculates the form factor for a rectangular solid with a core-shell structure.
[cb0dc22]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.
[44bd2be]14
[500128b]15The form factor is normalized by the particle volume $V$ such that
[44bd2be]16
[500128b]17.. math::
18
19    I(q) = \text{scale}\frac{\langle f^2 \rangle}{V} + \text{background}
[44bd2be]20
[500128b]21where $\langle \ldots \rangle$ is an average over all possible orientations
22of the rectangular solid.
[44bd2be]23
24
25The function calculated is the form factor of the rectangular solid below.
[500128b]26The core of the solid is defined by the dimensions $A$, $B$, $C$ such that
27$A < B < C$.
[44bd2be]28
[2f0c07d]29.. image:: img/core_shell_parallelepiped_geometry.jpg
[44bd2be]30
[500128b]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
[44bd2be]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
[cb0dc22]43**meaning that there are "gaps" at the corners of the solid.**  Again note that
44$t_C = 0$ currently.
[44bd2be]45
[5810f00]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.
[44bd2be]49
[5810f00]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.
[44bd2be]57
58FITTING NOTES
59If the scale is set equal to the particle volume fraction, |phi|, the returned
[500128b]60value is the scattered intensity per unit volume, $I(q) = \phi P(q)$.
[5810f00]61However, **no interparticle interference effects are included in this
62calculation.**
[44bd2be]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
[500128b]68$A < B < C$ is not violated. The calculation will not report an error,
[44bd2be]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
[500128b]76for $S(Q)$ when $P(Q) * S(Q)$ is applied.
[44bd2be]77
78To provide easy access to the orientation of the parallelepiped, we define the
[500128b]79axis of the cylinder using three angles $\theta$, $\phi$ and $\Psi$.
[2f0c07d]80(see :ref:`cylinder orientation <cylinder-angle-definition>`).
[500128b]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
[44bd2be]83*x*-axis of the detector.
84
[2f0c07d]85.. figure:: img/parallelepiped_angle_definition.jpg
[44bd2be]86
87    Definition of the angles for oriented core-shell parallelepipeds.
88
[2f0c07d]89.. figure:: img/parallelepiped_angle_projection.jpg
[44bd2be]90
91    Examples of the angles for oriented core-shell parallelepipeds against the
92    detector plane.
93
[aa2edb2]94References
95----------
[44bd2be]96
[5810f00]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----------------------------
[44bd2be]106
[5810f00]107* **Author:** NIST IGOR/DANSE **Date:** pre 2010
[cb0dc22]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
[44bd2be]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"],
[42356c8]124parameters = [["sld_core", "1e-6/Ang^2", 1, [-inf, inf], "sld",
[44bd2be]125               "Parallelepiped core scattering length density"],
[42356c8]126              ["sld_a", "1e-6/Ang^2", 2, [-inf, inf], "sld",
[44bd2be]127               "Parallelepiped A rim scattering length density"],
[42356c8]128              ["sld_b", "1e-6/Ang^2", 4, [-inf, inf], "sld",
[44bd2be]129               "Parallelepiped B rim scattering length density"],
[42356c8]130              ["sld_c", "1e-6/Ang^2", 2, [-inf, inf], "sld",
[44bd2be]131               "Parallelepiped C rim scattering length density"],
[42356c8]132              ["sld_solvent", "1e-6/Ang^2", 6, [-inf, inf], "sld",
[44bd2be]133               "Solvent scattering length density"],
[2222134]134              ["length_a", "Ang", 35, [0, inf], "volume",
[44bd2be]135               "Shorter side of the parallelepiped"],
[2222134]136              ["length_b", "Ang", 75, [0, inf], "volume",
[44bd2be]137               "Second side of the parallelepiped"],
[2222134]138              ["length_c", "Ang", 400, [0, inf], "volume",
[44bd2be]139               "Larger side of the parallelepiped"],
[2222134]140              ["thick_rim_a", "Ang", 10, [0, inf], "volume",
[44bd2be]141               "Thickness of A rim"],
[2222134]142              ["thick_rim_b", "Ang", 10, [0, inf], "volume",
[44bd2be]143               "Thickness of B rim"],
[2222134]144              ["thick_rim_c", "Ang", 10, [0, inf], "volume",
[44bd2be]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
[43b7eea]154source = ["lib/gauss76.c", "core_shell_parallelepiped.c"]
[44bd2be]155
156
[2222134]157def ER(length_a, length_b, length_c, thick_rim_a, thick_rim_b, thick_rim_c):
[44bd2be]158    """
159        Return equivalent radius (ER)
160    """
161
162    # surface average radius (rough approximation)
[2222134]163    surf_rad = sqrt((length_a + 2.0*thick_rim_a) * (length_b + 2.0*thick_rim_b) / pi)
[44bd2be]164
[2222134]165    height = length_c + 2.0*thick_rim_c
[44bd2be]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,
[14838a3]174            sld_core=1, sld_a=2, sld_b=4, sld_c=2, sld_solvent=6,
[2222134]175            length_a=35, length_b=75, length_c=400,
176            thick_rim_a=10, thick_rim_b=10, thick_rim_c=10,
[44bd2be]177            theta=0, phi=0, psi=0,
[2222134]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,
[44bd2be]184            theta_pd=10, theta_pd_n=1,
185            phi_pd=10, phi_pd_n=1,
[14838a3]186            psi_pd=10, psi_pd_n=1)
[44bd2be]187
188qx, qy = 0.2 * np.cos(2.5), 0.2 * np.sin(2.5)
[6dd90c1]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]],
[44bd2be]193        ]
194del qx, qy  # not necessary to delete, but cleaner
Note: See TracBrowser for help on using the repository browser.