source: trunk/src/FitsIO/dataIO.cc @ 518

Last change on this file since 518 was 508, checked in by MatthewWhiting, 16 years ago

Move the par.setOffsets call from getFITSdata to defineWCS, and fix up the allocation of arrays in getMetadata.

File size: 5.9 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    /**
45     * This function retrieves the data array from the FITS file at the
46     *   location given by the string argument.
47     *  Only the two spatial axes and the one spectral axis are stored in the
48     *   data array. These axes are given by the wcsprm variables wcs->lng,
49     *   wcs->lat and wcs->spec.
50     *  All other axes are just read by their first pixel, using the
51     *   fits_read_subsetnull_flt function
52     */
53
54    int numAxes, status = 0;  /* MUST initialize status */
55    fitsfile *fptr; 
56
57    // Open the FITS file
58    status = 0;
59    if( fits_open_file(&fptr,fname.c_str(),READONLY,&status) ){
60      fits_report_error(stderr, status);
61      return FAILURE;
62    }
63
64    // Read the size of the FITS file -- number and sizes of the axes
65    status = 0;
66    if(fits_get_img_dim(fptr, &numAxes, &status)){
67      fits_report_error(stderr, status);
68      return FAILURE;
69    }
70
71    long *dimAxes = new long[numAxes];
72    for(int i=0;i<numAxes;i++) dimAxes[i]=1;
73    status = 0;
74    if(fits_get_img_size(fptr, numAxes, dimAxes, &status)){
75      fits_report_error(stderr, status);
76      return FAILURE;
77    }
78
79    // Identify which axes are the "interesting" ones
80    int lng,lat,spc;
81    if(this->head.isWCS() && (this->head.WCS().spec>=0)){
82      lng = this->head.WCS().lng;
83      lat = this->head.WCS().lat;
84      spc = this->head.WCS().spec;
85    }
86    else{
87      lng = 0;
88      lat = 1;
89      spc = 2;
90    }
91   
92    int anynul;
93    int npix = dimAxes[lng];
94    if(numAxes>1) npix *= dimAxes[lat];
95    if((spc>=0)&&(numAxes>spc)) npix *= dimAxes[spc];
96
97    float *pixarray = new float[npix];// the array of pixel values
98//     char *nullarray = new char[npix]; // the array of null pixels
99    long *inc = new long[numAxes];    // the data-sampling increment
100
101    // define the first and last pixels for each axis.
102    // set both to 1 for the axes we don't want, and to the full
103    //  range for the ones we do.
104    long *fpixel = new long[numAxes];
105    long *lpixel = new long[numAxes];
106    for(int i=0;i<numAxes;i++){
107      inc[i] = fpixel[i] = lpixel[i] = 1;
108    }
109    lpixel[lng] = dimAxes[lng];
110    if(numAxes>1) lpixel[lat] = dimAxes[lat];
111    if((spc>=0)&&(numAxes>spc)) lpixel[spc] = dimAxes[spc];
112
113    int colnum = 0;  // want the first dataset in the FITS file
114
115    // read the relevant subset, defined by the first & last pixel ranges
116    status = 0;
117 //    if(fits_read_subsetnull_flt(fptr, colnum, numAxes, dimAxes,
118//                              fpixel, lpixel, inc,
119//                              pixarray, nullarray, &anynul, &status)){
120    float blank=this->par.getBlankPixVal();
121    if(fits_read_subset_flt(fptr, colnum, numAxes, dimAxes,
122                            fpixel, lpixel, inc,
123                            this->par.getBlankPixVal(), pixarray, &anynul, &status)){
124      duchampError("Cube Reader",
125                   "There was an error reading in the data array:");
126      fits_report_error(stderr, status);
127      return FAILURE;
128    }
129
130    delete [] fpixel;
131    delete [] lpixel;
132    delete [] inc;
133
134    if(anynul==0){   
135      // no blank pixels, so don't bother with any trimming or checking...
136      if(this->par.getFlagTrim()) { 
137        // if user requested fixing, inform them of change.
138        duchampWarning("Cube Reader",
139                       "No blank pixels, so setting flagTrim to false.\n");
140      }
141      this->par.setFlagBlankPix(false);
142      this->par.setFlagTrim(false);
143    }
144
145    this->initialiseCube(dimAxes);
146    this->saveArray(pixarray,npix);
147    delete [] pixarray;
148    delete [] dimAxes;
149
150    //-------------------------------------------------------------
151    // Once the array is saved, change the value of the blank pixels
152    // from 0 (as they are set by fits_read_subsetnull_flt) to the
153    // correct blank value as determined by the above code.
154//     if(anynul){
155//       int ct=0;
156//       for(int i=0; i<npix;i++) if(nullarray[i]) ct++;
157     
158//       for(int i=0; i<npix;i++){
159//      if(nullarray[i]) this->array[i] = this->par.getBlankPixVal(); 
160//       }
161//     }
162
163//     delete [] nullarray;
164    // Close the FITS file -- not needed any more in this function.
165    status = 0;
166    fits_close_file(fptr, &status);
167    if (status){
168      duchampWarning("Cube Reader","Error closing file: ");
169      fits_report_error(stderr, status);
170    }
171
172    return SUCCESS;
173
174  }
175
176}
Note: See TracBrowser for help on using the repository browser.