#ifndef ALIITSU_H
#define ALIITSU_H
#include <TObjArray.h> // used in inline function GetChip.
#include "AliDetector.h"
#include "AliITSTrigger.h"
#include "AliITSUGeomTGeo.h"
class TString;
class TTree;
class AliITSUSDigit;
class AliITSUSimulation;
class AliITSsegmentation;
class AliITSUChip;
class AliITSCalibration;
class AliITSUHit;
class AliITSdigit;
class AliDigitizationInput;
class AliITSUSensMap;
class AliITSUSimuParam;
class AliITSUParamList;
class AliITSU : public AliDetector {
public:
enum {kNChipTypes = AliITSUGeomTGeo::kNChipTypes};
AliITSU();
AliITSU(const char *title, Int_t nlayers);
virtual ~AliITSU();
virtual Int_t IsVersion() const {return 11;}
virtual Int_t GetMajorVersion() const {return -1;}
virtual Int_t GetMinorVersion() const {return -1;}
virtual void GetGeometryVersion(Int_t &a,Int_t &b) const {a = GetMajorVersion();b=GetMinorVersion();return;}
virtual void SetEUCLID(Bool_t euclid=kTRUE) {fEuclidOut = euclid;}
virtual Bool_t GetEUCLID()const {return fEuclidOut;}
AliITSUGeomTGeo* GetITSGeomTGeo() const {return fGeomTGeo;}
AliITSUChip * GetChip(Int_t index) {return (AliITSUChip*)fChipHits->UncheckedAt(index);}
AliITSUSimuParam* GetSimuParam() const {return fSimuParam;}
virtual void Init();
virtual AliLoader* MakeLoader(const char* topfoldername);
virtual void MakeBranch(Option_t *opt=" ");
virtual void MakeBranchS(const char* fl);
virtual void MakeBranchD(const char* file);
virtual void MakeBranchInTreeD(TTree* treeD, const char* file=0);
virtual void SetTreeAddress();
virtual AliITSUSimulation* GetSimulationModel(Int_t lr) {return (AliITSUSimulation*)fSimModelLr[lr];}
virtual AliITSsegmentation* GetSegmentation(Int_t lr) {return (AliITSsegmentation*)fSegModelLr[lr];}
virtual AliITSUParamList* GetResponseParam(Int_t lr) {return (AliITSUParamList*)fResponseLr[lr];}
virtual void StepManager() {}
virtual void FillChips(Int_t bgrev, Option_t *opt, const char *filename);
virtual void FillChips(TTree *treeH, Int_t mask = 0);
virtual void ClearChips();
virtual void AddHit(Int_t track, Int_t *vol, Float_t *hits);
void InitSimulation();
AliDigitizer* CreateDigitizer(AliDigitizationInput* manager) const;
virtual void SDigits2Digits();
virtual void Hits2Digits();
virtual void Hits2SDigits();
virtual void Hits2Digits(Int_t evNumber,Int_t bgrev,Option_t *option, const char *filename);
virtual void Hits2SDigits(Int_t evNumber,Int_t bgrev,Option_t *option,const char *filename);
virtual void ResetSDigits() {if (fSDigits) fSDigits->Clear();}
virtual void ResetDigits();
virtual void ResetDigits(Int_t branch);
virtual void AddSumDigit(AliITSUSDigit &sdig);
virtual void AddSimDigit(Int_t branch, AliITSdigit *d);
virtual void AddSimDigit(Int_t branch,Float_t phys,Int_t* digits,Int_t* tracks,Int_t *hits,Float_t* trkcharges,Int_t sigexpanded=-1000);
TObjArray* GetDigits() const {return fDetDigits;}
TClonesArray *DigitsAddress(Int_t id) {return fDetDigits ? (TClonesArray*)fDetDigits->At(id) : 0;}
virtual void Hits2FastRecPoints(Int_t bgrev,Option_t *opr, const char *filename);
virtual Int_t Hits2Clusters(TTree *in, TTree *out);
virtual void CheckLabels(Int_t lab[3]) const;
virtual void Digits2Raw();
virtual Bool_t Raw2SDigits(AliRawReader*);
void WriteFOSignals();
void SetRunNumber(Int_t rn=0) {fRunNumber = rn;}
Int_t GetNLayers() const {return fNLayers;}
Int_t GetRunNumber() const {return fRunNumber;}
Bool_t IsSimInitDone() const {return fSimInitDone;}
protected:
void InitArrays();
const char* GetDigitClassName(Int_t i) {return Form("AliITSUDigit%s",AliITSUGeomTGeo::GetChipTypeName(i));}
const char* GetChipTypeName(Int_t i) {return AliITSUGeomTGeo::GetChipTypeName(i);}
protected:
Bool_t fEuclidOut;
Int_t fNLayers;
Int_t *fIdSens;
TString *fLayerName;
Bool_t fTiming;
AliITSUGeomTGeo* fGeomTGeo;
AliITSUSimuParam* fSimuParam;
TClonesArray** fModA;
TClonesArray* fpSDigits;
TClonesArray* fSDigits;
TClonesArray* fDetHits;
TObjArray* fChipHits;
TObjArray* fDetDigits;
AliITSUSensMap* fSensMap;
AliITSUSimulation **fSimModelLr;
AliITSsegmentation **fSegModelLr;
AliITSUParamList **fResponseLr;
TObjArray *fCalibration;
Int_t fRunNumber;
Bool_t fSimInitDone;
private:
AliITSU(const AliITSU &source);
AliITSU& operator=(const AliITSU &source);
ClassDef(AliITSU,1)
};
#endif