////////////////////////////////////////////////////////////////////////
// $Id: KalmanPlaneSR.h,v 1.16 2003/12/17 16:34:02 brebel Exp $
//
// KalmanPlaneSR
//
// Author:  R. Lee 2001.04.03
//
////////////////////////////////////////////////////////////////////////

#ifndef KALMANPLANESR_H
#define KALMANPLANESR_H

#include "TMatrixD.h"
#include "TObject.h"
#include "TVectorD.h"
#include "TVector.h"

#include "CandTrackSR/TrackClusterSR.h"
#include "Conventions/PlaneView.h"
#include "Navigation/XxxItr.h"

class AlgConfig;
class VldContext;

class KalmanPlaneSR  : public TObject
{

public:
  KalmanPlaneSR();                 // default ctor needed for ROOT I/O
  KalmanPlaneSR(TrackClusterSR *);
  KalmanPlaneSR(KalmanPlaneSR *);
  virtual ~KalmanPlaneSR();

  void Init(KalmanPlaneSR *);
  void InitKalman();

  Int_t GetPredictPlane(Int_t idir) const;
  void SetPredictPlane(Int_t plane, Int_t idir);

  Double_t GetPreStateValue(Int_t stateIndex, Int_t idir) const;
  void SetPreStateValue(Int_t stateIndex, Int_t idir, Double_t stateValue);

  Double_t GetFilStateValue(Int_t stateIndex, Int_t idir) const;
  void SetFilStateValue(Int_t stateIndex, Int_t idir, Double_t stateValue);

  Double_t GetGainValue(Int_t gainIndex, Int_t idir) const;
  void SetGainValue(Int_t gainIndex, Int_t idir, Double_t gainValue);

  Double_t GetPropagatorMatrixValue(Int_t idir, Int_t row, Int_t column) const;
  void SetPropagatorMatrixValue(Int_t idir, Int_t row, Int_t column, Double_t value);

  Double_t GetPreCovarianceMatrixValue(Int_t idir, Int_t row, Int_t column) const;
  void SetPreCovarianceMatrixValue(Int_t idir, Int_t row, Int_t column, Double_t value);

  Double_t GetFilCovarianceMatrixValue(Int_t idir, Int_t row, Int_t column) const;
  void SetFilCovarianceMatrix(Int_t idir, Double_t setMatrix[][5]);
  void SetFilCovarianceMatrixValue(Int_t idir, Int_t row, Int_t column, Double_t value);

  Double_t GetNoiseMatrixValue(Int_t idir, Int_t row, Int_t column) const;
  void SetNoiseMatrixValue(Int_t idir, Int_t row, Int_t column, Double_t value);

  Double_t GetPreChi2(Int_t idir) const;
  void SetPreChi2(Double_t chi2, Int_t idir);

  Double_t GetFilChi2(Int_t idir) const;
  void SetFilChi2(Double_t chi2, Int_t idir);

  Int_t GetZDir() const;
  void SetZDir(Int_t idir);

  Double_t GetRange() const;
  void SetRange(Double_t range);

  TrackClusterSR* GetTrackCluster() const;
  void SetTrackCluster(TrackClusterSR *cluster);

  const VldContext *GetVldContext();

  virtual Bool_t IsEquivalent(const TObject *rhs) const;

private:

  TVectorD fPreState[2];
  TVectorD fFilState[2];
  TVectorD fGain[2];

  TMatrixD fPropagator[2]; // actually the transpose of the propagator
  TMatrixD fPreCovariance[2];
  TMatrixD fFilCovariance[2];
  TMatrixD fNoise[2];

  Double_t fPreChi2[2];
  Double_t fFilChi2[2];

  Int_t fPredictPlane[2];

  Int_t fZDir; // +1 if +z is forward, -1 if -z is forward

  Double_t fRange; // mg/cm**2 from track end

  TrackClusterSR *fTrackCluster;
// KalmanPlaneSR does not own fTrackCluster; fTrackCluster should point
// into CandFitTrackSR->fTrackClusterList

ClassDef(KalmanPlaneSR,4)
};

XXXITRDEF(KalmanPlaneSR)

#endif// KALMANPLANESR_H
