GModelSpectralExpPlaw.hpp
6.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/***************************************************************************
* GModelSpectralExpPlaw.hpp - Exponential cut off power law model *
* ----------------------------------------------------------------------- *
* copyright (C) 2010-2012 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 <http://www.gnu.org/licenses/>. *
* *
***************************************************************************/
/**
* @file GModelSpectralExpPlaw.hpp
* @brief Exponential cut off power law spectral class interface definition
* @author Juergen Knoedlseder
*/
#ifndef GMODELSPECTRALEXPPLAW_HPP
#define GMODELSPECTRALEXPPLAW_HPP
/* __ Includes ___________________________________________________________ */
#include <string>
#include "GModelPar.hpp"
#include "GModelSpectral.hpp"
#include "GEnergy.hpp"
#include "GXmlElement.hpp"
#include "GFunction.hpp"
/***********************************************************************//**
* @class GModelSpectralExpPlaw
*
* @brief Exponential cut off power law spectral class
*
* This class implements a power law as the spectral component of the
* gamma-ray sky model. The power law is defined as
* \f[I(E)=norm (E/pivot)^{index} \exp(-E/ecut)\f]
* where
* \f$norm\f$ is the normalization or prefactor,
* \f$pivot\f$ is the pivot energy,
* \f$index\f$ is the spectral index, and
* \f$ecut\f$ is the cut off energy.
***************************************************************************/
class GModelSpectralExpPlaw : public GModelSpectral {
public:
// Constructors and destructors
GModelSpectralExpPlaw(void);
explicit GModelSpectralExpPlaw(const double& norm, const double& index, const double& ecut);
explicit GModelSpectralExpPlaw(const GXmlElement& xml);
GModelSpectralExpPlaw(const GModelSpectralExpPlaw& model);
virtual ~GModelSpectralExpPlaw(void);
// Operators
virtual GModelSpectralExpPlaw& operator= (const GModelSpectralExpPlaw& model);
// Implemented pure virtual methods
virtual void clear(void);
virtual GModelSpectralExpPlaw* clone(void) const;
virtual std::string type(void) const { return "ExpCutoff"; }
virtual double eval(const GEnergy& srcEng) const;
virtual double eval_gradients(const GEnergy& srcEng) const;
virtual double flux(const GEnergy& emin, const GEnergy& emax) const;
virtual double eflux(const GEnergy& emin, const GEnergy& emax) const;
virtual GEnergy mc(const GEnergy& emin, const GEnergy& emax, GRan& ran) const;
virtual void read(const GXmlElement& xml);
virtual void write(GXmlElement& xml) const;
virtual std::string print(void) const;
// Other methods
void autoscale(void);
double norm(void) const { return m_norm.real_value(); }
double index(void) const { return m_index.real_value(); }
double ecut(void) const { return m_ecut.real_value(); }
double pivot(void) const { return m_pivot.real_value(); }
protected:
// Protected methods
void init_members(void);
void copy_members(const GModelSpectralExpPlaw& model);
void free_members(void);
void update_mc_cache(const GEnergy& emin, const GEnergy& emax) const;
// Photon flux integration kernel
class flux_kernel : public GFunction {
public:
flux_kernel(const double& norm,
const double& index,
const double& pivot,
const double& ecut) :
m_norm(norm),
m_index(index),
m_pivot(pivot),
m_ecut(ecut) {}
double eval(double eng);
protected:
double m_norm; //!< Normalization
double m_index; //!< Index
double m_pivot; //!< Pivot energy
double m_ecut; //!< Cut off energy
};
// Energy flux integration kernel
class eflux_kernel : public GFunction {
public:
eflux_kernel(const double& norm,
const double& index,
const double& pivot,
const double& ecut) :
m_norm(norm),
m_index(index),
m_pivot(pivot),
m_ecut(ecut) {}
double eval(double eng);
protected:
double m_norm; //!< Normalization
double m_index; //!< Index
double m_pivot; //!< Pivot energy
double m_ecut; //!< Cut off energy
};
// Protected members
GModelPar m_norm; //!< Normalization factor
GModelPar m_index; //!< Spectral index
GModelPar m_ecut; //!< Exponential cut off energy
GModelPar m_pivot; //!< Pivot energy
// Cached members used for pre-computations
mutable double m_mc_emin; //!< Minimum energy
mutable double m_mc_emax; //!< Maximum energy
mutable double m_mc_exponent; //!< Exponent (index+1)
mutable double m_mc_pow_emin; //!< Power of minimum energy
mutable double m_mc_pow_ewidth; //!< Power of energy width
};
#endif /* GMODELSPECTRALEXPPLAW_HPP */