ctools  2.0.0
 All Classes Namespaces Files Functions Variables Macros Pages
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
58  init_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  ***************************************************************************/
73 ctedispcube::ctedispcube(const GObservations& obs) :
74  ctobservation(CTEDISPCUBE_NAME, VERSION, obs)
75 {
76  // Initialise members
77  init_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  ***************************************************************************/
94 ctedispcube::ctedispcube(int argc, char *argv[]) :
95  ctobservation(CTEDISPCUBE_NAME, VERSION, argc, argv)
96 {
97  // Initialise members
98  init_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
222  get_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())
359  : create_cube(m_obs);
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 }
ctedispcube & operator=(const ctedispcube &app)
Assignment operator.
void init_members(void)
Initialise class members.
void setup_observations(GObservations &obs, const bool &response=true, const bool &list=true, const bool &cube=true)
Setup observation container.
Definition: ctool.cpp:431
bool m_addbounds
Add energies at boundaries?
Definition: ctedispcube.hpp:73
void save(void)
Save energy dispersion cube.
GFilename m_outcube
Output exposure cube file.
Definition: ctedispcube.hpp:72
void init_cube(void)
Initialise energy dispersion cube.
Energy dispersion cube generation tool.
Definition: ctedispcube.hpp:44
void init_members(void)
Initialise class members.
Definition: ctool.cpp:321
void free_members(void)
Delete class members.
void copy_members(const ctedispcube &app)
Copy class members.
#define CTEDISPCUBE_NAME
Definition: ctedispcube.hpp:36
void process(void)
Generate the energy dispersion cube.
void log_parameters(const GChatter &chatter)
Log application parameters.
Definition: ctool.cpp:1208
Base class for observation tools.
void free_members(void)
Delete class members.
void clear(void)
Clear energy dispersion tool.
GChatter m_chatter
Chattiness.
Definition: ctedispcube.hpp:74
void free_members(void)
Delete class members.
Definition: ctool.cpp:357
void init_members(void)
Initialise class members.
Energy dispersion cube generation tool definition.
ctedispcube(void)
Void constructor.
Definition: ctedispcube.cpp:55
GCTAEventCube create_cube(const GObservations &obs)
Create a CTA event cube from user parameters.
Definition: ctool.cpp:1006
GCTACubeEdisp m_edispcube
Energy dispersion cube.
Definition: ctedispcube.hpp:77
ctobservation & operator=(const ctobservation &app)
Assignment operator.
const bool & read_ahead(void) const
Signal whether parameters should be read ahead.
Definition: ctool.hpp:177
void log_observations(const GChatter &chatter, const GObservations &obs, const std::string &what="Observation")
Log observation container.
Definition: ctool.cpp:1251
GObservations m_obs
Observation container.
void get_parameters(void)
Get application parameters.
virtual ~ctedispcube(void)
Destructor.
GEnergies insert_energy_boundaries(const GEnergies &energies, const GCTAObservation &obs)
Insert observation energy boundaries into list of energies.
Definition: ctool.cpp:2119