- Categories
- Parallelepiped
- Core shell cuboid
- core_shell_cuboid.py
Core shell cuboid - core_shell_cuboid.py
# Author:
# Martin Schmiele
# Niels-Bohr-Institutet
# Koebenhavns Universitet
# martin.schmiele@nbi.ku.dk
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
#
#
# Orientationally averaged form factor for a monodisperse core-shell cuboid.
#
# ,p=.,,_
# ,/l:]:::::77t==.,,_
# ,/5::::[::::::::::::::773==.,,_
# ,/5:::::::{zps;;:::::::::::::::::ZL
# ,/5::::::::;z$3EtttZZ5sws;;:::::::yEJ.
# ,/5:::::::::zEtt$3EtttttttttttZZQ@:yE::[
# J=775es;;;Z5tttt3EEtttttttttttt@E@/::::L
# L::::::@8N@@szj3EEtttttttttt@E3@E::::3L
# {::::::$ttttZ59Q@BgszjttttgE1ZZ3E::::{
# J::::::Jttttttt3EEZZ55B@@SE2K5t3L::::[
# L:::::JEttttt25E35Sz@zz$ttQttt$:::::L
# [::::::Ettt25EttttttttZV5U$szj$::::J.
# J::::::$t25Ettttttttttt$t31tt2Pwsz;]
# L:::::@5EtttttttttttttEt3[zZ:::::y`
# [:::/5?3Gszjtttttttttt$tJ@E:::::/
# J;z5:::::::775szjtttttEz@L:::::F
# *+z;::::::::::::73Gsg@EJ.:::yF
# `*+z;::::::::::::::{:::/`
# `*=z;:::::::::[::F
# `*=c;::::[yF
# `*=cE`
#
r"""
Definition
----------
Parameters:
scale = scaling factor, volume fraction of particles scale phi ~ N V_{cs} / V_{irr}, with N / V_{irr} being the number density of particles in the irradiated volume
background = const. background
L = length of the cuboid
d = shell thickness
ho_{c} = scattering length density of core
ho_{sh} = scattering length density of shell
ho_{solv} = scattering length density of solvent
V_{cs} = volume of core-shell cuboid
For the particles with a non-spherical symmetry an orientational average is applied:
F^2(q) = int_{0}^{pi}int_{0}^{2pi} f^2(q, heta_Q,phi_Q) sin( heta_Q) d heta_Q dphi_Q
The output of the 1D scattering intensity function is then given by
P(q) = frac{ ext{scale}}{V_{cs}} F^2(q) + ext{background}
where
f(q, heta_Q,phi_Q) = (
ho_{c}-
ho_{sh} ) prod_{j=1}^3 [ 2 * L/2 * sinc(Q_j*L/2) ] + (
ho_{sh}-
ho_{solv} ) * prod_{j=1}^3 [ 2 * (L/2+d) * sinc(Q_j*(L/2+d)) ]
where
sinc(x) = sin(x) / x
Q_1 = Q sin( heta_Q) cos(phi_Q)
Q_2 = Q sin( heta_Q) sin(phi_Q)
Q_3 = Q cos( heta_Q)
For 2D:
To provide easy access to the orientation of the parallelepiped, we define the axis of the cylinder using three angles $ heta$, $phi$ and $psi$.
(see :ref:`cylinder orientation <cylinder-angle-definition>`).
figure:: img/parallelepiped_angle_definition.jpg
Definition of the angles for oriented core-shell parallelepipeds.
figure:: img/parallelepiped_angle_projection.jpg
Examples of the angles for oriented core-shell parallelepipeds against the detector plane.
Validation
----------
Compared with core-shell sphere using same core diameter (700 AA) and shell thickness (150 AA) and same SLDs provides same patterns at mid and high Q when using 25% Gaussian PDs for core radius/diameter and shell thickness
References
----------
P Mittelbach and G Porod, *Acta Physica Austriaca*, 14 (1961) 185-211 Equations (1), (13-14). (in German)
D Singh (2009). *Small angle scattering studies of self assembly in lipid mixtures*, John's Hopkins University Thesis (2009) 223-225.
"""
import numpy as np
from numpy import pi, inf, sqrt
name = "core_shell_cuboid"
title = "Orientationally averaged form factor for a monodisperse core-shell cuboid."
description = """
Output:
P(q) = frac{ ext{scale}}{V_{cs}} int_{0}^{pi}int_{0}^{2pi} f^2(q, heta_Q,phi_Q) sin( heta_Q) d heta_Q dphi_Q + ext{background}
where
f(q, heta_Q,phi_Q) = (
ho_{c}-
ho_{sh} ) prod_{j=1}^3 [ 2 * L/2 * sinc(Q_j*L/2) ] + (
ho_{sh}-
ho_{solv} ) * prod_{j=1}^3 [ 2 * (L/2+d) * sinc(Q_j*(L/2+d)) ]
where
sinc(x) = sin(x) / x
Q_1 = Q sin( heta_Q) cos(phi_Q)
Q_2 = Q sin( heta_Q) sin(phi_Q)
Q_3 = Q cos( heta_Q)
Parameters:
scale = scaling factor, volume fraction of particles scale phi ~ N V_{cs} / V_{irr}, with N / V_{irr} being the number density of particles in the irradiated volume
background = const. background
L = length of the cuboid
d = shell thickness
ho_{c} = scattering length density of core
ho_{sh} = scattering length density of shell
ho_{solv} = scattering length density of solvent
V_{cs} = volume of core-shell cuboid
"""
category = "shape:parallelepiped"
# ["name", "units", default, [lower, upper], "type","description"],
parameters = [["sld_core", "1e-6/Ang^2", 1, [-inf, inf], "sld", "Cuboid core scattering length density"],
["sld_shell", "1e-6/Ang^2", 2, [-inf, inf], "sld", "Cuboid shell scattering length density"],
["sld_solvent", "1e-6/Ang^2", 6.34, [-inf, inf], "sld", "Solvent scattering length density"],
["length", "Ang", 700, [0, inf], "volume", "Length of the Cuboid core"],
["thick_rim", "Ang", 150, [0, inf], "volume", "Thickness of the shell"],
["theta", "degrees", 0, [-inf, inf], "orientation", "In plane angle"],
["phi", "degrees", 0, [-inf, inf], "orientation", "Out of plane angle"],
["psi", "degrees", 0, [-inf, inf], "orientation", "Rotation angle around its own c axis against q plane"]]
source = ["lib/gauss76.c", "core_shell_cuboid.c"]
# NB: use effective radius for $S(q)$ when $P(q) cdot S(q)$ is applied.
def ER(length, thick_rim):
"""
Return equivalent radius (ER)
"""
total_length = length + 2.0 * thick_rim
# # approximation using 2nd virial coeff for a cylinder with surface average radius (rough approximation)
# # surf_rad = sqrt( total_length * total_length ) / pi
# surf_rad = total_length / pi
# height = total_length
# ddd = 0.75 * surf_rad * (2 * surf_rad * height + (height + surf_rad) * (height + pi * surf_rad))
# # ER would be approx. 2/5 * total_length ( (3/32/pi*(1+4/pi))^(1/3) == 0.40784 )
# return 0.5 * (ddd) ** (1./3.)
# use approximation of volume averaged radius (same volume of sphere and cuboid), might be better as the approximation with cylinder since for cuboid a=b=c
# ER = ( V / ( 4. * pi / 3.) ) ** (1./3.) where V = total_length**3. and (3/4/pi)^(1/3) == 0.62035
ER = total_length * ( 3. / ( 4. * pi ) ) ** (1./3.)
# VR defaults to 1.0
# parameters for demo
demo = dict(scale=1,
background=0.0,
sld_core=1,
sld_shell=2,
sld_solvent=6.34,
length=700,
thick_rim=150,
theta=0,
phi=0,
psi=0
)
# length_pd=0.1, length_pd_n=1,
# thick_rim_pd=0.1, thick_rim_pd_n=1,
# theta_pd=10, theta_pd_n=1,
# phi_pd=10, phi_pd_n=1,
# psi_pd=10, psi_pd_n=1
qx, qy = 0.2 * np.cos(2.5), 0.2 * np.sin(2.5)
tests = [[{}, 0.2, 0.533149288477],
[{}, [0.2], [0.533149288477]],
[{'theta':10.0, 'phi':10.0}, (qx, qy), 0.032102135569],
[{'theta':10.0, 'phi':10.0}, [(qx, qy)], [0.032102135569]],
]
del qx, qy # not necessary to delete, but cleaner
Back to Model
Download