/***************************************************************************
* GObservation.hpp - Abstract observation base class *
* ----------------------------------------------------------------------- *
* copyright (C) 2008-2016 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 "GTime.hpp"
#include "GFunction.hpp"
/* __ Forward declarations _______________________________________________ */
class GVector;
class GMatrixSparse;
class GModel;
class GModels;
class GModelPar;
class GResponse;
class GXmlElement;
/***********************************************************************//**
* @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 response() method returns a pointer to the response function. The
* derived classes have to make sure that this method never returns NULL.
*
* 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 are 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 std::string classname(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 = GTime()) 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 GEvents* events(void);
virtual const GEvents* events(void) const;
virtual void events(const GEvents& events);
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 int nobserved(void) const;
virtual double npred(const GModels& models,
GVector* gradient = NULL) const;
virtual double npred(const GModel& model) const;
virtual double model_grad(const GModel& model,
const GModelPar& par,
const GEvent& event) const;
virtual double npred_grad(const GModel& model,
const GModelPar& par) const;
// Implemented methods
void name(const std::string& name);
void id(const std::string& id);
void statistics(const std::string& statistics);
const std::string& name(void) const;
const std::string& id(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,
GModelPar* par,
const GEvent* event) :
m_parent(parent),
m_model(model),
m_par(par),
m_event(event) { }
double eval(const double& x);
protected:
const GObservation* m_parent; //!< Observation
const GModel* m_model; //!< Model
GModelPar* m_par; //!< Model parameter
const GEvent* m_event; //!< Event
};
// Npred methods
virtual double npred_spec(const GModel& model, const GTime& obsTime) const;
// Npred kernel classes
class npred_kern : public GFunction {
public:
npred_kern(const GObservation* parent,
const GModel* model) :
m_parent(parent),
m_model(model) { }
double eval(const double& x);
protected:
const GObservation* m_parent; //!< Observation
const GModel* m_model; //!< 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; //!< Observation
const GModel* m_model; //!< Model
const GTime* m_time; //!< Time
};
// Npred gradient kernel classes
class npred_func : public GFunction {
public:
npred_func(const GObservation* parent,
const GModel* model,
GModelPar* par) :
m_parent(parent),
m_model(model),
m_par(par) { }
double eval(const double& x);
protected:
const GObservation* m_parent; //!< Observation
const GModel* m_model; //!< Model
GModelPar* m_par; //!< Model parameter
};
// 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 */