source: sasmodels/sasmodels/models/broad_peak.py @ 2c74c11

core_shell_microgelscostrafo411magnetic_modelrelease_v0.94release_v0.95ticket-1257-vesicle-productticket_1156ticket_1265_superballticket_822_more_unit_tests
Last change on this file since 2c74c11 was 2c74c11, checked in by Paul Kienzle <pkienzle@…>, 8 years ago

implicit Iqxy; fix divide by 0 for q=0

  • Property mode set to 100644
File size: 3.5 KB
Line 
1r"""
2This model calculates an empirical functional form for SAS data characterized
3by a broad scattering peak. Many SAS spectra are characterized by a broad peak
4even though they are from amorphous soft materials. For example, soft systems
5that show a SAS peak include copolymers, polyelectrolytes, multiphase systems,
6layered structures, etc.
7
8The d-spacing corresponding to the broad peak is a characteristic distance
9between the scattering inhomogeneities (such as in lamellar, cylindrical, or
10spherical morphologies, or for bicontinuous structures).
11
12Definition
13----------
14
15The scattering intensity $I(q)$ is calculated as
16
17.. math::
18
19    I(q) = \frac{A}{q^n} + \frac{C}{1 + (|q - q_0|\xi)^m} + B
20
21Here the peak position is related to the d-spacing as $q_o = 2\pi / d_o$.
22
23$A$ is the Porod law scale factor, $n$ the Porod exponent, $C$ is the Lorentzian
24scale factor, $m$ the exponent of q, \ |xi|\  the screening length, and $B$ the flat background.
25
26For 2D data the scattering intensity is calculated in the same way as 1D,
27where the $q$ vector is defined as
28
29.. math::
30
31    q = \sqrt{q_x^2 + q_y^2}
32
33
34References
35----------
36
37None.
38
39*2013/09/09 - Description reviewed by King, S and Parker, P.*
40
41"""
42
43from numpy import inf, errstate
44
45name = "broad_peak"
46title = "Broad Lorentzian type peak on top of a power law decay"
47description = """\
48      I(q) = scale_p/pow(q,exponent)+scale_l/
49      (1.0 + pow((fabs(q-q_peak)*length_l),exponent_l) )+ background
50
51      List of default parameters:
52      porod_scale = Porod term scaling
53      porod_exp = Porod exponent
54      lorentz_scale = Lorentzian term scaling
55      lorentz_length = Lorentzian screening length [A]
56      peak_pos = peak location [1/A]
57      lorentz_exp = Lorentzian exponent
58      background = Incoherent background"""
59category = "shape-independent"
60
61# pylint: disable=bad-whitespace, line-too-long
62#             ["name", "units", default, [lower, upper], "type", "description"],
63parameters = [["porod_scale",    "",  1.0e-05, [-inf, inf], "", "Power law scale factor"],
64              ["porod_exp",      "",      3.0, [-inf, inf], "", "Exponent of power law"],
65              ["lorentz_scale",  "",     10.0, [-inf, inf], "", "Scale factor for broad Lorentzian peak"],
66              ["lorentz_length", "Ang",  50.0, [-inf, inf], "", "Lorentzian screening length"],
67              ["peak_pos",       "1/Ang", 0.1, [-inf, inf], "", "Peak position in q"],
68              ["lorentz_exp",    "",      2.0, [-inf, inf], "", "Exponent of Lorentz function"],
69             ]
70# pylint: enable=bad-whitespace, line-too-long
71
72def Iq(q,
73       porod_scale=1.0e-5,
74       porod_exp=3.0,
75       lorentz_scale=10.0,
76       lorentz_length=50.0,
77       peak_pos=0.1,
78       lorentz_exp=2.0):
79    """
80    :param q:              Input q-value
81    :param porod_scale:    Power law scale factor
82    :param porod_exp:      Exponent of power law
83    :param lorentz_scale:  Scale factor for broad Lorentzian peak
84    :param lorentz_length: Lorentzian screening length
85    :param peak_pos:       Peak position in q
86    :param lorentz_exp:    Exponent of Lorentz function
87    :return:               Calculated intensity
88    """
89    z = abs(q - peak_pos) * lorentz_length
90    with errstate(divide='ignore'):
91        inten = (porod_scale / q ** porod_exp
92                 + lorentz_scale / (1 + z ** lorentz_exp))
93    return inten
94Iq.vectorized = True  # Iq accepts an array of q values
95
96demo = dict(scale=1, background=0,
97            porod_scale=1.0e-05, porod_exp=3,
98            lorentz_scale=10, lorentz_length=50, peak_pos=0.1, lorentz_exp=2)
Note: See TracBrowser for help on using the repository browser.