Commit 8bd2a08f112b6a5c1c0f925e3f4677a3fee75897
1 parent
bf647a55
declare sky direction access and distance methods as const (circumvent const-correctness)
Showing
3 changed files
with
111 additions
and
98 deletions
include/GSkyDir.hpp
| ... | ... | @@ -27,6 +27,15 @@ |
| 27 | 27 | * @class GSkyDir |
| 28 | 28 | * |
| 29 | 29 | * @brief GSkyDir class interface defintion |
| 30 | + * | |
| 31 | + * The GSkyDir class implements a coordinate on the sphere. Two coordinate | |
| 32 | + * systems are supported: celestial (or equatorial), defined by Right | |
| 33 | + * Ascension and Declination, and galactic, defined by galactic longitude | |
| 34 | + * and galactic latitude. The class provides automatic conversion between | |
| 35 | + * both systems if required. Coordinates are stored in either of the | |
| 36 | + * systems (in units of radians), and conversion is performed (and stored) | |
| 37 | + * if requested. Coordinates can be given and returned in radians or in | |
| 38 | + * degrees. Note that the epoch for celestial coordinates is fixed to J2000. | |
| 30 | 39 | ***************************************************************************/ |
| 31 | 40 | class GSkyDir { |
| 32 | 41 | |
| ... | ... | @@ -35,9 +44,9 @@ class GSkyDir { |
| 35 | 44 | |
| 36 | 45 | public: |
| 37 | 46 | // Constructors and destructors |
| 38 | - GSkyDir(); | |
| 47 | + GSkyDir(void); | |
| 39 | 48 | GSkyDir(const GSkyDir& dir); |
| 40 | - virtual ~GSkyDir(); | |
| 49 | + virtual ~GSkyDir(void); | |
| 41 | 50 | |
| 42 | 51 | // Operators |
| 43 | 52 | GSkyDir& operator= (const GSkyDir& dir); |
| ... | ... | @@ -47,28 +56,30 @@ public: |
| 47 | 56 | void radec_deg(const double& ra, const double& dec); |
| 48 | 57 | void lb(const double& l, const double& b); |
| 49 | 58 | void lb_deg(const double& l, const double& b); |
| 50 | - double l(void); | |
| 51 | - double l_deg(void); | |
| 52 | - double b(void); | |
| 53 | - double b_deg(void); | |
| 54 | - double ra(void); | |
| 55 | - double ra_deg(void); | |
| 56 | - double dec(void); | |
| 57 | - double dec_deg(void); | |
| 58 | - double dist(GSkyDir& dir); | |
| 59 | - double dist_deg(GSkyDir& dir); | |
| 59 | + double l(void) const; | |
| 60 | + double l_deg(void) const; | |
| 61 | + double b(void) const; | |
| 62 | + double b_deg(void) const; | |
| 63 | + double ra(void) const; | |
| 64 | + double ra_deg(void) const; | |
| 65 | + double dec(void) const; | |
| 66 | + double dec_deg(void) const; | |
| 67 | + double dist(GSkyDir& dir) const; | |
| 68 | + double dist_deg(GSkyDir& dir) const; | |
| 60 | 69 | |
| 61 | 70 | private: |
| 62 | 71 | // Private methods |
| 63 | 72 | void init_members(void); |
| 64 | 73 | void copy_members(const GSkyDir& dir); |
| 65 | 74 | void free_members(void); |
| 66 | - void equ2gal(void); | |
| 67 | - void gal2equ(void); | |
| 68 | - | |
| 75 | + void equ2gal(void) const; | |
| 76 | + void gal2equ(void) const; | |
| 77 | + void euler(const int& type, const double& xin, const double &yin, | |
| 78 | + double* xout, double *yout) const; | |
| 79 | + | |
| 69 | 80 | // Private data area |
| 70 | - int m_has_lb; //!< Has galactic coordinates | |
| 71 | - int m_has_radec; //!< Has equatorial coordinates | |
| 81 | + bool m_has_lb; //!< Has galactic coordinates | |
| 82 | + bool m_has_radec; //!< Has equatorial coordinates | |
| 72 | 83 | double m_l; //!< Galactic longitude in radians |
| 73 | 84 | double m_b; //!< Galactic latitude in radians |
| 74 | 85 | double m_ra; //!< Right Ascension in radians | ... | ... |
pyext/GSkyDir.i
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * GSkyDir.i - Sky direction class SWIG file * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright : (C) 2008 by Jurgen Knodlseder * | |
| 4 | + * copyright (C) 2008-2010 by Jurgen Knodlseder * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software; you can redistribute it and/or modify * |
| ... | ... | @@ -29,23 +29,25 @@ |
| 29 | 29 | class GSkyDir { |
| 30 | 30 | public: |
| 31 | 31 | // Constructors and destructors |
| 32 | - GSkyDir(); | |
| 32 | + GSkyDir(void); | |
| 33 | 33 | GSkyDir(const GSkyDir& dir); |
| 34 | - virtual ~GSkyDir(); | |
| 34 | + virtual ~GSkyDir(void); | |
| 35 | 35 | |
| 36 | 36 | // Methods |
| 37 | 37 | void radec(const double& ra, const double& dec); |
| 38 | 38 | void radec_deg(const double& ra, const double& dec); |
| 39 | 39 | void lb(const double& l, const double& b); |
| 40 | 40 | void lb_deg(const double& l, const double& b); |
| 41 | - double l(void); | |
| 42 | - double l_deg(void); | |
| 43 | - double b(void); | |
| 44 | - double b_deg(void); | |
| 45 | - double ra(void); | |
| 46 | - double ra_deg(void); | |
| 47 | - double dec(void); | |
| 48 | - double dec_deg(void); | |
| 41 | + double l(void) const; | |
| 42 | + double l_deg(void) const; | |
| 43 | + double b(void) const; | |
| 44 | + double b_deg(void) const; | |
| 45 | + double ra(void) const; | |
| 46 | + double ra_deg(void) const; | |
| 47 | + double dec(void) const; | |
| 48 | + double dec_deg(void) const; | |
| 49 | + double dist(GSkyDir& dir) const; | |
| 50 | + double dist_deg(GSkyDir& dir) const; | |
| 49 | 51 | }; |
| 50 | 52 | |
| 51 | 53 | ... | ... |
src/sky/GSkyDir.cpp
| ... | ... | @@ -33,20 +33,18 @@ |
| 33 | 33 | |
| 34 | 34 | /* __ Debug definitions __________________________________________________ */ |
| 35 | 35 | |
| 36 | -/* __ Prototype __________________________________________________________ */ | |
| 37 | -void euler(const int& type, const double& xin, const double &yin, | |
| 38 | - double* xout, double *yout); | |
| 36 | +/* __ Prototypes _________________________________________________________ */ | |
| 39 | 37 | |
| 40 | 38 | /*========================================================================== |
| 41 | 39 | = = |
| 42 | - = GSkyDir constructors/destructors = | |
| 40 | + = Constructors/destructors = | |
| 43 | 41 | = = |
| 44 | 42 | ==========================================================================*/ |
| 45 | 43 | |
| 46 | 44 | /***********************************************************************//** |
| 47 | 45 | * @brief Constructor |
| 48 | 46 | ***************************************************************************/ |
| 49 | -GSkyDir::GSkyDir() | |
| 47 | +GSkyDir::GSkyDir(void) | |
| 50 | 48 | { |
| 51 | 49 | // Initialise class members for clean destruction |
| 52 | 50 | init_members(); |
| ... | ... | @@ -77,7 +75,7 @@ GSkyDir::GSkyDir(const GSkyDir& dir) |
| 77 | 75 | /***********************************************************************//** |
| 78 | 76 | * @brief Destructor |
| 79 | 77 | ***************************************************************************/ |
| 80 | -GSkyDir::~GSkyDir() | |
| 78 | +GSkyDir::~GSkyDir(void) | |
| 81 | 79 | { |
| 82 | 80 | // Free members |
| 83 | 81 | free_members(); |
| ... | ... | @@ -89,7 +87,7 @@ GSkyDir::~GSkyDir() |
| 89 | 87 | |
| 90 | 88 | /*========================================================================== |
| 91 | 89 | = = |
| 92 | - = GSkyDir operators = | |
| 90 | + = Operators = | |
| 93 | 91 | = = |
| 94 | 92 | ==========================================================================*/ |
| 95 | 93 | |
| ... | ... | @@ -121,7 +119,7 @@ GSkyDir& GSkyDir::operator= (const GSkyDir& dir) |
| 121 | 119 | |
| 122 | 120 | /*========================================================================== |
| 123 | 121 | = = |
| 124 | - = GSkyDir public methods = | |
| 122 | + = Public methods = | |
| 125 | 123 | = = |
| 126 | 124 | ==========================================================================*/ |
| 127 | 125 | |
| ... | ... | @@ -134,8 +132,8 @@ GSkyDir& GSkyDir::operator= (const GSkyDir& dir) |
| 134 | 132 | void GSkyDir::radec(const double& ra, const double& dec) |
| 135 | 133 | { |
| 136 | 134 | // Set attributes |
| 137 | - m_has_lb = 0; | |
| 138 | - m_has_radec = 1; | |
| 135 | + m_has_lb = false; | |
| 136 | + m_has_radec = true; | |
| 139 | 137 | |
| 140 | 138 | // Set direction |
| 141 | 139 | m_ra = ra; |
| ... | ... | @@ -155,8 +153,8 @@ void GSkyDir::radec(const double& ra, const double& dec) |
| 155 | 153 | void GSkyDir::radec_deg(const double& ra, const double& dec) |
| 156 | 154 | { |
| 157 | 155 | // Set attributes |
| 158 | - m_has_lb = 0; | |
| 159 | - m_has_radec = 1; | |
| 156 | + m_has_lb = false; | |
| 157 | + m_has_radec = true; | |
| 160 | 158 | |
| 161 | 159 | // Set direction |
| 162 | 160 | m_ra = ra * deg2rad; |
| ... | ... | @@ -176,8 +174,8 @@ void GSkyDir::radec_deg(const double& ra, const double& dec) |
| 176 | 174 | void GSkyDir::lb(const double& l, const double& b) |
| 177 | 175 | { |
| 178 | 176 | // Set attributes |
| 179 | - m_has_lb = 1; | |
| 180 | - m_has_radec = 0; | |
| 177 | + m_has_lb = true; | |
| 178 | + m_has_radec = false; | |
| 181 | 179 | |
| 182 | 180 | // Set direction |
| 183 | 181 | m_l = l; |
| ... | ... | @@ -197,8 +195,8 @@ void GSkyDir::lb(const double& l, const double& b) |
| 197 | 195 | void GSkyDir::lb_deg(const double& l, const double& b) |
| 198 | 196 | { |
| 199 | 197 | // Set attributes |
| 200 | - m_has_lb = 1; | |
| 201 | - m_has_radec = 0; | |
| 198 | + m_has_lb = true; | |
| 199 | + m_has_radec = false; | |
| 202 | 200 | |
| 203 | 201 | // Set direction |
| 204 | 202 | m_l = l * deg2rad; |
| ... | ... | @@ -212,7 +210,7 @@ void GSkyDir::lb_deg(const double& l, const double& b) |
| 212 | 210 | /***********************************************************************//** |
| 213 | 211 | * @brief Returns galactic longitude in radians |
| 214 | 212 | ***************************************************************************/ |
| 215 | -double GSkyDir::l(void) | |
| 213 | +double GSkyDir::l(void) const | |
| 216 | 214 | { |
| 217 | 215 | // If we have no galactic coordinates then get them now |
| 218 | 216 | if (!m_has_lb && m_has_radec) |
| ... | ... | @@ -226,7 +224,7 @@ double GSkyDir::l(void) |
| 226 | 224 | /***********************************************************************//** |
| 227 | 225 | * @brief Returns galactic longitude in degrees |
| 228 | 226 | ***************************************************************************/ |
| 229 | -double GSkyDir::l_deg(void) | |
| 227 | +double GSkyDir::l_deg(void) const | |
| 230 | 228 | { |
| 231 | 229 | // If we have no galactic coordinates then get them now |
| 232 | 230 | if (!m_has_lb && m_has_radec) |
| ... | ... | @@ -240,7 +238,7 @@ double GSkyDir::l_deg(void) |
| 240 | 238 | /***********************************************************************//** |
| 241 | 239 | * @brief Returns galactic latitude in radians |
| 242 | 240 | ***************************************************************************/ |
| 243 | -double GSkyDir::b(void) | |
| 241 | +double GSkyDir::b(void) const | |
| 244 | 242 | { |
| 245 | 243 | // If we have no galactic coordinates then get them now |
| 246 | 244 | if (!m_has_lb && m_has_radec) |
| ... | ... | @@ -254,7 +252,7 @@ double GSkyDir::b(void) |
| 254 | 252 | /***********************************************************************//** |
| 255 | 253 | * @brief Returns galactic latitude in degrees |
| 256 | 254 | ***************************************************************************/ |
| 257 | -double GSkyDir::b_deg(void) | |
| 255 | +double GSkyDir::b_deg(void) const | |
| 258 | 256 | { |
| 259 | 257 | // If we have no galactic coordinates then get them now |
| 260 | 258 | if (!m_has_lb && m_has_radec) |
| ... | ... | @@ -268,7 +266,7 @@ double GSkyDir::b_deg(void) |
| 268 | 266 | /***********************************************************************//** |
| 269 | 267 | * @brief Returns Right Ascension in radians |
| 270 | 268 | ***************************************************************************/ |
| 271 | -double GSkyDir::ra(void) | |
| 269 | +double GSkyDir::ra(void) const | |
| 272 | 270 | { |
| 273 | 271 | // If we have no equatorial coordinates then get them now |
| 274 | 272 | if (!m_has_radec && m_has_lb) |
| ... | ... | @@ -282,7 +280,7 @@ double GSkyDir::ra(void) |
| 282 | 280 | /***********************************************************************//** |
| 283 | 281 | * @brief Returns Right Ascension in degrees |
| 284 | 282 | ***************************************************************************/ |
| 285 | -double GSkyDir::ra_deg(void) | |
| 283 | +double GSkyDir::ra_deg(void) const | |
| 286 | 284 | { |
| 287 | 285 | // If we have no equatorial coordinates then get them now |
| 288 | 286 | if (!m_has_radec && m_has_lb) |
| ... | ... | @@ -296,7 +294,7 @@ double GSkyDir::ra_deg(void) |
| 296 | 294 | /***********************************************************************//** |
| 297 | 295 | * @brief Returns Declination in radians |
| 298 | 296 | ***************************************************************************/ |
| 299 | -double GSkyDir::dec(void) | |
| 297 | +double GSkyDir::dec(void) const | |
| 300 | 298 | { |
| 301 | 299 | // If we have no equatorial coordinates then get them now |
| 302 | 300 | if (!m_has_radec && m_has_lb) |
| ... | ... | @@ -310,7 +308,7 @@ double GSkyDir::dec(void) |
| 310 | 308 | /***********************************************************************//** |
| 311 | 309 | * @brief Returns Declination in degrees |
| 312 | 310 | ***************************************************************************/ |
| 313 | -double GSkyDir::dec_deg(void) | |
| 311 | +double GSkyDir::dec_deg(void) const | |
| 314 | 312 | { |
| 315 | 313 | // If we have no equatorial coordinates then get them now |
| 316 | 314 | if (!m_has_radec && m_has_lb) |
| ... | ... | @@ -326,7 +324,7 @@ double GSkyDir::dec_deg(void) |
| 326 | 324 | * |
| 327 | 325 | * @param[in] dir Sky direction to which distance is to be computed. |
| 328 | 326 | ***************************************************************************/ |
| 329 | -double GSkyDir::dist(GSkyDir& dir) | |
| 327 | +double GSkyDir::dist(GSkyDir& dir) const | |
| 330 | 328 | { |
| 331 | 329 | // Initialise cosine of distance |
| 332 | 330 | double cosdis; |
| ... | ... | @@ -371,7 +369,7 @@ double GSkyDir::dist(GSkyDir& dir) |
| 371 | 369 | * |
| 372 | 370 | * @param[in] dir Sky direction to which distance is to be computed. |
| 373 | 371 | ***************************************************************************/ |
| 374 | -double GSkyDir::dist_deg(GSkyDir& dir) | |
| 372 | +double GSkyDir::dist_deg(GSkyDir& dir) const | |
| 375 | 373 | { |
| 376 | 374 | // Return distance in degrees |
| 377 | 375 | return (dist(dir) * rad2deg); |
| ... | ... | @@ -380,7 +378,7 @@ double GSkyDir::dist_deg(GSkyDir& dir) |
| 380 | 378 | |
| 381 | 379 | /*========================================================================== |
| 382 | 380 | = = |
| 383 | - = GSkyDir private methods = | |
| 381 | + = Private methods = | |
| 384 | 382 | = = |
| 385 | 383 | ==========================================================================*/ |
| 386 | 384 | |
| ... | ... | @@ -390,8 +388,8 @@ double GSkyDir::dist_deg(GSkyDir& dir) |
| 390 | 388 | void GSkyDir::init_members(void) |
| 391 | 389 | { |
| 392 | 390 | // Initialise members |
| 393 | - m_has_lb = 0; | |
| 394 | - m_has_radec = 0; | |
| 391 | + m_has_lb = false; | |
| 392 | + m_has_radec = false; | |
| 395 | 393 | m_l = 0.0; |
| 396 | 394 | m_b = 0.0; |
| 397 | 395 | m_ra = 0.0; |
| ... | ... | @@ -427,10 +425,6 @@ void GSkyDir::copy_members(const GSkyDir& dir) |
| 427 | 425 | ***************************************************************************/ |
| 428 | 426 | void GSkyDir::free_members(void) |
| 429 | 427 | { |
| 430 | - // Free memory | |
| 431 | - | |
| 432 | - // Signal free pointers | |
| 433 | - | |
| 434 | 428 | // Return |
| 435 | 429 | return; |
| 436 | 430 | } |
| ... | ... | @@ -439,10 +433,16 @@ void GSkyDir::free_members(void) |
| 439 | 433 | /***********************************************************************//** |
| 440 | 434 | * @brief Convert equatorial to galactic coordinates |
| 441 | 435 | ***************************************************************************/ |
| 442 | -void GSkyDir::equ2gal(void) | |
| 436 | +void GSkyDir::equ2gal(void) const | |
| 443 | 437 | { |
| 438 | + // Get non-const pointers to data members. This allows to circumvent | |
| 439 | + // the const correctness and allows treating GSkyDir access methods | |
| 440 | + // as const | |
| 441 | + double* l = (double*)&m_l; | |
| 442 | + double* b = (double*)&m_b; | |
| 443 | + | |
| 444 | 444 | // Convert from equatorial to galactic |
| 445 | - euler(0, m_ra, m_dec, &m_l, &m_b); | |
| 445 | + euler(0, m_ra, m_dec, l, b); | |
| 446 | 446 | |
| 447 | 447 | // Return |
| 448 | 448 | return; |
| ... | ... | @@ -452,47 +452,22 @@ void GSkyDir::equ2gal(void) |
| 452 | 452 | /***********************************************************************//** |
| 453 | 453 | * @brief Convert galactic to equatorial coordinates |
| 454 | 454 | ***************************************************************************/ |
| 455 | -void GSkyDir::gal2equ(void) | |
| 455 | +void GSkyDir::gal2equ(void) const | |
| 456 | 456 | { |
| 457 | + // Get non-const pointers to data members. This allows to circumvent | |
| 458 | + // the const correctness and allows treating GSkyDir access methods | |
| 459 | + // as const | |
| 460 | + double* ra = (double*)&m_ra; | |
| 461 | + double* dec = (double*)&m_dec; | |
| 462 | + | |
| 457 | 463 | // Convert from galactic to equatorial |
| 458 | - euler(1, m_l, m_b, &m_ra, &m_dec); | |
| 464 | + euler(1, m_l, m_b, ra, dec); | |
| 459 | 465 | |
| 460 | 466 | // Return |
| 461 | 467 | return; |
| 462 | 468 | } |
| 463 | 469 | |
| 464 | 470 | |
| 465 | -/*========================================================================== | |
| 466 | - = = | |
| 467 | - = GSkyDir friends = | |
| 468 | - = = | |
| 469 | - ==========================================================================*/ | |
| 470 | - | |
| 471 | -/***********************************************************************//** | |
| 472 | - * @brief Output operator | |
| 473 | - * | |
| 474 | - * @param[in] os Output stream | |
| 475 | - * @param[in] column Sky direction to put in output stream | |
| 476 | - ***************************************************************************/ | |
| 477 | -std::ostream& operator<< (std::ostream& os, const GSkyDir& dir) | |
| 478 | -{ | |
| 479 | - // Create coordinate system dependent output | |
| 480 | - if (dir.m_has_lb) | |
| 481 | - os << "(l,b)=(" << dir.m_l*rad2deg << "," << dir.m_b*rad2deg << ")"; | |
| 482 | - else if (dir.m_has_radec) | |
| 483 | - os << "(RA,Dec)=(" << dir.m_ra*rad2deg << "," << dir.m_dec*rad2deg << ")"; | |
| 484 | - | |
| 485 | - // Return output stream | |
| 486 | - return os; | |
| 487 | -} | |
| 488 | - | |
| 489 | - | |
| 490 | -/*========================================================================== | |
| 491 | - = = | |
| 492 | - = Other functions used by GSkyDir = | |
| 493 | - = = | |
| 494 | - ==========================================================================*/ | |
| 495 | - | |
| 496 | 471 | /***********************************************************************//** |
| 497 | 472 | * @brief General coordinate transformation routine for J2000 |
| 498 | 473 | * |
| ... | ... | @@ -502,8 +477,8 @@ std::ostream& operator<< (std::ostream& os, const GSkyDir& dir) |
| 502 | 477 | * @param[out] xout Output longitude in radians. |
| 503 | 478 | * @param[out] yout Output latitude in radians. |
| 504 | 479 | ***************************************************************************/ |
| 505 | -void euler(const int& type, const double& xin, const double &yin, | |
| 506 | - double* xout, double *yout) | |
| 480 | +void GSkyDir::euler(const int& type, const double& xin, const double &yin, | |
| 481 | + double* xout, double *yout) const | |
| 507 | 482 | { |
| 508 | 483 | // Set transformation constants |
| 509 | 484 | const double psi[] = {0.57477043300, 4.9368292465}; |
| ... | ... | @@ -531,3 +506,28 @@ void euler(const int& type, const double& xin, const double &yin, |
| 531 | 506 | // Return |
| 532 | 507 | return; |
| 533 | 508 | } |
| 509 | + | |
| 510 | + | |
| 511 | +/*========================================================================== | |
| 512 | + = = | |
| 513 | + = Friends = | |
| 514 | + = = | |
| 515 | + ==========================================================================*/ | |
| 516 | + | |
| 517 | +/***********************************************************************//** | |
| 518 | + * @brief Output operator | |
| 519 | + * | |
| 520 | + * @param[in] os Output stream | |
| 521 | + * @param[in] column Sky direction to put in output stream | |
| 522 | + ***************************************************************************/ | |
| 523 | +std::ostream& operator<< (std::ostream& os, const GSkyDir& dir) | |
| 524 | +{ | |
| 525 | + // Create coordinate system dependent output | |
| 526 | + if (dir.m_has_lb) | |
| 527 | + os << "(l,b)=(" << dir.m_l*rad2deg << "," << dir.m_b*rad2deg << ")"; | |
| 528 | + else if (dir.m_has_radec) | |
| 529 | + os << "(RA,Dec)=(" << dir.m_ra*rad2deg << "," << dir.m_dec*rad2deg << ")"; | |
| 530 | + | |
| 531 | + // Return output stream | |
| 532 | + return os; | |
| 533 | +} | ... | ... |