Changeset d38f244 in sasmodels
- Timestamp:
- Mar 21, 2017 11:04:50 AM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- 3a45c2c
- Parents:
- b32caab (diff), 4050e6a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/ref/index.rst
rc34a31f r9f12fbe 10 10 refs.rst 11 11 gpu/gpu_computations.rst 12 gpu/opencl_installation.rst 12 13 magnetism/magnetism.rst 13 14 sesans/sans_to_sesans.rst -
sasmodels/conversion_table.py
r790b16bb r0c2da4b 549 549 "radius": "core_radius", 550 550 "sld_solvent": "core_sld", 551 "n_ pairs": "n_pairs",551 "n_shells": "n_pairs", 552 552 "thick_shell": "s_thickness", 553 553 "sld": "shell_sld", -
sasmodels/modelinfo.py
r5124c969 r9c44b7b 230 230 defined as a sublist with the following elements: 231 231 232 *name* is the name that will be used in the call to the kernel 233 function and the name that will be displayed to the user. Names 232 *name* is the name that will be displayed to the user. Names 234 233 should be lower case, with words separated by underscore. If 235 acronyms are used, the whole acronym should be upper case. 234 acronyms are used, the whole acronym should be upper case. For vector 235 parameters, the name will be followed by *[len]* where *len* is an 236 integer length of the vector, or the name of the parameter which 237 controls the length. The attribute *id* will be created from name 238 without the length. 236 239 237 240 *units* should be one of *degrees* for angles, *Ang* for lengths, … … 603 606 # Using the call_parameters table, we already have expanded forms 604 607 # for each of the vector parameters; put them in a lookup table 605 expanded_pars = dict((p.name, p) for p in self.call_parameters) 608 # Note: p.id and p.name are currently identical for the call parameters 609 expanded_pars = dict((p.id, p) for p in self.call_parameters) 606 610 607 611 def append_group(name): -
sasmodels/models/fractal.c
r925ad6e r4788822 1 1 #define INVALID(p) (p.fractal_dim < 0.0) 2 3 static double 4 form_volume(double radius) 5 { 6 return M_4PI_3 * cube(radius); 7 } 2 8 3 9 static double … … 13 19 14 20 //calculate P(q) for the spherical subunits 15 const double V = M_4PI_3*cube(radius);16 const double pq = V * square((sld_block-sld_solvent)*sas_3j1x_x(q*radius));21 const double pq = square(form_volume(radius) * (sld_block-sld_solvent) 22 *sas_3j1x_x(q*radius)); 17 23 18 24 // scale to units cm-1 sr-1 (assuming data on absolute scale) -
sasmodels/models/fractal.py
r925ad6e rdf89d77 20 20 .. math:: 21 21 22 P(q)&= F(qR_0)^2 23 24 F(q)&= \frac{3 (\sin x - x \cos x)}{x^3} 25 26 V_\text{particle} &= \frac{4}{3}\ \pi R_0 27 22 P(q)&= F(qR_0)^2 \\ 23 F(q)&= \frac{3 (\sin x - x \cos x)}{x^3} \\ 24 V_\text{particle} &= \frac{4}{3}\ \pi R_0 \\ 28 25 S(q) &= 1 + \frac{D_f\ \Gamma\!(D_f-1)}{[1+1/(q \xi)^2\ ]^{(D_f -1)/2}} 29 26 \frac{\sin[(D_f-1) \tan^{-1}(q \xi) ]}{(q R_0)^{D_f}} … … 32 29 is the fractal dimension, representing the self similarity of the structure. 33 30 Note that S(q) here goes negative if $D_f$ is too large, and the Gamma function 34 diverges at $D_f $=0 and $D_f$=1.31 diverges at $D_f=0$ and $D_f=1$. 35 32 36 33 **Polydispersity on the radius is provided for.** … … 47 44 ---------- 48 45 49 J Teixeira, *J. Appl. Cryst.*, 21 (1988) 781-78546 .. [#] J Teixeira, *J. Appl. Cryst.*, 21 (1988) 781-785 50 47 51 **Author:** NIST IGOR/DANSE **on:** pre 2010 48 Authorship and Verification 49 ---------------------------- 52 50 53 **Last Modified by:** Paul Butler **on:** March 20, 2016 54 55 **Last Reviewed by:** Paul Butler **on:** March 20, 2016 51 * **Author:** NIST IGOR/DANSE **Date:** pre 2010 52 * **Converted to sasmodels by:** Paul Butler **Date:** March 19, 2016 53 * **Last Modified by:** Paul Butler **Date:** March 12, 2017 54 * **Last Reviewed by:** Paul Butler **Date:** March 12, 2017 56 55 57 56 """ … … 84 83 parameters = [["volfraction", "", 0.05, [0.0, 1], "", 85 84 "volume fraction of blocks"], 86 ["radius", "Ang", 5.0, [0.0, inf], " ",85 ["radius", "Ang", 5.0, [0.0, inf], "volume", 87 86 "radius of particles"], 88 87 ["fractal_dim", "", 2.0, [0.0, 6.0], "", -
sasmodels/models/multilayer_vesicle.c
rc3ccaec rec1d4bc 1 static 2 double multilayer_vesicle_kernel(double q, 1 static double 2 form_volume(double radius, 3 double thick_shell, 4 double thick_solvent, 5 double fp_n_shells) 6 { 7 int n_shells = (int)(fp_n_shells + 0.5); 8 double R_N = radius + n_shells*(thick_shell+thick_solvent) - thick_solvent; 9 return M_4PI_3*cube(R_N); 10 } 11 12 static double 13 multilayer_vesicle_kernel(double q, 3 14 double volfraction, 4 15 double radius, … … 7 18 double sld_solvent, 8 19 double sld, 9 int n_ pairs)20 int n_shells) 10 21 { 11 22 //calculate with a loop, two shells at a time … … 29 40 30 41 //do 2 layers at a time 31 ii += 1;42 ii++; 32 43 33 } while(ii <= n_ pairs-1); //change to make 0 < n_pairs < 2 correspond to44 } while(ii <= n_shells-1); //change to make 0 < n_shells < 2 correspond to 34 45 //unilamellar vesicles (C. Glinka, 11/24/03) 35 46 36 fval *= volfraction*1.0e-4*fval/voli; 37 38 return(fval); 47 return 1.0e-4*volfraction*fval*fval; // Volume normalization happens in caller 39 48 } 40 49 41 static 42 doubleIq(double q,50 static double 51 Iq(double q, 43 52 double volfraction, 44 53 double radius, … … 47 56 double sld_solvent, 48 57 double sld, 49 double fp_n_ pairs)58 double fp_n_shells) 50 59 { 51 int n_ pairs = (int)(fp_n_pairs + 0.5);60 int n_shells = (int)(fp_n_shells + 0.5); 52 61 return multilayer_vesicle_kernel(q, 53 62 volfraction, … … 57 66 sld_solvent, 58 67 sld, 59 n_ pairs);68 n_shells); 60 69 } 61 70 -
sasmodels/models/multilayer_vesicle.py
rc3ccaec r5d23de2 3 3 ---------- 4 4 5 This model is a trivial extension of the core_shell_sphere function to include6 *N* shells where the core is filled with solvent and the shells are interleaved 7 with layers of solvent. For *N = 1*, this returns the same as the vesicle model, 8 except for the normalisation, which here is to outermost volume. 9 The shell thicknessess and SLD are constant for all shells as expected for 10 a multilayer vesicle.5 This model is a trivial extension of the core_shell_sphere function where the 6 core is filled with solvent and is surrounded by $N$ shells of material 7 (such as lipids) interleaved with $N - 1$ layers of solvent. For $N = 1$, this 8 returns the same as the vesicle model, except for the normalisation, which here 9 is to outermost volume. The shell thicknesses and SLD are constant for all 10 shells as expected for a multilayer vesicle. 11 11 12 12 .. figure:: img/multi_shell_geometry.jpg … … 19 19 20 20 .. math:: 21 P(q) = \text{scale} \cdot \frac{V_f}{V_t} F^2(q) + \text{background} 21 P(q) = \text{scale} \cdot \frac{\phi}{V(R_N)} F^2(q) + \text{background} 22 23 where 24 25 .. math:: 26 F(q) = (\rho_\text{shell}-\rho_\text{solv}) \sum_{i=1}^{N} \left[ 27 3V(r_i)\frac{\sin(qr_i) - qr_i\cos(qr_i)}{(qr_i)^3} 28 - 3V(R_i)\frac{\sin(qR_i) - qR_i\cos(qR_i)}{(qR_i)^3} 29 \right] 22 30 23 31 for 24 32 25 33 .. math:: 26 F(q) = (\rho_\text{shell}-\rho_\text{solv}) \sum_{i=1}^{n_\text{pairs}}27 \left[28 3V(R_i)\frac{\sin(qR_i)-qR_i\cos(qR_i)}{(qR_i)^3} \\29 - 3V(R_i+t_s)\frac{\sin(q(R_i+t_s))-q(R_i+t_s)\cos(q(R_i+t_s))}{(q(R_i+t_s))^3}30 \right]31 34 32 and 35 r_i &= r_c + (i-1)(t_s + t_w) && \text{ solvent radius before shell } i \\ 36 R_i &= r_i + t_s && \text{ shell radius for shell } i 33 37 34 .. math:: 35 R_i = r_c + (i-1)(t_s + t_w) 38 $\phi$ is the volume fraction of particles, $V(r)$ is the volume of a sphere 39 of radius $r$, $r_c$ is the radius of the core, $t_s$ is the thickness of 40 the shell, $t_w$ is the thickness of the solvent layer between the shells, 41 $\rho_\text{shell}$ is the scattering length density of a shell, and 42 $\rho_\text{solv}$ is the scattering length density of the solvent. 36 43 37 where $V_f$ is the volume fraction of particles, $V_t$ is the volume of the 38 whole particle, $V(r)$ is the volume of a sphere of radius $r$, $r_c$ is the 39 radius of the core, $\rho_\text{shell}$ is the scattering length density of a 40 shell, $\rho_\text{solv}$ is the scattering length density of the solvent. 44 USAGE NOTES 41 45 42 The outer most radius, $r_o = R_n + t_s$, is used for both the volume fraction 43 normalization and for the effective radius for *S(Q)* when $P(Q) * S(Q)$ 44 is applied. 46 * The outer-most shell radius $R_N$ is used as the effective radius 47 for $P(Q)$ when $P(Q) * S(Q)$ is applied. 48 calculations rather slow. 49 * The number of shells is always rounded to an integer value as a non interger 50 number of layers is not physical. 51 * Thus Polydispersity should only be applied to number of shells **VERY 52 CAREFULLY**. A possible legitimate use would be for mixed systems in which 53 some vesicles have 1 shell, some have 2, etc. A polydispersity on $N$ can be 54 used to model the data by using the "array distriubtion" feature. First 55 create a file such as *shell_dist.txt* containing the relative portion 56 of each vesicle size:: 57 58 1 20 59 2 4 60 3 1 61 62 Turn on polydispersity and select an array distribution for the *n_shells* 63 parameter. Choose the above *shell_dist.txt* file, and the model will be 64 computed with 80% 1-shell vesicles, 16% 2-shell vesicles and 4% 65 3-shell vesicles. 66 * This is a highly non-linear, highly oscillatory (especially around the 67 q-values that correspond to the repeat distance of the layers), model 68 function complicated by the fact that the number of water/shell pairs must 69 physically be an integer value, although the optimization treats it as a 70 floating point value. Thus it may be that the resolution interpolation is not 71 sufficiently fine grained in certain cases. Please report any such occurences 72 to the SasView team. Generally, for the best possible experience: 73 * Start with the best possible guess 74 * Using a priori knowledge, hold as many parameters fixed as possible 75 * if N=1, tw (water thickness) must by definition be zero. Both N and tw should 76 be fixed during fitting. 77 * If N>1, use constraints to keep N > 1 78 * Because N only really moves in integer steps, it may get "stuck" if the 79 optimizer step size is too small so care should be taken 80 If you experience problems with this please contact the SasView team and let 81 them know the issue preferably with example data and model which fail to 82 converge. 45 83 46 84 The 2D scattering intensity is the same as 1D, regardless of the orientation … … 54 92 the :ref:`magnetism` documentation. 55 93 56 This code is based on the form factor calculations implemented in the NIST57 Center for Neutron Research provided c-library (Kline, 2006).58 59 94 References 60 95 ---------- 61 96 62 B Cabane, *Small Angle Scattering Methods*, 63 in *Surfactant Solutions: New Methods of Investigation*, 64 Ch.2, Surfactant Science Series Vol. 22, Ed. R Zana and M Dekker, 65 New York, (1987). 97 .. [#] B Cabane, *Small Angle Scattering Methods*, in *Surfactant Solutions: 98 New Methods of Investigation*, Ch.2, Surfactant Science Series Vol. 22, Ed. 99 R Zana and M Dekker, New York, (1987). 66 100 67 **Author:** NIST IGOR/DANSE **on:** pre 2010 101 Authorship and Verification 102 ---------------------------- 68 103 69 **Last Modified by:** Piotr Rozyczko **on:** Feb 24, 2016 70 71 **Last Reviewed by:** Paul Butler **on:** March 20, 2016 104 * **Author:** NIST IGOR/DANSE **Date:** pre 2010 105 * **Converted to sasmodels by:** Piotr Rozyczko **Date:** Feb 24, 2016 106 * **Last Modified by:** Paul Kienzle **Date:** Feb 7, 2017 107 * **Last Reviewed by:** Paul Butler **Date:** March 12, 2017 72 108 73 109 """ … … 86 122 sld_solvent: solvent scattering length density 87 123 sld: shell scattering length density 88 n_ pairs:number of "shell plus solvent" layer pairs124 n_shells:number of "shell plus solvent" layer pairs 89 125 background: incoherent background 90 126 """ … … 95 131 parameters = [ 96 132 ["volfraction", "", 0.05, [0.0, 1], "", "volume fraction of vesicles"], 97 ["radius", "Ang", 60.0, [0.0, inf], " ", "radius of solvent filled core"],98 ["thick_shell", "Ang", 10.0, [0.0, inf], " ", "thickness of one shell"],99 ["thick_solvent", "Ang", 10.0, [0.0, inf], " ", "solvent thickness between shells"],133 ["radius", "Ang", 60.0, [0.0, inf], "volume", "radius of solvent filled core"], 134 ["thick_shell", "Ang", 10.0, [0.0, inf], "volume", "thickness of one shell"], 135 ["thick_solvent", "Ang", 10.0, [0.0, inf], "volume", "solvent thickness between shells"], 100 136 ["sld_solvent", "1e-6/Ang^2", 6.4, [-inf, inf], "sld", "solvent scattering length density"], 101 137 ["sld", "1e-6/Ang^2", 0.4, [-inf, inf], "sld", "Shell scattering length density"], 102 ["n_ pairs", "", 2.0, [1.0, inf], "", "Number of shell plus solvent layer pairs"],138 ["n_shells", "", 2.0, [1.0, inf], "volume", "Number of shell plus solvent layer pairs"], 103 139 ] 104 140 # pylint: enable=bad-whitespace, line-too-long 105 141 142 # TODO: proposed syntax for specifying which parameters can be polydisperse 143 #polydispersity = ["radius", "thick_shell"] 144 106 145 source = ["lib/sas_3j1x_x.c", "multilayer_vesicle.c"] 107 146 108 # TODO: the following line does nothing 109 polydispersity = ["radius", "n_pairs"] 147 def ER(radius, thick_shell, thick_solvent, n_shells): 148 n_shells = int(n_shells+0.5) 149 return radius + n_shells * (thick_shell + thick_solvent) - thick_solvent 110 150 111 151 demo = dict(scale=1, background=0, … … 116 156 sld_solvent=6.4, 117 157 sld=0.4, 118 n_ pairs=2.0)158 n_shells=2.0) 119 159 120 160 tests = [ … … 125 165 'sld_solvent': 6.4, 126 166 'sld': 0.4, 127 'n_ pairs': 2.0,167 'n_shells': 2.0, 128 168 'scale': 1.0, 129 169 'background': 0.001, … … 136 176 'sld_solvent': 6.4, 137 177 'sld': 0.4, 138 'n_ pairs': 2.0,178 'n_shells': 2.0, 139 179 'scale': 1.0, 140 180 'background': 0.001, -
sasmodels/models/rpa.py
reb63414 r4f9e288 30 30 These case numbers are different from those in the NIST SANS package! 31 31 32 The models are based on the papers by Akcasu et al. [#Akcasu]_ and by 33 Hammouda [#Hammouda]_ assuming the polymer follows Gaussian statistics such 34 that $R_g^2 = n b^2/6$ where $b$ is the statistical segment length and $n$ is 35 the number of statistical segment lengths. A nice tutorial on how these are 36 constructed and implemented can be found in chapters 28 and 39 of Boualem 37 Hammouda's 'SANS Toolbox'[#toolbox]_. 38 39 In brief the macroscopic cross sections are derived from the general forms 40 for homopolymer scattering and the multiblock cross-terms while the inter 41 polymer cross terms are described in the usual way by the $\chi$ parameter. 42 32 43 USAGE NOTES: 33 44 … … 39 50 for a C/D blend = [SLD(component C) - SLD(component D)]\ :sup:`2`. 40 51 * Depending on which case is being used, the number of fitting parameters can 41 vary. Note that in general the degrees of polymerization, the volume 42 fractions, the molar volumes, and the neutron scattering lengths for each 43 component are obtained from other methods and held fixed while the segment 44 lengths (b\ :sub:`a`, b\ :sub:`b`, etc) and $\chi$ parameters (K\ :sub:`ab`, 45 K\ :sub:`ac`, etc). The *scale* parameter should be held equal to unity. 52 vary. 53 54 .. Note:: 55 * In general the degrees of polymerization, the volume 56 fractions, the molar volumes, and the neutron scattering lengths for each 57 component are obtained from other methods and held fixed while The *scale* 58 parameter should be held equal to unity. 59 * The variables are normally the segment lengths (b\ :sub:`a`, b\ :sub:`b`, 60 etc) and $\chi$ parameters (K\ :sub:`ab`, K\ :sub:`ac`, etc). 46 61 47 62 … … 49 64 ---------- 50 65 51 .. [#] A Z Akcasu, R Klein and B Hammouda, *Macromolecules*, 26 (1993) 4136 66 .. [#Akcasu] A Z Akcasu, R Klein and B Hammouda, *Macromolecules*, 26 (1993) 67 4136. 68 .. [#Hammouda] B. Hammouda, *Advances in Polymer Science* 106 (1993) 87. 69 .. [#toolbox] https://www.ncnr.nist.gov/staff/hammouda/the_sans_toolbox.pdf 70 71 Authorship and Verification 72 ---------------------------- 73 74 * **Author:** Boualem Hammouda - NIST IGOR/DANSE **Date:** pre 2010 75 * **Converted to sasmodels by:** Paul Kienzle **Date:** July 18, 2016 76 * **Last Modified by:** Paul Butler **Date:** March 12, 2017 77 * **Last Reviewed by:** Paul Butler **Date:** March 12, 2017 52 78 """ 53 79 -
sasmodels/product.py
r9951a86 rf88e248 45 45 # structure factor calculator. Structure factors should not 46 46 # have any magnetic parameters 47 assert(s_info.parameters.kernel_parameters[0].id == ER_ID) 48 assert(s_info.parameters.kernel_parameters[1].id == VF_ID) 49 assert(s_info.parameters.magnetism_index == []) 47 if not s_info.parameters.kernel_parameters[0].id == ER_ID: 48 raise TypeError("S needs %s as first parameter"%ER_ID) 49 if not s_info.parameters.kernel_parameters[1].id == VF_ID: 50 raise TypeError("S needs %s as second parameter"%VF_ID) 51 if not s_info.parameters.magnetism_index == []: 52 raise TypeError("S should not have SLD parameters") 50 53 p_id, p_name, p_pars = p_info.id, p_info.name, p_info.parameters 51 54 s_id, s_name, s_pars = s_info.id, s_info.name, s_info.parameters 52 p_set = set(p.id for p in p_pars.call_parameters) 53 s_set = set(p.id for p in s_pars.call_parameters) 54 55 if p_set & s_set: 56 # there is some overlap between the parameter names; tag the 57 # overlapping S parameters with name_S. 58 # Skip the first parameter of s, which is effective radius 59 s_list = [(suffix_parameter(par) if par.id in p_set else par) 60 for par in s_pars.kernel_parameters[1:]] 61 else: 62 # Skip the first parameter of s, which is effective radius 63 s_list = s_pars.kernel_parameters[1:] 55 56 # Create list of parameters for the combined model. Skip the first 57 # parameter of S, which we verified above is effective radius. If there 58 # are any names in P that overlap with those in S, modify the name in S 59 # to distinguish it. 60 p_set = set(p.id for p in p_pars.kernel_parameters) 61 s_list = [(_tag_parameter(par) if par.id in p_set else par) 62 for par in s_pars.kernel_parameters[1:]] 63 # Check if still a collision after renaming. This could happen if for 64 # example S has volfrac and P has both volfrac and volfrac_S. 65 if any(p.id in p_set for p in s_list): 66 raise TypeError("name collision: P has P.name and P.name_S while S has S.name") 67 64 68 translate_name = dict((old.id, new.id) for old, new 65 69 in zip(s_pars.kernel_parameters[1:], s_list)) 66 70 demo = {} 67 demo.update((k, v) for k, v in p_info.demo.items() 68 if k not in ("background", "scale")) 71 demo.update(p_info.demo.items()) 69 72 demo.update((translate_name[k], v) for k, v in s_info.demo.items() 70 73 if k not in ("background", "scale") and not k.startswith(ER_ID)) … … 90 93 # Remember the component info blocks so we can build the model 91 94 model_info.composition = ('product', [p_info, s_info]) 92 model_info.demo = {} 95 model_info.demo = demo 96 97 ## Show the parameter table with the demo values 98 #from .compare import get_pars, parlist 99 #print("==== %s ====="%model_info.name) 100 #values = get_pars(model_info, use_demo=True) 101 #print(parlist(model_info, values, is2d=True)) 93 102 return model_info 94 103 95 def suffix_parameter(par, suffix): 104 def _tag_parameter(par): 105 """ 106 Tag the parameter name with _S to indicate that the parameter comes from 107 the structure factor parameter set. This is only necessary if the 108 form factor model includes a parameter of the same name as a parameter 109 in the structure factor. 110 """ 96 111 par = copy(par) 97 par.name = par.name + " S" 112 # Protect against a vector parameter in S by appending the vector length 113 # to the renamed parameter. Note: haven't tested this since no existing 114 # structure factor models contain vector parameters. 115 vector_length = par.name[len(par.id):] 98 116 par.id = par.id + "_S" 117 par.name = par.id + vector_length 99 118 return par 100 119 -
sasmodels/resolution.py
rb397165 rb32caab 17 17 18 18 MINIMUM_RESOLUTION = 1e-8 19 20 21 # When extrapolating to -q, what is the minimum positive q relative to q_min 22 # that we wish to calculate? 23 MIN_Q_SCALE_FOR_NEGATIVE_Q_EXTRAPOLATION = 0.01 19 MINIMUM_ABSOLUTE_Q = 0.02 # relative to the minimum q in the data 24 20 25 21 class Resolution(object): … … 82 78 self.q_calc = (pinhole_extend_q(q, q_width, nsigma=nsigma) 83 79 if q_calc is None else np.sort(q_calc)) 80 81 # Protect against models which are not defined for very low q. Limit 82 # the smallest q value evaluated (in absolute) to 0.02*min 83 cutoff = MINIMUM_ABSOLUTE_Q*np.min(self.q) 84 self.q_calc = self.q_calc[abs(self.q_calc) >= cutoff] 85 86 # Build weight matrix from calculated q values 84 87 self.weight_matrix = pinhole_resolution(self.q_calc, self.q, 85 88 np.maximum(q_width, MINIMUM_RESOLUTION)) 89 self.q_calc = abs(self.q_calc) 86 90 87 91 def apply(self, theory): … … 123 127 self.q_calc = slit_extend_q(q, qx_width, qy_width) \ 124 128 if q_calc is None else np.sort(q_calc) 129 130 # Protect against models which are not defined for very low q. Limit 131 # the smallest q value evaluated (in absolute) to 0.02*min 132 cutoff = MINIMUM_ABSOLUTE_Q*np.min(self.q) 133 self.q_calc = self.q_calc[abs(self.q_calc) >= cutoff] 134 135 # Build weight matrix from calculated q values 125 136 self.weight_matrix = \ 126 137 slit_resolution(self.q_calc, self.q, qx_width, qy_width) 138 self.q_calc = abs(self.q_calc) 127 139 128 140 def apply(self, theory): … … 153 165 # neither trapezoid nor Simpson's rule improved the accuracy. 154 166 edges = bin_edges(q_calc) 155 edges[edges < 0.0] = 0.0 # clip edges below zero167 #edges[edges < 0.0] = 0.0 # clip edges below zero 156 168 cdf = erf((edges[:, None] - q[None, :]) / (sqrt(2.0)*q_width)[None, :]) 157 169 weights = cdf[1:] - cdf[:-1] … … 286 298 # The current algorithm is a midpoint rectangle rule. 287 299 q_edges = bin_edges(q_calc) # Note: requires q > 0 288 q_edges[q_edges < 0.0] = 0.0 # clip edges below zero300 #q_edges[q_edges < 0.0] = 0.0 # clip edges below zero 289 301 weights = np.zeros((len(q), len(q_calc)), 'd') 290 302 … … 392 404 interval. 393 405 394 if *q_min* is zero or less then *q[0]/10* is used instead.406 Note that extrapolated values may be negative. 395 407 """ 396 408 q = np.sort(q) 397 409 if q_min + 2*MINIMUM_RESOLUTION < q[0]: 398 if q_min <= 0: q_min = q_min*MIN_Q_SCALE_FOR_NEGATIVE_Q_EXTRAPOLATION399 410 n_low = np.ceil((q[0]-q_min) / (q[1]-q[0])) if q[1] > q[0] else 15 400 411 q_low = np.linspace(q_min, q[0], n_low+1)[:-1] … … 448 459 log_delta_q = log(10.) / points_per_decade 449 460 if q_min < q[0]: 450 if q_min < 0: q_min = q[0]*MIN _Q_SCALE_FOR_NEGATIVE_Q_EXTRAPOLATION461 if q_min < 0: q_min = q[0]*MINIMUM_ABSOLUTE_Q 451 462 n_low = log_delta_q * (log(q[0])-log(q_min)) 452 463 q_low = np.logspace(log10(q_min), log10(q[0]), np.ceil(n_low)+1)[:-1]
Note: See TracChangeset
for help on using the changeset viewer.