/***************************************************************************
* GModelTemporalPhaseCurve.hpp - Temporal phase curve model class *
* ----------------------------------------------------------------------- *
* copyright (C) 2017 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 GModelTemporalPhaseCurve.hpp
* @brief Temporal phase curve model class interface definition
* @author Juergen Knoedlseder
*/
#ifndef GMODELTEMPORALPHASECURVE_HPP
#define GMODELTEMPORALPHASECURVE_HPP
/* __ Includes ___________________________________________________________ */
#include
#include
#include "GModelPar.hpp"
#include "GModelTemporal.hpp"
#include "GNodeArray.hpp"
#include "GFilename.hpp"
#include "GTime.hpp"
/* __ Forward declarations _______________________________________________ */
class GRan;
class GXmlElement;
/***********************************************************************//**
* @class GModelTemporalPhaseCurve
*
* @brief Temporal phase curve model class
*
* This class implements a temporal variation based on the phase
* \f$\Phi(t)\f$ that is computed using
*
* \f[
* \Phi(t) = \Phi_0 + f(t-t_0) + \frac{1}{2}\dot{f} (t-t_0)^2 +
* \frac{1}{6}\ddot{f} (t-t_0)^3
* \f]
*
* where
* \f$t_0\f$ is a reference time,
* \f$\Phi_0\f$ is the phase at the reference time,
* \f$f\f$ is the variation frequency at the reference time,
* \f$\dot{f}\f$ is the first derivative of the variation frequency at the
* reference time, and
* \f$\ddot{f}\f$ is the second derivative of the variation frequency at the
* reference time.
*
* The temporal variation is then computed using
*
* \f[
* S_{\rm t}(t) = r(\Phi(t)) \times {\tt m\_norm}
* \f]
*
* where \f$r(\Phi(t))\f$ is the rate defined by linear interpolation between
* the nodes in a FITS file, and \f${\tt m\_norm}\f$ is a normalisation
* constant.
***************************************************************************/
class GModelTemporalPhaseCurve : public GModelTemporal {
public:
// Constructors and destructors
GModelTemporalPhaseCurve(void);
explicit GModelTemporalPhaseCurve(const GXmlElement& xml);
GModelTemporalPhaseCurve(const GFilename& filename,
const GTime& mjd,
const double& phase,
const double& f0,
const double& f1,
const double& f2,
const double& norm = 1.0,
const bool& normalize = true);
GModelTemporalPhaseCurve(const GModelTemporalPhaseCurve& model);
virtual ~GModelTemporalPhaseCurve(void);
// Operators
virtual GModelTemporalPhaseCurve& operator=(const GModelTemporalPhaseCurve& model);
// Implemented virtual base class methods
virtual void clear(void);
virtual GModelTemporalPhaseCurve* clone(void) const;
virtual std::string classname(void) const;
virtual std::string type(void) const;
virtual double eval(const GTime& srcTime,
const bool& gradients = false) const;
virtual GTimes mc(const double& rate, const GTime& tmin,
const GTime& tmax, GRan& ran) const;
virtual void read(const GXmlElement& xml);
virtual void write(GXmlElement& xml) const;
virtual std::string print(const GChatter& chatter = NORMAL) const;
// Other methods
const GFilename& filename(void) const;
void filename(const GFilename& filename);
double norm(void) const;
void norm(const double& norm);
GTime mjd(void) const;
void mjd(const GTime& time);
double phase(void) const;
double phase(const GTime& time) const;
void phase(const double& phase);
double value(const double& phase) const;
double f0(void) const;
void f0(const double& f0);
double f1(void) const;
void f1(const double& f1);
double f2(void) const;
void f2(const double& f2);
bool normalize(void) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GModelTemporalPhaseCurve& model);
void free_members(void);
void load_nodes(const GFilename& filename);
void normalize_nodes(void);
// Protected parameter members
GModelPar m_norm; //!< Normalization factor
GModelPar m_mjd; //!< Reference MJD
GModelPar m_phase; //!< Phase at reference MJD
GModelPar m_f0; //!< Frequency at reference MJD
GModelPar m_f1; //!< First freq. derivative at reference MJD
GModelPar m_f2; //!< Second freq. derivative at reference MJD
bool m_normalize; //!< Normalize phase curve (default: true)
bool m_has_normalize; //!< XML has normalize attribute
// Protected members
mutable GNodeArray m_nodes; //!< Phase values of nodes
std::vector m_values; //!< Function values at nodes
double m_scale; //!< Scale factor due to normalization
GFilename m_filename; //!< Name of phase file function
};
/***********************************************************************//**
* @brief Return class name
*
* @return String containing the class name ("GModelTemporalPhaseCurve").
***************************************************************************/
inline
std::string GModelTemporalPhaseCurve::classname(void) const
{
return ("GModelTemporalPhaseCurve");
}
/***********************************************************************//**
* @brief Return model type
*
* @return "PhaseCurve".
*
* Returns the type of the temporal model.
***************************************************************************/
inline
std::string GModelTemporalPhaseCurve::type(void) const
{
return ("PhaseCurve");
}
/***********************************************************************//**
* @brief Return file name
*
* @return Name of node file.
*
* Returns the name of the file function node file.
***************************************************************************/
inline
const GFilename& GModelTemporalPhaseCurve::filename(void) const
{
return (m_filename);
}
/***********************************************************************//**
* @brief Loads nodes from node file and set filename
*
* @param[in] filename Node file name.
*
* Loads the nodes from a file function node file and sets the filename.
***************************************************************************/
inline
void GModelTemporalPhaseCurve::filename(const GFilename& filename)
{
load_nodes(filename);
return;
}
/***********************************************************************//**
* @brief Return normalization factor
*
* @return Normalization factor.
*
* Returns the normalization factor.
***************************************************************************/
inline
double GModelTemporalPhaseCurve::norm(void) const
{
return (m_norm.value());
}
/***********************************************************************//**
* @brief Set normalization factor
*
* @param[in] norm Normalization factor.
*
* Sets the normalization factor.
***************************************************************************/
inline
void GModelTemporalPhaseCurve::norm(const double& norm)
{
m_norm.value(norm);
return;
}
/***********************************************************************//**
* @brief Return reference Modified Julian Day
*
* @return Reference Modified Julian Day.
*
* Returns the reference Modified Julian Day.
***************************************************************************/
inline
GTime GModelTemporalPhaseCurve::mjd(void) const
{
GTime time;
time.mjd(m_mjd.value());
return (time);
}
/***********************************************************************//**
* @brief Set reference Modified Julian Day
*
* @param[in] mjd Reference Modified Julian Day.
*
* Sets the reference Modified Julian Day.
***************************************************************************/
inline
void GModelTemporalPhaseCurve::mjd(const GTime& mjd)
{
m_mjd.value(mjd.mjd());
return;
}
/***********************************************************************//**
* @brief Return phase at reference Modified Julian Day
*
* @return Phase at reference Modified Julian Day.
*
* Returns the phase at reference Modified Julian Day.
***************************************************************************/
inline
double GModelTemporalPhaseCurve::phase(void) const
{
return (m_phase.value());
}
/***********************************************************************//**
* @brief Set phase at reference Modified Julian Day
*
* @param[in] phase Phase at reference Modified Julian Day.
*
* Sets the phase at reference Modified Julian Day.
***************************************************************************/
inline
void GModelTemporalPhaseCurve::phase(const double& phase)
{
m_phase.value(phase);
return;
}
/***********************************************************************//**
* @brief Return frequency at reference Modified Julian Day
*
* @return Frequency at reference Modified Julian Day.
*
* Returns the frequency at reference Modified Julian Day.
***************************************************************************/
inline
double GModelTemporalPhaseCurve::f0(void) const
{
return (m_f0.value());
}
/***********************************************************************//**
* @brief Set frequency at reference Modified Julian Day
*
* @param[in] f0 Frequency at reference Modified Julian Day.
*
* Sets the frequency at reference Modified Julian Day.
***************************************************************************/
inline
void GModelTemporalPhaseCurve::f0(const double& f0)
{
m_f0.value(f0);
return;
}
/***********************************************************************//**
* @brief Return first frequency derivative at reference Modified Julian Day
*
* @return First frequency derivative at reference Modified Julian Day.
*
* Returns the first frequency derivative at reference Modified Julian Day.
***************************************************************************/
inline
double GModelTemporalPhaseCurve::f1(void) const
{
return (m_f1.value());
}
/***********************************************************************//**
* @brief Set first frequency derivative at reference Modified Julian Day
*
* @param[in] f1 First frequency derivative at reference Modified Julian Day.
*
* Sets the first frequency derivative at reference Modified Julian Day.
***************************************************************************/
inline
void GModelTemporalPhaseCurve::f1(const double& f1)
{
m_f1.value(f1);
return;
}
/***********************************************************************//**
* @brief Return second frequency derivative at reference Modified Julian Day
*
* @return Second frequency derivative at reference Modified Julian Day.
*
* Returns the second frequency derivative at reference Modified Julian Day.
***************************************************************************/
inline
double GModelTemporalPhaseCurve::f2(void) const
{
return (m_f2.value());
}
/***********************************************************************//**
* @brief Set second frequency derivative at reference Modified Julian Day
*
* @param[in] f2 Second frequency derivative at reference Modified Julian Day.
*
* Sets the second frequency derivative at reference Modified Julian Day.
***************************************************************************/
inline
void GModelTemporalPhaseCurve::f2(const double& f2)
{
m_f2.value(f2);
return;
}
/***********************************************************************//**
* @brief Return normalization flag
*
* @return True if the phase curve has been normalized, false otherwise.
*
* Signals whether a phase curve has been normalized or not.
***************************************************************************/
inline
bool GModelTemporalPhaseCurve::normalize(void) const
{
return (m_normalize);
}
#endif /* GMODELTEMPORALPHASECURVE_HPP */