Commit 4485a86ff847bf6db41e451387bb12de804d145f

Authored by Jürgen Knödlseder
1 parent 1d494a96

Integrate code

ChangeLog
  1 +2017-07-06
  2 +
  3 + * Version 1.4.0 released
  4 + =========================
  5 +
  6 + Add GSkyRegions::overlaps() and GSkyMap::overlaps() classes (#1980)
  7 +
  8 +
1 9 2017-06-06
2 10  
3 11 * Version 1.3.0 released
... ...
1   -New Features and Important Changes in GammaLib 1.3.0
  1 +New Features and Important Changes in GammaLib 1.4.0
2 2  
3   -6 June 2017
  3 +6 July 2017
4 4  
5 5  
6 6 1. Introduction
... ... @@ -12,15 +12,7 @@ made since the last release of GammaLib.
12 12 2. Public interface modifications
13 13 ---------------------------------
14 14 The following classes have been added:
15   -- GPhases
16   -- GWcsGLS
17   -- GWcsSFL
18   -- GModelSpectralSmoothBrokenPlaw
19   -- GModelSpatialRadialProfile
20   -- GModelSpatialRadialProfileGauss
21   -- GModelSpatialRadialProfileDMBurkert
22   -- GModelSpatialRadialProfileDMEinasto
23   -- GModelSpatialRadialProfileDMZhao
  15 +- n.a.
24 16  
25 17 The following classes have been removed:
26 18 - n.a.
... ... @@ -29,48 +21,14 @@ The following classes have been renamed:
29 21 - n.a.
30 22  
31 23 The following methods have been added:
32   -- GEbounds::set(GEnergies&)
33   -- GEbounds::emin(int&, GEnergy&)
34   -- GEbounds::emax(int&, GEnergy&)
35   -- GEnergies::set(GEbounds&)
36   -- GFilename::type()
37   -- GMatrix::operator+(double&)
38   -- GMatrix::operator-(double&)
39   -- GMatrix::operator+=(double&)
40   -- GMatrix::operator-=(double&)
41   -- GMatrixSymmetric::operator+(double&)
42   -- GMatrixSymmetric::operator-(double&)
43   -- GMatrixSymmetric::operator+=(double&)
44   -- GMatrixSymmetric::operator-=(double&)
45   -- GMatrixSparse::operator+(double&)
46   -- GMatrixSparse::operator-(double&)
47   -- GMatrixSparse::operator+=(double&)
48   -- GMatrixSparse::operator-=(double&)
49   -- GCTAResponseIrf::rspname()
50   -- GCTARoi::contains(GCTAInstDir&)
51   -- GCTAEdisp2D::fetch()
52   -- GCTAAeff::ebounds()
53   -- GCTAAeff2D::ebounds()
54   -- GCTAAeffArf::ebounds()
55   -- GCTAAeffPerfTable::ebounds()
56   -- GCTAEventList::append_column(GFitsTableCol&)
57   -- GCTAEventList::has_phase(bool&)
58   -- GCTAEventList::has_phase()
59   -- GCTAEventList::has_detxy(bool&)
60   -- GCTAEventList::has_detxy()
61   -- GCTAEventList::has_mc_id(bool&)
62   -- GCTAEventList::has_mc_id()
63   -- GCTAEventList::set_mc_id_names(std::vector<int>&, std::vector<std::string>&)
64   -- GCTAEventAtom::mc_id(int&)
65   -- GCTAEventAtom::mc_id()
  24 +- GSkyRegion::overlaps(GSkyRegions&)
  25 +- GSkyMap::overlaps(GSkyRegion&)
66 26  
67 27 The following methods have been removed:
68   -- GFitsTable::size()
  28 +- n.a.
69 29  
70 30 The following methods have been renamed:
71   -- GFitsImage::size() => GFitsImage::npix()
72   -- GFitsHDU::size() => GFitsHDU::cards()
73   -- GFitsTableCol::length() => GFitsTableCol::nrows()
  31 +- n.a.
74 32  
75 33 The arguments for the following methods have been changed:
76 34 - n.a.
... ... @@ -81,19 +39,7 @@ The return value of the following methods has been changed:
81 39  
82 40 3. Configuration
83 41 -----------------
84   -The Python unit tests now raise exceptions instead of exiting with a non-
85   -zero return code so that the user is not thrown out of Python after calling
86   -gammalib.test() (#1983).
87   -
88   -If the code originates from the Git repository the configuration now switches
89   -to developer mode which implies that the Python bindings are always built.
90   -This solves the problem that occured for developers that could not get rid
91   -of existing Python wrappers, even if they modified the Python interface
92   -(#1985).
93   -
94   -The shared libraries needed by the Python wrappers are now copied into a
95   -build/gammalib directory for unit testing instead of creating a symbolic
96   -link since on shared VM file systems symbolic links may not work (#1987).
  42 +None
97 43  
98 44  
99 45 4. Application module
... ... @@ -108,57 +54,17 @@ None
108 54  
109 55 6. FITS I/O Interface
110 56 ---------------------
111   -FITS image type conversion constructors have been added to convert a FITS
112   -image of any type into a specific storage class (#1986).
113   -
114   -A map between header card keywords and header card pointers was added to
115   -GFitsHeader to speed up the access of FITS header cards (#2120).
116   -
117   -The GFitsImage::size() method has been renamed to GFitsImage::npix() since
118   -the size() method overloaded the GFitsHDU::size() method (#1858).
119   -
120   -The GFitsTable::size() method has been removed since the meaning of the
121   -method was ambiguous. It returned the number of table columns, but the
122   -GFitsTable::ncols() does exactly the same thing, hence the method was
123   -redundant (#1857).
124   -
125   -The GFitsHDU::size() method has been renamed to GFitsHDU::cards() since the
126   -meaning of the size() method was not clear (#1859).
127   -
128   -The GFitsTableCol::length() method was renamed to GFitsTableCol::nrows()
129   -to clarify the meaning of thie method (#1860).
  57 +None
130 58  
131 59  
132 60 7. Linear algebra module
133 61 ------------------------
134   -Add operators for addition and subtraction of scalars to all matrix classes
135   -(#1990).
  62 +None
136 63  
137 64  
138 65 8. Model module
139 66 ---------------
140   -The GModelSpectralNodes class now throws an exception if the energy or
141   -intensity of a node is set to a non-positive value (#990).
142   -
143   -The GModelSpectralSmoothBrokenPlaw class that implements a smoothly broken
144   -power law spectrum has been added (#1948).
145   -
146   -The scale of the composite spatial models can now be fitted by adding the
147   -free_scale="1" attribute to the XML file (#1992).
148   -
149   -Add GModelSpatialRadialProfile class to handle arbitrary radial profiles.
150   -The method deals with pre-computation and normalization of the profiles,
151   -and implements the eval() and mc() methods. The following derived classes
152   -have been implemented:
153   -- GModelSpatialRadialProfileGauss: radial Gaussian profile
154   -- GModelSpatialRadialProfileDMBurkert: Burkert Dark Matter profile
155   -- GModelSpatialRadialProfileDMEinasto: Einasto Dark Matter profile
156   -- GModelSpatialRadialProfileDMZhao: Zhao Dark matter profile
157   -Please note that these models are not deeply tested so far and the code
158   -and interface is still subject to change (#1520).
159   -
160   -The names of spatial model parameters are now always set to RA/DEC even if
161   -the input parameters were GLON/GLAT (#2113).
  67 +None
162 68  
163 69  
164 70 9. Numerics module
... ... @@ -168,39 +74,27 @@ None
168 74  
169 75 10. Observation module
170 76 ----------------------
171   -A set() method has been added to GEbounds and GEnergies to allow converting
172   -energy boundaries into an energy container and vice versa. In addition,
173   -conversion constructors have been added (#1977).
174   -
175   -The GEbounds::set_lin() and GEbounds::set_log() method now throw exceptions
176   -if the minimum energy is larger than the maximum energy. In addition, the
177   -GEbounds::set_log() method throws an exception if either the minimum or
178   -maximum energy are zero. Furthermore, the methods clear the energy boundaries
179   -if the requested number of intervals is non-zero (#1989).
180   -
181   -The GPhases class has been added to handle phase selections of events (#1996).
  77 +None
182 78  
183 79  
184 80 11. Optimization module
185 81 -----------------------
186   -The Levenberg-Marquardt optimiser convergence criterion is now scaled with the
187   -step size so that a small step size does no longer lead to a stop of the
188   -iterative process (#2022).
  82 +None
189 83  
190 84  
191 85 12. Sky module
192 86 --------------
193   -The GWcsGLS and GWcsSFL classes have been added to support the GLS and SFL
194   -World Coordinate System projections (#1851).
  87 +A GSkyRegions::overlaps(GSkyRegions&) method has been added to check the
  88 +overlap of any region in a given container with any region in another
  89 +container (#1980).
195 90  
196   -The GWcs base class now also supports CD keywords instead of CDELT keywords
197   -(#1951).
  91 +A GSkyMap::overlaps(GSkyRegions&) method has been added to check the overlap
  92 +of a sky region with a sky map (#1980).
198 93  
199 94  
200 95 13. Support module
201 96 ------------------
202   -A GFilename::type() method has been added that returns the type of the file
203   -based on the file type extension (e.g. ".fits") (#1863).
  97 +None
204 98  
205 99  
206 100 14. XML module
... ... @@ -235,62 +129,10 @@ None
235 129  
236 130 20. CTA interface
237 131 -----------------
238   -Correct the containment radius computation in GCTAPsf2D (#1876).
239   -
240   -The GCTAResponseIrf::rspname() method has been added that returns the name
241   -of the response function (attribute m_rspname).
242   -
243   -Do no longer interpret a CTA calibration database as a file path in the
244   -GCTAResponseIrf::read() method (#1969).
245   -
246   -Add GCTARoi::contains() method that checks whether an instrument direction
247   -is contained within the region of interest.
248   -
249   -Lazy loading of the energy dispersion in GCTAEdisp2D has been implemented by
250   -adding a fetch() method to the class. Now the energy dispersion is only loaded
251   -when needed, for example for function evaluation or Monte Carlo sampling (#1940).
252   -
253   -The GCTAEdisp2D::compute_ebounds_src() method now loops over the migration to
254   -enhance the precision in the true energy boundaries that are returned by this
255   -method. In addition, the validity range of the table is now stored in members
256   -of the class, and a non-zero energy dispersion is only returned for valid
257   -elements of the response table.
258   -
259   -An GCTAAeff::ebounds() method has been added to the abstract interface for
260   -effective area responses to return the valid energy range of the effective
261   -area (#1989).
262   -
263   -The GCTAModelAeffBackground::mc() could get stuck in the rejection loop if the
264   -effective area returned is always zero. A counter has been added that leads to
265   -the exit of the loop in case that 1000 subsequent zero values are returned
266   -(#1988).
267   -
268   -A GCTAEventList::append_column() method has been added to allow appending of
269   -FITS columns to an event list. The method checks whether the length of the
270   -FITS column is compatible with the number of events that are present in the
271   -event list (#1991).
272   -
273   -Add GCTAEventList::has_phase() and GCTAEventList::has_detxy() getter and setter
274   -methods to manipulate the event list information flags (#1982).
275   -
276   -Add GCTAEventList::has_mc_id() and GCTAEventAtom::mc_id() getter and setter methods
277   -to set the Monte Carlo identifier of a given event. This allows to attribute a
278   -Monte Carlo simulated event to a specific model (#1483).
279   -
280   -Add GCTAEventList::set_mc_id_names() method to store Monte Carlo metadata into an
281   -event list and to write this information into the FITS header. Furthermore, the
282   -information is read back when loading an event list (#1483).
283   -
284   -The loading and saving of CTA response cubes was put into an OpenMP critial zone to
285   -avoid FITS file pointer exceptions (#2021).
286   -
287   -The CTA background template HDUCLAS2 was changed from "BGD" to "BKG". Both strings
288   -are supported by GammaLib.
289   -
290   -The maximum radius of the King PSF has been increased from 0.7 to 2 degrees to cope
291   -with some extreme cases. Now also the maximum PSF radius is computed for a given
292   -energy so that if the PSF is smaller than the maximum radius of 2 degrees a smaller
293   -region of interest will be used for the computation (#2112).
  132 +The GCTACubeExposure::fill_cube(), GCTACubePsf::fill_cube(),
  133 +GCTACubeEdisp::fill_cube(), and GCTACubeBackground::fill() methods now
  134 +exclude any observations from the filling for which the RoI does not
  135 +overlap with the cube definition (#1980).
294 136  
295 137  
296 138 21. COMPTEL interface
... ...
include/GSkyMap.hpp
... ... @@ -35,7 +35,6 @@
35 35 #include "GSkyPixel.hpp"
36 36 #include "GSkyProjection.hpp"
37 37 #include "GBilinear.hpp"
38   -#include "GSkyRegionCircle.hpp"
39 38  
40 39 /* __ Forward declarations _______________________________________________ */
41 40 class GFilename;
... ... @@ -47,6 +46,8 @@ class GFitsImage;
47 46 class GFitsImageDouble;
48 47 class GMatrix;
49 48 class GVector;
  49 +class GSkyRegion;
  50 +class GSkyRegionCircle;
50 51  
51 52  
52 53 /***********************************************************************//**
... ... @@ -159,9 +160,9 @@ public:
159 160 double flux(const GSkyPixel& pixel, const int& map = 0) const;
160 161 double solidangle(const int& index) const;
161 162 double solidangle(const GSkyPixel& pixel) const;
162   - bool overlaps(const GSkyRegionCircle& reg) const;
163 163 bool contains(const GSkyDir& dir) const;
164 164 bool contains(const GSkyPixel& pixel) const;
  165 + bool overlaps(const GSkyRegion& region) const;
165 166 const GSkyProjection* projection(void) const;
166 167 void projection(const GSkyProjection& proj);
167 168 const double* pixels(void) const;
... ... @@ -196,6 +197,7 @@ private:
196 197 const GSkyDir& dir3) const;
197 198 double solidangle(const GSkyDir& dir1, const GSkyDir& dir2,
198 199 const GSkyDir& dir3, const GSkyDir& dir4) const;
  200 + bool overlaps_circle(const GSkyRegionCircle& region) const;
199 201 bool is_healpix(const GFitsHDU& hdu) const;
200 202 bool is_wcs(const GFitsHDU& hdu) const;
201 203  
... ...
include/GSkyRegions.hpp
1 1 /***************************************************************************
2 2 * GSkyRegions.hpp - Sky region container class *
3 3 * ----------------------------------------------------------------------- *
4   - * copyright (C) 2013-2016 by Pierrick Martin *
  4 + * copyright (C) 2013-2017 by Pierrick Martin *
5 5 * ----------------------------------------------------------------------- *
6 6 * *
7 7 * This program is free software: you can redistribute it and/or modify *
... ... @@ -83,7 +83,7 @@ public:
83 83 void reserve(const int& num);
84 84 void extend(const GSkyRegions& regions);
85 85 bool contains(const GSkyDir& dir) const;
86   - bool overlaps(const GSkyRegion& reg) const;
  86 + bool overlaps(const GSkyRegion& region) const;
87 87 bool overlaps(const GSkyRegions& regions) const;
88 88 void load(const GFilename& filename);
89 89 void save(const GFilename& filename) const;
... ...
inst/cta/src/GCTACubeBackground.cpp
... ... @@ -32,15 +32,16 @@
32 32 #include "GException.hpp"
33 33 #include "GMath.hpp"
34 34 #include "GRan.hpp"
  35 +#include "GLog.hpp"
35 36 #include "GFits.hpp"
36 37 #include "GFitsBinTable.hpp"
37 38 #include "GObservations.hpp"
  39 +#include "GSkyRegionCircle.hpp"
38 40 #include "GCTAEventCube.hpp"
39 41 #include "GCTAObservation.hpp"
40 42 #include "GCTARoi.hpp"
41 43 #include "GCTAInstDir.hpp"
42 44 #include "GCTACubeBackground.hpp"
43   -#include "GLog.hpp"
44 45  
45 46 /* __ Method name definitions ____________________________________________ */
46 47 #define G_READ "GCTACubeBackground::read(GFits&)"
... ... @@ -405,16 +406,17 @@ void GCTACubeBackground::fill(const GObservations&amp; obs, GLog* log)
405 406 GSkyRegionCircle obs_reg(roi.centre().dir(), roi.radius());
406 407 if (!m_cube.overlaps(obs_reg)) {
407 408 if (log != NULL) {
408   - *log << "Skipping ";
  409 + *log << "Skipping unbinned ";
409 410 *log << cta->instrument();
410 411 *log << " observation ";
411 412 *log << "\"" << cta->name() << "\"";
412   - *log << " (id=" << cta->id() << ") as it lies outside the cube";
  413 + *log << " (id=" << cta->id() << ") since it does not overlap ";
  414 + *log << "with the background cube.";
413 415 *log << std::endl;
414 416 }
415 417 continue;
416 418 } // endif: m_cube overlaps observation
417   -
  419 +
418 420 // Announce observation usage
419 421 if (log != NULL) {
420 422 *log << "Including ";
... ... @@ -423,7 +425,7 @@ void GCTACubeBackground::fill(const GObservations&amp; obs, GLog* log)
423 425 *log << "\" (id=" << cta->id() << ")";
424 426 *log << " in background cube computation." << std::endl;
425 427 }
426   -
  428 +
427 429 // Set GTI of actual observations as the GTI of the event cube
428 430 eventcube.gti(cta->gti());
429 431  
... ...
inst/cta/src/GCTACubeEdisp.cpp
... ... @@ -35,6 +35,7 @@
35 35 #include "GFitsImage.hpp"
36 36 #include "GFitsTable.hpp"
37 37 #include "GObservations.hpp"
  38 +#include "GSkyRegionCircle.hpp"
38 39 #include "GCTACubeEdisp.hpp"
39 40 #include "GCTAObservation.hpp"
40 41 #include "GCTAResponseIrf.hpp"
... ... @@ -866,20 +867,9 @@ void GCTACubeEdisp::fill_cube(const GCTAObservation&amp; obs,
866 867 "to specify an RoI for this observation.";
867 868 throw GException::invalid_value(G_FILL_CUBE, msg);
868 869 }
869   -
870   - // Make sure the observation falls within the bounds of the cube
871   - GSkyRegionCircle obs_reg(roi.centre().dir(), roi.radius());
872   - if (!m_cube.overlaps(obs_reg)) {
873   - if (log != NULL) {
874   - *log << "Skipping unbinned ";
875   - *log << obs.instrument();
876   - *log << " observation ";
877   - *log << "\"" << obs.name() << "\"";
878   - *log << " (id=" << obs.id() << ") which does not overlap Edisp cube.";
879   - *log << std::endl;
880   - }
881   - return;
882   - }
  870 +
  871 + // Convert RoI into a circular region for overlap checking
  872 + GSkyRegionCircle roi_reg(roi.centre().dir(), roi.radius());
883 873  
884 874 // Extract response from observation
885 875 const GCTAResponseIrf* rsp = dynamic_cast<const GCTAResponseIrf*>
... ... @@ -915,6 +905,19 @@ void GCTACubeEdisp::fill_cube(const GCTAObservation&amp; obs,
915 905 }
916 906 }
917 907  
  908 + // Skip observation if observation is outside the bounds of the cube
  909 + else if (!m_cube.overlaps(roi_reg)) {
  910 + if (log != NULL) {
  911 + *log << "Skipping unbinned ";
  912 + *log << obs.instrument();
  913 + *log << " observation ";
  914 + *log << "\"" << obs.name() << "\"";
  915 + *log << " (id=" << obs.id() << ") since it does not overlap ";
  916 + *log << "with the energy dispersion cube.";
  917 + *log << std::endl;
  918 + }
  919 + }
  920 +
918 921 // ... otherwise continue
919 922 else {
920 923  
... ...
inst/cta/src/GCTACubeExposure.cpp
... ... @@ -32,6 +32,7 @@
32 32 #include "GMath.hpp"
33 33 #include "GLog.hpp"
34 34 #include "GObservations.hpp"
  35 +#include "GSkyRegionCircle.hpp"
35 36 #include "GCTACubeExposure.hpp"
36 37 #include "GCTAObservation.hpp"
37 38 #include "GCTAResponseIrf.hpp"
... ... @@ -655,20 +656,9 @@ void GCTACubeExposure::fill_cube(const GCTAObservation&amp; obs, GLog* log)
655 656 "to specify an RoI for this observation.";
656 657 throw GException::invalid_value(G_FILL_CUBE, msg);
657 658 }
658   -
659   - // Check that the observation overlaps with the cube
660   - GSkyRegionCircle obs_reg(roi.centre().dir(), roi.radius());
661   - if (!m_cube.overlaps(obs_reg)) {
662   - if (log != NULL) {
663   - *log << "Skipping unbinned ";
664   - *log << obs.instrument();
665   - *log << " observation ";
666   - *log << "\"" << obs.name() << "\"";
667   - *log << " (id=" << obs.id() << ") ";
668   - *log << "which lies outside exposure cube";
669   - *log << std::endl;
670   - }
671   - }
  659 +
  660 + // Convert RoI into a circular region for overlap checking
  661 + GSkyRegionCircle roi_reg(roi.centre().dir(), roi.radius());
672 662  
673 663 // Extract response from observation
674 664 const GCTAResponseIrf* rsp = dynamic_cast<const GCTAResponseIrf*>
... ... @@ -693,6 +683,19 @@ void GCTACubeExposure::fill_cube(const GCTAObservation&amp; obs, GLog* log)
693 683 }
694 684 }
695 685  
  686 + // Skip observation if observation is outside the bounds of the cube
  687 + else if (!m_cube.overlaps(roi_reg)) {
  688 + if (log != NULL) {
  689 + *log << "Skipping unbinned ";
  690 + *log << obs.instrument();
  691 + *log << " observation ";
  692 + *log << "\"" << obs.name() << "\"";
  693 + *log << " (id=" << obs.id() << ") since it does not overlap ";
  694 + *log << "with the exposure cube.";
  695 + *log << std::endl;
  696 + }
  697 + }
  698 +
696 699 // ... otherwise continue
697 700 else {
698 701  
... ...
inst/cta/src/GCTACubePsf.cpp
... ... @@ -32,6 +32,7 @@
32 32 #include "GMath.hpp"
33 33 #include "GLog.hpp"
34 34 #include "GObservations.hpp"
  35 +#include "GSkyRegionCircle.hpp"
35 36 #include "GCTACubePsf.hpp"
36 37 #include "GCTAObservation.hpp"
37 38 #include "GCTAResponseIrf.hpp"
... ... @@ -787,20 +788,9 @@ void GCTACubePsf::fill_cube(const GCTAObservation&amp; obs,
787 788 throw GException::invalid_value(G_FILL_CUBE, msg);
788 789 }
789 790  
790   - // Make sure the observation falls within the bounds of the cube
791   - GSkyRegionCircle obs_reg(roi.centre().dir(), roi.radius());
792   - if (!m_cube.overlaps(obs_reg)) {
793   - if (log != NULL) {
794   - *log << "Skipping unbinned ";
795   - *log << obs.instrument();
796   - *log << " observation ";
797   - *log << "\"" << obs.name() << "\"";
798   - *log << " (id=" << obs.id() << ") which does not overlap PSF cube.";
799   - *log << std::endl;
800   - }
801   - return;
802   - }
803   -
  791 + // Convert RoI into a circular region for overlap checking
  792 + GSkyRegionCircle roi_reg(roi.centre().dir(), roi.radius());
  793 +
804 794 // Extract response from observation
805 795 const GCTAResponseIrf* rsp = dynamic_cast<const GCTAResponseIrf*>
806 796 (obs.response());
... ... @@ -824,6 +814,19 @@ void GCTACubePsf::fill_cube(const GCTAObservation&amp; obs,
824 814 }
825 815 }
826 816  
  817 + // Skip observation if observation is outside the bounds of the cube
  818 + else if (!m_cube.overlaps(roi_reg)) {
  819 + if (log != NULL) {
  820 + *log << "Skipping unbinned ";
  821 + *log << obs.instrument();
  822 + *log << " observation ";
  823 + *log << "\"" << obs.name() << "\"";
  824 + *log << " (id=" << obs.id() << ") since it does not overlap ";
  825 + *log << "with the point spread function cube.";
  826 + *log << std::endl;
  827 + }
  828 + }
  829 +
827 830 // ... otherwise continue
828 831 else {
829 832  
... ...
inst/cta/src/GCTAEventList.cpp
... ... @@ -797,11 +797,13 @@ void GCTAEventList::dispose(void) const
797 797 // Clear events and additional columns
798 798 m_events.clear();
799 799 m_columns.clear();
800   -
801   - // Now actually remove the memory reserved for these objects
  800 +
  801 + // Now actually remove the memory reserved for these objects. See
  802 + // https://prateekvjoshi.com/2013/10/20/c-vector-memory-release/
  803 + // for an explanation of this code.
802 804 std::vector<GCTAEventAtom>(m_events).swap(m_events);
803 805 std::vector<GFitsTableCol*>(m_columns).swap(m_columns);
804   -
  806 +
805 807 // Return
806 808 return;
807 809 }
... ...
pyext/GSkyMap.i
1 1 /***************************************************************************
2 2 * GSkyMap.i - Sky map class *
3 3 * ----------------------------------------------------------------------- *
4   - * copyright (C) 2010-2016 by Juergen Knoedlseder *
  4 + * copyright (C) 2010-2017 by Juergen Knoedlseder *
5 5 * ----------------------------------------------------------------------- *
6 6 * *
7 7 * This program is free software: you can redistribute it and/or modify *
... ... @@ -171,6 +171,7 @@ public:
171 171 double solidangle(const GSkyPixel& pixel) const;
172 172 bool contains(const GSkyDir& dir) const;
173 173 bool contains(const GSkyPixel& pixel) const;
  174 + bool overlaps(const GSkyRegion& region) const;
174 175 const GSkyProjection* projection(void) const;
175 176 void projection(const GSkyProjection& proj);
176 177 const double* pixels(void) const;
... ...
pyext/GSkyRegions.i
1 1 /***************************************************************************
2 2 * GSkyRegions.i - Sky region container class *
3 3 * ----------------------------------------------------------------------- *
4   - * copyright (C) 2013-2016 by Pierrick Martin *
  4 + * copyright (C) 2013-2017 by Pierrick Martin *
5 5 * ----------------------------------------------------------------------- *
6 6 * *
7 7 * This program is free software: you can redistribute it and/or modify *
... ... @@ -56,7 +56,8 @@ public:
56 56 void reserve(const int& num);
57 57 void extend(const GSkyRegions& regions);
58 58 bool contains(const GSkyDir& dir) const;
59   - bool overlaps(const GSkyRegion& reg) const;
  59 + bool overlaps(const GSkyRegion& region) const;
  60 + bool overlaps(const GSkyRegions& regions) const;
60 61 void load(const GFilename& filename);
61 62 void save(const GFilename& filename) const;
62 63 const GFilename& filename(void) const;
... ...
src/sky/GSkyMap.cpp
... ... @@ -44,6 +44,8 @@
44 44 #include "GMatrix.hpp"
45 45 #include "GVector.hpp"
46 46 #include "GVOClient.hpp"
  47 +#include "GSkyRegion.hpp"
  48 +#include "GSkyRegionCircle.hpp"
47 49  
48 50 /* __ Method name definitions ____________________________________________ */
49 51 #define G_CONSTRUCT_HPX "GSkyMap::GSkyMap(std::string&, int&,"\
... ... @@ -68,6 +70,7 @@
68 70 #define G_FLUX2 "GSkyMap::flux(GSkyPixel&)"
69 71 #define G_SOLIDANGLE1 "GSkyMap::solidangle(int&)"
70 72 #define G_SOLIDANGLE2 "GSkyMap::solidangle(GSkyPixel&)"
  73 +#define G_OVERLAPS "GSkyMap::overlaps(GSkyRegion&)"
71 74 #define G_EXTRACT "GSkyMap::extract(int&, int&)"
72 75 #define G_READ "GSkyMap::read(GFitsHDU&)"
73 76 #define G_SET_WCS "GSkyMap::set_wcs(std::string&, std::string&, double&,"\
... ... @@ -1716,72 +1719,11 @@ void GSkyMap::projection(const GSkyProjection&amp; proj)
1716 1719 }
1717 1720  
1718 1721  
1719   -/***********************************************************************
1720   - * @brief Checks whether or not a circular region overlaps with this map
1721   - *
1722   - * @param[in] reg Circular region
1723   - * @return True or False
1724   - *
1725   - * The check is done by first testing whether the central pointing
1726   - * position of the observation falls into the sky map. If this is false,
1727   - * then pixel positions that border the sky map are tested for whether or
1728   - * not they fall into the observation region. The positions tested can be
1729   - * visualized as follows, where '*' marks the positions tested.
1730   - *
1731   - * * * * * * *
1732   - * +---+---+---+---+
1733   - * * |0,2|1,2|2,2|3,2| *
1734   - * +---+---+---+---+
1735   - * * |0,1|1,1|2,1|3,1| *
1736   - * +---+---+---+---+
1737   - * * |0,0|1,0|2,0|3,0| *
1738   - * +---+---+---+---+
1739   - * * * * * * *
1740   - *
1741   - ***************************************************************************/
1742   -bool GSkyMap::overlaps(const GSkyRegionCircle& reg) const
1743   -{
1744   - // Check if the center of the region is inside the map
1745   - if (contains(reg.centre())) {
1746   - return true;
1747   - } else {
1748   - // Loop through each of the outer bins and check if the map
1749   - // overlaps with them (within some delta)
1750   - GSkyPixel pix1(0.0,0.0);
1751   - GSkyPixel pix2(0.0,0.0);
1752   -
1753   - // Check the bottom and top bins
1754   - pix1.y(-1);
1755   - pix2.y(ny());
1756   - for (int xbin=-1; xbin <= nx(); xbin+=1.0) {
1757   - pix1.x(xbin);
1758   - pix2.x(xbin);
1759   - if ((reg.contains(pix2dir(pix1))) || (reg.contains(pix2dir(pix2)))) {
1760   - return true;
1761   - }
1762   - } // endfor: loop on xbin
1763   -
1764   - // Check the left and right bins
1765   - // Check the bottom and top bins
1766   - pix1.x(-1);
1767   - pix2.x(nx());
1768   - for (double ybin=0; ybin < ny(); ybin+=1.0) {
1769   - pix1.y(ybin);
1770   - pix2.y(ybin);
1771   - if ((reg.contains(pix2dir(pix1))) || (reg.contains(pix2dir(pix2)))) {
1772   - return true;
1773   - }
1774   - } // endfor: loop on ybin
1775   -
1776   - }
1777   - return false;
1778   -}
1779   -
1780   -
1781 1722 /***********************************************************************//**
1782   - * @brief Verifies if sky direction falls in map
  1723 + * @brief Checks if sky direction falls in map
1783 1724 *
1784 1725 * @param[in] dir Sky direction.
  1726 + * @return True if sky direction falls into map, false otherwise.
1785 1727 *
1786 1728 * This method checks if the specified sky direction falls within the pixels
1787 1729 * covered by the skymap. The method uses the dir2xy method to convert the
... ... @@ -1837,6 +1779,38 @@ bool GSkyMap::contains(const GSkyPixel&amp; pixel) const
1837 1779  
1838 1780  
1839 1781 /***********************************************************************//**
  1782 + * @brief Checks whether a region overlaps with this map
  1783 + *
  1784 + * @param[in] region Region
  1785 + * @return True if region overlaps with map, false otherwise
  1786 + *
  1787 + * @exception GException::feature_not_implemented
  1788 + * Region is not a circular sky region
  1789 + ***************************************************************************/
  1790 +bool GSkyMap::overlaps(const GSkyRegion& region) const
  1791 +{
  1792 + // Initialise overlap
  1793 + bool overlap = false;
  1794 +
  1795 + // If the region is a circular region than test on overlap
  1796 + if (region.type() == "Circle") {
  1797 + const GSkyRegionCircle* circle =
  1798 + static_cast<const GSkyRegionCircle*>(&region);
  1799 + overlap = overlaps_circle(*circle);
  1800 + }
  1801 +
  1802 + // ... otherwise signal that method is not implemented
  1803 + else {
  1804 + std::string msg = "Method not implemented for non-circular regions.";
  1805 + throw GException::feature_not_implemented(G_OVERLAPS, msg);
  1806 + }
  1807 +
  1808 + // Return overlap flag
  1809 + return overlap;
  1810 +}
  1811 +
  1812 +
  1813 +/***********************************************************************//**
1840 1814 * @brief Extract maps into a new sky map object
1841 1815 *
1842 1816 * @param[in] map First map to extract
... ... @@ -3033,6 +3007,83 @@ double GSkyMap::solidangle(const GSkyDir&amp; dir1, const GSkyDir&amp; dir2,
3033 3007  
3034 3008  
3035 3009 /***********************************************************************//**
  3010 + * @brief Checks whether a circular region overlaps with this map
  3011 + *
  3012 + * @param[in] region Circular region
  3013 + * @return True if circular region overlaps with map, false otherwise
  3014 + *
  3015 + * The check is done by first testing whether the central pointing
  3016 + * position of the observation falls into the sky map. If this is false,
  3017 + * then pixel positions that border the sky map are tested for whether or
  3018 + * not they fall into the observation region. The positions tested can be
  3019 + * visualized as follows, where '*' marks the positions tested.
  3020 + *
  3021 + * * * * * * *
  3022 + * +---+---+---+---+
  3023 + * * |0,2|1,2|2,2|3,2| *
  3024 + * +---+---+---+---+
  3025 + * * |0,1|1,1|2,1|3,1| *
  3026 + * +---+---+---+---+
  3027 + * * |0,0|1,0|2,0|3,0| *
  3028 + * +---+---+---+---+
  3029 + * * * * * * *
  3030 + *
  3031 + ***************************************************************************/
  3032 +bool GSkyMap::overlaps_circle(const GSkyRegionCircle& region) const
  3033 +{
  3034 + // Initialise overlap with true
  3035 + bool overlap = false;
  3036 +
  3037 + // If the centre of the region is inside the map then signal overlap ...
  3038 + if (contains(region.centre())) {
  3039 + overlap = true;
  3040 + }
  3041 +
  3042 + // ... otherwise loop through each of the outer bins and check if the
  3043 + // region overlaps with them (within some delta)
  3044 + else {
  3045 +
  3046 + // Initialise test pixels
  3047 + GSkyPixel pix1(0.0,0.0);
  3048 + GSkyPixel pix2(0.0,0.0);
  3049 +
  3050 + // Check the bottom and top bins
  3051 + pix1.y(-1.0);
  3052 + pix2.y(double(ny()));
  3053 + for (double xbin = -1.0; xbin <= nx(); xbin += 1.0) {
  3054 + pix1.x(xbin);
  3055 + pix2.x(xbin);
  3056 + if ((region.contains(pix2dir(pix1))) ||
  3057 + (region.contains(pix2dir(pix2)))) {
  3058 + overlap = true;
  3059 + break;
  3060 + }
  3061 + } // endfor: loop on xbin
  3062 +
  3063 + // If no overlap has been found then check now the left and right
  3064 + // bins
  3065 + if (!overlap) {
  3066 + pix1.x(-1.0);
  3067 + pix2.x(double(nx()));
  3068 + for (double ybin = 0.0; ybin < ny(); ybin += 1.0) {
  3069 + pix1.y(ybin);
  3070 + pix2.y(ybin);
  3071 + if ((region.contains(pix2dir(pix1))) ||
  3072 + (region.contains(pix2dir(pix2)))) {
  3073 + overlap = true;
  3074 + break;
  3075 + }
  3076 + } // endfor: loop on ybin
  3077 + }
  3078 +
  3079 + } // endelse: check border bins
  3080 +
  3081 + // Return overlap flag
  3082 + return overlap;
  3083 +}
  3084 +
  3085 +
  3086 +/***********************************************************************//**
3036 3087 * @brief Check if HDU contains HEALPix data
3037 3088 *
3038 3089 * @param[in] hdu FITS Header Data Unit.
... ...
src/sky/GSkyRegions.cpp
1 1 /***************************************************************************
2 2 * GSkyRegions.cpp - Sky region container class *
3 3 * ----------------------------------------------------------------------- *
4   - * copyright (C) 2013-2016 by Pierrick Martin *
  4 + * copyright (C) 2013-2017 by Pierrick Martin *
5 5 * ----------------------------------------------------------------------- *
6 6 * *
7 7 * This program is free software: you can redistribute it and/or modify *
... ... @@ -408,6 +408,90 @@ void GSkyRegions::extend(const GSkyRegions&amp; regions)
408 408  
409 409  
410 410 /***********************************************************************//**
  411 + * @brief Check if direction is contained in one of the regions
  412 + *
  413 + * @param[in] dir Sky direction.
  414 + * @return True if the sky direction is container in one of the regions,
  415 + * falls otherwise.
  416 + *
  417 + * Checks if a sky direction is contained in one of the regions of the
  418 + * container.
  419 + ***************************************************************************/
  420 +bool GSkyRegions::contains(const GSkyDir& dir) const
  421 +{
  422 + // Initialise return value
  423 + bool overlap = false;
  424 +
  425 + // Loop over regions
  426 + for (int i = 0; i < size(); ++i) {
  427 + overlap = m_regions[i]->contains(dir);
  428 + if (overlap) {
  429 + break;
  430 + }
  431 + }
  432 +
  433 + // Return result
  434 + return overlap;
  435 +}
  436 +
  437 +
  438 +/***********************************************************************//**
  439 + * @brief Check if region overlaps one of the regions
  440 + *
  441 + * @param[in] region Sky region.
  442 + * @return True if @p region overlaps with one of the regions in the region
  443 + * container, false otherwise
  444 + *
  445 + * Tells if region overlaps one of the regions
  446 + ***************************************************************************/
  447 +bool GSkyRegions::overlaps(const GSkyRegion& region) const
  448 +{
  449 + // Initialise return value
  450 + bool overlap = false;
  451 +
  452 + // Loop over regions
  453 + for (int i = 0; i < size(); ++i) {
  454 + overlap = m_regions[i]->overlaps(region);
  455 + if (overlap) {
  456 + break;
  457 + }
  458 + }
  459 +
  460 + // Return result
  461 + return overlap;
  462 +}
  463 +
  464 +
  465 +/***********************************************************************//**
  466 + * @brief Check if any of the regions in two containers overlap
  467 + *
  468 + * @param[in] regions Sky region container.
  469 + * @return True if one of the regions in the @p regions container overlaps
  470 + * with one of the regions in the container, false otherwise
  471 + *
  472 + * Tells if all regions in overlaps one of the regions. Note, this method
  473 + * returns true if ANY of the regions in the two containers overlap with
  474 + * each other
  475 + ***************************************************************************/
  476 +bool GSkyRegions::overlaps(const GSkyRegions& regions) const
  477 +{
  478 + // Initialize return value
  479 + bool overlap = false;
  480 +
  481 + // Loop over each region in the container
  482 + for (int i = 0; i < size(); ++i) {
  483 + overlap = regions.overlaps(*m_regions[i]);
  484 + if (overlap) {
  485 + break;
  486 + }
  487 + }
  488 +
  489 + // Return result
  490 + return overlap;
  491 +}
  492 +
  493 +
  494 +/***********************************************************************//**
411 495 * @brief Load regions from DS9 region file
412 496 *
413 497 * @param[in] filename DS9 region filename.
... ... @@ -545,7 +629,7 @@ void GSkyRegions::save(const GFilename&amp; filename) const
545 629 /***********************************************************************//**
546 630 * @brief Print regions
547 631 *
548   - * @param[in] chatter Chattiness
  632 + * @param[in] chatter Chattiness.
549 633 * @return String containing region container information.
550 634 *
551 635 * Prints all regions into a string.
... ... @@ -577,79 +661,6 @@ std::string GSkyRegions::print(const GChatter&amp; chatter) const
577 661 }
578 662  
579 663  
580   -/***********************************************************************//**
581   - * @brief Tells if direction is contained in one of the regions
582   - *
583   - * @param[in] dir A sky direction
584   - * @return True or False
585   - *
586   - * Tells if direction is contained in one of the regions
587   - ***************************************************************************/
588   - bool GSkyRegions::contains(const GSkyDir& dir) const
589   - {
590   - // Initialise return value
591   - bool dir_is_in = false;
592   -
593   - // Loop over regions
594   - for (int i = 0; i < size(); ++i) {
595   - dir_is_in=m_regions[i]->contains(dir);
596   - if (dir_is_in) break;
597   - }
598   -
599   - // Return result
600   - return dir_is_in;
601   - }
602   -
603   -
604   -/***********************************************************************//**
605   - * @brief Tells if region overlaps one of the regions
606   - *
607   - * @param[in] reg A sky region
608   - * @return True or False
609   - *
610   - * Tells if region overlaps one of the regions
611   - ***************************************************************************/
612   -bool GSkyRegions::overlaps(const GSkyRegion& reg) const
613   -{
614   - // Initialise return value
615   - bool reg_is_in = false;
616   -
617   - // Loop over regions
618   - for (int i = 0; i < size(); ++i) {
619   - reg_is_in=m_regions[i]->overlaps(reg);
620   - if (reg_is_in) break;
621   - }
622   -
623   - // Return result
624   - return reg_is_in;
625   -}
626   -
627   -
628   -/***********************************************************************
629   - * @brief Tells if any of the regions in two containers overlap
630   - *
631   - * @param[in] regions GSkyRegions object containing a list of sky regions
632   - * @return True or False
633   - *
634   - * Tells if all regions in overlaps one of the regions. Note, this method
635   - * returns true if ANY of the regions in the two containers overlap with
636   - * each other
637   - ***************************************************************************/
638   -bool GSkyRegions::overlaps(const GSkyRegions& regions) const
639   -{
640   - // Initialize return value
641   - bool reg_is_in = false;
642   -
643   - // Loop over each region in the container
644   - for (int i=0; i < size(); i++) {
645   - reg_is_in = regions.overlaps( *m_regions[i] );
646   - if (reg_is_in) break;
647   - }
648   -
649   - // Return result
650   - return reg_is_in;
651   -}
652   -
653 664 /*==========================================================================
654 665 = =
655 666 = Private methods =
... ... @@ -712,4 +723,3 @@ void GSkyRegions::free_members(void)
712 723 // Return
713 724 return;
714 725 }
715   -
... ...