Пример #1
0
class PointSource(object):
    """ combine name, skydir, model """
    def __init__(self,
                 skydir,
                 name,
                 model=None,
                 free_parameters=True,
                 leave_parameters=False):
        self.name = name
        self.skydir = skydir
        self.model = PowerLaw() if model is None else model
        #if not free_parameters:
        if not leave_parameters:
            for i in xrange(len(self.model.free)):
                self.model.free[i] = free_parameters
        self.duplicate = False

    def __str__(self):
        return '\n'.join([
            '\n',
            '=' * 60,
            'Name:\t\t%s' % (self.name),
            'R.A. (J2000):\t%.5f' % (self.skydir.ra()),
            'Dec. (J2000):\t%.5f' % (self.skydir.dec()),
            'Model:\t\t%s' % (self.model.full_name()),
            '\t' + self.model.__str__(indent='\t'),
        ])

    def copy(self):
        """ Create a deep copy of the point source. """
        return PointSource(SkyDir(self.skydir.ra(), self.skydir.dec()),
                           self.name,
                           self.model.copy(),
                           leave_parameters=True)
Пример #2
0
class ExtendedSource(DiffuseSource):
    """ Class inherting from DiffuseSource but implementing a spatial source. 
        The main difference is the requirement of a spatial model to accomany 
        a spectral model. """

    defaults = (
        ('name', None, 'The name of the extended source.'),
        ('model', None, 'a Model object.'),
        ('spatial_model', None, """The spatial model to use. 
                                       This is a SpatialModel object."""),
    )

    @keyword_options.decorate(defaults)
    def __init__(self, **kwargs):
        """ Make the naming consistent with the PointSource object so that
            extended sources 'feel' like point sources.

            """
        keyword_options.process(self, kwargs)

        if self.model == None: self.model = PowerLaw()
        if self.spatial_model == None: self.spatial_model = Disk()

        if not isinstance(self.spatial_model, SpatialModel):
            raise Exception(
                "The diffuse_model passed to an Extended Source must inherit from SpatialModel."
            )

        super(ExtendedSource, self).__init__(diffuse_model=self.spatial_model,
                                             scaling_model=self.model,
                                             name=self.name)

        self.model.background = False

    @property
    def skydir(self):
        return self.spatial_model.center

    @property
    def smodel(self):
        """ No reason to keep a model & smodel. """
        return self.model

    @smodel.setter
    def smodel(self, value):
        self.model = value

    def __str__(self, indent=''):
        return indent + ('\n' + indent).join([
            '\n', '=' * 60,
            'Name:\t\t%s' % (self.name),
            'R.A. (J2000):\t\t%.5f' % (self.spatial_model.center.ra()),
            'Dec. (J2000):\t\t%.5f' % (self.spatial_model.center.dec()),
            'Model:\t\t%s' %
            (self.model.full_name()), '\t' + self.model.__str__(indent='\t'),
            'SpatialModel:\t%s' % (self.spatial_model.full_name()),
            '\t' + self.spatial_model.__str__(indent='\t')
        ])

    def copy(self):
        """ Create a deep copy of an extended source. """
        return ExtendedSource(name=self.name,
                              spatial_model=self.spatial_model.copy(),
                              model=self.model.copy())