Commit 7a14eaae3c21796789d28a18980ea612e9528dde

Authored by Jürgen Knödlseder
1 parent 2659914b

Add GSkyMap::flux(GRegion(s)) and GSkyMap::solidangle(GRegion(s)) methods (#1785)

ChangeLog
1 -2021-03-04 1 +2021-03-08
2 2
3 * Version 2.0.0 released 3 * Version 2.0.0 released
4 ======================== 4 ========================
@@ -40,7 +40,8 @@ @@ -40,7 +40,8 @@
40 Implement analytical gradients for the radial Gaussian model in a 40 Implement analytical gradients for the radial Gaussian model in a
41 stacked analysis (#3203) 41 stacked analysis (#3203)
42 Add GSkyModel flux_error() and eflux_error() methods (#3074) 42 Add GSkyModel flux_error() and eflux_error() methods (#3074)
43 - Remove COMPTEL internal response caching (#2973). 43 + Remove COMPTEL internal response caching (#2973)
  44 + Add GSkyMap::flux(GRegion(s)) and GSkyMap::solidangle(GRegion(s)) methods (#1785)
44 Implement pre-computation cache in GModelSpatialGauss (#1300) 45 Implement pre-computation cache in GModelSpatialGauss (#1300)
45 46
46 47
1 New Features and Important Changes in GammaLib 2.0.0 1 New Features and Important Changes in GammaLib 2.0.0
2 2
3 -4 March 2021 3 +8 March 2021
4 4
5 5
6 1. Introduction 6 1. Introduction
@@ -60,6 +60,10 @@ The following methods have been added: @@ -60,6 +60,10 @@ The following methods have been added:
60 - GModelSpectralFunc::intensity() 60 - GModelSpectralFunc::intensity()
61 - GModelSpectralFunc::save() 61 - GModelSpectralFunc::save()
62 - GSkyMap::correlate() 62 - GSkyMap::correlate()
  63 +- GSkyMap::flux(GSkyRegion&, int&)
  64 +- GSkyMap::flux(GSkyRegions&, int&)
  65 +- GSkyMap::solidangle(GSkyRegion&)
  66 +- GSkyMap::solidangle(GSkyRegions&)
63 - GOptimizerLM::npars() 67 - GOptimizerLM::npars()
64 - GOptimizerLM::nfree() 68 - GOptimizerLM::nfree()
65 - GXmlElement(std::string&, int&) 69 - GXmlElement(std::string&, int&)
@@ -223,6 +227,13 @@ method now returns an instance of GSkyDirs (#3324). @@ -223,6 +227,13 @@ method now returns an instance of GSkyDirs (#3324).
223 227
224 Added GSkyRegionRect class to implement a rectangular region on the sky (#3248). 228 Added GSkyRegionRect class to implement a rectangular region on the sky (#3248).
225 229
  230 +Added GSkyMap::flux(GSkyRegion&, int&) and GSkyMap::flux(GSkyRegions&, int&) methods
  231 +to compute the total flux within a given sky region or a list of sky regions. The flux
  232 +returns the sum of the intensity times the solidangle for all pixels that are contained
  233 +within the sky region(s). Containment is tested using the GSkyMap::contains() methods.
  234 +Equivalent methods GSkyMap::solidangle(GSkyRegion&) and GSkyMap::solidangle(GSkyRegions&)
  235 +were added to compute the total solid angle within specified sky region(s) (#1785).
  236 +
226 237
227 13. Support module 238 13. Support module
228 ------------------ 239 ------------------
README.md
1 GammaLib information 1 GammaLib information
2 ==================== 2 ====================
3 -* Version: 2.0.0.dev (4 March 2021) 3 +* Version: 2.0.0.dev (8 March 2021)
4 4
5 [![Build Status](https://cta-jenkins.irap.omp.eu/buildStatus/icon?job=gammalib-integrate-os)](https://cta-jenkins.irap.omp.eu/job/gammalib-integrate-os/) 5 [![Build Status](https://cta-jenkins.irap.omp.eu/buildStatus/icon?job=gammalib-integrate-os)](https://cta-jenkins.irap.omp.eu/job/gammalib-integrate-os/)
6 6
doc/source/admin/release_history/2.0.rst
1 .. _2.0: 1 .. _2.0:
2 2
3 -GammaLib 2.0 release (3 March 2021) 3 +GammaLib 2.0 release (8 March 2021)
4 =================================== 4 ===================================
5 5
6 Overview 6 Overview
@@ -56,6 +56,8 @@ Improvements @@ -56,6 +56,8 @@ Improvements
56 * [`3203 <https://cta-redmine.irap.omp.eu/issues/3203>`_] - 56 * [`3203 <https://cta-redmine.irap.omp.eu/issues/3203>`_] -
57 Implement vectorised response computation and analytical gradients for 57 Implement vectorised response computation and analytical gradients for
58 the radial Gaussian model in a stacked analysis 58 the radial Gaussian model in a stacked analysis
  59 +* [`1785 <https://cta-redmine.irap.omp.eu/issues/1785>`_] -
  60 + Add ``GSkyMap::flux(GRegion)``, ``GSkyMap::flux(GRegions)``, ``GSkyMap::solidangle(GRegion)`` and ``GSkyMap::solidangle(GRegions)`` methods
59 * [`1300 <https://cta-redmine.irap.omp.eu/issues/1300>`_] - 61 * [`1300 <https://cta-redmine.irap.omp.eu/issues/1300>`_] -
60 Implement pre-computation cache in GModelSpatialGauss 62 Implement pre-computation cache in GModelSpatialGauss
61 63
include/GSkyMap.hpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GSkyMap.hpp - Sky map class * 2 * GSkyMap.hpp - Sky map class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2010-2020 by Juergen Knoedlseder * 4 + * copyright (C) 2010-2021 by Juergen Knoedlseder *
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 *
@@ -162,9 +162,13 @@ public: @@ -162,9 +162,13 @@ public:
162 GNdarray counts(void) const; 162 GNdarray counts(void) const;
163 double flux(const int& index, const int& map = 0) const; 163 double flux(const int& index, const int& map = 0) const;
164 double flux(const GSkyPixel& pixel, const int& map = 0) const; 164 double flux(const GSkyPixel& pixel, const int& map = 0) const;
  165 + double flux(const GSkyRegion& region, const int& map = 0) const;
  166 + double flux(const GSkyRegions& regions, const int& map = 0) const;
165 GNdarray flux(void) const; 167 GNdarray flux(void) const;
166 double solidangle(const int& index) const; 168 double solidangle(const int& index) const;
167 double solidangle(const GSkyPixel& pixel) const; 169 double solidangle(const GSkyPixel& pixel) const;
  170 + double solidangle(const GSkyRegion& region) const;
  171 + double solidangle(const GSkyRegions& regions) const;
168 bool contains(const GSkyDir& dir) const; 172 bool contains(const GSkyDir& dir) const;
169 bool contains(const GSkyPixel& pixel) const; 173 bool contains(const GSkyPixel& pixel) const;
170 bool overlaps(const GSkyRegion& region) const; 174 bool overlaps(const GSkyRegion& region) const;
pyext/GSkyMap.i
1 /*************************************************************************** 1 /***************************************************************************
2 * GSkyMap.i - Sky map class * 2 * GSkyMap.i - Sky map class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2010-2020 by Juergen Knoedlseder * 4 + * copyright (C) 2010-2021 by Juergen Knoedlseder *
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 *
@@ -97,9 +97,13 @@ public: @@ -97,9 +97,13 @@ public:
97 GNdarray counts(void); 97 GNdarray counts(void);
98 double flux(const int& index, const int& map = 0) const; 98 double flux(const int& index, const int& map = 0) const;
99 double flux(const GSkyPixel& pixel, const int& map = 0) const; 99 double flux(const GSkyPixel& pixel, const int& map = 0) const;
  100 + double flux(const GSkyRegion& region, const int& map = 0) const;
  101 + double flux(const GSkyRegions& regions, const int& map = 0) const;
100 GNdarray flux(void); 102 GNdarray flux(void);
101 double solidangle(const int& index) const; 103 double solidangle(const int& index) const;
102 double solidangle(const GSkyPixel& pixel) const; 104 double solidangle(const GSkyPixel& pixel) const;
  105 + double solidangle(const GSkyRegion& region) const;
  106 + double solidangle(const GSkyRegions& regions) const;
103 bool contains(const GSkyDir& dir) const; 107 bool contains(const GSkyDir& dir) const;
104 bool contains(const GSkyPixel& pixel) const; 108 bool contains(const GSkyPixel& pixel) const;
105 bool overlaps(const GSkyRegion& region) const; 109 bool overlaps(const GSkyRegion& region) const;
src/sky/GSkyMap.cpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GSkyMap.cpp - Sky map class * 2 * GSkyMap.cpp - Sky map class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2010-2020 by Juergen Knoedlseder * 4 + * copyright (C) 2010-2021 by Juergen Knoedlseder *
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 *
@@ -417,7 +417,7 @@ GSkyMap&amp; GSkyMap::operator+=(const GSkyMap&amp; map) @@ -417,7 +417,7 @@ GSkyMap&amp; GSkyMap::operator+=(const GSkyMap&amp; map)
417 } // endfor: looped over all layers 417 } // endfor: looped over all layers
418 418
419 } // endfor: looped over all pixels 419 } // endfor: looped over all pixels
420 - 420 +
421 } 421 }
422 422
423 // ... otherwise use interpolation method and add map 423 // ... otherwise use interpolation method and add map
@@ -507,7 +507,7 @@ GSkyMap&amp; GSkyMap::operator-=(const GSkyMap&amp; map) @@ -507,7 +507,7 @@ GSkyMap&amp; GSkyMap::operator-=(const GSkyMap&amp; map)
507 } // endfor: looped over all layers 507 } // endfor: looped over all layers
508 508
509 } // endfor: looped over all pixels 509 } // endfor: looped over all pixels
510 - 510 +
511 } 511 }
512 512
513 // ... otherwise use interpolation method and subtract map 513 // ... otherwise use interpolation method and subtract map
@@ -597,7 +597,7 @@ GSkyMap&amp; GSkyMap::operator*=(const GSkyMap&amp; map) @@ -597,7 +597,7 @@ GSkyMap&amp; GSkyMap::operator*=(const GSkyMap&amp; map)
597 } // endfor: looped over all layers 597 } // endfor: looped over all layers
598 598
599 } // endfor: looped over all pixels 599 } // endfor: looped over all pixels
600 - 600 +
601 } 601 }
602 602
603 // ... otherwise use interpolation method and multiply map 603 // ... otherwise use interpolation method and multiply map
@@ -701,7 +701,7 @@ GSkyMap&amp; GSkyMap::operator/=(const GSkyMap&amp; map) @@ -701,7 +701,7 @@ GSkyMap&amp; GSkyMap::operator/=(const GSkyMap&amp; map)
701 } // endfor: looped over all layers 701 } // endfor: looped over all layers
702 702
703 } // endfor: looped over all pixels 703 } // endfor: looped over all pixels
704 - 704 +
705 } 705 }
706 706
707 // ... otherwise use interpolation method and divide map 707 // ... otherwise use interpolation method and divide map
@@ -1724,6 +1724,66 @@ double GSkyMap::flux(const GSkyPixel&amp; pixel, const int&amp; map) const @@ -1724,6 +1724,66 @@ double GSkyMap::flux(const GSkyPixel&amp; pixel, const int&amp; map) const
1724 1724
1725 1725
1726 /***********************************************************************//** 1726 /***********************************************************************//**
  1727 + * @brief Returns flux within sky region
  1728 + *
  1729 + * @param[in] region Sky region.
  1730 + * @param[in] map Map index [0,...,nmaps()-1].
  1731 + * @return Flux in sky region.
  1732 + *
  1733 + * The method returns the total flux in all sky map pixels that fall within
  1734 + * the specified region. Containment is tested using the
  1735 + * GSkyRegion::contains() method. Sky map values are multiplied by the solid
  1736 + * angle of the pixel.
  1737 + ***************************************************************************/
  1738 +double GSkyMap::flux(const GSkyRegion& region, const int& map) const
  1739 +{
  1740 + // Initialise flux
  1741 + double flux = 0.0;
  1742 +
  1743 + // Loop over all sky pixels and sum flux of all pixels that fall within
  1744 + // the sky region
  1745 + for (int i = 0; i < m_num_pixels; ++i) {
  1746 + if (region.contains(inx2dir(i))) {
  1747 + flux += (*this)(i,map) * solidangle(i);
  1748 + }
  1749 + }
  1750 +
  1751 + // Return flux
  1752 + return flux;
  1753 +}
  1754 +
  1755 +
  1756 +/***********************************************************************//**
  1757 + * @brief Returns flux within sky regions
  1758 + *
  1759 + * @param[in] regions Sky regions.
  1760 + * @param[in] map Map index [0,...,nmaps()-1].
  1761 + * @return Flux in sky region.
  1762 + *
  1763 + * The method returns the total flux in all sky map pixels that fall within
  1764 + * the specified regions. Containment is tested using the
  1765 + * GSkyRegions::contains() method. Sky map values are multiplied by the solid
  1766 + * angle of the pixel.
  1767 + ***************************************************************************/
  1768 +double GSkyMap::flux(const GSkyRegions& regions, const int& map) const
  1769 +{
  1770 + // Initialise flux
  1771 + double flux = 0.0;
  1772 +
  1773 + // Loop over all sky pixels and sum flux of all pixels that fall within
  1774 + // the sky region
  1775 + for (int i = 0; i < m_num_pixels; ++i) {
  1776 + if (regions.contains(inx2dir(i))) {
  1777 + flux += (*this)(i,map) * solidangle(i);
  1778 + }
  1779 + }
  1780 +
  1781 + // Return flux
  1782 + return flux;
  1783 +}
  1784 +
  1785 +
  1786 +/***********************************************************************//**
1727 * @brief Returns array with total flux for sky maps 1787 * @brief Returns array with total flux for sky maps
1728 * 1788 *
1729 * @return Array of pixel flux sums. 1789 * @return Array of pixel flux sums.
@@ -1734,7 +1794,7 @@ double GSkyMap::flux(const GSkyPixel&amp; pixel, const int&amp; map) const @@ -1734,7 +1794,7 @@ double GSkyMap::flux(const GSkyPixel&amp; pixel, const int&amp; map) const
1734 GNdarray GSkyMap::flux(void) const 1794 GNdarray GSkyMap::flux(void) const
1735 { 1795 {
1736 // Initialise output array 1796 // Initialise output array
1737 - GNdarray flux_array = GNdarray(m_num_maps); 1797 + GNdarray flux_array = GNdarray(m_num_maps);
1738 1798
1739 // Loop over maps and store sums in output array 1799 // Loop over maps and store sums in output array
1740 for (int i = 0; i < m_num_maps; ++i) { 1800 for (int i = 0; i < m_num_maps; ++i) {
@@ -1836,6 +1896,62 @@ double GSkyMap::solidangle(const GSkyPixel&amp; pixel) const @@ -1836,6 +1896,62 @@ double GSkyMap::solidangle(const GSkyPixel&amp; pixel) const
1836 1896
1837 1897
1838 /***********************************************************************//** 1898 /***********************************************************************//**
  1899 + * @brief Returns solid angle within sky region
  1900 + *
  1901 + * @param[in] region Sky region.
  1902 + * @return Solid angle within sky region.
  1903 + *
  1904 + * The method returns the total solid angle of all sky map pixels that fall
  1905 + * within the specified region. Containment is tested using the
  1906 + * GSkyRegion::contains() method.
  1907 + ***************************************************************************/
  1908 +double GSkyMap::solidangle(const GSkyRegion& region) const
  1909 +{
  1910 + // Initialise flux
  1911 + double solidangle = 0.0;
  1912 +
  1913 + // Loop over all sky pixels and sum solid angle of all pixels that fall
  1914 + // within the sky region
  1915 + for (int i = 0; i < m_num_pixels; ++i) {
  1916 + if (region.contains(inx2dir(i))) {
  1917 + solidangle += this->solidangle(i);
  1918 + }
  1919 + }
  1920 +
  1921 + // Return solidangle
  1922 + return solidangle;
  1923 +}
  1924 +
  1925 +
  1926 +/***********************************************************************//**
  1927 + * @brief Returns flux within sky regions
  1928 + *
  1929 + * @param[in] region Sky region.
  1930 + * @return Solid angle within sky region.
  1931 + *
  1932 + * The method returns the total solid angle of all sky map pixels that fall
  1933 + * within the specified region. Containment is tested using the
  1934 + * GSkyRegions::contains() method.
  1935 + ***************************************************************************/
  1936 +double GSkyMap::solidangle(const GSkyRegions& regions) const
  1937 +{
  1938 + // Initialise flux
  1939 + double solidangle = 0.0;
  1940 +
  1941 + // Loop over all sky pixels and sum solid angle of all pixels that fall
  1942 + // within the sky regions
  1943 + for (int i = 0; i < m_num_pixels; ++i) {
  1944 + if (regions.contains(inx2dir(i))) {
  1945 + solidangle += this->solidangle(i);
  1946 + }
  1947 + }
  1948 +
  1949 + // Return solidangle
  1950 + return solidangle;
  1951 +}
  1952 +
  1953 +
  1954 +/***********************************************************************//**
1839 * @brief Set sky projection 1955 * @brief Set sky projection
1840 * 1956 *
1841 * @param[in] proj Sky projection. 1957 * @param[in] proj Sky projection.
@@ -2266,7 +2382,7 @@ GSkyRegionCircle GSkyMap::region_circle(void) const @@ -2266,7 +2382,7 @@ GSkyRegionCircle GSkyMap::region_circle(void) const
2266 2382
2267 // Consider edges of pixel with maximum distance 2383 // Consider edges of pixel with maximum distance
2268 if (max_index != -1) { 2384 if (max_index != -1) {
2269 - 2385 +
2270 // Set upper pixel edge just beyond the upper boundary since the 2386 // Set upper pixel edge just beyond the upper boundary since the
2271 // upper boundary is excluded 2387 // upper boundary is excluded
2272 const double up = 0.4999999; 2388 const double up = 0.4999999;
test/test_GSky.cpp
1 /*************************************************************************** 1 /***************************************************************************
2 * test_GSky.cpp - Test sky module * 2 * test_GSky.cpp - Test sky module *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2010-2020 by Juergen Knoedlseder * 4 + * copyright (C) 2010-2021 by Juergen Knoedlseder *
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 *
@@ -1284,6 +1284,24 @@ void TestGSky::test_GSkyMap(void) @@ -1284,6 +1284,24 @@ void TestGSky::test_GSkyMap(void)
1284 GNdarray flux_spectrum = map_src.flux(); 1284 GNdarray flux_spectrum = map_src.flux();
1285 test_value(flux_spectrum.size(), map_src.nmaps(), "Test flux() method"); 1285 test_value(flux_spectrum.size(), map_src.nmaps(), "Test flux() method");
1286 1286
  1287 + // Test flux in region methods
  1288 + GSkyRegionCircle gc_circle(266.40499, -28.93617, 3.0);
  1289 + GSkyRegionRectangle gc_box(266.40499, -28.93617, 4.0, 2.0, -58.59867);
  1290 + GSkyRegionMap gc_map(&gc_box);
  1291 + GSkyRegions gc_regions;
  1292 + gc_regions.append(gc_circle);
  1293 + gc_regions.append(gc_box);
  1294 + test_value(map_src.flux(gc_circle), 0.49208055, "Test flux(GSkyRegionCircle) method");
  1295 + test_value(map_src.flux(gc_box), 0.12306231, "Test flux(GSkyRegionRectangle) method");
  1296 + test_value(map_src.flux(gc_map), 0.12306231, "Test flux(GSkyRegionMap) method");
  1297 + test_value(map_src.flux(gc_regions), 0.49208055, "Test flux(GSkyRegions) method");
  1298 +
  1299 + // Test solidangle in region methods
  1300 + test_value(map_src.solidangle(gc_circle), 0.0097441693, "Test solidangle(GSkyRegionCircle) method");
  1301 + test_value(map_src.solidangle(gc_box), 0.0024368775, "Test solidangle(GSkyRegionRectangle) method");
  1302 + test_value(map_src.solidangle(gc_map), 0.0024368775, "Test solidangle(GSkyRegionMap) method");
  1303 + test_value(map_src.solidangle(gc_regions), 0.0097441693, "Test solidangle(GSkyRegions) method");
  1304 +
1287 // Test map number changing 1305 // Test map number changing
1288 GSkyMap map_more = map_src; 1306 GSkyMap map_more = map_src;
1289 map_more.nmaps(4); 1307 map_more.nmaps(4);