/*************************************************************************** * GWcs.hpp - Abstract world coordinate system base class * * ----------------------------------------------------------------------- * * copyright (C) 2011-2014 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ /** * @file GWcs.hpp * @brief Abstract world coordinate system base class definition * @author Juergen Knoedlseder */ #ifndef GWCS_HPP #define GWCS_HPP /* __ Includes ___________________________________________________________ */ #include #include #include #include "GSkyProjection.hpp" #include "GLog.hpp" #include "GFitsHDU.hpp" #include "GSkyDir.hpp" #include "GSkyPixel.hpp" /***********************************************************************//** * @class GWcs * * @brief Abstract world coordinate system base class ***************************************************************************/ class GWcs : public GSkyProjection { public: // Constructors and destructors GWcs(void); GWcs(const std::string& coords, const double& crval1, const double& crval2, const double& crpix1, const double& crpix2, const double& cdelt1, const double& cdelt2); explicit GWcs(const GFitsHDU& hdu); GWcs(const GWcs& wcs); virtual ~GWcs(void); // Operators virtual GWcs& operator= (const GWcs& wcs); // Pure virtual base class methods virtual void clear(void) = 0; virtual GWcs* clone(void) const = 0; virtual std::string classname(void) const = 0; virtual std::string code(void) const = 0; virtual std::string name(void) const = 0; virtual std::string print(const GChatter& chatter = NORMAL) const = 0; // Implemented virtual base class methods virtual int size(void) const; virtual void read(const GFitsHDU& hdu); virtual void write(GFitsHDU& hdu) const; virtual double solidangle(const GSkyPixel& pixel) const; virtual GSkyDir pix2dir(const GSkyPixel& pixel) const; virtual GSkyPixel dir2pix(const GSkyDir& dir) const; // Other methods void set(const std::string& coords, const double& crval1, const double& crval2, const double& crpix1, const double& crpix2, const double& cdelt1, const double& cdelt2); double crval(const int& inx) const; double crpix(const int& inx) const; double cdelt(const int& inx) const; private: // Static constants (set in GWcs.cpp) static const int PVN = 32; static const double UNDEFINED; protected: // Protected methods void init_members(void); void copy_members(const GWcs& wcs); void free_members(void); void set_members(const std::string& coords, const double& crval1, const double& crval2, const double& crpix1, const double& crpix2, const double& cdelt1, const double& cdelt2); virtual bool compare(const GSkyProjection& proj) const; bool undefined(const double& value) const { return (value==UNDEFINED); } // Methods adapted from wcslib::wcs.c void wcs_ini(int naxis); void wcs_set(void) const; void wcs_set_ctype(void) const; void wcs_p2s(int ncoord, int nelem, const double* pixcrd, double* imgcrd, double* phi, double* theta, double* world, int* stat) const; void wcs_s2p(int ncoord, int nelem, const double* world, double* phi, double* theta, double* imgcrd, double* pixcrd, int* stat) const; std::string wcs_print(const GChatter& chatter = NORMAL) const; std::string wcs_print_value(const double& value) const; // Methods adapted from wcslib::cel.c void cel_ini(void) const; void cel_set(void) const; void cel_x2s(int nx, int ny, int sxy, int sll, const double* x, const double* y, double* phi, double* theta, double* lng, double* lat, int* stat) const; void cel_s2x(int nlng, int nlat, int sll, int sxy, const double* lng, const double* lat, double* phi, double* theta, double* x, double* y, int* stat) const; // Methods adapted from wcslib::sph.c void sph_x2s(int nphi, int ntheta, int spt, int sll, const double* phi, const double* theta, double* lng, double* lat) const; void sph_s2x(int nlng, int nlat, int sll, int spt, const double* lng, const double* lat, double* phi, double* theta) const; // Methods adapted from wcslib::spc.c void spc_ini(void); // Methods adapted from wcslib::lin.c void lin_ini(int naxis); void lin_set(void) const; void lin_p2x(int ncoord, int nelem, const double* pixcrd, double* imgcrd) const; void lin_x2p(int ncoord, int nelem, const double* imgcrd, double* pixcrd) const; void lin_matinv(const std::vector& mat, std::vector& inv) const; // Methods adapted from wcslib::prj.c void prj_ini(void) const; void prj_off(const double& phi0, const double& theta0) const; virtual void prj_set(void) const = 0; virtual void prj_x2s(int nx, int ny, int sxy, int spt, const double* x, const double* y, double* phi, double* theta, int* stat) const = 0; virtual void prj_s2x(int nphi, int ntheta, int spt, int sxy, const double* phi, const double* theta, double* x, double* y, int* stat) const = 0; // World Coordinate System parameters mutable bool m_wcsset; //!< WCS information is set int m_naxis; //!< Number of axes std::vector m_crval; //!< CRVALia keyvalues for each coord axis std::vector m_cunit; //!< CUNITia keyvalues for each coord axis mutable std::vector m_ctype; //!< CTYPEia keyvalues for each coord axis mutable std::vector m_ctype_c; //!< CTYPEia comments for each coord axis mutable double m_lonpole; //!< LONPOLEa keyvalue mutable double m_latpole; //!< LATPOLEa keyvalue double m_restfrq; //!< RESTFRQa keyvalue double m_restwav; //!< RESTWAVa keyvalue std::string m_radesys; //!< RADESYS keyvalue double m_equinox; //!< EQUINOX keyvalue std::vector m_cd; //!< CDi_ja linear transformation matrix std::vector m_crota; //!< CROTAia keyvalues for each coord axis int m_lng; //!< Longitude axis int m_lat; //!< Latitude axis int m_spec; //!< Spectral axis // Linear transformation parameters mutable bool m_linset; //!< Linear transformation is set mutable bool m_unity; //!< Signals unity PC matrix std::vector m_crpix; //!< CRPIXja keyvalues for each pixel axis std::vector m_pc; //!< PCi_ja linear transformation matrix std::vector m_cdelt; //!< CDELTia keyvalues for each coord axis mutable std::vector m_piximg; //!< Pixel to image transformation matrix mutable std::vector m_imgpix; //!< Image to pixel transformation matrix // Celestial transformation parameters mutable bool m_celset; //!< Celestial transformation is set mutable bool m_offset; //!< Force (x,y) = (0,0) at (phi_0,theta_0) mutable double m_phi0; //!< Native azimuth angle of fiducial point mutable double m_theta0; //!< Native zenith angle of fiducial point mutable double m_ref[4]; //!< Celestial coordinates of fiducial // point and native coordinates of celestial // pole mutable double m_euler[5];//!< Euler angles and functions thereof mutable int m_latpreq; //!< LATPOLEa requirement mutable bool m_isolat; //!< True if |latitude| is preserved // Projection parameters mutable bool m_prjset; //!< Projection is set mutable double m_r0; //!< Radius of the generating sphere mutable double m_pv[PVN]; //!< Projection parameters mutable bool m_bounds; //!< Enable strict bounds checking mutable double m_x0; //!< Fiducial x offset mutable double m_y0; //!< Fiducial y offset mutable std::vector m_w; //!< Intermediate values // Spectral transformation parameters //struct spcprm spc }; /***********************************************************************//** * @brief Return dimension of projection * * @return Dimension of projection. * * Returns the dimension of the projection. ***************************************************************************/ inline int GWcs::size(void) const { return 2; } #endif /* GWCS_HPP */