////////////////////////////////////////////////////////////////////////
// $Id: CandFitTrackSRHandle.h,v 1.21 2005/12/07 14:15:55 musser Exp $
//
// CandFitTrackSRHandle
//
// CandFitTrackSRHandle is the specialized access handle to CandFitTrackSR.
//
// Each concrete CandHandle must define a DupHandle function.
//
// Author:  R. Lee 2001.03.30
//
////////////////////////////////////////////////////////////////////////

#ifndef CANDFITTRACKSRHANDLE_H
#define CANDFITTRACKSRHANDLE_H

#include "Conventions/PlaneView.h"
#include "Navigation/XxxItr.h"
#include "RecoBase/CandFitTrackHandle.h"

class CandFitTrackSR;
class TrackClusterSR;
class KalmanPlaneSR;
class AlgConfig;

class CandFitTrackSRHandle : public CandFitTrackHandle
{

public:
  CandFitTrackSRHandle();
  CandFitTrackSRHandle(const CandFitTrackSRHandle &csh);
  CandFitTrackSRHandle(CandFitTrackSR *cs);
  virtual ~CandFitTrackSRHandle();
  virtual CandFitTrackSRHandle *DupHandle() const;

  virtual void Trace(const char *c = "") const;
 
  // in general KalmanPlaneList owns objects in list, so be careful
  // if calling ClearKalmanPlaneList with argument 0
  void ClearKalmanPlaneList(Bool_t deletekp = 1);
  void ClearTrackClusterList();
  void ClearMaps(); // clears all STL maps, including fd*dZ, fPlaneChi2, fPlanePreChi2, fPlaneQP

// this creates a new TrackClusterSR which is destroyed in the
// CandFitTrackSR destructor
  void AddTrackCluster(TrackClusterSR *);

  TObjArray * GetPlaneList();
  TObjArray * GetTrackClusterList();

  Int_t GetKalmanLast() const;
  KalmanPlaneSR *GetKalmanPlane(Int_t);
  const KalmanPlaneSR *GetKalmanPlane(Int_t) const;
 void RemoveKalmanPlane(Int_t,Int_t);
  void CompressKalmanPlaneList();
  KalmanPlaneSR * AddKalmanPlaneAt(KalmanPlaneSR *,Int_t);
  void RemoveForward(KalmanPlaneSR *kp = 0);
  const KalmanPlaneSR *GetCurrentKalmanPlane(PlaneView::PlaneView_t = 
					     PlaneView::kUnknown) const;
  KalmanPlaneSR *GetCurrentKalmanPlane(PlaneView::PlaneView_t = 
				       PlaneView::kUnknown);
  void SetCurrentKalmanPlane(KalmanPlaneSR*);
  void AddUpstreamPlaneList(TObjArray*);

  void SetNChangedFitPoint(Int_t);
  void SetInitialQP(Double_t);
  void SetVtx(const KalmanPlaneSR *); // set vertex variables
  void SetEnd(const KalmanPlaneSR *); // set vertex variables
  void SetPlanePreChi2(Int_t,Double_t);
  void SetVtxExtrapolate(Int_t,PlaneView::PlaneView_t);
  void SetEndExtrapolate(Int_t,PlaneView::PlaneView_t); 
  void SetdUdZ(Int_t,Float_t);
  void SetdVdZ(Int_t,Float_t);
  Float_t GetdUdZ(Int_t) const; // du/dz at specified plane
  Float_t GetdVdZ(Int_t) const; // dv/dz at specified plane
  void SetBadFit(TrackClusterSR *);
  Double_t GetInitialQP() const;
  Int_t GetNChangedFitPoint();
  Bool_t GetBadFit(Int_t) const;
  Bool_t GetBadFit(TrackClusterSR *) const;
  Int_t GetNGoodFit() const;
  Float_t GetPlanePreChi2(Int_t) const;
  Int_t GetNChangedFitPoint() const;
  Int_t GetVtxExtrapolate(PlaneView::PlaneView_t = PlaneView::kUnknown) const;
  Int_t GetEndExtrapolate(PlaneView::PlaneView_t = PlaneView::kUnknown) const;


private:

ClassDef(CandFitTrackSRHandle,5)           // User access handle to CandFitTrackSR

};

XXXITRDEF(CandFitTrackSRHandle)

#endif // CANDFITTRACKSRHANDLE_H
