Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
param_apply_limits(ypos, self.ypos, **kwargs)
# Apply normalization factor to guessed amplitude
norm = (numpy.pi/_gfactor)*self.fwhm.val*self.fwhm.val*numpy.sqrt(1.0 - (self.ellip.val*self.ellip.val))
for key in ampl.keys():
if ampl[key] is not None:
ampl[key] *= norm
param_apply_limits(ampl, self.ampl, **kwargs)
def calc(self, *args, **kwargs):
kwargs['integrate']=bool_cast(self.integrate)
return _modelfcts.ngauss2d(*args, **kwargs)
class Weibull(ArithmeticModel):
"""
def weibull(x, pars):
location = pars[2]
if x < location:
return 0
scale = pars[1]
if scale <= 0:
return numpy.nan
shape = pars[0]
tmp = (x - location) / scale
result = (shape / scale) * math.pow(tmp, shape - 1)
result *= numpy.exp(-math.pow(tmp, shape))
return result
References
----------
# Used to rebin against finer or coarser energy grids
self.rmfargs = ()
def startup(self, cache=False):
self.model.startup(cache)
CompositeModel.startup(self, cache)
def teardown(self):
self.model.teardown()
CompositeModel.teardown(self)
def calc(self, p, x, xhi=None, *args, **kwargs):
raise NotImplementedError
class ARFModel(CompositeModel, ArithmeticModel):
"""Base class for expressing ARF convolution in model expressions.
"""
def __init__(self, arf, model):
self.arf = arf
self.model = model
self.elo = None
self.ehi = None # Energy space
self.lo = None
self.hi = None # Wavelength space
self.xlo = None
self.xhi = None # Current Spectral coordinates
# Used to rebin against finer or coarser energy grids
self.arfargs = ()
if self.__x is not None and self.__y is not None:
return p[0] * interpolate(x0, self.__x, self.__y, function=self.method)
elif (self.__filtered_y is not None and
len(x0) == len(self.__filtered_y)):
return p[0] * self.__filtered_y
elif (self.__y is not None and
len(x0) == len(self.__y)):
return p[0] * self.__y
raise ModelErr("filtermismatch", 'table model', 'data, (%s vs %s)' %
(len(self.__y), len(x0)))
class UserModel(ArithmeticModel):
"""Support for user-supplied models.
The class is used by sherpa.ui.load_user_model and
sherpa.astro.ui.load_user_model.
"""
def __init__(self, name='usermodel', pars=None):
# these attributes should remain somewhat private
# as not to conflict with user defined parameter names
self._y = []
self._file = None
if pars is None:
self.ampl = Parameter(name, 'ampl', 1)
pars = (self.ampl,)
else:
for par in pars:
self.__dict__[par.name] = par
self.models = tuple(models)
name = '%s(%s)' % (type(self).__name__,
','.join([m.name for m in models]))
CompositeModel.__init__(self, name, self.models)
def calc(self, p, arglist):
vals = []
for model, args in zip(self.models, arglist):
# FIXME: we're not using p here (and therefore assuming that the
# parameter values have already been updated to match the contents
# of p)
vals.append(model(*args))
return sum(vals)
class RegridWrappedModel(CompositeModel, ArithmeticModel):
def __init__(self, model, wrapper):
self.model = self.wrapobj(model)
self.wrapper = wrapper
if hasattr(model, 'integrate'):
self.wrapper.integrate = model.integrate
CompositeModel.__init__(self,
"{}({})".format(self.wrapper.name,
self.model.name),
(self.model, ))
def calc(self, p, *args, **kwargs):
return self.wrapper.calc(p, self.model.calc, *args, **kwargs)
def __init__(self, name='sm'):
self.ebv = Parameter(name, 'ebv', 0.5)
self._xtab = numpy.array([0.00, 0.29, 0.45, 0.80, 1.11, 1.43,
1.82, 2.27, 2.50, 2.91, 3.65, 4.00,
4.17, 4.35, 4.57, 4.76, 5.00, 5.26,
5.56, 5.88, 6.25, 6.71, 7.18, 8.00,
8.50, 9.00, 9.50, 10.00])
self._extab = numpy.array([0.00, 0.16, 0.38, 0.87, 1.50, 2.32,
3.10, 4.10, 4.40, 4.90, 6.20, 7.29,
8.00, 8.87, 9.67, 9.33, 8.62, 8.00,
7.75, 7.87, 8.12, 8.15, 8.49, 9.65,
10.55, 11.55, 12.90, 14.40])
ArithmeticModel.__init__(self, name, (self.ebv,))
"""
def __init__(self, name='exp'):
self.offset = Parameter(name, 'offset', 0)
self.coeff = Parameter(name, 'coeff', -1)
self.ampl = Parameter(name, 'ampl', 1, 0)
ArithmeticModel.__init__(self, name,
(self.offset, self.coeff, self.ampl))
@modelCacher1d
def calc(self, *args, **kwargs):
kwargs['integrate']=bool_cast(self.integrate)
return _modelfcts.exp(*args, **kwargs)
class Exp10(ArithmeticModel):
"""One-dimensional exponential function, base 10.
Attributes
----------
offset
The offset of the model.
coeff
The scaling factor.
ampl
The amplitude of the model.
See Also
--------
Exp, Log, Log10, LogParabola, Sqrt
Notes
self.xpos.set(xpos)
self.ypos.set(ypos)
def guess(self, dep, *args, **kwargs):
xpos, ypos = guess_position(dep, *args)
norm = guess_amplitude2d(dep, *args)
param_apply_limits(xpos, self.xpos, **kwargs)
param_apply_limits(ypos, self.ypos, **kwargs)
param_apply_limits(norm, self.ampl, **kwargs)
def calc(self, *args, **kwargs):
kwargs['integrate']=bool_cast(self.integrate)
return _modelfcts.delta2d(*args, **kwargs)
class Gauss2D(ArithmeticModel):
"""Two-dimensional gaussian function.
Attributes
----------
fwhm
The Full-Width Half Maximum of the gaussian along the major
axis. It is related to the sigma value by:
FWHM = sqrt(8 * log(2)) * sigma.
xpos
The center of the gaussian on the x0 axis.
ypos
The center of the gaussian on the x1 axis.
ellip
The ellipticity of the gaussian.
theta
The angle of the major axis. It is in radians, measured
def __init__(self, name='usermodel', pars=None):
# these attributes should remain somewhat private
# as not to conflict with user defined parameter names
self._y = []
self._file = None
if pars is None:
self.ampl = Parameter(name, 'ampl', 1)
pars = (self.ampl,)
else:
for par in pars:
self.__dict__[par.name] = par
ArithmeticModel.__init__(self, name, pars)
class Integrator1D(CompositeModel, ArithmeticModel):
@staticmethod
def wrapobj(obj):
if isinstance(obj, ArithmeticModel):
return obj
return ArithmeticFunctionModel(obj)
def __init__(self, model, *otherargs, **otherkwargs):
self.model = self.wrapobj(model)
self.otherargs = otherargs
self.otherkwargs = otherkwargs
self._errflag = 0
CompositeModel.__init__(self,
('integrate1d(%s)' % self.model.name),
(self.model,))
param_apply_limits(c2, self.c2, **kwargs)
param_apply_limits(c3, self.c3, **kwargs)
param_apply_limits(c3, self.c4, **kwargs)
param_apply_limits(c3, self.c5, **kwargs)
param_apply_limits(c3, self.c6, **kwargs)
param_apply_limits(c3, self.c7, **kwargs)
param_apply_limits(c3, self.c8, **kwargs)
param_apply_limits(off, self.offset, **kwargs)
@modelCacher1d
def calc(self, *args, **kwargs):
kwargs['integrate']=bool_cast(self.integrate)
return _modelfcts.poly1d(*args, **kwargs)
class PowLaw1D(ArithmeticModel):
"""One-dimensional power-law function.
It is assumed that the independent axis is positive at all points.
Attributes
----------
gamma
The photon index of the power law.
ref
As the reference point is degenerate with the amplitude, the
``alwaysfrozen`` attribute of the reference point is set so
that it can not be varied during a fit.
ampl
The amplitude of the model.
See Also
self.location))
self.cache = 0
def calc(self, *args, **kwargs):
kwargs['integrate'] = bool_cast(self.integrate)
return _modelfcts.weibull(*args, **kwargs)
# def guess(self, dep, *args, **kwargs):
# scale = numpy.sqrt((dep - dep.mean())**2).mean()
# indep = args[0]
# location = indep.mean()
# self.scale = scale
# self.location = location
class Polynom2D(ArithmeticModel):
"""Two-dimensional polynomial function.
The maximum order of the polynomial is 2.
Attributes
----------
c
The constant term.
cy1
The coefficient for the x1 term.
cy2
The coefficient for the x1^2 term.
cx1
The coefficient for the x0 term.
cx1y1
The coefficient for the x0 x1 term.