Changes in / [299edd2:d07c883] in sasmodels
- Location:
- sasmodels
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/bumps_model.py
r37a7252 r190fc2b 12 12 """ 13 13 14 import warnings 15 16 import numpy as np 17 18 from .data import plot_theory 19 from .direct_model import DataMixin 20 14 21 __all__ = [ 15 22 "Model", "Experiment", 16 23 ] 17 18 import warnings19 20 import numpy as np21 22 from .data import plot_theory23 from .direct_model import DataMixin24 24 25 25 # CRUFT: old style bumps wrapper which doesn't separate data and model -
sasmodels/compare.py
r1d4017a r190fc2b 28 28 29 29 from __future__ import print_function 30 31 import sys 32 import math 33 from os.path import basename, dirname, join as joinpath 34 import glob 35 import datetime 36 import traceback 37 38 import numpy as np 39 40 from . import core 41 from . import kerneldll 42 from . import generate 43 from .data import plot_theory, empty_data1D, empty_data2D 44 from .direct_model import DirectModel 45 from .convert import revert_model, constrain_new_to_old 30 46 31 47 USAGE = """ … … 80 96 + USAGE) 81 97 82 83 84 import sys 85 import math 86 from os.path import basename, dirname, join as joinpath 87 import glob 88 import datetime 89 import traceback 90 91 import numpy as np 92 98 kerneldll.ALLOW_SINGLE_PRECISION_DLLS = True 99 100 # List of available models 93 101 ROOT = dirname(__file__) 94 sys.path.insert(0, ROOT) # Make sure sasmodels is first on the path95 96 97 from . import core98 from . import kerneldll99 from . import generate100 from .data import plot_theory, empty_data1D, empty_data2D101 from .direct_model import DirectModel102 from .convert import revert_model, constrain_new_to_old103 kerneldll.ALLOW_SINGLE_PRECISION_DLLS = True104 105 # List of available models106 102 MODELS = [basename(f)[:-3] 107 103 for f in sorted(glob.glob(joinpath(ROOT, "models", "[a-zA-Z]*.py")))] -
sasmodels/core.py
r1d4017a r190fc2b 2 2 Core model handling routines. 3 3 """ 4 __all__ = [5 "list_models", "load_model_definition", "precompile_dll",6 "load_model", "make_kernel", "call_kernel", "call_ER", "call_VR",7 ]8 4 9 5 from os.path import basename, dirname, join as joinpath … … 24 20 HAVE_OPENCL = False 25 21 22 __all__ = [ 23 "list_models", "load_model_definition", "precompile_dll", 24 "load_model", "make_kernel", "call_kernel", "call_ER", "call_VR", 25 ] 26 26 27 27 def list_models(): -
sasmodels/generate.py
re66c9f9 r190fc2b 197 197 # TODO: identify model files which have changed since loading and reload them. 198 198 199 __all__ = ["make", "doc", "sources", "convert_type"]200 201 199 import sys 202 200 from os.path import abspath, dirname, join as joinpath, exists, basename, \ … … 206 204 207 205 import numpy as np 206 207 __all__ = ["make", "doc", "sources", "convert_type"] 208 208 209 C_KERNEL_TEMPLATE_PATH = joinpath(dirname(__file__), 'kernel_template.c') 209 210 … … 216 217 F128 = None 217 218 218 219 219 # Scale and background, which are parameters common to every form factor 220 220 COMMON_PARAMETERS = [ … … 222 222 ["background", "1/cm", 0, [0, np.inf], "", "Source background"], 223 223 ] 224 225 224 226 225 # Conversion from units defined in the parameter table for each model … … 266 265 267 266 def format_units(units): 267 """ 268 Convert units into ReStructured Text format. 269 """ 268 270 return "string" if isinstance(units, list) else RST_UNITS.get(units, units) 269 271 … … 335 337 """ 336 338 Convert code from double precision to the desired type. 339 340 Floating point constants are tagged with 'f' for single precision or 'L' 341 for long double precision. 337 342 """ 338 343 if dtype == F16: … … 350 355 351 356 def _convert_type(source, type_name, constant_flag): 357 """ 358 Replace 'double' with *type_name* in *source*, tagging floating point 359 constants with *constant_flag*. 360 """ 352 361 # Convert double keyword to float/long double/half. 353 362 # Accept an 'n' # parameter for vector # values, where n is 2, 4, 8 or 16. … … 625 634 %re.escape(string.punctuation)) 626 635 def _convert_section_titles_to_boldface(lines): 636 """ 637 Do the actual work of identifying and converting section headings. 638 """ 627 639 prior = None 628 640 for line in lines: … … 642 654 yield prior 643 655 644 def convert_section_titles_to_boldface(string): 645 return "\n".join(_convert_section_titles_to_boldface(string.split('\n'))) 656 def convert_section_titles_to_boldface(s): 657 """ 658 Use explicit bold-face rather than section headings so that the table of 659 contents is not polluted with section names from the model documentation. 660 661 Sections are identified as the title line followed by a line of punctuation 662 at least as long as the title line. 663 """ 664 return "\n".join(_convert_section_titles_to_boldface(s.split('\n'))) 646 665 647 666 def doc(kernel_module): … … 666 685 667 686 def demo_time(): 687 """ 688 Show how long it takes to process a model. 689 """ 668 690 from .models import cylinder 669 691 import datetime … … 674 696 675 697 def main(): 698 """ 699 Program which prints the source produced by the model. 700 """ 676 701 if len(sys.argv) <= 1: 677 702 print("usage: python -m sasmodels.generate modelname") -
sasmodels/models/be_polyelectrolyte.py
r841753c r168052c 44 44 J F Joanny, L Leibler, *Journal de Physique*, 51 (1990) 545 45 45 46 A Moussaid, F Schosseler, J P Munch, S Candau, *J. Journal de Physique II France*, 3 (1993) 573 46 A Moussaid, F Schosseler, J P Munch, S Candau, 47 *J. Journal de Physique II France*, 3 (1993) 573 47 48 48 49 E Raphael, J F Joanny, *Europhysics Letters*, 11 (1990) 179 … … 55 56 title = "Polyelectrolyte with the RPA expression derived by Borue and Erukhimovich" 56 57 description = """ 57 Evaluate58 F(x) = K 1/(4 pi Lb (alpha)^(2)) (q^(2)+k2)/(1+(r02)^(2))59 (q^(2)+k2) (q^(2)-(12 h C/b^(2)))58 Evaluate 59 F(x) = K 1/(4 pi Lb (alpha)^(2)) (q^(2)+k2)/(1+(r02)^(2)) 60 (q^(2)+k2) (q^(2)-(12 h C/b^(2))) 60 61 61 has 3 internal parameters :62 The inverse Debye Length: K2 = 4 pi Lb (2 Cs+alpha C)63 r02 =1/alpha/Ca^(0.5) (B/(48 pi Lb)^(0.5))64 Ca = 6.022136e-4 C65 """62 has 3 internal parameters : 63 The inverse Debye Length: K2 = 4 pi Lb (2 Cs+alpha C) 64 r02 =1/alpha/Ca^(0.5) (B/(48 pi Lb)^(0.5)) 65 Ca = 6.022136e-4 C 66 """ 66 67 category = "shape-independent" 67 68 68 # pylint: disable=bad-whitespace, line-too-long69 # ["name", 69 # pylint: disable=bad-whitespace, line-too-long 70 # ["name", "units", default, [lower, upper], "type", "description"], 70 71 parameters = [ 71 ["contrast_factor", "barns", 72 ["bjerrum_length", "Ang", 73 ["virial_param", "1/Ang^2", 74 ["monomer_length", "Ang", 75 ["salt_concentration", "mol/L", 76 ["ionization_degree", "", 77 ["polymer_concentration", "mol/L", 72 ["contrast_factor", "barns", 10.0, [-inf, inf], "", "Contrast factor of the polymer"], 73 ["bjerrum_length", "Ang", 7.1, [0, inf], "", "Bjerrum length"], 74 ["virial_param", "1/Ang^2", 12.0, [-inf, inf], "", "Virial parameter"], 75 ["monomer_length", "Ang", 10.0, [0, inf], "", "Monomer length"], 76 ["salt_concentration", "mol/L", 0.0, [-inf, inf], "", "Concentration of monovalent salt"], 77 ["ionization_degree", "", 0.05, [0, inf], "", "Degree of ionization"], 78 ["polymer_concentration", "mol/L", 0.7, [0, inf], "", "Polymer molar concentration"], 78 79 ] 79 # pylint: enable=bad-whitespace, line-too-long80 # pylint: enable=bad-whitespace, line-too-long 80 81 81 82 82 83 def Iq(q, 83 contrast_factor, 84 bjerrum_length, 85 virial_param, 86 monomer_length, 87 salt_concentration, 88 ionization_degree, 89 polymer_concentration): 84 contrast_factor=10.0, 85 bjerrum_length=7.1, 86 virial_param=12.0, 87 monomer_length=10.0, 88 salt_concentration=0.0, 89 ionization_degree=0.05, 90 polymer_concentration=0.7): 91 """ 92 :param q: Input q-value 93 :param contrast_factor: Contrast factor of the polymer 94 :param bjerrum_length: Bjerrum length 95 :param virial_param: Virial parameter 96 :param monomer_length: Monomer length 97 :param salt_concentration: Concentration of monovalent salt 98 :param ionization_degree: Degree of ionization 99 :param polymer_concentration: Polymer molar concentration 100 :return: 1-D intensity 101 """ 90 102 91 103 concentration = polymer_concentration * 6.022136e-4 92 104 93 105 k_square = 4.0 * pi * bjerrum_length * (2*salt_concentration + 94 ionization_degree * concentration)106 ionization_degree * concentration) 95 107 96 108 r0_square = 1.0/ionization_degree/sqrt(concentration) * \ 97 (monomer_length/sqrt((48.0*pi*bjerrum_length)))109 (monomer_length/sqrt((48.0*pi*bjerrum_length))) 98 110 99 111 term1 = contrast_factor/(4.0 * pi * bjerrum_length * 100 ionization_degree**2) * (q**2 + k_square)112 ionization_degree**2) * (q**2 + k_square) 101 113 102 114 term2 = 1.0 + r0_square**2 * (q**2 + k_square) * \ … … 109 121 110 122 def Iqxy(qx, qy, *args): 111 return Iq(sqrt(qx**2 + qy**2), *args) 123 """ 124 :param qx: Input q_x-value 125 :param qy: Input q_y-value 126 :param args: Remaining arguments 127 :return: 2D-Intensity 128 """ 129 iq = Iq(sqrt(qx**2 + qy**2), *args) 130 return iq 112 131 113 132 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 134 153 polymer_concentration='c') 135 154 136 # pylint: disable=bad-whitespace137 155 tests = [ 156 138 157 # Accuracy tests based on content in test/utest_other_models.py 139 158 [{'contrast_factor': 10.0, … … 176 195 }, 200., 1.80664667511e-06], 177 196 ] 178 # pylint: enable=bad-whitespace -
sasmodels/models/flexible_cylinder.py
rf94d8a2 r168052c 1 1 r""" 2 This model provides the form factor, $P(q)$, for a flexible cylinder where the form factor3 is normalized by the volume of the cylinder.2 This model provides the form factor, $P(q)$, for a flexible cylinder 3 where the form factor is normalized by the volume of the cylinder. 4 4 **Inter-cylinder interactions are NOT provided for.** 5 5 … … 8 8 P(q) = \text{scale} \left<F^2\right>/V + \text{background} 9 9 10 where the averaging $\left<\ldots\right>$ is applied only for the 1D calculation 10 where the averaging $\left<\ldots\right>$ is applied only for the 1D 11 calculation 11 12 12 The 2D scattering intensity is the same as 1D, regardless of the orientation of the q vector which is defined as 13 The 2D scattering intensity is the same as 1D, regardless of the orientation of 14 the q vector which is defined as 13 15 14 16 .. math:: … … 22 24 23 25 24 The chain of contour length, $L$, (the total length) can be described as a chain of some number of 25 locally stiff segments of length $l_p$, the persistence length (the length along the cylinder over 26 which the flexible cylinder can be considered a rigid rod). 26 The chain of contour length, $L$, (the total length) can be described as a 27 chain of some number of locally stiff segments of length $l_p$, the persistence 28 length (the length along the cylinder over which the flexible cylinder can be 29 considered a rigid rod). 27 30 The Kuhn length $(b = 2*l_p)$ is also used to describe the stiffness of a chain. 28 31 29 32 The returned value is in units of $cm^-1$, on absolute scale. 30 33 31 In the parameters, the sldCyl and sldSolv represent the SLD of the chain/cylinder and solvent respectively. 34 In the parameters, the sldCyl and sldSolv represent the SLD of the chain/cylinder 35 and solvent respectively. 32 36 33 37 … … 37 41 38 42 39 Our model uses the form factor calculations implemented in a c-library provided by the NIST Center40 for Neutron Research (Kline, 2006).43 Our model uses the form factor calculations implemented in a c-library provided 44 by the NIST Center for Neutron Research (Kline, 2006). 41 45 42 46 … … 45 49 'Method 3 With Excluded Volume' is used. 46 50 The model is a parametrization of simulations of a discrete representation 47 of the worm-like chain model of Kratky and Porod applied in the pseudocontinuous limit. 51 of the worm-like chain model of Kratky and Porod applied in the 52 pseudocontinuous limit. 48 53 See equations (13,26-27) in the original reference for the details. 49 54 … … 51 56 ---------- 52 57 53 J S Pedersen and P Schurtenberger. *Scattering functions of semiflexible polymers with and 54 without excluded volume effects.* Macromolecules, 29 (1996) 7602-7612 58 J S Pedersen and P Schurtenberger. *Scattering functions of semiflexible 59 polymers with and without excluded volume effects.* Macromolecules, 60 29 (1996) 7602-7612 55 61 56 62 Correction of the formula can be found in 57 63 58 W R Chen, P D Butler and L J Magid, *Incorporating Intermicellar Interactions in the Fitting of 59 SANS Data from Cationic Wormlike Micelles.* Langmuir, 22(15) 2006 6539-6548 64 W R Chen, P D Butler and L J Magid, *Incorporating Intermicellar Interactions 65 in the Fitting of SANS Data from Cationic Wormlike Micelles.* Langmuir, 66 22(15) 2006 6539-6548 60 67 """ 61 68 from numpy import inf 62 69 63 70 name = "flexible_cylinder" 64 title = "Flexible cylinder where the form factor is normalized by the volume of the cylinder." 65 description = """Note : scale and contrast=sld-solvent_sld are both multiplicative factors in the 66 model and are perfectly correlated. One or 67 both of these parameters must be held fixed 71 title = "Flexible cylinder where the form factor is normalized by the volume" \ 72 "of the cylinder." 73 description = """Note : scale and contrast=sld-solvent_sld are both 74 multiplicative factors in the model and are perfectly 75 correlated. One or both of these parameters must be held fixed 68 76 during model fitting. 69 77 """ … … 71 79 category = "shape:cylinder" 72 80 81 # pylint: disable=bad-whitespace, line-too-long 73 82 # ["name", "units", default, [lower, upper], "type", "description"], 74 83 parameters = [ 75 76 77 78 79 80 81 84 ["length", "Ang", 1000.0, [0, inf], "volume", "Length of the flexible cylinder"], 85 ["kuhn_length", "Ang", 100.0, [0, inf], "volume", "Kuhn length of the flexible cylinder"], 86 ["radius", "Ang", 20.0, [0, inf], "volume", "Radius of the flexible cylinder"], 87 ["sld", "1e-6/Ang^2", 1.0, [-inf, inf], "", "Cylinder scattering length density"], 88 ["solvent_sld", "1e-6/Ang^2", 6.3, [-inf, inf], "", "Solvent scattering length density"], 89 ] 90 # pylint: enable=bad-whitespace, line-too-long 82 91 source = ["lib/J1.c", "lib/wrc_cyl.c", "flexible_cylinder.c"] 83 92 … … 94 103 95 104 tests = [ 96 97 98 99 100 101 102 103 104 105 # Accuracy tests based on content in test/utest_other_models.py 106 # Currently fails in OCL 107 # [{'length': 1000.0, 108 # 'kuhn_length': 100.0, 109 # 'radius': 20.0, 110 # 'sld': 1.0, 111 # 'solvent_sld': 6.3, 112 # 'background': 0.0001, 113 # }, 0.001, 3509.2187], 105 114 106 107 [{'length':1000.0,108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 115 # Additional tests with larger range of parameters 116 [{'length': 1000.0, 117 'kuhn_length': 100.0, 118 'radius': 20.0, 119 'sld': 1.0, 120 'solvent_sld': 6.3, 121 'background': 0.0001, 122 }, 1.0, 0.000595345], 123 [{'length': 10.0, 124 'kuhn_length': 800.0, 125 'radius': 2.0, 126 'sld': 6.0, 127 'solvent_sld': 12.3, 128 'background': 0.001, 129 }, 0.1, 1.55228], 130 [{'length': 100.0, 131 'kuhn_length': 800.0, 132 'radius': 50.0, 133 'sld': 0.1, 134 'solvent_sld': 5.1, 135 'background': 0.0, 136 }, 1.0, 0.000938456] 137 ] 129 138 -
sasmodels/models/gauss_lorentz_gel.py
r07a6700 r168052c 42 42 ---------- 43 43 44 G Evmenenko, E Theunissen, K Mortensen, H Reynaers, *Polymer*, 42 (2001) 2907-2913 44 G Evmenenko, E Theunissen, K Mortensen, H Reynaers, *Polymer*, 45 42 (2001) 2907-2913 45 46 46 47 """ 47 48 48 from numpy import inf, pi,sqrt, exp49 from numpy import inf, sqrt, exp 49 50 50 51 name = "gauss_lorentz_gel" … … 63 64 """ 64 65 category = "shape-independent" 65 66 # pylint: disable=bad-whitespace, line-too-long 66 67 # ["name", "units", default, [lower, upper], "type", "description"], 67 68 parameters = [["gauss_scale_factor", "", 100.0, [-inf, inf], "", "Gauss scale factor"], … … 69 70 ["lorentz_scale_factor", "", 50.0, [-inf, inf], "", "Lorentzian scale factor"], 70 71 ["dynamic_cor_length", "Ang", 20.0, [0, inf], "", "Dynamic correlation length"], 71 72 72 ] 73 # pylint: enable=bad-whitespace, line-too-long 73 74 74 75 def Iq(q, 75 gauss_scale_factor, 76 static_cor_length, 77 lorentz_scale_factor, 78 dynamic_cor_length): 76 gauss_scale_factor=100.0, 77 static_cor_length=100.0, 78 lorentz_scale_factor=50.0, 79 dynamic_cor_length=20.0): 80 """ 79 81 80 term1 = gauss_scale_factor *\ 81 exp(-1.0*q*q*static_cor_length*static_cor_length/2.0) 82 term2 = lorentz_scale_factor /\ 83 (1.0+(q*dynamic_cor_length)*(q*dynamic_cor_length)) 82 :param q: Input q-value 83 :param gauss_scale_factor: Gauss scale factor 84 :param static_cor_length: Static correlation length 85 :param lorentz_scale_factor: Lorentzian scale factor 86 :param dynamic_cor_length: Dynamic correlation length 87 :return: 1-D intensity 88 """ 84 89 85 return term1 + term2 90 term1 = gauss_scale_factor *\ 91 exp(-1.0*q*q*static_cor_length*static_cor_length/2.0) 92 term2 = lorentz_scale_factor /\ 93 (1.0+(q*dynamic_cor_length)*(q*dynamic_cor_length)) 94 95 return term1 + term2 86 96 87 97 Iq.vectorized = True # Iq accepts an array of q values … … 89 99 90 100 def Iqxy(qx, qy, *args): 91 iq = Iq(sqrt(qx**2 + qy**2), *args) 101 """ 102 :param qx: Input q_x-value 103 :param qy: Input q_y-value 104 :param args: Remaining aruments 105 :return: 2-D intensity 106 """ 92 107 93 return iq108 return Iq(sqrt(qx**2 + qy**2), *args) 94 109 95 110 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 111 126 112 127 tests = [ 113 # Accuracy tests based on content in test/utest_extra_models.py114 [{'gauss_scale_factor': 100.0,115 'static_cor_length': 100.0,116 'lorentz_scale_factor': 50.0,117 'dynamic_cor_length': 20.0,118 }, 0.001, 149.481],119 128 120 [{'gauss_scale_factor': 100.0, 121 'static_cor_length': 100.0, 122 'lorentz_scale_factor': 50.0, 123 'dynamic_cor_length': 20.0, 124 }, 0.105363, 9.1903], 129 # Accuracy tests based on content in test/utest_extra_models.py 130 [{'gauss_scale_factor': 100.0, 131 'static_cor_length': 100.0, 132 'lorentz_scale_factor': 50.0, 133 'dynamic_cor_length': 20.0, 134 }, 0.001, 149.481], 125 135 126 127 128 129 130 }, 0.441623, 0.632811],136 [{'gauss_scale_factor': 100.0, 137 'static_cor_length': 100.0, 138 'lorentz_scale_factor': 50.0, 139 'dynamic_cor_length': 20.0, 140 }, 0.105363, 9.1903], 131 141 132 # Additional tests with larger range of parameters 133 [{'gauss_scale_factor': 10.0, 134 'static_cor_length': 100.0, 135 'lorentz_scale_factor': 3.0, 136 'dynamic_cor_length': 1.0, 137 }, 0.1, 2.9702970297], 142 [{'gauss_scale_factor': 100.0, 143 'static_cor_length': 100.0, 144 'lorentz_scale_factor': 50.0, 145 'dynamic_cor_length': 20.0, 146 }, 0.441623, 0.632811], 138 147 139 [{'gauss_scale_factor': 10.0,140 'static_cor_length': 100.0,141 'lorentz_scale_factor': 3.0,142 'dynamic_cor_length': 1.0,143 'background': 100.0144 }, 5.0, 100.115384615],148 # Additional tests with larger range of parameters 149 [{'gauss_scale_factor': 10.0, 150 'static_cor_length': 100.0, 151 'lorentz_scale_factor': 3.0, 152 'dynamic_cor_length': 1.0, 153 }, 0.1, 2.9702970297], 145 154 146 [{'gauss_scale_factor': 10.0, 147 'static_cor_length': 100.0, 148 'lorentz_scale_factor': 3.0, 149 'dynamic_cor_length': 1.0, 150 }, 200., 7.49981250469e-05], 151 ] 155 [{'gauss_scale_factor': 10.0, 156 'static_cor_length': 100.0, 157 'lorentz_scale_factor': 3.0, 158 'dynamic_cor_length': 1.0, 159 'background': 100.0 160 }, 5.0, 100.115384615], 161 162 [{'gauss_scale_factor': 10.0, 163 'static_cor_length': 100.0, 164 'lorentz_scale_factor': 3.0, 165 'dynamic_cor_length': 1.0, 166 }, 200., 7.49981250469e-05], 167 ] -
sasmodels/models/gel_fit.py
r513efc5 r168052c 7 7 in the position of the polymer chains that ensure thermodynamic equilibrium, 8 8 and a longer distance (denoted here as $a2$ ) needed to account for the static 9 accumulations of polymer pinned down by junction points or clusters of such points.10 The latter is derived from a simple Guinier function.9 accumulations of polymer pinned down by junction points or clusters of such 10 points. The latter is derived from a simple Guinier function. 11 11 12 12 … … 40 40 --------- 41 41 42 Mitsuhiro Shibayama, Toyoichi Tanaka, Charles C Han, J. Chem. Phys. 1992, 97 (9),43 6829-684142 Mitsuhiro Shibayama, Toyoichi Tanaka, Charles C Han, 43 *J. Chem. Phys.* 1992, 97 (9), 6829-6841 44 44 45 45 Simon Mallam, Ferenc Horkay, Anne-Marie Hecht, Adrian R Rennie, Erik Geissler, 46 Macromolecules1991, 24, 543-54846 *Macromolecules* 1991, 24, 543-548 47 47 48 48 """ … … 62 62 category = "shape-independent" 63 63 64 # pylint: disable=bad-whitespace, line-too-long 64 65 # ["name", "units", default, [lower, upper], "type","description"], 65 66 parameters = [["guinier_scale", "cm^{-1}", 1.7, [-inf, inf], "", "Guinier length scale"], … … 68 69 ["fractal_exp", "", 2.0, [0, inf], "", "Fractal exponent"], 69 70 ["cor_length", "Ang", 16.0, [0, inf], "", "Correlation length"] 70 71 71 ] 72 # pylint: enable=bad-whitespace, line-too-long 72 73 73 74 source = ["gel_fit.c"] … … 92 93 'fractal_exp': 10.0, 93 94 'cor_length': 20.0 94 95 }, 0.1, 0.716532], 95 96 96 97 [{'guinier_scale': 4.0, … … 100 101 'cor_length': 20.0, 101 102 'background': 20.0, 102 }, 5.0, 20.1224653026], 103 104 ] 103 }, 5.0, 20.1224653026], 104 ] -
sasmodels/models/mass_fractal.py
r87edabf r168052c 52 52 --------- 53 53 54 D Mildner and P Hall, *J. Phys. D: Appl. Phys.*, 19 (1986) 1535-1545 Equation(9) 54 D Mildner and P Hall, *J. Phys. D: Appl. Phys.*, 55 19 (1986) 1535-1545 Equation(9) 55 56 56 57 … … 79 80 category = "shape-independent" 80 81 82 # pylint: disable=bad-whitespace, line-too-long 81 83 # ["name", "units", default, [lower, upper], "type","description"], 82 84 parameters = [["radius", "Ang", 10.0, [0.0, inf], "", "Particle radius"], 83 85 ["mass_dim", "", 1.9, [1.0, 6.0], "", "Mass fractal dimension"], 84 86 ["cutoff_length", "Ang", 100.0, [0.0, inf], "", "Cut-off length"], 85 86 87 ] 88 # pylint: enable=bad-whitespace, line-too-long 87 89 88 90 source = ["lib/sph_j1c.c", "lib/lanczos_gamma.c", "mass_fractal.c"] … … 99 101 100 102 tests = [ 101 # Accuracy tests based on content in test/utest_other_models.py102 [{'radius': 10.0,103 'mass_dim': 1.9,104 'cutoff_length': 100.0,105 }, 0.05, 279.59322],106 103 107 # Additional tests with larger range of parameters108 [{'radius': 2.0,109 'mass_dim': 3.3,110 'cutoff_length': 1.0,111 }, 0.5, 1.29016774904],104 # Accuracy tests based on content in test/utest_other_models.py 105 [{'radius': 10.0, 106 'mass_dim': 1.9, 107 'cutoff_length': 100.0, 108 }, 0.05, 279.59322], 112 109 113 [{'radius': 1.0,114 'mass_dim': 1.3,115 'cutoff_length': 1.0,116 'background': 0.8,117 }, 0.001, 1.69747015932],110 # Additional tests with larger range of parameters 111 [{'radius': 2.0, 112 'mass_dim': 3.3, 113 'cutoff_length': 1.0, 114 }, 0.5, 1.29016774904], 118 115 119 [{'radius': 1.0, 120 'mass_dim': 2.3, 121 'cutoff_length': 1.0, 122 'scale': 10.0, 123 }, 0.051, 11.6227966145], 124 ] 116 [{'radius': 1.0, 117 'mass_dim': 1.3, 118 'cutoff_length': 1.0, 119 'background': 0.8, 120 }, 0.001, 1.69747015932], 121 122 [{'radius': 1.0, 123 'mass_dim': 2.3, 124 'cutoff_length': 1.0, 125 'scale': 10.0, 126 }, 0.051, 11.6227966145], 127 ] -
sasmodels/models/mass_surface_fractal.py
r07a6700 r168052c 54 54 P Schmidt, *J Appl. Cryst.*, 24 (1991) 414-435 Equation(19) 55 55 56 A J Hurd, D W Schaefer, J E Martin, *Phys. Rev. A*, 35 (1987) 2361-2364 Equation(2) 56 A J Hurd, D W Schaefer, J E Martin, *Phys. Rev. A*, 57 35 (1987) 2361-2364 Equation(2) 57 58 58 59 """ … … 79 80 category = "shape-independent" 80 81 82 # pylint: disable=bad-whitespace, line-too-long 81 83 # ["name", "units", default, [lower, upper], "type","description"], 82 84 parameters = [["mass_dim", "", 1.8, [1e-16, 6.0], "", … … 88 90 ["primary_rg", "Ang", 4000., [0.0, inf], "", 89 91 "Primary particle radius of gyration"], 90 91 92 ] 93 # pylint: enable=bad-whitespace, line-too-long 92 94 93 95 source = ["mass_surface_fractal.c"] … … 107 109 108 110 tests = [ 109 # Accuracy tests based on content in test/utest_other_models.py110 [{'mass_dim': 1.8,111 'surface_dim': 2.3,112 'cluster_rg': 86.7,113 'primary_rg': 4000.0,114 }, 0.05, 1.77537e-05],115 111 116 # Additional tests with larger range of parameters117 [{'mass_dim': 3.3,118 'surface_dim': 1.0,119 'cluster_rg': 90.0,120 121 }, 0.001, 0.18462699016],112 # Accuracy tests based on content in test/utest_other_models.py 113 [{'mass_dim': 1.8, 114 'surface_dim': 2.3, 115 'cluster_rg': 86.7, 116 'primary_rg': 4000.0, 117 }, 0.05, 1.77537e-05], 122 118 123 [{'mass_dim': 1.3,124 'surface_dim': 1.0,125 'cluster_rg': 90.0,126 'primary_rg': 2000.0,127 'background': 0.8,128 }, 0.001, 1.16539753641],119 # Additional tests with larger range of parameters 120 [{'mass_dim': 3.3, 121 'surface_dim': 1.0, 122 'cluster_rg': 90.0, 123 'primary_rg': 4000.0, 124 }, 0.001, 0.18462699016], 129 125 130 [{'mass_dim': 2.3, 131 'surface_dim': 1.0, 132 'cluster_rg': 90.0, 133 'primary_rg': 1000.0, 134 'scale': 10.0, 135 }, 0.051, 0.000169548800377], 136 ] 126 [{'mass_dim': 1.3, 127 'surface_dim': 1.0, 128 'cluster_rg': 90.0, 129 'primary_rg': 2000.0, 130 'background': 0.8, 131 }, 0.001, 1.16539753641], 132 133 [{'mass_dim': 2.3, 134 'surface_dim': 1.0, 135 'cluster_rg': 90.0, 136 'primary_rg': 1000.0, 137 'scale': 10.0, 138 }, 0.051, 0.000169548800377], 139 ] -
sasmodels/models/polymer_excl_volume.py
r07a6700 r168052c 113 113 category = "shape-independent" 114 114 115 # pylint: disable=bad-whitespace, line-too-long 115 116 # ["name", "units", default, [lower, upper], "type", "description"], 116 117 parameters = [["rg", "Ang", 60.0, [0, inf], "", "Radius of Gyration"], 117 118 ["porod_exp", "", 3.0, [-inf, inf], "", "Porod exponent"], 118 ] 119 ] 120 # pylint: enable=bad-whitespace, line-too-long 119 121 120 122 121 def Iq(q, rg, porod_exp): 122 123 def Iq(q, 124 rg=60.0, 125 porod_exp=3.0): 123 126 """ 124 127 :param q: Input q-value (float or [float, float]) … … 131 134 o2nu = 1.0/(2.0*nu) 132 135 133 intensity = ((1.0/(nu*power(u, o2nu))) * (gamma(o2nu)*gammainc(o2nu, u) - 136 intensity = ((1.0/(nu*power(u, o2nu))) * 137 (gamma(o2nu)*gammainc(o2nu, u) - 134 138 1.0/power(u, o2nu) * gamma(porod_exp) * 135 139 gammainc(porod_exp, u))) * (q > 0) + 1.0*(q <= 0) … … 141 145 142 146 def Iqxy(qx, qy, *args): 143 iq = Iq(sqrt(qx**2 + qy**2), *args) 147 """ 148 :param qx: Input q_x-value 149 :param qy: Input q_y-value 150 :param args: Remaining arguments 151 :return: 2D-Intensity 152 """ 144 153 145 return iq154 return Iq(sqrt(qx**2 + qy**2), *args) 146 155 147 156 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 158 167 159 168 tests = [ 160 161 162 163 169 # Accuracy tests based on content in test/polyexclvol_default_igor.txt 170 [{'rg': 60, 'porod_exp': 3.0}, 0.001, 0.998801], 171 [{'rg': 60, 'porod_exp': 3.0}, 0.105363, 0.0162751], 172 [{'rg': 60, 'porod_exp': 3.0}, 0.665075, 6.56261e-05], 164 173 165 166 167 168 169 170 174 # Additional tests with larger range of parameters 175 [{'rg': 10, 'porod_exp': 4.0}, 0.1, 0.723436675809], 176 [{'rg': 2.2, 'porod_exp': 22.0, 'background': 100.0}, 5.0, 100.0], 177 [{'rg': 1.1, 'porod_exp': 1, 'background': 10.0, 'scale': 1.25}, 178 20000., 10.0000712097] 179 ] -
sasmodels/models/star_polymer.py
r55b283e8 r168052c 55 55 """ 56 56 category = "shape-independent" 57 57 # pylint: disable=bad-whitespace, line-too-long 58 58 # ["name", "units", default, [lower, upper], "type","description"], 59 59 parameters = [["radius2", "Ang", 100.0, [0.0, inf], "", "Ensemble radius of gyration squared of an arm"], 60 60 ["arms", "", 3, [1.0, 6.0], "", "Number of arms in the model"], 61 62 61 ] 62 # pylint: enable=bad-whitespace, line-too-long 63 63 64 64 source = ["star_polymer.c"] … … 75 75 tests = [[{'radius2': 2.0, 76 76 'arms': 3.3, 77 77 }, 0.5, 0.850646091108], 78 78 79 79 [{'radius2': 1.0, 80 80 'arms': 2.0, 81 81 'background': 1.8, 82 83 82 }, 1.0, 2.53575888234], 83 ] -
sasmodels/models/surface_fractal.py
r07a6700 r168052c 80 80 category = "shape-independent" 81 81 82 # pylint: disable=bad-whitespace, line-too-long 82 83 # ["name", "units", default, [lower, upper], "type","description"], 83 84 parameters = [["radius", "Ang", 10.0, [0, inf], "", … … 87 88 ["cutoff_length", "Ang", 500., [0.0, inf], "", 88 89 "Cut-off Length"], 89 90 90 ] 91 # pylint: enable=bad-whitespace, line-too-long 91 92 92 93 source = ["lib/sph_j1c.c", "lib/lanczos_gamma.c", "surface_fractal.c"] … … 101 102 102 103 tests = [ 103 # Accuracy tests based on content in test/utest_other_models.py 104 [{'radius': 10.0, 'surface_dim': 2.0, 'cutoff_length': 500.0, 105 }, 0.05, 301428.65916], 104 # Accuracy tests based on content in test/utest_other_models.py 105 [{'radius': 10.0, 106 'surface_dim': 2.0, 107 'cutoff_length': 500.0, 108 }, 0.05, 301428.65916], 106 109 107 # Additional tests with larger range of parameters 108 [{'radius': 1.0, 'surface_dim': 1.0, 'cutoff_length': 10.0, 109 }, 0.332070182643, 1125.00321004], 110 # Additional tests with larger range of parameters 111 [{'radius': 1.0, 112 'surface_dim': 1.0, 113 'cutoff_length': 10.0, 114 }, 0.332070182643, 1125.00321004], 110 115 111 [{'radius': 3.5, 'surface_dim': 0.1, 'cutoff_length': 30.0, 112 'background': 0.01, 113 }, 5.0, 0.00999998891322], 116 [{'radius': 3.5, 117 'surface_dim': 0.1, 118 'cutoff_length': 30.0, 119 'background': 0.01, 120 }, 5.0, 0.00999998891322], 114 121 115 [{'radius': 3.0, 'surface_dim': 1.0, 'cutoff_length': 33.0, 116 'scale': 0.1, 117 }, 0.51, 2.50020147004], 118 ] 122 [{'radius': 3.0, 123 'surface_dim': 1.0, 124 'cutoff_length': 33.0, 125 'scale': 0.1, 126 }, 0.51, 2.50020147004], 127 ] -
sasmodels/models/two_lorentzian.py
r07a6700 r168052c 54 54 category = "shape-independent" 55 55 56 # pylint: disable=bad-whitespace, line-too-long 56 57 # ["name", "units", default, [lower, upper], "type", "description"], 57 parameters = [["lorentz_scale_1", "", 10.0, [-inf, inf], "", 58 "First power law scale factor"], 59 ["lorentz_length_1", "Ang", 100.0, [-inf, inf], "", 60 "First Lorentzian screening length"], 61 ["lorentz_exp_1", "", 3.0, [-inf, inf], "", 62 "First exponent of power law"], 63 ["lorentz_scale_2", "", 1.0, [-inf, inf], "", 64 "Second scale factor for broad Lorentzian peak"], 65 ["lorentz_length_2", "Ang", 10.0, [-inf, inf], "", 66 "Second Lorentzian screening length"], 67 ["lorentz_exp_2", "", 2.0, [-inf, inf], "", 68 "Second exponent of power law"], 69 ] 58 parameters = [["lorentz_scale_1", "", 10.0, [-inf, inf], "", "First power law scale factor"], 59 ["lorentz_length_1", "Ang", 100.0, [-inf, inf], "", "First Lorentzian screening length"], 60 ["lorentz_exp_1", "", 3.0, [-inf, inf], "", "First exponent of power law"], 61 ["lorentz_scale_2", "", 1.0, [-inf, inf], "", "Second scale factor for broad Lorentzian peak"], 62 ["lorentz_length_2", "Ang", 10.0, [-inf, inf], "", "Second Lorentzian screening length"], 63 ["lorentz_exp_2", "", 2.0, [-inf, inf], "", "Second exponent of power law"], 64 ] 65 # pylint: enable=bad-whitespace, line-too-long 70 66 71 67 72 68 def Iq(q, 73 lorentz_scale_1 ,74 lorentz_length_1 ,75 lorentz_exp_1 ,76 lorentz_scale_2 ,77 lorentz_length_2 ,78 lorentz_exp_2 ):69 lorentz_scale_1=10.0, 70 lorentz_length_1=100.0, 71 lorentz_exp_1=3.0, 72 lorentz_scale_2=1.0, 73 lorentz_length_2=10.0, 74 lorentz_exp_2=2.0): 79 75 80 76 """ … … 88 84 :return: Calculated intensity 89 85 """ 90 86 # pylint: disable=bad-whitespace 91 87 intensity = lorentz_scale_1/(1.0 + 92 88 power(q*lorentz_length_1, lorentz_exp_1)) 93 89 intensity += lorentz_scale_2/(1.0 + 94 90 power(q*lorentz_length_2, lorentz_exp_2)) 91 # pylint: enable=bad-whitespace 95 92 96 93 return intensity … … 100 97 101 98 def Iqxy(qx, qy, *args): 102 iq = Iq(sqrt(qx**2 + qy**2), *args) 99 """ 100 :param qx: Input q_x-value 101 :param qy: Input q_y-value 102 :param args: Remaining arguments 103 :return: 2D-Intensity 104 """ 103 105 104 return iq106 return Iq(sqrt(qx**2 + qy**2), *args) 105 107 106 108 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 108 110 109 111 demo = dict(scale=1, background=0.1, 110 lorentz_scale_1=10, lorentz_length_1=100.0, lorentz_exp_1=3.0, 111 lorentz_scale_2=1, lorentz_length_2=10, lorentz_exp_2=2.0) 112 lorentz_scale_1=10, 113 lorentz_length_1=100.0, 114 lorentz_exp_1=3.0, 115 lorentz_scale_2=1, 116 lorentz_length_2=10, 117 lorentz_exp_2=2.0) 112 118 113 119 oldname = "TwoLorentzianModel" 114 120 oldpars = dict(background='background', 115 lorentz_scale_1='scale_1', lorentz_scale_2='scale_2', 116 lorentz_length_1='length_1', lorentz_length_2='length_2', 117 lorentz_exp_1='exponent_1', lorentz_exp_2='exponent_2') 121 lorentz_scale_1='scale_1', 122 lorentz_scale_2='scale_2', 123 lorentz_length_1='length_1', 124 lorentz_length_2='length_2', 125 lorentz_exp_1='exponent_1', 126 lorentz_exp_2='exponent_2') 118 127 119 128 tests = [ 120 # Accuracy tests based on content in test/utest_extra_models.py121 [{'lorentz_scale_1': 10.0,122 'lorentz_length_1': 100.0,123 'lorentz_exp_1': 3.0,124 'lorentz_scale_2': 1.0,125 'lorentz_length_2': 10.0,126 'lorentz_exp_2': 2.0,127 'background': 0.1,128 }, 0.001, 11.08991],129 129 130 [{'lorentz_scale_1': 10.0, 131 'lorentz_length_1': 100.0, 132 'lorentz_exp_1': 3.0, 133 'lorentz_scale_2': 1.0, 134 'lorentz_length_2': 10.0, 135 'lorentz_exp_2': 2.0, 136 'background': 0.1, 137 }, 0.150141, 0.410245], 130 # Accuracy tests based on content in test/utest_extra_models.py 131 [{'lorentz_scale_1': 10.0, 132 'lorentz_length_1': 100.0, 133 'lorentz_exp_1': 3.0, 134 'lorentz_scale_2': 1.0, 135 'lorentz_length_2': 10.0, 136 'lorentz_exp_2': 2.0, 137 'background': 0.1, 138 }, 0.001, 11.08991], 138 139 139 140 141 142 143 144 145 146 }, 0.442528, 0.148699],140 [{'lorentz_scale_1': 10.0, 141 'lorentz_length_1': 100.0, 142 'lorentz_exp_1': 3.0, 143 'lorentz_scale_2': 1.0, 144 'lorentz_length_2': 10.0, 145 'lorentz_exp_2': 2.0, 146 'background': 0.1, 147 }, 0.150141, 0.410245], 147 148 148 # Additional tests with larger range of parameters149 [{'lorentz_scale_1': 10.0,150 'lorentz_length_1': 100.0,151 'lorentz_exp_1': 3.0,152 'lorentz_scale_2': 1.0,153 'lorentz_length_2': 10.0,154 'lorentz_exp_2': 2.0,155 }, 0.000332070182643, 10.9996228107],149 [{'lorentz_scale_1': 10.0, 150 'lorentz_length_1': 100.0, 151 'lorentz_exp_1': 3.0, 152 'lorentz_scale_2': 1.0, 153 'lorentz_length_2': 10.0, 154 'lorentz_exp_2': 2.0, 155 'background': 0.1, 156 }, 0.442528, 0.148699], 156 157 157 [{'lorentz_scale_1': 0.0,158 'lorentz_length_1':0.0,159 'lorentz_exp_1':0.0,160 'lorentz_scale_2': 0.0,161 'lorentz_length_2': 0.0,162 'lorentz_exp_2':0.0,163 'background': 100.0164 }, 5.0, 100.0],158 # Additional tests with larger range of parameters 159 [{'lorentz_scale_1': 10.0, 160 'lorentz_length_1': 100.0, 161 'lorentz_exp_1': 3.0, 162 'lorentz_scale_2': 1.0, 163 'lorentz_length_2': 10.0, 164 'lorentz_exp_2': 2.0, 165 }, 0.000332070182643, 10.9996228107], 165 166 166 [{'lorentz_scale_1': 200.0, 167 'lorentz_length_1': 10.0, 168 'lorentz_exp_1': 0.1, 169 'lorentz_scale_2': 0.1, 170 'lorentz_length_2': 5.0, 171 'lorentz_exp_2': 2.0 172 }, 20000., 45.5659201896], 173 ] 167 [{'lorentz_scale_1': 0.0, 168 'lorentz_length_1': 0.0, 169 'lorentz_exp_1': 0.0, 170 'lorentz_scale_2': 0.0, 171 'lorentz_length_2': 0.0, 172 'lorentz_exp_2': 0.0, 173 'background': 100.0 174 }, 5.0, 100.0], 175 176 [{'lorentz_scale_1': 200.0, 177 'lorentz_length_1': 10.0, 178 'lorentz_exp_1': 0.1, 179 'lorentz_scale_2': 0.1, 180 'lorentz_length_2': 5.0, 181 'lorentz_exp_2': 2.0 182 }, 20000., 45.5659201896], 183 ] -
sasmodels/resolution.py
rfdc538a r190fc2b 5 5 """ 6 6 from __future__ import division 7 8 from scipy.special import erf 9 from numpy import sqrt, log, log10 10 import numpy as np 7 11 8 12 __all__ = ["Resolution", "Perfect1D", "Pinhole1D", "Slit1D", … … 11 15 "interpolate", "linear_extrapolation", "geometric_extrapolation", 12 16 ] 13 14 from scipy.special import erf15 from numpy import sqrt, log, log1016 import numpy as np17 17 18 18 MINIMUM_RESOLUTION = 1e-8 -
sasmodels/sesans.py
r384d114 r190fc2b 43 43 *I* [cm$^{-1}$] is the value of the SANS model at *q* 44 44 """ 45 G = np.zeros (len(SElength), 'd')46 for i in range(len(SElength)):47 integr = besselj(0, q*SElength[i])*Iq*q48 G[i] = np.sum(integr )45 G = np.zeros_like(SElength, 'd') 46 for i, SElength_i in enumerate(SElength): 47 integral = besselj(0, q*SElength_i)*Iq*q 48 G[i] = np.sum(integral) 49 49 50 50 # [m^-1] step size in q, needed for integration 51 dq =(q[1]-q[0])*1e1051 dq = (q[1]-q[0])*1e10 52 52 53 53 # integration step, convert q into [m**-1] and 2 pi circle integration
Note: See TracChangeset
for help on using the changeset viewer.