source: branches/pixelmap-refactor-branch/src/FitsIO/dataIO.cc @ 1441

Last change on this file since 1441 was 528, checked in by MatthewWhiting, 15 years ago

Changing the documentation comments to match the askapsoft style. Also have split ChanMap? and Object3D into separate files.

File size: 5.1 KB
Line 
1// -----------------------------------------------------------------------
2// dataIO.cc: Read the data array from a FITS file into a Cube object.
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#include <iostream>
29#include <string>
30#define WCSLIB_GETWCSTAB // define this so that we don't try and redefine
31                         //  wtbarr (this is a problem when using gcc v.4+
32#include <fitsio.h>
33#include <math.h>
34#include <duchamp/duchamp.hh>
35#include <duchamp/param.hh>
36#include <duchamp/fitsHeader.hh>
37#include <duchamp/Cubes/cubes.hh>
38
39namespace duchamp
40{
41
42  int Cube::getFITSdata(std::string fname)
43  {
44    /// This function retrieves the data array from the FITS file at the
45    ///   location given by the string argument.
46    ///  Only the two spatial axes and the one spectral axis are stored in the
47    ///   data array. These axes are given by the wcsprm variables wcs->lng,
48    ///   wcs->lat and wcs->spec.
49    ///  All other axes are just read by their first pixel, using the
50    ///   fits_read_subsetnull_flt function
51
52    int numAxes, status = 0;  /* MUST initialize status */
53    fitsfile *fptr; 
54
55    // Open the FITS file
56    status = 0;
57    if( fits_open_file(&fptr,fname.c_str(),READONLY,&status) ){
58      fits_report_error(stderr, status);
59      return FAILURE;
60    }
61
62    // Read the size of the FITS file -- number and sizes of the axes
63    status = 0;
64    if(fits_get_img_dim(fptr, &numAxes, &status)){
65      fits_report_error(stderr, status);
66      return FAILURE;
67    }
68
69    long *dimAxes = new long[numAxes];
70    for(int i=0;i<numAxes;i++) dimAxes[i]=1;
71    status = 0;
72    if(fits_get_img_size(fptr, numAxes, dimAxes, &status)){
73      fits_report_error(stderr, status);
74      return FAILURE;
75    }
76
77    // Identify which axes are the "interesting" ones
78    int lng,lat,spc;
79    if(this->head.isWCS() && (this->head.WCS().spec>=0)){
80      lng = this->head.WCS().lng;
81      lat = this->head.WCS().lat;
82      spc = this->head.WCS().spec;
83    }
84    else{
85      lng = 0;
86      lat = 1;
87      spc = 2;
88    }
89   
90    int anynul;
91    int npix = dimAxes[lng];
92    if(numAxes>1) npix *= dimAxes[lat];
93    if((spc>=0)&&(numAxes>spc)) npix *= dimAxes[spc];
94
95    float *pixarray = new float[npix];// the array of pixel values
96    long *inc = new long[numAxes];    // the data-sampling increment
97
98    // define the first and last pixels for each axis.
99    // set both to 1 for the axes we don't want, and to the full
100    //  range for the ones we do.
101    long *fpixel = new long[numAxes];
102    long *lpixel = new long[numAxes];
103    for(int i=0;i<numAxes;i++){
104      inc[i] = fpixel[i] = lpixel[i] = 1;
105    }
106    lpixel[lng] = dimAxes[lng];
107    if(numAxes>1) lpixel[lat] = dimAxes[lat];
108    if((spc>=0)&&(numAxes>spc)) lpixel[spc] = dimAxes[spc];
109
110    int colnum = 0;  // want the first dataset in the FITS file
111
112    // read the relevant subset, defined by the first & last pixel ranges
113    status = 0;
114    if(fits_read_subset_flt(fptr, colnum, numAxes, dimAxes,
115                            fpixel, lpixel, inc,
116                            this->par.getBlankPixVal(), pixarray, &anynul, &status)){
117      duchampError("Cube Reader",
118                   "There was an error reading in the data array:");
119      fits_report_error(stderr, status);
120      return FAILURE;
121    }
122
123    delete [] fpixel;
124    delete [] lpixel;
125    delete [] inc;
126
127    if(anynul==0){   
128      // no blank pixels, so don't bother with any trimming or checking...
129      if(this->par.getFlagTrim()) { 
130        // if user requested fixing, inform them of change.
131        duchampWarning("Cube Reader",
132                       "No blank pixels, so setting flagTrim to false.\n");
133      }
134      this->par.setFlagBlankPix(false);
135      this->par.setFlagTrim(false);
136    }
137
138    this->initialiseCube(dimAxes);
139    this->saveArray(pixarray,npix);
140    delete [] pixarray;
141    delete [] dimAxes;
142
143    // Close the FITS file -- not needed any more in this function.
144    status = 0;
145    fits_close_file(fptr, &status);
146    if (status){
147      duchampWarning("Cube Reader","Error closing file: ");
148      fits_report_error(stderr, status);
149    }
150
151    return SUCCESS;
152
153  }
154
155}
Note: See TracBrowser for help on using the repository browser.