Commit 1c061c9d025a1dfdbcac6a25f96d8b70a4cbe829
1 parent
11528349
Correct diffuse map cube upper limit computation in ctulimit (#2298)
Showing
6 changed files
with
96 additions
and
21 deletions
ChangeLog
| 1 | -2018-01-24 | |
| 1 | +2018-01-25 | |
| 2 | 2 | |
| 3 | 3 | * Version 1.5.0 released |
| 4 | 4 | ======================== |
| 5 | 5 | |
| 6 | + Correct diffuse map cube upper limit computation in ctulimit (#2298) | |
| 6 | 7 | Add tmin and tmax parameters to csobsselect (#2297) |
| 7 | 8 | Change DATE_OBS, DATE_END, TIME_OBS and TIME_END FITS keywords into DATA-OBS, |
| 8 | 9 | DATE-END, TIME-OBS and TIME-END | ... | ... |
NEWS
| 1 | -24 January 2018 | |
| 1 | +25 January 2018 | |
| 2 | 2 | |
| 3 | 3 | |
| 4 | 4 | Introduction |
| ... | ... | @@ -142,6 +142,10 @@ Add "statistic" parameter to allow setting of optimizer statistic (#2237). |
| 142 | 142 | |
| 143 | 143 | ctulimit - Compute upper limit |
| 144 | 144 | ------------------------------ |
| 145 | +The tool now also computes correct upper flux limits for diffuse map cubes | |
| 146 | +for which the spectral component is a normalization of the spectral information | |
| 147 | +available in the map cube (#2298). | |
| 148 | + | |
| 145 | 149 | Add "statistic" parameter to allow setting of optimizer statistic (#2237). |
| 146 | 150 | |
| 147 | 151 | ... | ... |
doc/source/admin/release_history/1.5.rst
| ... | ... | @@ -20,6 +20,8 @@ In particular, this release provides: |
| 20 | 20 | Bug fixes |
| 21 | 21 | --------- |
| 22 | 22 | |
| 23 | +* [`2298 <https://cta-redmine.irap.omp.eu/issues/2298>`_] - | |
| 24 | + Correct diffuse map cube upper limit computation in :ref:`ctulimit` | |
| 23 | 25 | * Change ``DATE_OBS``, ``DATE_END``, ``TIME_OBS`` and ``TIME_END`` FITS keywords |
| 24 | 26 | into ``DATA-OBS``, ``DATE-END``, ``TIME-OBS`` and ``TIME-END`` |
| 25 | 27 | * [`2287 <https://cta-redmine.irap.omp.eu/issues/2287>`_] - | ... | ... |
doc/source/users/reference_manual/ctulimit.rst
| ... | ... | @@ -19,7 +19,8 @@ using the hidden ``confidence`` parameter. |
| 19 | 19 | :ref:`ctulimit` writes the differential upper flux limit at a given reference |
| 20 | 20 | energy (specified by the hidden parameter ``eref``) and the integrated |
| 21 | 21 | upper flux limit (specified by the hidden parameters ``emin`` and ``emax``) |
| 22 | -into the log file. | |
| 22 | +into the log file. This information can also be accessed using the ``diff_ulimit()``, | |
| 23 | +``flux_ulimit()``, and ``eflux_ulimit()`` methods. | |
| 23 | 24 | |
| 24 | 25 | |
| 25 | 26 | General parameters | ... | ... |
src/ctulimit/ctulimit.cpp
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * ctulimit - Upper limit calculation tool * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2015-2017 by Michael Mayer * | |
| 4 | + * copyright (C) 2015-2018 by Michael Mayer * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software: you can redistribute it and/or modify * |
| ... | ... | @@ -302,17 +302,8 @@ void ctulimit::run(void) |
| 302 | 302 | // Write final parameter into logger |
| 303 | 303 | log_value(NORMAL, "Final parameter", m_model_par->value()); |
| 304 | 304 | |
| 305 | - // Get reference energy for differential upper limit | |
| 306 | - GEnergy eref = GEnergy(m_eref, "TeV"); | |
| 307 | - | |
| 308 | - // Create energy range for flux limits | |
| 309 | - GEnergy emin = GEnergy(m_emin, "TeV"); | |
| 310 | - GEnergy emax = GEnergy(m_emax, "TeV"); | |
| 311 | - | |
| 312 | 305 | // Compute upper limit intensity and fluxes |
| 313 | - m_diff_ulimit = m_skymodel->spectral()->eval(eref, GTime()); | |
| 314 | - m_flux_ulimit = m_skymodel->spectral()->flux(emin, emax); | |
| 315 | - m_eflux_ulimit = m_skymodel->spectral()->eflux(emin, emax); | |
| 306 | + compute_ulimit(); | |
| 316 | 307 | |
| 317 | 308 | // Write header into logger |
| 318 | 309 | log_header1(TERSE, "Upper limit results"); |
| ... | ... | @@ -640,3 +631,78 @@ void ctulimit::ulimit_bisection(const double& min, const double& max) |
| 640 | 631 | return; |
| 641 | 632 | |
| 642 | 633 | } |
| 634 | + | |
| 635 | + | |
| 636 | +/***********************************************************************//** | |
| 637 | + * @brief Compute upper limit intensity and fluxes | |
| 638 | + * | |
| 639 | + * Compute upper limit intensity and fluxes, including a correct computation | |
| 640 | + * for the diffuse map cube models. | |
| 641 | + ***************************************************************************/ | |
| 642 | +void ctulimit::compute_ulimit(void) | |
| 643 | +{ | |
| 644 | + // Initialise upper limit intensity and fluxes | |
| 645 | + m_diff_ulimit = 0.0; | |
| 646 | + m_flux_ulimit = 0.0; | |
| 647 | + m_eflux_ulimit = 0.0; | |
| 648 | + | |
| 649 | + // Get reference energy for differential upper limit | |
| 650 | + GEnergy eref = GEnergy(m_eref, "TeV"); | |
| 651 | + | |
| 652 | + // Create energy range for flux limits | |
| 653 | + GEnergy emin = GEnergy(m_emin, "TeV"); | |
| 654 | + GEnergy emax = GEnergy(m_emax, "TeV"); | |
| 655 | + | |
| 656 | + // Set pointer to spectral model and initialise spectral nodes model | |
| 657 | + // pointer | |
| 658 | + GModelSpectral* spectral = m_skymodel->spectral(); | |
| 659 | + GModelSpectralNodes* nodes = NULL; | |
| 660 | + | |
| 661 | + // If the spectral model is a diffuse cube then create a node function | |
| 662 | + // spectral model that is the product of the diffuse cube node function | |
| 663 | + // and the spectral model evaluated at the energies of the node function | |
| 664 | + GModelSpatialDiffuseCube* cube = | |
| 665 | + dynamic_cast<GModelSpatialDiffuseCube*>(m_skymodel->spatial()); | |
| 666 | + if (cube != NULL) { | |
| 667 | + | |
| 668 | + | |
| 669 | + // Set MC cone to the entire sky. This method call is needed to | |
| 670 | + // set-up the cube spectrum | |
| 671 | + cube->set_mc_cone(GSkyDir(), 180.0); | |
| 672 | + | |
| 673 | + // Allocate node function to replace the spectral component | |
| 674 | + nodes = new GModelSpectralNodes(cube->spectrum()); | |
| 675 | + for (int i = 0; i < nodes->nodes(); ++i) { | |
| 676 | + GEnergy energy = nodes->energy(i); | |
| 677 | + double intensity = nodes->intensity(i); | |
| 678 | + double value = spectral->eval(energy); | |
| 679 | + nodes->intensity(i, value*intensity); | |
| 680 | + } | |
| 681 | + | |
| 682 | + // Set the spectral model pointer to the node function. If there are | |
| 683 | + // no nodes the spectral pointer is set to NULL since in this case the | |
| 684 | + // spectral->flux method will throw an exception | |
| 685 | + if (nodes->nodes() > 0) { | |
| 686 | + spectral = nodes; | |
| 687 | + } | |
| 688 | + else { | |
| 689 | + spectral = NULL; | |
| 690 | + } | |
| 691 | + | |
| 692 | + } // endif: spatial model was a diffuse cube | |
| 693 | + | |
| 694 | + // Compute upper limit intensity and fluxes | |
| 695 | + if (spectral != NULL) { | |
| 696 | + m_diff_ulimit = spectral->eval(eref); | |
| 697 | + m_flux_ulimit = spectral->flux(emin, emax); | |
| 698 | + m_eflux_ulimit = spectral->eflux(emin, emax); | |
| 699 | + } | |
| 700 | + | |
| 701 | + // Free spectral nodes if they have been allocated | |
| 702 | + if (nodes != NULL) { | |
| 703 | + delete nodes; | |
| 704 | + } | |
| 705 | + | |
| 706 | + // Return | |
| 707 | + return; | |
| 708 | +} | ... | ... |
src/ctulimit/ctulimit.hpp
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * ctulimit - Upper limit calculation tool * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2015-2016 by Michael Mayer * | |
| 4 | + * copyright (C) 2015-2018 by Michael Mayer * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software: you can redistribute it and/or modify * |
| ... | ... | @@ -70,12 +70,13 @@ public: |
| 70 | 70 | |
| 71 | 71 | protected: |
| 72 | 72 | // Protected methods |
| 73 | - void init_members(void); | |
| 74 | - void copy_members(const ctulimit& app); | |
| 75 | - void free_members(void); | |
| 76 | - void get_parameters(void); | |
| 77 | - void get_model_parameter(void); | |
| 78 | - void ulimit_bisection(const double& parmin, const double& parmax); | |
| 73 | + void init_members(void); | |
| 74 | + void copy_members(const ctulimit& app); | |
| 75 | + void free_members(void); | |
| 76 | + void get_parameters(void); | |
| 77 | + void get_model_parameter(void); | |
| 78 | + void ulimit_bisection(const double& parmin, const double& parmax); | |
| 79 | + void compute_ulimit(void); | |
| 79 | 80 | |
| 80 | 81 | // User parameters |
| 81 | 82 | std::string m_srcname; //!< Name of source which is moved around | ... | ... |