Commit 8256fabc49ca2b8ae9a509f06a510dbf3283f930
1 parent
f06798cd
adapt to new GObservation/GEvents interfaces
Showing
3 changed files
with
329 additions
and
161 deletions
src/ctselect/ctselect.cpp
| @@ -20,18 +20,13 @@ | @@ -20,18 +20,13 @@ | ||
| 20 | #ifdef HAVE_CONFIG_H | 20 | #ifdef HAVE_CONFIG_H |
| 21 | #include <config.h> | 21 | #include <config.h> |
| 22 | #endif | 22 | #endif |
| 23 | -#include <stdio.h> | 23 | +#include <cstdio> |
| 24 | #include "ctselect.hpp" | 24 | #include "ctselect.hpp" |
| 25 | #include "GTools.hpp" | 25 | #include "GTools.hpp" |
| 26 | 26 | ||
| 27 | /* __ Debug definitions __________________________________________________ */ | 27 | /* __ Debug definitions __________________________________________________ */ |
| 28 | -#define BIT_COLUMN_TEST 0 | ||
| 29 | -#define STRING_COLUMN_TEST 1 | ||
| 30 | 28 | ||
| 31 | /* __ Coding definitions _________________________________________________ */ | 29 | /* __ Coding definitions _________________________________________________ */ |
| 32 | -#define SELECT_TIME 1 | ||
| 33 | -#define SELECT_ENERGY 1 | ||
| 34 | -#define SELECT_ROI 1 | ||
| 35 | 30 | ||
| 36 | 31 | ||
| 37 | /*========================================================================== | 32 | /*========================================================================== |
| @@ -57,6 +52,30 @@ ctselect::ctselect(void) : GApplication(CTSELECT_NAME, CTSELECT_VERSION) | @@ -57,6 +52,30 @@ ctselect::ctselect(void) : GApplication(CTSELECT_NAME, CTSELECT_VERSION) | ||
| 57 | 52 | ||
| 58 | 53 | ||
| 59 | /***********************************************************************//** | 54 | /***********************************************************************//** |
| 55 | + * @brief Observations constructor | ||
| 56 | + * | ||
| 57 | + * This constructor creates an instance of the class that is initialised from | ||
| 58 | + * an observation container. | ||
| 59 | + ***************************************************************************/ | ||
| 60 | +ctselect::ctselect(GObservations obs) : GApplication(CTSELECT_NAME, CTSELECT_VERSION) | ||
| 61 | +{ | ||
| 62 | + // Initialise members | ||
| 63 | + init_members(); | ||
| 64 | + | ||
| 65 | + // Set observations | ||
| 66 | + m_obs = obs; | ||
| 67 | + | ||
| 68 | + // Write header into logger | ||
| 69 | + log_header(); | ||
| 70 | + | ||
| 71 | + // Return | ||
| 72 | + return; | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | + | ||
| 76 | + | ||
| 77 | + | ||
| 78 | +/***********************************************************************//** | ||
| 60 | * @brief Command line constructor | 79 | * @brief Command line constructor |
| 61 | * | 80 | * |
| 62 | * @param[in] argc Number of arguments in command line. | 81 | * @param[in] argc Number of arguments in command line. |
| @@ -77,6 +96,24 @@ ctselect::ctselect(int argc, char *argv[]) : | @@ -77,6 +96,24 @@ ctselect::ctselect(int argc, char *argv[]) : | ||
| 77 | 96 | ||
| 78 | 97 | ||
| 79 | /***********************************************************************//** | 98 | /***********************************************************************//** |
| 99 | + * @brief Copy constructor | ||
| 100 | + * | ||
| 101 | + * @param[in] app Application. | ||
| 102 | + ***************************************************************************/ | ||
| 103 | +ctselect::ctselect(const ctselect& app) : GApplication(app) | ||
| 104 | +{ | ||
| 105 | + // Initialise members | ||
| 106 | + init_members(); | ||
| 107 | + | ||
| 108 | + // Copy members | ||
| 109 | + copy_members(app); | ||
| 110 | + | ||
| 111 | + // Return | ||
| 112 | + return; | ||
| 113 | +} | ||
| 114 | + | ||
| 115 | + | ||
| 116 | +/***********************************************************************//** | ||
| 80 | * @brief Destructor | 117 | * @brief Destructor |
| 81 | ***************************************************************************/ | 118 | ***************************************************************************/ |
| 82 | ctselect::~ctselect(void) | 119 | ctselect::~ctselect(void) |
| @@ -95,6 +132,35 @@ ctselect::~ctselect(void) | @@ -95,6 +132,35 @@ ctselect::~ctselect(void) | ||
| 95 | = = | 132 | = = |
| 96 | ==========================================================================*/ | 133 | ==========================================================================*/ |
| 97 | 134 | ||
| 135 | +/***********************************************************************//** | ||
| 136 | + * @brief Assignment operator | ||
| 137 | + * | ||
| 138 | + * @param[in] app Application. | ||
| 139 | + ***************************************************************************/ | ||
| 140 | +ctselect& ctselect::operator= (const ctselect& app) | ||
| 141 | +{ | ||
| 142 | + // Execute only if object is not identical | ||
| 143 | + if (this != &app) { | ||
| 144 | + | ||
| 145 | + // Copy base class members | ||
| 146 | + this->GApplication::operator=(app); | ||
| 147 | + | ||
| 148 | + // Free members | ||
| 149 | + free_members(); | ||
| 150 | + | ||
| 151 | + // Initialise members | ||
| 152 | + init_members(); | ||
| 153 | + | ||
| 154 | + // Copy members | ||
| 155 | + copy_members(app); | ||
| 156 | + | ||
| 157 | + } // endif: object was not identical | ||
| 158 | + | ||
| 159 | + // Return this object | ||
| 160 | + return *this; | ||
| 161 | +} | ||
| 162 | + | ||
| 163 | + | ||
| 98 | /*========================================================================== | 164 | /*========================================================================== |
| 99 | = = | 165 | = = |
| 100 | = Public methods = | 166 | = Public methods = |
| @@ -102,10 +168,55 @@ ctselect::~ctselect(void) | @@ -102,10 +168,55 @@ ctselect::~ctselect(void) | ||
| 102 | ==========================================================================*/ | 168 | ==========================================================================*/ |
| 103 | 169 | ||
| 104 | /***********************************************************************//** | 170 | /***********************************************************************//** |
| 171 | + * @brief Clear instance | ||
| 172 | + ***************************************************************************/ | ||
| 173 | +void ctselect::clear(void) | ||
| 174 | +{ | ||
| 175 | + // Free members | ||
| 176 | + free_members(); | ||
| 177 | + this->GApplication::free_members(); | ||
| 178 | + | ||
| 179 | + // Initialise members | ||
| 180 | + this->GApplication::init_members(); | ||
| 181 | + init_members(); | ||
| 182 | + | ||
| 183 | + // Return | ||
| 184 | + return; | ||
| 185 | +} | ||
| 186 | + | ||
| 187 | + | ||
| 188 | +/***********************************************************************//** | ||
| 189 | + * @brief Execute application | ||
| 190 | + * | ||
| 191 | + * This method performs the event selection and saves the result | ||
| 192 | + ***************************************************************************/ | ||
| 193 | +void ctselect::execute(void) | ||
| 194 | +{ | ||
| 195 | + // Read ahead output filename so that it gets dumped correctly in the | ||
| 196 | + // parameters log | ||
| 197 | + m_outfile = par("outfile")->value(); | ||
| 198 | + | ||
| 199 | + // Perform event selection | ||
| 200 | + run(); | ||
| 201 | + | ||
| 202 | + // Save results | ||
| 203 | + save(); | ||
| 204 | + | ||
| 205 | + // Return | ||
| 206 | + return; | ||
| 207 | +} | ||
| 208 | + | ||
| 209 | + | ||
| 210 | + | ||
| 211 | +/***********************************************************************//** | ||
| 105 | * @brief Select event data | 212 | * @brief Select event data |
| 106 | * | 213 | * |
| 107 | - * A GTI is appended to the FITS file as in the actual data format no GTI | ||
| 108 | - * exists. | 214 | + * This method reads in the application parameters and loops over all |
| 215 | + * observations that were found to perform an event selection. Event | ||
| 216 | + * selection is done by writing each observation to a temporary file and | ||
| 217 | + * re-opening the temporary file using the cfitsio event filter syntax. | ||
| 218 | + * The temporary file is deleted after this action so that no disk overflow | ||
| 219 | + * will occur. | ||
| 109 | ***************************************************************************/ | 220 | ***************************************************************************/ |
| 110 | void ctselect::run(void) | 221 | void ctselect::run(void) |
| 111 | { | 222 | { |
| @@ -122,24 +233,95 @@ void ctselect::run(void) | @@ -122,24 +233,95 @@ void ctselect::run(void) | ||
| 122 | log << std::endl; | 233 | log << std::endl; |
| 123 | } | 234 | } |
| 124 | 235 | ||
| 125 | - // Select events | ||
| 126 | - select(); | 236 | + // Write observation(s) into logger |
| 237 | + if (logTerse()) { | ||
| 238 | + log << std::endl; | ||
| 239 | + log.header1("Observations before selection"); | ||
| 240 | + log << m_obs << std::endl; | ||
| 241 | + } | ||
| 127 | 242 | ||
| 128 | - // Append GTI to FITS file | ||
| 129 | - append_gti(); | 243 | + // Write header |
| 244 | + if (logTerse()) { | ||
| 245 | + log << std::endl; | ||
| 246 | + log.header1("Event selection"); | ||
| 247 | + } | ||
| 130 | 248 | ||
| 131 | - // Set data selection keywords | ||
| 132 | - write_ds_keys(); | 249 | + // Loop over all observation in the container |
| 250 | + for (int i = 0; i < m_obs.size(); ++i) { | ||
| 133 | 251 | ||
| 134 | - // Save output FITS file | ||
| 135 | - m_file.saveto(m_outfile, clobber()); | 252 | + // Get CTA observation |
| 253 | + GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs(i)); | ||
| 136 | 254 | ||
| 137 | - // Close FITS file | ||
| 138 | - m_file.close(); | 255 | + // Continue only if observation is a CTA observation |
| 256 | + if (obs != NULL) { | ||
| 139 | 257 | ||
| 140 | - // Write separator into logger | ||
| 141 | - if (logTerse()) | 258 | + // Write header for observation |
| 259 | + if (logTerse()) { | ||
| 260 | + if (obs->name().length() > 1) | ||
| 261 | + log.header3("Observation "+obs->name()); | ||
| 262 | + else | ||
| 263 | + log.header3("Observation"); | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | + // Get temporary file name | ||
| 267 | + std::string filename = std::tmpnam(NULL); | ||
| 268 | + | ||
| 269 | + // Save observation in temporary file | ||
| 270 | + obs->save(filename, true); | ||
| 271 | + | ||
| 272 | + // Load observation from temporary file, including event selection | ||
| 273 | + select_events(obs, filename); | ||
| 274 | + | ||
| 275 | + // Remove temporary file | ||
| 276 | + std::remove(filename.c_str()); | ||
| 277 | + | ||
| 278 | + } // endif: had a CTA observation | ||
| 279 | + | ||
| 280 | + } // endfor: looped over all observations | ||
| 281 | + | ||
| 282 | + // Write observation(s) into logger | ||
| 283 | + if (logTerse()) { | ||
| 142 | log << std::endl; | 284 | log << std::endl; |
| 285 | + log.header1("Observations after selection"); | ||
| 286 | + log << m_obs << std::endl; | ||
| 287 | + } | ||
| 288 | + | ||
| 289 | + // Return | ||
| 290 | + return; | ||
| 291 | +} | ||
| 292 | + | ||
| 293 | + | ||
| 294 | +/***********************************************************************//** | ||
| 295 | + * @brief Save simulated observation | ||
| 296 | + * | ||
| 297 | + * This method saves the results. | ||
| 298 | + ***************************************************************************/ | ||
| 299 | +void ctselect::save(void) | ||
| 300 | +{ | ||
| 301 | + // Write header | ||
| 302 | + if (logTerse()) { | ||
| 303 | + log << std::endl; | ||
| 304 | + log.header1("Save observations"); | ||
| 305 | + } | ||
| 306 | + | ||
| 307 | + // Get output filename | ||
| 308 | + m_outfile = par("outfile")->value(); | ||
| 309 | + | ||
| 310 | + // Loop over all observation in the container | ||
| 311 | + for (int i = 0; i < m_obs.size(); ++i) { | ||
| 312 | + | ||
| 313 | + // Get CTA observation | ||
| 314 | + GCTAObservation* obs = dynamic_cast<GCTAObservation*>(m_obs(i)); | ||
| 315 | + | ||
| 316 | + // Save only if observation is a CTA observation | ||
| 317 | + if (obs != NULL) { | ||
| 318 | + | ||
| 319 | + // Save file | ||
| 320 | + obs->save(m_outfile, clobber()); | ||
| 321 | + | ||
| 322 | + } // endif: observation was valid | ||
| 323 | + | ||
| 324 | + } // endfor: looped over observations | ||
| 143 | 325 | ||
| 144 | // Return | 326 | // Return |
| 145 | return; | 327 | return; |
| @@ -154,16 +336,32 @@ void ctselect::run(void) | @@ -154,16 +336,32 @@ void ctselect::run(void) | ||
| 154 | ***************************************************************************/ | 336 | ***************************************************************************/ |
| 155 | void ctselect::get_parameters(void) | 337 | void ctselect::get_parameters(void) |
| 156 | { | 338 | { |
| 339 | + // If there are no observations in container then add a single CTA | ||
| 340 | + // observation using the parameters from the parameter file | ||
| 341 | + if (m_obs.size() == 0) { | ||
| 342 | + | ||
| 343 | + // Get CTA event list file name | ||
| 344 | + m_infile = par("infile")->value(); | ||
| 345 | + | ||
| 346 | + // Allocate CTA observation | ||
| 347 | + GCTAObservation obs; | ||
| 348 | + | ||
| 349 | + // Load CTA observation from file | ||
| 350 | + obs.load_unbinned(m_infile); | ||
| 351 | + | ||
| 352 | + // Append CTA observation to container | ||
| 353 | + m_obs.append(obs); | ||
| 354 | + | ||
| 355 | + } // endif: there was no observation in the container | ||
| 356 | + | ||
| 157 | // Get parameters | 357 | // Get parameters |
| 158 | - m_infile = par("infile")->value(); | ||
| 159 | - m_outfile = par("outfile")->value(); | ||
| 160 | - m_ra = par("ra")->real(); | ||
| 161 | - m_dec = par("dec")->real(); | ||
| 162 | - m_rad = par("rad")->real(); | ||
| 163 | - m_tmin = par("tmin")->real(); | ||
| 164 | - m_tmax = par("tmax")->real(); | ||
| 165 | - m_emin = par("emin")->real(); | ||
| 166 | - m_emax = par("emax")->real(); | 358 | + m_ra = par("ra")->real(); |
| 359 | + m_dec = par("dec")->real(); | ||
| 360 | + m_rad = par("rad")->real(); | ||
| 361 | + m_tmin = par("tmin")->real(); | ||
| 362 | + m_tmax = par("tmax")->real(); | ||
| 363 | + m_emin = par("emin")->real(); | ||
| 364 | + m_emax = par("emax")->real(); | ||
| 167 | 365 | ||
| 168 | // Return | 366 | // Return |
| 169 | return; | 367 | return; |
| @@ -174,170 +372,99 @@ void ctselect::get_parameters(void) | @@ -174,170 +372,99 @@ void ctselect::get_parameters(void) | ||
| 174 | * @brief Select events | 372 | * @brief Select events |
| 175 | * | 373 | * |
| 176 | * Select events from a FITS file by making use of the selection possibility | 374 | * Select events from a FITS file by making use of the selection possibility |
| 177 | - * of the cfitsio library on loading a file into memory. Event selection is | ||
| 178 | - * kept optional (on compile time) as the data format may still evolve (for | ||
| 179 | - * the time being the TIME information is not valid). | 375 | + * of the cfitsio library on loading a file. |
| 180 | * | 376 | * |
| 181 | - * @todo Set data selection keywords. | 377 | + * @todo Implement a observation read() method to avoid saving the |
| 378 | + * observation to a temporary file. | ||
| 182 | ***************************************************************************/ | 379 | ***************************************************************************/ |
| 183 | -void ctselect::select(void) | 380 | +void ctselect::select_events(GCTAObservation* obs, const std::string& filename) |
| 184 | { | 381 | { |
| 185 | - // Write Header for event selection | ||
| 186 | - if (logTerse()) { | ||
| 187 | - log << std::endl; | ||
| 188 | - log.header1("Event selection"); | ||
| 189 | - } | ||
| 190 | - | ||
| 191 | - // Build selection string | 382 | + // Allocate selection string |
| 192 | std::string selection; | 383 | std::string selection; |
| 193 | - #if SELECT_TIME | 384 | + |
| 385 | + // Make time selection | ||
| 194 | selection = "TIME >= "+str(m_tmin)+" && TIME <= "+str(m_tmax); | 386 | selection = "TIME >= "+str(m_tmin)+" && TIME <= "+str(m_tmax); |
| 195 | if (logTerse()) | 387 | if (logTerse()) |
| 196 | log << " Time range ................: " << m_tmin << "-" << m_tmax | 388 | log << " Time range ................: " << m_tmin << "-" << m_tmax |
| 197 | << std::endl; | 389 | << std::endl; |
| 198 | - #endif | ||
| 199 | - #if SELECT_ENERGY | ||
| 200 | if (selection.length() > 0) | 390 | if (selection.length() > 0) |
| 201 | selection += " && "; | 391 | selection += " && "; |
| 392 | + | ||
| 393 | + // Make energy selection | ||
| 202 | selection += "ENERGY >= "+str(m_emin)+" && ENERGY <= "+str(m_emax); | 394 | selection += "ENERGY >= "+str(m_emin)+" && ENERGY <= "+str(m_emax); |
| 203 | if (logTerse()) | 395 | if (logTerse()) |
| 204 | log << " Energy range ..............: " << m_emin << "-" << m_emax | 396 | log << " Energy range ..............: " << m_emin << "-" << m_emax |
| 205 | << " TeV" << std::endl; | 397 | << " TeV" << std::endl; |
| 206 | - #endif | ||
| 207 | - #if SELECT_ROI | ||
| 208 | if (selection.length() > 0) | 398 | if (selection.length() > 0) |
| 209 | selection += " && "; | 399 | selection += " && "; |
| 400 | + | ||
| 401 | + // Make ROI selection | ||
| 210 | selection += "ANGSEP("+str(m_ra)+","+str(m_dec)+",RA,DEC) <= "+str(m_rad); | 402 | selection += "ANGSEP("+str(m_ra)+","+str(m_dec)+",RA,DEC) <= "+str(m_rad); |
| 211 | if (logTerse()) { | 403 | if (logTerse()) { |
| 212 | log << " Acceptance cone centre ....: RA=" << m_ra << ", DEC=" << m_dec | 404 | log << " Acceptance cone centre ....: RA=" << m_ra << ", DEC=" << m_dec |
| 213 | << " deg" << std::endl; | 405 | << " deg" << std::endl; |
| 214 | log << " Acceptance cone radius ....: " << m_rad << " deg" << std::endl; | 406 | log << " Acceptance cone radius ....: " << m_rad << " deg" << std::endl; |
| 215 | } | 407 | } |
| 216 | - #endif | ||
| 217 | if (logTerse()) | 408 | if (logTerse()) |
| 218 | log << " cfitsio selection .........: " << selection << std::endl; | 409 | log << " cfitsio selection .........: " << selection << std::endl; |
| 219 | 410 | ||
| 220 | // Build input filename including selection expression | 411 | // Build input filename including selection expression |
| 221 | - std::string expression = m_infile; | 412 | + std::string expression = filename; |
| 222 | if (selection.length() > 0) | 413 | if (selection.length() > 0) |
| 223 | expression += "[EVENTS]["+selection+"]"; | 414 | expression += "[EVENTS]["+selection+"]"; |
| 224 | if (logTerse()) | 415 | if (logTerse()) |
| 225 | log << " FITS filename .............: " << expression << std::endl; | 416 | log << " FITS filename .............: " << expression << std::endl; |
| 226 | 417 | ||
| 227 | // Open FITS file | 418 | // Open FITS file |
| 228 | - m_file.open(expression); | 419 | + GFits file(expression); |
| 229 | 420 | ||
| 230 | // Log selected FITS file | 421 | // Log selected FITS file |
| 231 | if (logExplicit()) { | 422 | if (logExplicit()) { |
| 232 | log << std::endl; | 423 | log << std::endl; |
| 233 | log.header1("FITS file content after selection"); | 424 | log.header1("FITS file content after selection"); |
| 234 | - log << m_file << std::endl; | 425 | + log << file << std::endl; |
| 235 | } | 426 | } |
| 236 | 427 | ||
| 237 | - // Return | ||
| 238 | - return; | ||
| 239 | -} | ||
| 240 | - | ||
| 241 | - | ||
| 242 | -/***********************************************************************//** | ||
| 243 | - * @brief Append GTI to FITS file | ||
| 244 | - * | ||
| 245 | - * @todo We implement here a dummy method that overwrites an existing GTI | ||
| 246 | - * entry but that only works if a single time interval exists. This | ||
| 247 | - * is not clean, but since we have no method so far that allows | ||
| 248 | - * deleting a HDU from a FITS file we have no other choice. Ideally, | ||
| 249 | - * we would like to first delete an existing HDU and then append | ||
| 250 | - * a new one. If this is not possible, we would like to delete the | ||
| 251 | - * rows from an existing GTI and then fill it up anew. But in any | ||
| 252 | - * case, the actual data selection method does not check the | ||
| 253 | - * existing GTI, which we have to do to merge any subselection | ||
| 254 | - * information in. In fact, we need a GTI merge method as well ... | ||
| 255 | - ***************************************************************************/ | ||
| 256 | -void ctselect::append_gti(void) | ||
| 257 | -{ | ||
| 258 | - // Setup selected time range | 428 | + // Get temporary file name |
| 429 | + std::string tmpname = std::tmpnam(NULL); | ||
| 430 | + | ||
| 431 | + // Save FITS file to temporary file | ||
| 432 | + file.saveto(tmpname, true); | ||
| 433 | + | ||
| 434 | + // Load observation from temporary file | ||
| 435 | + obs->load_unbinned(tmpname); | ||
| 436 | + | ||
| 437 | + // Get CTA event list pointer | ||
| 438 | + GCTAEventList* list = (GCTAEventList*)(obs->events()); | ||
| 439 | + | ||
| 440 | + // Set ROI | ||
| 441 | + GCTARoi roi; | ||
| 442 | + GCTAInstDir instdir; | ||
| 443 | + instdir.radec_deg(m_ra, m_dec); | ||
| 444 | + roi.centre(instdir); | ||
| 445 | + roi.radius(m_rad); | ||
| 446 | + list->roi(roi); | ||
| 447 | + | ||
| 448 | + // Set GTI | ||
| 449 | + GGti gti; | ||
| 259 | GTime tstart; | 450 | GTime tstart; |
| 260 | GTime tstop; | 451 | GTime tstop; |
| 261 | tstart.met(m_tmin); | 452 | tstart.met(m_tmin); |
| 262 | tstop.met(m_tmax); | 453 | tstop.met(m_tmax); |
| 454 | + gti.append(tstart, tstop); | ||
| 455 | + list->gti(gti); | ||
| 263 | 456 | ||
| 264 | - // Initialise empty GTI table HDU | ||
| 265 | - GFitsTable* hdu = NULL; | ||
| 266 | - | ||
| 267 | - // Write selected time interval, either in an existing GTI or in a new | ||
| 268 | - // GTI that is appended to the FITS file | ||
| 269 | - try { | ||
| 270 | - hdu = m_file.table("GTI"); | ||
| 271 | - GFitsTableDoubleCol* start = (GFitsTableDoubleCol*)hdu->column("START"); | ||
| 272 | - GFitsTableDoubleCol* stop = (GFitsTableDoubleCol*)hdu->column("STOP"); | ||
| 273 | - (*start)(0) = tstart.met(); | ||
| 274 | - (*stop)(0) = tstop.met(); | ||
| 275 | - } | ||
| 276 | - catch (GException::fits_hdu_not_found) { | ||
| 277 | - // Allocate Gti | ||
| 278 | - GGti gti; | ||
| 279 | - | ||
| 280 | - // Setup single GTI covering the selected time range | ||
| 281 | - gti.add(tstart, tstop); | 457 | + // Set energy boundaries |
| 458 | + GEbounds ebounds; | ||
| 459 | + GEnergy emin; | ||
| 460 | + GEnergy emax; | ||
| 461 | + emin.TeV(m_emin); | ||
| 462 | + emax.TeV(m_emax); | ||
| 463 | + ebounds.append(emin, emax); | ||
| 464 | + list->ebounds(ebounds); | ||
| 282 | 465 | ||
| 283 | - // Write GTI | ||
| 284 | - gti.write(&m_file); | ||
| 285 | - } | ||
| 286 | - | ||
| 287 | - // Log final FITS file | ||
| 288 | - if (logExplicit()) { | ||
| 289 | - log << std::endl; | ||
| 290 | - log.header1("Final FITS file content"); | ||
| 291 | - log << m_file << std::endl; | ||
| 292 | - } | ||
| 293 | - | ||
| 294 | - // Return | ||
| 295 | - return; | ||
| 296 | -} | ||
| 297 | - | ||
| 298 | - | ||
| 299 | -/***********************************************************************//** | ||
| 300 | - * @brief Write data selection keywords | ||
| 301 | - * | ||
| 302 | - * @todo This is a very dumb data selection keyword writing routine that does | ||
| 303 | - * not take into account any existing keywords. We definitely want a | ||
| 304 | - * more secure logic that checks for existing keywords and possible | ||
| 305 | - * conflicts. But for this prototype software, this code does the job. | ||
| 306 | - ***************************************************************************/ | ||
| 307 | -void ctselect::write_ds_keys(void) | ||
| 308 | -{ | ||
| 309 | - // Get event list header | ||
| 310 | - GFitsHDU* hdu = m_file.hdu("EVENTS"); | ||
| 311 | - | ||
| 312 | - // Continue only if HDU is valid | ||
| 313 | - if (hdu != NULL) { | ||
| 314 | - | ||
| 315 | - // Set cone selection string | ||
| 316 | - std::string dsval2 = "CIRCLE("+str(m_ra)+","+str(m_dec)+","+str(m_rad)+")"; | ||
| 317 | - | ||
| 318 | - // Set energy selection string | ||
| 319 | - std::string dsval3 = str(m_emin)+":"+str(m_emax); | ||
| 320 | - | ||
| 321 | - // Add time selection keywords | ||
| 322 | - hdu->card("DSTYP1", "TIME", "Data selection type"); | ||
| 323 | - hdu->card("DSUNI1", "s", "Data selection unit"); | ||
| 324 | - hdu->card("DSVAL1", "TABLE", "Data selection value"); | ||
| 325 | - hdu->card("DSREF1", ":GTI", "Data selection reference"); | ||
| 326 | - | ||
| 327 | - // Add acceptance cone selection | ||
| 328 | - hdu->card("DSTYP2", "POS(RA,DEC)", "Data selection type"); | ||
| 329 | - hdu->card("DSUNI2", "deg", "Data selection unit"); | ||
| 330 | - hdu->card("DSVAL2", dsval2, "Data selection value"); | ||
| 331 | - | ||
| 332 | - // Add energy range selection | ||
| 333 | - hdu->card("DSTYP3", "ENERGY", "Data selection type"); | ||
| 334 | - hdu->card("DSUNI3", "TeV", "Data selection unit"); | ||
| 335 | - hdu->card("DSVAL3", dsval3, "Data selection value"); | ||
| 336 | - | ||
| 337 | - // Set number of data selection keys | ||
| 338 | - hdu->card("NDSKEYS", 3, "Number of data selections"); | ||
| 339 | - | ||
| 340 | - } // endif: HDU was valid | 466 | + // Remove temporary file |
| 467 | + std::remove(tmpname.c_str()); | ||
| 341 | 468 | ||
| 342 | // Return | 469 | // Return |
| 343 | return; | 470 | return; |
| @@ -358,6 +485,7 @@ void ctselect::init_members(void) | @@ -358,6 +485,7 @@ void ctselect::init_members(void) | ||
| 358 | // Initialise members | 485 | // Initialise members |
| 359 | m_infile.clear(); | 486 | m_infile.clear(); |
| 360 | m_outfile.clear(); | 487 | m_outfile.clear(); |
| 488 | + m_obs.clear(); | ||
| 361 | m_ra = 0.0; | 489 | m_ra = 0.0; |
| 362 | m_dec = 0.0; | 490 | m_dec = 0.0; |
| 363 | m_rad = 0.0; | 491 | m_rad = 0.0; |
| @@ -375,11 +503,37 @@ void ctselect::init_members(void) | @@ -375,11 +503,37 @@ void ctselect::init_members(void) | ||
| 375 | 503 | ||
| 376 | 504 | ||
| 377 | /***********************************************************************//** | 505 | /***********************************************************************//** |
| 506 | + * @brief Copy class members | ||
| 507 | + * | ||
| 508 | + * @param[in] app Application. | ||
| 509 | + ***************************************************************************/ | ||
| 510 | +void ctselect::copy_members(const ctselect& app) | ||
| 511 | +{ | ||
| 512 | + // Copy attributes | ||
| 513 | + m_infile = app.m_infile; | ||
| 514 | + m_outfile = app.m_outfile; | ||
| 515 | + m_obs = app.m_obs; | ||
| 516 | + m_ra = app.m_ra; | ||
| 517 | + m_dec = app.m_dec; | ||
| 518 | + m_rad = app.m_rad; | ||
| 519 | + m_tmin = app.m_tmin; | ||
| 520 | + m_tmax = app.m_tmax; | ||
| 521 | + m_emin = app.m_emin; | ||
| 522 | + m_emax = app.m_emax; | ||
| 523 | + | ||
| 524 | + // Return | ||
| 525 | + return; | ||
| 526 | +} | ||
| 527 | + | ||
| 528 | + | ||
| 529 | +/***********************************************************************//** | ||
| 378 | * @brief Delete class members | 530 | * @brief Delete class members |
| 379 | ***************************************************************************/ | 531 | ***************************************************************************/ |
| 380 | void ctselect::free_members(void) | 532 | void ctselect::free_members(void) |
| 381 | { | 533 | { |
| 382 | - // Free members | 534 | + // Write separator into logger |
| 535 | + if (logTerse()) | ||
| 536 | + log << std::endl; | ||
| 383 | 537 | ||
| 384 | // Return | 538 | // Return |
| 385 | return; | 539 | return; |
src/ctselect/ctselect.hpp
| @@ -21,10 +21,11 @@ | @@ -21,10 +21,11 @@ | ||
| 21 | 21 | ||
| 22 | /* __ Includes ___________________________________________________________ */ | 22 | /* __ Includes ___________________________________________________________ */ |
| 23 | #include "GammaLib.hpp" | 23 | #include "GammaLib.hpp" |
| 24 | +#include "GCTALib.hpp" | ||
| 24 | 25 | ||
| 25 | /* __Definitions _________________________________________________________ */ | 26 | /* __Definitions _________________________________________________________ */ |
| 26 | #define CTSELECT_NAME "ctselect" | 27 | #define CTSELECT_NAME "ctselect" |
| 27 | -#define CTSELECT_VERSION "00-01-00" | 28 | +#define CTSELECT_VERSION "00-02-00" |
| 28 | 29 | ||
| 29 | 30 | ||
| 30 | /***********************************************************************//** | 31 | /***********************************************************************//** |
| @@ -36,19 +37,27 @@ class ctselect : public GApplication { | @@ -36,19 +37,27 @@ class ctselect : public GApplication { | ||
| 36 | public: | 37 | public: |
| 37 | // Constructors and destructors | 38 | // Constructors and destructors |
| 38 | ctselect(void); | 39 | ctselect(void); |
| 40 | + explicit ctselect(GObservations obs); | ||
| 39 | ctselect(int argc, char *argv[]); | 41 | ctselect(int argc, char *argv[]); |
| 40 | - ~ctselect(void); | 42 | + ctselect(const ctselect& app); |
| 43 | + virtual ~ctselect(void); | ||
| 44 | + | ||
| 45 | + // Operators | ||
| 46 | + ctselect& operator= (const ctselect& app); | ||
| 41 | 47 | ||
| 42 | // Methods | 48 | // Methods |
| 43 | - void run(void); | ||
| 44 | - void get_parameters(void); | ||
| 45 | - void select(void); | ||
| 46 | - void append_gti(void); | ||
| 47 | - void write_ds_keys(void); | 49 | + void clear(void); |
| 50 | + void execute(void); | ||
| 51 | + void run(void); | ||
| 52 | + void save(void); | ||
| 53 | + GObservations& obs(void) { return m_obs; } | ||
| 54 | + void get_parameters(void); | ||
| 55 | + void select_events(GCTAObservation* obs, const std::string& filename); | ||
| 48 | 56 | ||
| 49 | protected: | 57 | protected: |
| 50 | // Protected methods | 58 | // Protected methods |
| 51 | void init_members(void); | 59 | void init_members(void); |
| 60 | + void copy_members(const ctselect& app); | ||
| 52 | void free_members(void); | 61 | void free_members(void); |
| 53 | 62 | ||
| 54 | // User parameters | 63 | // User parameters |
| @@ -61,7 +70,9 @@ protected: | @@ -61,7 +70,9 @@ protected: | ||
| 61 | double m_tmax; //!< Stop time | 70 | double m_tmax; //!< Stop time |
| 62 | double m_emin; //!< Lower energy | 71 | double m_emin; //!< Lower energy |
| 63 | double m_emax; //!< Upper energy | 72 | double m_emax; //!< Upper energy |
| 64 | - GFits m_file; //!< FITS file | 73 | + |
| 74 | + // Protected members | ||
| 75 | + GObservations m_obs; //!< Observations container | ||
| 65 | }; | 76 | }; |
| 66 | 77 | ||
| 67 | #endif /* CTSELECT_HPP */ | 78 | #endif /* CTSELECT_HPP */ |
src/ctselect/main.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * ctselect - CTA data selection tool main code * | 2 | * ctselect - CTA data selection tool main code * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010 by Jurgen Knodlseder * | 4 | + * copyright (C) 2010-2011 by Jurgen Knodlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software; you can redistribute it and/or modify * | 7 | * This program is free software; you can redistribute it and/or modify * |
| @@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
| 20 | #ifdef HAVE_CONFIG_H | 20 | #ifdef HAVE_CONFIG_H |
| 21 | #include <config.h> | 21 | #include <config.h> |
| 22 | #endif | 22 | #endif |
| 23 | -#include <stdio.h> | 23 | +#include <cstdio> |
| 24 | #include "ctselect.hpp" | 24 | #include "ctselect.hpp" |
| 25 | 25 | ||
| 26 | 26 | ||
| @@ -40,7 +40,10 @@ int main (int argc, char *argv[]) | @@ -40,7 +40,10 @@ int main (int argc, char *argv[]) | ||
| 40 | 40 | ||
| 41 | // Run application | 41 | // Run application |
| 42 | try { | 42 | try { |
| 43 | - application.run(); | 43 | + // Execute application |
| 44 | + application.execute(); | ||
| 45 | + | ||
| 46 | + // Signal success | ||
| 44 | rc = 0; | 47 | rc = 0; |
| 45 | } | 48 | } |
| 46 | catch (std::exception &e) { | 49 | catch (std::exception &e) { |
| @@ -48,7 +51,7 @@ int main (int argc, char *argv[]) | @@ -48,7 +51,7 @@ int main (int argc, char *argv[]) | ||
| 48 | // Extract error message | 51 | // Extract error message |
| 49 | std::string message = e.what(); | 52 | std::string message = e.what(); |
| 50 | std::string signal = "*** ERROR encounterted in the execution of" | 53 | std::string signal = "*** ERROR encounterted in the execution of" |
| 51 | - " ctselect. Run aborted ..."; | 54 | + " ctselect. Run aborted ..."; |
| 52 | 55 | ||
| 53 | // Write error in logger | 56 | // Write error in logger |
| 54 | application.log << signal << std::endl; | 57 | application.log << signal << std::endl; |