/***************************************************************************
* GModelSky.hpp - Sky model class *
* ----------------------------------------------------------------------- *
* copyright (C) 2011-2014 by Juergen Knoedlseder *
* ----------------------------------------------------------------------- *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
***************************************************************************/
/**
* @file GModelSky.hpp
* @brief Sky model class interface definition
* @author Juergen Knoedlseder
*/
#ifndef GMODELSKY_HPP
#define GMODELSKY_HPP
/* __ Includes ___________________________________________________________ */
#include
#include "GModel.hpp"
#include "GModelPar.hpp"
#include "GModelSpatial.hpp"
#include "GModelSpectral.hpp"
#include "GModelTemporal.hpp"
#include "GSkyDir.hpp"
#include "GEnergy.hpp"
#include "GTime.hpp"
#include "GPhoton.hpp"
#include "GPhotons.hpp"
#include "GRan.hpp"
#include "GVector.hpp"
#include "GEvent.hpp"
#include "GObservation.hpp"
#include "GXmlElement.hpp"
/* __ Forward declarations _______________________________________________ */
class GEvent;
class GObservation;
/***********************************************************************//**
* @class GModelSky
*
* @brief Sky model class
*
* This class implements a sky model that is factorized into a spatial,
* a spectral and a temporal component. The factorization is given by
*
* \f[
* S(\vec{p}, E, t) = S_{\rm p}(\vec{p} | E, t) \,
* S_{\rm E}(E | t) \,
* S_{\rm t}(t)
* \f]
*
* where
* - \f$S_{\rm p}(\vec{p} | E, t)\f$ is the spatial component,
* - \f$S_{\rm E}(E | t)\f$ is the spectral component, and
* - \f$S_{\rm t}(t)\f$ is the temporal component.
*
* The spatial component describes the energy and time dependent morphology
* of the source. It satisfies
* \f[
* \int_{\Omega} S_{\rm p}(\vec{p} | E, t) d\Omega = 1
* \f]
* for all \f$E\f$ and \f$t\f$, hence the spatial component does not
* impact the spatially integrated spectral and temporal properties of the
* source.
*
* The spectral component describes the spatially integrated time dependent
* spectral distribution of the source. It satisfies
* \f[
* \int_{E} S_{\rm E}(E | t) dE = \Phi
* \f]
* for all \f$t\f$, where \f$\Phi\f$ is the spatially and spectrally
* integrated total source flux. The spectral component does not impact
* the temporal properties of the integrated flux \f$\Phi\f$.
*
* The temporal component describes the temporal variation of the total
* integrated flux \f$\Phi\f$ of the source.
*
* The class has two methods for model evaluation that evaluate the model
* for a specific event, given an observation. The eval() method returns
* the model value, the eval_gradients() returns the model value and sets
* the analytical gradients for all model parameters.
* Note that the eval() and eval_gradients() methods call protected
* methods that handle time dispersion, energy dispersion and the point
* spread function (spatial dispersion). Dispersion is handled by
* integrating over the relevant intervals of the source properties.
* Integration of the model is done by three nested integrals.
* The outmost integral integrates over time (method integrate_time()),
* the next integral integrates over energy (method integrate_energy()),
* and the innermost integral integrates over the point spread function
* (method integrate_dir()).
*
* The npred() method returns the integral over the model for a given
* observed energy and time.
*
* The read() and write() methods allow reading of model information from
* and writing to an XML element. The type() method returns the model type
* that has been found in an XML element.
*
* The model factorization is implemented by the abstract model component
* classes GModelSpatial, GModelSpectral and GModelTemporal. The GModelSky
* class holds pointers to derived instances of these classes, which can
* be accessed using the spatial(), spectral() and temporal() methods. Note
* that these pointers can be NULL (for example if no model has been yet
* defined), so the validity of the pointers needs to be checked before
* using them.
***************************************************************************/
class GModelSky : public GModel {
public:
// Constructors and destructors
GModelSky(void);
explicit GModelSky(const std::string& type);
explicit GModelSky(const GXmlElement& xml);
explicit GModelSky(const GXmlElement& spatial,
const GXmlElement& spectral);
explicit GModelSky(const GXmlElement& spatial,
const GXmlElement& spectral,
const GXmlElement& temporal);
explicit GModelSky(const GModelSpatial& spatial,
const GModelSpectral& spectral);
explicit GModelSky(const GModelSpatial& spatial,
const GModelSpectral& spectral,
const GModelTemporal& temporal);
GModelSky(const GModelSky& model);
virtual ~GModelSky(void);
// Operators
virtual GModelSky& operator=(const GModelSky& model);
// Implemented pure virtual base class methods
virtual void clear(void);
virtual GModelSky* clone(void) const;
virtual std::string classname(void) const;
virtual std::string type(void) const;
virtual bool is_constant(void) const;
virtual double eval(const GEvent& event,
const GObservation& obs) const;
virtual double eval_gradients(const GEvent& event,
const GObservation& obs) const;
virtual double npred(const GEnergy& obsEng,
const GTime& obsTime,
const GObservation& obs) const;
virtual void read(const GXmlElement& xml);
virtual void write(GXmlElement& xml) const;
virtual std::string print(const GChatter& chatter = NORMAL) const;
// Other methods
GModelSpatial* spatial(void) const;
GModelSpectral* spectral(void) const;
GModelTemporal* temporal(void) const;
double value(const GPhoton& photon);
GVector gradients(const GPhoton& photon);
GPhotons mc(const double& area,
const GSkyDir& dir, const double& radius,
const GEnergy& emin, const GEnergy& emax,
const GTime& tmin, const GTime& tmax,
GRan& ran) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GModelSky& model);
void free_members(void);
void set_pointers(void);
void set_type(void);
GModelSpatial* xml_spatial(const GXmlElement& spatial) const;
GModelSpectral* xml_spectral(const GXmlElement& spectral) const;
GModelTemporal* xml_temporal(const GXmlElement& temporal) const;
double integrate_time(const GEvent& event,
const GObservation& obs,
bool grad) const;
double integrate_energy(const GEvent& event,
const GTime& srcTime,
const GObservation& obs,
bool grad) const;
double integrate_dir(const GEvent& event,
const GEnergy& srcEng,
const GTime& srcTime,
const GObservation& obs,
bool grad) const;
bool valid_model(void) const;
class edisp_kern : public GFunction {
public:
edisp_kern(const GModelSky* parent,
const GEvent& event,
const GTime& srcTime,
const GObservation& obs,
const bool& grad) :
m_parent(parent),
m_event(event),
m_srcTime(srcTime),
m_obs(obs),
m_grad(grad) { }
double eval(const double& x);
protected:
const GModelSky* m_parent; //!< Pointer to parent
const GEvent& m_event; //!< Reference to event
const GTime& m_srcTime; //!< Reference to true time
const GObservation& m_obs; //!< Reference to observation
const bool& m_grad; //!< Reference to gradient flag
};
// Protected data members
std::string m_type; //!< Model type
GModelSpatial* m_spatial; //!< Spatial model
GModelSpectral* m_spectral; //!< Spectral model
GModelTemporal* m_temporal; //!< Temporal model
};
/***********************************************************************//**
* @brief Return class name
*
* @return String containing the class name ("GModelSky").
***************************************************************************/
inline
std::string GModelSky::classname(void) const
{
return ("GModelSky");
}
/***********************************************************************//**
* @brief Return sky model type
*
* @return Sky model type.
*
* Returns the type of the sky model. The type is an arbitrary string that
* is used in the XML declaration of the model to describe the model type.
***************************************************************************/
inline
std::string GModelSky::type(void) const
{
return (m_type);
}
/***********************************************************************//**
* @brief Signals if sky model is temporally constant
*
* @return True if sky model is temporally constant, false otherwise.
*
* Signals if the sky model is temporally constant. A temporally constant
* model is a model that has a temporal component of type "Constant".
***************************************************************************/
inline
bool GModelSky::is_constant(void) const
{
return (m_temporal != NULL && m_temporal->type() == "Constant");
}
/***********************************************************************//**
* @brief Return spatial model component
*
* @return Pointer to spatial model component.
*
* Returns a pointer to the spatial model component of the model. The pointer
* is of type GModelSpatial. Note that a NULL pointer may be returned if the
* sky model has no spatial model component.
***************************************************************************/
inline
GModelSpatial* GModelSky::spatial(void) const
{
return (m_spatial);
}
/***********************************************************************//**
* @brief Return spectral model component
*
* @return Pointer to spectral model component.
*
* Returns a pointer to the spectral model component of the model. The
* pointer is of type GModelSpectral. Note that a NULL pointer may be
* returned if the sky model has no spectral model component.
***************************************************************************/
inline
GModelSpectral* GModelSky::spectral(void) const
{
return (m_spectral);
}
/***********************************************************************//**
* @brief Return temporal model component
*
* @return Pointer to temporal model component.
*
* Returns a pointer to the temporal model component of the model. The
* pointer is of type GModelTemporal. Note that a NULL pointer may be
* returned if the sky model has no temporal model component.
***************************************************************************/
inline
GModelTemporal* GModelSky::temporal(void) const
{
return (m_temporal);
}
#endif /* GMODELSKY_HPP */