source: trunk/src/FitsIO/subsection.cc @ 828

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

Had problems if the

File size: 6.6 KB
RevLine 
[301]1// -----------------------------------------------------------------------
2// subsection.cc: Make sure subsections are valid for a particular
3//                FITS file.
4// -----------------------------------------------------------------------
5// Copyright (C) 2006, Matthew Whiting, ATNF
6//
7// This program is free software; you can redistribute it and/or modify it
8// under the terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2 of the License, or (at your
10// option) any later version.
11//
12// Duchamp is distributed in the hope that it will be useful, but WITHOUT
13// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15// for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with Duchamp; if not, write to the Free Software Foundation,
19// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
20//
21// Correspondence concerning Duchamp may be directed to:
22//    Internet email: Matthew.Whiting [at] atnf.csiro.au
23//    Postal address: Dr. Matthew Whiting
24//                    Australia Telescope National Facility, CSIRO
25//                    PO Box 76
26//                    Epping NSW 1710
27//                    AUSTRALIA
28// -----------------------------------------------------------------------
[164]29#include <iostream>
30#include <sstream>
31#include <string>
[258]32#include <vector>
[164]33#include <math.h>
[394]34#include <wcslib/wcs.h>
[164]35#define WCSLIB_GETWCSTAB // define this so that we don't try and redefine
36                         //  wtbarr (this is a problem when using gcc v.4+
37#include <fitsio.h>
[393]38#include <duchamp/param.hh>
39#include <duchamp/duchamp.hh>
40#include <duchamp/Utils/Section.hh>
[164]41
[378]42namespace duchamp
[164]43{
44
[378]45  void Param::setOffsets(struct wcsprm *wcs)
46  {
[528]47    /// If there is a subsection being used, set the offset values
48    /// according to the correct dimensions given by the WCS struct. 
49    /// If not, set the offsets to zero.
50    /// \param wcs The WCSLIB wcsprm struct that defines which axis is which.
51
[378]52    if(this->flagSubsection){ // if so, then the offsets array is defined.
[495]53      int specAxis = wcs->spec;
54      if(specAxis<0) specAxis=2;
55      if(specAxis>=wcs->naxis) specAxis = wcs->naxis-1;
[378]56      this->xSubOffset = this->pixelSec.getStart(wcs->lng);
57      this->ySubOffset = this->pixelSec.getStart(wcs->lat);
[495]58      this->zSubOffset = this->pixelSec.getStart(specAxis);
[378]59    }
60    else{// else they should be 0
61      this->xSubOffset = this->ySubOffset = this->zSubOffset = 0;
62    }
[309]63  }
64
[378]65  void Param::setOffsets(struct wcsprm &wcs)
66  {
[528]67    /// If there is a subsection being used, set the offset values
68    /// according to the correct dimensions given by the WCS struct. 
69    /// If not, set the offsets to zero.
70    /// \param wcs The WCSLIB wcsprm struct that defines which axis is which.
71   
[378]72    if(this->flagSubsection){ // if so, then the offsets array is defined.
[495]73      int specAxis = wcs.spec;
74      if(specAxis<0) specAxis=2;
75      if(specAxis>=wcs.naxis) specAxis = wcs.naxis-1;
[378]76      this->xSubOffset = this->pixelSec.getStart(wcs.lng);
77      this->ySubOffset = this->pixelSec.getStart(wcs.lat);
[495]78      this->zSubOffset = this->pixelSec.getStart(specAxis);
[378]79    }
80    else{// else they should be 0
81      this->xSubOffset = this->ySubOffset = this->zSubOffset = 0;
82    }
[168]83  }
[164]84
[698]85  OUTCOME Param::verifySubsection()
[378]86  {
[528]87    /// Checks that the subsection strings (the pixel and stats
88    /// subsections) are in the appropriate format, with the correct
89    /// number of entries (one for each axis).
90    ///
91    /// This reads the dimensional information from the FITS file, and
92    /// uses this with the Section::parse() function to make sure each
93    /// section is OK.
94    ///
95    /// \return SUCCESS/FAILURE depending on outcome of the
96    /// Section::parse() calls. Also FAILURE if something goes wrong with
97    /// the FITS access.
[289]98
[378]99    if(!this->flagSubsection && !this->flagStatSec){
100      // if we get here, we are using neither subsection
101      return SUCCESS;
[289]102    }
[378]103    else{
104      // otherwise, at least one of the subsections is being used, and
105      // so we need to check them
[289]106
[378]107      // First open the requested FITS file and check its existence and
108      //  number of axes.
109      int numAxes,status = 0;  /* MUST initialize status */
110      fitsfile *fptr;         
111
112      // Make sure the FITS file exists
113      int exists;
114      fits_file_exists(this->imageFile.c_str(),&exists,&status);
115      if(exists<=0){
116        fits_report_error(stderr, status);
117        duchampWarning("Cube Reader", "Requested image does not exist!\n");
118        return FAILURE;
119      }
120      // Open the FITS file
121      if( fits_open_file(&fptr,this->imageFile.c_str(),READONLY,&status) ){
122        fits_report_error(stderr, status);
123        return FAILURE;
124      }
125      // Read the size information -- number of axes and their sizes
126      status = 0;
127      if(fits_get_img_dim(fptr, &numAxes, &status)){
128        fits_report_error(stderr, status);
129        return FAILURE;
130      }
131      long *dimAxes = new long[numAxes];
132      for(int i=0;i<numAxes;i++) dimAxes[i]=1;
133      status = 0;
134      if(fits_get_img_size(fptr, numAxes, dimAxes, &status)){
135        fits_report_error(stderr, status);
136        return FAILURE;
137      }
138      // Close the FITS file.
139      status = 0;
140      fits_close_file(fptr, &status);
141      if (status){
142        duchampWarning("Cube Reader","Error closing file: ");
143        fits_report_error(stderr, status);
144      }
145
146      ///////////////////
147      // Now parse the subsection and make sure all that works.
[258]148 
[378]149      std::vector<long> dim(numAxes);
150      for(int i=0;i<numAxes;i++) dim[i] = dimAxes[i];
151      delete [] dimAxes;
[289]152
[818]153      return this->parseSubsections(dim);
154
[378]155    }
156
[289]157  }
158
[822]159  OUTCOME Param::parseSubsections(long *dim, int size)
160  {
161    std::vector<long> vecDim(size);
162    for(int i=0;i<size;i++) vecDim[i] = dim[i];
163    return this->parseSubsections(vecDim);
164  }
[818]165
[822]166  OUTCOME Param::parseSubsections(std::vector<int> &dim)
167  {
168    std::vector<long> vecDim(dim.size());
169    for(size_t i=0;i<dim.size();i++) vecDim[i] = long(dim[i]);
170    return this->parseSubsections(vecDim);
171  }
172
[818]173  OUTCOME Param::parseSubsections(std::vector<long> &dim)
174  {
175
[827]176    if(this->pixelSec.parse(dim)==FAILURE) return FAILURE;
[828]177    this->pixelSec = this->pixelSec.intersect(dim);
[818]178   
179    if(this->flagStatSec){
180      if(this->statSec.parse(dim)==FAILURE)  return FAILURE;
181      this->statSec = this->statSec.intersect(this->pixelSec);
[827]182      if(!this->statSec.isValid()){
183        duchampError("parseSubsections","StatSec does not intersect with pixel subsection\n");
184        return FAILURE;
185      }
[818]186      if(this->statSec.parse(dim)==FAILURE)  return FAILURE;
187    }
188   
189    return SUCCESS;
190
191  }
192
[164]193}
Note: See TracBrowser for help on using the repository browser.