1 | r""" |
---|
2 | This model provides the form factor for $N$ spherical pearls of radius $R$ |
---|
3 | linearly joined by short strings (or segment length or edge separation) |
---|
4 | $l$ $(= A - 2R)$. $A$ is the center-to-center pearl separation distance. |
---|
5 | The thickness of each string is assumed to be negligible. |
---|
6 | |
---|
7 | .. figure:: img/linear_pearls_geometry.jpg |
---|
8 | |
---|
9 | |
---|
10 | Definition |
---|
11 | ---------- |
---|
12 | |
---|
13 | The output of the scattering intensity function for the linear_pearls model |
---|
14 | is given by (Dobrynin, 1996) |
---|
15 | |
---|
16 | .. math:: |
---|
17 | |
---|
18 | P(Q) = \frac{\text{scale}}{V}\left[ m_{p}^2 |
---|
19 | \left(N+2\sum_{n-1}^{N-1}(N-n)\frac{\sin(qnl)}{qnl}\right) |
---|
20 | \left( 3\frac{\sin(qR)-qR\cos(qR)}{(qr)^3}\right)^2\right] |
---|
21 | |
---|
22 | where the mass $m_p$ is $(SLD_{pearl}-SLD_{solvent})*(volume\ of\ N\ pearls)$. |
---|
23 | V is the total volume. |
---|
24 | |
---|
25 | The 2D scattering intensity is the same as P(q) above, |
---|
26 | regardless of the orientation of the q vector. |
---|
27 | |
---|
28 | References |
---|
29 | ---------- |
---|
30 | |
---|
31 | A V Dobrynin, M Rubinstein and S P Obukhov, *Macromol.*, |
---|
32 | 29 (1996) 2974-2979 |
---|
33 | """ |
---|
34 | |
---|
35 | import numpy as np |
---|
36 | from numpy import inf |
---|
37 | |
---|
38 | name = "linear_pearls" |
---|
39 | title = "Linear pearls model of scattering from spherical pearls." |
---|
40 | description = """ |
---|
41 | Calculate form factor for Pearl Necklace Model |
---|
42 | [Macromol. 1996, 29, 2974-2979] |
---|
43 | Parameters: |
---|
44 | |
---|
45 | sld_pearl: the SLD of the pearl spheres |
---|
46 | sld_solv: the SLD of the solvent |
---|
47 | num_pearls: number of the pearls |
---|
48 | radius: the radius of a pearl |
---|
49 | edge_separation: the length of string segment; surface to surface |
---|
50 | """ |
---|
51 | category = "shape:sphere" |
---|
52 | |
---|
53 | # pylint: disable=bad-whitespace, line-too-long |
---|
54 | # ["name", "units", default, [lower, upper], "type", "description"], |
---|
55 | parameters = [ |
---|
56 | ["radius", "Ang", 80.0, [0, inf], "", "Radius of the pearls"], |
---|
57 | ["edge_sep", "Ang", 350.0, [0, inf], "", "Length of the string segment - surface to surface"], |
---|
58 | ["num_pearls", "", 3.0, [1, inf], "", "Number of the pearls"], |
---|
59 | ["sld", "1e-6/Ang^2", 1.0, [-inf, inf], "sld", "SLD of the pearl spheres"], |
---|
60 | ["sld_solvent", "1e-6/Ang^2", 6.3, [-inf, inf], "sld", "SLD of the solvent"], |
---|
61 | ] |
---|
62 | # pylint: enable=bad-whitespace, line-too-long |
---|
63 | single = False |
---|
64 | |
---|
65 | source = ["lib/sas_3j1x_x.c", "linear_pearls.c"] |
---|
66 | |
---|
67 | def random(): |
---|
68 | """Return a random parameter set for the model.""" |
---|
69 | radius = 10**np.random.uniform(1, 3) # 1 - 1000 |
---|
70 | edge_sep = 10**np.random.uniform(0, 3) # 1 - 1000 |
---|
71 | num_pearls = np.round(10**np.random.uniform(0.3, 3)) # 2 - 1000 |
---|
72 | pars = dict( |
---|
73 | radius=radius, |
---|
74 | edge_sep=edge_sep, |
---|
75 | num_pearls=num_pearls, |
---|
76 | ) |
---|
77 | return pars |
---|
78 | |
---|
79 | _ = """ |
---|
80 | Tests temporarily disabled, until single-double precision accuracy issue solved. |
---|
81 | |
---|
82 | tests = [ |
---|
83 | # Accuracy tests based on content in test/utest_model_pearlnecklace.py |
---|
84 | [{'radius': 20.0, |
---|
85 | 'num_pearls': 2.0, |
---|
86 | 'sld': 1.0, |
---|
87 | 'sld_solvent': 6.3, |
---|
88 | 'edge_sep': 400.0, |
---|
89 | }, 0.001, 185.135], |
---|
90 | |
---|
91 | # Additional tests with larger range of parameters |
---|
92 | [{'radius': 120.0, |
---|
93 | 'num_pearls': 5.0, |
---|
94 | 'sld': 2.0, |
---|
95 | 'sld_solvent': 2.3, |
---|
96 | 'edge_sep': 100.0, |
---|
97 | }, 0.01, 45.4984], |
---|
98 | |
---|
99 | [{'radius': 7.0, |
---|
100 | 'num_pearls': 2.0, |
---|
101 | 'sld': 10.0, |
---|
102 | 'sld_solvent': 99.3, |
---|
103 | 'edge_sep': 20.0, |
---|
104 | }, 1.0, 0.632811], |
---|
105 | ] |
---|
106 | """ |
---|