source: trunk/src/fitsHeader.hh @ 789

Last change on this file since 789 was 788, checked in by MatthewWhiting, 13 years ago

First part of dealing with #110. Have defined a Beam & DuchampBeam? class and use these to hold the beam information. FitsHeader? holds the one that we work with, and copies it to Param for use with outputs. Parameters will be taken into account if no header information is present. Still need to add code to deal with the case of neither being present (the beam being EMPTY) and how that affects the integrated flux calculations.

File size: 8.6 KB
Line 
1// -----------------------------------------------------------------------
2// fitsHeader.hh: Information about the FITS file's header.
3// -----------------------------------------------------------------------
4// Copyright (C) 2006, Matthew Whiting, ATNF
5//
6// This program is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2 of the License, or (at your
9// option) any later version.
10//
11// Duchamp is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14// for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with Duchamp; if not, write to the Free Software Foundation,
18// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
19//
20// Correspondence concerning Duchamp may be directed to:
21//    Internet email: Matthew.Whiting [at] atnf.csiro.au
22//    Postal address: Dr. Matthew Whiting
23//                    Australia Telescope National Facility, CSIRO
24//                    PO Box 76
25//                    Epping NSW 1710
26//                    AUSTRALIA
27// -----------------------------------------------------------------------
28#ifndef FITSHEADER_H
29#define FITSHEADER_H
30
31#include <string>
32#include <wcslib/wcs.h>
33#include <math.h>
34#include <duchamp/duchamp.hh>
35#include <duchamp/FitsIO/DuchampBeam.hh>
36
37namespace duchamp
38{
39
40  /// @brief Calculation to return area of a beam given FWHM values
41  float getBeamArea(float fwhmMaj, float fwhmMin);
42
43  class Param;
44
45  ///
46  /// @brief Class to store FITS header information.
47  ///
48  /// @details  Stores information from a FITS header, including WCS information
49  ///    in the form of a wcsprm struct, as well as various keywords.
50  ///
51  class FitsHeader
52  {
53
54  public:
55    FitsHeader();
56    virtual ~FitsHeader();
57    FitsHeader(const FitsHeader& h);
58    FitsHeader& operator= (const FitsHeader& h);
59
60    //--------------------
61    // Functions in param.cc
62    //
63    /// @brief Assign correct WCS parameters. 
64    void    setWCS(struct wcsprm *w);
65
66    /// @brief Return the WCS parameters in a WCSLIB wcsprm struct.
67    struct wcsprm *getWCS();
68
69    /// @brief Provides a reference to the WCS parameters
70    struct wcsprm& WCS(){ struct wcsprm &rwcs = *wcs; return rwcs; };
71
72    // front ends to WCS functions
73    /// @brief Convert pixel coords to world coords for a single point.
74    int     wcsToPix(const double *world, double *pix);
75
76    /// @brief Convert pixel coords to world coords for many points.
77    int     wcsToPix(const double *world, double *pix, const int npts);
78
79    /// @brief Convert world coords to pixel coords for a single point.
80    int     pixToWCS(const double *pix, double *world);
81
82    /// @brief Convert world coords to pixel coords for many points.
83    int     pixToWCS(const double *pix, double *world, const int npts);
84
85    /// @brief Convert a (x,y,z) position to a velocity.
86    double  pixToVel(double &x, double &y, double &z);
87
88    /// @brief Convert a set of  (x,y,z) positions to a set of velocities.
89    double *pixToVel(double &x, double &y, double *zarray, int size);
90
91    /// @brief Convert a spectral coordinate to a velocity coordinate.
92    double  specToVel(const double &z);
93
94    /// @brief Convert a velocity coordinate to a spectral coordinate.
95    double  velToSpec(const float &vel);
96
97    /// @brief Get an IAU-style name for an equatorial or galactic coordinates.
98    std::string  getIAUName(double ra, double dec);
99
100    /// @brief Correct the units for the spectral axis
101    void    fixUnits(Param &par);
102   
103    /// @brief Define the units for integrated flux
104    void    setIntFluxUnits();
105
106    //--------------------
107    // Functions in FitsIO/headerIO.cc
108    //
109    /// @brief Read all header info.
110    OUTCOME     readHeaderInfo(std::string fname, Param &par);
111
112    /// @brief Read BUNIT keyword
113    OUTCOME     readBUNIT(std::string fname);
114
115    /// @brief Read BLANK & related keywords
116    OUTCOME     readBLANKinfo(std::string fname, Param &par);
117
118    /// @brief Read beam-related keywords
119    OUTCOME     readBeamInfo(std::string fname, Param &par);
120 
121    //--------------------
122    // Function in FitsIO/wcsIO.cc
123    //
124    /// @brief Read the WCS information from a file.
125    OUTCOME     defineWCS(std::string fname, Param &par);
126
127    //--------------------
128    // Basic inline accessor functions
129    //
130    /// @brief Is the WCS good enough to be used?
131    bool    isWCS(){return wcsIsGood;};
132    /// @brief Is the spectral axis OK to be used?
133    bool    isSpecOK(){return (wcs->spec >= 0);};
134    bool    canUseThirdAxis(){return ((wcs->spec >= 0)||(wcs->naxis>2));};
135    void    set2D(bool b){flag2D = b;};
136    bool    is2D(){return flag2D;};
137    int     getNWCS(){return nwcs;};
138    void    setNWCS(int i){nwcs=i;};
139    int     getNumAxes(){if(wcs->flag==-1) return 0; else return wcs->naxis;};
140    void    setNumAxes(int i){wcs->naxis=i;};
141    std::string  getSpectralUnits(){return spectralUnits;};
142    void    setSpectralUnits(std::string s){spectralUnits=s;};
143    std::string  getSpectralDescription(){return spectralDescription;};
144    void    setSpectralDescription(std::string s){spectralDescription=s;};
145    std::string  getOrigFluxUnits(){return originalFluxUnits;};
146    void    setOrigFluxUnits(std::string s){originalFluxUnits=s;};
147    std::string  getFluxUnits(){return fluxUnits;};
148    void    setFluxUnits(std::string s){fluxUnits=s;};
149    std::string  getIntFluxUnits(){return intFluxUnits;};
150    void    setIntFluxUnits(std::string s){intFluxUnits=s;};
151    float   getBeamSize(){return beamSize;};
152    void    setBeamSize(float f){beamSize=f;};
153    float   getBmajKeyword(){return bmajKeyword;};
154    void    setBmajKeyword(float f){bmajKeyword=f;};
155    float   getBminKeyword(){return bminKeyword;};
156    void    setBminKeyword(float f){bminKeyword=f;};
157    float   getBpaKeyword(){return bpaKeyword;};
158    void    setBpaKeyword(float f){bpaKeyword=f;};
159    DuchampBeam getBeam(){return itsBeam;};
160    DuchampBeam& beam(){DuchampBeam& rbeam=itsBeam; return rbeam;};
161    void    setBeam(DuchampBeam &b){itsBeam=b;};
162    int     getBlankKeyword(){return blankKeyword;};
163    void    setBlankKeyword(int f){blankKeyword=f;};
164    float   getBzeroKeyword(){return bzeroKeyword;};
165    void    setBzeroKeyword(float f){bzeroKeyword=f;};
166    float   getBscaleKeyword(){return bscaleKeyword;};
167    void    setBscaleKeyword(float f){bscaleKeyword=f;};
168
169    /// @brief Return the average pixel scale (eg arcmin/pix) of the two spatial axes.
170    float   getAvPixScale(){
171      return sqrt( fabs ( (wcs->pc[0]*wcs->cdelt[0])*
172                          (wcs->pc[wcs->naxis+1]*wcs->cdelt[1])));
173    };
174
175    bool    needBeamSize();
176
177  private:
178    struct wcsprm *wcs;                 ///< The WCS parameters for the cube in a struct from the wcslib library.
179    int            nwcs;                ///< The number of WCS parameters
180    bool           wcsIsGood;           ///< A flag indicating whether there is a valid WCS present.
181    int            naxis;               ///< How many axes are in the header?
182    bool           flag2D;              ///< Is the image only a 2D one (leaving out redundant dimensions of size 1)?
183    std::string    spectralUnits;       ///< The units of the spectral dimension
184    std::string    spectralDescription; ///< The description of the spectral dimension (Frequency, Velocity, ...)
185    std::string    originalFluxUnits;   ///< The units of pixel flux in the original image
186    std::string    fluxUnits;           ///< The units of pixel flux as used (either from image or from parameter set)
187    std::string    intFluxUnits;        ///< The units of integrated flux (from header)
188    float          beamSize;            ///< The calculated beam size in pixels.
189    float          bmajKeyword;         ///< The FITS header keyword BMAJ.
190    float          bminKeyword;         ///< The FITS header keyword BMIN.
191    float          bpaKeyword;          ///< The FITS header keyword BPA.
192    DuchampBeam    itsBeam;             ///< The beam information
193    int            blankKeyword;        ///< The FITS header keyword BLANK.
194    float          bzeroKeyword;        ///< The FITS header keyword BZERO.
195    float          bscaleKeyword;       ///< The FITS header keyword BSCALE.
196    double         scale;               ///< scale parameter for converting spectral coords
197    double         offset;              ///< offset parameter for converting spectral coords
198    double         power;               ///< power parameter for converting spectral coords
199  };
200
201}
202
203#endif // FITSHEADER_H
Note: See TracBrowser for help on using the repository browser.