source: sasmodels/sasmodels/models/flexible_cylinder_elliptical.py @ 598a354

core_shell_microgelsmagnetic_modelticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 598a354 was 598a354, checked in by smk78, 5 years ago

Fix typo and duplicate lines.

  • Property mode set to 100644
File size: 6.5 KB
Line 
1r"""
2This model calculates the form factor for a flexible cylinder with an
3elliptical cross section and a uniform scattering length density.
4The non-negligible diameter of the cylinder is included by accounting
5for excluded volume interactions within the walk of a single cylinder.
6The form factor is normalized by the particle volume such that
7
8.. math::
9
10    P(q) = \text{scale} \left<F^2\right>/V + \text{background}
11
12where the averaging $\left<\ldots\right>$ is over all possible orientations
13of the flexible cylinder.
14
15The 2D scattering intensity is the same as 1D, regardless of the orientation
16of the q vector which is defined as
17
18.. math::
19
20    q = \sqrt{q_x^2 + q_y^2}
21
22
23Definitions
24-----------
25
26The function calculated in a similar way to that for the flexible_cylinder model
27from the reference given below using the author's "Method 3 With Excluded Volume".
28The model is a parameterization of simulations of a discrete representation of
29the worm-like chain model of Kratky and Porod applied in the pseudo-continuous
30limit. See equations (13, 26-27) in the original reference for the details.
31
32.. note::
33
34    There are several typos in the original reference that have been corrected
35    by WRC. Details of the corrections are in the reference below. Most notably
36
37    - Equation (13): the term $(1 - w(QR))$ should swap position with $w(QR)$
38
39    - Equations (23) and (24) are incorrect; WRC has entered these into
40      Mathematica and solved analytically. The results were then converted to
41      code.
42
43    - Equation (27) should be $q0 = max(a3/sqrt(RgSquare),3)$ instead of
44      $max(a3*b/sqrt(RgSquare),3)$
45
46    - The scattering function is negative for a range of parameter values and
47      q-values that are experimentally accessible. A correction function has been
48      added to give the proper behavior.
49
50.. figure:: img/flexible_cylinder_ex_geometry.jpg
51
52
53The chain of contour length, $L$, (the total length) can be described as a chain
54of some number of locally stiff segments of length $l_p$, the persistence length
55(the length along the cylinder over which the flexible cylinder can be considered
56a rigid rod).
57The Kuhn length $(b = 2*l_p)$ is also used to describe the stiffness of a chain.
58
59The cross section of the cylinder is elliptical, with minor radius $a$ .
60The major radius is larger, so of course, **the axis ratio (parameter 5) must be
61greater than one.** Simple constraints should be applied during curve fitting to
62maintain this inequality.
63
64In the parameters, the $sld$ and $sld\_solvent$ represent the SLD of the
65chain/cylinder and solvent respectively. The *scale*, and the contrast are both
66multiplicative factors in the model and are perfectly correlated. One or both of
67these parameters must be held fixed during model fitting.
68
69**No inter-cylinder interference effects are included in this calculation.**
70
71References
72----------
73
74.. [#] J S Pedersen and P Schurtenberger. *Scattering functions of semiflexible polymers with and without excluded volume effects.* Macromolecules, 29 (1996) 7602-7612
75
76Correction of the formula can be found in
77
78.. [#] W R Chen, P D Butler and L J Magid, *Incorporating Intermicellar Interactions in the Fitting of SANS Data from Cationic Wormlike Micelles.* Langmuir, 22(15) 2006 6539-6548
79
80Source
81------
82
83`flexible_cylinder_elliptical.py <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/flexible_cylinder_elliptical.py>`_
84
85`flexible_cylinder_elliptical.c <https://github.com/SasView/sasmodels/blob/master/sasmodels/models/flexible_cylinder_elliptical.c>`_
86
87Authorship and Verification
88----------------------------
89
90* **Author:**
91* **Last Modified by:**
92* **Last Reviewed by:**
93* **Source added by :** Steve King **Date:** March 25, 2019
94"""
95
96import numpy as np
97from numpy import inf
98
99name = "flexible_cylinder_elliptical"
100title = "Flexible cylinder wth an elliptical cross section and a uniform " \
101        "scattering length density."
102description = """Note : scale and contrast=sldCyl-sldSolv are both multiplicative
103        factors in the
104        model and are perfectly correlated. One or
105        both of these parameters must be held fixed
106        during model fitting.
107        """
108single = False
109
110category = "shape:cylinder"
111# pylint: disable=bad-whitespace, line-too-long
112#             ["name", "units", default, [lower, upper], "type", "description"],
113parameters = [
114    ["length",      "Ang",       1000.0, [0, inf],    "volume", "Length of the flexible cylinder"],
115    ["kuhn_length", "Ang",        100.0, [0, inf],    "volume", "Kuhn length of the flexible cylinder"],
116    ["radius",      "Ang",         20.0, [1, inf],    "volume", "Radius of the flexible cylinder"],
117    ["axis_ratio",  "",             1.5, [0, inf],    "",       "Axis_ratio (major_radius/minor_radius"],
118    ["sld",         "1e-6/Ang^2",   1.0, [-inf, inf], "sld",    "Cylinder scattering length density"],
119    ["sld_solvent", "1e-6/Ang^2",   6.3, [-inf, inf], "sld",    "Solvent scattering length density"],
120    ]
121# pylint: enable=bad-whitespace, line-too-long
122
123source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "lib/wrc_cyl.c",
124          "flexible_cylinder_elliptical.c"]
125
126def random():
127    """Return a random parameter set for the model."""
128    length = 10**np.random.uniform(2, 6)
129    radius = 10**np.random.uniform(1, 3)
130    axis_ratio = 10**np.random.uniform(-1, 1)
131    kuhn_length = 10**np.random.uniform(-2, -0.7)*length  # at least 10 segments
132    pars = dict(
133        length=length,
134        radius=radius,
135        axis_ratio=axis_ratio,
136        kuhn_length=kuhn_length,
137    )
138    return pars
139
140tests = [
141    # Accuracy tests based on content in test/utest_other_models.py
142    # Currently fails in OCL
143    # [{'length':     1000.0,
144    #  'kuhn_length': 100.0,
145    #  'radius':       20.0,
146    #  'axis_ratio':    1.5,
147    #  'sld':           1.0,
148    #  'sld_solvent':   6.3,
149    #  'background':    0.0001,
150    # }, 0.001, 3509.2187],
151
152    # Additional tests with larger range of parameters
153    [{'length':     1000.0,
154      'kuhn_length': 100.0,
155      'radius':       20.0,
156      'axis_ratio':    1.5,
157      'sld':           1.0,
158      'sld_solvent':   6.3,
159      'background':    0.0001,
160     }, 1.0, 0.00223819],
161    [{'length':        10.0,
162      'kuhn_length': 800.0,
163      'radius':        2.0,
164      'axis_ratio':    0.5,
165      'sld':           6.0,
166      'sld_solvent':  12.3,
167      'background':    0.001,
168     }, 0.1, 0.390281],
169    [{'length':        100.0,
170      'kuhn_length': 800.0,
171      'radius':       50.0,
172      'axis_ratio':    4.5,
173      'sld':           0.1,
174      'sld_solvent':   5.1,
175      'background':    0.0,
176     }, 1.0, 0.0016338264790]
177    ]
Note: See TracBrowser for help on using the repository browser.