source: trunk/src/param.hh @ 438

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

Enabled the user to specify desired decimal precisions for the flux, velocity and SNR columns via new input parameters precFlux, precVel and precSNR (ticket #34).

File size: 23.2 KB
Line 
1// -----------------------------------------------------------------------
2// param.hh: Definition of the parameter set.
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#ifndef PARAM_H
29#define PARAM_H
30
31#include <iostream>
32#include <string>
33#include <vector>
34#include <math.h>
35#include <wcslib/wcs.h>
36#include <wcslib/wcshdr.h>
37#include <duchamp/Utils/Section.hh>
38#include <duchamp/ATrous/filter.hh>
39
40namespace duchamp
41{
42
43
44  class FitsHeader; // foreshadow this so that Param knows it exists
45
46  /**
47   * Class to store general parameters.
48   *
49   * This is a general repository for parameters that are used by all
50   * functions. This is how the user interacts with the program, as
51   * parameters are read in from disk files through functions in this
52   * class.
53   */
54
55  class Param
56  {
57  public:
58    /** Default constructor. */
59    Param();
60
61    /** Copy constructor for Param. */
62    Param(const Param& p);
63
64    /** Assignment operator for Param.*/
65    Param& operator= (const Param& p);
66
67    /** Destructor function.  */
68    virtual ~Param();
69
70    /** Define the default values of each parameter.*/
71    void  defaultValues();
72
73    //-----------------
74    // Functions in param.cc
75    //
76    /** Parse the command line parameters correctly. */
77    int    getopts(int argc, char ** argv);
78
79    /** Read in parameters from a disk file. */
80    int    readParams(std::string paramfile);
81
82    /** Copy certain necessary FITS header parameters from a FitsHeader
83        object */
84    void   copyHeaderInfo(FitsHeader &head);
85
86    /** Determine filename in which to save the mask array. */
87    std::string outputMaskFile();
88
89    /** Determine filename in which to save the smoothed array. */
90    std::string outputSmoothFile();
91
92    /** Determine filename in which to save the reconstructed array. */
93    std::string outputReconFile();
94
95    /** Determine filename in which to save the residual array from the
96        atrous reconstruction. */
97    std::string outputResidFile();
98
99    /** Print the parameter set in a readable fashion. */
100    friend std::ostream& operator<< ( std::ostream& theStream, Param& par);
101    friend class Image;
102
103    //------------------
104    // Functions in FitsIO/subsection.cc
105    //
106    /** Make sure the subsection strings are OK. */
107    int    verifySubsection();
108
109    /** Set the correct offset values for each axis */
110    void   setOffsets(struct wcsprm *wcs);
111
112    /** Set the correct offset values for each axis */
113    void   setOffsets(struct wcsprm &wcs);
114
115    //------------------
116    // These are in param.cc
117    /** Is a pixel value a BLANK? */
118    bool   isBlank(float &value);
119
120    /** Is a given channel flagged as being in the Milky Way?*/           
121    bool   isInMW(int z);
122
123    /** Is a given pixel position OK for use with stats calculations? */
124    bool   isStatOK(int x, int y, int z);
125
126    /** Make a mask array -- an array saying whether each pixel is BLANK
127        or not*/
128    bool  *makeBlankMask(float *array, int size);
129
130
131    //--------------------
132    // Basic inline accessor functions
133    //
134    std::string getImageFile(){return imageFile;};
135    void   setImageFile(std::string fname){imageFile = fname;};
136    std::string getFullImageFile(){
137      if(flagSubsection) return imageFile+pixelSec.getSection();
138      else return imageFile;
139    };
140    bool   getFlagSubsection(){return flagSubsection;};
141    void   setFlagSubsection(bool flag){flagSubsection=flag;};
142    std::string getSubsection(){return pixelSec.getSection();};
143    void   setSubsection(std::string range){pixelSec.setSection(range);};
144    Section &section(){Section &rsection = pixelSec; return rsection;};
145    bool   getFlagReconExists(){return flagReconExists;};
146    void   setFlagReconExists(bool flag){flagReconExists=flag;};
147    std::string getReconFile(){return reconFile;};
148    void   setReconFile(std::string file){reconFile = file;};
149    bool   getFlagSmoothExists(){return flagSmoothExists;};
150    void   setFlagSmoothExists(bool flag){flagSmoothExists=flag;};
151    std::string getSmoothFile(){return smoothFile;};
152    void   setSmoothFile(std::string file){smoothFile = file;};
153    //
154    bool   getFlagLog(){return flagLog;};
155    void   setFlagLog(bool flag){flagLog=flag;};
156    std::string getLogFile(){return logFile;};
157    void   setLogFile(std::string fname){logFile = fname;};
158    std::string getOutFile(){return outFile;};
159    void   setOutFile(std::string fname){outFile = fname;};
160    bool   getFlagSeparateHeader(){return flagSeparateHeader;};
161    void   setFlagSeparateHeader(bool b){flagSeparateHeader=b;};
162    std::string getHeaderFile(){return headerFile;};
163    void   setHeaderFile(std::string s){headerFile=s;};
164    std::string getSpectraFile(){return spectraFile;};
165    void   setSpectraFile(std::string fname){spectraFile = fname;};
166    bool   getFlagTextSpectra(){return flagTextSpectra;};
167    void   setFlagTextSpectra(bool b){flagTextSpectra = b;};
168    std::string getSpectraTextFile(){return spectraTextFile;};
169    void   setSpectraTextFile(std::string fname){spectraTextFile = fname;};
170    bool   getFlagOutputMask(){return flagOutputMask;};
171    void   setFlagOutputMask(bool flag){flagOutputMask=flag;};
172    bool   getFlagOutputSmooth(){return flagOutputSmooth;};
173    void   setFlagOutputSmooth(bool flag){flagOutputSmooth=flag;};
174    bool   getFlagOutputRecon(){return flagOutputRecon;};
175    void   setFlagOutputRecon(bool flag){flagOutputRecon=flag;};
176    bool   getFlagOutputResid(){return flagOutputResid;};
177    void   setFlagOutputResid(bool flag){flagOutputResid=flag;};
178    bool   getFlagVOT(){return flagVOT;};
179    void   setFlagVOT(bool flag){flagVOT=flag;};
180    std::string getVOTFile(){return votFile;};
181    void   setVOTFile(std::string fname){votFile = fname;};
182    bool   getFlagKarma(){return flagKarma;};
183    void   setFlagKarma(bool flag){flagKarma=flag;};
184    std::string getKarmaFile(){return karmaFile;};
185    void   setKarmaFile(std::string fname){karmaFile = fname;};
186    bool   getFlagMaps(){return flagMaps;};
187    void   setFlagMaps(bool flag){flagMaps=flag;};
188    std::string getDetectionMap(){return detectionMap;};
189    void   setDetectionMap(std::string fname){detectionMap = fname;};
190    std::string getMomentMap(){return momentMap;};
191    void   setMomentMap(std::string fname){momentMap = fname;};
192    bool   getFlagXOutput(){return flagXOutput;};
193    void   setFlagXOutput(bool b){flagXOutput=b;};
194    int    getPrecFlux(){return precFlux;};
195    void   setPrecFlux(int i){precFlux=i;};
196    int    getPrecVel(){return precVel;};
197    void   setPrecVel(int i){precVel=i;};
198    int    getPrecSNR(){return precSNR;};
199    void   setPrecSNR(int i){precSNR=i;};
200    //
201    bool   getFlagNegative(){return flagNegative;};
202    void   setFlagNegative(bool flag){flagNegative=flag;};
203    bool   getFlagBlankPix(){return flagBlankPix;};
204    void   setFlagBlankPix(bool flag){flagBlankPix=flag;};
205    float  getBlankPixVal(){return blankPixValue;};
206    void   setBlankPixVal(float v){blankPixValue=v;};
207    int    getBlankKeyword(){return blankKeyword;};
208    void   setBlankKeyword(int v){blankKeyword=v;};
209    float  getBscaleKeyword(){return bscaleKeyword;};
210    void   setBscaleKeyword(float v){bscaleKeyword=v;};
211    float  getBzeroKeyword(){return bzeroKeyword;};
212    void   setBzeroKeyword(float v){bzeroKeyword=v;};
213    bool   getFlagMW(){return flagMW;};
214    void   setFlagMW(bool flag){flagMW=flag;};
215    int    getMaxMW(){return maxMW;};
216    void   setMaxMW(int m){maxMW=m;};
217    int    getMinMW(){return minMW;};
218    void   setMinMW(int m){minMW=m;};
219    void   setBeamSize(float s){numPixBeam = s;};
220    float  getBeamSize(){return numPixBeam;};
221    bool   getFlagUsingBeam(){return flagUsingBeam;};
222    void   setFlagUsingBeam(bool b){flagUsingBeam=b;};
223    std::string getNewFluxUnits(){return newFluxUnits;};
224    void setNewFluxUnits(std::string s){newFluxUnits=s;};
225    //
226    bool   getFlagTrim(){return flagTrim;};
227    void   setFlagTrim(bool b){flagTrim=b;};
228    bool   getFlagCubeTrimmed(){return hasBeenTrimmed;};
229    void   setFlagCubeTrimmed(bool flag){hasBeenTrimmed = flag;};
230    long   getBorderLeft(){return borderLeft;};
231    void   setBorderLeft(long b){borderLeft = b;};
232    long   getBorderRight(){return borderRight;};
233    void   setBorderRight(long b){borderRight = b;};
234    long   getBorderBottom(){return borderBottom;};
235    void   setBorderBottom(long b){borderBottom = b;};
236    long   getBorderTop(){return borderTop;};
237    void   setBorderTop(long b){borderTop = b;};
238    //
239    long   getXOffset(){return xSubOffset;};
240    void   setXOffset(long o){xSubOffset = o;};
241    long   getYOffset(){return ySubOffset;};
242    void   setYOffset(long o){ySubOffset = o;};
243    long   getZOffset(){return zSubOffset;};
244    void   setZOffset(long o){zSubOffset = o;};
245    //
246    int    getMinPix(){return minPix;};
247    void   setMinPix(int m){minPix=m;};
248    //   
249    bool   getFlagGrowth(){return flagGrowth;};
250    void   setFlagGrowth(bool flag){flagGrowth=flag;};
251    float  getGrowthCut(){return growthCut;};
252    void   setGrowthCut(float c){growthCut=c;};
253    //   
254    bool   getFlagFDR(){return flagFDR;};
255    void   setFlagFDR(bool flag){flagFDR=flag;};
256    float  getAlpha(){return alphaFDR;};
257    void   setAlpha(float a){alphaFDR=a;};
258    //
259    bool   getFlagBaseline(){return flagBaseline;};
260    void   setFlagBaseline(bool flag){flagBaseline = flag;};
261    //
262    bool   getFlagStatSec(){return flagStatSec;};
263    void   setFlagStatSec(bool flag){flagStatSec=flag;};
264    std::string getStatSec(){return statSec.getSection();};
265    void   setStatSec(std::string range){statSec.setSection(range);};
266    bool   getFlagRobustStats(){return flagRobustStats;};
267    void   setFlagRobustStats(bool flag){flagRobustStats=flag;};
268    float  getCut(){return snrCut;};
269    void   setCut(float c){snrCut=c;};
270    float  getThreshold(){return threshold;};
271    void   setThreshold(float f){threshold=f;};
272    bool   getFlagUserThreshold(){return flagUserThreshold;};
273    void   setFlagUserThreshold(bool b){flagUserThreshold=b;};
274    //   
275    bool   getFlagSmooth(){return flagSmooth;};
276    void   setFlagSmooth(bool b){flagSmooth=b;};
277    std::string getSmoothType(){return smoothType;};
278    void   setSmoothType(std::string s){smoothType=s;};
279    int    getHanningWidth(){return hanningWidth;};
280    void   setHanningWidth(int f){hanningWidth=f;};
281    void   setKernMaj(float f){kernMaj=f;};
282    float  getKernMaj(){return kernMaj;};
283    void   setKernMin(float f){kernMin=f;};
284    float  getKernMin(){return kernMin;};
285    void   setKernPA(float f){kernPA=f;};
286    float  getKernPA(){return kernPA;};
287    //   
288    bool   getFlagATrous(){return flagATrous;};
289    void   setFlagATrous(bool flag){flagATrous=flag;};
290    int    getReconDim(){return reconDim;};
291    void   setReconDim(int i){reconDim=i;};
292    int    getMinScale(){return scaleMin;};
293    void   setMinScale(int s){scaleMin=s;};
294    int    getMaxScale(){return scaleMax;};
295    void   setMaxScale(int s){scaleMax=s;};
296    float  getAtrousCut(){return snrRecon;};
297    void   setAtrousCut(float c){snrRecon=c;};
298    int    getFilterCode(){return filterCode;};
299    void   setFilterCode(int c){filterCode=c;};
300    std::string getFilterName(){return reconFilter.getName();};
301    Filter& filter(){ Filter &rfilter = reconFilter; return rfilter; };
302    //   
303    bool   getFlagAdjacent(){return flagAdjacent;};
304    void   setFlagAdjacent(bool flag){flagAdjacent=flag;};
305    float  getThreshS(){return threshSpatial;};
306    void   setThreshS(float t){threshSpatial=t;};
307    float  getThreshV(){return threshVelocity;};
308    void   setThreshV(float t){threshVelocity=t;};
309    int    getMinChannels(){return minChannels;};
310    void   setMinChannels(int n){minChannels=n;};
311    //
312    std::string getSpectralMethod(){return spectralMethod;};
313    void   setSpectralMethod(std::string s){spectralMethod=s;};
314    std::string getSpectralUnits(){return spectralUnits;};
315    void   setSpectralUnits(std::string s){spectralUnits=s;};
316    std::string getPixelCentre(){return pixelCentre;};
317    void   setPixelCentre(std::string s){pixelCentre=s;};
318    bool   drawBorders(){return borders;};
319    void   setDrawBorders(bool f){borders=f;};
320    bool   drawBlankEdge(){return blankEdge;};
321    void   setDrawBlankEdge(bool f){blankEdge=f;};
322
323    /** Are we in verbose mode? */
324    bool   isVerbose(){return verbose;};
325    void   setVerbosity(bool f){verbose=f;};
326 
327  private:
328    // Input files
329    std::string imageFile;  ///< The image to be analysed.
330    bool   flagSubsection;  ///< Whether we just want a subsection of
331                            ///   the image
332    Section pixelSec;       ///< The Section object storing the pixel
333                            ///   subsection information.
334    bool   flagReconExists; ///< The reconstructed array is in a FITS
335                            ///   file on disk.
336    std::string reconFile;  ///< The FITS file containing the
337                            ///   reconstructed array.
338    bool   flagSmoothExists;///< The smoothed array is in a FITS file.
339    std::string smoothFile; ///< The FITS file containing the smoothed
340                            ///   array.
341
342    // Output files
343    bool   flagLog;         ///< Should we do the intermediate logging?
344    std::string logFile;    ///< Where the intermediate logging goes.
345    std::string outFile;    ///< Where the final results get put.
346    bool   flagSeparateHeader;///< Should the header information
347                            ///   (parameters & statistics) be written
348                            ///   to a separate file to the table of
349                            ///   results?
350    std::string headerFile; ///< Where the header information to go with
351                            ///   the results table should be written.
352    std::string spectraFile;///< Where the spectra are displayed
353    bool   flagTextSpectra; ///< Should a text file with all spectra
354                            ///   be written?
355    std::string spectraTextFile;///< Where the text spectra are
356                                ///   written.
357    bool   flagOutputMask;  ///< Should the mask image be written?
358    bool   flagOutputSmooth;///< Should the smoothed cube be written?
359    bool   flagOutputRecon; ///< Should the reconstructed cube be
360                            ///   written?
361    bool   flagOutputResid; ///< Should the reconstructed cube be
362                            ///   written?
363    bool   flagVOT;         ///< Should we save results in VOTable
364                            ///   format?
365    std::string votFile;    ///< Where the VOTable goes.
366    bool   flagKarma;       ///< Should we save results in Karma
367                            ///   annotation format?
368    std::string karmaFile;  ///< Where the Karma annotation file goes.
369    bool   flagMaps;        ///< Should we produce detection and moment
370                            ///   maps in postscript form?
371    std::string detectionMap;///< The name of the detection map
372                            ///   (postscript file).
373    std::string momentMap;  ///< The name of the 0th moment map (ps file).
374    bool   flagXOutput;     ///< Should there be an xwindows output of
375                            ///   the detection map?
376    int    precFlux;        ///< The desired precision for flux values.
377    int    precVel;         ///< The desired precision for velocity/frequency values.
378    int    precSNR;         ///< The desired precision for the SNR values.
379
380    // Cube related parameters
381    bool   flagNegative;    ///< Are we going to search for negative
382                            ///   features?
383    bool   flagBlankPix;    ///< A flag that indicates whether there are
384                            ///   pixels defined as BLANK and whether we
385                            ///   need to remove & ignore them in
386                            ///   processing.
387    float  blankPixValue;   ///< Pixel value that is considered BLANK.
388    int    blankKeyword;    ///< The FITS header keyword BLANK.
389    float  bscaleKeyword;   ///< The FITS header keyword BSCALE.
390    float  bzeroKeyword;    ///< The FITS header keyword BZERO.
391    std::string  newFluxUnits;    ///< The user-requested flux units, to replace BUNIT.
392    // Milky-Way parameters
393    bool   flagMW;          ///< A flag that indicates whether to ignore
394                            ///   the Milky Way channels.
395    int    maxMW;           ///< Last  Milky Way channel
396    int    minMW;           ///< First Milky Way channel
397    // Trim-related
398    bool   flagTrim;        ///< Does the user want the cube trimmed?
399    bool   hasBeenTrimmed;  ///< Has the cube been trimmed of excess
400                            ///   BLANKs around the edge?
401    long   borderLeft;      ///< The number of BLANK pixels trimmed from
402                            ///   the left of the cube;
403    long   borderRight;     ///< The number trimmed from the Right of
404                            ///   the cube;
405    long   borderBottom;    ///< The number trimmed from the Bottom of
406                            ///   the cube;
407    long   borderTop;       ///< The number trimmed from the Top of the
408                            ///   cube;
409    // Subsection offsets
410    long  *offsets;         ///< The array of offsets for each FITS axis.
411    long   sizeOffsets;     ///< The size of the offsets array.
412    long   xSubOffset;      ///< The subsection's x-axis offset
413    long   ySubOffset;      ///< The subsection's y-axis offset
414    long   zSubOffset;      ///< The subsection's z-axis offset
415    // Baseline related
416    bool   flagBaseline;    ///< Whether to do baseline subtraction
417                            ///   before reconstruction and/or searching.
418    // Detection-related
419    int    minPix;          ///< Minimum number of pixels for a detected
420                            ///   object to be counted
421    float  numPixBeam;      ///< Size (area) of the beam in pixels.
422    bool   flagUsingBeam;   ///< If true, we are using the numPixBeam
423                            ///   parameter, otherwise we use the value
424                            ///   in the FITS header.
425    // Object growth
426    bool   flagGrowth;      ///< Are we growing objects once they are
427                            ///   found?
428    float  growthCut;       ///< The SNR that we are growing objects
429                            ///   down to.
430    // FDR analysis
431    bool   flagFDR;         ///< Should the FDR method be used?
432    float  alphaFDR;        ///< Alpha value for FDR detection algorithm
433    // Basic detection
434    bool   flagStatSec;     ///< Whether we just want to use a
435                            ///   subsection of the image to calculate
436                            ///   the statistics.
437    Section statSec;        ///< The Section object storing the statistics
438                            ///   subsection information.
439    bool   flagRobustStats; ///< Whether to use robust statistics.
440    float  snrCut;          ///< How many sigma above mean is a
441                            ///   detection when sigma-clipping
442    float  threshold;       ///< What the threshold is (when
443                            ///   sigma-clipping).
444    bool   flagUserThreshold;///< Whether the user has defined a
445                             ///   threshold of their own.
446    // Smoothing of the cube
447    bool   flagSmooth;      ///< Should the cube be smoothed before
448                            ///   searching?
449    std::string smoothType; ///< The type of smoothing to be done.
450    int    hanningWidth;    ///< Width for hanning smoothing.
451    float  kernMaj;         ///< Semi-Major axis of gaussian smoothing kernel
452    float  kernMin;         ///< Semi-Minor axis of gaussian smoothing kernel
453    float  kernPA;          ///< Position angle of gaussian smoothing
454                            ///   kernel, in degrees east of north
455                            ///   (i.e. anticlockwise).
456    // A trous reconstruction parameters
457    bool   flagATrous;      ///< Are we using the a trous reconstruction?
458    int    reconDim;        ///< How many dimensions to use for the
459                            ///   reconstruction?
460    int    scaleMin;        ///< Min scale used in a trous reconstruction
461    int    scaleMax;        ///< Max scale used in a trous reconstruction
462    float  snrRecon;        ///< SNR cutoff used in a trous
463                            ///   reconstruction (only wavelet coefficients
464                            ///   that survive this threshold are kept)
465    Filter reconFilter;     ///< The filter used for reconstructions.
466    int    filterCode;      ///< The code number for the filter to be
467                            ///   used (saves having to parse names)
468    std::string filterName; ///< The code number converted into a name,
469                            ///   for outputting purposes.
470
471    // Volume-merging parameters
472    bool   flagAdjacent;    ///< Whether to use the adjacent criterion
473                            ///   for judging if objects are to be merged.
474    float  threshSpatial;   ///< Maximum spatial separation between
475                            ///   objects
476    float  threshVelocity;  ///< Maximum channels separation between
477                            ///   objects
478    int    minChannels;     ///< Minimum no. of channels to make an object
479
480    // Input-Output related
481    std::string spectralMethod; ///< A string indicating choice of
482                                ///   spectral plotting method: choices are
483                                ///   "peak" (default) or "sum"
484    std::string spectralUnits;   ///< A string indicating what units the
485                                 ///   spectral axis should be quoted in.
486    std::string pixelCentre;///< A string indicating which type of
487                            ///   centre to give the results in: "average",
488                            ///   "centroid", or "peak"(flux).
489    bool   borders;         ///< Whether to draw a border around the
490                            ///   individual pixels of a detection in the
491                            ///   spectral display
492    bool   blankEdge;       ///< Whether to draw a border around the
493                            ///   BLANK pixel region in the moment maps and
494                            ///   cutout images
495    bool   verbose;         ///< Whether to use maximum verbosity -- use
496                            ///   progress indicators in the reconstruction
497                            ///   & merging steps.
498
499  };
500
501  //===========================================================================
502
503
504  std::string makelower( std::string s );
505
506}
507#endif
Note: See TracBrowser for help on using the repository browser.