GObservations.hpp
15.1 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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
/***************************************************************************
* GObservations.hpp - Observation container class *
* ----------------------------------------------------------------------- *
* copyright (C) 2009-2015 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 GObservations.hpp
* @brief Observations container class interface definition
* @author Juergen Knoedlseder
*/
#ifndef GOBSERVATIONS_HPP
#define GOBSERVATIONS_HPP
/* __ Includes ___________________________________________________________ */
#include <string>
#include <vector>
#include "GContainer.hpp"
#include "GObservation.hpp"
#include "GEvent.hpp"
#include "GOptimizer.hpp"
#include "GOptimizerFunction.hpp"
#include "GModels.hpp"
/***********************************************************************//**
* @class GObservations
*
* @brief Observation container class
*
* This is the main user interface class that provides high-level access to
* gamma-ray observations and manages their scientific analysis. For a given
* instruments, the identifiers of all observations in the container have to
* be unique, i.e. every identifier can occur only once. This allows for
* accessing the observations by instrument and by identifier.
*
* GObservations holds a list of pointers to GObservation objects which
* implement gamma-ray observations. The class derives from the abstract
* container interface class GContainer, and provides methods to manage the
* list of observations.
* The append() appends an observation to the container, the insert() method
* inserts an observation at a specific position in the list (though the
* order of the observations in the list is not relevant for the scientific
* analysis).
* The remove() method removes a specific observation from the list and the
* extend() method extends the list of observations by appending another
* list of observations to it.
* The size() method provides the number of observations in the list.
*
* The operator[] provides access to an observation in the list by index,
* returning a reference to the observation. The operator does not perform
* index range checking. If range checking is required, use the at() method.
*
* The observation information may be stored into a XML file. The save()
* method saves all information into a XML file while the load() method
* loads the information into the list. Alternatively, a XML file
* constructor can be used to construct an instance of GObservations by
* loading observation information from a XML file. In addition, the
* read() and write() method handle the reading and writing of observation
* information from and into a XML object of type GXml.
*
* The class also holds a list of models that is implemented by the GModels
* class. The models() method allows setting and retrieving the list of
* models, as well as loading of models from an XML file.
*
* Based on the list of models, the optimize() method will optimize all
* model parameters that are marked as free in the list of models. The
* npred() method returns the total number of events that are predicted
* by all models after optimization.
*
* GObservations also provides an optimizer class that is derived from
* the abstract GOptimizerFunction base class. The GObservations::optimizer
* class is the object that is used for model parameter optimization.
***************************************************************************/
class GObservations : public GContainer {
public:
// Constructors and destructors
GObservations(void);
GObservations(const GObservations& obs);
explicit GObservations(const std::string& filename);
virtual ~GObservations(void);
// Operators
GObservations& operator=(const GObservations& obs);
GObservation* operator[](const int& index);
const GObservation* operator[](const int& index) const;
// Methods
void clear(void);
GObservations* clone(void) const;
std::string classname(void) const;
GObservation* at(const int& index);
const GObservation* at(const int& index) const;
int size(void) const;
bool is_empty(void) const;
GObservation* set(const int& index, const GObservation& obs);
GObservation* append(const GObservation& obs);
GObservation* insert(const int& index, const GObservation& obs);
void remove(const int& index);
void reserve(const int& num);
void extend(const GObservations& obs);
bool contains(const std::string& instrument,
const std::string& id) const;
void load(const std::string& filename);
void save(const std::string& filename) const;
void read(const GXml& xml);
void write(GXml& xml) const;
void models(const GModels& models);
void models(const std::string& filename);
const GModels& models(void) const;
void optimize(GOptimizer& opt);
void errors(GOptimizer& opt);
void errors_hessian(void);
void eval(void);
double logL(void) const;
double npred(void) const;
std::string print(const GChatter& chatter = NORMAL) const;
// Likelihood function
class likelihood : public GOptimizerFunction {
public:
// Constructors and destructors
likelihood(void);
likelihood(GObservations* obs);
likelihood(const likelihood& fct);
~likelihood(void);
// Operators
likelihood& operator=(const likelihood& fct);
// Implemented pure virtual base class methods
virtual void eval(const GOptimizerPars& pars);
virtual double value(void) const;
virtual GVector* gradient(void);
virtual GMatrixSparse* curvature(void);
// Other methods
void set(GObservations* obs);
double npred(void) const;
GMatrixSparse hessian(const GOptimizerPars& pars);
protected:
// Protected methods
void init_members(void);
void copy_members(const likelihood& fct);
void free_members(void);
// Protected data members
double m_value; //!< Function value
double m_npred; //!< Total number of predicted events
GVector* m_gradient; //!< Pointer to gradient vector
GMatrixSparse* m_curvature; //!< Pointer to curvature matrix
GObservations* m_this; //!< Pointer to GObservations object
};
// Optimizer function access method
const GObservations::likelihood& function(void) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GObservations& obs);
void free_members(void);
int get_index(const std::string& instrument,
const std::string& id) const;
// Protected members
std::vector<GObservation*> m_obs; //!< List of observations
GModels m_models; //!< List of models
GObservations::likelihood m_fct; //!< Optimizer function
};
/***********************************************************************//**
* @brief Return class name
*
* @return String containing the class name ("GObservations").
***************************************************************************/
inline
std::string GObservations::classname(void) const
{
return ("GObservations");
}
/***********************************************************************//**
* @brief Return pointer to observation
*
* @param[in] index Observation index [0,...,size()-1].
* @return Observation.
*
* Returns a pointer to the observation with specified @p index.
***************************************************************************/
inline
GObservation* GObservations::operator[](const int& index)
{
return m_obs[index];
}
/***********************************************************************//**
* @brief Return pointer to observation (const version)
*
* @param[in] index Observation index [0,...,size()-1].
*
* Returns a const pointer to the observation with specified @p index.
***************************************************************************/
inline
const GObservation* GObservations::operator[](const int& index) const
{
return m_obs[index];
}
/***********************************************************************//**
* @brief Return number of observations in container
*
* @return Number of observations in container.
*
* Returns the number of observations in the observation container.
***************************************************************************/
inline
int GObservations::size(void) const
{
return (m_obs.size());
}
/***********************************************************************//**
* @brief Signals if there are no observations in container
*
* @return True if container is empty, false otherwise.
*
* Signals if the observation container does not contain any observation.
***************************************************************************/
inline
bool GObservations::is_empty(void) const
{
return (m_obs.empty());
}
/***********************************************************************//**
* @brief Reserves space for observations in container
*
* @param[in] num Number of observations.
*
* Reserves space for @p num observations in the container.
***************************************************************************/
inline
void GObservations::reserve(const int& num)
{
m_obs.reserve(num);
return;
}
/***********************************************************************//**
* @brief Set model container
*
* @param[in] models Model container.
*
* Sets the model container for the observations.
***************************************************************************/
inline
void GObservations::models(const GModels& models)
{
m_models = models;
return;
}
/***********************************************************************//**
* @brief Return model container
*
* @return Model container.
*
* Returns the model container of the observations.
***************************************************************************/
inline
const GModels& GObservations::models(void) const
{
return m_models;
}
/***********************************************************************//**
* @brief Return log-likelihood of models
*
* @return Log-likelihood of models.
*
* Returns the log-likelihood of models. This value if computed following a
* call of the optimize() or eval() methods. If optimize() or eval() have
* never been called, the method returns 0.
***************************************************************************/
inline
double GObservations::logL(void) const
{
return (m_fct.value());
}
/***********************************************************************//**
* @brief Return total number of predicted events in models
*
* @return Total number of predicted events in models.
*
* Returns the total number of events that is predicted by the models. This
* number if computed following a call of the optimize() or eval() methods.
* If optimize() or eval() have never been called, the method returns 0.
***************************************************************************/
inline
double GObservations::npred(void) const
{
return (m_fct.npred());
}
/***********************************************************************//**
* @brief Return likelihood function
*
* @return Reference to likelihood function.
*
* Returns a reference to the likelihood function.
***************************************************************************/
inline
const GObservations::likelihood& GObservations::function(void) const
{
return m_fct;
}
/***********************************************************************//**
* @brief Return log-likelihood value of optimizer function
*
* @return Log-likelihood value of optimizer function.
*
* Returns the log-likelihood value of optimizer function.
***************************************************************************/
inline
double GObservations::likelihood::value(void) const
{
return m_value;
}
/***********************************************************************//**
* @brief Return total number of predicted events
*
* @return Total number of predicted events.
*
* Returns the total number of events that is predicted by the models after
* they have been fitted to the data.
***************************************************************************/
inline
double GObservations::likelihood::npred(void) const
{
return m_npred;
}
/***********************************************************************//**
* @brief Return pointer to gradient vector
*
* @return Pointer to gradient vector.
*
* Returns a pointer to the parameter gradient vector.
***************************************************************************/
inline
GVector* GObservations::likelihood::gradient(void)
{
return m_gradient;
}
/***********************************************************************//**
* @brief Return pointer to curvature matrix
*
* @return Pointer to curvature matrix.
*
* Returns a pointer to the parameter curvature matrix.
***************************************************************************/
inline
GMatrixSparse* GObservations::likelihood::curvature(void)
{
return m_curvature;
}
/***********************************************************************//**
* @brief Set observation container
*
* @param[in] obs Pointer to observation container.
*
* Sets the pointer to the observation container for which the optimizer
* class should be used.
***************************************************************************/
inline
void GObservations::likelihood::set(GObservations* obs)
{
m_this = obs;
return;
}
#endif /* GOBSERVATIONS_HPP */