[f7930be] | 1 | r""" |
---|
| 2 | Definition |
---|
| 3 | ---------- |
---|
| 4 | |
---|
| 5 | This model is a trivial extension of the CoreShell function to a larger number |
---|
| 6 | of shells. The scattering length density profile for the default sld values |
---|
| 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 | |
---|
| 14 | The 2D scattering intensity is the same as *P(q)* above, regardless of the |
---|
| 15 | orientation of the *q* vector which is defined as |
---|
| 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 |
---|
| 25 | effective radius for *S(Q)* when *P(Q)* \* *S(Q)* is applied. |
---|
| 26 | |
---|
[34edbb8] | 27 | For information about polarised and magnetic scattering, see |
---|
[b274bec] | 28 | the :doc:`magnetic help <../sasgui/perspectives/fitting/mag_help>` documentation. |
---|
[f7930be] | 29 | |
---|
| 30 | Our model uses the form factor calculations implemented in a c-library provided |
---|
| 31 | by the NIST Center for Neutron Research (Kline, 2006). |
---|
| 32 | |
---|
| 33 | References |
---|
| 34 | ---------- |
---|
[34edbb8] | 35 | See the :ref:`core_shell_sphere <core_shell_sphere>` model documentation. |
---|
[f7930be] | 36 | |
---|
| 37 | L A Feigin and D I Svergun, |
---|
| 38 | *Structure Analysis by Small-Angle X-Ray and Neutron Scattering*, |
---|
| 39 | Plenum Press, New York, 1987. |
---|
| 40 | |
---|
| 41 | **Author:** NIST IGOR/DANSE **on:** pre 2010 |
---|
| 42 | |
---|
| 43 | **Last Modified by:** in progress **on:** March 20, 2016 |
---|
| 44 | |
---|
| 45 | **Last Reviewed by:** in progress **on:** March 20, 2016 |
---|
| 46 | """ |
---|
| 47 | |
---|
| 48 | |
---|
| 49 | |
---|
| 50 | from __future__ import division |
---|
| 51 | |
---|
| 52 | import numpy as np |
---|
| 53 | from numpy import inf, nan |
---|
| 54 | from math import fabs, exp, expm1 |
---|
| 55 | |
---|
| 56 | name = "core_multi_shell" |
---|
| 57 | title = "This model provides the scattering from a spherical core with 1 to 4 \ |
---|
| 58 | concentric shell structures. The SLDs of the core and each shell are \ |
---|
| 59 | individually specified." |
---|
| 60 | |
---|
| 61 | description = """\ |
---|
| 62 | Form factor for a core muti-shell (up to 4) sphere normalized by the volume. |
---|
| 63 | Each shell can have a unique thickness and sld. |
---|
| 64 | |
---|
| 65 | background:background, |
---|
| 66 | rad_core0: radius of sphere(core) |
---|
| 67 | thick_shell#:the thickness of the shell# |
---|
| 68 | sld_core0: the SLD of the sphere |
---|
| 69 | sld_solv: the SLD of the solvent |
---|
| 70 | sld_shell: the SLD of the shell# |
---|
| 71 | A_shell#: the coefficient in the exponential function |
---|
| 72 | |
---|
| 73 | |
---|
| 74 | scale: 1.0 if data is on absolute scale |
---|
| 75 | volfraction: volume fraction of spheres |
---|
| 76 | radius: the radius of the core |
---|
| 77 | sld: the SLD of the core |
---|
| 78 | thick_shelli: the thickness of the i'th shell from the core |
---|
| 79 | sld_shelli: the SLD of the i'th shell from the core |
---|
| 80 | sld_solvent: the SLD of the solvent |
---|
| 81 | background: incoherent background |
---|
| 82 | |
---|
| 83 | """ |
---|
| 84 | |
---|
| 85 | category = "shape:sphere" |
---|
| 86 | |
---|
| 87 | |
---|
| 88 | # ["name", "units", default, [lower, upper], "type","description"], |
---|
| 89 | parameters = [["volfraction", "", 0.05, [0,1],"", |
---|
| 90 | "volume fraction of spheres"], |
---|
[6f0e04f] | 91 | ["sld_core", "1e-6/Ang^2", 1.0, [-inf, inf], "", |
---|
[f7930be] | 92 | "Core scattering length density"], |
---|
[6f0e04f] | 93 | ["radius", "Ang", 200., [0, inf], "volume", |
---|
[f7930be] | 94 | "Radius of the core"], |
---|
| 95 | ["sld_solvent", "1e-6/Ang^2", 6.4, [-inf, inf], "", |
---|
| 96 | "Solvent scattering length density"], |
---|
| 97 | ["n", "", 1, [0, 10], "volume", |
---|
| 98 | "number of shells"], |
---|
[6f0e04f] | 99 | ["sld[n]", "1e-6/Ang^2", 1.7, [-inf, inf], "", |
---|
[f7930be] | 100 | "scattering length density of shell k"], |
---|
[6f0e04f] | 101 | ["thickness[n]", "Ang", 40., [0, inf], "volume", |
---|
[f7930be] | 102 | "Thickness of shell k"], |
---|
| 103 | ] |
---|
| 104 | |
---|
| 105 | #source = ["lib/sph_j1c.c", "onion.c"] |
---|
| 106 | |
---|
| 107 | def Iq(q, *args, **kw): |
---|
| 108 | return q |
---|
| 109 | |
---|
| 110 | def Iqxy(qx, *args, **kw): |
---|
| 111 | return qx |
---|
| 112 | |
---|
| 113 | |
---|
[6f0e04f] | 114 | def profile(volfraction, sld_core, radius, sld_solvent, n, sld, thickness): |
---|
[f7930be] | 115 | """ |
---|
| 116 | SLD profile |
---|
| 117 | |
---|
| 118 | :return: (r, beta) where r is a list of radius of the transition points\ |
---|
| 119 | and beta is a list of the corresponding SLD values. |
---|
| 120 | |
---|
| 121 | """ |
---|
| 122 | # r = [] |
---|
| 123 | # beta = [] |
---|
| 124 | # # for core at r=0 |
---|
| 125 | # r.append(0) |
---|
| 126 | # beta.append(self.params['sld_core0']) |
---|
| 127 | # # for core at r=rad_core |
---|
| 128 | # r.append(self.params['rad_core0']) |
---|
| 129 | # beta.append(self.params['sld_core0']) |
---|
| 130 | # |
---|
| 131 | # # for shells |
---|
| 132 | # for n in range(1, self.n_shells+1): |
---|
| 133 | # # Left side of each shells |
---|
| 134 | # r0 = r[len(r)-1] |
---|
| 135 | # r.append(r0) |
---|
| 136 | # exec "beta.append(self.params['sld_shell%s'% str(n)])" |
---|
| 137 | # |
---|
| 138 | # # Right side of each shells |
---|
| 139 | # exec "r0 += self.params['thick_shell%s'% str(n)]" |
---|
| 140 | # r.append(r0) |
---|
| 141 | # exec "beta.append(self.params['sld_shell%s'% str(n)])" |
---|
| 142 | # |
---|
| 143 | # # for solvent |
---|
| 144 | # r0 = r[len(r)-1] |
---|
| 145 | # r.append(r0) |
---|
| 146 | # beta.append(self.params['sld_solv']) |
---|
| 147 | # r_solv = 5*r0/4 |
---|
| 148 | # r.append(r_solv) |
---|
| 149 | # beta.append(self.params['sld_solv']) |
---|
| 150 | # |
---|
| 151 | # return r, beta |
---|
| 152 | # above is directly from old code -- below is alotered from Woitek's first |
---|
| 153 | # cut an the onion. Seems like we should be consistant? |
---|
| 154 | |
---|
[6f0e04f] | 155 | total_radius = 1.25*(sum(thickness[:n]) + radius + 1) |
---|
[f7930be] | 156 | |
---|
| 157 | r = [] |
---|
| 158 | beta = [] |
---|
| 159 | |
---|
| 160 | # add in the core |
---|
| 161 | r.append(0) |
---|
| 162 | beta.append(sld) |
---|
| 163 | r.append(radius) |
---|
| 164 | beta.append(sld) |
---|
| 165 | |
---|
| 166 | # add in the shells |
---|
| 167 | for k in range(n): |
---|
| 168 | # Left side of each shells |
---|
| 169 | r0 = r[-1] |
---|
| 170 | r.append(r0) |
---|
[6f0e04f] | 171 | beta.append(sld[k]) |
---|
[f7930be] | 172 | r.append(r0 + thickness[k]) |
---|
[6f0e04f] | 173 | beta.append(sld[k]) |
---|
[f7930be] | 174 | # add in the solvent |
---|
| 175 | r.append(r[-1]) |
---|
[6f0e04f] | 176 | beta.append(sld_solvent) |
---|
[f7930be] | 177 | r.append(total_radius) |
---|
[6f0e04f] | 178 | beta.append(sld_solvent) |
---|
[f7930be] | 179 | |
---|
| 180 | return np.asarray(r), np.asarray(beta) |
---|
| 181 | |
---|
[6f0e04f] | 182 | def ER(radius, n, thickness): |
---|
| 183 | n = n[0] # n cannot be polydisperse |
---|
| 184 | return np.sum(thickness[:n], axis=0) + radius |
---|
[f7930be] | 185 | |
---|
| 186 | def VR(radius, n, thick_shell): |
---|
[6f0e04f] | 187 | return 1.0, 1.0 |
---|
[f7930be] | 188 | |
---|
| 189 | demo = dict(volfraction = 1.0, |
---|
| 190 | sld = 6.4, |
---|
| 191 | radius = 60, |
---|
| 192 | sld_solvent = 6.4, |
---|
| 193 | n = 1, |
---|
| 194 | sld_shell = [2.0], |
---|
| 195 | thick_shell = [10]) |
---|
| 196 | |
---|
| 197 | oldname = "CoreMultiShellModel" |
---|
| 198 | oldpars = dict( |
---|
| 199 | sld="sld_core0", |
---|
| 200 | radius="rad_core0", |
---|
| 201 | sld_solvent="sld_solv", |
---|
| 202 | n="n_shells", |
---|
| 203 | sld_shell="sld_in_shell", |
---|
| 204 | thick_shell="thick_shell", |
---|
| 205 | # func_shell is always 2 in the user interface, so isn't included |
---|
| 206 | ) |
---|