-#ifndef RICH_H
-#define RICH_H
+#ifndef AliRICH_h
+#define AliRICH_h
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+/* $Id$ */
+
+
////////////////////////////////////////////////
// Manager and hits classes for set:RICH //
////////////////////////////////////////////////
-
-#include "AliDetector.h"
-#include "AliHit.h"
-class AliRICH : public AliDetector {
-
-protected:
- Int_t fNmips; //Number of mips in RICH
- Int_t fNckovs; //Number of cerenkovs in RICH
- Int_t fNpadhits; //Number of pad hits in RICH
-
- TClonesArray *fMips; //List of mips
- TClonesArray *fCkovs; //List of cerenkovs
- TClonesArray *fPadhits; //List of Padhits
-
- Float_t fChslope; //Charge slope
- Float_t fAlphaFeed; //Feed-back coefficient
- Float_t fSxcharge; //Charge slope along x
- Int_t fIritri; //Trigger flag
+#include <TObjArray.h>
+#include <AliDetector.h>
+#include <AliRICHConst.h>
+#include <AliRICHChamber.h>
+static const int kNCH=7;
-public:
- AliRICH();
- AliRICH(const char *name, const char *title);
- virtual ~AliRICH();
- virtual void AddHit(Int_t, Int_t*, Float_t*);
- virtual void AddMipHit(Int_t, Int_t*, Float_t*);
- virtual void AddCkovHit(Int_t, Int_t*, Float_t*);
- virtual void AddPadHit(Int_t, Int_t*, Float_t*);
- virtual void BuildGeometry();
- virtual void CreateGeometry() {}
- virtual void CreateMaterials() {}
- Int_t DistancetoPrimitive(Int_t px, Int_t py);
- inline virtual int GetNmips() {return fNmips;}
- inline virtual int GetNckovs() {return fNckovs;}
- inline virtual int GetNpadhits() {return fNpadhits;}
- virtual Int_t IsVersion() const =0;
- virtual void Init();
- inline TClonesArray *Mips() {return fMips;}
- inline TClonesArray *Ckovs() {return fCkovs;}
- inline TClonesArray *Padhits() {return fPadhits;}
- void FinishEvent(void){;}
- virtual void MakeBranch(Option_t *);
- void SetTreeAddress(void);
- virtual void StepManager();
- virtual void PreTrack();
-
- virtual void SetSP(Float_t chslope){ fChslope=chslope;}
- virtual void SetFEED(Float_t alphafeed){fAlphaFeed=alphafeed;}
- virtual void SetSIGM(Float_t sxcharge){fSxcharge=sxcharge;}
- virtual void SetTRIG(Int_t iritri) {fIritri=iritri;}
- virtual void ResetHits();
- virtual void UpdateMipHit(Float_t*);
- virtual void RichIntegration();
- virtual void AnodicWires(Float_t &);
- virtual void GetChargeMip(Float_t &);
- virtual void GetCharge(Float_t &);
- virtual void FeedBack(Float_t *, Float_t );
- virtual Float_t FMathieson(Float_t , Float_t );
-
- ClassDef(AliRICH,1) // Base class for RICH
-};
-
-class AliRICHv1 : public AliRICH {
-
-public:
- AliRICHv1();
- AliRICHv1(const char *name, const char *title);
- virtual ~AliRICHv1();
- virtual void CreateGeometry();
- virtual void CreateMaterials();
- virtual Int_t IsVersion() const {return 1;}
- virtual void DrawDetector();
-
-
- ClassDef(AliRICHv1,1) // RICH version 1
-};
-
-//_____________________________________________________________________________
-class AliRICHhit: public AliHit {
-public:
- Int_t fVolume[2]; //array of volumes
-
- //Pad informations
- Int_t fFirstpad; //First index in padhits
- Int_t fLastpad; //Last index in padhits
-
- //Hit information
- Int_t fModule; //Module number
- Float_t fTheta; //Theta of the particle generating the hit
-
- Float_t fArrivaltime;// Time of hit.
- Int_t fPart; //Particle type
-
- // we don't know what is this for :
- Int_t fFeed; //Type of feedback (origin of charge deposition)
-
-public:
- AliRICHhit() {}
- AliRICHhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits,
- Int_t fNpadhits);
- virtual ~AliRICHhit(){}
-
- void SetLastpad(Int_t lastpad){fLastpad=lastpad;}
-
- ClassDef(AliRICHhit,1) // Hits for set RICH
-};
-
-//_____________________________________________________________________________
-class AliRICHmip: public AliRICHhit
-{
-public:
- // Hit information keep
- Float_t fPhi; //Phi of the particle generating the hit
- Float_t fPs; //Momentum of the particle generating the hit
- Float_t fQ; //Charge of the particle
-
- // Generated cerenkov information (Z of generation stored in fZ of AliHit)
- Int_t fFirstCkov; //Index in the ckov TcloneArray of the first generated
- Int_t fLastCkov; //Here the last.
-
-public:
- AliRICHmip() {}
- AliRICHmip(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits,
- Int_t fNckovs, Int_t fNpadhits);
- virtual ~AliRICHmip() {}
-
- Float_t GetZ() { return fZ;}
- void SetX(Float_t x) { fX = x; }
- void SetY(Float_t y) { fY = y; }
- void SetZ(Float_t z) { fZ = z; }
- void SetLastCkov(Int_t last){ fLastCkov = last; }
- void SetModule(Int_t module){ fModule = module;}
- void SetTheta(Float_t theta){ fTheta = theta; }
- void SetPhi(Float_t phi) { fPhi = phi; }
-
- ClassDef(AliRICHmip,1) //Mip hits for RICH
-};
-
-//_____________________________________________________________________________
-class AliRICHckov: public AliRICHhit
-{
-public:
- // Hit information keep
- Float_t fEnergy; //Photon energy
- Int_t fStop; //Stop mechanism (cut, threshold, ...)
-
- //Parent info
- Int_t fParent; //Index in array of mips of parent which generatethis
-public:
- AliRICHckov() {}
- AliRICHckov(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits,
- Int_t fNmips, Int_t fNpadhits);
- virtual ~AliRICHckov() {}
-
- ClassDef(AliRICHckov,1) //Cerenkov hits for RICH
-};
-
-//_____________________________________________________________________________
-class AliRICHpadhit: public AliHit
+class TFile;
+
+class AliRICHHit;
+class AliRICHSDigit;
+class AliRICHRawCluster;
+class AliRICHRecHit1D;
+class AliRICHRecHit3D;
+class AliRICHClusterFinder;
+class AliRICHDetect;
+class AliRICHChamber;
+class AliRICHCerenkov;
+class AliSegmentation;
+class AliRICHResponse;
+class AliRICHGeometry;
+class AliRICHMerger;
+
+class AliRICH : public AliDetector
{
+
+enum EDebugBits {kDebugStart=BIT(0),kDebugParam=BIT(1),kDebugHit=BIT(2),kDebugDigit=BIT(3),kDebugReco=BIT(4)}; // Debug flags
+
public:
- Int_t fVolume[2]; //array of volumes
-
- // Hit information
- Int_t fX; //Integer x position in pad
- Int_t fY; //Integer y position in pad
- Int_t fModule; //Module number
- // Particle info
- Int_t fParentMip; //Parent particle
- Int_t fParentCkov; //Parent CKOV
- // physics info
- Int_t fProd; //Production mechanism
- Float_t fCharge; //Charge deposited
+ AliRICH(); // default ctor
+ AliRICH(const char *name, const char *title); // named ctor
+ AliRICH(const AliRICH& RICH); // copy ctor
+ virtual ~AliRICH(); // dtor
+// Pure vituls methods
+ virtual Int_t IsVersion() const =0;
+// The following staff is defined in AliRICHChamber.cxx
+ virtual void AddHit(Int_t track, Int_t *vol, Float_t *hits);
+ virtual void AddCerenkov(Int_t track, Int_t *vol, Float_t *cerenkovs);
+ virtual void AddSDigit(Int_t *clhits);
+ virtual void AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits);
+ virtual void AddRawCluster(Int_t id, const AliRICHRawCluster& cluster);
+ virtual void AddRecHit1D(Int_t id, Float_t* rechit, Float_t* photons, Int_t* padsx, Int_t* padsy);
+ virtual void AddRecHit3D(Int_t id, Float_t* rechit);
-public:
- AliRICHpadhit(){}
- AliRICHpadhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits,
- Int_t fNmips,Int_t fNckovs);
- virtual ~AliRICHpadhit() {}
-
- ClassDef(AliRICHpadhit,1) //Pad hits for RICH
-};
+ virtual void BuildGeometry(); // TNode ROOT variant for event display
+ virtual void CreateGeometry(); // GEANT volumes tree for simulation
+ virtual void CreateMaterials(); // GEANT materials definition
+ virtual Float_t AbsoCH4(Float_t x);
+ virtual Float_t Fresnel(Float_t ene,Float_t pdoti, Bool_t pola);
+ virtual void StepManager();
+ Int_t DistancetoPrimitive(Int_t px, Int_t py);
+ virtual void MakeBranch(Option_t *opt=" ", const char *file=0);
+ virtual void MakeBranchInTreeD(TTree *treeD, const char *file=0);
+ void SetTreeAddress();
+ virtual void ResetHits();
+ virtual void ResetDigits();
+ virtual void ResetRawClusters();
+ virtual void ResetRecHits1D();
+ virtual void ResetRecHits3D();
+ virtual void FindClusters(Int_t nev,Int_t lastEntry);
+// Converters
+ virtual void Hits2SDigits();
+ virtual Int_t Hits2SDigits(Float_t xhit,Float_t yhit,Float_t eloss,Int_t id, ResponseType res);
+ virtual void SDigits2Digits();
+ virtual void SDigits2Digits(Int_t nev, Int_t flag);
+ virtual void Digits2Reco();
+// Retrieve pad hits for a given Hit
+ virtual AliRICHSDigit* FirstPad(AliRICHHit *hit, TClonesArray *clusters);
+ virtual AliRICHSDigit* NextPad(TClonesArray *clusters);
+// inline methods
+ TClonesArray *SDigits() const{return fSDigits;}
+ TClonesArray *Cerenkovs() const{return fCerenkovs;}
-#endif
+// Models for chambers
+ virtual void SetGeometryModel(Int_t iChamberN, AliRICHGeometry *pRICHGeo) { GetChamber(iChamberN)->SetGeometryModel(pRICHGeo);}
+ AliRICHGeometry* GetGeometryModel(Int_t iChamberN=0) const{return GetChamber(iChamberN)->GetGeometryModel();}
+
+ virtual void SetSegmentationModel(Int_t iChamberN, AliSegmentation *pAliSeg) { GetChamber(iChamberN)->SetSegmentationModel(pAliSeg);}
+ AliSegmentation* GetSegmentationModel(Int_t iChamberN=0) const{return GetChamber(iChamberN)->GetSegmentationModel();}
+
+ virtual void SetResponseModel(Int_t iChamberN, AliRICHResponse *pRICHRes) { GetChamber(iChamberN)->SetResponseModel(pRICHRes);}
+ AliRICHResponse* GetResponseModel(Int_t iChamberN) const{return GetChamber(iChamberN)->GetResponseModel();}
+
+ virtual void SetReconstructionModel(Int_t iChamberN, AliRICHClusterFinder *pRICHReco){GetChamber(iChamberN)->SetReconstructionModel(pRICHReco);}
+// Debug staff
+ void SetDebugLevel(Int_t level) {fDebugLevel=level;}
+ Int_t GetDebugLevel() const{return fDebugLevel;}
+
+ void SetDebugStart() {fDebugLevel+=kDebugStart;} // Controls debug message at the entring point of methods
+ void ResetDebugStart() {fDebugLevel-=kDebugStart;} // Controls debug message at the entring point of methods
+ Bool_t IsDebugStart()const{return fDebugLevel&kDebugStart;} // Controls debug message at the entring point of methods
+
+ void SetDebugParam() {fDebugLevel+=kDebugParam;} // Controls debug printout for the parameters
+ void ResetDebugParam() {fDebugLevel-=kDebugParam;} // Controls debug printout for the parameters
+ Bool_t IsDebugParam()const{return fDebugLevel&kDebugParam;} // Controls debug printout for the parameters
+
+ void SetDebugHit() {fDebugLevel+=kDebugHit;} // Controls debug printout for hits
+ void ResetDebugHit() {fDebugLevel-=kDebugHit;} // Controls debug printout for hits
+ Bool_t IsDebugHit() const{return fDebugLevel&kDebugHit;} // Controls debug printout for hits
+
+ void SetDebugDigit() {fDebugLevel+=kDebugDigit;} // Controls debug printout for digits
+ void ResetDebugDigit() {fDebugLevel-=kDebugDigit;} // Controls debug printout for digits
+ Bool_t IsDebugDigit()const{return fDebugLevel&kDebugDigit;} // Controls debug printout for digits
+
+ void SetDebugReco() {fDebugLevel+=kDebugReco;} // Controls debug printout for reco
+ void ResetDebugReco() {fDebugLevel-=kDebugReco;} // Controls debug printout for reco
+ Bool_t IsDebugReco() const{return fDebugLevel&kDebugReco;} // Controls debug printout for reco
+
+ virtual void SetMerger(AliRICHMerger* thisMerger) {fMerger=thisMerger;}
+// Return reference to Chamber #id
+ virtual AliRICHChamber& Chamber(Int_t id) {return *((AliRICHChamber *) (*fChambers)[id]);}
+ AliRICHChamber* GetChamber(Int_t iChamberN) const{return (AliRICHChamber*) (*fChambers)[iChamberN];}
+// Return pointers to digits
+ TObjArray *Dchambers() {return fDchambers;}
+ Int_t *Ndch() {return fNdch;}
+ virtual TClonesArray *DigitsAddress(Int_t id) {return ((TClonesArray *) (*fDchambers)[id]);}
+// Return pointers to rec. hits
+ TObjArray *RecHits1D() const{return fRecHits1D;}
+ Int_t *Nrechits1D() {return fNrechits1D;} // returns array
+ Int_t *Nrechits3D() {return fNrechits3D;} // returns array
+ virtual TClonesArray *RecHitsAddress1D(Int_t id) const{return ((TClonesArray *) (*fRecHits1D)[id]);}
+ TObjArray *RecHits3D() const{return fRecHits3D;}
+ virtual TClonesArray *RecHitsAddress3D(Int_t id) const{return ((TClonesArray *) (*fRecHits3D)[id]);}
+ virtual TClonesArray *RawClustAddress(Int_t id) const{return ((TClonesArray *) (*fRawClusters)[id]);}
+// Assignment operator
+ AliRICH& operator=(const AliRICH& rhs);
+
+ virtual void DiagnosticsFE(Int_t evNumber1=0,Int_t evNumber2=0); // Full events
+ virtual void DiagnosticsSE(Int_t diaglevel,Int_t evNumber1=0,Int_t evNumber2=0); // Single events
+
+ inline virtual void Print(Option_t *option)const; // Prints debug information
+
+protected:
+ TObjArray *fChambers; // List of RICH chambers aka modules
+ Int_t fNSDigits; // Number of clusters
+ Int_t fNcerenkovs; // Number of cerenkovs
+ TClonesArray *fSDigits; // List of clusters
+ TObjArray *fDchambers; // List of digits
+ TClonesArray *fCerenkovs; // List of cerenkovs
+ Int_t fNdch[kNCH]; // Number of digits
+ TObjArray *fRawClusters; // List of raw clusters
+ TObjArray *fRecHits1D; // List of rec. hits
+ TObjArray *fRecHits3D; // List of rec. hits
+ Int_t fNrawch[kNCH]; // Number of raw clusters
+ Int_t fNrechits1D[kNCH]; // Number of rec hits
+ Int_t fNrechits3D[kNCH]; // Number of rec hits
+ Int_t fDebugLevel; // Source debugging level
+
+ Int_t fCkovNumber; // Number of Cerenkov photons
+ Int_t fCkovQuarz; // Cerenkovs crossing quartz
+ Int_t fCkovGap; // Cerenkovs crossing gap
+ Int_t fCkovCsi; // Cerenkovs crossing csi
+ Int_t fLostRfreo; // Cerenkovs reflected in freon
+ Int_t fLostRquar; // Cerenkovs reflected in quartz
+ Int_t fLostAfreo; // Cerenkovs absorbed in freon
+ Int_t fLostAquarz; // Cerenkovs absorbed in quartz
+ Int_t fLostAmeta; // Cerenkovs absorbed in methane
+ Int_t fLostCsi; // Cerenkovs below csi quantum efficiency
+ Int_t fLostWires; // Cerenkovs lost in wires
+ Int_t fFreonProd; // Cerenkovs produced in freon
+ Float_t fMipx; // x coord. of MIP
+ Float_t fMipy; // y coord. of MIP
+ Int_t fFeedbacks; // Number of feedback photons
+ Int_t fLostFresnel; // Cerenkovs lost by Fresnel reflection
+// Background event for event mixing
+ Text_t *fFileName; //! File with background hits
+ AliRICHMerger *fMerger; //! pointer to merger
+
+ ClassDef(AliRICH,1) // Main RICH class
+};//class AliRICH
+
+inline void AliRICH::Print(Option_t *option)const
+{
+ TObject::Print(option);
+ if(IsDebugParam()){
+ GetGeometryModel(0)->Print(option);
+ GetSegmentationModel(0)->Print(option);
+ GetResponseModel(0)->Print(option);
+ }
+}//inline void AliRICH::Print(Option_t *option)const
+
+#endif