File indexing completed on 2024-04-06 12:31:29
0001 #ifndef GaussianSumUtilities1D_h_
0002 #define GaussianSumUtilities1D_h_
0003
0004
0005
0006 #include "TrackingTools/GsfTools/interface/SingleGaussianState1D.h"
0007 #include "TrackingTools/GsfTools/interface/MultiGaussianState1D.h"
0008
0009 #include <vector>
0010
0011
0012
0013
0014
0015
0016 class GaussianSumUtilities1D {
0017 private:
0018 enum ModeStatus { Valid, NotValid, NotComputed };
0019
0020 public:
0021 GaussianSumUtilities1D(const MultiGaussianState1D& state)
0022 : theState(state),
0023
0024 theModeStatus(NotComputed) {}
0025 ~GaussianSumUtilities1D() {}
0026
0027
0028 inline unsigned int size() const { return components().size(); }
0029
0030 inline const std::vector<SingleGaussianState1D>& components() const { return theState.components(); }
0031
0032 inline double weight(unsigned int i) const { return components()[i].weight(); }
0033
0034 inline double mean(unsigned int i) const { return components()[i].mean(); }
0035
0036 inline double standardDeviation(unsigned int i) const {
0037
0038 return components()[i].standardDeviation();
0039 }
0040
0041 inline double variance(unsigned int i) const { return components()[i].variance(); }
0042
0043 double pdf(unsigned int i, double x) const;
0044
0045 double quantile(const double) const;
0046
0047 bool modeIsValid() const;
0048
0049
0050 const SingleGaussianState1D& mode() const;
0051
0052 double pdf(double) const;
0053
0054 double cdf(const double&) const;
0055
0056 double d1Pdf(const double&) const;
0057
0058 double d2Pdf(const double&) const;
0059
0060 double d3Pdf(const double&) const;
0061
0062 double lnPdf(const double&) const;
0063
0064 double d1LnPdf(const double&) const;
0065
0066 double d2LnPdf(const double&) const;
0067
0068
0069 double weight() const { return theState.weight(); }
0070
0071 double mean() const { return theState.mean(); }
0072
0073 double variance() const { return theState.variance(); }
0074
0075 private:
0076
0077
0078
0079 bool findMode(double& mode, double& pdfAtMode, const double& xStart, const double& scale) const;
0080
0081 static double gauss(double, double, double);
0082
0083 static double gaussInt(double, double, double);
0084
0085 double combinedMean() const;
0086
0087 void computeMode() const;
0088
0089
0090 double localVariance(double x) const;
0091
0092
0093 struct FinderState {
0094 FinderState() {}
0095 FinderState(size_t n) : pdfs(n) {}
0096 double x;
0097 double y;
0098 double yd;
0099 double yd2;
0100 std::vector<double> pdfs;
0101 };
0102
0103
0104 void update(FinderState& state, double x) const;
0105
0106
0107 std::vector<double> pdfComponents(const double&) const;
0108
0109 void pdfComponents(double, std::vector<double>&) const;
0110
0111 static double pdf(double, const std::vector<double>&);
0112
0113 double d1Pdf(double, const std::vector<double>&) const;
0114
0115 double d2Pdf(double, const std::vector<double>&) const;
0116
0117 double d3Pdf(double, const std::vector<double>&) const;
0118
0119 static double lnPdf(double, const std::vector<double>&);
0120
0121 double d1LnPdf(double, const std::vector<double>&) const;
0122
0123 double d2LnPdf(double, const std::vector<double>&) const;
0124
0125 private:
0126 const MultiGaussianState1D& theState;
0127
0128
0129 mutable ModeStatus theModeStatus;
0130 mutable SingleGaussianState1D theMode;
0131
0132 };
0133 #endif