source: trunk/src/param.hh @ 265

Last change on this file since 265 was 265, checked in by Matthew Whiting, 17 years ago
  • Enabled output for centroid and peak pixel locations (centroid is proper name for centre-of-mass):
    • New parameter: pixelCentre to determine preferred one for output. Needed similar parameter in the Detection class.
    • Detection::getXCentre() etc now return value based on this parameter. Have new function getXAverage() etc that accesses the average value from the Object3D.
    • Rejigged output functions so there is a difference between screen and file outputs -- screen doesn't have all the different pixel centres, but the file does.
    • Had to change the columns setup in the process.
  • Improved output for merging process.
  • Updated documentation.
File size: 22.1 KB
Line 
1#ifndef PARAM_H
2#define PARAM_H
3
4#include <iostream>
5#include <string>
6#include <vector>
7#include <math.h>
8#include <wcs.h>
9#include <wcshdr.h>
10#include <Utils/utils.hh>
11#include <Utils/Section.hh>
12#include <ATrous/filter.hh>
13
14class FitsHeader; // foreshadow this so that Param knows it exists
15
16/**
17 * Class to store general parameters.
18 *
19 * This is a general repository for parameters that are used by all
20 * functions. This is how the user interacts with the program, as
21 * parameters are read in from disk files through functions in this
22 * class.
23 */
24
25class Param
26{
27public:
28  Param();
29  virtual ~Param(){if(sizeOffsets>0) delete [] offsets;};
30  Param(const Param& p);
31  Param& operator= (const Param& p);
32  //-----------------
33  // Functions in param.cc
34  //
35  /** Read in parameters from a disk file. */
36  int    readParams(std::string paramfile);
37
38  /** Copy certain necessary FITS header parameters from a FitsHeader
39      object */
40  void   copyHeaderInfo(FitsHeader &head);
41
42  /** Determine filename in which to save the Hanning-smoothed
43      array. */
44  std::string outputSmoothFile();
45
46  /** Determine filename in which to save the reconstructed array. */
47  std::string outputReconFile();
48
49  /** Determine filename in which to save the residual array from the
50      atrous reconstruction. */
51  std::string outputResidFile();
52
53  /** Print the parameter set in a readable fashion. */
54  friend std::ostream& operator<< ( std::ostream& theStream, Param& par);
55  friend class Image;
56  //------------------
57  // Functions in FitsIO/subsection.cc
58  //
59  /** Make sure the subsection string is OK, and read the axis
60      subsections. */
61  int    verifySubsection();
62
63  /** Set the correct offset values for each axis */
64  void   setOffsets(struct wcsprm *wcs);
65
66  //--------------------
67  // These are inline functions.
68  //
69  /** Is a pixel value a BLANK?
70   *  Tests whether the value passed as the argument is BLANK or not.
71   *   If flagBlankPix is false, return false.
72   *   Otherwise, compare to the relevant FITS keywords, using integer
73   *   comparison.
74   */
75  bool   isBlank(float &value){
76    return this->flagBlankPix &&
77      (this->blankKeyword == int((value-this->bzeroKeyword)/this->bscaleKeyword));
78  };
79
80  /** Is a given channel flagged as being in the Milky Way?*/           
81  bool   isInMW(int z){return ( flagMW && (z>=minMW) && (z<=maxMW) );};
82
83
84  /** Is a given pixel position OK for use with stats calculations? */
85  bool   isStatOK(int x, int y, int z){
86    int xval=x,yval=y,zval=z;
87    if(flagSubsection){
88      xval += pixelSec.getStart(0);
89      yval += pixelSec.getStart(1);
90      zval += pixelSec.getStart(2);
91    }
92    return !flagStatSec || statSec.isInside(xval,yval,zval);
93  };
94
95
96  //--------------------
97  // Basic inline accessor functions
98  //
99  std::string getImageFile(){return imageFile;};
100  void   setImageFile(std::string fname){imageFile = fname;};
101  std::string getFullImageFile(){
102    if(flagSubsection) return imageFile+pixelSec.getSection();
103    else return imageFile;
104  };
105  bool   getFlagSubsection(){return flagSubsection;};
106  void   setFlagSubsection(bool flag){flagSubsection=flag;};
107  std::string getSubsection(){return pixelSec.getSection();};
108  void   setSubsection(std::string range){pixelSec.setSection(range);};
109  bool   getFlagReconExists(){return flagReconExists;};
110  void   setFlagReconExists(bool flag){flagReconExists=flag;};
111  std::string getReconFile(){return reconFile;};
112  void   setReconFile(std::string file){reconFile = file;};
113  bool   getFlagSmoothExists(){return flagSmoothExists;};
114  void   setFlagSmoothExists(bool flag){flagSmoothExists=flag;};
115  std::string getSmoothFile(){return smoothFile;};
116  void   setSmoothFile(std::string file){smoothFile = file;};
117  //
118  bool   getFlagLog(){return flagLog;};
119  void   setFlagLog(bool flag){flagLog=flag;};
120  std::string getLogFile(){return logFile;};
121  void   setLogFile(std::string fname){logFile = fname;};
122  std::string getOutFile(){return outFile;};
123  void   setOutFile(std::string fname){outFile = fname;};
124  std::string getSpectraFile(){return spectraFile;};
125  void   setSpectraFile(std::string fname){spectraFile = fname;};
126  bool   getFlagOutputSmooth(){return flagOutputSmooth;};
127  void   setFlagOutputSmooth(bool flag){flagOutputSmooth=flag;};
128  bool   getFlagOutputRecon(){return flagOutputRecon;};
129  void   setFlagOutputRecon(bool flag){flagOutputRecon=flag;};
130  bool   getFlagOutputResid(){return flagOutputResid;};
131  void   setFlagOutputResid(bool flag){flagOutputResid=flag;};
132  bool   getFlagVOT(){return flagVOT;};
133  void   setFlagVOT(bool flag){flagVOT=flag;};
134  std::string getVOTFile(){return votFile;};
135  void   setVOTFile(std::string fname){votFile = fname;};
136  bool   getFlagKarma(){return flagKarma;};
137  void   setFlagKarma(bool flag){flagKarma=flag;};
138  std::string getKarmaFile(){return karmaFile;};
139  void   setKarmaFile(std::string fname){karmaFile = fname;};
140  bool   getFlagMaps(){return flagMaps;};
141  void   setFlagMaps(bool flag){flagMaps=flag;};
142  std::string getDetectionMap(){return detectionMap;};
143  void   setDetectionMap(std::string fname){detectionMap = fname;};
144  std::string getMomentMap(){return momentMap;};
145  void   setMomentMap(std::string fname){momentMap = fname;};
146  bool   getFlagXOutput(){return flagXOutput;};
147  void   setFlagXOutput(bool b){flagXOutput=b;};
148  //
149  bool   getFlagNegative(){return flagNegative;};
150  void   setFlagNegative(bool flag){flagNegative=flag;};
151  bool   getFlagBlankPix(){return flagBlankPix;};
152  void   setFlagBlankPix(bool flag){flagBlankPix=flag;};
153  float  getBlankPixVal(){return blankPixValue;};
154  void   setBlankPixVal(float v){blankPixValue=v;};
155  int    getBlankKeyword(){return blankKeyword;};
156  void   setBlankKeyword(int v){blankKeyword=v;};
157  float  getBscaleKeyword(){return bscaleKeyword;};
158  void   setBscaleKeyword(float v){bscaleKeyword=v;};
159  float  getBzeroKeyword(){return bzeroKeyword;};
160  void   setBzeroKeyword(float v){bzeroKeyword=v;};
161  bool   getFlagUsingBlank(){return flagUsingBlank;};
162  void   setFlagUsingBlank(bool b){flagUsingBlank=b;};
163  bool   getFlagMW(){return flagMW;};
164  bool   setFlagMW(bool flag){flagMW=flag;};
165  int    getMaxMW(){return maxMW;};
166  void   setMaxMW(int m){maxMW=m;};
167  int    getMinMW(){return minMW;};
168  void   setMinMW(int m){minMW=m;};
169  void   setBeamSize(float s){numPixBeam = s;};
170  float  getBeamSize(){return numPixBeam;};
171  bool   getFlagUsingBeam(){return flagUsingBeam;};
172  void   setFlagUsingBeam(bool b){flagUsingBeam=b;};
173  //
174  bool   getFlagCubeTrimmed(){return flagTrimmed;};
175  void   setFlagCubeTrimmed(bool flag){flagTrimmed = flag;};
176  long   getBorderLeft(){return borderLeft;};
177  void   setBorderLeft(long b){borderLeft = b;};
178  long   getBorderRight(){return borderRight;};
179  void   setBorderRight(long b){borderRight = b;};
180  long   getBorderBottom(){return borderBottom;};
181  void   setBorderBottom(long b){borderBottom = b;};
182  long   getBorderTop(){return borderTop;};
183  void   setBorderTop(long b){borderTop = b;};
184  //
185  long   getXOffset(){return xSubOffset;};
186  void   setXOffset(long o){xSubOffset = o;};
187  long   getYOffset(){return ySubOffset;};
188  void   setYOffset(long o){ySubOffset = o;};
189  long   getZOffset(){return zSubOffset;};
190  void   setZOffset(long o){zSubOffset = o;};
191  //
192  int    getMinPix(){return minPix;};
193  void   setMinPix(int m){minPix=m;};
194  //     
195  bool   getFlagGrowth(){return flagGrowth;};
196  void   setFlagGrowth(bool flag){flagGrowth=flag;};
197  float  getGrowthCut(){return growthCut;};
198  void   setGrowthCut(float c){growthCut=c;};
199  //     
200  bool   getFlagFDR(){return flagFDR;};
201  void   setFlagFDR(bool flag){flagFDR=flag;};
202  float  getAlpha(){return alphaFDR;};
203  void   setAlpha(float a){alphaFDR=a;};
204  //
205  bool   getFlagBaseline(){return flagBaseline;};
206  void   setFlagBaseline(bool flag){flagBaseline = flag;};
207  //
208  bool   getFlagStatSec(){return flagStatSec;};
209  void   setFlagStatSec(bool flag){flagStatSec=flag;};
210  std::string getStatSec(){return statSec.getSection();};
211  void   setStatSec(std::string range){statSec.setSection(range);};
212  float  getCut(){return snrCut;};
213  void   setCut(float c){snrCut=c;};
214  float  getThreshold(){return threshold;};
215  void   setThreshold(float f){threshold=f;};
216  bool   getFlagUserThreshold(){return flagUserThreshold;};
217  void   setFlagUserThreshold(bool b){flagUserThreshold=b;};
218  //     
219  bool   getFlagSmooth(){return flagSmooth;};
220  void   setFlagSmooth(bool b){flagSmooth=b;};
221  int    getHanningWidth(){return hanningWidth;};
222  void   setHanningWidth(int f){hanningWidth=f;};
223  //     
224  bool   getFlagATrous(){return flagATrous;};
225  void   setFlagATrous(bool flag){flagATrous=flag;};
226  int    getReconDim(){return reconDim;};
227  void   setReconDim(int i){reconDim=i;};
228  int    getMinScale(){return scaleMin;};
229  void   setMinScale(int s){scaleMin=s;};
230  float  getAtrousCut(){return snrRecon;};
231  void   setAtrousCut(float c){snrRecon=c;};
232  int    getFilterCode(){return filterCode;};
233  void   setFilterCode(int c){filterCode=c;};
234  std::string getFilterName(){return reconFilter.getName();};
235  Filter& filter(){ Filter &rfilter = reconFilter; return rfilter; };
236  //     
237  bool   getFlagAdjacent(){return flagAdjacent;};
238  void   setFlagAdjacent(bool flag){flagAdjacent=flag;};
239  float  getThreshS(){return threshSpatial;};
240  void   setThreshS(float t){threshSpatial=t;};
241  float  getThreshV(){return threshVelocity;};
242  void   setThreshV(float t){threshVelocity=t;};
243  int    getMinChannels(){return minChannels;};
244  void   setMinChannels(int n){minChannels=n;};
245  //
246  std::string getSpectralMethod(){return spectralMethod;};
247  void   setSpectralMethod(std::string s){spectralMethod=s;};
248  std::string getSpectralUnits(){return spectralUnits;};
249  void   setSpectralUnits(std::string s){spectralUnits=s;};
250  std::string getPixelCentre(){return pixelCentre;};
251  void   setPixelCentre(std::string s){pixelCentre=s;};
252  bool   drawBorders(){return borders;};
253  void   setDrawBorders(bool f){borders=f;};
254  bool   drawBlankEdge(){return blankEdge;};
255  void   setDrawBlankEdge(bool f){blankEdge=f;};
256
257  /** Are we in verbose mode? */
258  bool   isVerbose(){return verbose;};
259  void   setVerbosity(bool f){verbose=f;};
260 
261private:
262  // Input files
263  std::string imageFile;  ///< The image to be analysed.
264  bool   flagSubsection;  ///< Whether we just want a subsection of
265                          ///   the image
266  Section pixelSec;       ///< The Section object storing the pixel
267                          ///   subsection information.
268  bool   flagReconExists; ///< The reconstructed array is in a FITS
269                          ///   file on disk.
270  std::string reconFile;  ///< The FITS file containing the
271                          ///   reconstructed array.
272  bool   flagSmoothExists;///< The Hanning-smoothed array is in a FITS
273                          ///   file.
274  std::string smoothFile; ///< The FITS file containing the smoothed
275                          ///   array.
276
277  // Output files
278  bool   flagLog;         ///< Should we do the intermediate logging?
279  std::string logFile;    ///< Where the intermediate logging goes.
280  std::string outFile;    ///< Where the final results get put.
281  std::string spectraFile;///< Where the spectra are displayed
282  bool   flagOutputSmooth;///< Should the Hanning-smoothed cube be
283                          ///   written?
284  bool   flagOutputRecon; ///< Should the reconstructed cube be
285                          ///   written?
286  bool   flagOutputResid; ///< Should the reconstructed cube be
287                          ///   written?
288  bool   flagVOT;         ///< Should we save results in VOTable
289                          ///   format?
290  std::string votFile;    ///< Where the VOTable goes.
291  bool   flagKarma;       ///< Should we save results in Karma
292                          ///   annotation format?
293  std::string karmaFile;  ///< Where the Karma annotation file goes.
294  bool   flagMaps;        ///< Should we produce detection and moment
295                          ///   maps in postscript form?
296  std::string detectionMap;///< The name of the detection map
297                           ///   (postscript file).
298  std::string momentMap;  ///< The name of the 0th moment map (ps file).
299  bool   flagXOutput;     ///< Should there be an xwindows output of
300                          ///   the detection map?
301
302  // Cube related parameters
303  bool   flagNegative;    ///< Are we going to search for negative
304                          ///   features?
305  bool   flagBlankPix;    ///< A flag that indicates whether there are
306                          ///   pixels defined as BLANK and whether we
307                          ///   need to remove & ignore them in
308                          ///   processing.
309  float  blankPixValue;   ///< Pixel value that is considered BLANK.
310  int    blankKeyword;    ///< The FITS header keyword BLANK.
311  float  bscaleKeyword;   ///< The FITS header keyword BSCALE.
312  float  bzeroKeyword;    ///< The FITS header keyword BZERO.
313  bool   flagUsingBlank;  ///< If true, we are using the blankPixValue
314                          ///   keyword, otherwise we use the value in
315                          ///   the FITS header.
316  bool   flagMW;          ///< A flag that indicates whether to ignore
317                          ///   the Milky Way channels.
318  int    maxMW;           ///< Last  Milky Way channel
319  int    minMW;           ///< First Milky Way channel
320  float  numPixBeam;      ///< Size (area) of the beam in pixels.
321  bool   flagUsingBeam;   ///< If true, we are using the numPixBeam
322                          ///   parameter, otherwise we use the value
323                          ///   in the FITS header.
324  // Trim-related
325  bool   flagTrimmed;     ///< Has the cube been trimmed of excess
326                          ///   BLANKs around the edge?
327  long   borderLeft;      ///< The number of BLANK pixels trimmed from
328                          ///   the left of the cube;
329  long   borderRight;     ///< The number trimmed from the Right of
330                          ///   the cube;
331  long   borderBottom;    ///< The number trimmed from the Bottom of
332                          ///   the cube;
333  long   borderTop;       ///< The number trimmed from the Top of the
334                          ///   cube;
335  // Subsection offsets
336  long  *offsets;         ///< The array of offsets for each FITS axis.
337  long   sizeOffsets;     ///< The size of the offsets array.
338  long   xSubOffset;      ///< The subsection's x-axis offset
339  long   ySubOffset;      ///< The subsection's y-axis offset
340  long   zSubOffset;      ///< The subsection's z-axis offset
341  // Baseline related
342  bool   flagBaseline;    ///< Whether to do baseline subtraction
343                          ///   before reconstruction and/or searching.
344  // Detection-related
345  int    minPix;          ///< Minimum number of pixels for a detected
346                          ///   object to be counted
347  // Object growth
348  bool   flagGrowth;      ///< Are we growing objects once they are
349                          ///   found?
350  float  growthCut;       ///< The SNR that we are growing objects
351                          ///   down to.
352  // FDR analysis
353  bool   flagFDR;         ///< Should the FDR method be used?
354  float  alphaFDR;        ///< Alpha value for FDR detection algorithm
355  // Basic detection
356  bool   flagStatSec;     ///< Whether we just want to use a
357                          ///   subsection of the image to calculate
358                          ///   the statistics.
359  Section statSec;       ///< The Section object storing the statistics
360                          ///   subsection information.
361  float  snrCut;          ///< How many sigma above mean is a
362                          ///   detection when sigma-clipping
363  float  threshold;       ///< What the threshold is (when
364                          ///   sigma-clipping).
365  bool   flagUserThreshold;///< Whether the user has defined a
366                           ///   threshold of their own.
367  // Smoothing of the cube
368  bool   flagSmooth;      ///< Should the cube be smoothed before
369                          ///   searching?
370  int    hanningWidth;    ///< Width for hanning smoothing.
371  // A trous reconstruction parameters
372  bool   flagATrous;      ///< Are we using the a trous reconstruction?
373  int    reconDim;        ///< How many dimensions to use for the
374                          ///   reconstruction?
375  int    scaleMin;        ///< Min scale used in a trous reconstruction
376  float  snrRecon;        ///< SNR cutoff used in a trous
377                          ///   reconstruction (only wavelet coefficients
378                          ///   that survive this threshold are kept)
379  Filter reconFilter;     ///< The filter used for reconstructions.
380  int    filterCode;      ///< The code number for the filter to be
381                          ///   used (saves having to parse names)
382  std::string filterName; ///< The code number converted into a name,
383                          ///   for outputting purposes.
384
385  // Volume-merging parameters
386  bool   flagAdjacent;    ///< Whether to use the adjacent criterion
387                          ///   for judging if objects are to be merged.
388  float  threshSpatial;   ///< Maximum spatial separation between
389                          ///   objects
390  float  threshVelocity;  ///< Maximum channels separation between
391                          ///   objects
392  int    minChannels;     ///< Minimum no. of channels to make an object
393  // Input-Output related
394  std::string spectralMethod; ///< A string indicating choice of
395                              ///   spectral plotting method: choices are
396                              ///   "peak" (default) or "sum"
397  std::string spectralUnits;   ///< A string indicating what units the
398                               ///   spectral axis should be quoted in.
399  std::string pixelCentre;///< A string indicating which type of
400                          ///   centre to give the results in: "average",
401                          ///   "centroid", or "peak"(flux).
402  bool   borders;         ///< Whether to draw a border around the
403                          ///   individual pixels of a detection in the
404                          ///   spectral display
405  bool   blankEdge;       ///< Whether to draw a border around the
406                          ///   BLANK pixel region in the moment maps and
407                          ///   cutout images
408  bool   verbose;         ///< Whether to use maximum verbosity -- use
409                          ///   progress indicators in the reconstruction
410                          ///   & merging steps.
411
412};
413
414//===========================================================================
415
416/**
417 *  Class to store FITS header information.
418 *
419 *   Stores information from a FITS header, including WCS information
420 *    in the form of a wcsprm struct, as well as various keywords.
421 */
422class FitsHeader
423{
424
425public:
426  FitsHeader();
427  virtual ~FitsHeader(){wcsvfree(&nwcs,&wcs);};
428  FitsHeader(const FitsHeader& h);
429  FitsHeader& operator= (const FitsHeader& h);
430
431  //--------------------
432  // Functions in param.cc
433  //
434  /** Assign correct WCS parameters.  */
435  void    setWCS(struct wcsprm *w);
436
437  /** Return the WCS parameters in a WCSLIB wcsprm struct. */
438  struct wcsprm *getWCS();
439
440  // front ends to WCS functions
441  /** Convert pixel coords to world coords for a single point. */
442  int     wcsToPix(const double *world, double *pix);
443
444  /** Convert pixel coords to world coords for many points. */
445  int     wcsToPix(const double *world, double *pix, const int npts);
446
447  /** Convert world coords to pixel coords for a single point. */
448  int     pixToWCS(const double *pix, double *world);
449
450  /** Convert world coords to pixel coords for many points. */
451  int     pixToWCS(const double *pix, double *world, const int npts);
452
453  /** Convert a (x,y,z) position to a velocity. */
454  double  pixToVel(double &x, double &y, double &z);
455
456  /** Convert a set of  (x,y,z) positions to a set of velocities. */
457  double *pixToVel(double &x, double &y, double *zarray, int size);
458
459  /** Convert a spectral coordinate to a velocity coordinate.*/
460  double  specToVel(const double &z);
461
462  /** Convert a velocity coordinate to a spectral coordinate.*/
463  double  velToSpec(const float &vel);
464
465  /** Get an IAU-style name for an equatorial or galactic coordinates. */
466  std::string  getIAUName(double ra, double dec);
467
468  /** Correct the units for the spectral axis */
469  void    fixUnits(Param &par);
470 
471  //--------------------
472  // Functions in FitsIO/headerIO.cc
473  //
474  /** Read all header info. */
475  int     readHeaderInfo(std::string fname, Param &par);
476
477  /** Read BUNIT keyword */
478  int     readBUNIT(std::string fname);
479
480  /** Read BLANK & related keywords */
481  int     readBLANKinfo(std::string fname, Param &par);
482
483  /** Read beam-related keywords */
484  int     readBeamInfo(std::string fname, Param &par);
485 
486  //--------------------
487  // Function in FitsIO/wcsIO.cc
488  //
489  /** Read the WCS information from a file. */
490  int     defineWCS(std::string fname, Param &par);
491
492  //--------------------
493  // Basic inline accessor functions
494  //
495  bool    isWCS(){return wcsIsGood;};
496  int     getNWCS(){return nwcs;};
497  void    setNWCS(int i){nwcs=i;};
498  std::string  getSpectralUnits(){return spectralUnits;};
499  void    setSpectralUnits(std::string s){spectralUnits=s;};
500  std::string  getSpectralDescription(){return spectralDescription;};
501  void    setSpectralDescription(std::string s){spectralDescription=s;};
502  std::string  getFluxUnits(){return fluxUnits;};
503  void    setFluxUnits(std::string s){fluxUnits=s;};
504  std::string  getIntFluxUnits(){return intFluxUnits;};
505  void    setIntFluxUnits(std::string s){intFluxUnits=s;};
506  float   getBeamSize(){return beamSize;};
507  void    setBeamSize(float f){beamSize=f;};
508  float   getBmajKeyword(){return bmajKeyword;};
509  void    setBmajKeyword(float f){bmajKeyword=f;};
510  float   getBminKeyword(){return bminKeyword;};
511  void    setBminKeyword(float f){bminKeyword=f;};
512  int     getBlankKeyword(){return blankKeyword;};
513  void    setBlankKeyword(int f){blankKeyword=f;};
514  float   getBzeroKeyword(){return bzeroKeyword;};
515  void    setBzeroKeyword(float f){bzeroKeyword=f;};
516  float   getBscaleKeyword(){return bscaleKeyword;};
517  void    setBscaleKeyword(float f){bscaleKeyword=f;};
518  float   getAvPixScale(){
519    return sqrt( fabs ( (wcs->pc[0]*wcs->cdelt[0])*
520                        (wcs->pc[wcs->naxis+1]*wcs->cdelt[1])));
521  };
522
523
524private:
525  struct wcsprm *wcs;           ///< The WCS parameters for the cube in a struct from the wcslib library.
526  int     nwcs;                 ///< The number of WCS parameters
527  bool    wcsIsGood;            ///< A flag indicating whether there is a valid WCS present.
528  std::string  spectralUnits;        ///< The units of the spectral dimension
529  std::string  spectralDescription;  ///< The description of the spectral dimension (Frequency, Velocity, ...)
530  std::string  fluxUnits;            ///< The units of pixel flux (from header)
531  std::string  intFluxUnits;         ///< The units of pixel flux (from header)
532  float   beamSize;             ///< The calculated beam size in pixels.
533  float   bmajKeyword;          ///< The FITS header keyword BMAJ.
534  float   bminKeyword;          ///< The FITS header keyword BMIN.
535  int     blankKeyword;         ///< The FITS header keyword BLANK.
536  float   bzeroKeyword;         ///< The FITS header keyword BZERO.
537  float   bscaleKeyword;        ///< The FITS header keyword BSCALE.
538  double  scale;                ///< scale param for converting spectral coords
539  double  offset;               ///< offset param for converting spectral coords
540  double  power;                ///< power param for converting spectral coords
541};
542
543std::string makelower( std::string s );
544
545#endif
Note: See TracBrowser for help on using the repository browser.