GammaLib 2.0.0
Loading...
Searching...
No Matches
GModelSpectralNodes.hpp
Go to the documentation of this file.
1/***************************************************************************
2 * GModelSpectralNodes.hpp - Spectral nodes model class *
3 * ----------------------------------------------------------------------- *
4 * copyright (C) 2012-2021 by Juergen Knoedlseder *
5 * ----------------------------------------------------------------------- *
6 * *
7 * This program is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 * *
20 ***************************************************************************/
21/**
22 * @file GModelSpectralNodes.hpp
23 * @brief Spectral nodes model class definition
24 * @author Juergen Knoedlseder
25 */
26
27#ifndef GMODELSPECTRALNODES_HPP
28#define GMODELSPECTRALNODES_HPP
29
30/* __ Includes ___________________________________________________________ */
31#include <vector>
32#include <string>
33#include "GModelSpectral.hpp"
34#include "GModelPar.hpp"
35#include "GNodeArray.hpp"
36#include "GEnergy.hpp"
37
38/* __ Forward declarations _______________________________________________ */
39class GRan;
40class GTime;
41class GEnergies;
42class GXmlElement;
43
44
45/***********************************************************************//**
46 * @class GModelSpectralNodes
47 *
48 * @brief Spectral nodes model class
49 *
50 * This class implements a piecewise power law between spectral nodes
51 *
52 * \f[
53 * ({\tt m\_energies[i]}, {\tt m\_values[i]})
54 * \f]
55 *
56 * where
57 * - \f${\tt m\_energies[i]}\f$ is the energy, and
58 * - \f${\tt m\_values[i]}\f$ is the intensity (in photons/cm2/s/MeV)
59 * of node \f$i\f$.
60 *
61 * For a given energy \f$E\f$, the piecewise power law is computing by
62 * finding the bracketing energies
63 * \f${\tt m\_energies[i]} <= E <= {\tt m\_energies[i+1]}\f$ and computing
64 *
65 * \f[
66 * S_{\rm E}(E | t) =
67 * 10^{(\log {\tt m\_values[i]}) w_{i} +
68 * (\log {\tt m\_values[i+1]}) w_{i+1}}
69 * \f]
70 *
71 * where
72 * - \f${\tt m\_values[i]}\f$ is the intensity of node \f$i\f$,
73 * - \f${\tt m\_values[i+1]}\f$ is the intensity of node \f$i+1\f$,
74 * - \f$w_{i}\f$ is the weighting of node \f$i\f$, and
75 * - \f$w_{i+1}\f$ is the weighting of node \f$i+1\f$.
76 *
77 * The weightings \f$w_{i}\f$ and \f$w_{i+1}\f$ are computed by linear
78 * interpolation (in the log-log plane) between the nodes
79 * \f$(\log {\tt m\_energies[i]}, \log{\tt m\_values[i]})\f$
80 * and
81 * \f$(\log {\tt m\_energies[i+1]}, \log{\tt m\_values[i+1]})\f$
82 * to the requested energy \f$\log E\f$.
83 ***************************************************************************/
85
86public:
87 // Constructors and destructors
89 GModelSpectralNodes(const GModelSpectral& model, const GEnergies& energies);
90 explicit GModelSpectralNodes(const GXmlElement& xml);
92 virtual ~GModelSpectralNodes(void);
93
94 // Operators
96
97 // Implemented pure virtual base class methods
98 virtual void clear(void);
99 virtual GModelSpectralNodes* clone(void) const;
100 virtual std::string classname(void) const;
101 virtual std::string type(void) const;
102 virtual double eval(const GEnergy& srcEng,
103 const GTime& srcTime = GTime(),
104 const bool& gradients = false) const;
105 virtual double flux(const GEnergy& emin,
106 const GEnergy& emax) const;
107 virtual double eflux(const GEnergy& emin,
108 const GEnergy& emax) const;
109 virtual GEnergy mc(const GEnergy& emin,
110 const GEnergy& emax,
111 const GTime& time,
112 GRan& ran) const;
113 virtual void read(const GXmlElement& xml);
114 virtual void write(GXmlElement& xml) const;
115 virtual std::string print(const GChatter& chatter = NORMAL) const;
116
117 // Other methods
118 int nodes(void) const;
119 void append(const GEnergy& energy, const double& intensity);
120 void insert(const int& index, const GEnergy& energy,
121 const double& intensity);
122 void remove(const int& index);
123 void reserve(const int& num);
124 void extend(const GModelSpectralNodes& nodes);
125 GEnergy energy(const int& index) const;
126 void energy(const int& index, const GEnergy& energy);
127 double intensity(const int& index) const;
128 void intensity(const int& index, const double& intensity);
129 double error(const int& index) const;
130
131protected:
132 // Protected methods
133 void init_members(void);
134 void copy_members(const GModelSpectralNodes& model);
135 void free_members(void);
136 void update_pars(void);
137 void set_cache(void) const;
138 void set_eval_cache(void) const;
139 void set_flux_cache(void) const;
140 void update_eval_cache(void) const;
141 void update_flux_cache(void) const;
142 void mc_update(const GEnergy& emin, const GEnergy& emax) const;
143
144 // Protected members
145 std::vector<GModelPar> m_energies; //!< Node energies
146 std::vector<GModelPar> m_values; //!< Node values
147
148 // Evaluation cache
149 mutable std::vector<double> m_old_energies; //!< Old energies
150 mutable std::vector<double> m_old_values; //!< Old values
151 mutable GNodeArray m_log_energies; //!< log10(energy) of nodes
152 mutable std::vector<double> m_log_values; //!< log10(value) of nodes
153
154 // Flux computation cache
155 mutable GNodeArray m_lin_energies; //!< Energy of nodes
156 mutable std::vector<double> m_lin_values; //!< Values of nodes
157 mutable std::vector<double> m_prefactor; //!< Power-law normalisations
158 mutable std::vector<double> m_gamma; //!< Power-law indices
159 mutable std::vector<double> m_epivot; //!< Power-law pivot energies
160 mutable std::vector<double> m_flux; //!< Photon fluxes
161 mutable std::vector<double> m_eflux; //!< Energy fluxes
162
163 // Cached members for MC
164 mutable GEnergy m_mc_emin; //!< Minimum energy
165 mutable GEnergy m_mc_emax; //!< Maximum energy
166 mutable std::vector<double> m_mc_cum; //!< Cumulative distribution
167 mutable std::vector<double> m_mc_min; //!< Lower boundary for MC
168 mutable std::vector<double> m_mc_max; //!< Upper boundary for MC
169 mutable std::vector<double> m_mc_exp; //!< Exponent for MC
170};
171
172
173/***********************************************************************//**
174 * @brief Return class name
175 *
176 * @return String containing the class name ("GModelSpectralNodes").
177 ***************************************************************************/
178inline
179std::string GModelSpectralNodes::classname(void) const
180{
181 return ("GModelSpectralNodes");
182}
183
184
185/***********************************************************************//**
186 * @brief Return model type
187 *
188 * @return "NodeFunction".
189 *
190 * Returns the type of the spectral node function model.
191 ***************************************************************************/
192inline
193std::string GModelSpectralNodes::type(void) const
194{
195 return "NodeFunction";
196}
197
198
199/***********************************************************************//**
200 * @brief Return number of nodes
201 *
202 * @return Number of nodes.
203 *
204 * Returns the number of nodes in the node function model.
205 ***************************************************************************/
206inline
208{
209 return (int)m_energies.size();
210}
211
212#endif /* GMODELSPECTRALNODES_HPP */
Energy value class definition.
Model parameter class interface definition.
Abstract spectral model base class interface definition.
Node array class interface definition.
GChatter
Definition GTypemaps.hpp:33
@ NORMAL
Definition GTypemaps.hpp:36
Energy container class.
Definition GEnergies.hpp:60
Class that handles energies in a unit independent way.
Definition GEnergy.hpp:48
Spectral nodes model class.
virtual void read(const GXmlElement &xml)
Read model from XML element.
std::vector< GModelPar > m_values
Node values.
virtual GModelSpectralNodes & operator=(const GModelSpectralNodes &model)
Assignment operator.
virtual void write(GXmlElement &xml) const
Write model into XML element.
virtual std::string print(const GChatter &chatter=NORMAL) const
Print node function information.
void reserve(const int &num)
Reserve space for nodes.
std::vector< double > m_old_energies
Old energies.
void set_flux_cache(void) const
Set flux computation cache.
std::vector< double > m_gamma
Power-law indices.
std::vector< double > m_prefactor
Power-law normalisations.
std::vector< double > m_old_values
Old values.
void set_eval_cache(void) const
Set evaluation cache.
virtual double flux(const GEnergy &emin, const GEnergy &emax) const
Returns model photon flux between [emin, emax] (units: ph/cm2/s)
void update_eval_cache(void) const
Update evaluation cache.
double error(const int &index) const
Return intensity error of node.
void update_flux_cache(void) const
Update flux computation cache.
virtual GEnergy mc(const GEnergy &emin, const GEnergy &emax, const GTime &time, GRan &ran) const
Returns MC energy between [emin, emax].
std::vector< double > m_mc_max
Upper boundary for MC.
virtual void clear(void)
Clear spectral nodes model.
void remove(const int &index)
Remove node.
std::vector< GModelPar > m_energies
Node energies.
std::vector< double > m_lin_values
Values of nodes.
int nodes(void) const
Return number of nodes.
void append(const GEnergy &energy, const double &intensity)
Append node.
virtual double eval(const GEnergy &srcEng, const GTime &srcTime=GTime(), const bool &gradients=false) const
Evaluate function.
virtual ~GModelSpectralNodes(void)
Destructor.
void extend(const GModelSpectralNodes &nodes)
Append nodes from node function.
void update_pars(void)
Update parameter mapping.
void mc_update(const GEnergy &emin, const GEnergy &emax) const
Set MC pre-computation cache.
std::vector< double > m_mc_exp
Exponent for MC.
virtual std::string classname(void) const
Return class name.
void init_members(void)
Initialise class members.
std::vector< double > m_mc_min
Lower boundary for MC.
std::vector< double > m_eflux
Energy fluxes.
void free_members(void)
Delete class members.
virtual double eflux(const GEnergy &emin, const GEnergy &emax) const
Returns model energy flux between [emin, emax] (units: erg/cm2/s)
virtual std::string type(void) const
Return model type.
virtual GModelSpectralNodes * clone(void) const
Clone spectral nodes model.
GNodeArray m_log_energies
log10(energy) of nodes
double intensity(const int &index) const
Return node intensity.
GModelSpectralNodes(void)
Void constructor.
std::vector< double > m_mc_cum
Cumulative distribution.
GEnergy energy(const int &index) const
Return node energy.
std::vector< double > m_log_values
log10(value) of nodes
void set_cache(void) const
Set pre-computation cache.
std::vector< double > m_flux
Photon fluxes.
GEnergy m_mc_emin
Minimum energy.
GEnergy m_mc_emax
Maximum energy.
void copy_members(const GModelSpectralNodes &model)
Copy class members.
std::vector< double > m_epivot
Power-law pivot energies.
void insert(const int &index, const GEnergy &energy, const double &intensity)
Insert node.
GNodeArray m_lin_energies
Energy of nodes.
Abstract spectral model base class.
Node array class.
Random number generator class.
Definition GRan.hpp:44
Time class.
Definition GTime.hpp:55
XML element node class.