Skip to content

Latest commit

 

History

History
91 lines (73 loc) · 2.69 KB

integrate.rst

File metadata and controls

91 lines (73 loc) · 2.69 KB

Binned and Unbinned grids

Sherpa supports models for both unbinned <data_unbinned> and binned <data_binned> data sets. The output of a model depends on how it is called (is it sent just the grid points or the bin edges), how the :py~sherpa.models.model.Model.integrate flag of the model component is set, and whether the model supports both or just one case.

The :py~sherpa.models.basic.Const1D model represents a constant value, which means that for an unbinned dataset the model evaluates to a single value (the :py~sherpa.models.basic.Const1D.c0 parameter):

>>> from sherpa.models.basic import Const1D
>>> mdl = Const1D()
>>> mdl.c0 = 0.1
>>> mdl([1, 2, 3])
array([ 0.1,  0.1,  0.1])
>>> mdl([-4000, 12000])
array([ 0.1,  0.1])

The default value for its :py~sherpa.models.basic.Const1D.integrate flag is True:

>>> mdl.integrate
True

which means that this value is multiplied by the bin width when given a binned grid (i.e. when sent in the low and high edges of each bin):

>>> mdl([10, 20, 30], [20, 30, 50]) array([ 1., 1., 2.])

When the integrate flag is unset, the model no longer multiplies by the bin width, and so acts similarly to the unbinned case:

>>> mdl.integrate = False >>> mdl([10, 20, 30], [20, 30, 50]) array([ 0.1, 0.1, 0.1])

The behavior in all these three cases depends on the model - for instance some models may raise an exception, ignore the high-edge values in the binned case, or use the mid-point - and so the model documentation should be reviewed.

The following example uses the :py~sherpa.models.basic.Polynom1D class to model the linear relation y = mx + c with the origin at x = 1400, an offset of 2, and a gradient of 1:

>>> from sherpa.models.basic import Polynom1D
>>> poly = Polynom1D()
>>> poly.offset = 1400
>>> poly.c0 = 2
>>> poly.c1 = 1
>>> x = [1391, 1396, 1401, 1406, 1411]
>>> poly(x)
array([ -7.,  -2.,   3.,   8.,  13.])

As the integrate flag is set, the model is integrated across each bin:

>>> poly.integrate
True
>>> xlo, xhi = x[:-1], x[1:]
>>> y = poly(xlo, xhi)
>>> y
array([-22.5,   2.5,  27.5,  52.5])

Thanks to the easy functonal form chosen for this example, it is easy to confirm that these are the values of the integrated model:

>>> (y[:-1] + y[1:]) * 5 / 2.0
array([-22.5,   2.5,  27.5,  52.5])

Turning off the integrate flag for this model shows that it uses the low-edge of the bin when evaluating the model:

>>> poly.integrate = False
>>> poly(xlo, xhi)
array([-7., -2.,  3.,  8.])