#ifndef HALIGNMENTGBASE_H
#define HALIGNMENTGBASE_H
#include "TObject.h"
#include "hsymmat.h"
#include "fstream"
#include "iostream"
#include "TString.h"
#include "halignmentgparticle.h"
#include "hgeomtransform.h"
#include "TNtuple.h"
class TClonesArray;
class HAlignmentGGeom;
class HAlignmentGRotations;
class TH2F;
class TH1F;
class TMinuit;
class TFile;
class HAlignmentGBase:public TObject
{
 public:
  
  HAlignmentGBase();
  virtual  ~HAlignmentGBase();  
  
  virtual void    CollectTracks()                            = 0;
  virtual void    ResetCounts()                              = 0;
  virtual Bool_t  AddToClones()                              = 0;
  virtual void    FillHistograms()                           = 0;
  virtual HGeomTransform Align(const Int_t &, const Int_t &) = 0;
  
  
  virtual void SetNtBranches()                                    = 0;
  
  HAlignmentGGeom*       GetAlignGeom() const     {return  fAlignGeom; }
  HAlignmentGRotations*  GetAlignRot () const     {return  fAlignRot ; }
  Int_t GetCloneSize () const {return cloneSize;}
  Int_t GetHistoNumbers () const {return histoNumbers;}
  
  TClonesArray* GetAlignTracks() const {return alignTracks;}
  TClonesArray* GetHistoClones() const {return histoClones;}
  
  Int_t GetUsedMod() const {return UsedMod;}
  Int_t GetUsedSec() const {return UsedSec;}
  void  SetNtuple(TNtuple *_nt) {nt=_nt; ntEntries = nt-> GetEntries();}
  TNtuple* GetNtuple() const {return nt;}
  
  void GetPoints(void (*pFunc)(Float_t &, Float_t &, Float_t &, Float_t &, HGeomVector &, HGeomVector &),Float_t &, Float_t &, Float_t &, Float_t &, HGeomVector &, HGeomVector &);
  
  
  
  
 protected:
  
  TClonesArray* alignTracks;
  TClonesArray* histoClones;
  Int_t histoNumbers;
  
  TFile *ff;
  TNtuple *nt;
  TMinuit *fMinuit;
  Int_t UsedMod;
  Int_t UsedSec;
  HAlignmentGGeom *fAlignGeom;
  HAlignmentGRotations *fAlignRot;
  HGeomTransform transBefore, transAfter;
  Int_t cloneSize;
  Int_t ntEntries;
  ClassDef(HAlignmentGBase,0)
    };   
#endif