#ifndef ALIITSDETTYPEREC_H
#define ALIITSDETTYPEREC_H
#include <TObject.h>
#include <TClonesArray.h>
#include <TBits.h>
class TObjArray;
class TTree;
class TBranch;
class AliITSgeom;
class AliITSsegmentation;
class AliITSCalibration;
class AliITSCalibrationSSD;
class AliITSresponseSDD;
class AliITSClusterFinder;
class AliITSRecPoint;
class AliRawReader;
class AliITSGainSSDv2;
class AliITSBadChannelsSSDv2;
class AliITSDDLModuleMapSDD;
class AliITSNoiseSSDv2;
class AliITSTriggerConditions;
class AliITSFOSignalsSPD;
class AliITSRecPointContainer;
class AliITSDetTypeRec : public TObject {
public:
AliITSDetTypeRec();
virtual ~AliITSDetTypeRec();
virtual AliITSgeom* GetITSgeom() const { return fITSgeom; }
virtual void SetITSgeom(AliITSgeom* const geom) { fITSgeom = geom; }
virtual void SetDefaults();
virtual void SetDefaultClusterFindersV2(Bool_t rawdata=kFALSE,Bool_t fastSDD=kFALSE);
virtual void MakeBranch(TTree *tree,Option_t *opt);
virtual void SetTreeAddressD(TTree* const treeD);
virtual void SetSegmentationModel(Int_t dettype, AliITSsegmentation *seg);
virtual void SetCalibrationModel(Int_t iMod, AliITSCalibration *cal);
virtual void SetSPDDeadModel(Int_t iMod, AliITSCalibration *cal);
virtual void SetSPDSparseDeadModel(Int_t iMod, AliITSCalibration *cal);
virtual void SetReconstructionModel(Int_t dettype, AliITSClusterFinder *rec);
virtual Bool_t GetCalibration();
virtual AliITSsegmentation* GetSegmentationModel(Int_t dettype) const;
virtual AliITSCalibration* GetCalibrationModel(Int_t iMod) const;
virtual AliITSCalibration* GetSPDDeadModel(Int_t iMod) const;
virtual AliITSCalibration* GetSPDSparseDeadModel(Int_t iMod) const;
virtual AliITSTriggerConditions* GetTriggerConditions() const;
virtual AliITSClusterFinder* GetReconstructionModel(Int_t dettype) const;
virtual AliITSDDLModuleMapSDD* GetDDLModuleMapSDD() const { return fDDLMapSDD;}
virtual AliITSresponseSDD* GetResponseSDD() const { return fRespSDD;}
virtual Float_t GetAverageGainSDD() const {
if(fAveGainSDD>0.) return fAveGainSDD;
else return 1.;
}
virtual void SetDigitClassName(Int_t i,const Char_t *digit)
{fkDigClassName[i]=digit;}
virtual void SetLoadOnlySPDCalib(Bool_t opt=kFALSE)
{fLoadOnlySPDCalib=opt;}
const Char_t* GetDigitClassName(Int_t i) const {return fkDigClassName[i];}
TObjArray* GetDigits() const {return fDigits;}
TClonesArray *DigitsAddress(Int_t id) const {return ((TClonesArray*)(*fDigits)[id]);}
AliITSFOSignalsSPD* GetFOSignals() const {return fFOSignals;}
TBranch* MakeBranchInTree(TTree* const tree, const char* name, const char *classname, void* address,Int_t size, Int_t splitlevel);
virtual void ResetDigits();
virtual void ResetDigits(Int_t branch);
void MakeBranchR(TTree *treeR,Option_t *opt=" ");
void SetTreeAddressR(TTree* const treeR);
void AddRecPoint(const AliITSRecPoint &p);
void MakeBranchRF(TTree *treeR){MakeBranchR(treeR,"Fast");}
void DigitsToRecPoints(TTree *treeD,TTree *treeR,Int_t lastEntry,Option_t *det, Int_t optCluFind=0);
void DigitsToRecPoints(AliRawReader* rawReader,TTree *treeR,Option_t *det="All");
void DigitsToRecPoints(AliRawReader* rawReader,Option_t *opt);
void SetFastOrFiredMapOnline(UInt_t eq, UInt_t hs, UInt_t chip);
void SetFastOrFiredMap(UInt_t chipKey){fFastOrFiredMap.SetBitNumber(chipKey);}
TBits GetFastOrFiredMap() const {return fFastOrFiredMap;}
TBits GetFiredChipMap() const;
TBits GetFiredChipMap(TTree *treeR) const;
void ResetFastOrFiredMap(){fFastOrFiredMap.ResetAllBits();}
void RemoveFastOrFiredInActive();
void RemoveFastOrFiredFromDead(TBits firedchipmap);
private:
AliITSDetTypeRec(const AliITSDetTypeRec& rec);
AliITSDetTypeRec& operator=(const AliITSDetTypeRec &source);
void ReadOldSSDNoise(const TObjArray *array,
AliITSNoiseSSDv2 *noiseSSD);
void ReadOldSSDBadChannels(const TObjArray *array,
AliITSBadChannelsSSDv2 *badChannelsSSD);
void ReadOldSSDGain(const TObjArray *array,
AliITSGainSSDv2 *gainSSD);
virtual Bool_t GetCalibrationSPD(Bool_t cacheStatus);
virtual Bool_t GetCalibrationSDD(Bool_t cacheStatus);
virtual Bool_t GetCalibrationSSD(Bool_t cacheStatus);
void ResetRecPoints(){if(fRecPoints) fRecPoints->Clear();fNRecPoints = 0;};
static const Int_t fgkNdettypes;
static const Int_t fgkDefaultNModulesSPD;
static const Int_t fgkDefaultNModulesSDD;
static const Int_t fgkDefaultNModulesSSD;
Int_t *fNMod;
AliITSgeom *fITSgeom;
TObjArray *fReconstruction;
TObjArray *fSegmentation;
TObjArray *fCalibration;
AliITSCalibrationSSD* fSSDCalibration;
TObjArray *fSPDDead;
TObjArray *fSPDSparseDead;
AliITSTriggerConditions *fTriggerConditions;
TObjArray *fDigits;
AliITSFOSignalsSPD *fFOSignals;
AliITSDDLModuleMapSDD *fDDLMapSDD;
AliITSresponseSDD *fRespSDD;
Float_t fAveGainSDD;
const Char_t* fkDigClassName[3];
TClonesArray *fRecPoints;
Int_t fNRecPoints;
Bool_t fFirstcall;
Bool_t fLoadOnlySPDCalib;
TBits fFastOrFiredMap;
ClassDef(AliITSDetTypeRec,20)
};
#endif