////////////////////////////////////////////////////////////////////////
// Package: CandTrackCam
//
// AlgTrackCam.h
//
// marshall@hep.phy.cam.ac.uk
////////////////////////////////////////////////////////////////////////
#ifndef ALGTRACKCAM_H
#define ALGTRACKCAM_H

#include "Algorithm/AlgBase.h"
#include "CandTrackCam/CandTrackCamHandle.h"
#include "RecoBase/CandStripHandle.h"
#include "RecoBase/AlgReco.h"
#include "RecoBase/AlgTrack.h"
#include <vector>
//#include "Validity/VldContext.h"

using std::vector;

class TrackCam;
class HitCam;
class UgliGeomHandle;
class VldContext;
typedef struct{
  double U; 
  double V; 
  double Z; 
  double Q; 
  double dS;
  double dSsteel;
  double Qm; 
  double Qp; 
  double CTm;
  double CTp; 
  double Wm; 
  double Wp; 
  int plnvuw;
  int plnnum;
}TrkPlaneInfo;

class AlgTrackCam : public AlgBase, public AlgReco, public AlgTrack
{
  
 public:
  AlgTrackCam();
  virtual ~AlgTrackCam();

  virtual void RunAlg(AlgConfig &ac, CandHandle &ch, CandContext &cx);
  virtual void Trace(const char *c) const;


 private:
  vector <TrkPlaneInfo> fPlaneInfo;
  vector<HitCam*> fHitArr[500]; //contains all the HitCam pointers from the TrackCam objects sorted by plane

  void CalculateTimingFits(double& dir, double& mytimeoffset, CandTrackHandle& cth);
  bool CalculateTrace(double* m, double* c, double* Coord, double* Trace);
  void DetectorSides(double* m, double* c, double* position, int side);
  void ExtractHitProperties(const TrackCam* trkc, const int& bpln, CandTrackHandle& cth);
  void InterpolateTrackPosition();
  void SetTrackCoordinates(const int& bpln, int& plnm, int& plnp/*, CandTrackHandle& cth*/);
  void SetupTimingInfo(UgliGeomHandle* ugh, const double& fFibreIndex);
  void SetVertexEndProperties( double* Coord,  double* Dir, const int& end, const int& coordpln);
  void WeightsForTimingFits();

  int ModuleType, MaxPlane, MinPlane;
  int begplane1, begplane2, endplane2, endplane1;
  double StripListTime;

  bool BeamFlag, PassTrack;

  ClassDef(AlgTrackCam,2)   // TrackCam Algorithm Class
};
    
#endif   // ALGTRACKCAM_H 
