Changes in / [1657e21:2015f02] in sasmodels
- Files:
-
- 5 deleted
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/guide/pd/polydispersity.rst
ra5cb9bc rd089a00 11 11 -------------------------------------------- 12 12 13 For some models we can calculate the average intensity for a population of 14 particles that possess size and/or orientational (ie, angular) distributions. 15 In SasView we call the former *polydispersity* but use the parameter *PD* to 16 parameterise both. In other words, the meaning of *PD* in a model depends on 13 For some models we can calculate the average intensity for a population of 14 particles that possess size and/or orientational (ie, angular) distributions. 15 In SasView we call the former *polydispersity* but use the parameter *PD* to 16 parameterise both. In other words, the meaning of *PD* in a model depends on 17 17 the actual parameter it is being applied too. 18 18 19 The resultant intensity is then normalized by the average particle volume such 19 The resultant intensity is then normalized by the average particle volume such 20 20 that 21 21 … … 24 24 P(q) = \text{scale} \langle F^* F \rangle / V + \text{background} 25 25 26 where $F$ is the scattering amplitude and $\langle\cdot\rangle$ denotes an 26 where $F$ is the scattering amplitude and $\langle\cdot\rangle$ denotes an 27 27 average over the distribution $f(x; \bar x, \sigma)$, giving 28 28 29 29 .. math:: 30 30 31 P(q) = \frac{\text{scale}}{V} \int_\mathbb{R} 31 P(q) = \frac{\text{scale}}{V} \int_\mathbb{R} 32 32 f(x; \bar x, \sigma) F^2(q, x)\, dx + \text{background} 33 33 34 34 Each distribution is characterized by a center value $\bar x$ or 35 35 $x_\text{med}$, a width parameter $\sigma$ (note this is *not necessarily* 36 the standard deviation, so read the description carefully), the number of 37 sigmas $N_\sigma$ to include from the tails of the distribution, and the 38 number of points used to compute the average. The center of the distribution 39 is set by the value of the model parameter. The meaning of a polydispersity 40 parameter *PD* (not to be confused with a molecular weight distributions 41 in polymer science) in a model depends on the type of parameter it is being 42 applied too. 43 44 The distribution width applied to *volume* (ie, shape-describing) parameters 45 is relative to the center value such that $\sigma = \mathrm{PD} \cdot \bar x$. 46 However, the distribution width applied to *orientation* (ie, angle-describing) 47 parameters is just $\sigma = \mathrm{PD}$. 36 the standard deviation, so read the description of the distribution carefully), 37 the number of sigmas $N_\sigma$ to include from the tails of the distribution, 38 and the number of points used to compute the average. The center of the 39 distribution is set by the value of the model parameter. 40 41 The distribution width applied to *volume* (ie, shape-describing) parameters 42 is relative to the center value such that $\sigma = \mathrm{PD} \cdot \bar x$. 43 However, the distribution width applied to *orientation* parameters is just 44 $\sigma = \mathrm{PD}$. 48 45 49 46 $N_\sigma$ determines how far into the tails to evaluate the distribution, … … 55 52 56 53 Users should note that the averaging computation is very intensive. Applying 57 polydispersion and/or orientational distributions to multiple parameters at 58 the same time, or increasing the number of points in the distribution, will 59 require patience! However, the calculations are generally more robust with 54 polydispersion and/or orientational distributions to multiple parameters at 55 the same time, or increasing the number of points in the distribution, will 56 require patience! However, the calculations are generally more robust with 60 57 more data points or more angles. 61 58 … … 69 66 * *Schulz Distribution* 70 67 * *Array Distribution* 71 * *User-defined Distributions*72 68 73 69 These are all implemented as *number-average* distributions. 74 70 71 Additional distributions are under consideration. 75 72 76 73 **Beware: when the Polydispersity & Orientational Distribution panel in SasView is** … … 78 75 **This may not be suitable. See Suggested Applications below.** 79 76 80 .. note:: In 2009 IUPAC decided to introduce the new term 'dispersity' to replace 81 the term 'polydispersity' (see `Pure Appl. Chem., (2009), 81(2), 82 351-353 <http://media.iupac.org/publications/pac/2009/pdf/8102x0351.pdf>`_ 83 in order to make the terminology describing distributions of chemical 84 properties unambiguous. However, these terms are unrelated to the 85 proportional size distributions and orientational distributions used in 77 .. note:: In 2009 IUPAC decided to introduce the new term 'dispersity' to replace 78 the term 'polydispersity' (see `Pure Appl. Chem., (2009), 81(2), 79 351-353 <http://media.iupac.org/publications/pac/2009/pdf/8102x0351.pdf>`_ 80 in order to make the terminology describing distributions of chemical 81 properties unambiguous. However, these terms are unrelated to the 82 proportional size distributions and orientational distributions used in 86 83 SasView models. 87 84 … … 95 92 or angular orientations, consider using the Gaussian or Boltzmann distributions. 96 93 97 If applying polydispersion to parameters describing angles, use the Uniform 98 distribution. Beware of using distributions that are always positive (eg, the 94 If applying polydispersion to parameters describing angles, use the Uniform 95 distribution. Beware of using distributions that are always positive (eg, the 99 96 Lognormal) because angles can be negative! 100 97 101 The array distribution provides a very simple means of implementing a user- 102 defined distribution, but without any fittable parameters. Greater flexibility 103 is conferred by the user-defined distribution. 98 The array distribution allows a user-defined distribution to be applied. 104 99 105 100 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ … … 339 334 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 340 335 341 User-defined Distributions342 ^^^^^^^^^^^^^^^^^^^^^^^^^^343 344 You can also define your own distribution by creating a python file defining a345 *Distribution* object with a *_weights* method. The *_weights* method takes346 *center*, *sigma*, *lb* and *ub* as arguments, and can access *self.npts*347 and *self.nsigmas* from the distribution. They are interpreted as follows:348 349 * *center* the value of the shape parameter (for size dispersity) or zero350 if it is an angular dispersity. This parameter may be fitted.351 352 * *sigma* the width of the distribution, which is the polydispersity parameter353 times the center for size dispersity, or the polydispersity parameter alone354 for angular dispersity. This parameter may be fitted.355 356 * *lb*, *ub* are the parameter limits (lower & upper bounds) given in the model357 definition file. For example, a radius parameter has *lb* equal to zero. A358 volume fraction parameter would have *lb* equal to zero and *ub* equal to one.359 360 * *self.nsigmas* the distance to go into the tails when evaluating the361 distribution. For a two parameter distribution, this value could be362 co-opted to use for the second parameter, though it will not be available363 for fitting.364 365 * *self.npts* the number of points to use when evaluating the distribution.366 The user will adjust this to trade calculation time for accuracy, but the367 distribution code is free to return more or fewer, or use it for the third368 parameter in a three parameter distribution.369 370 As an example, the code following wraps the Laplace distribution from scipy stats::371 372 import numpy as np373 from scipy.stats import laplace374 375 from sasmodels import weights376 377 class Dispersion(weights.Dispersion):378 r"""379 Laplace distribution380 381 .. math::382 383 w(x) = e^{-\sigma |x - \mu|}384 """385 type = "laplace"386 default = dict(npts=35, width=0, nsigmas=3) # default values387 def _weights(self, center, sigma, lb, ub):388 x = self._linspace(center, sigma, lb, ub)389 wx = laplace.pdf(x, center, sigma)390 return x, wx391 392 You can plot the weights for a given value and width using the following::393 394 from numpy import inf395 from matplotlib import pyplot as plt396 from sasmodels import weights397 398 # reload the user-defined weights399 weights.load_weights()400 x, wx = weights.get_weights('laplace', n=35, width=0.1, nsigmas=3, value=50,401 limits=[0, inf], relative=True)402 403 # plot the weights404 plt.interactive(True)405 plt.plot(x, wx, 'x')406 407 The *self.nsigmas* and *self.npts* parameters are normally used to control408 the accuracy of the distribution integral. The *self._linspace* function409 uses them to define the *x* values (along with the *center*, *sigma*,410 *lb*, and *ub* which are passed as parameters). If you repurpose npts or411 nsigmas you will need to generate your own *x*. Be sure to honour the412 limits *lb* and *ub*, for example to disallow a negative radius or constrain413 the volume fraction to lie between zero and one.414 415 To activate a user-defined distribution, put it in a file such as *distname.py*416 in the *SAS_WEIGHTS_PATH* folder. This is defined with an environment417 variable, defaulting to::418 419 SAS_WEIGHTS_PATH=~/.sasview/weights420 421 The weights path is loaded on startup. To update the distribution definition422 in a running application you will need to enter the following python commands::423 424 import sasmodels.weights425 sasmodels.weights.load_weights('path/to/distname.py')426 427 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ428 429 336 Note about DLS polydispersity 430 337 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 431 338 432 Several measures of polydispersity abound in Dynamic Light Scattering (DLS) and 433 it should not be assumed that any of the following can be simply equated with 339 Several measures of polydispersity abound in Dynamic Light Scattering (DLS) and 340 it should not be assumed that any of the following can be simply equated with 434 341 the polydispersity *PD* parameter used in SasView. 435 342 436 The dimensionless **Polydispersity Index (PI)** is a measure of the width of the 437 distribution of autocorrelation function decay rates (*not* the distribution of 438 particle sizes itself, though the two are inversely related) and is defined by 343 The dimensionless **Polydispersity Index (PI)** is a measure of the width of the 344 distribution of autocorrelation function decay rates (*not* the distribution of 345 particle sizes itself, though the two are inversely related) and is defined by 439 346 ISO 22412:2017 as 440 347 … … 443 350 PI = \mu_{2} / \bar \Gamma^2 444 351 445 where $\mu_\text{2}$ is the second cumulant, and $\bar \Gamma^2$ is the 352 where $\mu_\text{2}$ is the second cumulant, and $\bar \Gamma^2$ is the 446 353 intensity-weighted average value, of the distribution of decay rates. 447 354 … … 452 359 PI = \sigma^2 / 2\bar \Gamma^2 453 360 454 where $\sigma$ is the standard deviation, allowing a **Relative Polydispersity (RP)** 361 where $\sigma$ is the standard deviation, allowing a **Relative Polydispersity (RP)** 455 362 to be defined as 456 363 … … 459 366 RP = \sigma / \bar \Gamma = \sqrt{2 \cdot PI} 460 367 461 PI values smaller than 0.05 indicate a highly monodisperse system. Values 368 PI values smaller than 0.05 indicate a highly monodisperse system. Values 462 369 greater than 0.7 indicate significant polydispersity. 463 370 464 The **size polydispersity P-parameter** is defined as the relative standard 465 deviation coefficient of variation 371 The **size polydispersity P-parameter** is defined as the relative standard 372 deviation coefficient of variation 466 373 467 374 .. math:: … … 470 377 471 378 where $\nu$ is the variance of the distribution and $\bar R$ is the mean 472 value of $R$. Here, the product $P \bar R$ is *equal* to the standard 379 value of $R$. Here, the product $P \bar R$ is *equal* to the standard 473 380 deviation of the Lognormal distribution. 474 381 -
sasmodels/compare.py
rbd7630d rbd7630d 41 41 from . import kerneldll 42 42 from . import kernelcl 43 from . import weights44 43 from .data import plot_theory, empty_data1D, empty_data2D, load_data 45 44 from .direct_model import DirectModel, get_mesh 46 45 from .generate import FLOAT_RE, set_integration_size 46 from .weights import plot_weights 47 47 48 48 # pylint: disable=unused-import … … 114 114 115 115 === environment variables === 116 -DSAS_MODELPATH=~/.sasmodels/custom_models sets path to custom models 117 -DSAS_WEIGHTS_PATH=~/.sasview/weights sets path to custom distributions 116 -DSAS_MODELPATH=path sets directory containing custom models 118 117 -DSAS_OPENCL=vendor:device|none sets the target OpenCL device 119 118 -DXDG_CACHE_HOME=~/.cache sets the pyopencl cache root (linux only) 120 119 -DSAS_COMPILER=tinycc|msvc|mingw|unix sets the DLL compiler 121 -DSAS_OPENMP= 0 set to 1 to turnon OpenMP for the DLLs122 -DSAS_DLL_PATH= ~/.sasmodels/compiled_models sets the DLL cache120 -DSAS_OPENMP=1 turns on OpenMP for the DLLs 121 -DSAS_DLL_PATH=path sets the path to the compiled modules 123 122 124 123 The interpretation of quad precision depends on architecture, and may … … 784 783 model_info = base._kernel.info 785 784 dim = base._kernel.dim 786 weights.plot_weights(model_info, get_mesh(model_info, base_pars, dim=dim))785 plot_weights(model_info, get_mesh(model_info, base_pars, dim=dim)) 787 786 if opts['show_profile']: 788 787 import pylab … … 1441 1440 #import pprint; pprint.pprint(model_info) 1442 1441 1443 # Hack to load user-defined distributions; run through all parameters1444 # and make sure any pd_type parameter is a defined distribution.1445 if (any(p.endswith('pd_type') and v not in weights.MODELS1446 for p, v in pars.items()) or1447 any(p.endswith('pd_type') and v not in weights.MODELS1448 for p, v in pars2.items())):1449 weights.load_weights()1450 1451 1442 if opts['show_pars']: 1452 1443 if model_info.name != model_info2.name or pars != pars2: -
sasmodels/sasview_model.py
raa25fc7 rd533590 30 30 from . import modelinfo 31 31 from .details import make_kernel_args, dispersion_mesh 32 33 # Hack: load in any custom distributions34 # Uses ~/.sasview/weights/*.py unless SASMODELS_WEIGHTS is set in the environ.35 # Override with weights.load_weights(pattern="<weights_path>/*.py")36 weights.load_weights()37 32 38 33 # pylint: disable=unused-import -
sasmodels/weights.py
rf41027b r3d58247 231 231 )) 232 232 233 SAS_WEIGHTS_PATH = "~/.sasview/weights"234 def load_weights(pattern=None):235 # type: (str) -> None236 """237 Load dispersion distributions matching the given glob pattern238 """239 import logging240 import os241 import os.path242 import glob243 import traceback244 from .custom import load_custom_kernel_module245 if pattern is None:246 path = os.environ.get("SAS_WEIGHTS_PATH", SAS_WEIGHTS_PATH)247 pattern = os.path.join(path, "*.py")248 for filename in sorted(glob.glob(os.path.expanduser(pattern))):249 try:250 #print("loading weights from", filename)251 module = load_custom_kernel_module(filename)252 MODELS[module.Dispersion.type] = module.Dispersion253 except Exception as exc:254 logging.error(traceback.format_exc(exc))255 233 256 234 def get_weights(disperser, n, width, nsigmas, value, limits, relative):
Note: See TracChangeset
for help on using the changeset viewer.