////////////////////////////////////////////////////////////////////////
// $Id: CandFitTrackSR.h,v 1.19 2006/06/21 00:51:12 rhatcher Exp $
//
// CandFitTrackSR
//
// Concrete CandFitTrackSR class descended from CandFitTrack.
//
// Author:  R. Lee 2001.03.30
////////////////////////////////////////////////////////////////////////

#ifndef CANDFITTRACKSR_H
#define CANDFITTRACKSR_H

#include "RecoBase/CandFitTrack.h"

#include "TMatrixD.h"
#include "TVectorD.h"

#include <map>

using namespace std;

class AlgHandle;
class CandContext;
class KalmanPlaneSR;
class TrackClusterSR;
class CandFitTrackSRHandle;

class CandFitTrackSR : public CandFitTrack
{
  friend class CandFitTrackSRHandle;

public:
  static CandFitTrackSRHandle MakeCandidate(AlgHandle &ah,
                                                       CandContext &cx);
  CandFitTrackSR();

  virtual std::ostream& FormatToOStream(std::ostream& os,
                                        Option_t *option="") const;

protected:
  CandFitTrackSR(AlgHandle &ah);
  CandFitTrackSR(AlgHandle &ah, CandHandle &ch, CandContext &cx);
  CandFitTrackSR(const CandFitTrackSR &rhs);
  virtual ~CandFitTrackSR();
  virtual void CreateLocalHandle();
  virtual CandFitTrackSR *Dup() const;

  void Init();

  virtual Bool_t IsEquivalent(const TObject *rhs) const;

  TObjArray *fPlaneList;
  TObjArray *fTrackClusterList;

  KalmanPlaneSR *fCurrent;
  KalmanPlaneSR *fCurrentU;
  KalmanPlaneSR *fCurrentV;

  Double_t fInitialQP;
  Int_t fNChangedFitPoint;
  Int_t fVtxExtrapolate[2]; // no. of planes extrapolated to beg hit pln
  Int_t fEndExtrapolate[2]; // no. of planes extrapolated to end hit pln

  mutable map<TrackClusterSR *,Bool_t> fBadFit;  //true if track cluster does not fit well
  mutable map<Int_t,Float_t> fPlanePreChi2; // filtered chi2 at this pln
  mutable map<Int_t,Float_t> fdUdZ;
  mutable map<Int_t,Float_t> fdVdZ;

ClassDef(CandFitTrackSR,13)
};

#endif                                               // CANDFITTRACKSR_H
