00001 #ifndef _Q_BRUTE_FORCE_TREND_FINDER_HH_
00002 #define _Q_BRUTE_FORCE_TREND_FINDER_HH_
00003
00016 #include <map>
00017 #include <string>
00018 #include <vector>
00019
00020 class QBruteForceTrendFinder {
00021
00022 public:
00023 class Line {
00024 public:
00025 double intercept;
00026 double slope;
00027 };
00028
00029 QBruteForceTrendFinder();
00030
00031 virtual ~QBruteForceTrendFinder();
00032
00033 void FindTrends(int minPointsInInterval = 3);
00034
00035 const std::vector<Line>& GetBestFitLines()
00036 {
00037 return fBestFitLines;
00038 }
00039
00040 const std::vector<double>& GetBreakTimes()
00041 {
00042 return fBreakTimes;
00043 }
00044
00045 void RemoveOutliers(const double nMAD = 5.0 * 1.4826);
00046
00047 void SetMinProbability(const double minProbability)
00048 {
00049 fMinProbability = minProbability;
00050 }
00051
00052 void SetPoint(const double time,
00053 const double baseline,
00054 const double amplitude);
00055
00056 protected:
00057 double GetDeviation(const int start, const int stop);
00058 double GetDeviation(const int start, const int stop,
00059 double& intercept, double& slope);
00060 double GetDeviation(const std::vector<int>& breakPoints);
00061 bool Next(std::vector<int>& breakPoints, int minPointsInInterval,
00062 int numPoints);
00063
00064 class Point {
00065 public:
00066 double time;
00067 double baseline;
00068 double amplitude;
00069
00070 bool operator<(const Point& other) const
00071 {
00072 return time < other.time;
00073 }
00074 };
00075
00076 double* fAmplitudes;
00077 double* fBaselines;
00078 std::vector<Line> fBestFitLines;
00079 std::vector<double> fBreakTimes;
00080 std::map< int, std::map<int, double> > fDeviationCache;
00081 double fMinProbability;
00082 std::vector<Point> fPoints;
00083
00084 };
00085
00086 #endif