1 | r""" |
---|
2 | This model provides the form factor, $P(q)$, for stacked discs (tactoids) |
---|
3 | with a core/layer structure where the form factor is normalized by the volume |
---|
4 | of the cylinder. Assuming the next neighbor distance (d-spacing) in a stack |
---|
5 | of parallel discs obeys a Gaussian distribution, a structure factor $S(q)$ |
---|
6 | proposed by Kratky and Porod in 1949 is used in this function. |
---|
7 | |
---|
8 | Note that the resolution smearing calculation uses 76 Gauss quadrature points |
---|
9 | to properly smear the model since the function is HIGHLY oscillatory, |
---|
10 | especially around the q-values that correspond to the repeat distance of |
---|
11 | the layers. |
---|
12 | |
---|
13 | The 2D scattering intensity is the same as 1D, regardless of the orientation |
---|
14 | of the q vector which is defined as |
---|
15 | |
---|
16 | .. math:: |
---|
17 | |
---|
18 | q = \sqrt{q_x^2 + q_y^2} |
---|
19 | |
---|
20 | Definition |
---|
21 | ---------- |
---|
22 | |
---|
23 | .. figure:: img/stacked_disks_fig1.gif |
---|
24 | |
---|
25 | The scattered intensity $I(q)$ is calculated as |
---|
26 | |
---|
27 | .. math:: |
---|
28 | |
---|
29 | I(q) = N\int_{0}^{\pi /2}\left[ \Delta \rho_t |
---|
30 | \left( V_tf_t(q) - V_cf_c(q)\right) + \Delta \rho_cV_cf_c(q) |
---|
31 | \right]^2S(q)\sin{\alpha d\alpha} + background |
---|
32 | |
---|
33 | where the contrast |
---|
34 | |
---|
35 | .. math:: |
---|
36 | |
---|
37 | \Delta \rho_i = \rho_i - \rho_{solvent} |
---|
38 | |
---|
39 | and *N* is the number of discs per unit volume, |
---|
40 | $\alpha$ is the angle between the axis of the disc and *q*, |
---|
41 | and $V_t$ and $V_c$ are the total volume and the core volume of |
---|
42 | a single disc, respectively. |
---|
43 | |
---|
44 | .. math:: |
---|
45 | |
---|
46 | \left\langle f_{t}^2(q)\right\rangle_{\alpha} = |
---|
47 | \int_{0}^{\pi/2}\left[ |
---|
48 | \left(\frac{sin(q(d+h)\cos{\alpha})}{q(d+h)\cos{\alpha}}\right) |
---|
49 | \left(\frac{2J_1(qR\sin{\alpha})}{qR\sin{\alpha}} \right) |
---|
50 | \right]^2 \sin{\alpha d\alpha} |
---|
51 | |
---|
52 | \left\langle f_{c}^2(q)\right\rangle_{\alpha} = |
---|
53 | \int_{0}^{\pi/2}\left[ |
---|
54 | \left(\frac{sin(qh)\cos{\alpha})}{qh\cos{\alpha}}\right) |
---|
55 | \left(\frac{2J_1(qR\sin{\alpha})}{qR\sin{\alpha}} \right) |
---|
56 | \right]^2 \sin{\alpha d\alpha} |
---|
57 | |
---|
58 | where *d* = thickness of the layer (layer_thick), |
---|
59 | *2h* = core thickness (core_thick), and *R* = radius of the disc (radius). |
---|
60 | |
---|
61 | .. math:: |
---|
62 | |
---|
63 | S(q) = 1 + \frac{1}{2}\sum_{k=1}^n(n-k)\cos{(kDq\cos{\alpha})} |
---|
64 | exp\left[ -k(q\cos{\alpha})^2\sigma_D/2\right] |
---|
65 | |
---|
66 | where *n* = the total number of the disc stacked (n_stacking), |
---|
67 | *D* = the next neighbor center-to-center distance (d-spacing), |
---|
68 | and $\sigma_D$ = the Gaussian standard deviation of the d-spacing (sigma_d). |
---|
69 | |
---|
70 | To provide easy access to the orientation of the stacked disks, we define |
---|
71 | the axis of the cylinder using two angles $\theta$ and $\varphi$. |
---|
72 | These angles are defined on Figure 2 of cylinder_model. |
---|
73 | |
---|
74 | .. note:: |
---|
75 | The 2nd virial coefficient of the cylinder is calculated based on the |
---|
76 | *radius* and *length* = *n_stacking* * (*core_thick* + 2 * *layer_thick*) |
---|
77 | values, and used as the effective radius for $S(Q)$ when $P(Q) * S(Q)$ |
---|
78 | is applied. |
---|
79 | |
---|
80 | .. figure:: img/stacked_disks_1d.jpg |
---|
81 | |
---|
82 | 1D plot using the default values (w/1000 data point). |
---|
83 | |
---|
84 | .. figure:: img/stacked_disks_fig2.jpg |
---|
85 | |
---|
86 | Examples of the angles for oriented stacked disks against |
---|
87 | the detector plane. |
---|
88 | |
---|
89 | .. figure:: img/stacked_disks_fig3.jpg |
---|
90 | |
---|
91 | Examples of the angles for oriented pp against the detector plane. |
---|
92 | |
---|
93 | Our model uses the form factor calculations implemented in a c-library provided |
---|
94 | by the NIST Center for Neutron Research (Kline, 2006) |
---|
95 | |
---|
96 | Reference |
---|
97 | --------- |
---|
98 | |
---|
99 | A Guinier and G Fournet, *Small-Angle Scattering of X-Rays*, John Wiley and Sons, New York, 1955 |
---|
100 | |
---|
101 | O Kratky and G Porod, *J. Colloid Science*, 4, (1949) 35 |
---|
102 | |
---|
103 | J S Higgins and H C Benoit, *Polymers and Neutron Scattering*, Clarendon, Oxford, 1994 |
---|
104 | |
---|
105 | """ |
---|
106 | |
---|
107 | from numpy import inf |
---|
108 | |
---|
109 | name = "stacked_disks" |
---|
110 | title = "" |
---|
111 | description = """\ |
---|
112 | One layer of disk consists of a core, a top layer, and a bottom layer. |
---|
113 | radius = the radius of the disk |
---|
114 | core_thick = thickness of the core |
---|
115 | layer_thick = thickness of a layer |
---|
116 | core_sld = the SLD of the core |
---|
117 | layer_sld = the SLD of the layers |
---|
118 | n_stacking = the number of the disks |
---|
119 | sigma_d = Gaussian STD of d-spacing |
---|
120 | solvent_sld = the SLD of the solvent |
---|
121 | """ |
---|
122 | category = "shape:cylinder" |
---|
123 | |
---|
124 | # pylint: disable=bad-whitespace, line-too-long |
---|
125 | # ["name", "units", default, [lower, upper], "type","description"], |
---|
126 | parameters = [ |
---|
127 | ["core_thick", "Ang", 10.0, [0, inf], "volume", "Thickness of the core disk"], |
---|
128 | ["layer_thick", "Ang", 10.0, [0, inf], "volume", "Thickness of the stacked disk"], |
---|
129 | ["radius", "Ang", 15.0, [0, inf], "volume", "Radius of the stacked disk"], |
---|
130 | ["n_stacking", "", 1.0, [0, inf], "volume", "Number of stacking"], |
---|
131 | ["sigma_d", "Ang", 0, [0, inf], "", "GSD of disks sigma_d"], |
---|
132 | ["core_sld", "1e-6/Ang^2", 4, [-inf, inf], "", "Core scattering length density"], |
---|
133 | ["layer_sld", "1e-6/Ang^2", 0.0, [-inf, inf], "", "Layer scattering length density"], |
---|
134 | ["solvent_sld", "1e-6/Ang^2", 5.0, [-inf, inf], "", "Solvent scattering length density"], |
---|
135 | ["theta", "degrees", 0, [-inf, inf], "orientation", "Orientation of the stacked disk axis w/respect incoming beam"], |
---|
136 | ["phi", "degrees", 0, [-inf, inf], "orientation", "Orientation of the stacked disk in the plane of the detector"], |
---|
137 | ] |
---|
138 | # pylint: enable=bad-whitespace, line-too-long |
---|
139 | |
---|
140 | source = ["lib/gauss76.c", "lib/J1.c", "stacked_disks.c"] |
---|
141 | |
---|
142 | demo = dict(background=0.001, |
---|
143 | scale=0.01, |
---|
144 | core_thick=10.0, |
---|
145 | layer_thick=10.0, |
---|
146 | radius=15.0, |
---|
147 | n_stacking=1, |
---|
148 | sigma_d=0, |
---|
149 | core_sld=4, |
---|
150 | layer_sld=0.0, |
---|
151 | solvent_sld=5.0, |
---|
152 | theta=0, |
---|
153 | phi=0) |
---|
154 | |
---|
155 | |
---|
156 | oldname = 'StackedDisksModel' |
---|
157 | |
---|
158 | oldpars = dict(theta='axis_theta', |
---|
159 | phi='axis_phi') |
---|
160 | |
---|
161 | tests = [ |
---|
162 | # Accuracy tests based on content in test/utest_extra_models.py |
---|
163 | [{'core_thick': 10.0, |
---|
164 | 'layer_thick': 15.0, |
---|
165 | 'radius': 3000.0, |
---|
166 | 'n_stacking': 1.0, |
---|
167 | 'sigma_d': 0.0, |
---|
168 | 'core_sld': 4.0, |
---|
169 | 'layer_sld': -0.4, |
---|
170 | 'solvent_sd': 5.0, |
---|
171 | 'theta': 0.0, |
---|
172 | 'phi': 0.0, |
---|
173 | 'scale': 0.01, |
---|
174 | 'background': 0.001, |
---|
175 | }, 0.001, 5075.12], |
---|
176 | |
---|
177 | [{'core_thick': 10.0, |
---|
178 | 'layer_thick': 15.0, |
---|
179 | 'radius': 3000.0, |
---|
180 | 'n_stacking': 1.0, |
---|
181 | 'sigma_d': 0.0, |
---|
182 | 'core_sld': 4.0, |
---|
183 | 'layer_sld': -0.4, |
---|
184 | 'solvent_sd': 5.0, |
---|
185 | 'theta': 0.0, |
---|
186 | 'phi': 0.0, |
---|
187 | 'scale': 0.01, |
---|
188 | 'background': 0.001, |
---|
189 | }, [0.001, 90.0], [5075.12, 0.001]], |
---|
190 | |
---|
191 | [{'core_thick': 10.0, |
---|
192 | 'layer_thick': 15.0, |
---|
193 | 'radius': 3000.0, |
---|
194 | 'n_stacking': 1.0, |
---|
195 | 'sigma_d': 0.0, |
---|
196 | 'core_sld': 4.0, |
---|
197 | 'layer_sld': -0.4, |
---|
198 | 'solvent_sd': 5.0, |
---|
199 | 'theta': 0.0, |
---|
200 | 'phi': 0.0, |
---|
201 | 'scale': 0.01, |
---|
202 | 'background': 0.001, |
---|
203 | }, ([0.4, 0.5]), [0.00105074, 0.00121761]], |
---|
204 | |
---|
205 | [{'core_thick': 10.0, |
---|
206 | 'layer_thick': 15.0, |
---|
207 | 'radius': 3000.0, |
---|
208 | 'n_stacking': 1.0, |
---|
209 | 'sigma_d': 0.0, |
---|
210 | 'core_sld': 4.0, |
---|
211 | 'layer_sld': -0.4, |
---|
212 | 'solvent_sd': 5.0, |
---|
213 | 'theta': 0.0, |
---|
214 | 'phi': 0.0, |
---|
215 | 'scale': 0.01, |
---|
216 | 'background': 0.001, |
---|
217 | }, ([1.3, 1.57]), [0.0010039, 0.0010038]], |
---|
218 | ] |
---|
219 | |
---|
220 | |
---|