source: trunk/src/Utils/Statistics.hh @ 1144

Last change on this file since 1144 was 1137, checked in by MatthewWhiting, 12 years ago

Just about solving #180 - all ascii output now has comments in the right places, with only the table data uncommented. The table written to the screen is unaffected. The log file summary stuff is also untouched, but it needs a rethink anyway...

File size: 6.2 KB
Line 
1// -----------------------------------------------------------------------
2// Statistics.hh: Definition of the StatsContainer class, that holds
3// statistical parameters such as mean, median, rms, madfm.
4// -----------------------------------------------------------------------
5// Copyright (C) 2006, Matthew Whiting, ATNF
6//
7// This program is free software; you can redistribute it and/or modify it
8// under the terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2 of the License, or (at your
10// option) any later version.
11//
12// Duchamp is distributed in the hope that it will be useful, but WITHOUT
13// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15// for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with Duchamp; if not, write to the Free Software Foundation,
19// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
20//
21// Correspondence concerning Duchamp may be directed to:
22//    Internet email: Matthew.Whiting [at] atnf.csiro.au
23//    Postal address: Dr. Matthew Whiting
24//                    Australia Telescope National Facility, CSIRO
25//                    PO Box 76
26//                    Epping NSW 1710
27//                    AUSTRALIA
28// -----------------------------------------------------------------------
29#ifndef STATS_H
30#define STATS_H
31
32#include <iostream>
33#include <math.h>
34
35/// A namespace to control everything to do with statistical
36/// calculations.
37
38namespace Statistics
39{
40
41  /// @brief Divide by the following correction factor to convert from MADFM to sigma (rms) estimator.
42  const float correctionFactor = 0.6744888;
43
44  /// @brief Multiply by the following correction factor to convert from trimmedSigma to sigma estimator.
45  const double trimToNormal = 1.17036753077;
46
47  /// @brief A templated function to do the MADFM-to-rms conversion.
48  template <class T> float madfmToSigma(T madfm);
49  /// @brief A non-templated function to do the rms-to-MADFM conversion.
50  float sigmaToMADFM(float sigma);
51
52
53  /// @brief
54  ///  Class to hold statistics for a given set of values.
55  /// @details
56  ///  This class is designed to hold all useful statistics for a given
57  ///  array of numbers.  It does *not* hold the data themselves. It
58  ///  provides the functions to calculate mean, rms, median and MADFM
59  ///  (median absolute deviation from median), as well as functions to
60  ///  control detection (ie. defining thresholds) in both standard
61  ///  (sigma-clipping) cases and False Detection Rate scenarios.
62
63  template <class Type>
64  class StatsContainer
65  {
66  public:
67    StatsContainer(){useRobust=true; defined=false; useFDR=false; commentString="";};
68    virtual ~StatsContainer(){};
69    StatsContainer(const StatsContainer<Type>& s);
70    StatsContainer<Type>& operator= (const StatsContainer<Type>& s);
71
72    /// @brief A way of printing the statistics.
73    template <class T>
74    friend std::ostream& operator<< ( std::ostream& theStream,
75                                      StatsContainer<T> &s);
76
77    float getMean(){return mean;};
78    void  setMean(float f){mean=f;};
79    float getStddev(){return stddev;};
80    void  setStddev(float f){stddev=f;};
81    Type  getMedian(){return median;};
82    void  setMedian(Type f){median=f;};
83    Type  getMadfm(){return madfm;};
84    void  setMadfm(Type f){madfm=f;};
85    float getThreshold(){return threshold;};
86    void  setThreshold(float f){threshold=f;};
87    float getPThreshold(){return pThreshold;};
88    void  setPThreshold(float f){pThreshold=f;};
89    bool  getRobust(){return useRobust;};
90    void  setRobust(bool b){useRobust=b;};
91    bool  setUseFDR(){return useFDR;};
92    void  setUseFDR(bool b){useFDR=b;};
93
94    /// @brief Return the threshold as a signal-to-noise ratio.
95    float getThresholdSNR();
96
97    /// @brief Set the threshold in units of a signal-to-noise ratio.
98    void  setThresholdSNR(float snr);
99
100    /// @brief Convert a value to a signal-to-noise ratio.
101    float valueToSNR(float value);
102
103    /// @brief Convert a signal-to-noise ratio to a flux value
104    float snrToValue(float snr);
105   
106    /// @brief Return the estimator of the middle value of the data.
107    float getMiddle();
108    void  setMiddle(float middle);
109   
110    /// @brief Return the estimator of the amount of spread of the data.
111    float getSpread();
112    void  setSpread(float spread);
113
114    /// @brief Scale the noise by a given factor.
115    void  scaleNoise(float scale);
116
117    /// @brief Return the Gaussian probability of a value given the stats.
118    float getPValue(float value);
119
120    /// @brief Is a value above the threshold?
121    bool isDetection(float value);
122
123    /// @brief Set the comment characters
124    void setCommentString(std::string comment){commentString = comment;};;
125
126    // Functions to calculate the stats for a given array.
127    // The idea here is that there are two options to do the calculations:
128    //   *The first just uses all the points in the array. If you need to
129    //     remove BLANK points (or something similar), do this beforehand.
130    //   *Alternatively, construct a mask array of the same size,
131    //     showing which points are good, and use the second option.
132
133    /// @brief Calculate statistics for all elements of a data array
134    void calculate(Type *array, long size);
135
136    /// @brief Calculate statistics for a subset of a data array
137    void calculate(Type *array, long size, bool *mask);
138
139  private:
140    bool   defined;      // a flag indicating whether the stats are defined.
141
142    float  mean;         ///< The mean, or average, of the values.
143    float  stddev;       ///< The standard deviation, or R.M.S., or sigma...
144    Type   median;       ///< The median of the values.
145    Type   madfm;        ///< The median absolute deviation from the median
146
147    float  threshold;    ///< a threshold for simple sigma-clipping
148    float  pThreshold;   ///< a threshold for the FDR case -- the upper limit of P values that detected pixels can have.
149    bool   useRobust;    ///< whether we use the two robust stats or not
150    bool   useFDR;       ///< whether the FDR method is used for determining a detection
151
152    std::string commentString; ///< Any comment characters etc that need to be prepended to any output via the << operator.
153
154  };
155
156}
157
158#endif // STATS_H
Note: See TracBrowser for help on using the repository browser.