// $Header: LCDSmearTrack.h $

#ifndef LCDSMEARTRACK_H
#define LCDSMEARTRACK_H

#include "TRandom.h"
#include "TMatrixD.h"
#include "TVector3.h"

#include "LCDTrack.h"
#include "LCDMcPart.h"
#include "LCDLookUp2d.h"
#include "LCDGetParameters.h"
#include "LCDGetTrackLookups.h"

class LCDSmearTrack : public TObject  {

public:
  LCDSmearTrack();//constructor;
  LCDSmearTrack(LCDGetParameters* gp,char* smearFileName);  // constructor
  ~LCDSmearTrack();

  void SetUp(LCDGetParameters* gp, char* smearFileName);

  void SmearTrack(LCDMcPart* p, Int_t index, Int_t index0, 
		  LCDGetParameters* gp, LCDTrack* tk);

  LCDGetParameters* GetParameters() { return m_parameters; } 
  // Get parameters class

  LCDLookUp2d* GetSmearTable(Int_t i) { return smear_parNum[i]; }
  // Get barrel lookup table
  
private:
  TRandom             m_random;         // random numbers for smearing
  LCDGetParameters*   m_parameters;     // parameters class
  LCDLookUp2d*        smear_parNum[15]; // lookup tables for smearing
  LCDGetTrackLookups* m_TkLook;   

  void Init();

  void FindEigen(TMatrixD& Source, 
		 TMatrixD& RotationMatrix,
		 TMatrixD& EigenValues);
  
  void CalcPOCA(Double_t  qMC,
		Double_t  bfld_z,
		TVector3  p_orig, 
		TVector3  x_orig, 
		TVector3& p_poca, 
		TVector3& x_poca);
  
  void CalcSmearParameters(Double_t*      m_eparm,
			   Double_t*      d_parm,
			   Double_t       bfld_z,
			   Double_t       pTot,
			   Double_t       abscth,
			   LCDGetParameters* gp,
			   LCDLookUp2d**     par,
			   Double_t*      chi2);

  void CalcTrackParameters(Double_t qMC,
			   Double_t bfld_z,
			   TVector3 capMC,
			   TVector3 caxMC,
			   Double_t* tkpar);
public:
  ClassDef(LCDSmearTrack,1) // Smears tracks using lookup tables for resolution
};

#endif
