#ifndef ALITPC_H
#define ALITPC_H
class TFile;
class TTree;
#include <Htypes.h>
#include <TMatrixFfwd.h>
#include <TVector.h>
class AliTPCDigitsArray;
class AliTPCLoader;
class AliTPCParam;
class AliTPCTrackHitsV2;
class AliRawReader;
class TTreeSRedirector;
#include "AliDetector.h"
#include "AliDigit.h"
#include "AliHit.h"
using std::fstream;
class AliTPC : public AliDetector {
public:
AliTPC();
AliTPC(const char *name, const char *title);
virtual AliLoader* MakeLoader(const char* topfoldername);
void CreateDebugStremer();
virtual ~AliTPC();
virtual void AddHit(Int_t a1, Int_t *a2, Float_t *a3);
virtual void CreateGeometry() {}
virtual void CreateMaterials();
virtual void AddAlignableVolumes() const {}
virtual AliDigitizer* CreateDigitizer(AliDigitizationInput* digInput) const;
virtual void SDigits2Digits(){;}
virtual void SDigits2Digits2(Int_t eventnumber=0);
virtual void Hits2SDigits();
virtual void Hits2SDigits2(Int_t eventnumber=0);
virtual void Hits2Digits();
virtual void Hits2Digits(Int_t eventnumber);
virtual void Hits2DigitsSector(Int_t isec);
virtual void Init();
virtual Int_t IsVersion() const =0;
virtual void Digits2Raw();
virtual Bool_t Raw2SDigits(AliRawReader* rawReader);
Int_t GetNsectors() const {return fNsectors;}
virtual void ResetDigits();
virtual void SetSens(Int_t sens);
virtual void SetSide(Float_t side);
virtual void SetGEM(Int_t isGEM) {fIsGEM=isGEM; }
virtual void StepManager()=0;
AliTPCDigitsArray* GetDigitsArray() {return fDigitsArray;}
AliTPCParam *GetParam(){return fTPCParam;}
void SetParam(AliTPCParam *param){fTPCParam=param;}
void SetDigitsArray(AliTPCDigitsArray* param) {fDigitsArray=param;}
virtual void MakeBranch(Option_t *opt=" ");
virtual void SetTreeAddress();
virtual void SetTreeAddress2();
virtual void AddHit2(Int_t a1, Int_t *a2, Float_t *a3);
virtual void ResetHits();
virtual void ResetHits2();
virtual AliHit* FirstHit(Int_t track);
virtual AliHit* NextHit();
virtual AliHit* FirstHit2(Int_t track);
virtual AliHit* NextHit2();
virtual void FinishPrimary();
virtual void RemapTrackHitIDs(Int_t *map);
void SetHitType(Int_t type){fHitType =type;}
void SetDigitsSwitch(Int_t sw){fDigitsSwitch = sw;}
void SetDefSwitch(Int_t def){fDefaults = def;}
Float_t GetNoise();
void GenerNoise(Int_t tablasize);
Bool_t IsSectorActive(Int_t sec) const;
void SetActiveSectors(Int_t * sectors, Int_t n);
Int_t GetHitType() const {return fHitType;}
void SetActiveSectors(Int_t flag=1);
Bool_t TrackInVolume(Int_t id,Int_t track);
void SetPrimaryIonisation(Bool_t flag = kTRUE) {fPrimaryIonisation = flag;}
void SetGainFactor(Float_t gain){fGainFactor=gain;}
Float_t GetGainFactor()const {return fGainFactor;}
void SetLHCclockPhase(Int_t sw){fLHCclockPhaseSw = sw;}
static AliTPCParam* LoadTPCParam(TFile *file);
protected:
Int_t fDefaults;
Int_t fSens;
Int_t fNsectors;
AliTPCDigitsArray * fDigitsArray;
AliTPCParam *fTPCParam;
AliTPCTrackHitsV2 *fTrackHits;
Int_t fHitType;
Int_t fDigitsSwitch;
Float_t fSide;
Bool_t fPrimaryIonisation;
protected:
AliTPC(const AliTPC& t);
AliTPC &operator = (const AliTPC & param);
void SetDefaults();
void DigitizeRow(Int_t irow,Int_t isec,TObjArray **rowTriplet);
Float_t GetSignal(TObjArray *p1, Int_t ntr, TMatrixF *m1,
TMatrixF *m2,Int_t *IndexRange);
void GetList (Float_t label,Int_t np,TMatrixF *m,Int_t *IndexRange,
Float_t **pList);
void MakeSector(Int_t isec,Int_t nrows,TTree *TH,Stat_t ntracks,TObjArray **row);
void TransportElectron(Float_t *xyz, Int_t *index);
Int_t fCurrentIndex[4];
Int_t fNoiseDepth;
Float_t * fNoiseTable;
Int_t fCurrentNoise;
Bool_t* fActiveSectors;
Float_t fGainFactor;
TTreeSRedirector *fDebugStreamer;
Int_t fLHCclockPhaseSw;
Int_t fIsGEM;
ClassDef(AliTPC,14)
};
class AliTPChit : public AliHit {
public:
Int_t fSector;
Int_t fPadRow;
Float_t fQ ;
Float_t fTime;
public:
AliTPChit();
AliTPChit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits);
virtual ~AliTPChit() {}
void SetX(Float_t x){fX = x;}
void SetY(Float_t y){fY = y;}
void SetZ(Float_t z){fZ = z;}
Float_t Time() const {return fTime;}
ClassDef(AliTPChit,3)
};
#endif