source: trunk/src/param.hh @ 434

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

Fixed ticket #35, so that the user can now enter a new flux unit string and the array will be converted to those units.

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