[66d119f] | 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 | |
---|
[5111921] | 23 | .. figure:: img/stacked_disks_geometry.png |
---|
[66d119f] | 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), |
---|
[e664a11] | 67 | *D* = 2*(*d*+*h*)the next neighbor center-to-center distance (d-spacing), |
---|
[66d119f] | 68 | and $\sigma_D$ = the Gaussian standard deviation of the d-spacing (sigma_d). |
---|
| 69 | |
---|
| 70 | .. note:: |
---|
[e664a11] | 71 | Each assmebly in the stack is layer/core/layer, so the spacing of the cores |
---|
| 72 | is core plus two layers. The 2nd virial coefficient of the cylinder is |
---|
| 73 | calculated based on the |
---|
[66d119f] | 74 | *radius* and *length* = *n_stacking* * (*core_thick* + 2 * *layer_thick*) |
---|
| 75 | values, and used as the effective radius for $S(Q)$ when $P(Q) * S(Q)$ |
---|
| 76 | is applied. |
---|
| 77 | |
---|
[2f0c07d] | 78 | To provide easy access to the orientation of the stacked disks, we define |
---|
| 79 | the axis of the cylinder using two angles $\theta$ and $\varphi$. |
---|
[66d119f] | 80 | |
---|
[2f0c07d] | 81 | .. figure:: img/stacked_disks_angle_definition.jpg |
---|
[66d119f] | 82 | |
---|
| 83 | Examples of the angles for oriented stacked disks against |
---|
| 84 | the detector plane. |
---|
| 85 | |
---|
[2f0c07d] | 86 | .. figure:: img/stacked_disks_angle_projection.jpg |
---|
[66d119f] | 87 | |
---|
| 88 | Examples of the angles for oriented pp against the detector plane. |
---|
| 89 | |
---|
| 90 | Our model uses the form factor calculations implemented in a c-library provided |
---|
| 91 | by the NIST Center for Neutron Research (Kline, 2006) |
---|
| 92 | |
---|
[e664a11] | 93 | References |
---|
| 94 | ---------- |
---|
[66d119f] | 95 | |
---|
| 96 | A Guinier and G Fournet, *Small-Angle Scattering of X-Rays*, John Wiley and Sons, New York, 1955 |
---|
| 97 | |
---|
| 98 | O Kratky and G Porod, *J. Colloid Science*, 4, (1949) 35 |
---|
| 99 | |
---|
| 100 | J S Higgins and H C Benoit, *Polymers and Neutron Scattering*, Clarendon, Oxford, 1994 |
---|
| 101 | |
---|
[53215cf] | 102 | **Author:** NIST IGOR/DANSE **on:** pre 2010 |
---|
| 103 | |
---|
| 104 | **Last Modified by:** Piotr Rozyczko **on:** February 18, 2016 |
---|
| 105 | |
---|
| 106 | **Last Reviewed by:** Richard Heenan **on:** March 22, 2016 |
---|
[66d119f] | 107 | """ |
---|
| 108 | |
---|
| 109 | from numpy import inf |
---|
| 110 | |
---|
| 111 | name = "stacked_disks" |
---|
| 112 | title = "" |
---|
| 113 | description = """\ |
---|
| 114 | One layer of disk consists of a core, a top layer, and a bottom layer. |
---|
| 115 | radius = the radius of the disk |
---|
| 116 | core_thick = thickness of the core |
---|
| 117 | layer_thick = thickness of a layer |
---|
[e664a11] | 118 | sld_core = the SLD of the core |
---|
| 119 | sld_layer = the SLD of the layers |
---|
[66d119f] | 120 | n_stacking = the number of the disks |
---|
| 121 | sigma_d = Gaussian STD of d-spacing |
---|
[e664a11] | 122 | sld_solvent = the SLD of the solvent |
---|
[66d119f] | 123 | """ |
---|
| 124 | category = "shape:cylinder" |
---|
| 125 | |
---|
| 126 | # pylint: disable=bad-whitespace, line-too-long |
---|
| 127 | # ["name", "units", default, [lower, upper], "type","description"], |
---|
| 128 | parameters = [ |
---|
| 129 | ["core_thick", "Ang", 10.0, [0, inf], "volume", "Thickness of the core disk"], |
---|
[e664a11] | 130 | ["layer_thick", "Ang", 10.0, [0, inf], "volume", "Thickness of layer each side of core"], |
---|
[66d119f] | 131 | ["radius", "Ang", 15.0, [0, inf], "volume", "Radius of the stacked disk"], |
---|
[e664a11] | 132 | ["n_stacking", "", 1.0, [0, inf], "volume", "Number of stacked layer/core/layer disks"], |
---|
[66d119f] | 133 | ["sigma_d", "Ang", 0, [0, inf], "", "GSD of disks sigma_d"], |
---|
[e664a11] | 134 | ["sld_core", "1e-6/Ang^2", 4, [-inf, inf], "", "Core scattering length density"], |
---|
| 135 | ["sld_layer", "1e-6/Ang^2", 0.0, [-inf, inf], "", "Layer scattering length density"], |
---|
| 136 | ["sld_solvent", "1e-6/Ang^2", 5.0, [-inf, inf], "", "Solvent scattering length density"], |
---|
[66d119f] | 137 | ["theta", "degrees", 0, [-inf, inf], "orientation", "Orientation of the stacked disk axis w/respect incoming beam"], |
---|
| 138 | ["phi", "degrees", 0, [-inf, inf], "orientation", "Orientation of the stacked disk in the plane of the detector"], |
---|
| 139 | ] |
---|
| 140 | # pylint: enable=bad-whitespace, line-too-long |
---|
| 141 | |
---|
[43b7eea] | 142 | source = ["lib/polevl.c", "lib/sas_J1.c", "lib/gauss76.c", "stacked_disks.c"] |
---|
[66d119f] | 143 | |
---|
| 144 | demo = dict(background=0.001, |
---|
| 145 | scale=0.01, |
---|
| 146 | core_thick=10.0, |
---|
| 147 | layer_thick=10.0, |
---|
| 148 | radius=15.0, |
---|
| 149 | n_stacking=1, |
---|
| 150 | sigma_d=0, |
---|
[e664a11] | 151 | sld_core=4, |
---|
| 152 | sld_layer=0.0, |
---|
| 153 | sld_solvent=5.0, |
---|
[66d119f] | 154 | theta=0, |
---|
| 155 | phi=0) |
---|
| 156 | |
---|
| 157 | tests = [ |
---|
[53215cf] | 158 | # Accuracy tests based on content in test/utest_extra_models.py. |
---|
| 159 | # Added 2 tests with n_stacked = 5 using SasView 3.1.2 - PDB |
---|
[66d119f] | 160 | [{'core_thick': 10.0, |
---|
| 161 | 'layer_thick': 15.0, |
---|
| 162 | 'radius': 3000.0, |
---|
| 163 | 'n_stacking': 1.0, |
---|
| 164 | 'sigma_d': 0.0, |
---|
[e664a11] | 165 | 'sld_core': 4.0, |
---|
| 166 | 'sld_layer': -0.4, |
---|
[d507c3a] | 167 | 'solvent_sd': 5.0, |
---|
| 168 | 'theta': 0.0, |
---|
| 169 | 'phi': 0.0, |
---|
| 170 | 'scale': 0.01, |
---|
| 171 | 'background': 0.001, |
---|
[66d119f] | 172 | }, 0.001, 5075.12], |
---|
| 173 | |
---|
| 174 | [{'core_thick': 10.0, |
---|
| 175 | 'layer_thick': 15.0, |
---|
| 176 | 'radius': 3000.0, |
---|
[53215cf] | 177 | 'n_stacking': 5.0, |
---|
| 178 | 'sigma_d': 0.0, |
---|
| 179 | 'sld_core': 4.0, |
---|
| 180 | 'sld_layer': -0.4, |
---|
| 181 | 'solvent_sd': 5.0, |
---|
| 182 | 'theta': 0.0, |
---|
| 183 | 'phi': 0.0, |
---|
| 184 | 'scale': 0.01, |
---|
| 185 | 'background': 0.001, |
---|
| 186 | }, 0.001, 5065.12793824], |
---|
| 187 | |
---|
| 188 | [{'core_thick': 10.0, |
---|
| 189 | 'layer_thick': 15.0, |
---|
| 190 | 'radius': 3000.0, |
---|
| 191 | 'n_stacking': 5.0, |
---|
| 192 | 'sigma_d': 0.0, |
---|
| 193 | 'sld_core': 4.0, |
---|
| 194 | 'sld_layer': -0.4, |
---|
| 195 | 'solvent_sd': 5.0, |
---|
| 196 | 'theta': 0.0, |
---|
| 197 | 'phi': 0.0, |
---|
| 198 | 'scale': 0.01, |
---|
| 199 | 'background': 0.001, |
---|
| 200 | }, 0.164, 0.0127673597265], |
---|
| 201 | |
---|
| 202 | [{'core_thick': 10.0, |
---|
| 203 | 'layer_thick': 15.0, |
---|
| 204 | 'radius': 3000.0, |
---|
[66d119f] | 205 | 'n_stacking': 1.0, |
---|
| 206 | 'sigma_d': 0.0, |
---|
[e664a11] | 207 | 'sld_core': 4.0, |
---|
| 208 | 'sld_layer': -0.4, |
---|
[d507c3a] | 209 | 'solvent_sd': 5.0, |
---|
| 210 | 'theta': 0.0, |
---|
| 211 | 'phi': 0.0, |
---|
| 212 | 'scale': 0.01, |
---|
| 213 | 'background': 0.001, |
---|
[66d119f] | 214 | }, [0.001, 90.0], [5075.12, 0.001]], |
---|
| 215 | |
---|
| 216 | [{'core_thick': 10.0, |
---|
| 217 | 'layer_thick': 15.0, |
---|
| 218 | 'radius': 3000.0, |
---|
| 219 | 'n_stacking': 1.0, |
---|
| 220 | 'sigma_d': 0.0, |
---|
[e664a11] | 221 | 'sld_core': 4.0, |
---|
| 222 | 'sld_layer': -0.4, |
---|
[d507c3a] | 223 | 'solvent_sd': 5.0, |
---|
| 224 | 'theta': 0.0, |
---|
| 225 | 'phi': 0.0, |
---|
| 226 | 'scale': 0.01, |
---|
| 227 | 'background': 0.001, |
---|
[66d119f] | 228 | }, ([0.4, 0.5]), [0.00105074, 0.00121761]], |
---|
| 229 | |
---|
| 230 | [{'core_thick': 10.0, |
---|
| 231 | 'layer_thick': 15.0, |
---|
| 232 | 'radius': 3000.0, |
---|
| 233 | 'n_stacking': 1.0, |
---|
| 234 | 'sigma_d': 0.0, |
---|
[e664a11] | 235 | 'sld_core': 4.0, |
---|
| 236 | 'sld_layer': -0.4, |
---|
[d507c3a] | 237 | 'solvent_sd': 5.0, |
---|
| 238 | 'theta': 0.0, |
---|
| 239 | 'phi': 0.0, |
---|
| 240 | 'scale': 0.01, |
---|
| 241 | 'background': 0.001, |
---|
[66d119f] | 242 | }, ([1.3, 1.57]), [0.0010039, 0.0010038]], |
---|
| 243 | ] |
---|
[e664a11] | 244 | # 21Mar2016 RKH notes that unit tests all have n_stacking=1, ought to test other values |
---|
[66d119f] | 245 | |
---|