ctools 2.1.0
Loading...
Searching...
No Matches
ctedispcube.cpp
Go to the documentation of this file.
1/***************************************************************************
2 * ctedispcube - Energy dispersion cube generation tool *
3 * ----------------------------------------------------------------------- *
4 * copyright (C) 2016-2022 by Maria Haupt *
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 ctedispcube.cpp
23 * @brief Energy dispersion cube generation tool implementation
24 * @author Maria Haupt
25 */
26
27/* __ Includes ___________________________________________________________ */
28#ifdef HAVE_CONFIG_H
29#include <config.h>
30#endif
31#include <cstdio>
32#include "ctedispcube.hpp"
33#include "GTools.hpp"
34#include "GWcs.hpp"
35
36/* __ Method name definitions ____________________________________________ */
37#define G_GET_PARAMETERS "ctedispcube::get_parameters()"
38
39/* __ Debug definitions __________________________________________________ */
40
41/* __ Coding definitions _________________________________________________ */
42
43
44/*==========================================================================
45 = =
46 = Constructors/destructors =
47 = =
48 ==========================================================================*/
49
50/***********************************************************************//**
51 * @brief Void constructor
52 *
53 * Constructs an empty energy dispersion tool.
54 ***************************************************************************/
56{
57 // Initialise members
59
60 // Return
61 return;
62}
63
64
65/***********************************************************************//**
66 * @brief Observations constructor
67 *
68 * @param[in] obs Observation container.
69 *
70 * Constructs an energy dispersion tool from the information that is provided
71 * in an observation container @p obs.
72 ***************************************************************************/
73ctedispcube::ctedispcube(const GObservations& obs) :
74 ctobservation(CTEDISPCUBE_NAME, VERSION, obs)
75{
76 // Initialise members
78
79 // Return
80 return;
81}
82
83
84
85/***********************************************************************//**
86 * @brief Command line constructor
87 *
88 * @param[in] argc Number of arguments in command line.
89 * @param[in] argv Array of command line arguments.
90 *
91 * Constructs an energy dispersion tool by parsing the arguments provided
92 * on the command line.
93 ***************************************************************************/
94ctedispcube::ctedispcube(int argc, char *argv[]) :
95 ctobservation(CTEDISPCUBE_NAME, VERSION, argc, argv)
96{
97 // Initialise members
99
100 // Return
101 return;
102}
103
104
105/***********************************************************************//**
106 * @brief Copy constructor
107 *
108 * @param[in] app Energy dispersion tool.
109 *
110 * Constructs an energy dispersion tool by copying anothere energy
111 * dispersion tool.
112 ***************************************************************************/
114{
115 // Initialise members
116 init_members();
117
118 // Copy members
119 copy_members(app);
120
121 // Return
122 return;
123}
124
125
126/***********************************************************************//**
127 * @brief Destructor
128 *
129 * Desctructs an energy dispersion tool.
130 ***************************************************************************/
132{
133 // Free members
134 free_members();
135
136 // Return
137 return;
138}
139
140
141/*==========================================================================
142 = =
143 = Operators =
144 = =
145 ==========================================================================*/
146
147/***********************************************************************//**
148 * @brief Assignment operator
149 *
150 * @param[in] app Energy dispersion tool.
151 * @return Energy dispersion tool.
152 *
153 * Assigns energy dispersion tool.
154 ***************************************************************************/
156{
157 // Execute only if object is not identical
158 if (this != &app) {
159
160 // Copy base class members
161 this->ctobservation::operator=(app);
162
163 // Free members
164 free_members();
165
166 // Initialise members
167 init_members();
168
169 // Copy members
170 copy_members(app);
171
172 } // endif: object was not identical
173
174 // Return this object
175 return *this;
176}
177
178
179/*==========================================================================
180 = =
181 = Public methods =
182 = =
183 ==========================================================================*/
184
185/***********************************************************************//**
186 * @brief Clear energy dispersion tool
187 *
188 * Set the energy disperison tool to an empty tool.
189 ***************************************************************************/
191{
192 // Free members
193 free_members();
195 this->ctool::free_members();
196
197 // Clear base class (needed to conserve tool name and version)
198 this->GApplication::clear();
199
200 // Initialise members
201 this->ctool::init_members();
203 init_members();
204
205 // Write header into logger
206 log_header();
207
208 // Return
209 return;
210}
211
212
213/***********************************************************************//**
214 * @brief Generate the energy dispersion cube
215 *
216 * Generates the energy dispersion cube by looping over all unbinned CTA
217 * observations in the observation container.
218 ***************************************************************************/
220{
221 // Get task parameters
223
224 // Write input observation container into logger
225 log_observations(NORMAL, m_obs, "Input observation");
226
227 // Initialise energy dispersion cube
228 init_cube();
229
230 // Write header into logger
231 log_header1(TERSE, "Generate energy dispersion cube");
232
233 // Set pointer to logger dependent on chattiness
234 GLog* logger = (logNormal()) ? &log : NULL;
235
236 // Fill energy dispersion cube
237 m_edispcube.fill(m_obs, logger);
238
239 // Write energy dispersion cube into logger
240 log_string(EXPLICIT, m_edispcube.print(m_chatter));
241
242 // Return
243 return;
244}
245
246
247/***********************************************************************//**
248 * @brief Save energy dispersion cube
249 *
250 * Saves the energy dispersion cube in a FITS file. The FITS filename is
251 * provided by the "outcube" parameter.
252 ***************************************************************************/
254{
255 // Write header into logger
256 log_header1(TERSE, "Save energy dispersion cube");
257
258 // Save energy dispersion cube if filename and the energy dispersion cube
259 // are not empty
260 if ((*this)["outcube"].is_valid() && !m_edispcube.cube().is_empty()) {
261
262 // Get output filename
263 m_outcube = (*this)["outcube"].filename();
264
265 // Save energy dispersion cube
266 m_edispcube.save(m_outcube, clobber());
267
268 // Stamp energy dispersion cube
269 stamp(m_outcube);
270
271 }
272
273 // Write into logger what has been done
274 std::string fname = (m_outcube.is_empty()) ? "NONE" : m_outcube.url();
275 if (m_edispcube.cube().is_empty()) {
276 fname.append(" (cube is empty, no file created)");
277 }
278 log_value(NORMAL, "Energy dispersion cube file", fname);
279
280 // Return
281 return;
282}
283
284
285/*==========================================================================
286 = =
287 = Private methods =
288 = =
289 ==========================================================================*/
290
291/***********************************************************************//**
292 * @brief Initialise class members
293 ***************************************************************************/
295{
296 // Initialise user parameters
297 m_outcube.clear();
298 m_addbounds = true;
299 m_chatter = static_cast<GChatter>(2);
300
301 // Initialise protected members
302 m_edispcube.clear();
303
304 // Return
305 return;
306}
307
308
309/***********************************************************************//**
310 * @brief Copy class members
311 *
312 * @param[in] app Energy dispersion cube.
313 ***************************************************************************/
315{
316 // Copy user parameters
317 m_outcube = app.m_outcube;
318 m_addbounds = app.m_addbounds;
319 m_chatter = app.m_chatter;
320
321 // Copy protected members
322 m_edispcube = app.m_edispcube;
323
324 // Return
325 return;
326}
327
328
329/***********************************************************************//**
330 * @brief Delete class members
331 ***************************************************************************/
333{
334 // Return
335 return;
336}
337
338
339/***********************************************************************//**
340 * @brief Get application parameters
341 *
342 * Get all task parameters from parameter file or (if required) by querying
343 * the user. The parameters are read in the correct order.
344 ***************************************************************************/
346{
347 // Setup observations from "inobs" parameter. Do not accept counts cubes.
348 setup_observations(m_obs, true, true, false);
349
350 // Get additional binning parameters
351 double migramax = (*this)["migramax"].real();
352 int migrabins = (*this)["migrabins"].integer();
353
354 // If the "incube" file name is valid then setup the energy dispersion
355 // cube from the counts cube. Otherwise create a counts cube from the
356 // user parameters
357 GCTAEventCube cube = (*this)["incube"].is_valid()
358 ? GCTAEventCube((*this)["incube"].filename())
360
361 // Define edisp cube
362 m_edispcube = GCTACubeEdisp(cube, migramax, migrabins);
363
364 // Get remaining parameters
365 m_addbounds = (*this)["addbounds"].boolean();
366 m_chatter = static_cast<GChatter>((*this)["chatter"].integer());
367
368 // If needed later, query output filename now
369 if (read_ahead()) {
370 (*this)["outcube"].query();
371 }
372
373 // Write parameters into logger
374 log_parameters(TERSE);
375
376 // Return
377 return;
378}
379
380
381/***********************************************************************//**
382 * @brief Initialise energy dispersion cube
383 *
384 * Initialise the energy dispersion cube.
385 ***************************************************************************/
387{
388 // Write header into logger
389 log_header1(TERSE, "Initialise energy dispersion cube");
390
391 // Extract energy dispersion definition
392 const GWcs* proj = static_cast<const GWcs*>(m_edispcube.cube().projection());
393 std::string wcs = m_edispcube.cube().projection()->code();
394 std::string coords = m_edispcube.cube().projection()->coordsys();
395 double x = proj->crval(0);
396 double y = proj->crval(1);
397 double dx = proj->cdelt(0);
398 double dy = proj->cdelt(1);
399 int nx = m_edispcube.cube().nx();
400 int ny = m_edispcube.cube().ny();
401 double mmax = (*this)["migramax"].real();
402 int nmbins = (*this)["migrabins"].integer();
403
404 // Extract energies
405 GEnergies energies = m_edispcube.energies();
406
407 // If requested, insert energies at all event list energy boundaries
408 if (m_addbounds) {
409
410 // Loop over all observations
411 for (int i = 0; i < m_obs.size(); ++i) {
412
413 // Get observation and continue only if it is a CTA observation
414 const GCTAObservation* cta = dynamic_cast<const GCTAObservation*>
415 (m_obs[i]);
416
417 // Skip observation if it's not a CTA observation
418 if (cta == NULL) {
419 continue;
420 }
421
422 // Skip observation if it does not contain an event list
423 if (cta->eventtype() != "EventList") {
424 continue;
425 }
426
427 // Insert energy boundaries
428 energies = insert_energy_boundaries(energies, *cta);
429
430 } // endfor: looped over all observations
431
432 } // endif: energy bin insertion requested
433
434 // Setup energy dispersion cube
435 m_edispcube = GCTACubeEdisp(wcs, coords, x, y, dx, dy, nx, ny, energies,
436 mmax, nmbins);
437
438 // Write energy dispersion cube in logger
439 log_string(NORMAL, m_edispcube.print(m_chatter));
440
441 // Return
442 return;
443}
Energy dispersion cube generation tool.
GFilename m_outcube
Output exposure cube file.
void copy_members(const ctedispcube &app)
Copy class members.
void clear(void)
Clear energy dispersion tool.
void get_parameters(void)
Get application parameters.
ctedispcube(void)
Void constructor.
void save(void)
Save energy dispersion cube.
void init_members(void)
Initialise class members.
GChatter m_chatter
Chattiness.
ctedispcube & operator=(const ctedispcube &app)
Assignment operator.
GCTACubeEdisp m_edispcube
Energy dispersion cube.
void init_cube(void)
Initialise energy dispersion cube.
virtual ~ctedispcube(void)
Destructor.
void process(void)
Generate the energy dispersion cube.
bool m_addbounds
Add energies at boundaries?
void free_members(void)
Delete class members.
Base class for observation tools.
void free_members(void)
Delete class members.
ctobservation & operator=(const ctobservation &app)
Assignment operator.
GObservations m_obs
Observation container.
void init_members(void)
Initialise class members.
GEnergies insert_energy_boundaries(const GEnergies &energies, const GCTAObservation &obs)
Insert observation energy boundaries into list of energies.
Definition ctool.cpp:2119
void free_members(void)
Delete class members.
Definition ctool.cpp:357
void log_observations(const GChatter &chatter, const GObservations &obs, const std::string &what="Observation")
Log observation container.
Definition ctool.cpp:1251
const bool & read_ahead(void) const
Signal whether parameters should be read ahead.
Definition ctool.hpp:177
void log_parameters(const GChatter &chatter)
Log application parameters.
Definition ctool.cpp:1208
void init_members(void)
Initialise class members.
Definition ctool.cpp:321
GCTAEventCube create_cube(const GObservations &obs)
Create a CTA event cube from user parameters.
Definition ctool.cpp:1006
void setup_observations(GObservations &obs, const bool &response=true, const bool &list=true, const bool &cube=true)
Setup observation container.
Definition ctool.cpp:431
Energy dispersion cube generation tool definition.
#define CTEDISPCUBE_NAME