Binned and Unbinned gridsΒΆ

Sherpa supports models for both unbinned and 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 integrate flag of the model component is set, and whether the model supports both or just one case.

The Const1D model represents a constant value, which means that for an unbinned dataset the model evaluates to a single value (the 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 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 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.])