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)
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())