In [1]:
import escape as esc
import numpy as np

esc.require("0.9.8")
Loading material database from /home/dkor/Data/Development/workspace_escape/escape-core/python/src/escape/scattering/../data/mdb/materials.db
In [2]:
q = esc.var("Q")

SAXS. Form-factors. PolyRectSphere¶

Original: https://www.ncnr.nist.gov/resources/sansmodels/PolyRectSphere.html

Author: Denis Korolkov

Calculates the form factor for a polydisperse population of spheres with uniform scattering length density. The distribution of radii is a rectangular (box) distribution. The form factor is normalized by the average particle volume.

Parameters¶

Parameter Variable Value
0 Scale 1.0
1 Average Radius (Å) 60.0
2 Polydispersity (0-1) 0.12
3 Contrast ($Å^{-2}$) 3.0e-6
4 Incoherent Background($cm^{-1}$) 0.000

Usage notes¶

The returned value is scaled to units of cm^{-1}, absolute scale.

The (normalized) rectangular distribution is:

image.png

with the constraint that $w <= R$. Here R is the average radius specified by parameter[1] above.

$R$ is the mean of the distribution and $w$ is the half-width. The root mean square deviation is image-2.png The polydispersity image-3.png

The form factor is normalized by the average volume, using

image-4.png

Parameter[0] (scale) and Parameter[3] (contrast) are multiplicative factors in the model and are perfectly correlated. Only one of these parameters should be left free during model fitting.

Reference¶

Kotlarchyk, M.; Chen, S.-H. J. Chem. Phys., 1983, 79, 2461.

In [3]:
# Definition of model parameters
I0 = esc.par("Scale", 1, scale=1e8, fixed=True)
R = esc.par("Mean Radius", 60, units=esc.angstr)
P = esc.par("Polydispersity", 0.12, userlim=[0, 1])
VF = esc.par("Volume fraction", 0.1, userlim=[0, 1])
rho = esc.par("Contrast", 1, scale=2e-6, units=f"{esc.angstr}⁻²")
bkgr = esc.par("Background", 0.0, userlim=[0, 0.03])

# Model equations
r = esc.par("Radius", 60, userlim=[-float("inf"), -float("inf")], units=esc.angstr)

w = P * np.sqrt(3) * R
cond = esc.abs(r - R) <= w

# distribution function
D = esc.conditional(cond, 1 / (2 * w), 0.0)

V = 4 / 3 * np.pi * R**3 * (1 + 3 * P**2)

QR = q * r
F = 3 * V * rho * (esc.sin(QR) - QR * esc.cos(QR)) / esc.pow(QR, 3)
P = (
    I0
    / V
    * esc.average(F**2, D, r, R, R - w, R + w, epsrel=1e-8, epsabs=1e-8, maxiter=50)
    + bkgr
)


P.show(coordinates=np.linspace(0.001, 0.7, 128)).config(
    title="PolyRectSphere",
    xlog=True,
    ylog=True,
    xlabel=f"Q[{esc.angstr}⁻¹]",
    ylabel="P(q)[cm⁻¹]",
)
Out[3]:
In [ ]: