source: trunk/src/fitsHeader.hh @ 971

Last change on this file since 971 was 971, checked in by MatthewWhiting, 12 years ago

A bunch of changes aimed at streamlining the FITS file access at the start, particularly for the case of large images where we access a subsection (this can be slow to access). We now only open the file once, and keep the fitsfile pointer in the FitsHeader? class. Once the image access is finished the file is closed.

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