source: sasmodels/sasmodels/models/flexible_cylinder.py

Last change on this file was d57b06c, checked in by Paul Kienzle <pkienzle@…>, 5 years ago

Merge remote-tracking branch 'origin/master' into ticket-1263-source-link

  • Property mode set to 100644
File size: 7.5 KB
Line 
1r"""
2This model provides the form factor, $P(q)$, for a flexible cylinder
3where the form factor is normalized by the volume of the cylinder.
4**Inter-cylinder interactions are NOT provided for.**
5
6.. math::
7
8    P(q) = \text{scale} \left<F^2\right>/V + \text{background}
9
10where the averaging $\left<\ldots\right>$ is applied only for the 1D
11calculation
12
13The 2D scattering intensity is the same as 1D, regardless of the orientation of
14the q vector which is defined as
15
16.. math::
17
18    q = \sqrt{q_x^2 + q_y^2}
19
20Definitions
21-----------
22
23.. figure:: img/flexible_cylinder_geometry.jpg
24
25
26The chain of contour length, $L$, (the total length) can be described as a
27chain of some number of locally stiff segments of length $l_p$, the persistence
28length (the length along the cylinder over which the flexible cylinder can be
29considered a rigid rod).
30The Kuhn length $(b = 2*l_p)$ is also used to describe the stiffness of a chain.
31
32In the parameters, the sld and sld\_solvent represent the SLD of the cylinder
33and solvent respectively.
34
35Our model uses the form factor calculations in reference [1] as implemented in a
36c-library provided by the NIST Center for Neutron Research (Kline, 2006). This states:
37
38    'Method 3 With Excluded Volume' is used.
39    The model is a parametrization of simulations of a discrete representation
40    of the worm-like chain model of Kratky and Porod applied in the
41    pseudocontinuous limit.
42    See equations (13,26-27) in the original reference for the details.
43
44.. note::
45
46    There are several typos in the original reference that have been corrected
47    by WRC [2]. Details of the corrections are in the reference below. Most notably
48
49    - Equation (13): the term $(1 - w(QR))$ should swap position with $w(QR)$
50
51    - Equations (23) and (24) are incorrect; WRC has entered these into
52      Mathematica and solved analytically. The results were then converted to
53      code.
54
55    - Equation (27) should be $q0 = max(a3/(Rg^2)^{1/2},3)$ instead of
56      $max(a3*b(Rg^2)^{1/2},3)$
57
58    - The scattering function is negative for a range of parameter values and
59      q-values that are experimentally accessible. A correction function has been
60      added to give the proper behavior.
61
62
63**This is a model with complex behaviour depending on the ratio of** $L/b$ **and the
64reader is strongly encouraged to read reference [1] before use.**
65
66.. note::
67
68    There are several typos in the original reference that have been corrected
69    by WRC [2]. Details of the corrections are in the reference below. Most notably
70
71    - Equation (13): the term $(1 - w(QR))$ should swap position with $w(QR)$
72
73    - Equations (23) and (24) are incorrect; WRC has entered these into
74      Mathematica and solved analytically. The results were then converted to
75      code.
76
77    - Equation (27) should be $q0 = max(a3/(Rg^2)^{1/2},3)$ instead of
78      $max(a3*b(Rg^2)^{1/2},3)$
79
80    - The scattering function is negative for a range of parameter values and
81      q-values that are experimentally accessible. A correction function has been
82      added to give the proper behavior.
83
84
85**This is a model with complex behaviour depending on the ratio of** $L/b$ **and the
86reader is strongly encouraged to read reference [1] before use.**
87
88References
89----------
90
91.. [#] J S Pedersen and P Schurtenberger. *Scattering functions of semiflexible polymers with and without excluded volume effects.* Macromolecules, 29 (1996) 7602-7612
92
93Correction of the formula can be found in
94
95.. [#] 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
96
97Authorship and Verification
98----------------------------
99
100* **Author:**
101* **Last Modified by:**
102* **Last Reviewed by:** Steve King **Date:** March 26, 2019
103"""
104
105import numpy as np
106from numpy import inf
107
108name = "flexible_cylinder"
109title = "Flexible cylinder where the form factor is normalized by the volume " \
110        "of the cylinder."
111description = """Note : scale and contrast = (sld - sld_solvent) are both
112                multiplicative factors in the model and are perfectly
113                correlated. One or both of these parameters must be held fixed
114                during model fitting.
115              """
116
117category = "shape:cylinder"
118single = False  # double precision only!
119
120# pylint: disable=bad-whitespace, line-too-long
121#             ["name", "units", default, [lower, upper], "type", "description"],
122parameters = [
123    ["length",      "Ang",       1000.0, [0, inf],    "volume", "Length of the flexible cylinder"],
124    ["kuhn_length", "Ang",        100.0, [0, inf],    "volume", "Kuhn length of the flexible cylinder"],
125    ["radius",      "Ang",         20.0, [0, inf],    "volume", "Radius of the flexible cylinder"],
126    ["sld",         "1e-6/Ang^2",   1.0, [-inf, inf], "sld",    "Cylinder scattering length density"],
127    ["sld_solvent", "1e-6/Ang^2",   6.3, [-inf, inf], "sld",    "Solvent scattering length density"],
128    ]
129# pylint: enable=bad-whitespace, line-too-long
130source = ["lib/polevl.c", "lib/sas_J1.c", "lib/wrc_cyl.c", "flexible_cylinder.c"]
131
132def random():
133    """Return a random parameter set for the model."""
134    length = 10**np.random.uniform(2, 6)
135    radius = 10**np.random.uniform(1, 3)
136    kuhn_length = 10**np.random.uniform(-2, 0)*length
137    pars = dict(
138        length=length,
139        radius=radius,
140        kuhn_length=kuhn_length,
141    )
142    return pars
143
144tests = [
145    # Accuracy tests based on content in test/utest_other_models.py
146    [{'length':     1000.0,  # test T1
147      'kuhn_length': 100.0,
148      'radius':       20.0,
149      'sld':           1.0,
150      'sld_solvent':   6.3,
151      'background':    0.0001,
152     }, 0.001, 3509.2187],
153
154    # Additional tests with larger range of parameters
155    [{'length':    1000.0,  # test T2
156      'kuhn_length': 100.0,
157      'radius':       20.0,
158      'sld':           1.0,
159      'sld_solvent':   6.3,
160      'background':    0.0001,
161     }, 1.0, 0.000595345],
162    [{'length':        10.0,  # test T3
163      'kuhn_length': 800.0,
164      'radius':        2.0,
165      'sld':           6.0,
166      'sld_solvent':  12.3,
167      'background':    0.001,
168     }, 0.1, 1.55228],
169    [{'length':        100.0,  # test T4
170      'kuhn_length': 800.0,
171      'radius':       50.0,
172      'sld':           0.1,
173      'sld_solvent':   5.1,
174      'background':    0.0,
175     }, 1.0, 0.000938456]
176    ]
177
178# There are a few branches in the code that ought to have test values:
179#
180# For length > 4 * kuhn_length
181#        if length > 10 * kuhn_length then C is scaled by 3.06 (L/b)^(-0.44)
182#        q*kuhn_length <= 3.1  => Sexv_new
183#           dS/dQ < 0 has different behaviour from dS/dQ >= 0
184#  T2    q*kuhn_length > 3.1   => a_long
185#
186# For length <= 4 * kuhn_length
187#        q*kuhn_length <= max(1.9/Rg_short, 3.0)  => Sdebye((q*Rg)^2)
188#           q*Rg < 0.5 uses Pade approx, q*Rg > 1.0 uses math lib
189#  T3,T4 q*kuhn_length > max(1.9/Rg_short, 3.0)   => a_short
190#
191# Note that the transitions between branches may be abrupt.  You can see a
192# several percent change around length=10*kuhn_length and length=4*kuhn_length
193# using the following:
194#
195#    sascomp flexible_cylinder -calc=double -sets=10 length=10*kuhn_length,10.000001*kuhn_length
196#    sascomp flexible_cylinder -calc=double -sets=10 length=4*kuhn_length,4.000001*kuhn_length
197#
198# The transition between low q and high q around q*kuhn_length = 3 seems
199# to be good to 4 digits or better.  This was tested by computing the value
200# on each branches near the transition point and reporting the relative error
201# for kuhn lengths of 10, 100 and 1000 and a variety of length:kuhn_length
202# ratios.
Note: See TracBrowser for help on using the repository browser.