source: trunk/src/Cubes/readRecon.cc @ 220

Last change on this file since 220 was 220, checked in by Matthew Whiting, 17 years ago
  • Two new files: plots.cc and feedback.cc. Introduced to separate the declarations and definitions for various classes.
  • Mostly just improving the documentation for use with Doxygen.
File size: 6.9 KB
RevLine 
[71]1#include <iostream>
2#include <sstream>
3#include <string>
4#include <wcs.h>
5#include <wcshdr.h>
[179]6#define WCSLIB_GETWCSTAB // define this so that we don't try to redefine wtbarr
[103]7                         // (this is a problem when using gcc v.4+
[71]8#include <fitsio.h>
9#include <duchamp.hh>
10#include <Cubes/cubes.hh>
11
12int Cube::readReconCube()
13{
[86]14  /**
[220]15   *  A way to read in a previously reconstructed array, corresponding
[139]16   *    to the requested parameters, or in the filename given by reconFile.
17   *   Performs various tests to make sure there are no clashes between
18   *    the requested parameters and those stored in the header of the
19   *    FITS file. Also test to make sure that the size (and subsection,
20   *    if applicable) of the array is the same.
[86]21   */
[71]22
[86]23
[71]24  int status = 0;
25
[188]26  if(!this->par.getFlagReconExists()){
27    duchampWarning("readReconCube",
28                   "reconExists flag is not set. Not reading anything in!\n");
29    return FAILURE;
[71]30  }
[188]31  else if(!this->par.getFlagATrous()){
32    duchampWarning("readReconCube",
33                   "flagATrous is not set. Don't need to read in recon array!\n");
34    return FAILURE;
[71]35  }
[188]36  else {
37
38    // Check to see whether the parameters reconFile and/or residFile are defined
39    bool reconGood = false;
40    int exists;
41    std::stringstream errmsg;
42    if(this->par.getReconFile() != ""){
43      reconGood = true;
44      fits_file_exists(this->par.getReconFile().c_str(),&exists,&status);
45      if(exists<=0){
46        fits_report_error(stderr, status);
47        errmsg<< "Cannot find requested ReconFile. Trying with parameters.\n"
48              << "Bad reconFile was: "<<this->par.getReconFile() << std::endl;
49        duchampWarning("readReconCube", errmsg.str());
50        reconGood = false;
51      }
52    }
53    else{
54      errmsg<< "ReconFile not specified. Working out name from parameters.\n";
55    }
[71]56 
[188]57    if(!reconGood){ // if bad, need to look at parameters
[71]58
[188]59      string reconFile = this->par.outputReconFile();
60      errmsg << "Trying file " << reconFile << std::endl;
61      duchampWarning("readReconCube", errmsg.str() );
62      reconGood = true;
63      fits_file_exists(reconFile.c_str(),&exists,&status);
64      if(exists<=0){
65        fits_report_error(stderr, status);
66        duchampWarning("readReconCube","ReconFile not present.\n");
67        reconGood = false;
68      }
69
70      if(reconGood){
71        // were able to open this new file -- use this, so reset the
72        //  relevant parameter
73        this->par.setReconFile(reconFile);
74      }
75      else { // if STILL bad, give error message and exit.
76        duchampError("readReconCube","Cannot find reconstructed file.\n");
77        return FAILURE;
78      }
79
80    }
81
82    // if we get to here, reconGood is true (ie. file is open);
83
84    status=0;
85    fitsfile *fptr;
86    fits_open_file(&fptr,this->par.getReconFile().c_str(),READONLY,&status);
87    short int maxdim=3;
88    long *fpixel = new long[maxdim];
89    for(int i=0;i<maxdim;i++) fpixel[i]=1;
90    long *dimAxesNew = new long[maxdim];
91    for(int i=0;i<maxdim;i++) dimAxesNew[i]=1;
92    long nelements;
93    int bitpix,numAxesNew,anynul;
94
95    status = 0;
96    fits_get_img_param(fptr, maxdim, &bitpix, &numAxesNew, dimAxesNew, &status);
97    if(status){
[71]98      fits_report_error(stderr, status);
[188]99      return FAILURE;
[71]100    }
101
[188]102    if(numAxesNew != this->numDim){
103      std::stringstream errmsg;
104      errmsg << "Reconstructed cube has a different number of axes to original!"
105             << " (" << numAxesNew << " cf. " << this->numDim << ")\n";
106      duchampError("readReconCube", errmsg.str());
[71]107      return FAILURE;
108    }
109
[188]110    for(int i=0;i<numAxesNew;i++){
111      if(dimAxesNew[i]!=this->axisDim[i]){
112        std::stringstream errmsg;
113        errmsg << "Reconstructed cube has different axis dimensions to original!"
114               << "\nAxis #" << i+1 << " has size " << dimAxesNew[i]
115               << " cf. " << this->axisDim[i] <<" in original.\n";     
116        duchampError("readReconCube", errmsg.str());
117        return FAILURE;
118      }
119    }
[71]120
[188]121    char *comment = new char[80];
[71]122
[188]123    if(this->par.getFlagSubsection()){
124      char *subsection = new char[80];
125      status = 0;
126      fits_read_key(fptr, TSTRING, (char *)keyword_subsection.c_str(),
127                    subsection, comment, &status);
128      if(status){
129        duchampError("readReconCube",
130                     "subsection keyword not present in reconFile.\n");
131        return FAILURE;
132      }
133      else{
134        if(this->par.getSubsection() != subsection){
135          std::stringstream errmsg;
136          errmsg << "subsection keyword in reconFile (" << subsection
137                 << ") does not match that requested ("
138                 << this->par.getSubsection() << ").\n";
139          duchampError("readReconCube", errmsg.str());
140          return FAILURE;
141        }
142      }
143      delete subsection;
144    }
[71]145
[188]146    int scaleMin,filterCode,reconDim;
147    float snrRecon;
148    status = 0;
149    fits_read_key(fptr, TINT, (char *)keyword_reconDim.c_str(),
150                  &reconDim, comment, &status);
151    if(reconDim != this->par.getReconDim()){
[120]152      std::stringstream errmsg;
[188]153      errmsg << "reconDim keyword in reconFile (" << reconDim
154             << ") does not match that requested ("
155             << this->par.getReconDim() << ").\n";
[120]156      duchampError("readReconCube", errmsg.str());
[71]157      return FAILURE;
158    }
[105]159    status = 0;
[188]160    fits_read_key(fptr, TINT, (char *)keyword_filterCode.c_str(),
161                  &filterCode, comment, &status);
162    if(filterCode != this->par.getFilterCode()){
163      std::stringstream errmsg;
164      errmsg << "filterCode keyword in reconFile (" << filterCode
165             << ") does not match that requested ("
166             << this->par.getFilterCode() << ").\n";
167      duchampError("readReconCube", errmsg.str());
[105]168      return FAILURE;
169    }
[188]170    status = 0;
171    fits_read_key(fptr, TFLOAT, (char *)keyword_snrRecon.c_str(),
172                  &snrRecon, comment, &status);
173    if(snrRecon != this->par.getAtrousCut()){
174      std::stringstream errmsg;
175      errmsg << "snrRecon keyword in reconFile (" << snrRecon
176             << ") does not match that requested ("
177             << this->par.getAtrousCut() << ").\n";
178      duchampError("readReconCube", errmsg.str());
179      return FAILURE;
[105]180    }
[188]181    status = 0;
182    fits_read_key(fptr, TINT, (char *)keyword_scaleMin.c_str(),
183                  &scaleMin, comment, &status);
184    if(scaleMin != this->par.getMinScale()){
185      std::stringstream errmsg;
186      errmsg << "scaleMin keyword in reconFile (" << scaleMin
187             << ") does not match that requested ("
188             << this->par.getMinScale() << ").\n";
189      duchampError("readReconCube", errmsg.str());
190      return FAILURE;
191    }
[104]192 
[188]193    //
194    // If we get to here, the reconFile exists and matches the atrous
195    //  parameters the user has requested.
[104]196
[188]197    status = 0;
198    fits_read_pix(fptr, TFLOAT, fpixel, this->numPixels, NULL,
199                  this->recon, &anynul, &status);
[71]200 
[188]201    status = 0;
202    fits_close_file(fptr, &status);
203    if (status){
204      duchampWarning("readReconCube", "Error closing file: ");
205      fits_report_error(stderr, status);
206    }
[71]207
[188]208    // We don't want to write out the recon or resid files at the end
209    this->par.setFlagOutputRecon(false);
210    this->par.setFlagOutputResid(false);
[71]211
[188]212    // The reconstruction is done -- set the appropriate flag
213    this->reconExists = true;
[71]214
[188]215    return SUCCESS;
216  }
[71]217}
Note: See TracBrowser for help on using the repository browser.