/***************************************************************************
* GSkymap.hpp - Sky map class *
* ----------------------------------------------------------------------- *
* copyright (C) 2010-2013 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 GSkymap.hpp
* @brief Sky map class definition
* @author Juergen Knoedlseder
*/
#ifndef GSKYMAP_HPP
#define GSKYMAP_HPP
/* __ Includes ___________________________________________________________ */
#include
#include "GBase.hpp"
#include "GSkyDir.hpp"
#include "GSkyPixel.hpp"
#include "GSkyProjection.hpp"
#include "GFits.hpp"
#include "GFitsTable.hpp"
#include "GFitsBinTable.hpp"
#include "GFitsImage.hpp"
#include "GFitsImageDouble.hpp"
#include "GMatrix.hpp"
#include "GVector.hpp"
/***********************************************************************//**
* @class GSkymap
*
* @brief Sky map class
*
* This class implements a sky maps. Sky maps are collections of pixels that
* define a quantity as function of pixel location. Typical quantities are
* gamma-ray intensities, but may also be the number of measured counts.
*
* Sky map pixels may be arranged in a 2-dimensional grid or in a linear
* 1-dimensional sequence. The link between pixel index and sky direction
* on the celestial sphere is established using a projection, implemented
* by the GSkyProjection class. 2-dimensional grids are represented by
* World Coordinate Systems. All World Coordinate Systems derive from GWcs
* and are registered in GWcsRegistry. The Healpix pixelisation, implemented
* by the GHealpix class, is the only 1-dimensional grid that is so far
* available.
*
* Sky map pixels may be accessed by their linear index, by pixel or by
* sky direction. While the index and pixel access return the sky map value
* at the pixel centre, the sky direction access operator performs an
* interpolation to the exact sky direction.
*
* Conversion methods exist to convert between the linear index, the pixel
* and the sky direction:
*
* GSkyPixel pixel = map.inx2pix(index); // Index to pixel
* GSkyDir dir = map.inx2dir(index); // Index to sky direction
* GSkyDir dir = map.pix2dir(pixel); // Pixel to sky direction
* int index = map.pix2inx(pixel); // Pixel to index
* int index = map.dir2inx(dir); // Sky direction to index
* GSkyPixel pixel = map.dir2pix(dir); // Sky direction to pixel
*
***************************************************************************/
class GSkymap : public GBase {
public:
// Constructors and destructors
GSkymap(void);
explicit GSkymap(const std::string& filename);
explicit GSkymap(const std::string& coords,
const int& nside,
const std::string& order,
const int& nmaps = 1);
explicit GSkymap(const std::string& proj,
const std::string& coords,
const double& x,
const double& y,
const double& dx,
const double& dy,
const int& nx,
const int& ny,
const int& nmaps = 1);
GSkymap(const GSkymap& map);
virtual ~GSkymap(void);
// Operators
GSkymap& operator=(const GSkymap& map);
double& operator()(const int& index, const int& map = 0);
const double& operator()(const int& index, const int& map = 0) const;
double& operator()(const GSkyPixel& pixel, const int& map = 0);
const double& operator()(const GSkyPixel& pixel, const int& map = 0) const;
double operator()(const GSkyDir& dir, const int& map = 0) const;
// Methods
void clear(void);
GSkymap* clone(void) const;
const int& npix(void) const;
const int& nx(void) const;
const int& ny(void) const;
const int& nmaps(void) const;
GSkyPixel inx2pix(const int& index) const;
GSkyDir inx2dir(const int& index) const;
GSkyDir pix2dir(const GSkyPixel& pixel) const;
int pix2inx(const GSkyPixel& pixel) const;
int dir2inx(const GSkyDir& dir) const;
GSkyPixel dir2pix(const GSkyDir& dir) const;
double solidangle(const int& index) const;
double solidangle(const GSkyPixel& pixel) const;
bool contains(const GSkyDir& dir) const;
bool contains(const GSkyPixel& pixel) const;
const GSkyProjection* projection(void) const;
void projection(const GSkyProjection& proj);
const double* pixels(void) const;
void load(const std::string& filename);
void save(const std::string& filename, bool clobber = false) const;
void read(const GFitsHDU& hdu);
void write(GFits& file) const;
std::string print(const GChatter& chatter = NORMAL) const;
private:
// Private methods
void init_members(void);
void alloc_pixels(void);
void copy_members(const GSkymap& map);
void free_members(void);
void set_wcs(const std::string& wcs, const std::string& coords,
const double& crval1, const double& crval2,
const double& crpix1, const double& crpix2,
const double& cdelt1, const double& cdelt2,
const GMatrix& cd, const GVector& pv2);
void read_healpix(const GFitsTable& table);
void read_wcs(const GFitsImage& image);
void alloc_wcs(const GFitsImage& image);
GFitsBinTable* create_healpix_hdu(void) const;
GFitsImageDouble* create_wcs_hdu(void) const;
// Private data area
int m_num_pixels; //!< Number of pixels (used for pixel allocation)
int m_num_maps; //!< Number of maps (used for pixel allocation)
int m_num_x; //!< Number of pixels in x direction (only 2D)
int m_num_y; //!< Number of pixels in y direction (only 2D)
GSkyProjection* m_proj; //!< Pointer to sky projection
double* m_pixels; //!< Pointer to skymap pixels
};
/***********************************************************************//**
* @brief Returns number of pixels
*
* @return Number of pixels in one sky map.
*
* Returns the number of pixels in one sky map.
***************************************************************************/
inline
const int& GSkymap::npix(void) const
{
return m_num_pixels;
}
/***********************************************************************//**
* @brief Returns number of pixels in x coordinate
*
* @return Number of pixels in the X direction.
*
* Returns the number of pixels in the X direction. If the sky map is a
* one dimensional array (which is the case for the Healpix projection),
* the method returns 0.
***************************************************************************/
inline
const int& GSkymap::nx(void) const
{
return m_num_x;
}
/***********************************************************************//**
* @brief Returns number of pixels in y coordinate
*
* @return Number of pixels in the Y direction.
*
* Returns the number of pixels in the Y direction. If the sky map is a
* one dimensional array (which is the case for the Healpix projection),
* the method returns 0.
***************************************************************************/
inline
const int& GSkymap::ny(void) const
{
return m_num_y;
}
/***********************************************************************//**
* @brief Returns number of maps
*
* @return Number of maps in the sky map object.
***************************************************************************/
inline
const int& GSkymap::nmaps(void) const
{
return m_num_maps;
}
/***********************************************************************//**
* @brief Returns pointer to sky projection
*
* @return Pointer to sky projection (NULL if no projection is defined).
***************************************************************************/
inline
const GSkyProjection* GSkymap::projection(void) const
{
return m_proj;
}
/***********************************************************************//**
* @brief Returns pointer to pixel data
*
* @return Pointer to pixel data.
***************************************************************************/
inline
const double* GSkymap::pixels(void) const
{
return m_pixels;
}
#endif /* GSKYMAP_HPP */