source: trunk/src/fitsHeader.hh @ 1441

Last change on this file since 1441 was 1382, checked in by MatthewWhiting, 10 years ago

While in the mood for cleaning up allocation of memory, I've changed the way FitsHeader::getWCS() works. That function now simply returns the wcs pointer, while the old version of it has been renamed getWCScopy(), as it actually makes a copy of the WCS struct and returns a pointer to it.

File size: 9.2 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  class Param;
41
42  ///
43  /// @brief Class to store FITS header information.
44  ///
45  /// @details  Stores information from a FITS header, including WCS information
46  ///    in the form of a wcsprm struct, as well as various keywords.
47  ///
48  class FitsHeader
49  {
50
51  public:
52    FitsHeader();
53    virtual ~FitsHeader();
54    FitsHeader(const FitsHeader& h);
55    FitsHeader& operator= (const FitsHeader& h);
56
57    //--------------------
58    // Functions in param.cc
59    //
60    /// @brief Assign correct WCS parameters. 
61    void    setWCS(struct wcsprm *w);
62
63    /// @brief Return a pointer to the WCS parameters
64    struct wcsprm *getWCS(){return wcs;};
65
66    /// @brief Return the WCS parameters in a WCSLIB wcsprm struct.
67    struct wcsprm *getWCScopy();
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(double xWorld, double yWorld, double zWorld, double &xPix, double &yPix, double &zPix);
75
76    /// @brief Convert pixel coords to world coords for a single point.
77    int     wcsToPix(const double *world, double *pix);
78
79    /// @brief Convert pixel coords to world coords for many points.
80    int     wcsToPix(const double *world, double *pix, const int npts);
81
82    /// @brief Convert world coords to pixel coords for a single point.
83    int     pixToWCS(double xPix, double yPix, double zPix, double &xWorld, double &yWorld, double &zWorld);
84
85    /// @brief Convert world coords to pixel coords for a single point.
86    int     pixToWCS(const double *pix, double *world);
87
88    /// @brief Convert world coords to pixel coords for many points.
89    int     pixToWCS(const double *pix, double *world, const int npts);
90
91    /// @brief Convert a (x,y,z) position to a velocity.
92    double  pixToVel(double &x, double &y, double &z);
93
94    /// @brief Convert a set of  (x,y,z) positions to a set of velocities.
95    double *pixToVel(double &x, double &y, double *zarray, int size);
96
97    /// @brief Convert a spectral coordinate to a velocity coordinate.
98    double  specToVel(const double &z);
99
100    /// @brief Convert a velocity coordinate to a spectral coordinate.
101    double  velToSpec(const float &vel);
102
103    /// @brief Get an IAU-style name for an equatorial or galactic coordinates.
104    std::string  getIAUName(double ra, double dec);
105
106    /// @brief Correct the units for the spectral axis
107    void    fixSpectralUnits(std::string units);
108   
109    /// @brief Define the units for integrated flux
110    void    setIntFluxUnits();
111
112    //--------------------
113    // Functions in FitsIO/headerIO.cc
114    //
115    /// @brief Read all header info.
116    OUTCOME     readHeaderInfo(std::string fname, Param &par);
117    OUTCOME     readHeaderInfo(Param &par);
118    OUTCOME     readHeaderInfo(fitsfile *fptr, Param &par);
119
120    /// @brief Read BUNIT keyword
121    // OUTCOME     readBUNIT(std::string fname);
122    OUTCOME     readBUNIT(fitsfile *fptr);
123
124    /// @brief Read BLANK & related keywords
125    // OUTCOME     readBLANKinfo(std::string fname, Param &par);
126    OUTCOME     readBLANKinfo(fitsfile *fptr, Param &par);
127
128    /// @brief Read beam-related keywords
129    // OUTCOME     readBeamInfo(std::string fname, Param &par);
130    OUTCOME     readBeamInfo(fitsfile *fptr, Param &par);
131 
132    //--------------------
133    // Function in FitsIO/wcsIO.cc
134    //
135    /// @brief Read the WCS information from a file.
136    OUTCOME     defineWCS(std::string fname, Param &par);
137    OUTCOME     defineWCS(Param &par);
138    OUTCOME     defineWCS(fitsfile *fptr, Param &par);
139    OUTCOME     defineWCS(wcsprm *theWCS, int nWCS, size_t *dimAxes, Param &par);
140
141    //--------------------
142    // Basic inline accessor functions
143    //
144    fitsfile *FPTR(){return fptr;};
145    int     openFITS(std::string name);
146    int     closeFITS();
147    /// @brief Is the WCS good enough to be used?
148    bool    isWCS(){return wcsIsGood;};
149    /// @brief Is the spectral axis OK to be used?
150    bool    isSpecOK(){return (wcs->spec >= 0);};
151    bool    canUseThirdAxis(){return ((wcs->spec >= 0)||(wcs->naxis>2));};
152    void    set2D(bool b){flag2D = b;};
153    bool    is2D(){return flag2D;};
154    int     getNWCS(){return nwcs;};
155    void    setNWCS(int i){nwcs=i;};
156    int     getNumAxes(){if(wcs->flag==-1) return 0; else return wcs->naxis;};
157    void    setNumAxes(int i){wcs->naxis=i;};
158    std::string  getSpectralUnits(){return spectralUnits;};
159    void    setSpectralUnits(std::string s){spectralUnits=s;};
160    std::string  getSpectralType(){return spectralType;};
161    void    setSpectralType(std::string s){spectralType=s;};
162    std::string  getSpectralDescription(){return spectralDescription;};
163    void    setSpectralDescription(std::string s){spectralDescription=s;};
164    std::string  getOrigFluxUnits(){return originalFluxUnits;};
165    void    setOrigFluxUnits(std::string s){originalFluxUnits=s;};
166    std::string  getFluxUnits(){return fluxUnits;};
167    void    setFluxUnits(std::string s){fluxUnits=s;};
168    std::string  getIntFluxUnits(){return intFluxUnits;};
169    void    setIntFluxUnits(std::string s){intFluxUnits=s;};
170    DuchampBeam getBeam(){return itsBeam;};
171    DuchampBeam& beam(){DuchampBeam& rbeam=itsBeam; return rbeam;};
172    void    setBeam(DuchampBeam &b){itsBeam=b;};
173    int     getBlankKeyword(){return blankKeyword;};
174    void    setBlankKeyword(int f){blankKeyword=f;};
175    float   getBzeroKeyword(){return bzeroKeyword;};
176    void    setBzeroKeyword(float f){bzeroKeyword=f;};
177    float   getBscaleKeyword(){return bscaleKeyword;};
178    void    setBscaleKeyword(float f){bscaleKeyword=f;};
179    std::string lngtype();
180    std::string lattype();
181
182    /// @brief Return the average pixel scale (eg deg/pix) of the two spatial axes.
183    float   getAvPixScale(){
184      return sqrt( fabs ( (wcs->pc[0]*wcs->cdelt[0])*
185                          (wcs->pc[wcs->naxis+1]*wcs->cdelt[1])));
186    };
187
188    float getShapeScale();
189    std::string getShapeUnits();
190
191    bool    needBeamSize();
192
193  private:
194    fitsfile      *fptr;                ///< A pointer to the FITS file that can be used by the cftisio library.
195    struct wcsprm *wcs;                 ///< The WCS parameters for the cube in a struct from the wcslib library.
196    int            nwcs;                ///< The number of WCS parameters
197    bool           wcsIsGood;           ///< A flag indicating whether there is a valid WCS present.
198    bool           flag2D;              ///< Is the image only a 2D one (leaving out redundant dimensions of size 1)?
199    std::string    spectralUnits;       ///< The units of the spectral dimension
200    std::string    spectralType;        ///< The spectral type - first 4 letters of the WCS ctype code. Used for the results output.
201    std::string    spectralDescription; ///< The description of the spectral dimension (Frequency, Velocity, ...)
202    std::string    originalFluxUnits;   ///< The units of pixel flux in the original image
203    std::string    fluxUnits;           ///< The units of pixel flux as used (either from image or from parameter set)
204    std::string    intFluxUnits;        ///< The units of integrated flux (from header)
205    DuchampBeam    itsBeam;             ///< The beam information
206    int            blankKeyword;        ///< The FITS header keyword BLANK.
207    float          bzeroKeyword;        ///< The FITS header keyword BZERO.
208    float          bscaleKeyword;       ///< The FITS header keyword BSCALE.
209    double         scale;               ///< scale parameter for converting spectral coords
210    double         offset;              ///< offset parameter for converting spectral coords
211    double         power;               ///< power parameter for converting spectral coords
212  };
213
214}
215
216#endif // FITSHEADER_H
Note: See TracBrowser for help on using the repository browser.