Commit 719953c4754c2832ecb1c4bf4e3577a59ef774e9
1 parent
e4c14102
Correctly deal with the case that no events are selected. In this case an empty …
…FITS file will be written. Note that the empty FITS file will have no columns. This should probably be changed on the lower (GammaLib) level.
Showing
1 changed file
with
36 additions
and
10 deletions
src/ctselect/ctselect.cpp
| ... | ... | @@ -34,6 +34,8 @@ |
| 34 | 34 | |
| 35 | 35 | /* __ Method name definitions ____________________________________________ */ |
| 36 | 36 | #define G_RUN "ctselect::run()" |
| 37 | +#define G_SELECT_EVENTS "ctselect::select_events(GCTAObservation*,"\ | |
| 38 | + "std::string&)" | |
| 37 | 39 | |
| 38 | 40 | /* __ Debug definitions __________________________________________________ */ |
| 39 | 41 | |
| ... | ... | @@ -469,7 +471,6 @@ void ctselect::get_parameters(void) |
| 469 | 471 | * interval [m_tmin, m_tmax]. If m_tmin=m_tmax=0, no time selection is |
| 470 | 472 | * performed. |
| 471 | 473 | * |
| 472 | - * @todo Add an arbitrary selection string. | |
| 473 | 474 | * @todo Use INDEF instead of 0.0 for pointing as RA/DEC selection |
| 474 | 475 | ***************************************************************************/ |
| 475 | 476 | void ctselect::select_events(GCTAObservation* obs, const std::string& filename) |
| ... | ... | @@ -581,14 +582,42 @@ void ctselect::select_events(GCTAObservation* obs, const std::string& filename) |
| 581 | 582 | log << file << std::endl; |
| 582 | 583 | } |
| 583 | 584 | |
| 584 | - // Get temporary file name | |
| 585 | - std::string tmpname = std::tmpnam(NULL); | |
| 585 | + // Check if we have an EVENTS HDU | |
| 586 | + if (!file.hashdu("EVENTS")) { | |
| 587 | + std::string message = "No \"EVENTS\" extension found in FITS file "+ | |
| 588 | + expression+"."; | |
| 589 | + throw GException::app_error(G_SELECT_EVENTS, message); | |
| 590 | + } | |
| 591 | + | |
| 592 | + // Determine number of events in EVENTS HDU | |
| 593 | + int nevents = file.table("EVENTS")->nrows(); | |
| 594 | + | |
| 595 | + // If the selected event list is empty then append an empty event list | |
| 596 | + // to the observation. Otherwise load the data from the temporary file. | |
| 597 | + if (nevents < 1) { | |
| 598 | + | |
| 599 | + // Create empty event list | |
| 600 | + GCTAEventList eventlist; | |
| 586 | 601 | |
| 587 | - // Save FITS file to temporary file | |
| 588 | - file.saveto(tmpname, true); | |
| 602 | + // Append list to observation | |
| 603 | + obs->events(&eventlist); | |
| 604 | + | |
| 605 | + } | |
| 606 | + else { | |
| 589 | 607 | |
| 590 | - // Load observation from temporary file | |
| 591 | - obs->load_unbinned(tmpname); | |
| 608 | + // Get temporary file name | |
| 609 | + std::string tmpname = std::tmpnam(NULL); | |
| 610 | + | |
| 611 | + // Save FITS file to temporary file | |
| 612 | + file.saveto(tmpname, true); | |
| 613 | + | |
| 614 | + // Load observation from temporary file | |
| 615 | + obs->load_unbinned(tmpname); | |
| 616 | + | |
| 617 | + // Remove temporary file | |
| 618 | + std::remove(tmpname.c_str()); | |
| 619 | + | |
| 620 | + } | |
| 592 | 621 | |
| 593 | 622 | // Get CTA event list pointer |
| 594 | 623 | GCTAEventList* list = (GCTAEventList*)(obs->events()); |
| ... | ... | @@ -613,9 +642,6 @@ void ctselect::select_events(GCTAObservation* obs, const std::string& filename) |
| 613 | 642 | ebounds.append(emin, emax); |
| 614 | 643 | list->ebounds(ebounds); |
| 615 | 644 | |
| 616 | - // Remove temporary file | |
| 617 | - std::remove(tmpname.c_str()); | |
| 618 | - | |
| 619 | 645 | // Return |
| 620 | 646 | return; |
| 621 | 647 | } | ... | ... |