source: sasmodels/sasmodels/models/core_shell_cylinder.py @ 3f818b2

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 3f818b2 was c44b611, checked in by Torin Cooper-Bennun <torin.cooper-bennun@…>, 6 years ago

Merge branch 'master' into beta_approx_new_R_eff

  • Property mode set to 100644
File size: 6.5 KB
Line 
1r"""
2Definition
3----------
4
5The output of the 2D scattering intensity function for oriented core-shell
6cylinders is given by (Kline, 2006 [#kline]_). The form factor is normalized
7by the particle volume. Note that in this model the shell envelops the entire
8core so that besides a "sleeve" around the core, the shell also provides two
9flat end caps of thickness = shell thickness. In other words the length of the
10total cyclinder is the length of the core cylinder plus twice the thickness of
11the shell. If no end caps are desired one should use the
12:ref:`core-shell-bicelle` and set the thickness of the end caps (in this case
13the "thick_face") to zero.
14
15.. math::
16
17    I(q,\alpha) = \frac{\text{scale}}{V_s} F^2(q,\alpha).sin(\alpha) + \text{background}
18
19where
20
21.. math::
22
23    F(q,\alpha) = &\ (\rho_c - \rho_s) V_c
24           \frac{\sin \left( q \tfrac12 L\cos\alpha \right)}
25                {q \tfrac12 L\cos\alpha}
26           \frac{2 J_1 \left( qR\sin\alpha \right)}
27                {qR\sin\alpha} \\
28         &\ + (\rho_s - \rho_\text{solv}) V_s
29           \frac{\sin \left( q \left(\tfrac12 L+T\right) \cos\alpha \right)}
30                {q \left(\tfrac12 L +T \right) \cos\alpha}
31           \frac{ 2 J_1 \left( q(R+T)\sin\alpha \right)}
32                {q(R+T)\sin\alpha}
33
34and
35
36.. math::
37
38    V_s = \pi (R + T)^2 (L + 2T)
39
40and $\alpha$ is the angle between the axis of the cylinder and $\vec q$,
41$V_s$ is the total volume (i.e. including both the core and the outer shell),
42$V_c$ is the volume of the core, $L$ is the length of the core,
43$R$ is the radius of the core, $T$ is the thickness of the shell, $\rho_c$
44is the scattering length density of the core, $\rho_s$ is the scattering
45length density of the shell, $\rho_\text{solv}$ is the scattering length
46density of the solvent, and *background* is the background level.  The outer
47radius of the shell is given by $R+T$ and the total length of the outer
48shell is given by $L+2T$. $J1$ is the first order Bessel function.
49
50.. _core-shell-cylinder-geometry:
51
52.. figure:: img/core_shell_cylinder_geometry.jpg
53
54    Core shell cylinder schematic.
55
56To provide easy access to the orientation of the core-shell cylinder, we
57define the axis of the cylinder using two angles $\theta$ and $\phi$.
58(see :ref:`cylinder model <cylinder-angle-definition>`)
59
60NB: The 2nd virial coefficient of the cylinder is calculated based on
61the radius and 2 length values, and used as the effective radius for
62$S(q)$ when $P(q) \cdot S(q)$ is applied.
63
64The $\theta$ and $\phi$ parameters are not used for the 1D output.
65
66Reference
67---------
68
69.. [#] see, for example, Ian Livsey  J. Chem. Soc., Faraday Trans. 2, 1987,83,
70   1445-1452
71.. [#kline] S R Kline, *J Appl. Cryst.*, 39 (2006) 895
72
73Authorship and Verification
74----------------------------
75
76* **Author:** NIST IGOR/DANSE **Date:** pre 2010
77* **Last Modified by:** Paul Kienzle **Date:** Aug 8, 2016
78* **Last Reviewed by:** Richard Heenan **Date:** March 18, 2016
79"""
80
81import numpy as np
82from numpy import pi, inf, sin, cos
83
84name = "core_shell_cylinder"
85title = "Right circular cylinder with a core-shell scattering length density profile."
86description = """
87P(q,alpha)= scale/Vs*f(q)^(2) + background,
88      where: f(q)= 2(sld_core - solvant_sld)
89        * Vc*sin[qLcos(alpha/2)]
90        /[qLcos(alpha/2)]*J1(qRsin(alpha))
91        /[qRsin(alpha)]+2(sld_shell-sld_solvent)
92        *Vs*sin[q(L+T)cos(alpha/2)][[q(L+T)
93        *cos(alpha/2)]*J1(q(R+T)sin(alpha))
94        /q(R+T)sin(alpha)]
95
96    alpha:is the angle between the axis of
97        the cylinder and the q-vector
98    Vs: the volume of the outer shell
99    Vc: the volume of the core
100    L: the length of the core
101        sld_shell: the scattering length density of the shell
102    sld_solvent: the scattering length density of the solvent
103    background: the background
104    T: the thickness
105        R+T: is the outer radius
106     L+2T: The total length of the outershell
107    J1: the first order Bessel function
108     theta: axis_theta of the cylinder
109     phi: the axis_phi of the cylinder
110"""
111category = "shape:cylinder"
112
113#             ["name", "units", default, [lower, upper], "type", "description"],
114parameters = [["sld_core", "1e-6/Ang^2", 4, [-inf, inf], "sld",
115               "Cylinder core scattering length density"],
116              ["sld_shell", "1e-6/Ang^2", 4, [-inf, inf], "sld",
117               "Cylinder shell scattering length density"],
118              ["sld_solvent", "1e-6/Ang^2", 1, [-inf, inf], "sld",
119               "Solvent scattering length density"],
120              ["radius", "Ang", 20, [0, inf], "volume",
121               "Cylinder core radius"],
122              ["thickness", "Ang", 20, [0, inf], "volume",
123               "Cylinder shell thickness"],
124              ["length", "Ang", 400, [0, inf], "volume",
125               "Cylinder length"],
126              ["theta", "degrees", 60, [-360, 360], "orientation",
127               "cylinder axis to beam angle"],
128              ["phi", "degrees", 60, [-360, 360], "orientation",
129               "rotation about beam"],
130             ]
131
132source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "core_shell_cylinder.c"]
133have_Fq = True
134effective_radius_type = ["equivalent sphere","outer radius","half outer length","half min outer dimension",
135                         "half max outer dimension","half outer diagonal"]
136
137#def ER(radius, thickness, length):
138#    """
139#    Returns the effective radius used in the S*P calculation
140#    """
141#    radius = radius + thickness
142#    length = length + 2 * thickness
143#    ddd = 0.75 * radius * (2 * radius * length + (length + radius) * (length + pi * radius))
144#    return 0.5 * (ddd) ** (1. / 3.)
145
146def random():
147    outer_radius = 10**np.random.uniform(1, 4.7)
148    # Use a distribution with a preference for thin shell or thin core
149    # Avoid core,shell radii < 1
150    radius = np.random.beta(0.5, 0.5)*(outer_radius-2) + 1
151    thickness = outer_radius - radius
152    length = np.random.uniform(1, 4.7)
153    pars = dict(
154        radius=radius,
155        thickness=thickness,
156        length=length,
157    )
158    return pars
159
160demo = dict(scale=1, background=0,
161            sld_core=6, sld_shell=8, sld_solvent=1,
162            radius=45, thickness=25, length=340,
163            theta=30, phi=15,
164            radius_pd=.2, radius_pd_n=1,
165            length_pd=.2, length_pd_n=10,
166            thickness_pd=.2, thickness_pd_n=10,
167            theta_pd=15, theta_pd_n=45,
168            phi_pd=15, phi_pd_n=1)
169q = 0.1
170# april 6 2017, rkh add unit tests, NOT compared with any other calc method, assume correct!
171qx = q*cos(pi/6.0)
172qy = q*sin(pi/6.0)
173tests = [
174    [{}, 0.075, 10.8552692237],
175    [{}, (qx, qy), 0.444618752741],
176]
177del qx, qy  # not necessary to delete, but cleaner
Note: See TracBrowser for help on using the repository browser.