//this file looks like plain C, but it's actually -*- c++ -*-
#ifndef __TQPCA__
#define __TQPCA__

#include "QFramework/TQNamedTaggable.h"
#include <TMatrixDSym.h>
#include <TMatrixD.h>
#include <TVectorD.h>

class TQPCA : public TQNamedTaggable {
protected:
  unsigned int nDim;
  double sumWeights;
  unsigned int nEntries;
  TMatrixDSym covMatrixA;
  std::vector<double> covMatrixB;

  bool calculated;
  bool besselCorrection;
  TVectorD* vEigenValues; //!
  TMatrixD* mEigenVectors; //!

  void printMatrix(const TMatrixD& matrix, const TString& title);

public:

  TQPCA();
  TQPCA(const TString& name, int nDim=2);
  ~TQPCA();

  void init(int nDim);
  void clear();
  int getNDim();
  double getSumWeights();
  int getNEntries();

  void useBesselCorrection(bool val);

  TString getDetailsAsString(int option = 1);
  void print(const TString& opts = "");

  TVectorD getEigenValues();
  TMatrixD getEigenVectors();
  TVectorD getEigenVector(size_t i);
  double getEigenValue(size_t i);
  void calculate();
  void calculateFromCorrelationMatrix();

  void fill(double weight, const double* row);
  bool fill(double weight, const std::vector<double>& row);
  bool add(const TQPCA& other, double factor=1);
  bool add(const TQPCA* other, double factor=1);
  void scale(double factor=1);
  TMatrixDSym getCovarianceMatrix();
  TMatrixDSym getCorrelationMatrix();

  void clearResults();

  void printRawData();
  void printResults();
  void printCovarianceMatrix();
  void printCorrelationMatrix();

  TString getProjection(size_t index, bool normalize = false);
  TString getReverseProjection(size_t index, bool normalize = false);
  double evaluateProjection(size_t index, const std::vector<double>& values, bool normalize = false);
  double evaluateReverseProjection(size_t index, const std::vector<double>& values, bool normalize = false);

  TString getHistogramDefinition2D(size_t iX, size_t iY, size_t nBinsXplus, size_t nBinsXminus, size_t nBinsYplus, size_t nBinsYminus);
  TString getHistogramDefinition(size_t i, size_t nBinsPlus, size_t nBinsMinus);
  TString getNormalizedHistogramDefinition2D(size_t iX, size_t iY, size_t nBinsX, double xMin, double xMax, size_t nBinsY, double yMin, double yMax);
  TString getNormalizedHistogramDefinition(size_t i, size_t nBins, double min, double max);

  bool exportEigenSystemTags (TQTaggable& tags, size_t iX, size_t iY, double nSigmaX, double nSigmaY, bool normalize=false);
  TQTaggable* getEigenSystemTags (size_t iX, size_t iY, double nSigmaX, double nSigmaY, bool normalize=false);
  TString getEigenSystemTagsAsString (size_t iX, size_t iY, double nSigmaX, double nSigmaY, bool normalize=false);
  bool exportEigenSystemTags (TQTaggable& tags, size_t iX, size_t iY, double nSigmaX, double nSigmaY, double normX, double normY);
  TQTaggable* getEigenSystemTags (size_t iX, size_t iY, double nSigmaX, double nSigmaY, double normX, double normY);
  TString getEigenSystemTagsAsString (size_t iX, size_t iY, double nSigmaX, double nSigmaY, double normX, double normY);

  double getVariance(size_t i);
  double getMean(size_t i);
  double getPCVariance(size_t i);
  double getPCMean(size_t i);

  ClassDefOverride(TQPCA,3) // enhanced version of the ROOT TPrincipal class
};

#endif //TQPCA
 TQPCA.h:1
 TQPCA.h:2
 TQPCA.h:3
 TQPCA.h:4
 TQPCA.h:5
 TQPCA.h:6
 TQPCA.h:7
 TQPCA.h:8
 TQPCA.h:9
 TQPCA.h:10
 TQPCA.h:11
 TQPCA.h:12
 TQPCA.h:13
 TQPCA.h:14
 TQPCA.h:15
 TQPCA.h:16
 TQPCA.h:17
 TQPCA.h:18
 TQPCA.h:19
 TQPCA.h:20
 TQPCA.h:21
 TQPCA.h:22
 TQPCA.h:23
 TQPCA.h:24
 TQPCA.h:25
 TQPCA.h:26
 TQPCA.h:27
 TQPCA.h:28
 TQPCA.h:29
 TQPCA.h:30
 TQPCA.h:31
 TQPCA.h:32
 TQPCA.h:33
 TQPCA.h:34
 TQPCA.h:35
 TQPCA.h:36
 TQPCA.h:37
 TQPCA.h:38
 TQPCA.h:39
 TQPCA.h:40
 TQPCA.h:41
 TQPCA.h:42
 TQPCA.h:43
 TQPCA.h:44
 TQPCA.h:45
 TQPCA.h:46
 TQPCA.h:47
 TQPCA.h:48
 TQPCA.h:49
 TQPCA.h:50
 TQPCA.h:51
 TQPCA.h:52
 TQPCA.h:53
 TQPCA.h:54
 TQPCA.h:55
 TQPCA.h:56
 TQPCA.h:57
 TQPCA.h:58
 TQPCA.h:59
 TQPCA.h:60
 TQPCA.h:61
 TQPCA.h:62
 TQPCA.h:63
 TQPCA.h:64
 TQPCA.h:65
 TQPCA.h:66
 TQPCA.h:67
 TQPCA.h:68
 TQPCA.h:69
 TQPCA.h:70
 TQPCA.h:71
 TQPCA.h:72
 TQPCA.h:73
 TQPCA.h:74
 TQPCA.h:75
 TQPCA.h:76
 TQPCA.h:77
 TQPCA.h:78
 TQPCA.h:79
 TQPCA.h:80
 TQPCA.h:81
 TQPCA.h:82
 TQPCA.h:83
 TQPCA.h:84
 TQPCA.h:85
 TQPCA.h:86
 TQPCA.h:87
 TQPCA.h:88
 TQPCA.h:89