Commit 026012847831a07b9d0cf8cd216f8c3c31dc5b2a
1 parent
c852d7b0
check input file and improve error message
Showing
3 changed files
with
100 additions
and
6 deletions
src/ctselect/ctselect.cpp
| ... | ... | @@ -32,6 +32,9 @@ |
| 32 | 32 | #include "ctselect.hpp" |
| 33 | 33 | #include "GTools.hpp" |
| 34 | 34 | |
| 35 | +/* __ Method name definitions ____________________________________________ */ | |
| 36 | +#define G_RUN "ctselect::run()" | |
| 37 | + | |
| 35 | 38 | /* __ Debug definitions __________________________________________________ */ |
| 36 | 39 | |
| 37 | 40 | /* __ Coding definitions _________________________________________________ */ |
| ... | ... | @@ -277,6 +280,12 @@ void ctselect::run(void) |
| 277 | 280 | // Save observation in temporary file |
| 278 | 281 | obs->save(filename, true); |
| 279 | 282 | |
| 283 | + // Check temporary file | |
| 284 | + std::string message = check_infile(filename); | |
| 285 | + if (message.length() > 0) { | |
| 286 | + throw GException::app_error(G_RUN, message); | |
| 287 | + } | |
| 288 | + | |
| 280 | 289 | // Load observation from temporary file, including event selection |
| 281 | 290 | select_events(obs, filename); |
| 282 | 291 | |
| ... | ... | @@ -379,10 +388,13 @@ void ctselect::get_parameters(void) |
| 379 | 388 | /***********************************************************************//** |
| 380 | 389 | * @brief Select events |
| 381 | 390 | * |
| 391 | + * @param[in] obs CTA observations. | |
| 392 | + * @param[in] filename File name. | |
| 393 | + * | |
| 382 | 394 | * Select events from a FITS file by making use of the selection possibility |
| 383 | 395 | * of the cfitsio library on loading a file. |
| 384 | 396 | * |
| 385 | - * @todo Implement a observation read() method to avoid saving the | |
| 397 | + * @todo Implement an observation read() method to avoid saving the | |
| 386 | 398 | * observation to a temporary file. |
| 387 | 399 | ***************************************************************************/ |
| 388 | 400 | void ctselect::select_events(GCTAObservation* obs, const std::string& filename) |
| ... | ... | @@ -546,3 +558,84 @@ void ctselect::free_members(void) |
| 546 | 558 | // Return |
| 547 | 559 | return; |
| 548 | 560 | } |
| 561 | + | |
| 562 | + | |
| 563 | +/***********************************************************************//** | |
| 564 | + * @brief Check input filename | |
| 565 | + * | |
| 566 | + * @param[in] filename File name. | |
| 567 | + * | |
| 568 | + * This method checks if the input FITS file is correct. | |
| 569 | + ***************************************************************************/ | |
| 570 | +std::string ctselect::check_infile(const std::string& filename) const | |
| 571 | +{ | |
| 572 | + // Initialise message string | |
| 573 | + std::string message = ""; | |
| 574 | + | |
| 575 | + // Open FITS file | |
| 576 | + GFits file(filename); | |
| 577 | + | |
| 578 | + // Check for EVENTS HDU | |
| 579 | + GFitsTable* table = NULL; | |
| 580 | + try { | |
| 581 | + | |
| 582 | + // Get pointer to FITS table | |
| 583 | + table = file.table("EVENTS"); | |
| 584 | + | |
| 585 | + // Initialise list of missing columns | |
| 586 | + std::vector<std::string> missing; | |
| 587 | + | |
| 588 | + // Check for existence of TIME column | |
| 589 | + try { | |
| 590 | + GFitsTableCol* col = table->column("TIME"); | |
| 591 | + } | |
| 592 | + catch (GException::fits_column_not_found& e) { | |
| 593 | + missing.push_back("TIME"); | |
| 594 | + } | |
| 595 | + | |
| 596 | + // Check for existence of ENERGY column | |
| 597 | + try { | |
| 598 | + GFitsTableCol* col = table->column("ENERGY"); | |
| 599 | + } | |
| 600 | + catch (GException::fits_column_not_found& e) { | |
| 601 | + missing.push_back("ENERGY"); | |
| 602 | + } | |
| 603 | + | |
| 604 | + // Check for existence of RA column | |
| 605 | + try { | |
| 606 | + GFitsTableCol* col = table->column("RA"); | |
| 607 | + } | |
| 608 | + catch (GException::fits_column_not_found& e) { | |
| 609 | + missing.push_back("RA"); | |
| 610 | + } | |
| 611 | + | |
| 612 | + // Check for existence of DEC column | |
| 613 | + try { | |
| 614 | + GFitsTableCol* col = table->column("DEC"); | |
| 615 | + } | |
| 616 | + catch (GException::fits_column_not_found& e) { | |
| 617 | + missing.push_back("DEC"); | |
| 618 | + } | |
| 619 | + | |
| 620 | + // Set error message for missing columns | |
| 621 | + if (missing.size() > 0) { | |
| 622 | + message = "The following columns are missing in the" | |
| 623 | + " \"EVENTS\" extension of input file \"" | |
| 624 | + + m_outfile + "\": "; | |
| 625 | + for (int i = 0; i < missing.size(); ++i) { | |
| 626 | + message += "\"" + missing[i] + "\""; | |
| 627 | + if (i < missing.size()-1) | |
| 628 | + message += ", "; | |
| 629 | + } | |
| 630 | + } | |
| 631 | + | |
| 632 | + } | |
| 633 | + catch (GException::fits_hdu_not_found& e) { | |
| 634 | + message = "No \"EVENTS\" extension found in input file \"" | |
| 635 | + + m_outfile + "\"."; | |
| 636 | + } | |
| 637 | + | |
| 638 | + // Return | |
| 639 | + return message; | |
| 640 | +} | |
| 641 | + | ... | ... |
src/ctselect/ctselect.hpp
| ... | ... | @@ -64,9 +64,10 @@ public: |
| 64 | 64 | |
| 65 | 65 | protected: |
| 66 | 66 | // Protected methods |
| 67 | - void init_members(void); | |
| 68 | - void copy_members(const ctselect& app); | |
| 69 | - void free_members(void); | |
| 67 | + void init_members(void); | |
| 68 | + void copy_members(const ctselect& app); | |
| 69 | + void free_members(void); | |
| 70 | + std::string check_infile(const std::string& filename) const; | |
| 70 | 71 | |
| 71 | 72 | // User parameters |
| 72 | 73 | std::string m_infile; //!< Input event list | ... | ... |
src/ctselect/main.cpp
| ... | ... | @@ -62,12 +62,12 @@ int main (int argc, char *argv[]) |
| 62 | 62 | " ctselect. Run aborted ..."; |
| 63 | 63 | |
| 64 | 64 | // Write error in logger |
| 65 | - application.log << signal << std::endl; | |
| 66 | 65 | application.log << message << std::endl; |
| 66 | + application.log << signal << std::endl; | |
| 67 | 67 | |
| 68 | 68 | // Write error on standard output |
| 69 | - std::cout << signal << std::endl; | |
| 70 | 69 | std::cout << message << std::endl; |
| 70 | + std::cout << signal << std::endl; | |
| 71 | 71 | |
| 72 | 72 | } // endcatch: catched any application error |
| 73 | 73 | ... | ... |