Commit bed0350acbbbe147ef8c6c0f87815cc9a9e8fbd5

Authored by Jürgen Knödlseder
1 parent 7ddd1bc2

Review of GSkyRegionRect code (#3248)

include/GSkyRegionMap.hpp
1 /*************************************************************************** 1 /***************************************************************************
2 * GSkyRegionMap.hpp - Sky region map class * 2 * GSkyRegionMap.hpp - Sky region map class *
3 * ----------------------------------------------------------------------- * 3 * ----------------------------------------------------------------------- *
4 - * copyright (C) 2017-2018 by Pierrick Martin * 4 + * copyright (C) 2017-2020 by Pierrick Martin *
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 *
include/GSkyRegionRect.hpp
@@ -30,10 +30,12 @@ @@ -30,10 +30,12 @@
30 /* __ Includes ___________________________________________________________ */ 30 /* __ Includes ___________________________________________________________ */
31 #include <vector> 31 #include <vector>
32 #include <string> 32 #include <string>
33 -#include "GMath.hpp" 33 +//#include "GMath.hpp"
34 #include "GSkyDir.hpp" 34 #include "GSkyDir.hpp"
35 #include "GSkyRegion.hpp" 35 #include "GSkyRegion.hpp"
36 -#include "GTools.hpp" 36 +//#include "GTools.hpp"
  37 +
  38 +/* __ Forward declarations _______________________________________________ */
37 39
38 40
39 /***********************************************************************//** 41 /***********************************************************************//**
@@ -63,14 +65,15 @@ class GSkyRegionRect : public GSkyRegion { @@ -63,14 +65,15 @@ class GSkyRegionRect : public GSkyRegion {
63 public: 65 public:
64 // Constructors and destructors 66 // Constructors and destructors
65 GSkyRegionRect(void); 67 GSkyRegionRect(void);
66 - GSkyRegionRect(const GSkyDir& centre  
67 - ,const double& w, const double& h  
68 - ,const double& posang_deg  
69 - );  
70 - GSkyRegionRect(const double& ra, const double& dec  
71 - ,const double& w, const double& h  
72 - ,const double& posang_deg  
73 - ); 68 + GSkyRegionRect(const GSkyDir& centre,
  69 + const double& width,
  70 + const double& height,
  71 + const double& posang);
  72 + GSkyRegionRect(const double& ra,
  73 + const double& dec,
  74 + const double& width,
  75 + const double& height,
  76 + const double& posang);
74 explicit GSkyRegionRect(const std::string& line); 77 explicit GSkyRegionRect(const std::string& line);
75 GSkyRegionRect(const GSkyRegionRect& region); 78 GSkyRegionRect(const GSkyRegionRect& region);
76 virtual ~GSkyRegionRect(void); 79 virtual ~GSkyRegionRect(void);
@@ -79,33 +82,30 @@ public: @@ -79,33 +82,30 @@ public:
79 GSkyRegionRect& operator=(const GSkyRegionRect& region); 82 GSkyRegionRect& operator=(const GSkyRegionRect& region);
80 83
81 // Implemented methods 84 // Implemented methods
82 - void clear(void);  
83 - GSkyRegionRect* clone(void) const;  
84 - std::string classname(void) const;  
85 - double posang(void) const;  
86 - void posang(const double& posang);  
87 - double posang_deg(void) const;  
88 - void posang_deg(const double& posang);  
89 - double width(void) const;  
90 - void width(const double& width);  
91 - double height(void) const;  
92 - void height(const double& height);  
93 - const GSkyDir& centre(void) const;  
94 - void centre(const GSkyDir& centre);  
95 - void centre(const double& ra,const double& dec);  
96 - double ra(void) const;  
97 - double dec(void) const;  
98 - void read(const std::string& line);  
99 - std::string write(void) const;  
100 - bool contains(const GSkyDir& dir) const;  
101 - bool contains_local(const GSkyDir& locdir) const;  
102 - bool contains(const GSkyRegion& reg) const;  
103 - bool overlaps(const GSkyRegion& reg) const;  
104 - std::string print(const GChatter& chatter = NORMAL) const;  
105 -  
106 - GSkyDir transform_to_local(const GSkyDir& skydir) const;  
107 - GSkyDir transform_to_global(const GSkyDir& locdir) const;  
108 - GSkyDir get_corner(const int& index) const; 85 + void clear(void);
  86 + GSkyRegionRect* clone(void) const;
  87 + std::string classname(void) const;
  88 + const GSkyDir& centre(void) const;
  89 + void centre(const GSkyDir& centre);
  90 + void centre(const double& ra,const double& dec);
  91 + double ra(void) const;
  92 + double dec(void) const;
  93 + const double& width(void) const;
  94 + void width(const double& width);
  95 + const double& height(void) const;
  96 + void height(const double& height);
  97 + const double& posang(void) const;
  98 + void posang(const double& posang);
  99 + void read(const std::string& line);
  100 + std::string write(void) const;
  101 + bool contains(const GSkyDir& dir) const;
  102 + bool contains_local(const GSkyDir& locdir) const;
  103 + bool contains(const GSkyRegion& reg) const;
  104 + bool overlaps(const GSkyRegion& reg) const;
  105 + GSkyDir transform_to_local(const GSkyDir& skydir) const;
  106 + GSkyDir transform_to_global(const GSkyDir& locdir) const;
  107 + GSkyDir get_corner(const int& index) const;
  108 + std::string print(const GChatter& chatter = NORMAL) const;
109 109
110 protected: 110 protected:
111 // Protected methods 111 // Protected methods
@@ -116,9 +116,9 @@ protected: @@ -116,9 +116,9 @@ protected:
116 116
117 // Protected members 117 // Protected members
118 GSkyDir m_centre; //!< Centre or reference point of the region 118 GSkyDir m_centre; //!< Centre or reference point of the region
119 - double m_halfwidth; //!< Half width of the region [deg]  
120 - double m_halfheight; //!< Half height of the region [deg]  
121 - double m_posang; //!< Position angle, counterclockwise from North [radians] 119 + double m_width; //!< Width of the region (degrees)
  120 + double m_height; //!< Height of the region (degrees)
  121 + double m_posang; //!< Position angle, counterclockwise from North (degrees)
122 }; 122 };
123 123
124 124
@@ -135,144 +135,136 @@ std::string GSkyRegionRect::classname(void) const @@ -135,144 +135,136 @@ std::string GSkyRegionRect::classname(void) const
135 135
136 136
137 /***********************************************************************//** 137 /***********************************************************************//**
138 - * @brief Return region position angle (in radians) 138 + * @brief Return rectangular region centre
139 * 139 *
140 - * @return Region position angle [radians]. 140 + * @return Region centre.
141 * 141 *
142 - * Returns the region position angle in radians. The position angle is  
143 - * counted counterclockwise from North. 142 + * Returns the region centre.
144 ***************************************************************************/ 143 ***************************************************************************/
145 inline 144 inline
146 -double GSkyRegionRect::posang(void) const 145 +const GSkyDir& GSkyRegionRect::centre(void) const
147 { 146 {
148 - // Return  
149 - return (m_posang); 147 + return (m_centre);
150 } 148 }
151 149
152 150
153 /***********************************************************************//** 151 /***********************************************************************//**
154 - * @brief Return region position angle (in degrees) 152 + * @brief Set rectangular region centre
155 * 153 *
156 - * @return Region position angle [degrees]. 154 + * @param[in] dir Region centre.
157 * 155 *
158 - * Returns the region position angle in degrees. The position angle is  
159 - * counted counterclockwise from North. 156 + * Sets the centre of the rectangular region to the specified sky direction.
160 ***************************************************************************/ 157 ***************************************************************************/
161 inline 158 inline
162 -double GSkyRegionRect::posang_deg(void) const 159 +void GSkyRegionRect::centre(const GSkyDir& dir)
163 { 160 {
164 - // Return  
165 - return (m_posang * gammalib::rad2deg); 161 + m_centre = dir;
  162 + return;
166 } 163 }
167 164
168 165
169 /***********************************************************************//** 166 /***********************************************************************//**
170 - * @brief Return region width extension (in degrees) 167 + * @brief Set rectangular region centre Right Ascension and Declincation
171 * 168 *
172 - * @return Region width [deg]. 169 + * @param[in] ra Right Ascension (degrees).
  170 + * @param[in] dec Declination (degrees).
173 * 171 *
174 - * Returns the region width extension in degrees. 172 + * Sets the centre of the rectangular region to the specified Right Ascension
  173 + * and Declination.
175 ***************************************************************************/ 174 ***************************************************************************/
176 inline 175 inline
177 -double GSkyRegionRect::width(void) const 176 +void GSkyRegionRect::centre(const double& ra, const double& dec)
178 { 177 {
179 - double width = 2*m_halfwidth;  
180 - return (width); 178 + m_centre.radec_deg(ra, dec);
  179 + return;
181 } 180 }
182 181
183 182
184 /***********************************************************************//** 183 /***********************************************************************//**
185 - * @brief Return region height extension (in degrees) 184 + * @brief Return rectangular region centre Right Ascension
186 * 185 *
187 - * @return Region height [deg]. 186 + * @return Region centre Right Ascension (degrees).
188 * 187 *
189 - * Returns the region height extension in degrees. 188 + * Returns the region centre Right Ascension in degrees.
190 ***************************************************************************/ 189 ***************************************************************************/
191 inline 190 inline
192 -double GSkyRegionRect::height(void) const 191 +double GSkyRegionRect::ra(void) const
193 { 192 {
194 - double height = 2*m_halfheight;  
195 - return (height); 193 + return (m_centre.ra_deg());
196 } 194 }
197 195
198 196
199 /***********************************************************************//** 197 /***********************************************************************//**
200 - * @brief Return rectangular region centre 198 + * @brief Return rectangular region centre Declination
201 * 199 *
202 - * @return Region centre. 200 + * @return Region centre Declination (degrees).
203 * 201 *
204 - * Returns the region centre. 202 + * Returns the region centre Declination in degrees.
205 ***************************************************************************/ 203 ***************************************************************************/
206 inline 204 inline
207 -const GSkyDir& GSkyRegionRect::centre(void) const 205 +double GSkyRegionRect::dec(void) const
208 { 206 {
209 - return (m_centre); 207 + return (m_centre.dec_deg());
210 } 208 }
211 209
212 210
213 /***********************************************************************//** 211 /***********************************************************************//**
214 - * @brief Set rectangular region centre 212 + * @brief Return region width extension (in degrees)
215 * 213 *
216 - * @param[in] dir Region centre. 214 + * @return Region width (degrees).
217 * 215 *
218 - * Sets the centre of the rectangular region to the specified sky direction. 216 + * Returns the region width extension in degrees.
219 ***************************************************************************/ 217 ***************************************************************************/
220 inline 218 inline
221 -void GSkyRegionRect::centre(const GSkyDir& dir) 219 +const double& GSkyRegionRect::width(void) const
222 { 220 {
223 - // Set centre  
224 - m_centre = dir;  
225 -  
226 - // Return  
227 - return; 221 + return (m_width);
228 } 222 }
229 223
230 224
231 /***********************************************************************//** 225 /***********************************************************************//**
232 - * @brief Set rectangular region centre Right Ascension and Declincation 226 + * @brief Return region height extension (in degrees)
233 * 227 *
234 - * @param[in] ra Right Ascension [deg].  
235 - * @param[in] dec Declination [deg]. 228 + * @return Region height (degrees).
236 * 229 *
237 - * Sets the centre of the rectangular region to the specified Right Ascension  
238 - * and Declination. 230 + * Returns the region height extension in degrees.
239 ***************************************************************************/ 231 ***************************************************************************/
240 inline 232 inline
241 -void GSkyRegionRect::centre(const double& ra, const double& dec) 233 +const double& GSkyRegionRect::height(void) const
242 { 234 {
243 - // Set centre values  
244 - m_centre.radec_deg(ra,dec);  
245 -  
246 - // Return  
247 - return; 235 + return (m_height);
248 } 236 }
249 237
250 238
251 /***********************************************************************//** 239 /***********************************************************************//**
252 - * @brief Return rectangular region centre Right Ascension 240 + * @brief Return region position angle (in degrees)
253 * 241 *
254 - * @return Region centre Right Ascension [deg]. 242 + * @return Region position angle (degrees).
255 * 243 *
256 - * Returns the region centre Right Ascension in degrees. 244 + * Returns the region position angle in degrees. The position angle is
  245 + * counted counterclockwise from North.
257 ***************************************************************************/ 246 ***************************************************************************/
258 inline 247 inline
259 -double GSkyRegionRect::ra(void) const 248 +const double& GSkyRegionRect::posang(void) const
260 { 249 {
261 - return (m_centre.ra_deg()); 250 + return (m_posang);
262 } 251 }
263 252
264 253
265 /***********************************************************************//** 254 /***********************************************************************//**
266 - * @brief Return rectangular region centre Declination 255 + * @brief Set position angle of rectangular region
267 * 256 *
268 - * @return Region centre Declination [deg]. 257 + * @param[in] posang Position angle (degrees).
269 * 258 *
270 - * Returns the region centre Declination in degrees. 259 + * Sets the position angle of the rectangular sky region. The position angle
  260 + * is counted counterclockwise from celestial North and is aligned to the
  261 + * rectangle height.
271 ***************************************************************************/ 262 ***************************************************************************/
272 inline 263 inline
273 -double GSkyRegionRect::dec(void) const 264 +void GSkyRegionRect::posang(const double& posang)
274 { 265 {
275 - return (m_centre.dec_deg()); 266 + m_posang = posang;
  267 + return;
276 } 268 }
277 269
278 #endif /* GSKYREGIONRECT_HPP */ 270 #endif /* GSKYREGIONRECT_HPP */
pyext/GSkyRegionRect.i
@@ -35,48 +35,47 @@ @@ -35,48 +35,47 @@
35 * @brief Interface for the rectangular sky region class 35 * @brief Interface for the rectangular sky region class
36 ***************************************************************************/ 36 ***************************************************************************/
37 class GSkyRegionRect : public GSkyRegion { 37 class GSkyRegionRect : public GSkyRegion {
  38 +
38 public: 39 public:
39 // Constructors and destructors 40 // Constructors and destructors
40 GSkyRegionRect(void); 41 GSkyRegionRect(void);
41 - GSkyRegionRect(const GSkyDir& centre  
42 - ,const double& w, const double& h  
43 - ,const double& posang_deg  
44 - );  
45 - GSkyRegionRect(const double& ra, const double& dec  
46 - ,const double& w, const double& h  
47 - ,const double& posang_deg  
48 - ); 42 + GSkyRegionRect(const GSkyDir& centre,
  43 + const double& width,
  44 + const double& height,
  45 + const double& posang);
  46 + GSkyRegionRect(const double& ra,
  47 + const double& dec,
  48 + const double& width,
  49 + const double& height,
  50 + const double& posang);
49 explicit GSkyRegionRect(const std::string& line); 51 explicit GSkyRegionRect(const std::string& line);
50 GSkyRegionRect(const GSkyRegionRect& region); 52 GSkyRegionRect(const GSkyRegionRect& region);
51 virtual ~GSkyRegionRect(void); 53 virtual ~GSkyRegionRect(void);
52 54
53 // Implemented methods 55 // Implemented methods
54 - void clear(void);  
55 - GSkyRegionRect* clone(void) const;  
56 - std::string classname(void) const;  
57 - double posang(void) const;  
58 - void posang(const double& posang);  
59 - double posang_deg(void) const;  
60 - void posang_deg(const double& posang);  
61 - double width(void) const;  
62 - void width(const double& width);  
63 - double height(void) const;  
64 - void height(const double& height);  
65 - const GSkyDir& centre(void) const;  
66 - void centre(const GSkyDir& centre);  
67 - void centre(const double& ra,const double& dec);  
68 - double ra(void) const;  
69 - double dec(void) const;  
70 - void read(const std::string& line);  
71 - std::string write(void) const;  
72 - bool contains(const GSkyDir& dir) const;  
73 - bool contains_local(const GSkyDir& locdir) const;  
74 - bool contains(const GSkyRegion& reg) const;  
75 - bool overlaps(const GSkyRegion& reg) const;  
76 -  
77 - GSkyDir transform_to_local(const GSkyDir& skydir) const;  
78 - GSkyDir transform_to_global(const GSkyDir& localdir) const;  
79 - GSkyDir get_corner(const int& index) const; 56 + void clear(void);
  57 + GSkyRegionRect* clone(void) const;
  58 + std::string classname(void) const;
  59 + const GSkyDir& centre(void) const;
  60 + void centre(const GSkyDir& centre);
  61 + void centre(const double& ra,const double& dec);
  62 + double ra(void) const;
  63 + double dec(void) const;
  64 + const double& width(void) const;
  65 + void width(const double& width);
  66 + const double& height(void) const;
  67 + void height(const double& height);
  68 + const double& posang(void) const;
  69 + void posang(const double& posang);
  70 + void read(const std::string& line);
  71 + std::string write(void) const;
  72 + bool contains(const GSkyDir& dir) const;
  73 + bool contains_local(const GSkyDir& locdir) const;
  74 + bool contains(const GSkyRegion& reg) const;
  75 + bool overlaps(const GSkyRegion& reg) const;
  76 + GSkyDir transform_to_local(const GSkyDir& skydir) const;
  77 + GSkyDir transform_to_global(const GSkyDir& locdir) const;
  78 + GSkyDir get_corner(const int& index) const;
80 }; 79 };
81 80
82 81
src/sky/GSkyRegionMap.cpp
@@ -657,24 +657,24 @@ void GSkyRegionMap::set_region_circle(const GSkyRegionCircle* circle) @@ -657,24 +657,24 @@ void GSkyRegionMap::set_region_circle(const GSkyRegionCircle* circle)
657 * @param[in] rect Region rectangle 657 * @param[in] rect Region rectangle
658 * 658 *
659 * Sets a region map from a region rectangle. 659 * Sets a region map from a region rectangle.
660 - * A skymap is allocated with a resolution goal of 0.01 degrees (same for both  
661 - * axes).  
662 - * The particular resolution of either axes depends on the w/h of the RoI of the  
663 - * rotated rectangle.  
664 - * The map extent is chosen dynamically to match the RoI of the rotated rectangle.  
665 - * Three sparse pixels are added at either side of the map.  
666 - * The sky map is created in celestial coordinates and TAN projection. 660 + *
  661 + * A skymap is allocated with a resolution goal of 0.01 degrees (same for
  662 + * both axes). The particular resolution of either axes depends on the width
  663 + * over height of the RoI of the rotated rectangle. The map extent is chosen
  664 + * dynamically to match the RoI of the rotated rectangle. Three sparse pixels
  665 + * are added at either side of the map. The sky map is created in celestial
  666 + * coordinates and TAN projection.
667 ***************************************************************************/ 667 ***************************************************************************/
668 void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect) 668 void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect)
669 { 669 {
670 // Define desired resolution (in degrees) 670 // Define desired resolution (in degrees)
671 - const double resolution_goal = 0.01; 671 + const double resolution_goal = 0.01;
672 672
673 // Try to estimate extent of the (rotated) rectangle: 673 // Try to estimate extent of the (rotated) rectangle:
674 // Loop over the rectangle corners to get the extension 674 // Loop over the rectangle corners to get the extension
675 - double dxmax=0;  
676 - double dymax=0;  
677 - for(int icorner=0; icorner<4; ++icorner) { 675 + double dxmax = 0.0;
  676 + double dymax = 0.0;
  677 + for (int icorner = 0; icorner < 4; ++icorner) {
678 678
679 // Get skydir of current corner 679 // Get skydir of current corner
680 GSkyDir corner = rect->get_corner(icorner); 680 GSkyDir corner = rect->get_corner(icorner);
@@ -691,22 +691,19 @@ void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect) @@ -691,22 +691,19 @@ void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect)
691 if (dy > dymax) { 691 if (dy > dymax) {
692 dymax = dy; 692 dymax = dy;
693 } 693 }
694 -  
695 if (dx > dxmax) { 694 if (dx > dxmax) {
696 dxmax = dx; 695 dxmax = dx;
697 } 696 }
698 - } 697 +
  698 + } // endfor: looped over all corners
699 699
700 // Compute width of map RoI in degrees 700 // Compute width of map RoI in degrees
701 - double map_width = 2*dxmax *gammalib::rad2deg;  
702 - double map_height = 2*dymax *gammalib::rad2deg;  
703 - // std::cout<<"Generate map for rectangle:\n"<<(*rect)<<std::endl;  
704 - // std::cout<<"Found map extension: (w,h)=("<<map_width<<","<<map_height<<")\n"; 701 + double map_width = 2.0 * dxmax * gammalib::rad2deg;
  702 + double map_height = 2.0 * dymax * gammalib::rad2deg;
705 703
706 // Compute num of bins in x direction, round 704 // Compute num of bins in x direction, round
707 - int nbins_x = int(map_width / resolution_goal +0.5);  
708 - int nbins_y = int(map_height / resolution_goal +0.5);  
709 - // std::cout<<" nbins: x="<<nbins_x<<", y="<<nbins_y<<std::endl; 705 + int nbins_x = int(map_width / resolution_goal + 0.5);
  706 + int nbins_y = int(map_height / resolution_goal + 0.5);
710 707
711 // Ensure a minimum num of bins 708 // Ensure a minimum num of bins
712 if (nbins_x < 10) { 709 if (nbins_x < 10) {
@@ -719,7 +716,6 @@ void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect) @@ -719,7 +716,6 @@ void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect)
719 // Compute actual resolution using nbins 716 // Compute actual resolution using nbins
720 double resolution_x = map_width / nbins_x; 717 double resolution_x = map_width / nbins_x;
721 double resolution_y = map_height / nbins_y; 718 double resolution_y = map_height / nbins_y;
722 - // std::cout<<" resolution for roi: x="<<resolution_x<<", y="<<resolution_y<<std::endl;  
723 719
724 // Add leakage pixels 720 // Add leakage pixels
725 nbins_x += 6; 721 nbins_x += 6;
@@ -728,22 +724,18 @@ void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect) @@ -728,22 +724,18 @@ void GSkyRegionMap::set_region_rect(const GSkyRegionRect* rect)
728 // Create fine sky map 724 // Create fine sky map
729 GSkyMap map_fine("TAN", "CEL", rect->ra(), rect->dec(), 725 GSkyMap map_fine("TAN", "CEL", rect->ra(), rect->dec(),
730 -resolution_x, resolution_y, 726 -resolution_x, resolution_y,
731 - nbins_x, nbins_y  
732 - ); 727 + nbins_x, nbins_y);
733 728
734 - // Set sky map pixels 729 + // Set sky map pixels that are contained in rectangle to 1
735 for (int ipix = 0; ipix < map_fine.npix(); ++ipix) { 730 for (int ipix = 0; ipix < map_fine.npix(); ++ipix) {
736 -  
737 - // If pixel is contained in rectangle then set map pixel to 1  
738 if (rect->contains(map_fine.inx2dir(ipix))) { 731 if (rect->contains(map_fine.inx2dir(ipix))) {
739 map_fine(ipix) = 1.0; 732 map_fine(ipix) = 1.0;
740 } 733 }
741 -  
742 - } // endfor: looped over sky map pixels 734 + }
743 735
744 // Set sky map as region map 736 // Set sky map as region map
745 this->map(map_fine); 737 this->map(map_fine);
746 738
747 // Return 739 // Return
748 return; 740 return;
749 -}  
750 \ No newline at end of file 741 \ No newline at end of file
  742 +}
src/sky/GSkyRegionRect.cpp
@@ -28,18 +28,19 @@ @@ -28,18 +28,19 @@
28 #ifdef HAVE_CONFIG_H 28 #ifdef HAVE_CONFIG_H
29 #include <config.h> 29 #include <config.h>
30 #endif 30 #endif
  31 +//#include "GMath.hpp"
  32 +#include "GTools.hpp"
31 #include "GSkyRegionCircle.hpp" 33 #include "GSkyRegionCircle.hpp"
32 #include "GSkyRegionRect.hpp" 34 #include "GSkyRegionRect.hpp"
33 #include "GSkyRegionMap.hpp" 35 #include "GSkyRegionMap.hpp"
34 -#include "GTools.hpp"  
35 36
36 /* __ Method name definitions ____________________________________________ */ 37 /* __ Method name definitions ____________________________________________ */
37 -#define G_WIDTH "GSkyRegionRect::width(double&)"  
38 -#define G_HEIGHT "GSkyRegionRect::height(double&)"  
39 -#define G_READ "GSkyRegionRect::read(std::string&)"  
40 -#define G_CONTAINS "GSkyRegionRect::contains(GSkyRegion&)"  
41 -#define G_OVERLAPS "GSkyRegionRect::overlaps(GSkyRegion&)"  
42 -#define G_GET_CORNER "GSkyRegionRect::get_corner(int&)" 38 +#define G_WIDTH "GSkyRegionRect::width(double&)"
  39 +#define G_HEIGHT "GSkyRegionRect::height(double&)"
  40 +#define G_READ "GSkyRegionRect::read(std::string&)"
  41 +#define G_CONTAINS "GSkyRegionRect::contains(GSkyRegion&)"
  42 +#define G_OVERLAPS "GSkyRegionRect::overlaps(GSkyRegion&)"
  43 +#define G_GET_CORNER "GSkyRegionRect::get_corner(int&)"
43 44
44 /* __ Macros _____________________________________________________________ */ 45 /* __ Macros _____________________________________________________________ */
45 46
@@ -70,24 +71,26 @@ GSkyRegionRect::GSkyRegionRect(void) : GSkyRegion() @@ -70,24 +71,26 @@ GSkyRegionRect::GSkyRegionRect(void) : GSkyRegion()
70 71
71 72
72 /***********************************************************************//** 73 /***********************************************************************//**
73 - * @brief Direction constructor 74 + * @brief Sky direction constructor
74 * 75 *
75 - * @param[in] centre Centre sky direction.  
76 - * @param[in] w Region width [deg].  
77 - * @param[in] h Region height [deg]. 76 + * @param[in] centre Centre of rectangle.
  77 + * @param[in] width Region width (degrees).
  78 + * @param[in] height Region height (degrees).
  79 + * @param[in] posang Position angle (degrees).
78 ***************************************************************************/ 80 ***************************************************************************/
79 -GSkyRegionRect::GSkyRegionRect(const GSkyDir& centre, const double& w,  
80 - const double& h, const double& posang_deg) :  
81 - GSkyRegion() 81 +GSkyRegionRect::GSkyRegionRect(const GSkyDir& centre,
  82 + const double& width,
  83 + const double& height,
  84 + const double& posang) : GSkyRegion()
82 { 85 {
83 // Initialise members 86 // Initialise members
84 init_members(); 87 init_members();
85 88
86 // Set members 89 // Set members
87 this->centre(centre); 90 this->centre(centre);
88 - this->width(w);  
89 - this->height(h);  
90 - this->posang_deg(posang_deg); 91 + this->width(width);
  92 + this->height(height);
  93 + this->posang(posang);
91 94
92 // Compute solid angle 95 // Compute solid angle
93 compute_solid_angle(); 96 compute_solid_angle();
@@ -98,26 +101,28 @@ GSkyRegionRect::GSkyRegionRect(const GSkyDir&amp; centre, const double&amp; w, @@ -98,26 +101,28 @@ GSkyRegionRect::GSkyRegionRect(const GSkyDir&amp; centre, const double&amp; w,
98 101
99 102
100 /***********************************************************************//** 103 /***********************************************************************//**
101 - * @brief Direction constructor 104 + * @brief Right Ascension and Declination constructor
102 * 105 *
103 * @param[in] ra Right Ascension of region centre [deg]. 106 * @param[in] ra Right Ascension of region centre [deg].
104 * @param[in] dec Declination of region centre [deg]. 107 * @param[in] dec Declination of region centre [deg].
105 - * @param[in] radius Region radius [deg].  
106 - * @param[in] radius Region radius [deg]. 108 + * @param[in] width Region width (degrees).
  109 + * @param[in] height Region height (degrees).
  110 + * @param[in] posang Position angle (degrees).
107 ***************************************************************************/ 111 ***************************************************************************/
108 -GSkyRegionRect::GSkyRegionRect(const double& ra, const double& dec,  
109 - const double& w, const double& h,  
110 - const double& posang_deg) :  
111 - GSkyRegion() 112 +GSkyRegionRect::GSkyRegionRect(const double& ra,
  113 + const double& dec,
  114 + const double& width,
  115 + const double& height,
  116 + const double& posang) : GSkyRegion()
112 { 117 {
113 // Initialise members 118 // Initialise members
114 init_members(); 119 init_members();
115 120
116 // Set members 121 // Set members
117 this->centre(ra, dec); 122 this->centre(ra, dec);
118 - this->width(w);  
119 - this->height(h);  
120 - this->posang_deg(posang_deg); 123 + this->width(width);
  124 + this->height(height);
  125 + this->posang(posang);
121 126
122 // Compute solid angle 127 // Compute solid angle
123 compute_solid_angle(); 128 compute_solid_angle();
@@ -153,8 +158,7 @@ GSkyRegionRect::GSkyRegionRect(const std::string&amp; line) : GSkyRegion() @@ -153,8 +158,7 @@ GSkyRegionRect::GSkyRegionRect(const std::string&amp; line) : GSkyRegion()
153 * 158 *
154 * @param[in] region Rectangular sky region. 159 * @param[in] region Rectangular sky region.
155 ***************************************************************************/ 160 ***************************************************************************/
156 -GSkyRegionRect::GSkyRegionRect(const GSkyRegionRect& region) :  
157 - GSkyRegion(region) 161 +GSkyRegionRect::GSkyRegionRect(const GSkyRegionRect& region) : GSkyRegion(region)
158 { 162 {
159 // Initialise members 163 // Initialise members
160 init_members(); 164 init_members();
@@ -253,67 +257,29 @@ GSkyRegionRect* GSkyRegionRect::clone(void) const @@ -253,67 +257,29 @@ GSkyRegionRect* GSkyRegionRect::clone(void) const
253 257
254 258
255 /***********************************************************************//** 259 /***********************************************************************//**
256 - * @brief Set position angle of rectangular region  
257 - *  
258 - * @param[in] posang Position angle [radians].  
259 - *  
260 - * Sets the position angle of the rectangular sky region. The position angle  
261 - * is counted counterclockwise from cel. North and is aligned to the rect  
262 - * height.  
263 - ***************************************************************************/  
264 -void GSkyRegionRect::posang(const double& posang)  
265 -{  
266 - // Set the position angle  
267 - m_posang = posang;  
268 -  
269 - // Return  
270 - return;  
271 -}  
272 -  
273 -  
274 -/***********************************************************************//**  
275 - * @brief Set position angle of rectangular region  
276 - *  
277 - * @param[in] posang Position angle [degrees].  
278 - *  
279 - * Sets the position angle of the rectangular sky region. The position angle  
280 - * is counted counterclockwise from cel. North and is aligned to the rect  
281 - * height.  
282 - ***************************************************************************/  
283 -void GSkyRegionRect::posang_deg(const double& posang)  
284 -{  
285 - // Set the position angle  
286 - this->posang(posang * gammalib::deg2rad);  
287 -  
288 - // Return  
289 - return;  
290 -}  
291 -  
292 -  
293 -/***********************************************************************//**  
294 * @brief Set width of rectangular region 260 * @brief Set width of rectangular region
295 * 261 *
296 - * @param[in] width Width [deg]. 262 + * @param[in] width Width (degrees).
297 * 263 *
298 * @exception GException::invalid_argument 264 * @exception GException::invalid_argument
299 * Width value is less than 0. 265 * Width value is less than 0.
300 * 266 *
301 - * Sets the width of the rectangular sky region. Only non-negative radii are  
302 - * allowed. 267 + * Sets the @p width of the rectangular sky region. Only non-negative widths
  268 + * are allowed.
303 ***************************************************************************/ 269 ***************************************************************************/
304 void GSkyRegionRect::width(const double& width) 270 void GSkyRegionRect::width(const double& width)
305 { 271 {
  272 + // Throw an exception if the width is less than zero
306 if (width < 0.0) { 273 if (width < 0.0) {
307 std::string msg = 274 std::string msg =
308 - "A width of "+gammalib::str(width)+" degrees has been"  
309 - " specified for a rectangular sky region.\n"  
310 - "The width of a rectangular sky region can't be less than 0"  
311 - " degrees."; 275 + "A negative width of "+gammalib::str(width)+" degrees has been "
  276 + "specified for a rectangular sky region. Please specify a "
  277 + "non-negative width.";
312 throw GException::invalid_argument(G_WIDTH, msg); 278 throw GException::invalid_argument(G_WIDTH, msg);
313 } 279 }
314 280
315 // Set radius value 281 // Set radius value
316 - m_halfwidth = 0.5*width; 282 + m_width = width;
317 283
318 // Compute the solid angle 284 // Compute the solid angle
319 compute_solid_angle(); 285 compute_solid_angle();
@@ -326,27 +292,29 @@ void GSkyRegionRect::width(const double&amp; width) @@ -326,27 +292,29 @@ void GSkyRegionRect::width(const double&amp; width)
326 /***********************************************************************//** 292 /***********************************************************************//**
327 * @brief Set height of rectangular region 293 * @brief Set height of rectangular region
328 * 294 *
329 - * @param[in] height Height [deg]. 295 + * @param[in] height Height (degrees).
330 * 296 *
331 * @exception GException::invalid_argument 297 * @exception GException::invalid_argument
332 * Height value is less than 0. 298 * Height value is less than 0.
333 * 299 *
334 - * Sets the height of the rectangular sky region. Only non-negative radii are  
335 - * allowed. For zero posang, the height axis is pointing to celestial north. 300 + * Sets the @p height of the rectangular sky region. Only non-negative
  301 + * heights are allowed.
  302 + *
  303 + * Note that for a position angle of zero, the height axis is pointing to
  304 + * celestial north.
336 ***************************************************************************/ 305 ***************************************************************************/
337 void GSkyRegionRect::height(const double& height) 306 void GSkyRegionRect::height(const double& height)
338 { 307 {
339 if (height < 0.0) { 308 if (height < 0.0) {
340 std::string msg = 309 std::string msg =
341 - "A height of "+gammalib::str(height)+" degrees has been"  
342 - " specified for a rectangular sky region.\n"  
343 - "The height of a rectangular sky region can't be less than 0"  
344 - " degrees."; 310 + "A negative height of "+gammalib::str(height)+" degrees has been "
  311 + "specified for a rectangular sky region. Please specify a "
  312 + "non-negative height.";
345 throw GException::invalid_argument(G_HEIGHT, msg); 313 throw GException::invalid_argument(G_HEIGHT, msg);
346 } 314 }
347 315
348 // Set radius value 316 // Set radius value
349 - m_halfheight = 0.5*height; 317 + m_height = height;
350 318
351 // Compute the solid angle 319 // Compute the solid angle
352 compute_solid_angle(); 320 compute_solid_angle();
@@ -377,9 +345,8 @@ void GSkyRegionRect::read(const std::string&amp; line) @@ -377,9 +345,8 @@ void GSkyRegionRect::read(const std::string&amp; line)
377 // Finding the box 345 // Finding the box
378 if (region_def.find("box") == std::string::npos) { 346 if (region_def.find("box") == std::string::npos) {
379 std::string msg = 347 std::string msg =
380 - "Unable to find the key word \"box\" in provided string"  
381 - " \""+line+"\".\n"  
382 - "The \"box\" key word is mandatory."; 348 + "Unable to find the key word \"box\" in provided string "
  349 + "\""+line+"\". The \"box\" key word is mandatory.";
383 throw GException::invalid_value(G_READ, msg); 350 throw GException::invalid_value(G_READ, msg);
384 } 351 }
385 352
@@ -396,29 +363,29 @@ void GSkyRegionRect::read(const std::string&amp; line) @@ -396,29 +363,29 @@ void GSkyRegionRect::read(const std::string&amp; line)
396 std::vector<std::string> values = gammalib::split(regionstring,","); 363 std::vector<std::string> values = gammalib::split(regionstring,",");
397 if (values.size() != 5) { 364 if (values.size() != 5) {
398 std::string msg = 365 std::string msg =
399 - "Invalid number of "+gammalib::str(values.size())+" arguments"  
400 - " after the \"box\" key word in provided string \""+line+"\".\n" 366 + "Invalid number of "+gammalib::str(values.size())+" arguments "
  367 + "after the \"box\" key word in provided string \""+line+"\". "
401 "Exactly 5 arguments are expected."; 368 "Exactly 5 arguments are expected.";
402 throw GException::invalid_value(G_READ, msg); 369 throw GException::invalid_value(G_READ, msg);
403 } 370 }
404 double x = gammalib::todouble(values[0]); 371 double x = gammalib::todouble(values[0]);
405 double y = gammalib::todouble(values[1]); 372 double y = gammalib::todouble(values[1]);
406 - double w = gammalib::todouble(values[2]);  
407 - double h = gammalib::todouble(values[3]); 373 + double width = gammalib::todouble(values[2]);
  374 + double height = gammalib::todouble(values[3]);
408 double posang = gammalib::todouble(values[4]); 375 double posang = gammalib::todouble(values[4]);
409 376
410 // Get radius units 377 // Get radius units
411 if (gammalib::contains(values[2], "'")) { 378 if (gammalib::contains(values[2], "'")) {
412 - w /= 60.0; 379 + width /= 60.0;
413 } 380 }
414 else if (gammalib::contains(values[2], "\"")) { 381 else if (gammalib::contains(values[2], "\"")) {
415 - w /= 3600.0; 382 + width /= 3600.0;
416 } 383 }
417 if (gammalib::contains(values[3], "'")) { 384 if (gammalib::contains(values[3], "'")) {
418 - h /= 60.0; 385 + height /= 60.0;
419 } 386 }
420 else if (gammalib::contains(values[3], "\"")) { 387 else if (gammalib::contains(values[3], "\"")) {
421 - h /= 3600.0; 388 + height /= 3600.0;
422 } 389 }
423 if (gammalib::contains(values[4], "'")) { 390 if (gammalib::contains(values[4], "'")) {
424 posang /= 60.0; 391 posang /= 60.0;
@@ -439,32 +406,31 @@ void GSkyRegionRect::read(const std::string&amp; line) @@ -439,32 +406,31 @@ void GSkyRegionRect::read(const std::string&amp; line)
439 } 406 }
440 else { 407 else {
441 std::string msg = 408 std::string msg =
442 - "Unsupported coordinate system \""+system+"\" in provided string"  
443 - " \""+line+"\".\n"  
444 - "Only the following coordinate systems are supported: "  
445 - "\"fk5\", \"icrs\" and \"galactic\"."; 409 + "Unsupported coordinate system \""+system+"\" in provided string "
  410 + "\""+line+"\". Only the following coordinate systems are "
  411 + "supported: \"fk5\", \"icrs\" and \"galactic\".";
446 throw GException::invalid_value(G_READ, msg); 412 throw GException::invalid_value(G_READ, msg);
447 } 413 }
448 414
449 // Set members 415 // Set members
450 this->centre(centre); 416 this->centre(centre);
451 - this->width(w);  
452 - this->height(h);  
453 - this->posang_deg(posang); 417 + this->width(width);
  418 + this->height(height);
  419 + this->posang(posang);
454 420
455 // Compute solid angle 421 // Compute solid angle
456 compute_solid_angle(); 422 compute_solid_angle();
457 423
458 // Check if there is a given name for the region and set it 424 // Check if there is a given name for the region and set it
459 std::vector<std::string>comments = gammalib::split(comment, " "); 425 std::vector<std::string>comments = gammalib::split(comment, " ");
460 - for (int i = 0; i < comments.size(); i++) { 426 + for (int i = 0; i < comments.size(); ++i) {
461 if (gammalib::contains(comments[i], "text")) { 427 if (gammalib::contains(comments[i], "text")) {
462 std::vector<std::string> attributes = gammalib::split(comments[i], "="); 428 std::vector<std::string> attributes = gammalib::split(comments[i], "=");
463 if (attributes.size() < 2) { 429 if (attributes.size() < 2) {
464 std::string msg = 430 std::string msg =
465 - "Invalid character sequence encountered in provided"  
466 - " string \""+line+"\".\n"  
467 - "An attribute of the type \"text=Name\" is expected."; 431 + "Invalid character sequence encountered in provided "
  432 + "string \""+line+"\". An attribute of the type "
  433 + "\"text=Name\" is expected.";
468 throw GException::invalid_value(G_READ, msg); 434 throw GException::invalid_value(G_READ, msg);
469 } 435 }
470 m_name = attributes[1]; 436 m_name = attributes[1];
@@ -495,11 +461,11 @@ std::string GSkyRegionRect::write(void) const @@ -495,11 +461,11 @@ std::string GSkyRegionRect::write(void) const
495 result.append(","); 461 result.append(",");
496 result.append(gammalib::str(m_centre.dec_deg())); 462 result.append(gammalib::str(m_centre.dec_deg()));
497 result.append(","); 463 result.append(",");
498 - result.append(gammalib::str(2*m_halfwidth)); 464 + result.append(gammalib::str(m_width));
499 result.append(","); 465 result.append(",");
500 - result.append(gammalib::str(2*m_halfheight)); 466 + result.append(gammalib::str(m_height));
501 result.append(","); 467 result.append(",");
502 - result.append(gammalib::str(m_posang*gammalib::rad2deg)); 468 + result.append(gammalib::str(m_posang));
503 result.append(")"); 469 result.append(")");
504 470
505 // Optionally add region name 471 // Optionally add region name
@@ -514,41 +480,6 @@ std::string GSkyRegionRect::write(void) const @@ -514,41 +480,6 @@ std::string GSkyRegionRect::write(void) const
514 480
515 481
516 /***********************************************************************//** 482 /***********************************************************************//**
517 - * @brief Print rectangular region  
518 - *  
519 - * @param[in] chatter Chattiness  
520 - * @return String containing region information.  
521 - ***************************************************************************/  
522 -std::string GSkyRegionRect::print(const GChatter& chatter) const  
523 -{  
524 - // Initialise result string  
525 - std::string result;;  
526 -  
527 - // Continue only if chatter is not silent  
528 - if (chatter != SILENT) {  
529 -  
530 - // Append header  
531 - result.append("=== GSkyRegionRect ===");  
532 -  
533 - // Append sky region information  
534 - result.append("\n"+gammalib::parformat("Right Ascension of centre"));  
535 - result.append(gammalib::str(m_centre.ra_deg())+" deg");  
536 - result.append("\n"+gammalib::parformat("Declination of centre"));  
537 - result.append(gammalib::str(m_centre.dec_deg())+" deg");  
538 - result.append("\n"+gammalib::parformat("Width"));  
539 - result.append(gammalib::str(2*m_halfwidth)+" deg");  
540 - result.append("\n"+gammalib::parformat("Height"));  
541 - result.append(gammalib::str(2*m_halfheight)+" deg");  
542 - result.append("\n"+gammalib::parformat("PA"));  
543 - result.append(gammalib::str(m_posang*gammalib::rad2deg)+" deg");  
544 -  
545 - } // endif: chatter was not silent  
546 -  
547 - // Return result  
548 - return result;  
549 -}  
550 -  
551 -/***********************************************************************//**  
552 * @brief Checks if sky direction lies within region 483 * @brief Checks if sky direction lies within region
553 * 484 *
554 * @param[in] dir Sky direction. 485 * @param[in] dir Sky direction.
@@ -572,7 +503,7 @@ bool GSkyRegionRect::contains(const GSkyDir&amp; dir) const @@ -572,7 +503,7 @@ bool GSkyRegionRect::contains(const GSkyDir&amp; dir) const
572 /***********************************************************************//** 503 /***********************************************************************//**
573 * @brief Checks if local direction lies within region 504 * @brief Checks if local direction lies within region
574 * 505 *
575 - * @param[in] dir Direction in local coordinate system. 506 + * @param[in] locdir Sky direction in local coordinate system.
576 * 507 *
577 * A local direction lies within a region when its distance to the region 508 * A local direction lies within a region when its distance to the region
578 * centre is not larger than the region extension in both axes directions. 509 * centre is not larger than the region extension in both axes directions.
@@ -583,10 +514,10 @@ bool GSkyRegionRect::contains_local(const GSkyDir&amp; locdir) const @@ -583,10 +514,10 @@ bool GSkyRegionRect::contains_local(const GSkyDir&amp; locdir) const
583 bool dir_is_in = false; 514 bool dir_is_in = false;
584 515
585 // Check containment: declination axis 516 // Check containment: declination axis
586 - if ((std::abs(locdir.dec_deg()) - 1.0e-10) <= m_halfheight) { 517 + if ((std::abs(locdir.dec_deg()) - 1.0e-10) <= 0.5 * m_height) {
587 518
588 // Check containment: right ascension axis 519 // Check containment: right ascension axis
589 - if ((std::abs(locdir.ra_deg()) - 1.0e-10) <= m_halfwidth) { 520 + if ((std::abs(locdir.ra_deg()) - 1.0e-10) <= 0.5 * m_width) {
590 521
591 // Sky direction is inside the rectangle 522 // Sky direction is inside the rectangle
592 dir_is_in = true; 523 dir_is_in = true;
@@ -625,10 +556,10 @@ bool GSkyRegionRect::contains(const GSkyRegion&amp; reg) const @@ -625,10 +556,10 @@ bool GSkyRegionRect::contains(const GSkyRegion&amp; reg) const
625 const double circ_rad = regcirc->radius(); 556 const double circ_rad = regcirc->radius();
626 557
627 // Check extension of circle along declination axis 558 // Check extension of circle along declination axis
628 - if ((std::abs(local_centre.dec_deg()) + circ_rad) <= m_halfheight) { 559 + if ((std::abs(local_centre.dec_deg()) + circ_rad) <= 0.5 * m_height) {
629 560
630 // Check extension of circle along right ascension axis 561 // Check extension of circle along right ascension axis
631 - if ((std::abs(local_centre.ra_deg()) + circ_rad) <= m_halfwidth) { 562 + if ((std::abs(local_centre.ra_deg()) + circ_rad) <= 0.5 * m_width) {
632 563
633 // Circle is fully contained in this rectangle 564 // Circle is fully contained in this rectangle
634 is_fully_inside = true; 565 is_fully_inside = true;
@@ -644,7 +575,7 @@ bool GSkyRegionRect::contains(const GSkyRegion&amp; reg) const @@ -644,7 +575,7 @@ bool GSkyRegionRect::contains(const GSkyRegion&amp; reg) const
644 dynamic_cast<const GSkyRegionRect*>(&reg); 575 dynamic_cast<const GSkyRegionRect*>(&reg);
645 576
646 // Loop over the four corners of the rectangle :regrect: 577 // Loop over the four corners of the rectangle :regrect:
647 - for(int icorner=0; icorner<4; ++icorner) { 578 + for (int icorner = 0; icorner < 4; ++icorner) {
648 579
649 // Get skydir of current corner 580 // Get skydir of current corner
650 GSkyDir corner = regrect->get_corner(icorner); 581 GSkyDir corner = regrect->get_corner(icorner);
@@ -654,7 +585,7 @@ bool GSkyRegionRect::contains(const GSkyRegion&amp; reg) const @@ -654,7 +585,7 @@ bool GSkyRegionRect::contains(const GSkyRegion&amp; reg) const
654 break; 585 break;
655 } 586 }
656 // Did we arrive at the last corner? 587 // Did we arrive at the last corner?
657 - else if (icorner==3) { 588 + else if (icorner == 3) {
658 589
659 // As we reached this point, the three prior corners were inside 590 // As we reached this point, the three prior corners were inside
660 // and the last corner now is also inside: 591 // and the last corner now is also inside:
@@ -705,10 +636,10 @@ bool GSkyRegionRect::overlaps(const GSkyRegion&amp; reg) const @@ -705,10 +636,10 @@ bool GSkyRegionRect::overlaps(const GSkyRegion&amp; reg) const
705 const double circ_rad = regcirc->radius(); 636 const double circ_rad = regcirc->radius();
706 637
707 // Check extension of circle along declination axis 638 // Check extension of circle along declination axis
708 - if (std::abs(local_centre.dec_deg()) <= (m_halfheight + circ_rad)) { 639 + if (std::abs(local_centre.dec_deg()) <= (0.5 * m_height + circ_rad)) {
709 640
710 // Check extension of circle along right ascension axis 641 // Check extension of circle along right ascension axis
711 - if (std::abs(local_centre.ra_deg()) <= (m_halfwidth + circ_rad)) { 642 + if (std::abs(local_centre.ra_deg()) <= (0.5 * m_width + circ_rad)) {
712 643
713 // Circle is fully contained in this rectangle 644 // Circle is fully contained in this rectangle
714 is_overlapping = true; 645 is_overlapping = true;
@@ -722,7 +653,7 @@ bool GSkyRegionRect::overlaps(const GSkyRegion&amp; reg) const @@ -722,7 +653,7 @@ bool GSkyRegionRect::overlaps(const GSkyRegion&amp; reg) const
722 const GSkyRegionRect* regrect = 653 const GSkyRegionRect* regrect =
723 dynamic_cast<const GSkyRegionRect*>(&reg); 654 dynamic_cast<const GSkyRegionRect*>(&reg);
724 655
725 - // Dirty cludge: compare vs map 656 + // Dirty kludge: compare vs map
726 GSkyRegionMap regmap = GSkyRegionMap(regrect); 657 GSkyRegionMap regmap = GSkyRegionMap(regrect);
727 is_overlapping = regmap.overlaps(*this); 658 is_overlapping = regmap.overlaps(*this);
728 659
@@ -746,17 +677,17 @@ bool GSkyRegionRect::overlaps(const GSkyRegion&amp; reg) const @@ -746,17 +677,17 @@ bool GSkyRegionRect::overlaps(const GSkyRegion&amp; reg) const
746 * @param[in] skydir Sky direction in global coordinate system. 677 * @param[in] skydir Sky direction in global coordinate system.
747 * @return Sky direction in local cartesian region object coordinates. 678 * @return Sky direction in local cartesian region object coordinates.
748 * 679 *
749 - * Transform the sky direction :skydir: to the local cartesian coordinate system.  
750 - * The origin of the local coordinate system is fixed to the center of the  
751 - * rectangle and aligned in +ra (width) and +dec (height).  
752 - * Please note, that a GSkyDir object is returned, even if the local coordsys 680 + * Transform the sky direction @p skydir to the local cartesian coordinate
  681 + * system. The origin of the local coordinate system is fixed to the center
  682 + * of the rectangle and aligned in +ra (width) and +dec (height). Please
  683 + * note, that a GSkyDir object is returned, even if the local coordsys is
753 * is cartesian. 684 * is cartesian.
754 ***************************************************************************/ 685 ***************************************************************************/
755 GSkyDir GSkyRegionRect::transform_to_local(const GSkyDir& skydir) const 686 GSkyDir GSkyRegionRect::transform_to_local(const GSkyDir& skydir) const
756 { 687 {
757 // Get distance and polar angle relative to rectangle centre 688 // Get distance and polar angle relative to rectangle centre
758 double dist = m_centre.dist(skydir); 689 double dist = m_centre.dist(skydir);
759 - double pa = m_centre.posang(skydir) - m_posang; 690 + double pa = m_centre.posang(skydir) - m_posang * gammalib::deg2rad;
760 691
761 // Compute corresponding x and y coordinate from polar coords 692 // Compute corresponding x and y coordinate from polar coords
762 double x = dist * std::sin(pa); 693 double x = dist * std::sin(pa);
@@ -777,7 +708,7 @@ GSkyDir GSkyRegionRect::transform_to_local(const GSkyDir&amp; skydir) const @@ -777,7 +708,7 @@ GSkyDir GSkyRegionRect::transform_to_local(const GSkyDir&amp; skydir) const
777 * @param[in] locdir Direction in local coordinate system. 708 * @param[in] locdir Direction in local coordinate system.
778 * @return Sky direction in global coordinate system. 709 * @return Sky direction in global coordinate system.
779 * 710 *
780 - * Transform the local direction :locdir: to the global coordinate system. 711 + * Transform the local direction @p locdir to the global coordinate system.
781 * The origin of the local coordinate system is fixed to the center of the 712 * The origin of the local coordinate system is fixed to the center of the
782 * rectangle and aligned in +ra (width) and +dec (height). 713 * rectangle and aligned in +ra (width) and +dec (height).
783 ***************************************************************************/ 714 ***************************************************************************/
@@ -793,11 +724,8 @@ GSkyDir GSkyRegionRect::transform_to_global(const GSkyDir&amp; locdir) const @@ -793,11 +724,8 @@ GSkyDir GSkyRegionRect::transform_to_global(const GSkyDir&amp; locdir) const
793 724
794 // Compute dist and position angle in polar coords 725 // Compute dist and position angle in polar coords
795 double dist = std::sqrt(x*x + y*y); 726 double dist = std::sqrt(x*x + y*y);
796 - double pa = gammalib::pihalf - std::atan2(y, x) + m_posang;  
797 -  
798 - // // Compute distance and position angle for locdir in global coordinates  
799 - // double dist = centre_local.dist(locdir);  
800 - // double pa = centre_local.posang(locdir) + m_posang; 727 + double pa = gammalib::pihalf - std::atan2(y, x) +
  728 + m_posang * gammalib::deg2rad;
801 729
802 // Create output global sky direction 730 // Create output global sky direction
803 GSkyDir transformed(m_centre); 731 GSkyDir transformed(m_centre);
@@ -822,14 +750,14 @@ GSkyDir GSkyRegionRect::transform_to_global(const GSkyDir&amp; locdir) const @@ -822,14 +750,14 @@ GSkyDir GSkyRegionRect::transform_to_global(const GSkyDir&amp; locdir) const
822 GSkyDir GSkyRegionRect::get_corner(const int& index) const 750 GSkyDir GSkyRegionRect::get_corner(const int& index) const
823 { 751 {
824 // Assert index is in [0,3] 752 // Assert index is in [0,3]
825 - if ((index<0) || (index>3)) {  
826 - throw GException::out_of_range(G_GET_CORNER, index, 0, 3); 753 + if ((index < 0) || (index > 3)) {
  754 + throw GException::out_of_range(G_GET_CORNER, "Corner index", index, 3);
827 } 755 }
828 756
829 // Compute the offset to the corners 757 // Compute the offset to the corners
830 // Index counts CCW starting from +RA,+DEC: +R+D, +R-D, -R-D, -R+D 758 // Index counts CCW starting from +RA,+DEC: +R+D, +R-D, -R-D, -R+D
831 - double dx = m_halfwidth * (1 - 2*int(index >= 2));  
832 - double dy = m_halfheight * (1 - 2*int((index==1) || (index==2))); 759 + double dx = 0.5 * m_width * (1 - 2*int(index >= 2));
  760 + double dy = 0.5 * m_height * (1 - 2*int((index==1) || (index==2)));
833 761
834 // Define local corner sky direction 762 // Define local corner sky direction
835 GSkyDir corner; 763 GSkyDir corner;
@@ -843,6 +771,41 @@ GSkyDir GSkyRegionRect::get_corner(const int&amp; index) const @@ -843,6 +771,41 @@ GSkyDir GSkyRegionRect::get_corner(const int&amp; index) const
843 } 771 }
844 772
845 773
  774 +/***********************************************************************//**
  775 + * @brief Print rectangular region
  776 + *
  777 + * @param[in] chatter Chattiness
  778 + * @return String containing region information.
  779 + ***************************************************************************/
  780 +std::string GSkyRegionRect::print(const GChatter& chatter) const
  781 +{
  782 + // Initialise result string
  783 + std::string result;;
  784 +
  785 + // Continue only if chatter is not silent
  786 + if (chatter != SILENT) {
  787 +
  788 + // Append header
  789 + result.append("=== GSkyRegionRect ===");
  790 +
  791 + // Append sky region information
  792 + result.append("\n"+gammalib::parformat("Right Ascension of centre"));
  793 + result.append(gammalib::str(ra())+" deg");
  794 + result.append("\n"+gammalib::parformat("Declination of centre"));
  795 + result.append(gammalib::str(dec())+" deg");
  796 + result.append("\n"+gammalib::parformat("Width"));
  797 + result.append(gammalib::str(width())+" deg");
  798 + result.append("\n"+gammalib::parformat("Height"));
  799 + result.append(gammalib::str(height())+" deg");
  800 + result.append("\n"+gammalib::parformat("PA"));
  801 + result.append(gammalib::str(posang())+" deg");
  802 +
  803 + } // endif: chatter was not silent
  804 +
  805 + // Return result
  806 + return result;
  807 +}
  808 +
846 809
847 /*========================================================================== 810 /*==========================================================================
848 = = 811 = =
@@ -856,11 +819,11 @@ GSkyDir GSkyRegionRect::get_corner(const int&amp; index) const @@ -856,11 +819,11 @@ GSkyDir GSkyRegionRect::get_corner(const int&amp; index) const
856 void GSkyRegionRect::init_members(void) 819 void GSkyRegionRect::init_members(void)
857 { 820 {
858 // Initialise members 821 // Initialise members
859 - m_centre = GSkyDir();  
860 - m_halfwidth = 0.0;  
861 - m_halfheight = 0.0;  
862 - m_posang = 0.0;  
863 m_type = "Rect"; 822 m_type = "Rect";
  823 + m_centre.clear();
  824 + m_width = 0.0;
  825 + m_height = 0.0;
  826 + m_posang = 0.0;
864 827
865 //Return 828 //Return
866 return; 829 return;
@@ -875,10 +838,10 @@ void GSkyRegionRect::init_members(void) @@ -875,10 +838,10 @@ void GSkyRegionRect::init_members(void)
875 void GSkyRegionRect::copy_members(const GSkyRegionRect& region) 838 void GSkyRegionRect::copy_members(const GSkyRegionRect& region)
876 { 839 {
877 // Copy attributes 840 // Copy attributes
878 - m_centre = region.m_centre;  
879 - m_halfwidth = region.m_halfwidth;  
880 - m_halfheight = region.m_halfheight;  
881 - m_posang = region.m_posang; 841 + m_centre = region.m_centre;
  842 + m_width = region.m_width;
  843 + m_height = region.m_height;
  844 + m_posang = region.m_posang;
882 845
883 // Return 846 // Return
884 return; 847 return;
@@ -896,13 +859,12 @@ void GSkyRegionRect::free_members(void) @@ -896,13 +859,12 @@ void GSkyRegionRect::free_members(void)
896 859
897 860
898 /***********************************************************************//** 861 /***********************************************************************//**
899 - * @brief Compute solid angle [sr] 862 + * @brief Compute solid angle (sr)
900 ***************************************************************************/ 863 ***************************************************************************/
901 void GSkyRegionRect::compute_solid_angle(void) 864 void GSkyRegionRect::compute_solid_angle(void)
902 { 865 {
903 // Compute solid angle 866 // Compute solid angle
904 - m_solid = (2*m_halfwidth) * (2*m_halfheight) * \  
905 - (gammalib::deg2rad * gammalib::deg2rad); 867 + m_solid = m_width * m_height * gammalib::deg2rad * gammalib::deg2rad;
906 868
907 // Return 869 // Return
908 return; 870 return;