source: branches/NewStructure/src/param.hh @ 1124

Last change on this file since 1124 was 1120, checked in by MatthewWhiting, 12 years ago

Ticket #170, #105 - The bulk of the work allowing this to happen. Have implemented different classes for each of the output types, including the baselines (which required new parameters etc.) Not yet implemented in mainDuchamp, so needs testing.

File size: 29.4 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/Utils/VOParam.hh>
39#include <duchamp/ATrous/filter.hh>
40#include <duchamp/FitsIO/DuchampBeam.hh>
41
42namespace duchamp
43{
44
45  /// @brief Write out info on a parameter to e.g. the results file.
46  void recordParameters(std::ostream& theStream, std::string paramName, std::string paramDesc, std::string paramValue);
47
48  /// @brief A macro to handle streamed output to recordParameters
49#define recordParam(outstream,string1,string2,instream)      \
50  do{                                                       \
51    std::ostringstream oss;                                 \
52    oss<<instream;                                          \
53    recordParameters(outstream,string1,string2,oss.str());   \
54  }while(0)
55
56  class FitsHeader; // foreshadow this so that Param knows it exists
57
58  const int numSortingParamOptions = 10;
59  const std::string sortingParamOptions[numSortingParamOptions]={"xvalue","yvalue","zvalue","ra","dec","vel","w50","iflux","pflux","snr"};
60
61
62  /// @brief Class to store general parameters.
63  ///
64  /// @details This is a general repository for parameters that are used by all
65  /// functions. This is how the user interacts with the program, as
66  /// parameters are read in from disk files through functions in this
67  /// class.
68
69  class Param
70  {
71  public:
72    /// @brief Default constructor.
73    Param();
74
75    /// @brief Copy constructor for Param.
76    Param(const Param& p);
77
78    /// @brief Assignment operator for Param.
79    Param& operator= (const Param& p);
80
81    /// @brief Destructor function. 
82    virtual ~Param();
83
84    /// @brief Define the default values of each parameter.
85    void  defaultValues();
86
87    //-----------------
88    // Functions in param.cc
89    //
90    /// @brief Parse the command line parameters correctly.
91    OUTCOME getopts(int argc, char ** argv, std::string progname="Duchamp");
92
93    /// @brief Read in parameters from a disk file.
94    OUTCOME readParams(std::string paramfile);
95
96    /// @brief Check the parameter list for inconsistencies
97    void   checkPars();
98
99    OUTCOME checkImageExists();
100
101    /// @brief Copy certain necessary FITS header parameters from a FitsHeader object
102    void   copyHeaderInfo(FitsHeader &head);
103
104    /// @brief Determine filename in which to save the moment map.
105    std::string outputMomentMapFile();
106
107    /// @brief Determine filename in which to save the baseline array.
108    std::string outputBaselineFile();
109
110    /// @brief Determine filename in which to save the mask array.
111    std::string outputMaskFile();
112
113    /// @brief Determine filename in which to save the smoothed array.
114    std::string outputSmoothFile();
115
116    /// @brief Determine filename in which to save the reconstructed array.
117    std::string outputReconFile();
118
119    /// @brief Determine filename in which to save the residual array from the atrous reconstruction.
120    std::string outputResidFile();
121
122    /// @brief Print the parameter set in a readable fashion.
123    friend std::ostream& operator<< ( std::ostream& theStream, Param& par);
124    friend class Image;
125
126    std::vector<VOParam> getVOParams();
127
128    //------------------
129    // Functions in FitsIO/subsection.cc
130    //
131    /// @brief Make sure the subsection strings are OK, with FITS access.
132    OUTCOME verifySubsection();
133    /// @brief Parse the subsection strings with a dimension set
134    OUTCOME parseSubsections(std::vector<long> &dim);
135    OUTCOME parseSubsections(std::vector<int> &dim);
136    OUTCOME parseSubsections(long *dim, int size);
137
138    /// @brief Set the correct offset values for each axis
139    void   setOffsets(struct wcsprm *wcs);
140
141    /// @brief Set the correct offset values for each axis
142    void   setOffsets(struct wcsprm &wcs);
143
144    //------------------
145    // These are in param.cc
146    /// @brief Is a pixel value a BLANK?
147    bool   isBlank(float &value);
148
149    /// @brief Is a given channel flagged as being in the Milky Way?           
150    bool   isInMW(int z);
151
152    /// @brief Is a given pixel position OK for use with stats calculations?
153    bool   isStatOK(int x, int y, int z);
154
155    /// @brief Make a mask array -- an array saying whether each pixel is BLANK or not
156    bool  *makeBlankMask(float *array, size_t size);
157
158    /// @brief Make a mask array -- an array saying whether each pixel is able to be used for statistics calculations
159    bool *makeStatMask(float *array, size_t *dim);
160
161    //--------------------
162    // Basic inline accessor functions
163    //
164    std::string getImageFile(){return imageFile;};
165    void   setImageFile(std::string fname){imageFile = fname;};
166    std::string getFullImageFile(){
167      if(flagSubsection) return imageFile+pixelSec.getSection();
168      else return imageFile;
169    };
170    bool   getFlagSubsection(){return flagSubsection;};
171    void   setFlagSubsection(bool flag){flagSubsection=flag;};
172    std::string getSubsection(){return pixelSec.getSection();};
173    void   setSubsection(std::string range){pixelSec.setSection(range);};
174    Section &section(){Section &rsection = pixelSec; return rsection;};
175    bool   getFlagReconExists(){return flagReconExists;};
176    void   setFlagReconExists(bool flag){flagReconExists=flag;};
177    std::string getReconFile(){return reconFile;};
178    void   setReconFile(std::string file){reconFile = file;};
179    bool   getFlagSmoothExists(){return flagSmoothExists;};
180    void   setFlagSmoothExists(bool flag){flagSmoothExists=flag;};
181    std::string getSmoothFile(){return smoothFile;};
182    void   setSmoothFile(std::string file){smoothFile = file;};
183    //
184    bool   getFlagUsePrevious(){return usePrevious;};
185    void   setFlagUsePrevious(bool flag){usePrevious=flag;};
186    std::string getObjectList(){return objectList;};
187    void   setObjectList(std::string s){objectList = s;};
188    std::vector<int> getObjectRequest();
189    std::vector<bool> getObjectChoices();
190    std::vector<bool> getObjectChoices(int numObjects);
191    //
192    bool   getFlagLog(){return flagLog;};
193    void   setFlagLog(bool flag){flagLog=flag;};
194    std::string getLogFile(){return logFile;};
195    void   setLogFile(std::string fname){logFile = fname;};
196    std::string getOutFile(){return outFile;};
197    void   setOutFile(std::string fname){outFile = fname;};
198    bool   getFlagSeparateHeader(){return flagSeparateHeader;};
199    void   setFlagSeparateHeader(bool b){flagSeparateHeader=b;};
200    std::string getHeaderFile(){return headerFile;};
201    void   setHeaderFile(std::string s){headerFile=s;};
202    bool   getFlagPlotSpectra(){return flagPlotSpectra;};
203    void   setFlagPlotSpectra(bool b){flagPlotSpectra=b;};
204    std::string getSpectraFile(){return spectraFile;};
205    void   setSpectraFile(std::string fname){spectraFile = fname;};
206    bool   getFlagTextSpectra(){return flagTextSpectra;};
207    void   setFlagTextSpectra(bool b){flagTextSpectra = b;};
208    std::string getSpectraTextFile(){return spectraTextFile;};
209    void   setSpectraTextFile(std::string fname){spectraTextFile = fname;};
210    bool   getFlagOutputBaseline(){return flagOutputBaseline;};
211    void   setFlagOutputBaseline(bool flag){flagOutputBaseline=flag;};
212    std::string getFileOutputBaseline(){return fileOutputBaseline;};
213    void   setFileOutputBaseline(std::string s){fileOutputBaseline=s;};
214    bool   getFlagOutputMomentMap(){return flagOutputMomentMap;};
215    void   setFlagOutputMomentMap(bool flag){flagOutputMomentMap=flag;};
216    std::string getFileOutputMomentMap(){return fileOutputMomentMap;};
217    void   setFileOutputMomentMap(std::string s){fileOutputMomentMap=s;};
218    bool   getFlagOutputMask(){return flagOutputMask;};
219    void   setFlagOutputMask(bool flag){flagOutputMask=flag;};
220    std::string getFileOutputMask(){return fileOutputMask;};
221    void   setFileOutputMask(std::string s){fileOutputMask=s;};
222    bool   getFlagMaskWithObjectNum(){return flagMaskWithObjectNum;};
223    void   setFlagMaskWithObjectNum(bool flag){flagMaskWithObjectNum=flag;};
224    bool   getFlagOutputSmooth(){return flagOutputSmooth;};
225    void   setFlagOutputSmooth(bool flag){flagOutputSmooth=flag;};
226    std::string getFileOutputSmooth(){return fileOutputSmooth;};
227    void   setFileOutputSmooth(std::string s){fileOutputSmooth=s;};
228    bool   getFlagOutputRecon(){return flagOutputRecon;};
229    void   setFlagOutputRecon(bool flag){flagOutputRecon=flag;};
230    std::string getFileOutputRecon(){return fileOutputRecon;};
231    void   setFileOutputRecon(std::string s){fileOutputRecon=s;};
232    bool   getFlagOutputResid(){return flagOutputResid;};
233    void   setFlagOutputResid(bool flag){flagOutputResid=flag;};
234    std::string getFileOutputResid(){return fileOutputResid;};
235    void   setFileOutputResid(std::string s){fileOutputResid=s;};
236    bool   getFlagVOT(){return flagVOT;};
237    void   setFlagVOT(bool flag){flagVOT=flag;};
238    std::string getVOTFile(){return votFile;};
239    void   setVOTFile(std::string fname){votFile = fname;};
240    std::string getAnnotationType(){return annotationType;};
241    void   setAnnotationType(std::string s){annotationType=s;};
242    bool   getFlagKarma(){return flagKarma;};
243    void   setFlagKarma(bool flag){flagKarma=flag;};
244    std::string getKarmaFile(){return karmaFile;};
245    void   setKarmaFile(std::string fname){karmaFile = fname;};
246    bool   getFlagDS9(){return flagDS9;};
247    void   setFlagDS9(bool flag){flagDS9=flag;};
248    std::string getDS9File(){return ds9File;};
249    void   setDS9File(std::string fname){ds9File = fname;};
250    bool   getFlagMaps(){return flagMaps;};
251    void   setFlagMaps(bool flag){flagMaps=flag;};
252    std::string getDetectionMap(){return detectionMap;};
253    void   setDetectionMap(std::string fname){detectionMap = fname;};
254    std::string getMomentMap(){return momentMap;};
255    void   setMomentMap(std::string fname){momentMap = fname;};
256    bool   getFlagXOutput(){return flagXOutput;};
257    void   setFlagXOutput(bool b){flagXOutput=b;};
258    int    getPrecFlux(){return precFlux;};
259    void   setPrecFlux(int i){precFlux=i;};
260    int    getPrecVel(){return precVel;};
261    void   setPrecVel(int i){precVel=i;};
262    int    getPrecSNR(){return precSNR;};
263    void   setPrecSNR(int i){precSNR=i;};
264    //
265    bool   getFlagNegative(){return flagNegative;};
266    void   setFlagNegative(bool flag){flagNegative=flag;};
267    bool   getFlagBlankPix(){return flagBlankPix;};
268    void   setFlagBlankPix(bool flag){flagBlankPix=flag;};
269    float  getBlankPixVal(){return blankPixValue;};
270    void   setBlankPixVal(float v){blankPixValue=v;};
271    int    getBlankKeyword(){return blankKeyword;};
272    void   setBlankKeyword(int v){blankKeyword=v;};
273    float  getBscaleKeyword(){return bscaleKeyword;};
274    void   setBscaleKeyword(float v){bscaleKeyword=v;};
275    float  getBzeroKeyword(){return bzeroKeyword;};
276    void   setBzeroKeyword(float v){bzeroKeyword=v;};
277    bool   getFlagMW(){return flagMW;};
278    void   setFlagMW(bool flag){flagMW=flag;};
279    int    getMaxMW(){return maxMW - zSubOffset;};
280    void   setMaxMW(int m){maxMW=m;};
281    int    getMinMW(){return minMW - zSubOffset;};
282    void   setMinMW(int m){minMW=m;};
283    void   setBeamSize(float s){areaBeam = s;};
284    float  getBeamSize(){return areaBeam;};
285    void   setBeamFWHM(float s){fwhmBeam = s;};
286    float  getBeamFWHM(){return fwhmBeam;};
287    void   setBeamAsUsed(DuchampBeam &b){beamAsUsed = b;}; // just have the set function as we only want this for the operator<< function. Set from FitsHeader::itsBeam
288    std::string getNewFluxUnits(){return newFluxUnits;};
289    void   setNewFluxUnits(std::string s){newFluxUnits=s;};
290    std::string getSearchType(){return searchType;};
291    void   setSearchType(std::string s){searchType=s;};
292    //
293    bool   getFlagTrim(){return flagTrim;};
294    void   setFlagTrim(bool b){flagTrim=b;};
295    bool   getFlagCubeTrimmed(){return hasBeenTrimmed;};
296    void   setFlagCubeTrimmed(bool flag){hasBeenTrimmed = flag;};
297    size_t getBorderLeft(){return borderLeft;};
298    void   setBorderLeft(size_t b){borderLeft = b;};
299    size_t getBorderRight(){return borderRight;};
300    void   setBorderRight(size_t b){borderRight = b;};
301    size_t getBorderBottom(){return borderBottom;};
302    void   setBorderBottom(size_t b){borderBottom = b;};
303    size_t getBorderTop(){return borderTop;};
304    void   setBorderTop(size_t b){borderTop = b;};
305    //
306    long   getXOffset(){return xSubOffset;};
307    void   setXOffset(long o){xSubOffset = o;};
308    long   getYOffset(){return ySubOffset;};
309    void   setYOffset(long o){ySubOffset = o;};
310    long   getZOffset(){return zSubOffset;};
311    void   setZOffset(long o){zSubOffset = o;};
312    //
313    unsigned int   getMinPix(){return minPix;};
314    void   setMinPix(unsigned int m){minPix=m;};
315    //   
316    bool   getFlagGrowth(){return flagGrowth;};
317    void   setFlagGrowth(bool flag){flagGrowth=flag;};
318    float  getGrowthCut(){return growthCut;};
319    void   setGrowthCut(float c){growthCut=c;};
320    float  getGrowthThreshold(){return growthThreshold;};
321    void   setGrowthThreshold(float f){growthThreshold=f;};
322    bool   getFlagUserGrowthThreshold(){return flagUserGrowthThreshold;};
323    void   setFlagUserGrowthThreshold(bool b){flagUserGrowthThreshold=b;};
324    //   
325    bool   getFlagFDR(){return flagFDR;};
326    void   setFlagFDR(bool flag){flagFDR=flag;};
327    float  getAlpha(){return alphaFDR;};
328    void   setAlpha(float a){alphaFDR=a;};
329    int    getFDRnumCorChan(){return FDRnumCorChan;};
330    void   setFDRnumCorChan(int i){FDRnumCorChan=i;};
331    //
332    bool   getFlagBaseline(){return flagBaseline;};
333    void   setFlagBaseline(bool flag){flagBaseline = flag;};
334    //
335    bool   getFlagStatSec(){return flagStatSec;};
336    void   setFlagStatSec(bool flag){flagStatSec=flag;};
337    std::string getStatSec(){return statSec.getSection();};
338    void   setStatSec(std::string range){statSec.setSection(range);};
339    Section &statsec(){Section &rsection = statSec; return rsection;};
340    bool   getFlagRobustStats(){return flagRobustStats;};
341    void   setFlagRobustStats(bool flag){flagRobustStats=flag;};
342    float  getCut(){return snrCut;};
343    void   setCut(float c){snrCut=c;};
344    float  getThreshold(){return threshold;};
345    void   setThreshold(float f){threshold=f;};
346    bool   getFlagUserThreshold(){return flagUserThreshold;};
347    void   setFlagUserThreshold(bool b){flagUserThreshold=b;};
348    //   
349    bool   getFlagSmooth(){return flagSmooth;};
350    void   setFlagSmooth(bool b){flagSmooth=b;};
351    std::string getSmoothType(){return smoothType;};
352    void   setSmoothType(std::string s){smoothType=s;};
353    int    getHanningWidth(){return hanningWidth;};
354    void   setHanningWidth(int f){hanningWidth=f;};
355    void   setKernMaj(float f){kernMaj=f;};
356    float  getKernMaj(){return kernMaj;};
357    void   setKernMin(float f){kernMin=f;};
358    float  getKernMin(){return kernMin;};
359    void   setKernPA(float f){kernPA=f;};
360    float  getKernPA(){return kernPA;};
361    //   
362    bool   getFlagATrous(){return flagATrous;};
363    void   setFlagATrous(bool flag){flagATrous=flag;};
364    int    getReconDim(){return reconDim;};
365    void   setReconDim(int i){reconDim=i;};
366    unsigned int getMinScale(){return scaleMin;};
367    void   setMinScale(unsigned int s){scaleMin=s;};
368    unsigned int getMaxScale(){return scaleMax;};
369    void   setMaxScale(unsigned int s){scaleMax=s;};
370    float  getAtrousCut(){return snrRecon;};
371    void   setAtrousCut(float c){snrRecon=c;};
372    float  getReconConvergence(){return reconConvergence;};
373    void   setReconConvergence(float f){reconConvergence = f;};
374    int    getFilterCode(){return filterCode;};
375    void   setFilterCode(int c){filterCode=c;};
376    std::string getFilterName(){return reconFilter.getName();};
377    Filter& filter(){ Filter &rfilter = reconFilter; return rfilter; };
378    //   
379    bool   getFlagAdjacent(){return flagAdjacent;};
380    void   setFlagAdjacent(bool flag){flagAdjacent=flag;};
381    float  getThreshS(){return threshSpatial;};
382    void   setThreshS(float t){threshSpatial=t;};
383    float  getThreshV(){return threshVelocity;};
384    void   setThreshV(float t){threshVelocity=t;};
385    unsigned int getMinChannels(){return minChannels;};
386    void   setMinChannels(unsigned int n){minChannels=n;};
387    unsigned int getMinVoxels(){return minVoxels;};
388    void   setMinVoxels(unsigned int n){minVoxels=n;};
389    bool   getFlagRejectBeforeMerge(){return flagRejectBeforeMerge;};
390    void   setFlagRejectBeforeMerge(bool flag){flagRejectBeforeMerge=flag;};
391    bool   getFlagTwoStageMerging(){return flagTwoStageMerging;};
392    void   setFlagTwoStageMerging(bool flag){flagTwoStageMerging=flag;};
393    //
394    std::string getSpectralMethod(){return spectralMethod;};
395    void   setSpectralMethod(std::string s){spectralMethod=s;};
396    std::string getSpectralType(){return spectralType;};
397    void   setSpectralType(std::string s){spectralType=s;};
398    float  getRestFrequency(){return restFrequency;};
399    void   setRestFrequency(float f){restFrequency=f;};
400    bool    getFlagRestFrequencyUsed(){return restFrequencyUsed;};
401    void    setFlagRestFrequencyUsed(bool b){restFrequencyUsed=b;};
402    std::string getSpectralUnits(){return spectralUnits;};
403    void   setSpectralUnits(std::string s){spectralUnits=s;};
404    std::string getPixelCentre(){return pixelCentre;};
405    void   setPixelCentre(std::string s){pixelCentre=s;};
406    std::string getSortingParam(){return sortingParam;};
407    void   setSortingParam(std::string s){sortingParam=s;};
408    bool   drawBorders(){return borders;};
409    void   setDrawBorders(bool f){borders=f;};
410    bool   drawBlankEdge(){return blankEdge;};
411    void   setDrawBlankEdge(bool f){blankEdge=f;};
412
413    /// @brief Are we in verbose mode?
414    bool   isVerbose(){return verbose;};
415    void   setVerbosity(bool f){verbose=f;};
416 
417  private:
418    // Input files
419    std::string imageFile;       ///< The image to be analysed.
420    bool        flagSubsection;  ///< Whether we just want a subsection of the image
421    Section pixelSec;            ///< The Section object storing the pixel subsection information.
422    bool        flagReconExists; ///< The reconstructed array is in a FITS file on disk.
423    std::string reconFile;       ///< The FITS file containing the reconstructed array.
424    bool        flagSmoothExists;///< The smoothed array is in a FITS file.
425    std::string smoothFile;      ///< The FITS file containing the smoothed array.
426
427    bool       usePrevious;      ///< Whether to read the detections from a previously-created log file
428    std::string objectList;      ///< List of objects to re-plot
429
430    // Output files
431    bool        flagLog;         ///< Should we do the intermediate logging?
432    std::string logFile;         ///< Where the intermediate logging goes.
433    std::string outFile;         ///< Where the final results get put.
434    bool        flagSeparateHeader;///< Should the header information(parameters & statistics) be written to a separate file to the table ofresults?
435    std::string headerFile;      ///< Where the header information to go with the results table should be written.
436    bool        flagPlotSpectra; ///< Should we plot the spectrum of each detection?
437    std::string spectraFile;     ///< Where the spectra are displayed
438    bool        flagTextSpectra; ///< Should a text file with all spectra be written?
439    std::string spectraTextFile; ///< Where the text spectra are written.
440    bool        flagOutputBaseline;  ///< Should the cube of baseline values be written to a FITS file?
441    std::string fileOutputBaseline;  ///< The name of the baseline FITS file
442    bool        flagOutputMomentMap;  ///< Should the moment map image be written to a FITS file?
443    std::string fileOutputMomentMap;  ///< The name of the moment map FITS file
444    bool        flagOutputMask;  ///< Should the mask image be written?
445    std::string fileOutputMask;  ///< The name of the mask image.
446    bool        flagMaskWithObjectNum;///< Should the mask values be labeled with the object ID (or just 1)?
447    bool        flagOutputSmooth;///< Should the smoothed cube be written?
448    std::string fileOutputSmooth;///< The name of the smoothed cube file
449    bool        flagOutputRecon; ///< Should the reconstructed cube be written to a FITS file?
450    std::string fileOutputRecon; ///< The name of the reconstructed cube file
451    bool        flagOutputResid; ///< Should the residuals from the reconstruction be written to a FITS file?
452    std::string fileOutputResid; ///< The name of the residual cube file
453    bool        flagVOT;         ///< Should we save results in VOTable format?
454    std::string votFile;         ///< Where the VOTable goes.
455    bool        flagKarma;       ///< Should we save results in Karma annotation format?
456    std::string karmaFile;       ///< Where the Karma annotation file goes.
457    bool        flagDS9;         ///< Should we save results in DS9 annotation format?
458    std::string ds9File;         ///< Where the DS9 annotation file goes.
459    std::string annotationType;  ///< Should the annoations be circles or borders?
460    bool        flagMaps;        ///< Should we produce detection and moment maps in postscript form?
461    std::string detectionMap;    ///< The name of the detection map (postscript file).
462    std::string momentMap;       ///< The name of the 0th moment map (ps file).
463    bool        flagXOutput;     ///< Should there be an xwindows output of the detection map?
464    int         precFlux;        ///< The desired precision for flux values.
465    int         precVel;         ///< The desired precision for velocity/frequency values.
466    int         precSNR;         ///< The desired precision for the SNR values.
467
468    // Cube related parameters
469    bool        flagNegative;    ///< Are we going to search for negative features?
470    bool        flagBlankPix;    ///< A flag that indicates whether there are pixels defined as BLANK and whether we need to remove & ignore them in processing.
471    float       blankPixValue;   ///< Pixel value that is considered BLANK.
472    int         blankKeyword;    ///< The FITS header keyword BLANK.
473    float       bscaleKeyword;   ///< The FITS header keyword BSCALE.
474    float       bzeroKeyword;    ///< The FITS header keyword BZERO.
475    std::string newFluxUnits;    ///< The user-requested flux units, to replace BUNIT.
476
477    // Milky-Way parameters
478    bool        flagMW;          ///< A flag that indicates whether to ignore the Milky Way channels.
479    int         maxMW;           ///< Last  Milky Way channel
480    int         minMW;           ///< First Milky Way channel
481
482    // Trim-related
483    bool        flagTrim;        ///< Does the user want the cube trimmed?
484    bool        hasBeenTrimmed;  ///< Has the cube been trimmed of excess BLANKs around the edge?
485    size_t      borderLeft;      ///< The number of BLANK pixels trimmed from the left of the cube;
486    size_t      borderRight;     ///< The number trimmed from the Right of the cube;
487    size_t      borderBottom;    ///< The number trimmed from the Bottom of the cube;
488    size_t      borderTop;       ///< The number trimmed from the Top of the cube;
489
490    // Subsection offsets
491    long       *offsets;         ///< The array of offsets for each FITS axis.
492    long        sizeOffsets;     ///< The size of the offsets array.
493    long        xSubOffset;      ///< The subsection's x-axis offset
494    long        ySubOffset;      ///< The subsection's y-axis offset
495    long        zSubOffset;      ///< The subsection's z-axis offset
496
497    // Baseline related
498    bool        flagBaseline;    ///< Whether to do baseline subtraction before reconstruction and/or searching.
499
500    // Detection-related
501    unsigned int minPix;         ///< Minimum number of pixels for a detected object to be counted
502    float       areaBeam;        ///< Size (area) of the beam in pixels.
503    float       fwhmBeam;        ///< FWHM of the beam in pixels.
504    DuchampBeam beamAsUsed;      ///< A copy of the beam as used in FitsHeader - only used here for output
505    std::string searchType;      ///< How to do the search: by channel map or by spectrum
506
507    // Object growth
508    bool        flagGrowth;      ///< Are we growing objects once they are found?
509    float       growthCut;       ///< The SNR that we are growing objects down to.
510    bool        flagUserGrowthThreshold; ///< Whether the user has manually defined a growth threshold
511    float       growthThreshold; ///< The threshold for growing objects down to
512
513    // FDR analysis
514    bool        flagFDR;         ///< Should the FDR method be used?
515    float       alphaFDR;        ///< Alpha value for FDR detection algorithm
516    int         FDRnumCorChan;   ///< Number of correlated channels, used in the FDR algorithm
517
518    // Basic detection
519    bool        flagStatSec;     ///< Whether we just want to use a subsection of the image to calculate the statistics.
520    Section     statSec;         ///< The Section object storing the statistics subsection information.
521    bool        flagRobustStats; ///< Whether to use robust statistics.
522    float       snrCut;          ///< How many sigma above mean is a detection when sigma-clipping
523    float       threshold;       ///< What the threshold is (when sigma-clipping).
524    bool        flagUserThreshold;///< Whether the user has defined a threshold of their own.
525
526    // Smoothing of the cube
527    bool        flagSmooth;      ///< Should the cube be smoothed before searching?
528    std::string smoothType;      ///< The type of smoothing to be done.
529    int         hanningWidth;    ///< Width for hanning smoothing.
530    float       kernMaj;         ///< Semi-Major axis of gaussian smoothing kernel
531    float       kernMin;         ///< Semi-Minor axis of gaussian smoothing kernel
532    float       kernPA;          ///< Position angle of gaussian smoothing kernel, in degrees east of north (i.e. anticlockwise).
533
534    // A trous reconstruction parameters
535    bool   flagATrous;      ///< Are we using the a trous reconstruction?
536    int    reconDim;        ///< How many dimensions to use for the reconstruction?
537    unsigned int    scaleMin;        ///< Min scale used in a trous reconstruction
538    unsigned int    scaleMax;        ///< Max scale used in a trous reconstruction
539    float  snrRecon;        ///< SNR cutoff used in a trous reconstruction (only wavelet coefficients that survive this threshold are kept)
540    float  reconConvergence;///< Convergence criterion for reconstruction - maximum fractional change in residual standard deviation
541    Filter reconFilter;     ///< The filter used for reconstructions.
542    int    filterCode;      ///< The code number for the filter to be used (saves having to parse names)
543
544    // Volume-merging parameters
545    bool   flagAdjacent;    ///< Whether to use the adjacent criterion for judging if objects are to be merged.
546    float  threshSpatial;   ///< Maximum spatial separation between objects
547    float  threshVelocity;  ///< Maximum channels separation between objects
548    unsigned int minChannels;     ///< Minimum no. of channels to make an object
549    unsigned int minVoxels;       ///< Minimum no. of voxels required in an object
550    bool   flagRejectBeforeMerge; ///< Whether to reject sources before merging
551    bool   flagTwoStageMerging;  ///< Whether to do a partial merge when the objects are found, via the mergeIntoList function.
552
553    // Input-Output related
554    std::string spectralMethod; ///< A string indicating choice of spectral plotting method: choices are "peak" (default) or "sum"
555    std::string spectralType;   ///< The requested CTYPE that the spectral axis be converted to
556    float  restFrequency;       ///< The rest frequency that should be used when converting - overrides that in the FITS file
557    bool   restFrequencyUsed;   ///< A flag indicating whether the spectral type has been converted from that in the FITS file
558    std::string spectralUnits;  ///< A string indicating what units the spectral axis should be quoted in.
559    std::string pixelCentre;    ///< A string indicating which type of centre to give the results in: "average", "centroid", or "peak"(flux).
560    std::string sortingParam;   ///< A string indicating the parameter to sort the detection list on.
561    bool   borders;             ///< Whether to draw a border around the individual pixels of a detection in the spectral display
562    bool   blankEdge;           ///< Whether to draw a border around the BLANK pixel region in the moment maps and cutout images
563    bool   verbose;             ///< Whether to use maximum verbosity -- use progress indicators in the reconstruction & merging steps.
564
565  };
566
567  //===========================================================================
568
569
570}
571#endif
Note: See TracBrowser for help on using the repository browser.