source: branches/fitshead-branch/Cubes/saveImage.cc @ 95

Last change on this file since 95 was 95, checked in by Matthew Whiting, 18 years ago

Large collection of changes. Mostly minor fixes, but major additions are:

  • ability to store flagMW in the recon FITS file
  • slight change to way precision is dealt with in output files
  • improvement to VOTable output
  • generalisation of spectral plotting.

Summary of changes:
duchamp.hh -- added keywords/comments for storing flagMW in FITS files
Utils/wcsFunctions.cc -- minor correction
Cubes/plotting.cc -- minor corrections
Cubes/saveImage.cc -- writing flagMW as header keyword
Cubes/readRecon.cc -- able to read in flagMW. Improved formatting of comments
Cubes/detectionIO.cc -- made VOTable output able to cope with Column

definitions. Added new columns.

Cubes/cubes.hh -- added frontends to wcs-pix functions. Changed prototypes

of some plotting functions.

Cubes/plots.hh -- generalised some functionality of the classes
Cubes/drawMomentCutout.cc -- made a class function
Cubes/outputSpectra.cc -- made a Cube class function that plots a

single spectrum.

param.cc -- improved calling of local variables, and the way units are

dealt with.

docs/example_moment_map.pdf -- new version
docs/cover_image.ps -- new version
docs/example_spectrum.pdf -- new version
docs/cover_image.pdf -- new version
docs/example_moment_map.ps -- new version
docs/example_spectrum.ps -- new version
mainDuchamp.cc -- fixed order of some function calls. Other minor corrections.
ATrous/atrous_2d_reconstruct.cc -- improved speed of loop execution
ATrous/atrous_3d_reconstruct.cc -- improved speed of loop execution
Makefile -- addition of columns.cc
Detection/detection.cc -- minor corrections (removal of commented code)
Detection/outputDetection.cc -- minor change to output style and

precision variable name.

Detection/columns.cc -- use new precision variable
Detection/columns.hh -- new precision variables for position and position

width columns

param.hh -- added prototype for makelower(string) function.

File size: 7.6 KB
Line 
1#include <iostream>
2#include <sstream>
3#include <string>
4#include <wcs.h>
5#include <wcshdr.h>
6#include <fitsio.h>
7#include <duchamp.hh>
8#include <Cubes/cubes.hh>
9
10void write_header_info(fitsfile *fptr, Param &par, string nature);
11
12void Cube::saveReconstructedCube()
13{
14  /**
15   *  Cube::saveReconstructedCube()
16   *
17   *   A function to save the reconstructed and/or residual arrays.
18   *   A number of header keywords are written as well, indicating the nature of the
19   *    reconstruction that has been done.
20   *   The file is always written -- if the filename (as calculated based on the
21   *    recon parameters) exists, then it is overwritten.
22   */
23 
24  int newbitpix = FLOAT_IMG;
25
26  float *resid = new float[this->numPixels];
27  for(int i=0;i<this->numPixels;i++) resid[i] = this->array[i] - this->recon[i];
28  float blankval = this->par.getBlankPixVal();
29
30  long *fpixel = new long[this->numDim];
31  for(int i=0;i<this->numDim;i++) fpixel[i]=1;
32  int status = 0;  /* MUST initialize status */
33  fitsfile *fptrOld, *fptrNew;         
34  fits_open_file(&fptrOld,this->par.getImageFile().c_str(),READONLY,&status);
35  if (status) fits_report_error(stderr, status);
36 
37  if(this->par.getFlagOutputRecon()){
38    string fileout = "!" + this->par.getImageFile(); // ! so that it writes over an existing file.
39    fileout = fileout.substr(0,fileout.size()-5); // remove the ".fits" on the end.
40    std::stringstream ss;
41    ss << ".RECON"<<this->par.getAtrousCut()<<".fits";
42    fileout += ss.str();
43
44    status = 0;
45    fits_create_file(&fptrNew,fileout.c_str(),&status);
46    if (status) fits_report_error(stderr, status);
47    status = 0;
48    fits_movabs_hdu(fptrOld, 1, NULL, &status);
49    if (status) fits_report_error(stderr, status);
50    status = 0;
51    fits_copy_header(fptrOld, fptrNew, &status);
52    if (status) fits_report_error(stderr, status);
53    char *comment = new char[80];
54    long dud;
55    status = 0;
56    fits_update_key(fptrNew, TINT, "BITPIX", &newbitpix, "number of bits per data pixel", &status);
57    if (status) fits_report_error(stderr, status);
58    status = 0;
59    float bscale=1., bzero=0.;
60    fits_update_key(fptrNew, TFLOAT, "BSCALE", &bscale, "PHYSICAL = PIXEL*BSCALE + BZERO", &status);
61    fits_update_key(fptrNew, TFLOAT, "BZERO", &bzero, "", &status);
62    fits_set_bscale(fptrNew, 1., 0., &status);
63    if (status) fits_report_error(stderr, status);
64    // Need to correct the dimensions, if we have subsectioned the image...   
65    if(this->par.getFlagSubsection()){
66      fits_read_key(fptrOld, TLONG, "NAXIS1", &dud, comment, &status);
67      fits_update_key(fptrNew, TLONG, "NAXIS1", &(this->axisDim[0]), comment, &status);
68      fits_read_key(fptrOld, TLONG, "NAXIS2", &dud, comment, &status);
69      fits_update_key(fptrNew, TLONG, "NAXIS2", &(this->axisDim[1]), comment, &status);
70      fits_read_key(fptrOld, TLONG, "NAXIS3", &dud, comment, &status);
71      fits_update_key(fptrNew, TLONG, "NAXIS3", &(this->axisDim[2]), comment, &status);
72    }
73
74    write_header_info(fptrNew, this->par, "recon");
75
76    if(this->par.getFlagBlankPix())
77      fits_write_pixnull(fptrNew, TFLOAT, fpixel, this->numPixels, this->recon, &blankval, &status);
78    else  fits_write_pix(fptrNew, TFLOAT, fpixel, this->numPixels, this->recon, &status);
79
80    status = 0;
81    fits_close_file(fptrNew, &status);
82    if (status) fits_report_error(stderr, status);
83  }
84
85  if(this->par.getFlagOutputResid()){
86    string fileout = "!" + this->par.getImageFile(); // ! so that it writes over an existing file.
87    fileout = fileout.substr(0,fileout.size()-5);
88    std::stringstream ss;
89    ss << ".RESID"<<this->par.getAtrousCut()<<".fits";
90    fileout += ss.str();
91
92    status = 0;
93    fits_create_file(&fptrNew,fileout.c_str(),&status);
94    if (status) fits_report_error(stderr, status);
95    status = 0;
96    fits_movabs_hdu(fptrOld, 1, NULL, &status);
97    if (status) fits_report_error(stderr, status);
98    status = 0;
99    fits_copy_header(fptrOld, fptrNew, &status);
100    if (status) fits_report_error(stderr, status);
101
102    status = 0;
103    fits_update_key(fptrNew, TINT, "BITPIX", &newbitpix, "number of bits per data pixel", &status);
104    if (status) fits_report_error(stderr, status);
105    status = 0;
106    float bscale=1., bzero=0.;
107    fits_update_key(fptrNew, TFLOAT, "BSCALE", &bscale, "PHYSICAL = PIXEL*BSCALE + BZERO", &status);
108    fits_update_key(fptrNew, TFLOAT, "BZERO", &bzero, "", &status);
109    fits_set_bscale(fptrNew, 1., 0., &status);
110    if (status) fits_report_error(stderr, status);
111
112    // Need to correct the dimensions, if we have subsectioned the image...
113    char *comment = new char[80];
114    long dud;
115    if(this->pars().getFlagSubsection()){
116      fits_read_key(fptrOld, TLONG, "NAXIS1", &dud, comment, &status);
117      fits_update_key(fptrNew, TLONG, "NAXIS1", &(this->axisDim[0]), comment, &status);
118      fits_read_key(fptrOld, TLONG, "NAXIS2", &dud, comment, &status);
119      fits_update_key(fptrNew, TLONG, "NAXIS2", &(this->axisDim[1]), comment, &status);
120      fits_read_key(fptrOld, TLONG, "NAXIS3", &dud, comment, &status);
121      fits_update_key(fptrNew, TLONG, "NAXIS3", &(this->axisDim[2]), comment, &status);
122    }
123
124    write_header_info(fptrNew, this->par, "resid");
125
126    if(this->par.getFlagBlankPix())
127      fits_write_pixnull(fptrNew, TFLOAT, fpixel, this->numPixels, resid, &blankval, &status);
128    else  fits_write_pix(fptrNew, TFLOAT, fpixel, this->numPixels, resid, &status);
129
130    fits_close_file(fptrNew, &status);
131  }
132
133  delete [] recon;
134  delete [] resid;
135  delete [] fpixel;
136
137}
138
139
140void write_header_info(fitsfile *fptr, Param &par, string nature)
141{
142  /**
143   *  write_header_info(fptr, par, nature)
144   *
145   *   A simple function that writes all the necessary keywords and comments
146   *    to the FITS header pointed to by fptr.
147   *   The keyword names and comments are taken from duchamp.hh
148   *   The parameter "nature" indicates what type of file is being written:
149   *    should be either "recon" or "resid".
150   */
151
152
153  int status = 0;
154  char *comment, *keyword;
155  string explanation = "",ReconResid="";
156
157  fits_write_history(fptr, (char *)header_history1.c_str(), &status);
158                                   
159  fits_write_history(fptr, (char *)header_history2.c_str(), &status);
160
161  fits_write_comment(fptr, (char *)header_comment.c_str(), &status);
162
163  float valf = par.getAtrousCut();
164  fits_write_key(fptr, TFLOAT, (char *)keyword_snrRecon.c_str(), &valf,
165                 (char *)comment_snrRecon.c_str(), &status);
166
167  int vali = par.getMinScale();
168  fits_write_key(fptr, TINT, (char *)keyword_scaleMin.c_str(), &vali,
169                 (char *)comment_scaleMin.c_str(), &status);
170
171  vali = par.getFilterCode();
172  fits_write_key(fptr, TINT, (char *)keyword_filterCode.c_str(), &vali,
173                 (char *)comment_filterCode.c_str(), &status);
174
175  vali = int(par.getFlagMW());
176  fits_write_key(fptr, TINT, (char *)keyword_flagMW.c_str(), &vali,
177                 (char *)comment_flagMW.c_str(), &status);
178  if(par.getFlagMW()){
179    fits_write_comment(fptr, (char *)flagMW_comment.c_str(), &status);
180    vali = par.getMinMW();
181    fits_write_key(fptr, TINT, (char *)keyword_minMW.c_str(), &vali,
182                   (char *)comment_minMW.c_str(), &status);
183    vali = par.getMaxMW();
184    fits_write_key(fptr, TINT, (char *)keyword_maxMW.c_str(), &vali,
185                   (char *)comment_maxMW.c_str(), &status);
186  }
187
188  if(nature == "recon"){
189    explanation = "Duchamp: This is the RECONSTRUCTED cube";
190    ReconResid = "RECON";
191  }
192  else if(nature == "resid"){
193    explanation = "Duchamp: This is the RESIDUAL cube";
194    ReconResid = "RESID";
195  }
196  else std::cerr << "WARNING : write_header_info : explanation not present!\n";
197  fits_write_comment(fptr, (char *)explanation.c_str(), &status);
198  fits_write_key(fptr, TSTRING, (char *)keyword_ReconResid.c_str(),
199                 (char *)ReconResid.c_str(), (char *)comment_ReconResid.c_str(), &status);
200
201}
Note: See TracBrowser for help on using the repository browser.