# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""
Small helper classes that wrap information about model components
"""
from __future__ import absolute_import, division, print_function
import copy
[docs]class CatalogInfo(object):
"""Information about a source catalog
Parameters
----------
catalog_name : str
The name given to the merged component, e.g., merged_CO or merged_HI
catalog_file : str
Fits file with catalog data
catalog_extdir : str
Directory with extended source templates
catalog_type : str
Identifies the format of the catalog fits file: e.g., '3FGL' or '4FGLP'
catalog : `fermipy.catalog.Catalog`
Catalog object
roi_model : `fermipy.roi_model.ROIModel`
Fermipy object describing all the catalog sources
srcmdl_name : str
Name of xml file with the catalog source model
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
self.catalog_name = kwargs.get('catalog_name')
self.catalog_file = kwargs.get('catalog_file')
self.catalog_extdir = kwargs.get('catalog_extdir')
self.catalog_type = kwargs.get('catalog_type')
self.catalog_table = kwargs.get('catalog_table', None)
self.catalog = kwargs.get('catalog', None)
self.roi_model = kwargs.get('roi_model', None)
self.srcmdl_name = kwargs.get('srcmdl_name', None)
self.spectrum = kwargs.get('spectrum', None)
[docs] def update(self, **kwargs):
"""Update data members from keyword arguments
"""
self.__dict__.update(**kwargs)
[docs]class GalpropMergedRingInfo(object):
"""Information about a set of Merged Galprop Rings
Parameters
----------
source_name : str
The name given to the merged component, e.g., merged_CO or merged_HI
ring : int
The index of the merged ring
sourcekey : str
Key that identifies this component, e.g., merged_CO_1, or merged_HI_3
galkey : str
Key that identifies how to merge the galprop rings, e.g., 'ref'
galprop_run : str
Key that idenfifies the galprop run used to make the input rings
files : str
List of files of the input gasmap files
merged_gasmap : str
Filename for the merged gasmap
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
self.source_name = kwargs.get('source_name')
self.ring = kwargs.get('ring')
self.sourcekey = kwargs.get(
'sourcekey', "%s_%i" % (self.source_name, self.ring))
self.galkey = kwargs.get('galkey', None)
self.galprop_run = kwargs.get('galprop_run', None)
self.files = kwargs.get('files', [])
self.merged_gasmap = kwargs.get('merged_gasmap', None)
[docs] def update(self, **kwargs):
"""Update data members from keyword arguments
"""
self.__dict__.update(**kwargs)
[docs]class ModelComponentInfo(object):
"""Information about a model component
Parameters
----------
source_name : str
The name given to the component, e.g., loop_I or moon
source_ver : str
Key to indentify the model version of the source, e.g., v00
sourcekey : str
Key that identifies this component, e.g., loop_I_v00 or moon_v00
model_type : str
Type of model, 'MapCubeSource' | 'IsoSource' | 'CompositeSource' | 'Catalog' | 'PointSource'
srcmdl_name : str
Name of the xml file with the xml just for this component
moving : bool
Flag for moving sources (i.e., the sun and moon)
selection_dependent : bool
Flag for selection dependent sources (i.e., the residual cosmic ray model)
no_psf : bool
Flag to indicate that we do not smear this component with the PSF
components : dict
Sub-dictionary of `ModelComponentInfo` objects for moving and selection_dependent sources
comp_key : str
Component key for this component of moving and selection_dependent sources
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
self.source_name = kwargs.get('source_name')
self.source_ver = kwargs.get('source_ver')
self.sourcekey = kwargs.get('sourcekey', '%s_%s' % (
self.source_name, self.source_ver))
self.srcmdl_name = kwargs.get('srcmdl_name')
self.moving = kwargs.get('moving', False)
self.selection_dependent = kwargs.get('selection_dependent', False)
self.no_psf = kwargs.get('no_psf', False)
self.components = kwargs.get('components', None)
self.comp_key = kwargs.get('comp_key', None)
[docs] def update(self, **kwargs):
"""Update data members from keyword arguments
"""
self.__dict__.update(**kwargs)
[docs] def get_component_info(self, comp):
"""Return the information about sub-component specific to a particular data selection
Parameters
----------
comp : `binning.Component` object
Specifies the sub-component
Returns `ModelComponentInfo` object
"""
if self.components is None:
raise ValueError(
'Model component %s does not have sub-components' % self.sourcekey)
if self.moving:
comp_key = "zmax%i" % (comp.zmax)
elif self.selection_dependent:
comp_key = comp.make_key('{ebin_name}_{evtype_name}')
else:
raise ValueError(
'Model component %s is not moving or selection dependent' % self.sourcekey)
return self.components[comp_key]
[docs] def add_component_info(self, compinfo):
"""Add sub-component specific information to a particular data selection
Parameters
----------
compinfo : `ModelComponentInfo` object
Sub-component being added
"""
if self.components is None:
self.components = {}
self.components[compinfo.comp_key] = compinfo
[docs] def clone_and_merge_sub(self, key):
"""Clones self and merges clone with sub-component specific information
Parameters
----------
key : str
Key specifying which sub-component
Returns `ModelComponentInfo` object
"""
new_comp = copy.deepcopy(self)
#sub_com = self.components[key]
new_comp.components = None
new_comp.comp_key = key
return new_comp
class MapCubeComponentInfo(ModelComponentInfo):
""" Information about a model component represented by a MapCubeSource
Parameters
----------
Spatial_Filename : str
Name of the template file for the spatial model
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
super(MapCubeComponentInfo, self).__init__(**kwargs)
self.model_type = 'MapCubeSource'
self.Spatial_Filename = kwargs.get('Spatial_Filename', None)
[docs]class IsoComponentInfo(ModelComponentInfo):
""" Information about a model component represented by a IsoSource
Parameters
----------
Spectral_Filename : str
Name of the template file for the spatial model
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
super(IsoComponentInfo, self).__init__(**kwargs)
self.model_type = 'IsoSource'
self.Spectral_Filename = kwargs.get('Spectral_Filename', None)
[docs]class PointSourceInfo(ModelComponentInfo):
""" Information about a model component represented by a PointSource\
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
super(PointSourceInfo, self).__init__(**kwargs)
self.model_type = 'PointSource'
[docs]class CompositeSourceInfo(ModelComponentInfo):
""" Information about a model component represented by a CompositeSource
Parameters
----------
source_names : list
The names of the nested sources
catalog_info : `model_component.CatalogInfo` or None
Information about the catalog containing the nested sources
roi_model : `fermipy.roi_model.ROIModel`
Fermipy object describing the nested sources
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
super(CompositeSourceInfo, self).__init__(**kwargs)
self.model_type = 'CompositeSource'
self.source_names = kwargs.get('source_names', [])
self.catalog_info = kwargs.get('catalog_info', None)
self.roi_model = kwargs.get('roi_model', None)
[docs]class CatalogSourcesInfo(ModelComponentInfo):
""" Information about a model component consisting of sources from a catalog
Parameters
----------
source_names : list
The names of the nested sources
catalog_info : `model_component.CatalogInfo` or None
Information about the catalog containing the nested sources
roi_model : `fermipy.roi_model.ROIModel`
Fermipy object describing the nested sources
"""
def __init__(self, **kwargs):
"""C'tor: copies keyword arguments to data members
"""
super(CatalogSourcesInfo, self).__init__(**kwargs)
self.model_type = 'CatalogSources'
self.source_names = kwargs.get('source_names', [])
self.catalog_info = kwargs.get('catalog_info', None)
self.roi_model = kwargs.get('roi_model', None)