Commit 1ae952bd36fc6a00890fa42dea5033ee7fd5f9e1
1 parent
ac17570c
Re-enable ctmodel model computation for stacked analysis.
Showing
5 changed files
with
138 additions
and
6 deletions
ChangeLog
NEWS
| ... | ... | @@ -59,7 +59,8 @@ None |
| 59 | 59 | |
| 60 | 60 | 11. ctmodel - CTA counts cube modelling |
| 61 | 61 | --------------------------------------- |
| 62 | -None | |
| 62 | +The get_obs() method, that has been accidently removed, has been put back | |
| 63 | +which allows computation of a model cube for a stacked analysis. | |
| 63 | 64 | |
| 64 | 65 | |
| 65 | 66 | 12. ctexpcube - CTA exposure cube generation | ... | ... |
src/ctmodel/ctmodel.cpp
| ... | ... | @@ -411,7 +411,7 @@ void ctmodel::init_members(void) |
| 411 | 411 | m_gti.clear(); |
| 412 | 412 | m_has_cube = false; |
| 413 | 413 | m_append_cube = false; |
| 414 | - m_binned = false; | |
| 414 | + m_binned = false; | |
| 415 | 415 | |
| 416 | 416 | // Return |
| 417 | 417 | return; |
| ... | ... | @@ -435,7 +435,7 @@ void ctmodel::copy_members(const ctmodel& app) |
| 435 | 435 | m_gti = app.m_gti; |
| 436 | 436 | m_has_cube = app.m_has_cube; |
| 437 | 437 | m_append_cube = app.m_append_cube; |
| 438 | - m_binned = app.m_binned; | |
| 438 | + m_binned = app.m_binned; | |
| 439 | 439 | |
| 440 | 440 | // Return |
| 441 | 441 | return; |
| ... | ... | @@ -466,7 +466,7 @@ void ctmodel::get_parameters(void) |
| 466 | 466 | // If there are no observations in container then load them via user |
| 467 | 467 | // parameters |
| 468 | 468 | if (m_obs.size() == 0) { |
| 469 | - m_obs = get_observations(); | |
| 469 | + get_obs(); | |
| 470 | 470 | } |
| 471 | 471 | |
| 472 | 472 | // Check if we got excactly one binned CTA observation |
| ... | ... | @@ -574,6 +574,134 @@ void ctmodel::get_parameters(void) |
| 574 | 574 | |
| 575 | 575 | |
| 576 | 576 | /***********************************************************************//** |
| 577 | + * @brief Get observation container | |
| 578 | + * | |
| 579 | + * Get an observation container according to the user parameters. The method | |
| 580 | + * supports loading of a individual FITS file or an observation definition | |
| 581 | + * file in XML format. | |
| 582 | + * | |
| 583 | + * If the input filename is empty, the method checks for the existence of the | |
| 584 | + * "expcube", "psfcube" and "bkgcube" parameters. If file names have been | |
| 585 | + * specified, the method loads the files and creates a dummy events cube that | |
| 586 | + * is appended to the observation container. | |
| 587 | + * | |
| 588 | + * If no file names are specified for the "expcube", "psfcube" or "bkgcube" | |
| 589 | + * parameters, the method reads the necessary parameters to build a CTA | |
| 590 | + * observation from scratch. | |
| 591 | + ***************************************************************************/ | |
| 592 | +void ctmodel::get_obs(void) | |
| 593 | +{ | |
| 594 | + // Get the filename from the input parameters | |
| 595 | + std::string filename = (*this)["inobs"].filename(); | |
| 596 | + | |
| 597 | + // If no observation definition file has been specified then read all | |
| 598 | + // parameters that are necessary to create an observation from scratch | |
| 599 | + if ((filename == "NONE") || (gammalib::strip_whitespace(filename) == "")) { | |
| 600 | + | |
| 601 | + // Get response cube filenames | |
| 602 | + std::string expcube = (*this)["expcube"].filename(); | |
| 603 | + std::string psfcube = (*this)["psfcube"].filename(); | |
| 604 | + std::string bkgcube = (*this)["bkgcube"].filename(); | |
| 605 | + | |
| 606 | + // If the filenames are valid then build an observation from cube | |
| 607 | + // response information | |
| 608 | + if ((expcube != "NONE") && (psfcube != "NONE") && (bkgcube != "NONE") && | |
| 609 | + (gammalib::strip_whitespace(expcube) != "") && | |
| 610 | + (gammalib::strip_whitespace(psfcube) != "") && | |
| 611 | + (gammalib::strip_whitespace(bkgcube) != "")) { | |
| 612 | + | |
| 613 | + // Get exposure, PSF and background cubes | |
| 614 | + GCTACubeExposure exposure(expcube); | |
| 615 | + GCTACubePsf psf(psfcube); | |
| 616 | + GCTACubeBackground background(bkgcube); | |
| 617 | + | |
| 618 | + // Create energy boundaries | |
| 619 | + GEbounds ebounds = create_ebounds(); | |
| 620 | + | |
| 621 | + // Create dummy sky map cube | |
| 622 | + GSkyMap map("CAR","GAL",0.0,0.0,1.0,1.0,1,1,ebounds.size()); | |
| 623 | + m_append_cube = true; | |
| 624 | + | |
| 625 | + // Create event cube | |
| 626 | + GCTAEventCube cube(map, ebounds, exposure.gti()); | |
| 627 | + | |
| 628 | + // Create CTA observation | |
| 629 | + GCTAObservation cta; | |
| 630 | + cta.events(cube); | |
| 631 | + cta.response(exposure, psf, background); | |
| 632 | + | |
| 633 | + // Append observation to container | |
| 634 | + m_obs.append(cta); | |
| 635 | + | |
| 636 | + } // endif: cube response information was available | |
| 637 | + | |
| 638 | + // ... otherwise build an observation from IRF response information | |
| 639 | + else { | |
| 640 | + | |
| 641 | + // Create CTA observation | |
| 642 | + GCTAObservation cta = create_cta_obs(); | |
| 643 | + | |
| 644 | + // Set response | |
| 645 | + set_obs_response(&cta); | |
| 646 | + | |
| 647 | + // Append observation to container | |
| 648 | + m_obs.append(cta); | |
| 649 | + | |
| 650 | + } | |
| 651 | + | |
| 652 | + } // endif: filename was "NONE" or "" | |
| 653 | + | |
| 654 | + // ... otherwise we have a file name | |
| 655 | + else { | |
| 656 | + | |
| 657 | + // If file is a FITS file then create an empty CTA observation | |
| 658 | + // and load file into observation | |
| 659 | + if (gammalib::is_fits(filename)) { | |
| 660 | + | |
| 661 | + // Allocate empty CTA observation | |
| 662 | + GCTAObservation cta; | |
| 663 | + | |
| 664 | + // Load data | |
| 665 | + cta.load(filename); | |
| 666 | + | |
| 667 | + // Set response | |
| 668 | + set_obs_response(&cta); | |
| 669 | + | |
| 670 | + // Append observation to container | |
| 671 | + m_obs.append(cta); | |
| 672 | + | |
| 673 | + // Signal that no XML file should be used for storage | |
| 674 | + m_use_xml = false; | |
| 675 | + | |
| 676 | + } | |
| 677 | + | |
| 678 | + // ... otherwise load file into observation container | |
| 679 | + else { | |
| 680 | + | |
| 681 | + // Load observations from XML file | |
| 682 | + m_obs.load(filename); | |
| 683 | + | |
| 684 | + // For all observations that have no response, set the response | |
| 685 | + // from the task parameters | |
| 686 | + set_response(m_obs); | |
| 687 | + | |
| 688 | + // Set observation boundary parameters (emin, emax, rad) | |
| 689 | + set_obs_bounds(m_obs); | |
| 690 | + | |
| 691 | + // Signal that XML file should be used for storage | |
| 692 | + m_use_xml = true; | |
| 693 | + | |
| 694 | + } // endelse: file was an XML file | |
| 695 | + | |
| 696 | + } | |
| 697 | + | |
| 698 | + // Return | |
| 699 | + return; | |
| 700 | + | |
| 701 | +} | |
| 702 | + | |
| 703 | + | |
| 704 | +/***********************************************************************//** | |
| 577 | 705 | * @brief Fill model into model cube |
| 578 | 706 | * |
| 579 | 707 | * @param[in] obs CTA observation. | ... | ... |
src/ctmodel/ctmodel.hpp
| ... | ... | @@ -34,7 +34,7 @@ |
| 34 | 34 | |
| 35 | 35 | /* __Definitions _________________________________________________________ */ |
| 36 | 36 | #define CTMODEL_NAME "ctmodel" |
| 37 | -#define CTMODEL_VERSION "1.0.0" | |
| 37 | +#define CTMODEL_VERSION "1.0.1" | |
| 38 | 38 | |
| 39 | 39 | |
| 40 | 40 | /***********************************************************************//** |
| ... | ... | @@ -79,6 +79,7 @@ protected: |
| 79 | 79 | void copy_members(const ctmodel& app); |
| 80 | 80 | void free_members(void); |
| 81 | 81 | void get_parameters(void); |
| 82 | + void get_obs(void); | |
| 82 | 83 | void fill_cube(const GCTAObservation* obs); |
| 83 | 84 | bool has_cube(void) const; |
| 84 | 85 | ... | ... |
src/ctmodel/ctmodel.par