Changeset 6d6508e in sasmodels for sasmodels/direct_model.py
- Timestamp:
- Apr 7, 2016 4:57:33 PM (8 years ago)
- Branches:
- master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- d2fc9a4
- Parents:
- 3707eee
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/direct_model.py
ree8f734 r6d6508e 25 25 import numpy as np 26 26 27 from .core import call_kernel, call_ER_VR28 27 from . import sesans 28 from . import weights 29 29 from . import resolution 30 30 from . import resolution2d 31 from . import details 32 33 34 def call_kernel(kernel, pars, cutoff=0, mono=False): 35 """ 36 Call *kernel* returned from *model.make_kernel* with parameters *pars*. 37 38 *cutoff* is the limiting value for the product of dispersion weights used 39 to perform the multidimensional dispersion calculation more quickly at a 40 slight cost to accuracy. The default value of *cutoff=0* integrates over 41 the entire dispersion cube. Using *cutoff=1e-5* can be 50% faster, but 42 with an error of about 1%, which is usually less than the measurement 43 uncertainty. 44 45 *mono* is True if polydispersity should be set to none on all parameters. 46 """ 47 parameters = kernel.info.parameters 48 if mono: 49 active = lambda name: False 50 elif kernel.dim == '1d': 51 active = lambda name: name in parameters.pd_1d 52 elif kernel.dim == '2d': 53 active = lambda name: name in parameters.pd_2d 54 else: 55 active = lambda name: True 56 57 vw_pairs = [(get_weights(p, pars) if active(p.name) 58 else ([pars.get(p.name, p.default)], [])) 59 for p in parameters.call_parameters] 60 61 call_details, weights, values = details.build_details(kernel, vw_pairs) 62 return kernel(call_details, weights, values, cutoff) 63 64 def get_weights(parameter, values): 65 """ 66 Generate the distribution for parameter *name* given the parameter values 67 in *pars*. 68 69 Uses "name", "name_pd", "name_pd_type", "name_pd_n", "name_pd_sigma" 70 from the *pars* dictionary for parameter value and parameter dispersion. 71 """ 72 value = float(values.get(parameter.name, parameter.default)) 73 relative = parameter.relative_pd 74 limits = parameter.limits 75 disperser = values.get(parameter.name+'_pd_type', 'gaussian') 76 npts = values.get(parameter.name+'_pd_n', 0) 77 width = values.get(parameter.name+'_pd', 0.0) 78 nsigma = values.get(parameter.name+'_pd_nsigma', 3.0) 79 if npts == 0 or width == 0: 80 return [value], [] 81 value, weight = weights.get_weights( 82 disperser, npts, width, nsigma, value, limits, relative) 83 return value, weight / np.sum(weight) 31 84 32 85 class DataMixin(object): … … 80 133 q_mono = sesans.make_all_q(data) 81 134 elif self.data_type == 'Iqxy': 82 #if not model.info ['parameters'].has_2d:135 #if not model.info.parameters.has_2d: 83 136 # raise ValueError("not 2D without orientation or magnetic parameters") 84 137 q = np.sqrt(data.qx_data**2 + data.qy_data**2) … … 211 264 def __call__(self, **pars): 212 265 return self._calc_theory(pars, cutoff=self.cutoff) 213 214 def ER_VR(self, **pars):215 """216 Compute the equivalent radius and volume ratio for the model.217 """218 return call_ER_VR(self.model.info, pars)219 266 220 267 def simulate_data(self, noise=None, **pars):
Note: See TracChangeset
for help on using the changeset viewer.