/***************************************************************************
* GObservation.hpp - Abstract observation base class *
* ----------------------------------------------------------------------- *
* copyright (C) 2008-2013 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 GObservation.hpp
* @brief Abstract observation base class interface definition
* @author Juergen Knoedlseder
*/
#ifndef GOBSERVATION_HPP
#define GOBSERVATION_HPP
/* __ Includes ___________________________________________________________ */
#include
#include "GBase.hpp"
#include "GEvents.hpp"
#include "GResponse.hpp"
#include "GModels.hpp"
#include "GTime.hpp"
#include "GEnergy.hpp"
#include "GFunction.hpp"
#include "GVector.hpp"
#include "GMatrixSparse.hpp"
/***********************************************************************//**
* @class GObservation
*
* @brief Abstract observation base class
*
* This class provides an abstract interface for an observation. The
* observation collects information about the instrument, holds the measured
* events, and provides information about the analysis definition.
* The method model() returns the probability for an event to be measured
* with a given instrument direction, a given energy and at a given time,
* given a source model and an instrument pointing direction.
* The method npred() returns the total number of expected events within the
* analysis region for a given source model and a given instrument pointing
* direction.
* The methods a defined as virtual and can be overloaded by derived classes
* that implement instrument specific observations in order to optimize the
* execution speed for data analysis.
***************************************************************************/
class GObservation : public GBase {
public:
// Constructors and destructors
GObservation(void);
GObservation(const GObservation& obs);
virtual ~GObservation(void);
// Operators
virtual GObservation& operator=(const GObservation& obs);
// Pure virtual methods
virtual void clear(void) = 0;
virtual GObservation* clone(void) const = 0;
virtual void response(const GResponse& rsp) = 0;
virtual const GResponse& response(void) const = 0;
virtual std::string instrument(void) const = 0;
virtual double ontime(void) const = 0;
virtual double livetime(void) const = 0;
virtual double deadc(const GTime& time) const = 0;
virtual void read(const GXmlElement& xml) = 0;
virtual void write(GXmlElement& xml) const = 0;
virtual std::string print(const GChatter& chatter = NORMAL) const = 0;
// Virtual methods
virtual double likelihood(const GModels& models,
GVector* gradient,
GMatrixSparse* curvature,
double* npred) const;
virtual double model(const GModels& models,
const GEvent& event,
GVector* gradient = NULL) const;
virtual double npred(const GModels& models,
GVector* gradient = NULL) const;
virtual double model_grad(const GModel& model,
const GEvent& event,
const int& ipar) const;
virtual double npred_grad(const GModel& model,
const int& ipar) const;
// Implemented methods
void name(const std::string& name);
void id(const std::string& id);
void events(const GEvents& events);
void statistics(const std::string& statistics);
const std::string& name(void) const;
const std::string& id(void) const;
const GEvents* events(void) const;
const std::string& statistics(void) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GObservation& obs);
void free_members(void);
// Likelihood methods
virtual double likelihood_poisson_unbinned(const GModels& models,
GVector* gradient,
GMatrixSparse* curvature,
double* npred) const;
virtual double likelihood_poisson_binned(const GModels& models,
GVector* gradient,
GMatrixSparse* curvature,
double* npred) const;
virtual double likelihood_gaussian_binned(const GModels& models,
GVector* gradient,
GMatrixSparse* curvature,
double* npred) const;
// Model gradient kernel classes
class model_func : public GFunction {
public:
model_func(const GObservation* parent,
const GModel& model,
const GEvent& event,
int ipar) :
m_parent(parent),
m_model(&model),
m_event(&event),
m_ipar(ipar) { }
double eval(const double& x);
protected:
const GObservation* m_parent; //!< Pointer to parent
const GModel* m_model; //!< Pointer to model
const GEvent* m_event; //!< Pointer to event
int m_ipar; //!< Parameter index
};
// Npred methods
virtual double npred_temp(const GModel& model) const;
virtual double npred_spec(const GModel& model, const GTime& obsTime) const;
// Npred kernel classes
class npred_temp_kern : public GFunction {
public:
npred_temp_kern(const GObservation* parent,
const GModel* model) :
m_parent(parent),
m_model(model) { }
double eval(const double& x);
protected:
const GObservation* m_parent; //!< Pointer to parent
const GModel* m_model; //!< Pointer to source model
};
class npred_spec_kern : public GFunction {
public:
npred_spec_kern(const GObservation* parent,
const GModel* model,
const GTime* obsTime) :
m_parent(parent),
m_model(model),
m_time(obsTime) { }
double eval(const double& x);
protected:
const GObservation* m_parent; //!< Pointer to parent
const GModel* m_model; //!< Pointer to source model
const GTime* m_time; //!< Pointer to time
};
// Npred gradient kernel classes
class npred_func : public GFunction {
public:
npred_func(const GObservation* parent,
const GModel& model,
int ipar) :
m_parent(parent),
m_model(&model),
m_ipar(ipar) { }
double eval(const double& x);
protected:
const GObservation* m_parent; //!< Pointer to parent
const GModel* m_model; //!< Pointer to model
int m_ipar; //!< Parameter index
};
// Protected data area
std::string m_name; //!< Observation name
std::string m_id; //!< Observation identifier
std::string m_statistics; //!< Optimizer statistics (default=Poisson)
GEvents* m_events; //!< Pointer to event container
};
/***********************************************************************//**
* @brief Set observation name
*
* @param[in] name Observation name.
*
* Set name of the observation.
***************************************************************************/
inline
void GObservation::name(const std::string& name)
{
m_name = name;
return;
}
/***********************************************************************//**
* @brief Set observation identifier
*
* @param[in] id Observation identifier.
*
* Set identifier of the observation.
***************************************************************************/
inline
void GObservation::id(const std::string& id)
{
m_id = id;
return;
}
/***********************************************************************//**
* @brief Set optimizer statistics
*
* @param[in] statistics Optimizer statistics.
*
* Set optimizer statistics for the observation.
***************************************************************************/
inline
void GObservation::statistics(const std::string& statistics)
{
m_statistics = statistics;
return;
}
/***********************************************************************//**
* @brief Return observation name
*
* @return Observation name.
***************************************************************************/
inline
const std::string& GObservation::name(void) const
{
return (m_name);
}
/***********************************************************************//**
* @brief Return observation identifier
*
* @return Observation identifier.
***************************************************************************/
inline
const std::string& GObservation::id(void) const
{
return (m_id);
}
/***********************************************************************//**
* @brief Return optimizer statistics
*
* @return Optimizer statistics.
***************************************************************************/
inline
const std::string& GObservation::statistics(void) const
{
return (m_statistics);
}
#endif /* GOBSERVATION_HPP */