////////////////////////////////////////////////////////////////////////
// Package: CandTrackCam
//
// AlgTrackCamList
//
// marshall@hep.phy.cam.ac.uk
////////////////////////////////////////////////////////////////////////
#ifndef ALGTRACKCAMLIST_H
#define ALGTRACKCAMLIST_H

#include "Algorithm/AlgBase.h"
#include <vector>
#include "Validity/VldContext.h"

using std::vector;

class HitCam;
class ClusterCam;
class TrackSegmentCam;
class TrackCam;


class AlgTrackCamList : public AlgBase
{
  
 public:
  AlgTrackCamList();
  virtual ~AlgTrackCamList();
  virtual void RunAlg(AlgConfig &ac, CandHandle &ch, CandContext &cx);
  virtual void Trace(const char *c) const;

  void RunTheFinder(CandSliceHandle* slice);
  void FormTheHits(CandSliceHandle* slice);
  void FormTheClusters();
  void IDTrkAndShwClusters();
  void FormTriplets();
  void FindAllAssociations();
  void FindPreferredJoins();
  void FindMatchedJoins();
  void FirstUVComparison();
  void Form2DTracks();
  void Join2DTracks();
  void SecondUVComparison();
  void Form3DTracks(CandSliceHandle* slice);
  void LookForHitsAcrossGap(TrackCam* Trk);
  void ExtendTrack(TrackCam* Trk);
  void FillGapsInTrack(TrackCam* Trk);
  void NearDetectorTriplets();
  void ClearUp();
  void MatchUV(TrackCam* trku, TrackCam* trkv);

 private:
  vector<HitCam*> AllHitBank[500];

  vector<HitCam*> HitBank[500];

  vector<HitCam*> HitsInTracks[2];

  vector<ClusterCam*> ClusterBank[500];

  vector<ClusterCam*> ClusterList[500];

  vector<TrackSegmentCam*> SegmentBank[500];
  vector<TrackSegmentCam*> NDSegmentBank[500];
  
  vector<TrackSegmentCam*> ViewSegBank[2];
  vector<TrackSegmentCam*> TempTrack[2];

  vector<TrackSegmentCam*> PossibleJoins[2];

  vector<TrackCam*> FinalTrackBank[2];


  VldContext *vldc;
  int NumModules;
  int PlanesInModule;
  int ModuleType;
  const double StripWidth;

  double PECut, PECut2;

  bool CambridgeAnalysis;


ClassDef(AlgTrackCamList,1)  // TrackCamList Algorithm Class
    
};

#endif // ALGTRACKCAMLIST
