[f7930be] | 1 | r""" |
---|
| 2 | Definition |
---|
| 3 | ---------- |
---|
| 4 | |
---|
| 5 | This model is a trivial extension of the CoreShell function to a larger number |
---|
[40a87fa] | 6 | of shells. The scattering length density profile for the default sld values |
---|
[f7930be] | 7 | (w/ 4 shells). |
---|
| 8 | |
---|
| 9 | .. figure:: img/core_multi_shell_sld_default_profile.jpg |
---|
| 10 | |
---|
| 11 | SLD profile of the core_multi_shell object from the center of sphere out |
---|
| 12 | for the default SLDs.* |
---|
| 13 | |
---|
[263daec] | 14 | The 2D scattering intensity is the same as $P(q)$ above, regardless of the |
---|
[2d73a53] | 15 | orientation of the $\vec q$ vector which is defined as |
---|
[f7930be] | 16 | |
---|
| 17 | .. math:: |
---|
| 18 | |
---|
| 19 | q = \sqrt{q_x^2 + q_y^2} |
---|
| 20 | |
---|
| 21 | .. note:: **Be careful!** The SLDs and scale can be highly correlated. Hold as |
---|
| 22 | many of these parameters fixed as possible. |
---|
| 23 | |
---|
| 24 | .. note:: The outer most radius (= *radius* + *thickness*) is used as the |
---|
[263daec] | 25 | effective radius for $S(Q)$ when $P(Q)*S(Q)$ is applied. |
---|
[f7930be] | 26 | |
---|
[40a87fa] | 27 | For information about polarised and magnetic scattering, see |
---|
[9a4811a] | 28 | the :ref:`magnetism` documentation. |
---|
[f7930be] | 29 | |
---|
| 30 | Our model uses the form factor calculations implemented in a c-library provided |
---|
[2d73a53] | 31 | by the NIST Center for Neutron Research (Kline, 2006) [#kline]_. |
---|
[f7930be] | 32 | |
---|
| 33 | References |
---|
| 34 | ---------- |
---|
| 35 | |
---|
[b0c4271] | 36 | .. [#] See the :ref:`core-shell-sphere` model documentation. |
---|
[2d73a53] | 37 | .. [#kline] S R Kline, *J Appl. Cryst.*, 39 (2006) 895 |
---|
| 38 | .. [#] L A Feigin and D I Svergun, *Structure Analysis by Small-Angle X-Ray and |
---|
| 39 | Neutron Scattering*, Plenum Press, New York, 1987. |
---|
[f7930be] | 40 | |
---|
[b0c4271] | 41 | Authorship and Verification |
---|
| 42 | ---------------------------- |
---|
[f7930be] | 43 | |
---|
[b0c4271] | 44 | * **Author:** NIST IGOR/DANSE **Date:** pre 2010 |
---|
| 45 | * **Last Modified by:** Paul Kienzle **Date:** September 12, 2016 |
---|
[2d73a53] | 46 | * **Last Reviewed by:** Paul Kienzle **Date:** September 12, 2016 |
---|
[f7930be] | 47 | """ |
---|
| 48 | from __future__ import division |
---|
| 49 | |
---|
| 50 | import numpy as np |
---|
[40a87fa] | 51 | from numpy import inf |
---|
[f7930be] | 52 | |
---|
| 53 | name = "core_multi_shell" |
---|
| 54 | title = "This model provides the scattering from a spherical core with 1 to 4 \ |
---|
| 55 | concentric shell structures. The SLDs of the core and each shell are \ |
---|
| 56 | individually specified." |
---|
| 57 | |
---|
| 58 | description = """\ |
---|
| 59 | Form factor for a core muti-shell (up to 4) sphere normalized by the volume. |
---|
| 60 | Each shell can have a unique thickness and sld. |
---|
| 61 | |
---|
| 62 | background:background, |
---|
| 63 | rad_core0: radius of sphere(core) |
---|
| 64 | thick_shell#:the thickness of the shell# |
---|
| 65 | sld_core0: the SLD of the sphere |
---|
| 66 | sld_solv: the SLD of the solvent |
---|
| 67 | sld_shell: the SLD of the shell# |
---|
| 68 | A_shell#: the coefficient in the exponential function |
---|
[a151caa] | 69 | |
---|
| 70 | |
---|
[f7930be] | 71 | scale: 1.0 if data is on absolute scale |
---|
| 72 | volfraction: volume fraction of spheres |
---|
| 73 | radius: the radius of the core |
---|
| 74 | sld: the SLD of the core |
---|
| 75 | thick_shelli: the thickness of the i'th shell from the core |
---|
| 76 | sld_shelli: the SLD of the i'th shell from the core |
---|
| 77 | sld_solvent: the SLD of the solvent |
---|
| 78 | background: incoherent background |
---|
| 79 | |
---|
| 80 | """ |
---|
| 81 | |
---|
| 82 | category = "shape:sphere" |
---|
| 83 | |
---|
| 84 | |
---|
| 85 | # ["name", "units", default, [lower, upper], "type","description"], |
---|
[42356c8] | 86 | parameters = [["sld_core", "1e-6/Ang^2", 1.0, [-inf, inf], "sld", |
---|
[f7930be] | 87 | "Core scattering length density"], |
---|
[6f0e04f] | 88 | ["radius", "Ang", 200., [0, inf], "volume", |
---|
[f7930be] | 89 | "Radius of the core"], |
---|
[42356c8] | 90 | ["sld_solvent", "1e-6/Ang^2", 6.4, [-inf, inf], "sld", |
---|
[f7930be] | 91 | "Solvent scattering length density"], |
---|
[c5ac2b2] | 92 | ["n", "", 1, [0, 10], "volume", |
---|
[f7930be] | 93 | "number of shells"], |
---|
[42356c8] | 94 | ["sld[n]", "1e-6/Ang^2", 1.7, [-inf, inf], "sld", |
---|
[f7930be] | 95 | "scattering length density of shell k"], |
---|
[6f0e04f] | 96 | ["thickness[n]", "Ang", 40., [0, inf], "volume", |
---|
[f7930be] | 97 | "Thickness of shell k"], |
---|
[40a87fa] | 98 | ] |
---|
[f7930be] | 99 | |
---|
[925ad6e] | 100 | source = ["lib/sas_3j1x_x.c", "core_multi_shell.c"] |
---|
[71b751d] | 101 | have_Fq = True |
---|
[d277229] | 102 | effective_radius_type = ["outer radius", "core radius"] |
---|
[f7930be] | 103 | |
---|
[a151caa] | 104 | def random(): |
---|
[b297ba9] | 105 | """Return a random parameter set for the model.""" |
---|
[a151caa] | 106 | num_shells = np.minimum(np.random.poisson(3)+1, 10) |
---|
| 107 | total_radius = 10**np.random.uniform(1.7, 4) |
---|
| 108 | thickness = np.random.exponential(size=num_shells+1) |
---|
| 109 | thickness *= total_radius/np.sum(thickness) |
---|
| 110 | pars = dict( |
---|
| 111 | #background=0, |
---|
| 112 | n=num_shells, |
---|
| 113 | radius=thickness[0], |
---|
| 114 | ) |
---|
| 115 | for k, v in enumerate(thickness[1:]): |
---|
| 116 | pars['thickness%d'%(k+1)] = v |
---|
| 117 | return pars |
---|
| 118 | |
---|
[c5ac2b2] | 119 | def profile(sld_core, radius, sld_solvent, n, sld, thickness): |
---|
[f7930be] | 120 | """ |
---|
[e187b25] | 121 | Returns the SLD profile *r* (Ang), and *rho* (1e-6/Ang^2). |
---|
[f7930be] | 122 | """ |
---|
[21fbab1] | 123 | n = int(n+0.5) |
---|
[40a87fa] | 124 | z = [] |
---|
[e187b25] | 125 | rho = [] |
---|
[f7930be] | 126 | |
---|
| 127 | # add in the core |
---|
[40a87fa] | 128 | z.append(0) |
---|
[e187b25] | 129 | rho.append(sld_core) |
---|
[40a87fa] | 130 | z.append(radius) |
---|
[e187b25] | 131 | rho.append(sld_core) |
---|
[f7930be] | 132 | |
---|
| 133 | # add in the shells |
---|
[8c6fbbc] | 134 | for k in range(int(n)): |
---|
[f7930be] | 135 | # Left side of each shells |
---|
[40a87fa] | 136 | z.append(z[-1]) |
---|
[e187b25] | 137 | rho.append(sld[k]) |
---|
[40a87fa] | 138 | z.append(z[-1] + thickness[k]) |
---|
[e187b25] | 139 | rho.append(sld[k]) |
---|
[c5ac2b2] | 140 | # add in the solvent |
---|
[40a87fa] | 141 | z.append(z[-1]) |
---|
[e187b25] | 142 | rho.append(sld_solvent) |
---|
[40a87fa] | 143 | z.append(z[-1]*1.25) |
---|
[e187b25] | 144 | rho.append(sld_solvent) |
---|
[f7930be] | 145 | |
---|
[40a87fa] | 146 | return np.asarray(z), np.asarray(rho) |
---|
[f7930be] | 147 | |
---|
[40a87fa] | 148 | demo = dict(sld_core=6.4, |
---|
| 149 | radius=60, |
---|
| 150 | sld_solvent=6.4, |
---|
| 151 | n=2, |
---|
| 152 | sld=[2.0, 3.0], |
---|
| 153 | thickness=20, |
---|
| 154 | thickness1_pd=0.3, |
---|
| 155 | thickness2_pd=0.3, |
---|
| 156 | thickness1_pd_n=10, |
---|
| 157 | thickness2_pd_n=10, |
---|
[2d81cfe] | 158 | ) |
---|