Changes in / [d07c883:299edd2] in sasmodels
- Location:
- sasmodels
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/bumps_model.py
r190fc2b r37a7252 12 12 """ 13 13 14 import warnings15 16 import numpy as np17 18 from .data import plot_theory19 from .direct_model import DataMixin20 21 14 __all__ = [ 22 15 "Model", "Experiment", 23 16 ] 17 18 import warnings 19 20 import numpy as np 21 22 from .data import plot_theory 23 from .direct_model import DataMixin 24 24 25 25 # CRUFT: old style bumps wrapper which doesn't separate data and model -
sasmodels/compare.py
r190fc2b r1d4017a 28 28 29 29 from __future__ import print_function 30 31 import sys32 import math33 from os.path import basename, dirname, join as joinpath34 import glob35 import datetime36 import traceback37 38 import numpy as np39 40 from . import core41 from . import kerneldll42 from . import generate43 from .data import plot_theory, empty_data1D, empty_data2D44 from .direct_model import DirectModel45 from .convert import revert_model, constrain_new_to_old46 30 47 31 USAGE = """ … … 96 80 + USAGE) 97 81 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 93 ROOT = dirname(__file__) 94 sys.path.insert(0, ROOT) # Make sure sasmodels is first on the path 95 96 97 from . import core 98 from . import kerneldll 99 from . import generate 100 from .data import plot_theory, empty_data1D, empty_data2D 101 from .direct_model import DirectModel 102 from .convert import revert_model, constrain_new_to_old 98 103 kerneldll.ALLOW_SINGLE_PRECISION_DLLS = True 99 104 100 105 # List of available models 101 ROOT = dirname(__file__)102 106 MODELS = [basename(f)[:-3] 103 107 for f in sorted(glob.glob(joinpath(ROOT, "models", "[a-zA-Z]*.py")))] -
sasmodels/core.py
r190fc2b r1d4017a 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 ] 4 8 5 9 from os.path import basename, dirname, join as joinpath … … 20 24 HAVE_OPENCL = False 21 25 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
r190fc2b re66c9f9 197 197 # TODO: identify model files which have changed since loading and reload them. 198 198 199 __all__ = ["make", "doc", "sources", "convert_type"] 200 199 201 import sys 200 202 from os.path import abspath, dirname, join as joinpath, exists, basename, \ … … 204 206 205 207 import numpy as np 206 207 __all__ = ["make", "doc", "sources", "convert_type"]208 209 208 C_KERNEL_TEMPLATE_PATH = joinpath(dirname(__file__), 'kernel_template.c') 210 209 … … 217 216 F128 = None 218 217 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 224 225 225 226 # Conversion from units defined in the parameter table for each model … … 265 266 266 267 def format_units(units): 267 """268 Convert units into ReStructured Text format.269 """270 268 return "string" if isinstance(units, list) else RST_UNITS.get(units, units) 271 269 … … 337 335 """ 338 336 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.342 337 """ 343 338 if dtype == F16: … … 355 350 356 351 def _convert_type(source, type_name, constant_flag): 357 """358 Replace 'double' with *type_name* in *source*, tagging floating point359 constants with *constant_flag*.360 """361 352 # Convert double keyword to float/long double/half. 362 353 # Accept an 'n' # parameter for vector # values, where n is 2, 4, 8 or 16. … … 634 625 %re.escape(string.punctuation)) 635 626 def _convert_section_titles_to_boldface(lines): 636 """637 Do the actual work of identifying and converting section headings.638 """639 627 prior = None 640 628 for line in lines: … … 654 642 yield prior 655 643 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'))) 644 def convert_section_titles_to_boldface(string): 645 return "\n".join(_convert_section_titles_to_boldface(string.split('\n'))) 665 646 666 647 def doc(kernel_module): … … 685 666 686 667 def demo_time(): 687 """688 Show how long it takes to process a model.689 """690 668 from .models import cylinder 691 669 import datetime … … 696 674 697 675 def main(): 698 """699 Program which prints the source produced by the model.700 """701 676 if len(sys.argv) <= 1: 702 677 print("usage: python -m sasmodels.generate modelname") -
sasmodels/models/be_polyelectrolyte.py
r168052c r841753c 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, 47 *J. Journal de Physique II France*, 3 (1993) 573 46 A Moussaid, F Schosseler, J P Munch, S Candau, *J. Journal de Physique II France*, 3 (1993) 573 48 47 49 48 E Raphael, J F Joanny, *Europhysics Letters*, 11 (1990) 179 … … 56 55 title = "Polyelectrolyte with the RPA expression derived by Borue and Erukhimovich" 57 56 description = """ 58 59 60 57 Evaluate 58 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))) 61 60 62 63 64 65 66 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 C 65 """ 67 66 category = "shape-independent" 68 67 69 # pylint: disable=bad-whitespace, 70 # ["name", "units", default, [lower, upper], "type", "description"],68 # pylint: disable=bad-whitespace,line-too-long 69 # ["name", "units", default, [lower, upper], "type", "description"], 71 70 parameters = [ 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"],71 ["contrast_factor", "barns", 10.0, [-inf, inf], "", "Contrast factor of the polymer"], 72 ["bjerrum_length", "Ang", 7.1, [0, inf], "", "Bjerrum length"], 73 ["virial_param", "1/Ang^2", 12.0, [-inf, inf], "", "Virial parameter"], 74 ["monomer_length", "Ang", 10.0, [0, inf], "", "Monomer length"], 75 ["salt_concentration", "mol/L", 0.0, [-inf, inf], "", "Concentration of monovalent salt"], 76 ["ionization_degree", "", 0.05, [0, inf], "", "Degree of ionization"], 77 ["polymer_concentration", "mol/L", 0.7, [0, inf], "", "Polymer molar concentration"], 79 78 ] 80 # pylint: enable=bad-whitespace, 79 # pylint: enable=bad-whitespace,line-too-long 81 80 82 81 83 82 def Iq(q, 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 """ 83 contrast_factor, 84 bjerrum_length, 85 virial_param, 86 monomer_length, 87 salt_concentration, 88 ionization_degree, 89 polymer_concentration): 102 90 103 91 concentration = polymer_concentration * 6.022136e-4 104 92 105 93 k_square = 4.0 * pi * bjerrum_length * (2*salt_concentration + 106 94 ionization_degree * concentration) 107 95 108 96 r0_square = 1.0/ionization_degree/sqrt(concentration) * \ 109 97 (monomer_length/sqrt((48.0*pi*bjerrum_length))) 110 98 111 99 term1 = contrast_factor/(4.0 * pi * bjerrum_length * 112 100 ionization_degree**2) * (q**2 + k_square) 113 101 114 102 term2 = 1.0 + r0_square**2 * (q**2 + k_square) * \ … … 121 109 122 110 def Iqxy(qx, qy, *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 111 return Iq(sqrt(qx**2 + qy**2), *args) 131 112 132 113 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 153 134 polymer_concentration='c') 154 135 136 # pylint: disable=bad-whitespace 155 137 tests = [ 156 157 138 # Accuracy tests based on content in test/utest_other_models.py 158 139 [{'contrast_factor': 10.0, … … 195 176 }, 200., 1.80664667511e-06], 196 177 ] 178 # pylint: enable=bad-whitespace -
sasmodels/models/flexible_cylinder.py
r168052c rf94d8a2 1 1 r""" 2 This model provides the form factor, $P(q)$, for a flexible cylinder 3 where the form factoris normalized by the volume of the cylinder.2 This model provides the form factor, $P(q)$, for a flexible cylinder where the form factor 3 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 11 calculation 10 where the averaging $\left<\ldots\right>$ is applied only for the 1D calculation 12 11 13 The 2D scattering intensity is the same as 1D, regardless of the orientation of 14 the q vector which is defined as 12 The 2D scattering intensity is the same as 1D, regardless of the orientation of the q vector which is defined as 15 13 16 14 .. math:: … … 24 22 25 23 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). 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). 30 27 The Kuhn length $(b = 2*l_p)$ is also used to describe the stiffness of a chain. 31 28 32 29 The returned value is in units of $cm^-1$, on absolute scale. 33 30 34 In the parameters, the sldCyl and sldSolv represent the SLD of the chain/cylinder 35 and solvent respectively. 31 In the parameters, the sldCyl and sldSolv represent the SLD of the chain/cylinder and solvent respectively. 36 32 37 33 … … 41 37 42 38 43 Our model uses the form factor calculations implemented in a c-library provided 44 by the NIST Centerfor Neutron Research (Kline, 2006).39 Our model uses the form factor calculations implemented in a c-library provided by the NIST Center 40 for Neutron Research (Kline, 2006). 45 41 46 42 … … 49 45 'Method 3 With Excluded Volume' is used. 50 46 The model is a parametrization of simulations of a discrete representation 51 of the worm-like chain model of Kratky and Porod applied in the 52 pseudocontinuous limit. 47 of the worm-like chain model of Kratky and Porod applied in the pseudocontinuous limit. 53 48 See equations (13,26-27) in the original reference for the details. 54 49 … … 56 51 ---------- 57 52 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 53 J S Pedersen and P Schurtenberger. *Scattering functions of semiflexible polymers with and 54 without excluded volume effects.* Macromolecules, 29 (1996) 7602-7612 61 55 62 56 Correction of the formula can be found in 63 57 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 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 67 60 """ 68 61 from numpy import inf 69 62 70 63 name = "flexible_cylinder" 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 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 76 68 during model fitting. 77 69 """ … … 79 71 category = "shape:cylinder" 80 72 81 # pylint: disable=bad-whitespace, line-too-long82 73 # ["name", "units", default, [lower, upper], "type", "description"], 83 74 parameters = [ 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 75 ["length", "Ang", 1000.0, [0, inf], "volume", "Length of the flexible cylinder"], 76 ["kuhn_length", "Ang", 100.0, [0, inf], "volume", "Kuhn length of the flexible cylinder"], 77 ["radius", "Ang", 20.0, [0, inf], "volume", "Radius of the flexible cylinder"], 78 ["sld", "1e-6/Ang^2", 1.0, [-inf, inf], "", "Cylinder scattering length density"], 79 ["solvent_sld", "1e-6/Ang^2", 6.3, [-inf, inf], "", "Solvent scattering length density"], 80 ] 81 91 82 source = ["lib/J1.c", "lib/wrc_cyl.c", "flexible_cylinder.c"] 92 83 … … 103 94 104 95 tests = [ 105 # Accuracy tests based on content in test/utest_other_models.py106 # Currently fails in OCL107 # [{'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],96 # Accuracy tests based on content in test/utest_other_models.py 97 # Currently fails in OCL 98 # [{'length': 1000.0, 99 # 'kuhn_length': 100.0, 100 # 'radius': 20.0, 101 # 'sld': 1.0, 102 # 'solvent_sld': 6.3, 103 # 'background': 0.0001, 104 # }, 0.001, 3509.2187], 114 105 115 # Additional tests with larger range of parameters116 [{'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 ]106 # Additional tests with larger range of parameters 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 }, 1.0, 0.000595345], 114 [{'length': 10.0, 115 'kuhn_length': 800.0, 116 'radius': 2.0, 117 'sld': 6.0, 118 'solvent_sld': 12.3, 119 'background': 0.001, 120 }, 0.1, 1.55228], 121 [{'length': 100.0, 122 'kuhn_length': 800.0, 123 'radius': 50.0, 124 'sld': 0.1, 125 'solvent_sld': 5.1, 126 'background': 0.0, 127 }, 1.0, 0.000938456] 128 ] 138 129 -
sasmodels/models/gauss_lorentz_gel.py
r168052c r07a6700 42 42 ---------- 43 43 44 G Evmenenko, E Theunissen, K Mortensen, H Reynaers, *Polymer*, 45 42 (2001) 2907-2913 44 G Evmenenko, E Theunissen, K Mortensen, H Reynaers, *Polymer*, 42 (2001) 2907-2913 46 45 47 46 """ 48 47 49 from numpy import inf, sqrt, exp48 from numpy import inf, pi, sqrt, exp 50 49 51 50 name = "gauss_lorentz_gel" … … 64 63 """ 65 64 category = "shape-independent" 66 # pylint: disable=bad-whitespace, line-too-long 65 67 66 # ["name", "units", default, [lower, upper], "type", "description"], 68 67 parameters = [["gauss_scale_factor", "", 100.0, [-inf, inf], "", "Gauss scale factor"], … … 70 69 ["lorentz_scale_factor", "", 50.0, [-inf, inf], "", "Lorentzian scale factor"], 71 70 ["dynamic_cor_length", "Ang", 20.0, [0, inf], "", "Dynamic correlation length"], 72 ]73 # pylint: enable=bad-whitespace, line-too-long 71 ] 72 74 73 75 74 def Iq(q, 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 """ 75 gauss_scale_factor, 76 static_cor_length, 77 lorentz_scale_factor, 78 dynamic_cor_length): 81 79 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 """ 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)) 89 84 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 85 return term1 + term2 96 86 97 87 Iq.vectorized = True # Iq accepts an array of q values … … 99 89 100 90 def Iqxy(qx, qy, *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 """ 91 iq = Iq(sqrt(qx**2 + qy**2), *args) 107 92 108 return Iq(sqrt(qx**2 + qy**2), *args)93 return iq 109 94 110 95 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 126 111 127 112 tests = [ 113 # Accuracy tests based on content in test/utest_extra_models.py 114 [{'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], 128 119 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], 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], 135 125 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],126 [{'gauss_scale_factor': 100.0, 127 'static_cor_length': 100.0, 128 'lorentz_scale_factor': 50.0, 129 'dynamic_cor_length': 20.0, 130 }, 0.441623, 0.632811], 141 131 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], 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], 147 138 148 # Additional tests with larger range of parameters149 [{'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],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.0 144 }, 5.0, 100.115384615], 154 145 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 ] 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 ] -
sasmodels/models/gel_fit.py
r168052c r513efc5 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 10 points.The latter is derived from a simple Guinier function.9 accumulations of polymer pinned down by junction points or clusters of such points. 10 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, 43 *J. Chem. Phys.* 1992, 97 (9),6829-684142 Mitsuhiro Shibayama, Toyoichi Tanaka, Charles C Han, J. Chem. Phys. 1992, 97 (9), 43 6829-6841 44 44 45 45 Simon Mallam, Ferenc Horkay, Anne-Marie Hecht, Adrian R Rennie, Erik Geissler, 46 *Macromolecules*1991, 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-long65 64 # ["name", "units", default, [lower, upper], "type","description"], 66 65 parameters = [["guinier_scale", "cm^{-1}", 1.7, [-inf, inf], "", "Guinier length scale"], … … 69 68 ["fractal_exp", "", 2.0, [0, inf], "", "Fractal exponent"], 70 69 ["cor_length", "Ang", 16.0, [0, inf], "", "Correlation length"] 71 ]72 # pylint: enable=bad-whitespace, line-too-long 70 ] 71 73 72 74 73 source = ["gel_fit.c"] … … 93 92 'fractal_exp': 10.0, 94 93 'cor_length': 20.0 95 }, 0.1, 0.716532],94 }, 0.1, 0.716532], 96 95 97 96 [{'guinier_scale': 4.0, … … 101 100 'cor_length': 20.0, 102 101 'background': 20.0, 103 }, 5.0, 20.1224653026], 104 ] 102 }, 5.0, 20.1224653026], 103 104 ] -
sasmodels/models/mass_fractal.py
r168052c r87edabf 52 52 --------- 53 53 54 D Mildner and P Hall, *J. Phys. D: Appl. Phys.*, 55 19 (1986) 1535-1545 Equation(9) 54 D Mildner and P Hall, *J. Phys. D: Appl. Phys.*, 19 (1986) 1535-1545 Equation(9) 56 55 57 56 … … 80 79 category = "shape-independent" 81 80 82 # pylint: disable=bad-whitespace, line-too-long83 81 # ["name", "units", default, [lower, upper], "type","description"], 84 82 parameters = [["radius", "Ang", 10.0, [0.0, inf], "", "Particle radius"], 85 83 ["mass_dim", "", 1.9, [1.0, 6.0], "", "Mass fractal dimension"], 86 84 ["cutoff_length", "Ang", 100.0, [0.0, inf], "", "Cut-off length"], 87 ]88 # pylint: enable=bad-whitespace, line-too-long 85 ] 86 89 87 90 88 source = ["lib/sph_j1c.c", "lib/lanczos_gamma.c", "mass_fractal.c"] … … 101 99 102 100 tests = [ 101 # Accuracy tests based on content in test/utest_other_models.py 102 [{'radius': 10.0, 103 'mass_dim': 1.9, 104 'cutoff_length': 100.0, 105 }, 0.05, 279.59322], 103 106 104 # Accuracy tests based on content in test/utest_other_models.py105 [{'radius': 10.0,106 'mass_dim': 1.9,107 'cutoff_length': 100.0,108 }, 0.05, 279.59322],107 # Additional tests with larger range of parameters 108 [{'radius': 2.0, 109 'mass_dim': 3.3, 110 'cutoff_length': 1.0, 111 }, 0.5, 1.29016774904], 109 112 110 # Additional tests with larger range of parameters111 [{'radius': 2.0,112 'mass_dim': 3.3,113 'cutoff_length': 1.0,114 }, 0.5, 1.29016774904],113 [{'radius': 1.0, 114 'mass_dim': 1.3, 115 'cutoff_length': 1.0, 116 'background': 0.8, 117 }, 0.001, 1.69747015932], 115 118 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 ] 119 [{'radius': 1.0, 120 'mass_dim': 2.3, 121 'cutoff_length': 1.0, 122 'scale': 10.0, 123 }, 0.051, 11.6227966145], 124 ] -
sasmodels/models/mass_surface_fractal.py
r168052c r07a6700 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*, 57 35 (1987) 2361-2364 Equation(2) 56 A J Hurd, D W Schaefer, J E Martin, *Phys. Rev. A*, 35 (1987) 2361-2364 Equation(2) 58 57 59 58 """ … … 80 79 category = "shape-independent" 81 80 82 # pylint: disable=bad-whitespace, line-too-long83 81 # ["name", "units", default, [lower, upper], "type","description"], 84 82 parameters = [["mass_dim", "", 1.8, [1e-16, 6.0], "", … … 90 88 ["primary_rg", "Ang", 4000., [0.0, inf], "", 91 89 "Primary particle radius of gyration"], 92 ]93 # pylint: enable=bad-whitespace, line-too-long 90 ] 91 94 92 95 93 source = ["mass_surface_fractal.c"] … … 109 107 110 108 tests = [ 109 # Accuracy tests based on content in test/utest_other_models.py 110 [{'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], 111 115 112 # Accuracy tests based on content in test/utest_other_models.py113 [{'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],116 # Additional tests with larger range of parameters 117 [{'mass_dim': 3.3, 118 'surface_dim': 1.0, 119 'cluster_rg': 90.0, 120 'primary_rg': 4000.0, 121 }, 0.001, 0.18462699016], 118 122 119 # Additional tests with larger range of parameters120 [{'mass_dim': 3.3,121 'surface_dim': 1.0,122 'cluster_rg': 90.0,123 'primary_rg': 4000.0,124 }, 0.001, 0.18462699016],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], 125 129 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 ] 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 ] -
sasmodels/models/polymer_excl_volume.py
r168052c r07a6700 113 113 category = "shape-independent" 114 114 115 # pylint: disable=bad-whitespace, line-too-long116 115 # ["name", "units", default, [lower, upper], "type", "description"], 117 116 parameters = [["rg", "Ang", 60.0, [0, inf], "", "Radius of Gyration"], 118 117 ["porod_exp", "", 3.0, [-inf, inf], "", "Porod exponent"], 119 ] 120 # pylint: enable=bad-whitespace, line-too-long 118 ] 121 119 122 120 123 def Iq(q, 124 rg=60.0, 125 porod_exp=3.0): 121 def Iq(q, rg, porod_exp): 122 126 123 """ 127 124 :param q: Input q-value (float or [float, float]) … … 134 131 o2nu = 1.0/(2.0*nu) 135 132 136 intensity = ((1.0/(nu*power(u, o2nu))) * 137 (gamma(o2nu)*gammainc(o2nu, u) - 133 intensity = ((1.0/(nu*power(u, o2nu))) * (gamma(o2nu)*gammainc(o2nu, u) - 138 134 1.0/power(u, o2nu) * gamma(porod_exp) * 139 135 gammainc(porod_exp, u))) * (q > 0) + 1.0*(q <= 0) … … 145 141 146 142 def Iqxy(qx, qy, *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 """ 143 iq = Iq(sqrt(qx**2 + qy**2), *args) 153 144 154 return Iq(sqrt(qx**2 + qy**2), *args)145 return iq 155 146 156 147 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 167 158 168 159 tests = [ 169 # Accuracy tests based on content in test/polyexclvol_default_igor.txt170 [{'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],160 # Accuracy tests based on content in test/polyexclvol_default_igor.txt 161 [{'rg': 60, 'porod_exp': 3.0}, 0.001, 0.998801], 162 [{'rg': 60, 'porod_exp': 3.0}, 0.105363, 0.0162751], 163 [{'rg': 60, 'porod_exp': 3.0}, 0.665075, 6.56261e-05], 173 164 174 # Additional tests with larger range of parameters175 [{'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 ]165 # Additional tests with larger range of parameters 166 [{'rg': 10, 'porod_exp': 4.0}, 0.1, 0.723436675809], 167 [{'rg': 2.2, 'porod_exp': 22.0, 'background': 100.0}, 5.0, 100.0], 168 [{'rg': 1.1, 'porod_exp': 1, 'background': 10.0, 'scale': 1.25}, 169 20000., 10.0000712097] 170 ] -
sasmodels/models/star_polymer.py
r168052c r55b283e8 55 55 """ 56 56 category = "shape-independent" 57 # pylint: disable=bad-whitespace, line-too-long 57 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 # pylint: enable=bad-whitespace, line-too-long 61 ] 62 63 63 64 64 source = ["star_polymer.c"] … … 75 75 tests = [[{'radius2': 2.0, 76 76 'arms': 3.3, 77 }, 0.5, 0.850646091108],77 }, 0.5, 0.850646091108], 78 78 79 79 [{'radius2': 1.0, 80 80 'arms': 2.0, 81 81 'background': 1.8, 82 }, 1.0, 2.53575888234],83 ]82 }, 1.0, 2.53575888234], 83 ] -
sasmodels/models/surface_fractal.py
r168052c r07a6700 80 80 category = "shape-independent" 81 81 82 # pylint: disable=bad-whitespace, line-too-long83 82 # ["name", "units", default, [lower, upper], "type","description"], 84 83 parameters = [["radius", "Ang", 10.0, [0, inf], "", … … 88 87 ["cutoff_length", "Ang", 500., [0.0, inf], "", 89 88 "Cut-off Length"], 90 ]91 # pylint: enable=bad-whitespace, line-too-long 89 ] 90 92 91 93 92 source = ["lib/sph_j1c.c", "lib/lanczos_gamma.c", "surface_fractal.c"] … … 102 101 103 102 tests = [ 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], 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], 109 106 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], 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], 115 110 116 [{'radius': 3.5, 117 'surface_dim': 0.1, 118 'cutoff_length': 30.0, 119 'background': 0.01, 120 }, 5.0, 0.00999998891322], 111 [{'radius': 3.5, 'surface_dim': 0.1, 'cutoff_length': 30.0, 112 'background': 0.01, 113 }, 5.0, 0.00999998891322], 121 114 122 [{'radius': 3.0, 123 'surface_dim': 1.0, 124 'cutoff_length': 33.0, 125 'scale': 0.1, 126 }, 0.51, 2.50020147004], 127 ] 115 [{'radius': 3.0, 'surface_dim': 1.0, 'cutoff_length': 33.0, 116 'scale': 0.1, 117 }, 0.51, 2.50020147004], 118 ] -
sasmodels/models/two_lorentzian.py
r168052c r07a6700 54 54 category = "shape-independent" 55 55 56 # pylint: disable=bad-whitespace, line-too-long57 56 # ["name", "units", default, [lower, upper], "type", "description"], 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 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 ] 66 70 67 71 68 72 def Iq(q, 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):73 lorentz_scale_1, 74 lorentz_length_1, 75 lorentz_exp_1, 76 lorentz_scale_2, 77 lorentz_length_2, 78 lorentz_exp_2): 75 79 76 80 """ … … 84 88 :return: Calculated intensity 85 89 """ 86 # pylint: disable=bad-whitespace 90 87 91 intensity = lorentz_scale_1/(1.0 + 88 92 power(q*lorentz_length_1, lorentz_exp_1)) 89 93 intensity += lorentz_scale_2/(1.0 + 90 94 power(q*lorentz_length_2, lorentz_exp_2)) 91 # pylint: enable=bad-whitespace92 95 93 96 return intensity … … 97 100 98 101 def Iqxy(qx, qy, *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 """ 102 iq = Iq(sqrt(qx**2 + qy**2), *args) 105 103 106 return Iq(sqrt(qx**2 + qy**2), *args)104 return iq 107 105 108 106 Iqxy.vectorized = True # Iqxy accepts an array of qx, qy values … … 110 108 111 109 demo = dict(scale=1, background=0.1, 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) 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) 118 112 119 113 oldname = "TwoLorentzianModel" 120 114 oldpars = dict(background='background', 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') 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') 127 118 128 119 tests = [ 120 # Accuracy tests based on content in test/utest_extra_models.py 121 [{'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 # 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], 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], 139 138 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],139 [{'lorentz_scale_1': 10.0, 140 'lorentz_length_1': 100.0, 141 'lorentz_exp_1': 3.0, 142 'lorentz_scale_2': 1.0, 143 'lorentz_length_2': 10.0, 144 'lorentz_exp_2': 2.0, 145 'background': 0.1, 146 }, 0.442528, 0.148699], 148 147 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],148 # Additional tests with larger range of parameters 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 }, 0.000332070182643, 10.9996228107], 157 156 158 # Additional tests with larger range of parameters159 [{'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],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.0 164 }, 5.0, 100.0], 166 165 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 ] 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 ] -
sasmodels/resolution.py
r190fc2b rfdc538a 5 5 """ 6 6 from __future__ import division 7 8 from scipy.special import erf9 from numpy import sqrt, log, log1010 import numpy as np11 7 12 8 __all__ = ["Resolution", "Perfect1D", "Pinhole1D", "Slit1D", … … 15 11 "interpolate", "linear_extrapolation", "geometric_extrapolation", 16 12 ] 13 14 from scipy.special import erf 15 from numpy import sqrt, log, log10 16 import numpy as np 17 17 18 18 MINIMUM_RESOLUTION = 1e-8 -
sasmodels/sesans.py
r190fc2b r384d114 43 43 *I* [cm$^{-1}$] is the value of the SANS model at *q* 44 44 """ 45 G = np.zeros _like(SElength, 'd')46 for i , SElength_i in enumerate(SElength):47 integr al = besselj(0, q*SElength_i)*Iq*q48 G[i] = np.sum(integr al)45 G = np.zeros(len(SElength), 'd') 46 for i in range(len(SElength)): 47 integr = besselj(0, q*SElength[i])*Iq*q 48 G[i] = np.sum(integr) 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.