#ifndef ALITRDGEOMETRY_H
#define ALITRDGEOMETRY_H
#include "AliGeometry.h"
class TGeoHMatrix;
class AliTRDpadPlane;
class AliTRDgeometry : public AliGeometry {
public:
enum { kNlayer = 6
, kNstack = 5
, kNsector = 18
, kNdet = 540
, kNdets = 30 };
AliTRDgeometry();
virtual ~AliTRDgeometry();
virtual void CreateGeometry(Int_t *idtmed);
virtual Int_t IsVersion() { return 1; }
virtual Bool_t Impact(const TParticle* ) const { return kTRUE; }
virtual Bool_t IsHole(Int_t la, Int_t st, Int_t se) const;
virtual Bool_t IsOnBoundary(Int_t det, Float_t y, Float_t z, Float_t eps = 0.5) const;
virtual Bool_t RotateBack(Int_t det, const Double_t * const loc, Double_t *glb) const;
Bool_t ChamberInGeometry(Int_t det);
void AssembleChamber(Int_t ilayer, Int_t istack);
void CreateFrame(Int_t *idtmed);
void CreateServices(Int_t *idtmed);
static Bool_t CreateClusterMatrixArray();
static TGeoHMatrix *GetClusterMatrix(Int_t det);
void SetSMstatus(Int_t sm, Char_t status) { fgSMstatus[sm] = status; }
static Int_t GetDetectorSec(Int_t layer, Int_t stack);
static Int_t GetDetector(Int_t layer, Int_t stack, Int_t sector);
static Int_t GetLayer(Int_t det);
static Int_t GetStack(Int_t det);
Int_t GetStack(Double_t z, Int_t layer);
static Int_t GetSector(Int_t det);
static void CreatePadPlaneArray();
static AliTRDpadPlane *CreatePadPlane(Int_t layer, Int_t stack);
static AliTRDpadPlane *GetPadPlane(Int_t layer, Int_t stack);
static AliTRDpadPlane *GetPadPlane(Int_t det) { return GetPadPlane(GetLayer(det)
,GetStack(det)); }
static Int_t GetRowMax(Int_t layer, Int_t stack, Int_t );
static Int_t GetColMax(Int_t layer);
static Double_t GetRow0(Int_t layer, Int_t stack, Int_t );
static Double_t GetCol0(Int_t layer);
static Float_t GetTime0(Int_t layer) { return fgkTime0[layer]; }
static Double_t GetXtrdBeg() { return fgkXtrdBeg; }
static Double_t GetXtrdEnd() { return fgkXtrdEnd; }
Char_t GetSMstatus(Int_t sm) const { return fgSMstatus[sm]; }
static Float_t GetChamberWidth(Int_t layer) { return fgkCwidth[layer] ; }
static Float_t GetChamberLength(Int_t layer, Int_t stack) { return fgkClength[layer][stack]; }
virtual void GetGlobal(const AliRecPoint*, TVector3&, TMatrixF& ) const { };
virtual void GetGlobal(const AliRecPoint*, TVector3& ) const { };
static Double_t GetAlpha() { return 2.0
* 3.14159265358979324
/ fgkNsector; }
static Int_t Nsector() { return fgkNsector; }
static Int_t Nlayer() { return fgkNlayer; }
static Int_t Nstack() { return fgkNstack; }
static Int_t Ndet() { return fgkNdet; }
static Float_t Cheight() { return fgkCH; }
static Float_t CheightSV() { return fgkCHsv; }
static Float_t Cspace() { return fgkVspace; }
static Float_t CraHght() { return fgkCraH; }
static Float_t CdrHght() { return fgkCdrH; }
static Float_t CamHght() { return fgkCamH; }
static Float_t CroHght() { return fgkCroH; }
static Float_t CsvHght() { return fgkCsvH; }
static Float_t CroWid() { return fgkCroW; }
static Float_t AnodePos() { return fgkAnodePos; }
static Float_t MyThick() { return fgkRMyThick; }
static Float_t DrThick() { return fgkDrThick; }
static Float_t AmThick() { return fgkAmThick; }
static Float_t DrZpos() { return fgkDrZpos; }
static Float_t RpadW() { return fgkRpadW; }
static Float_t CpadW() { return fgkCpadW; }
static Float_t Cwidcha() { return (fgkSwidth2 - fgkSwidth1)
/ fgkSheight
* (fgkCH + fgkVspace); }
static Int_t MCMmax() { return fgkMCMmax; }
static Int_t MCMrow() { return fgkMCMrow; }
static Int_t ROBmaxC0() { return fgkROBmaxC0; }
static Int_t ROBmaxC1() { return fgkROBmaxC1; }
static Int_t ADCmax() { return fgkADCmax; }
static Int_t TBmax() { return fgkTBmax; }
static Int_t Padmax() { return fgkPadmax; }
static Int_t Colmax() { return fgkColmax; }
static Int_t RowmaxC0() { return fgkRowmaxC0; }
static Int_t RowmaxC1() { return fgkRowmaxC1; }
protected:
static const Int_t fgkNsector;
static const Int_t fgkNlayer;
static const Int_t fgkNstack;
static const Int_t fgkNdet;
static const Float_t fgkTlength;
static const Float_t fgkSheight;
static const Float_t fgkSwidth1;
static const Float_t fgkSwidth2;
static const Float_t fgkSlength;
static const Float_t fgkFlength;
static const Float_t fgkSMpltT;
static const Float_t fgkCraH;
static const Float_t fgkCdrH;
static const Float_t fgkCamH;
static const Float_t fgkCroH;
static const Float_t fgkCsvH;
static const Float_t fgkCH;
static const Float_t fgkCHsv;
static const Float_t fgkAnodePos;
static const Float_t fgkVspace;
static const Float_t fgkHspace;
static const Float_t fgkVrocsm;
static const Float_t fgkCalT;
static const Float_t fgkCalW;
static const Float_t fgkCalH;
static const Float_t fgkCalWmod;
static const Float_t fgkCalHmod;
static const Float_t fgkCwsW;
static const Float_t fgkCwsH;
static const Float_t fgkCclsT;
static const Float_t fgkCclfT;
static const Float_t fgkCglT;
static const Float_t fgkCcuTa;
static const Float_t fgkCcuTb;
static const Float_t fgkCauT;
static const Float_t fgkCroW;
static const Float_t fgkCpadW;
static const Float_t fgkRpadW;
static const Float_t fgkXeThick;
static const Float_t fgkDrThick;
static const Float_t fgkAmThick;
static const Float_t fgkWrThick;
static const Float_t fgkPPdThick;
static const Float_t fgkPPpThick;
static const Float_t fgkPGlThick;
static const Float_t fgkPCbThick;
static const Float_t fgkPHcThick;
static const Float_t fgkPPcThick;
static const Float_t fgkPRbThick;
static const Float_t fgkPElThick;
static const Float_t fgkRFbThick;
static const Float_t fgkRRhThick;
static const Float_t fgkRGlThick;
static const Float_t fgkRCbThick;
static const Float_t fgkRMyThick;
static const Float_t fgkDrZpos;
static const Float_t fgkAmZpos;
static const Float_t fgkWrZposA;
static const Float_t fgkWrZposB;
static const Float_t fgkCalZpos;
static const Int_t fgkMCMmax;
static const Int_t fgkMCMrow;
static const Int_t fgkROBmaxC0;
static const Int_t fgkROBmaxC1;
static const Int_t fgkADCmax;
static const Int_t fgkTBmax;
static const Int_t fgkPadmax;
static const Int_t fgkColmax;
static const Int_t fgkRowmaxC0;
static const Int_t fgkRowmaxC1;
static const Float_t fgkCwidth[kNlayer];
static const Float_t fgkClength[kNlayer][kNstack];
static const Double_t fgkTime0Base;
static const Float_t fgkTime0[kNlayer];
static const Double_t fgkXtrdBeg;
static const Double_t fgkXtrdEnd;
static TObjArray *fgClusterMatrixArray;
static TObjArray *fgPadPlaneArray;
static Char_t fgSMstatus[kNsector];
private:
AliTRDgeometry(const AliTRDgeometry &g);
AliTRDgeometry &operator=(const AliTRDgeometry &g);
ClassDef(AliTRDgeometry,25)
};
#endif