1 | r""" |
---|
2 | This model provides the form factor for a pearl necklace composed of two |
---|
3 | elements: *N* pearls (homogeneous spheres of radius *R*) freely jointed by *M* |
---|
4 | rods (like strings - with a total mass *Mw* = *M* \* *m*\ :sub:`r` + *N* \* *m*\ |
---|
5 | :sub:`s`, and the string segment length (or edge separation) *l* |
---|
6 | (= *A* - 2\ *R*)). *A* is the center-to-center pearl separation distance. |
---|
7 | |
---|
8 | .. figure:: img/pearl_necklace_geometry.jpg |
---|
9 | |
---|
10 | Pearl Necklace schematic |
---|
11 | |
---|
12 | Definition |
---|
13 | ---------- |
---|
14 | |
---|
15 | The output of the scattering intensity function for the pearl_necklace is |
---|
16 | given by (Schweins, 2004) |
---|
17 | |
---|
18 | .. math:: |
---|
19 | |
---|
20 | I(q)=\frac{ \text{scale} }{V} \cdot \frac{(S_{ss}(q)+S_{ff}(q)+S_{fs}(q))} |
---|
21 | {(M \cdot m_f + N \cdot m_s)^2} + \text{bkg} |
---|
22 | |
---|
23 | where |
---|
24 | |
---|
25 | .. math:: |
---|
26 | |
---|
27 | S_{ss}(q) &= sm_s^2\psi^2(q)[\frac{N}{1-sin(qA)/qA}-\frac{N}{2}- |
---|
28 | \frac{1-(sin(qA)/qA)^N}{(1-sin(qA)/qA)^2}\cdot\frac{sin(qA)}{qA}] \\ |
---|
29 | S_{ff}(q) &= sm_r^2[M\{2\Lambda(q)-(\frac{sin(ql/2)}{ql/2})\}+ |
---|
30 | \frac{2M\beta^2(q)}{1-sin(qA)/qA}-2\beta^2(q)\cdot |
---|
31 | \frac{1-(sin(qA)/qA)^M}{(1-sin(qA)/qA)^2}] \\ |
---|
32 | S_{fs}(q) &= m_r \beta (q) \cdot m_s \psi (q) \cdot 4[ |
---|
33 | \frac{N-1}{1-sin(qA)/qA}-\frac{1-(sin(qA)/qA)^{N-1}}{(1-sin(qA)/qA)^2} |
---|
34 | \cdot \frac{sin(qA)}{qA}] \\ |
---|
35 | \psi(q) &= 3 \cdot \frac{sin(qR)-(qR)\cdot cos(qR)}{(qR)^3} \\ |
---|
36 | \Lambda(q) &= \frac{\int_0^{ql}\frac{sin(t)}{t}dt}{ql} \\ |
---|
37 | \beta(q) &= \frac{\int_{qR}^{q(A-R)}\frac{sin(t)}{t}dt}{ql} |
---|
38 | |
---|
39 | where the mass *m*\ :sub:`i` is (SLD\ :sub:`i` - SLD\ :sub:`solvent`) \* |
---|
40 | (volume of the *N* pearls/rods). *V* is the total volume of the necklace. |
---|
41 | |
---|
42 | The 2D scattering intensity is the same as $P(q)$ above, regardless of the |
---|
43 | orientation of the *q* vector. |
---|
44 | |
---|
45 | The returned value is scaled to units of |cm^-1| and the parameters of the |
---|
46 | pearl_necklace model are the following |
---|
47 | |
---|
48 | NB: *num_pearls* must be an integer. |
---|
49 | |
---|
50 | References |
---|
51 | ---------- |
---|
52 | |
---|
53 | R Schweins and K Huber, *Particle Scattering Factor of Pearl Necklace Chains*, |
---|
54 | *Macromol. Symp.* 211 (2004) 25-42 2004 |
---|
55 | """ |
---|
56 | |
---|
57 | import numpy as np |
---|
58 | from numpy import inf, pi |
---|
59 | |
---|
60 | name = "pearl_necklace" |
---|
61 | title = "Colloidal spheres chained together with no preferential orientation" |
---|
62 | description = """ |
---|
63 | Calculate form factor for Pearl Necklace Model |
---|
64 | [Macromol. Symp. 2004, 211, 25-42] |
---|
65 | Parameters: |
---|
66 | background:background |
---|
67 | scale: scale factor |
---|
68 | sld: the SLD of the pearl spheres |
---|
69 | sld_string: the SLD of the strings |
---|
70 | sld_solvent: the SLD of the solvent |
---|
71 | num_pearls: number of the pearls |
---|
72 | radius: the radius of a pearl |
---|
73 | edge_sep: the length of string segment; surface to surface |
---|
74 | thick_string: thickness (ie, diameter) of the string |
---|
75 | """ |
---|
76 | category = "shape:cylinder" |
---|
77 | |
---|
78 | # ["name", "units", default, [lower, upper], "type","description"], |
---|
79 | parameters = [["radius", "Ang", 80.0, [0, inf], "volume", |
---|
80 | "Mean radius of the chained spheres"], |
---|
81 | ["edge_sep", "Ang", 350.0, [0, inf], "volume", |
---|
82 | "Mean separation of chained particles"], |
---|
83 | ["thick_string", "Ang", 2.5, [0, inf], "volume", |
---|
84 | "Thickness of the chain linkage"], |
---|
85 | ["num_pearls", "none", 3, [1, inf], "volume", |
---|
86 | "Number of pearls in the necklace (must be integer)"], |
---|
87 | ["sld", "1e-6/Ang^2", 1.0, [-inf, inf], "sld", |
---|
88 | "Scattering length density of the chained spheres"], |
---|
89 | ["sld_string", "1e-6/Ang^2", 1.0, [-inf, inf], "sld", |
---|
90 | "Scattering length density of the chain linkage"], |
---|
91 | ["sld_solvent", "1e-6/Ang^2", 6.3, [-inf, inf], "sld", |
---|
92 | "Scattering length density of the solvent"], |
---|
93 | ] |
---|
94 | |
---|
95 | source = ["lib/sas_Si.c", "lib/sas_3j1x_x.c", "pearl_necklace.c"] |
---|
96 | single = False # use double precision unless told otherwise |
---|
97 | |
---|
98 | def volume(radius, edge_sep, thick_string, num_pearls): |
---|
99 | """ |
---|
100 | Calculates the total particle volume of the necklace. |
---|
101 | Redundant with form_volume. |
---|
102 | """ |
---|
103 | num_pearls = int(num_pearls + 0.5) |
---|
104 | number_of_strings = num_pearls - 1.0 |
---|
105 | string_vol = edge_sep * pi * pow((thick_string / 2.0), 2.0) |
---|
106 | pearl_vol = 4.0 /3.0 * pi * pow(radius, 3.0) |
---|
107 | total_vol = number_of_strings * string_vol |
---|
108 | total_vol += num_pearls * pearl_vol |
---|
109 | return total_vol |
---|
110 | |
---|
111 | def ER(radius, edge_sep, thick_string, num_pearls): |
---|
112 | """ |
---|
113 | Calculation for effective radius. |
---|
114 | """ |
---|
115 | num_pearls = int(num_pearls + 0.5) |
---|
116 | tot_vol = volume(radius, edge_sep, thick_string, num_pearls) |
---|
117 | rad_out = (tot_vol/(4.0/3.0*pi)) ** (1./3.) |
---|
118 | return rad_out |
---|
119 | |
---|
120 | def random(): |
---|
121 | radius = 10**np.random.uniform(1, 3) # 1 - 1000 |
---|
122 | thick_string = 10**np.random.uniform(0, np.log10(radius)-1) # 1 - radius/10 |
---|
123 | edge_sep = 10**np.random.uniform(0, 3) # 1 - 1000 |
---|
124 | num_pearls = np.round(10**np.random.uniform(0.3, 3)) # 2 - 1000 |
---|
125 | pars = dict( |
---|
126 | radius=radius, |
---|
127 | edge_sep=edge_sep, |
---|
128 | thick_string=thick_string, |
---|
129 | num_pearls=num_pearls, |
---|
130 | ) |
---|
131 | return pars |
---|
132 | |
---|
133 | # parameters for demo |
---|
134 | demo = dict(scale=1, background=0, radius=80.0, edge_sep=350.0, |
---|
135 | num_pearls=3, sld=1, sld_solvent=6.3, sld_string=1, |
---|
136 | thick_string=2.5, |
---|
137 | radius_pd=.2, radius_pd_n=5, |
---|
138 | edge_sep_pd=25.0, edge_sep_pd_n=5, |
---|
139 | num_pearls_pd=0, num_pearls_pd_n=0, |
---|
140 | thick_string_pd=0.2, thick_string_pd_n=5, |
---|
141 | ) |
---|
142 | # ER function is not being used here, not that it is likely very sensible to |
---|
143 | # include an S(Q) with this model, the default in sasview 5.0 would be to the |
---|
144 | # "unconstrained" radius_effective. |
---|
145 | #tests = [[{}, 0.001, 17380.245], [{}, 'ER', 115.39502]] |
---|
146 | tests = [[{}, 0.001, 17380.245]] |
---|