Changeset 793d802 in sasmodels
- Timestamp:
- Aug 8, 2017 6:19:28 PM (7 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:
- cdf7dac
- Parents:
- 870a2f4 (diff), 997c9ca (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:
-
- 14 added
- 5 deleted
- 17 edited
- 8 moved
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/__init__.py
r79906d1 r997c9ca 14 14 defining new models. 15 15 """ 16 __version__ = "0.9 4"16 __version__ = "0.97" 17 17 18 18 def data_files(): -
sasmodels/modelinfo.py
rbb4b509 r724257c 722 722 parameters = make_parameter_table(getattr(kernel_module, 'parameters', [])) 723 723 demo = expand_pars(parameters, getattr(kernel_module, 'demo', None)) 724 filename = abspath(kernel_module.__file__) 724 filename = abspath(kernel_module.__file__).replace('.pyc', '.py') 725 725 kernel_id = splitext(basename(filename))[0] 726 726 name = getattr(kernel_module, 'name', None) … … 729 729 730 730 info.id = kernel_id # string used to load the kernel 731 info.filename = abspath(kernel_module.__file__)731 info.filename = filename 732 732 info.name = name 733 733 info.title = getattr(kernel_module, 'title', name+" model") -
sasmodels/sasview_model.py
r749a7d4 r724257c 15 15 import traceback 16 16 import logging 17 from os.path import basename, splitext 17 from os.path import basename, splitext, abspath, getmtime 18 18 import thread 19 19 … … 40 40 pass 41 41 42 logger = logging.getLogger(__name__) 43 42 44 calculation_lock = thread.allocate_lock() 43 45 46 #: True if pre-existing plugins, with the old names and parameters, should 47 #: continue to be supported. 44 48 SUPPORT_OLD_STYLE_PLUGINS = True 49 50 # TODO: separate x_axis_label from multiplicity info 51 MultiplicityInfo = collections.namedtuple( 52 'MultiplicityInfo', 53 ["number", "control", "choices", "x_axis_label"], 54 ) 55 56 #: set of defined models (standard and custom) 57 MODELS = {} # type: Dict[str, SasviewModelType] 58 #: custom model {path: model} mapping so we can check timestamps 59 MODEL_BY_PATH = {} # type: Dict[str, SasviewModelType] 60 61 def find_model(modelname): 62 # type: (str) -> SasviewModelType 63 """ 64 Find a model by name. If the model name ends in py, try loading it from 65 custom models, otherwise look for it in the list of builtin models. 66 """ 67 # TODO: used by sum/product model to load an existing model 68 # TODO: doesn't handle custom models properly 69 if modelname.endswith('.py'): 70 return load_custom_model(modelname) 71 elif modelname in MODELS: 72 return MODELS[modelname] 73 else: 74 raise ValueError("unknown model %r"%modelname) 75 76 77 # TODO: figure out how to say that the return type is a subclass 78 def load_standard_models(): 79 # type: () -> List[SasviewModelType] 80 """ 81 Load and return the list of predefined models. 82 83 If there is an error loading a model, then a traceback is logged and the 84 model is not returned. 85 """ 86 for name in core.list_models(): 87 try: 88 MODELS[name] = _make_standard_model(name) 89 except Exception: 90 logger.error(traceback.format_exc()) 91 if SUPPORT_OLD_STYLE_PLUGINS: 92 _register_old_models() 93 94 return list(MODELS.values()) 95 96 97 def load_custom_model(path): 98 # type: (str) -> SasviewModelType 99 """ 100 Load a custom model given the model path. 101 """ 102 model = MODEL_BY_PATH.get(path, None) 103 if model is not None and model.timestamp == getmtime(path): 104 #logger.info("Model already loaded %s", path) 105 return model 106 107 #logger.info("Loading model %s", path) 108 kernel_module = custom.load_custom_kernel_module(path) 109 if hasattr(kernel_module, 'Model'): 110 model = kernel_module.Model 111 # Old style models do not set the name in the class attributes, so 112 # set it here; this name will be overridden when the object is created 113 # with an instance variable that has the same value. 114 if model.name == "": 115 model.name = splitext(basename(path))[0] 116 if not hasattr(model, 'filename'): 117 model.filename = abspath(kernel_module.__file__).replace('.pyc', '.py') 118 if not hasattr(model, 'id'): 119 model.id = splitext(basename(model.filename))[0] 120 else: 121 model_info = modelinfo.make_model_info(kernel_module) 122 model = _make_model_from_info(model_info) 123 model.timestamp = getmtime(path) 124 125 # If a model name already exists and we are loading a different model, 126 # use the model file name as the model name. 127 if model.name in MODELS and not model.filename == MODELS[model.name].filename: 128 _previous_name = model.name 129 model.name = model.id 130 131 # If the new model name is still in the model list (for instance, 132 # if we put a cylinder.py in our plug-in directory), then append 133 # an identifier. 134 if model.name in MODELS and not model.filename == MODELS[model.name].filename: 135 model.name = model.id + '_user' 136 logger.info("Model %s already exists: using %s [%s]", 137 _previous_name, model.name, model.filename) 138 139 MODELS[model.name] = model 140 MODEL_BY_PATH[path] = model 141 return model 142 143 144 def _make_standard_model(name): 145 # type: (str) -> SasviewModelType 146 """ 147 Load the sasview model defined by *name*. 148 149 *name* can be a standard model name or a path to a custom model. 150 151 Returns a class that can be used directly as a sasview model. 152 """ 153 kernel_module = generate.load_kernel_module(name) 154 model_info = modelinfo.make_model_info(kernel_module) 155 return _make_model_from_info(model_info) 156 45 157 46 158 def _register_old_models(): … … 60 172 import sas.models 61 173 from sasmodels.conversion_table import CONVERSION_TABLE 62 for new_name, conversion in CONVERSION_TABLE.get((3, 1,2), {}).items():174 for new_name, conversion in CONVERSION_TABLE.get((3, 1, 2), {}).items(): 63 175 # CoreShellEllipsoidModel => core_shell_ellipsoid:1 64 176 new_name = new_name.split(':')[0] … … 69 181 setattr(sas.models, old_path, ConstructedModule) 70 182 sys.modules[old_path] = ConstructedModule 71 72 73 # TODO: separate x_axis_label from multiplicity info74 MultiplicityInfo = collections.namedtuple(75 'MultiplicityInfo',76 ["number", "control", "choices", "x_axis_label"],77 )78 79 MODELS = {}80 def find_model(modelname):81 # type: (str) -> SasviewModelType82 """83 Find a model by name. If the model name ends in py, try loading it from84 custom models, otherwise look for it in the list of builtin models.85 """86 # TODO: used by sum/product model to load an existing model87 # TODO: doesn't handle custom models properly88 if modelname.endswith('.py'):89 return load_custom_model(modelname)90 elif modelname in MODELS:91 return MODELS[modelname]92 else:93 raise ValueError("unknown model %r"%modelname)94 95 96 # TODO: figure out how to say that the return type is a subclass97 def load_standard_models():98 # type: () -> List[SasviewModelType]99 """100 Load and return the list of predefined models.101 102 If there is an error loading a model, then a traceback is logged and the103 model is not returned.104 """105 models = []106 for name in core.list_models():107 try:108 MODELS[name] = _make_standard_model(name)109 models.append(MODELS[name])110 except Exception:111 logging.error(traceback.format_exc())112 if SUPPORT_OLD_STYLE_PLUGINS:113 _register_old_models()114 115 return models116 117 118 def load_custom_model(path):119 # type: (str) -> SasviewModelType120 """121 Load a custom model given the model path.122 """123 kernel_module = custom.load_custom_kernel_module(path)124 try:125 model = kernel_module.Model126 # Old style models do not set the name in the class attributes, so127 # set it here; this name will be overridden when the object is created128 # with an instance variable that has the same value.129 if model.name == "":130 model.name = splitext(basename(path))[0]131 if not hasattr(model, 'filename'):132 model.filename = kernel_module.__file__133 # For old models, treat .pyc and .py files interchangeably.134 # This is needed because of the Sum|Multi(p1,p2) types of models135 # and the convoluted way in which they are created.136 if model.filename.endswith(".py"):137 logging.info("Loading %s as .pyc", model.filename)138 model.filename = model.filename+'c'139 if not hasattr(model, 'id'):140 model.id = splitext(basename(model.filename))[0]141 except AttributeError:142 model_info = modelinfo.make_model_info(kernel_module)143 model = _make_model_from_info(model_info)144 145 # If a model name already exists and we are loading a different model,146 # use the model file name as the model name.147 if model.name in MODELS and not model.filename == MODELS[model.name].filename:148 _previous_name = model.name149 model.name = model.id150 151 # If the new model name is still in the model list (for instance,152 # if we put a cylinder.py in our plug-in directory), then append153 # an identifier.154 if model.name in MODELS and not model.filename == MODELS[model.name].filename:155 model.name = model.id + '_user'156 logging.info("Model %s already exists: using %s [%s]", _previous_name, model.name, model.filename)157 158 MODELS[model.name] = model159 return model160 161 162 def _make_standard_model(name):163 # type: (str) -> SasviewModelType164 """165 Load the sasview model defined by *name*.166 167 *name* can be a standard model name or a path to a custom model.168 169 Returns a class that can be used directly as a sasview model.170 """171 kernel_module = generate.load_kernel_module(name)172 model_info = modelinfo.make_model_info(kernel_module)173 return _make_model_from_info(model_info)174 183 175 184 … … 283 292 284 293 #: names of the orientation parameters in the order they appear 285 orientation_params = None # type: Sequence[str]294 orientation_params = None # type: List[str] 286 295 #: names of the magnetic parameters in the order they appear 287 magnetic_params = None # type: Sequence[str]296 magnetic_params = None # type: List[str] 288 297 #: names of the fittable parameters 289 fixed = None # type: Sequence[str]298 fixed = None # type: List[str] 290 299 # TODO: the attribute fixed is ill-named 291 300 … … 611 620 ## to calculate_Iq 612 621 #if calculation_lock.locked(): 613 # logg ing.info("calculation waiting for another thread to complete")614 # logg ing.info("\n".join(traceback.format_stack()))622 # logger.info("calculation waiting for another thread to complete") 623 # logger.info("\n".join(traceback.format_stack())) 615 624 616 625 with calculation_lock: -
.gitignore
r8a5f021 rc26897a 11 11 /doc/api/ 12 12 /doc/model/ 13 /doc/ ref/models13 /doc/guide/models 14 14 .mplconfig 15 15 /pylint_violations.txt -
doc/conf.py
r39674a0 r8ae8532 42 42 ] 43 43 44 # Redirect mathjax to a different CDN 45 mathjax_path = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML" 46 44 47 # Add any paths that contain templates here, relative to this directory. 45 48 templates_path = ['_templates'] -
doc/developer/calculator.rst
re822c97 r870a2f4 1 1 .. currentmodule:: sasmodels 2 3 .. _Calculator_Interface: 2 4 3 5 Calculator Interface … … 7 9 model calculator which implements the polydispersity and magnetic SLD 8 10 calculations. There are three separate implementations of this layer, 9 *kernelcl.py*for OpenCL, which operates on a single Q value at a time,10 *kerneldll.c*for the DLL, which loops over a vector of Q values, and11 *kernelpy.py*for python models which operates on vector Q values.11 :mod:`kernelcl` for OpenCL, which operates on a single Q value at a time, 12 :mod:`kerneldll` for the DLL, which loops over a vector of Q values, and 13 :mod:`kernelpy` for python models which operates on vector Q values. 12 14 13 15 Each implementation provides three different calls *Iq*, *Iqxy* and *Imagnetic* -
doc/developer/index.rst
rb85be2d r2e66ef5 7 7 :maxdepth: 4 8 8 9 overview.rst 9 10 calculator.rst -
doc/genapi.py
ra5b8477 r2e66ef5 2 2 import os.path 3 3 4 MODULE_TEMPLATE =""".. Autogenerated by genmods.py4 MODULE_TEMPLATE = """.. Autogenerated by genmods.py 5 5 6 6 ****************************************************************************** … … 19 19 """ 20 20 21 INDEX_TEMPLATE =""".. Autogenerated by genmods.py21 INDEX_TEMPLATE = """.. Autogenerated by genmods.py 22 22 23 23 .. _api-index: … … 46 46 os.makedirs(dir) 47 47 48 for module, name in modules:49 with open(os.path.join(dir, module+'.rst'), 'w') as f:48 for module, name in modules: 49 with open(os.path.join(dir, module+'.rst'), 'w') as f: 50 50 f.write(MODULE_TEMPLATE%locals()) 51 51 52 rsts = "\n ".join(module+'.rst' for module, name in modules)53 with open(os.path.join(dir, 'index.rst'),'w') as f:52 rsts = "\n ".join(module+'.rst' for module, name in modules) 53 with open(os.path.join(dir, 'index.rst'), 'w') as f: 54 54 f.write(INDEX_TEMPLATE%locals()) 55 55 56 56 57 modules =[58 #('__init__', 'Top level namespace'),57 modules = [ 58 ('__init__', 'Sasmodels package'), 59 59 #('alignment', 'GPU data alignment [unused]'), 60 60 ('bumps_model', 'Bumps interface'), 61 ('compare_many', 'Batch compare models on different compute engines'), 61 62 ('compare', 'Compare models on different compute engines'), 62 63 ('convert', 'Sasview to sasmodel converter'), … … 66 67 ('direct_model', 'Simple interface'), 67 68 ('exception', 'Annotate exceptions'), 68 #('frozendict', 'Freeze a dictionary to make it immutable'),69 69 ('generate', 'Model parser'), 70 70 ('kernel', 'Evaluator type definitions'), … … 79 79 ('resolution', '1-D resolution functions'), 80 80 ('resolution2d', '2-D resolution functions'), 81 ('rst2html', 'Convert doc strings the web pages'), 81 82 ('sasview_model', 'Sasview interface'), 82 83 ('sesans', 'SESANS calculation routines'), 83 #('transition', 'Model stepper for automatic model selection'),84 84 ('weights', 'Distribution functions'), 85 85 ] 86 package ='sasmodels'87 package_name ='Reference'86 package = 'sasmodels' 87 package_name = 'Reference' 88 88 genfiles(package, package_name, modules) -
doc/gentoc.py
r40a87fa r990d8df 16 16 from sasmodels.modelinfo import ModelInfo 17 17 18 TEMPLATE ="""\18 TEMPLATE = """\ 19 19 .. 20 20 Generated from doc/gentoc.py -- DO NOT EDIT -- … … 30 30 """ 31 31 32 MODEL_TOC_PATH = " ref/models"32 MODEL_TOC_PATH = "guide/models" 33 33 34 34 def _make_category(category_name, label, title, parent=None): … … 65 65 # assume model is in sasmodels/models/name.py, and ignore the full path 66 66 model_name = basename(item)[:-3] 67 if model_name.startswith('_'): continue 67 if model_name.startswith('_'): 68 continue 68 69 model_info = load_model_info(model_name) 69 70 if model_info.category is None: 70 71 print("Missing category for", item, file=sys.stderr) 71 72 else: 72 category.setdefault(model_info.category, []).append(model_name)73 category.setdefault(model_info.category, []).append(model_name) 73 74 74 75 # Check category names 75 for k, v in category.items():76 for k, v in category.items(): 76 77 if len(v) == 1: 77 print("Category %s contains only %s"%(k, v[0]), file=sys.stderr)78 print("Category %s contains only %s"%(k, v[0]), file=sys.stderr) 78 79 79 80 # Generate category files for the table of contents. … … 86 87 # alphabetical order before them. 87 88 88 if not exists(MODEL_TOC_PATH): mkdir(MODEL_TOC_PATH) 89 if not exists(MODEL_TOC_PATH): 90 mkdir(MODEL_TOC_PATH) 89 91 model_toc = _make_category( 90 'index', 92 'index', 'Models', 'Model Functions') 91 93 #shape_toc = _make_category( 92 94 # 'shape', 'Shapes', 'Shape Functions', model_toc) 93 95 free_toc = _make_category( 94 'shape-independent', 96 'shape-independent', 'Shape-independent', 95 97 'Shape-Independent Functions') 96 98 struct_toc = _make_category( 97 'structure-factor', 98 custom_toc = _make_category(99 'custom-models','Custom-models', 'Custom Models')99 'structure-factor', 'Structure-factor', 'Structure Factors') 100 #custom_toc = _make_category( 101 # 'custom-models', 'Custom-models', 'Custom Models') 100 102 101 103 # remember to top level categories … … 105 107 'shape-independent':free_toc, 106 108 'structure-factor': struct_toc, 107 'custom': custom_toc,109 #'custom': custom_toc, 108 110 } 109 111 110 112 # Process the model lists 111 for k, v in sorted(category.items()):113 for k, v in sorted(category.items()): 112 114 if ':' in k: 113 cat, subcat = k.split(':')115 cat, subcat = k.split(':') 114 116 _maybe_make_category(cat, v, cat_files, model_toc) 115 117 cat_file = cat_files[cat] 116 label = "-".join((cat, subcat))118 label = "-".join((cat, subcat)) 117 119 filename = label 118 title = subcat.capitalize() +" Functions"120 title = subcat.capitalize() + " Functions" 119 121 sub_toc = _make_category(filename, label, title, cat_file) 120 122 for model in sorted(v): … … 130 132 _add_subcategory('shape-independent', model_toc) 131 133 _add_subcategory('structure-factor', model_toc) 132 _add_subcategory('custom-models', model_toc)134 #_add_subcategory('custom-models', model_toc) 133 135 134 136 # Close the top-level category files 135 137 #model_toc.close() 136 for f in cat_files.values(): f.close() 138 for f in cat_files.values(): 139 f.close() 137 140 138 141 -
doc/guide/index.rst
rbb6f0f3 r2e66ef5 1 ********** 2 SAS Models 3 ********** 1 **************** 2 SAS Models Guide 3 **************** 4 4 5 Small angle X-ray and Neutron (SAXS and SANS) scattering examines the 6 scattering patterns produced by a beam travelling through the sample 7 and scattering at low angles. The scattering is computed as a function 8 of $q_x$ and $q_y$, which for a given beam wavelength corresponds to 9 particular scattering angles. Each pixel on the detector corresponds to 10 a different scattering angle. If the sample is unoriented, the scattering 11 pattern will appear as rings on the detector. In this case, a circular 12 average can be taken with 1-dimension data at $q = \surd (q_x^2 + q_y^2)$ 13 compared to the orientationally averaged SAS scattering pattern. 5 .. toctree:: 6 :numbered: 4 7 :maxdepth: 4 14 8 15 Models have certain features in common. 16 17 Every model has a *scale* and a *background*. 18 19 Talk about orientation, with diagrams for orientation so that we don't need 20 a link on every model page? 21 22 .. _orientation: 23 24 .. figure: img/orientation1.jpg 25 26 Orientation in 3D 27 28 .. figure: img/orientation2.jpg 29 30 Orientation cross sections 31 32 Talk about polydispersity. 33 34 Talk about magnetism, converting the magnetism help file to inline text here, 35 with links so that models can point back to it. 36 37 Need to talk about structure factors even though we don't have any 38 implemented yet. 9 intro.rst 10 install.rst 11 pd/polydispersity.rst 12 resolution.rst 13 magnetism/magnetism.rst 14 sesans/sans_to_sesans.rst 15 sesans/sesans_fitting.rst 16 plugin.rst 17 scripting.rst 18 refs.rst -
doc/guide/magnetism/magnetism.rst
rdeb854f r990d8df 2 2 3 3 Polarisation/Magnetic Scattering 4 ================================ =======================4 ================================ 5 5 6 In earlier versions of SasView magnetic scattering was implemented in just five 7 (2D) models 8 9 * :ref:`sphere` 10 * :ref:`core-shell-sphere` 11 * :ref:`core-multi-shell` 12 * :ref:`cylinder` 13 * :ref:`parallelepiped` 14 15 From SasView 4.x it is implemented on most models in the 'shape' category. 16 17 In general, the scattering length density (SLD = $\beta$) in each region where the 18 SLD is uniform, is a combination of the nuclear and magnetic SLDs and, for polarised 19 neutrons, also depends on the spin states of the neutrons. 6 Models which define a scattering length density parameter can be evaluated 7 as magnetic models. In general, the scattering length density (SLD = 8 $\beta$) in each region where the SLD is uniform, is a combination of the 9 nuclear and magnetic SLDs and, for polarised neutrons, also depends on the 10 spin states of the neutrons. 20 11 21 12 For magnetic scattering, only the magnetization component $\mathbf{M_\perp}$ … … 98 89 .. note:: 99 90 This help document was last changed by Steve King, 02May2015 91 92 * Document History * 93 94 | 2017-05-08 Paul Kienzle -
doc/guide/sesans/sesans_fitting.rst
r3330bb4 r8ae8532 7 7 =================== 8 8 9 .. note:: A proper installation of the developers setup of SasView (http://trac.sasview.org/wiki/AnacondaSetup) is a prerequisite for using these instructions. 9 .. note:: 10 11 A proper installation of the developers setup of SasView 12 (http://trac.sasview.org/wiki/AnacondaSetup) is a prerequisite for 13 using these instructions. 10 14 11 15 It is possible to fit SESANS measurements from the command line in Python. … … 13 17 Simple Fits 14 18 ........... 15 In the folder sasmodels/example the file sesans_sphere_2micron.py gives an example of how to fit a shape to a measurement. 19 In the folder sasmodels/example the file sesans_sphere_2micron.py gives 20 an example of how to fit a shape to a measurement. 16 21 17 22 The command:: … … 23 28 .. image:: sesans_img/SphereLineFitSasView.png 24 29 25 All the parameters and names in sesans_sphere_2micron.py (shown below) can be adjusted to fit your own problem:: 30 All the parameters and names in sesans_sphere_2micron.py (shown below) can 31 be adjusted to fit your own problem:: 26 32 27 33 """ … … 64 70 # Constraints 65 71 # model.param_name = f(other params) 66 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius and scale are model functions and phi is67 # a custom parameter72 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius 73 # and scale are model functions and phi is a custom parameter 68 74 model.scale = phi*(1-phi) 69 75 … … 74 80 Incorporating a Structure Factor 75 81 ................................ 76 An example of how to also include a structure factor can be seen in the following example taken from Washington et al., 77 *Soft Matter*\, (2014), 10, 3016 (dx.doi.org/10.1039/C3SM53027B). These are time-of-flight measurements, which is the 78 reason that not the polarisation is plotted, but the :math:`\frac{log(P/P_0)}{\lambda^2}` . The sample is a dispersion 79 of core-shell colloids at a high volume fraction with hard sphere interactions. 82 An example of how to also include a structure factor can be seen in the 83 following example taken from Washington et al., *Soft Matter*\, (2014), 10, 3016 84 (dx.doi.org/10.1039/C3SM53027B). These are time-of-flight measurements, which 85 is the reason that not the polarisation is plotted, but the 86 :math:`\frac{log(P/P_0)}{\lambda^2}` . The sample is a dispersion of 87 core-shell colloids at a high volume fraction with hard sphere interactions. 80 88 81 89 The fit can be started by:: … … 87 95 .. image:: sesans_img/HardSphereLineFitSasView.png 88 96 89 The code sesans_parameters_css-hs.py can then be used as a template for a fitting problem with a structure factor:: 97 The code sesans_parameters_css-hs.py can then be used as a template for a 98 fitting problem with a structure factor:: 90 99 91 100 """ … … 131 140 # Constraints 132 141 # model.param_name = f(other params) 133 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius and scale are model functions and phi is134 # a custom parameter142 # EXAMPLE: model.scale = model.radius*model.radius*(1 - phi) - where radius 143 # and scale are model functions and phi is a custom parameter 135 144 model.scale = phi*(1-phi) 136 145 model.volfraction = phi -
doc/index.rst
r7bb290c r8ae8532 1 Introduction 2 ============ 1 sasmodels 2 ========= 3 Small angle X-ray and Neutron scattering (SAXS and SANS) examines the 4 scattering patterns produced by a beam travelling through the sample 5 and scattering at low angles. The scattering is computed as a function 6 of reciprocal space $q$, which arises from a combination of beam wavelength 7 and scattering angles. Each pixel on the detector corresponds to 8 a different scattering angle, and has a distinct $q_x$ and $q_y$. If the 9 sample is unoriented, the scattering pattern will appear as rings on the 10 detector. In this case, a circular average can be taken with 1-dimension 11 data at $q = \surd (q_x^2 + q_y^2)$ compared to the orientationally 12 averaged SAS scattering pattern. 13 3 14 The sasmodels package provides theory functions for small angle scattering 4 calculations. 15 calculations for different shapes, including the effects of resolution, 16 polydispersity and orientational dispersion. 5 17 6 18 .. htmlonly:: … … 15 27 16 28 guide/index.rst 29 guide/models/index.rst 17 30 developer/index.rst 18 ref/index.rst19 ref/models/index.rst20 31 api/index.rst 21 32 … … 28 39 .. htmlonly:: 29 40 * :ref:`search` 30 31 32 33 34 35 -
example/model.py
r1182da5 r2e66ef5 17 17 model = Model(kernel, 18 18 scale=0.08, 19 r _polar=15, r_equatorial=800,19 radius_polar=15, radius_equatorial=800, 20 20 sld=.291, sld_solvent=7.105, 21 21 background=0, 22 22 theta=90, phi=0, 23 23 theta_pd=15, theta_pd_n=40, theta_pd_nsigma=3, 24 r _polar_pd=0.222296, r_polar_pd_n=1, r_polar_pd_nsigma=0,25 r _equatorial_pd=.000128, r_equatorial_pd_n=1, r_equatorial_pd_nsigma=0,24 radius_polar_pd=0.222296, radius_polar_pd_n=1, radius_polar_pd_nsigma=0, 25 radius_equatorial_pd=.000128, radius_equatorial_pd_n=1, radius_equatorial_pd_nsigma=0, 26 26 phi_pd=0, phi_pd_n=20, phi_pd_nsigma=3, 27 27 ) 28 28 29 29 # SET THE FITTING PARAMETERS 30 model.r _polar.range(15, 1000)31 model.r _equatorial.range(15, 1000)30 model.radius_polar.range(15, 1000) 31 model.radius_equatorial.range(15, 1000) 32 32 model.theta_pd.range(0, 360) 33 33 model.background.range(0,1000) -
sasmodels/alignment.py
r7ae2b7f r870a2f4 42 42 view[:] = x 43 43 return view 44 -
sasmodels/core.py
r650c6d2 r2e66ef5 117 117 Load model info and build model. 118 118 119 *model_name* is the name of the model as used by :func:`load_model_info`. 120 Additional keyword arguments are passed directly to :func:`build_model`. 119 *model_name* is the name of the model, or perhaps a model expression 120 such as sphere*hardsphere or sphere+cylinder. 121 122 *dtype* and *platform* are given by :func:`build_model`. 121 123 """ 122 124 return build_model(load_model_info(model_name), … … 128 130 """ 129 131 Load a model definition given the model name. 132 133 *model_name* is the name of the model, or perhaps a model expression 134 such as sphere*hardsphere or sphere+cylinder. 130 135 131 136 This returns a handle to the module defining the model. This can be … … 227 232 228 233 Possible types include 'half', 'single', 'double' and 'quad'. If the 229 type is 'fast', then this is equivalent to dtype 'single' with the 230 fast flag set to True. 234 type is 'fast', then this is equivalent to dtype 'single' but using 235 fast native functions rather than those with the precision level guaranteed 236 by the OpenCL standard. 237 238 Platform preference can be specfied ("ocl" vs "dll"), with the default 239 being OpenCL if it is availabe. If the dtype name ends with '!' then 240 platform is forced to be DLL rather than OpenCL. 241 242 This routine ignores the preferences within the model definition. This 243 is by design. It allows us to test models in single precision even when 244 we have flagged them as requiring double precision so we can easily check 245 the performance on different platforms without having to change the model 246 definition. 231 247 """ 232 248 # Assign default platform, overriding ocl with dll if OpenCL is unavailable -
sasmodels/models/multilayer_vesicle.py
r5d23de2 r870a2f4 71 71 sufficiently fine grained in certain cases. Please report any such occurences 72 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 73 74 - Start with the best possible guess 75 - Using a priori knowledge, hold as many parameters fixed as possible 76 - if N=1, tw (water thickness) must by definition be zero. Both N and tw should 76 77 be fixed during fitting. 77 *If N>1, use constraints to keep N > 178 *Because N only really moves in integer steps, it may get "stuck" if the78 - If N>1, use constraints to keep N > 1 79 - Because N only really moves in integer steps, it may get "stuck" if the 79 80 optimizer step size is too small so care should be taken 80 81 If you experience problems with this please contact the SasView team and let -
sasmodels/resolution.py
rb32caab r990d8df 437 437 .. math:: 438 438 439 \log \Delta q = (\log q_n - log q_1) / (n - 1)439 \log \Delta q = (\log q_n - \log q_1) / (n - 1) 440 440 441 441 From this we can compute the number of steps required to extend $q$ … … 451 451 452 452 n_\text{extend} = (n-1) (\log q_\text{max} - \log q_n) 453 / (\log q_n - log q_1)453 / (\log q_n - \log q_1) 454 454 """ 455 455 q = np.sort(q) … … 459 459 log_delta_q = log(10.) / points_per_decade 460 460 if q_min < q[0]: 461 if q_min < 0: q_min = q[0]*MINIMUM_ABSOLUTE_Q 461 if q_min < 0: 462 q_min = q[0]*MINIMUM_ABSOLUTE_Q 462 463 n_low = log_delta_q * (log(q[0])-log(q_min)) 463 464 q_low = np.logspace(log10(q_min), log10(q[0]), np.ceil(n_low)+1)[:-1] -
sasmodels/rst2html.py
rf2f5413 r870a2f4 38 38 - mathml 39 39 - mathjax 40 See ` http://docutils.sourceforge.net/docs/user/config.html#math-output`_40 See `<http://docutils.sourceforge.net/docs/user/config.html#math-output>`_ 41 41 for details. 42 42 … … 176 176 from PyQt5.QtCore import QUrl 177 177 except ImportError: 178 from PyQt4.QtWeb kit import QWebView178 from PyQt4.QtWebKit import QWebView 179 179 from PyQt4.QtCore import QUrl 180 180 helpView = QWebView() … … 204 204 from PyQt5.QtCore import QUrl 205 205 except ImportError: 206 from PyQt4.QtWeb kit import QWebView206 from PyQt4.QtWebKit import QWebView 207 207 from PyQt4.QtCore import QUrl 208 208 frame = QWebView() … … 211 211 sys.exit(app.exec_()) 212 212 213 def can_use_qt(): 214 """ 215 Return True if QWebView exists. 216 217 Checks first in PyQt5 then in PyQt4 218 """ 219 try: 220 from PyQt5.QtWebKitWidgets import QWebView 221 return True 222 except ImportError: 223 try: 224 from PyQt4.QtWebKit import QWebView 225 return True 226 except ImportError: 227 return False 228 213 229 def view_help(filename, qt=False): 214 230 import os 215 url="file:///"+os.path.abspath(filename).replace("\\","/") 231 232 if qt: 233 qt = can_use_qt() 234 235 url = "file:///"+os.path.abspath(filename).replace("\\", "/") 216 236 if filename.endswith('.rst'): 217 237 html = load_rst_as_html(filename)
Note: See TracChangeset
for help on using the changeset viewer.