Changes in / [9acade6:5fd684d] in sasmodels
 Location:
 sasmodels
 Files:

 2 edited
Legend:
 Unmodified
 Added
 Removed

sasmodels/sasview_model.py
r9c1a59c r3bcb88c 565 565 parameters = self._model_info.parameters 566 566 pairs = [self._get_weights(p) for p in parameters.call_parameters] 567 #weights.plot_weights(self._model_info, pairs)568 567 call_details, values, is_magnetic = make_kernel_args(calculator, pairs) 569 568 #call_details.show() … … 619 618 # remember them is kind of funky. 620 619 # Note: can't seem to get disperser parameters from sasview 621 # (1) Could create a sasview model that has not yet been620 # (1) Could create a sasview model that has not yet # been 622 621 # converted, assign the disperser to one of its polydisperse 623 622 # parameters, then retrieve the disperser parameters from the 624 # sasview model. 625 # (2) Could write a disperser parameter retriever in sasview.626 # (3) Could modify sasview to use sasmodels.weightsdispersers.623 # sasview model. (2) Could write a disperser parameter retriever 624 # in sasview. (3) Could modify sasview to use sasmodels.weights 625 # dispersers. 627 626 # For now, rely on the fact that the sasview only ever uses 628 627 # new dispersers in the set_dispersion call and create a new 629 628 # one instead of trying to assign parameters. 629 dispersion = weights.MODELS[dispersion.type]() 630 630 self.dispersion[parameter] = dispersion.get_pars() 631 631 else: … … 658 658 elif par.polydisperse: 659 659 dis = self.dispersion[par.name] 660 if dis['type'] == 'array': 661 value, weight = dis['values'], dis['weights'] 662 else: 663 value, weight = weights.get_weights( 664 dis['type'], dis['npts'], dis['width'], dis['nsigmas'], 665 self.params[par.name], par.limits, par.relative_pd) 660 value, weight = weights.get_weights( 661 dis['type'], dis['npts'], dis['width'], dis['nsigmas'], 662 self.params[par.name], par.limits, par.relative_pd) 666 663 return value, weight / np.sum(weight) 667 664 else: 
sasmodels/weights.py
r6cefbc9 rfa800e72 3 3 """ 4 4 # TODO: include dispersion docs with the disperser models 5 from __future__ import division, print_function6 7 5 from math import sqrt # type: ignore 8 from collections import OrderedDict9 10 6 import numpy as np # type: ignore 11 7 from scipy.special import gammaln # type: ignore … … 58 54 else: 59 55 return np.array([], 'd'), np.array([], 'd') 60 x, px = self._weights(center, sigma, lb, ub) 61 return x, px 56 return self._weights(center, sigma, lb, ub) 62 57 63 58 def _weights(self, center, sigma, lb, ub): … … 84 79 default = dict(npts=35, width=0, nsigmas=3) 85 80 def _weights(self, center, sigma, lb, ub): 86 # TODO: sample high probability regions more densely87 # i.e., step uniformly in cumulative density rather than x value88 # so weight = 1/Npts for all weights, but values are unevenly spaced89 81 x = self._linspace(center, sigma, lb, ub) 90 82 px = np.exp((xcenter)**2 / (2.0 * sigma * sigma)) … … 173 165 174 166 def _weights(self, center, sigma, lb, ub): 175 # TODO: rebin the array dispersion using npts 176 # TODO: use a distribution that can be recentered and scaled 177 x = self.values 178 #x = center + self.values*sigma 167 # TODO: interpolate into the array dispersion using npts 168 x = center + self.values*sigma 179 169 idx = (x >= lb) & (x <= ub) 180 170 x = x[idx] … … 184 174 185 175 # dispersion name > disperser lookup table. 186 # Maintain order since this is used by sasview GUI to order the options in 187 # the dispersion type combobox. 188 MODELS = OrderedDict((d.type, d) for d in ( 189 RectangleDispersion, 190 ArrayDispersion, 191 LogNormalDispersion, 192 GaussianDispersion, 193 SchulzDispersion, 176 MODELS = dict((d.type, d) for d in ( 177 GaussianDispersion, RectangleDispersion, 178 ArrayDispersion, SchulzDispersion, LogNormalDispersion 194 179 )) 195 180 … … 209 194 *value* is the value of the parameter in the model. 210 195 211 *limits* is [lb, ub], the lower and upper bound o n the possible values.196 *limits* is [lb, ub], the lower and upper bound of the weight value. 212 197 213 198 *relative* is true if *width* is defined in proportion to the value … … 216 201 Returns *(value, weight)*, where *value* and *weight* are vectors. 217 202 """ 218 if disperser == "array":219 raise NotImplementedError("Don't handle arrays through get_weights; use values and weights directly")220 203 cls = MODELS[disperser] 221 204 obj = cls(n, width, nsigmas) 222 205 v, w = obj.get_weights(value, limits[0], limits[1], relative) 223 206 return v, w 224 225 226 def plot_weights(model_info, pairs):227 # type: (ModelInfo, List[Tuple[np.ndarray, np.ndarray]]) > None228 """229 Plot the weights returned by :func:`get_weights`.230 231 *model_info* is232 :param model_info:233 :param pairs:234 :return:235 """236 import pylab237 238 if any(len(values)>1 for values, weights in pairs):239 labels = [p.name for p in model_info.parameters.call_parameters]240 pylab.interactive(True)241 pylab.figure()242 for (v,w), s in zip(pairs, labels):243 if len(v) > 1:244 #print("weights for", s, v, w)245 pylab.plot(v, w, 'o', label=s)246 pylab.grid(True)247 pylab.legend()
Note: See TracChangeset
for help on using the changeset viewer.