// LCDTrjPart  For particle extrapolator  
//
// Assume all relevant volumes are either barrels or endcaps, in any
// case cylinders
//

#ifndef LCDTRJPART_H
#define LCDTRJPART_H

#include "TMath.h"
#include "TObject.h"
#include "LCDGetParameters.h"
#include "LCDDetectorVolume.h"
#include "LCDSwimTraj.h"
#include "LCDEvent.h"
#include "LCDTrack.h"
#include "LCDMcPart.h"

//=========================================================
class LCDTrjPart :public TObject {

 private:
  LCDSwimTraj        traj;
  LCDDetectorVolume* pVolumes;       // Array of detector volumes
  LCDDetectorVolume* pInnerVolume;   // Innermost volume about IP
  Int_t              nVolumes;       // Number of detector volumes in array
  Int_t              f_dblevel;      //debug level
  
  void Init();

 public:
  LCDTrjPart();
  LCDTrjPart(LCDGetParameters* gp);
  ~LCDTrjPart() {};
  
  void SetDetectorParameters(LCDGetParameters* gp);

  void Swim(Int_t charge, const TVector3& momentum, const TVector3& position, 
	    Int_t barend, Double_t tRZ);
  
  void Swim(LCDEvent* event, Int_t itrk, Int_t barend, Double_t tRZ);
  void Swim(LCDTrack* trk, LCDMcPart* mcp, Int_t barend, Double_t tRZ);
  
  TVector3  GetPos()    { return traj.GetNewPos();    }
  TVector3* GetPosPtr() { return traj.GetNewPosPtr(); }
  TVector3  GetMom()    { return traj.GetNewMom();    }
  TVector3* GetMomPtr() { return traj.GetNewMomPtr(); }
  Double_t  GetS()      { return traj.GetS(); }

  Int_t     GetDebugLevel() { return f_dblevel; }
  void      SetDebugLevel(Int_t a) { f_dblevel=a; }
  
  LCDSwimTraj* GetSwimTrjPtr() { return &traj; }
  
  void CalcPOCA(Double_t  qMC, Double_t  bfld_z,
		const TVector3& p_orig, const TVector3&  x_orig, 
		TVector3& p_poca, TVector3& x_poca);
  
  ClassDef(LCDTrjPart,0)  // Particle Extrapolator
};
#endif


