- Categories
- Cylinder
- Pearl Necklace
- pearl_necklace.py
Pearl Necklace - pearl_necklace.py
r"""
This model provides the form factor for a pearl necklace composed of two
elements: *N* pearls (homogeneous spheres of radius *R*) freely jointed by *M*
rods (like strings - with a total mass *Mw* = *M* * *m* :sub:`r` + *N* * *m*
:sub:`s`, and the string segment length (or edge separation) *l*
(= *A* - 2 *R*)). *A* is the center-to-center pearl separation distance.
.. figure:: img/pearl_necklace_geometry.jpg
Pearl Necklace schematic
Definition
----------
The output of the scattering intensity function for the pearl_necklace is
given by (Schweins, 2004)
.. math::
I(q)=frac{ ext{scale} }{V} cdot frac{(S_{ss}(q)+S_{ff}(q)+S_{fs}(q))}
{(M cdot m_f + N cdot m_s)^2} + ext{bkg}
where
.. math::
S_{ss}(q) &= 2m_s^2psi^2(q)left[frac{N}{1-sin(qA)/qA}-frac{N}{2}-
frac{1-(sin(qA)/qA)^N}{(1-sin(qA)/qA)^2}cdotfrac{sin(qA)}{qA}
ight] \
S_{ff}(q) &= m_r^2left[Mleft{2Lambda(q)-left(frac{sin(ql/2)}{ql/2}
ight)
ight}+
frac{2Meta^2(q)}{1-sin(qA)/qA}-2eta^2(q)cdot
frac{1-(sin(qA)/qA)^M}{(1-sin(qA)/qA)^2}
ight] \
S_{fs}(q) &= m_r eta (q) cdot m_s psi (q) cdot 4left[
frac{N-1}{1-sin(qA)/qA}-frac{1-(sin(qA)/qA)^{N-1}}{(1-sin(qA)/qA)^2}
cdot frac{sin(qA)}{qA}
ight] \
psi(q) &= 3 cdot frac{sin(qR)-(qR)cdot cos(qR)}{(qR)^3} \
Lambda(q) &= frac{int_0^{ql}frac{sin(t)}{t}dt}{ql} \
eta(q) &= frac{int_{qR}^{q(A-R)}frac{sin(t)}{t}dt}{ql}
where the mass *m* :sub:`i` is (SLD :sub:`i` - SLD :sub:`solvent`) *
(volume of the *N* pearls/rods). *V* is the total volume of the necklace.
.. note::
*num_pearls* must be an integer.
The 2D scattering intensity is the same as $P(q)$ above, regardless of the
orientation of the *q* vector.
References
----------
.. [#] R Schweins and K Huber, *Particle Scattering Factor of Pearl Necklace Chains*,
*Macromol. Symp.* 211 (2004) 25-42 2004
.. [#] L. Onsager, *Ann. New York Acad. Sci.*, 51 (1949) 627-659
Authorship and Verification
----------------------------
* **Author:**
* **Last Modified by:** Andrew Jackson **Date:** March 28, 2019
* **Last Reviewed by:** Steve King **Date:** March 28, 2019
"""
import numpy as np
from numpy import inf
name = "pearl_necklace"
title = "Colloidal spheres chained together with no preferential orientation"
description = """
Calculate form factor for Pearl Necklace Model
[Macromol. Symp. 2004, 211, 25-42]
Parameters:
background:background
scale: scale factor
sld: the SLD of the pearl spheres
sld_string: the SLD of the strings
sld_solvent: the SLD of the solvent
num_pearls: number of the pearls
radius: the radius of a pearl
edge_sep: the length of string segment; surface to surface
thick_string: thickness (ie, diameter) of the string
"""
category = "shape:cylinder"
# ["name", "units", default, [lower, upper], "type","description"],
parameters = [["radius", "Ang", 80.0, [0, inf], "volume",
"Mean radius of the chained spheres"],
["edge_sep", "Ang", 350.0, [0, inf], "volume",
"Mean separation of chained particles"],
["thick_string", "Ang", 2.5, [0, inf], "volume",
"Thickness of the chain linkage"],
["num_pearls", "none", 3, [1, inf], "volume",
"Number of pearls in the necklace (must be integer)"],
["sld", "1e-6/Ang^2", 1.0, [-inf, inf], "sld",
"Scattering length density of the chained spheres"],
["sld_string", "1e-6/Ang^2", 1.0, [-inf, inf], "sld",
"Scattering length density of the chain linkage"],
["sld_solvent", "1e-6/Ang^2", 6.3, [-inf, inf], "sld",
"Scattering length density of the solvent"],
]
source = ["lib/sas_Si.c", "lib/sas_3j1x_x.c", "pearl_necklace.c"]
single = False # use double precision unless told otherwise
radius_effective_modes = ["equivalent volume sphere"]
def random():
"""Return a random parameter set for the model."""
radius = 10**np.random.uniform(1, 3) # 1 - 1000
thick_string = 10**np.random.uniform(0, np.log10(radius)-1) # 1 - radius/10
edge_sep = 10**np.random.uniform(0, 3) # 1 - 1000
num_pearls = np.round(10**np.random.uniform(0.3, 3)) # 2 - 1000
pars = dict(
radius=radius,
edge_sep=edge_sep,
thick_string=thick_string,
num_pearls=num_pearls,
)
return pars
# parameters for demo
demo = dict(scale=1, background=0, radius=80.0, edge_sep=350.0,
num_pearls=3, sld=1, sld_solvent=6.3, sld_string=1,
thick_string=2.5,
radius_pd=.2, radius_pd_n=5,
edge_sep_pd=25.0, edge_sep_pd_n=5,
num_pearls_pd=0, num_pearls_pd_n=0,
thick_string_pd=0.2, thick_string_pd_n=5,
)
# ER function is not being used here, not that it is likely very sensible to
# include an S(Q) with this model, the default in sasview 5.0 would be to the
# "unconstrained" radius_effective.
#tests = [[{}, 0.001, 17380.245], [{}, 'ER', 115.39502]]
tests = [[{}, 0.001, 17380.245]]
Back to Model
Download