source: tags/release-1.1.4/src/Utils/Statistics.hh @ 1441

Last change on this file since 1441 was 301, checked in by Matthew Whiting, 17 years ago

Mostly adding the distribution text to the start of files, with a few additional comments added too.

File size: 5.8 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/**
36 * A namespace to control everything to do with statistical
37 * calculations.
38 */
39
40namespace Statistics
41{
42
43  /** Divide by the following correction factor to convert from MADFM
44      to sigma (rms) estimator. */
45  const float correctionFactor = 0.6744888;
46
47  /** Multiply by the following correction factor to convert from
48      trimmedSigma to sigma estimator. */
49  const double trimToNormal = 1.17036753077;
50
51  /** A templated function to do the MADFM-to-rms conversion. */
52  template <class T> float madfmToSigma(T madfm);
53  /** A non-templated function to do the rms-to-MADFM conversion. */
54  float sigmaToMADFM(float sigma);
55
56
57  /**
58   *  Class to hold statistics for a given set of values.
59   *
60   *  This class is designed to hold all useful statistics for a given
61   *  array of numbers.  It does *not* hold the data themselves. It
62   *  provides the functions to calculate mean, rms, median and MADFM
63   *  (median absolute deviation from median), as well as functions to
64   *  control detection (ie. defining thresholds) in both standard
65   *  (sigma-clipping) cases and False Detection Rate scenarios.
66   */
67
68  template <class Type>
69  class StatsContainer
70  {
71  public:
72    StatsContainer(){useRobust=true; defined=false; useFDR=false;};
73    virtual ~StatsContainer(){};
74    StatsContainer(const StatsContainer<Type>& s);
75    StatsContainer<Type>& operator= (const StatsContainer<Type>& s);
76
77    /** A way of printing the statistics. */
78    template <class T>
79    friend std::ostream& operator<< ( std::ostream& theStream,
80                                      StatsContainer<T> &s);
81
82    float getMean(){return mean;};
83    void  setMean(float f){mean=f;};
84    float getStddev(){return stddev;};
85    void  setStddev(float f){stddev=f;};
86    Type  getMedian(){return median;};
87    void  setMedian(Type f){median=f;};
88    Type  getMadfm(){return madfm;};
89    void  setMadfm(Type f){madfm=f;};
90    float getThreshold(){return threshold;};
91    void  setThreshold(float f){threshold=f;};
92    float getPThreshold(){return pThreshold;};
93    void  setPThreshold(float f){pThreshold=f;};
94    bool  getRobust(){return useRobust;};
95    void  setRobust(bool b){useRobust=b;};
96    bool  setUseFDR(){return useFDR;};
97    void  setUseFDR(bool b){useFDR=b;};
98
99    /** Return the threshold as a signal-to-noise ratio. */
100    float getThresholdSNR();
101
102    /** Set the threshold in units of a signal-to-noise ratio. */
103    void  setThresholdSNR(float snr);
104
105    /** Convert a value to a signal-to-noise ratio. */
106    float getSNR(float value);
107   
108    /** Return the estimator of the middle value of the data. */
109    float getMiddle();
110   
111    /** Return the estimator of the amount of spread of the data.*/
112    float getSpread();
113
114    /** Scale the noise by a given factor. */
115    void  scaleNoise(float scale);
116
117    /** Return the Gaussian probability of a value given the stats. */
118    float getPValue(float value);
119
120    /** Is a value above the threshold? */
121    bool isDetection(float value);
122
123    // Functions to calculate the stats for a given array.
124    // The idea here is that there are two options to do the calculations:
125    //   *The first just uses all the points in the array. If you need to
126    //     remove BLANK points (or something similar), do this beforehand.
127    //   *Alternatively, construct a mask array of the same size,
128    //     showing which points are good, and use the second option.
129
130    /** Calculate statistics for all elements of a data array */
131    void calculate(Type *array, long size);
132
133    /** Calculate statistics for a subset of a data array */
134    void calculate(Type *array, long size, bool *mask);
135
136  private:
137    bool   defined;      // a flag indicating whether the stats are defined.
138
139    float  mean;         ///< The mean, or average, of the values.
140    float  stddev;       ///< The standard deviation, or R.M.S., or sigma...
141    Type   median;       ///< The median of the values.
142    Type   madfm;        ///< The median absolute deviation from the median
143
144    float  threshold;    ///< a threshold for simple sigma-clipping
145    float  pThreshold;   ///< a threshold for the FDR case -- the
146                         ///   upper limit of P values that detected
147                         ///   pixels can have.
148    bool   useRobust;    ///< whether we use the two robust stats or not
149    bool   useFDR;       ///< whether the FDR method is used for
150                         ///   determining a detection
151
152  };
153
154}
155
156#endif /*STATS_H*/
Note: See TracBrowser for help on using the repository browser.