#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 <TObjArray.h>
#include <AliDetector.h>
-#include <AliRICHConst.h>
-#include <AliRICHChamber.h>
-static const int kNCH=7;
+#include <TClonesArray.h>
+#include <TObjArray.h>
+#include <TVector.h>
+#include <TVector3.h>
-class TFile;
+#include "AliRICHDigitizer.h"
+#include "AliRICHParam.h"
+#include "AliRICHCluster.h"
+#include "AliRICHHit.h"
-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;
+//__________________AliRICH_________________________________________________________________________
+class AliESD;
class AliRICH : public AliDetector
{
-
-enum EDebugBits {kDebugStart=BIT(0),kDebugParam=BIT(1),kDebugHit=BIT(2),kDebugDigit=BIT(3),kDebugReco=BIT(4)}; // Debug flags
-
public:
- 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, Float_t omega, Float_t theta, Float_t phi);
-
- 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;}
-
-// 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
+//ctor & dtor
+ AliRICH();
+ AliRICH(const char *name, const char *title);
+ AliRICH(const AliRICH& RICH):AliDetector(RICH) {;} //copy ctor
+ virtual ~AliRICH();
+
+ AliRICH& operator=(const AliRICH&) {return *this;}
+//framework part
+ virtual Int_t IsVersion() const =0; //interface from
+ virtual void StepManager() =0; //interface from AliMC
+ virtual void Hits2SDigits(); //interface from AliSimulation
+ virtual void Digits2Raw(); //interface from AliSimulation
+ virtual AliDigitizer* CreateDigitizer(AliRunDigitizer* man) const {return new AliRICHDigitizer(man);} //interface from AliSimulation
+ virtual void SetTreeAddress(); //interface from AliLoader
+ virtual void MakeBranch(Option_t *opt=" "); //interface from AliLoader
+ virtual void CreateMaterials(); //interface from AliMC
+ virtual void CreateGeometry(); //interface from AliMC
+ virtual void BuildGeometry(); //interface
+ virtual void Print(Option_t *option="") const; //prints current RICH status
+//private part
+ void GeomPadPanelFrame()const; //defines PPF geometry
+ void GeomAmpGap() const; //defines gap geometry + anod wires
+ void GeomRadiators() const; //defines radiators geometry
+ void GeomSandBox() const; //defines sandbox geometry
+ void GeomRadioSrc() const; //defines radio source geometry
+ void GeomAerogel() const; //defines aerogel geometry
+ static Float_t Fresnel(Float_t ene,Float_t pdoti, Bool_t pola); //deals with Fresnel absorption
+
+ AliRICHHit* Hit (Int_t tid )const; //first hit of given TID
+ inline void HitAdd (Int_t c,Int_t tid,TVector3 in,TVector3 out,Double_t e=0); //add new hit
+ inline void HitsCreate ( ); //create hits container
+ void HitsPrint (Int_t iEvent=0 )const; //prints hits
+
+ TClonesArray* SDigits ( )const{return fSdigits;} //pointer to sdigits list
+ inline void SDigitAdd (Int_t c,TVector pad,Double_t q,Int_t pid,Int_t tid ) ; //add new sdigit
+ inline void SDigitsCreate ( ) ; //create sdigits container
+ void SDigitsReset ( ) {fNsdigits=0; if(fSdigits) fSdigits ->Clear();} //clean a list of sdigits
+ void SDigitsPrint (Int_t iEvent=0 )const; //prints sdigits
+
+ using AliDetector::Digits;
+ TClonesArray* Digits (Int_t iC )const{return fDigs ? (TClonesArray *)fDigs->At(iC-1):0;}
+ inline void DigitAdd (Int_t c,TVector pad,int q,int cfm,int *tid ) ; //add new digit
+ inline void DigitsCreate ( ) ; //create digits
+ void DigitsReset ( ) {if(fDigs)for(int i=0;i<kNchambers;i++){fDigs->At(i)->Clear();fNdigs[i]=0;}} //virtual
+ void DigitsPrint (Int_t iEvent=0 )const; //prints digits
+
+ TClonesArray* Clusters (Int_t iC )const{if(fClus) return (TClonesArray *)fClus->At(iC-1);else return 0;}
+ inline void ClusterAdd (AliRICHCluster &cl ) ; //add new cluster
+ inline void ClustersCreate( ) ; //create clusters container
+ void ClustersReset ( ) {if(fClus)for(int i=0;i<kNchambers;i++){fClus ->At(i)->Clear();fNclus[i]=0;}}
+ void ClustersPrint (Int_t iEvent=0 )const; //prints a list of clusters for a given event
+
+ void OccupancyPrint(Int_t iEvent=0 )const;
+
+ AliRICHChamber* C(Int_t iC) const{return fParam->C(iC);} //provides pointer to a given chamber
+ AliRICHParam* P() const{return fParam;} //provides pointer to a RICH params
+ AliRICH* R() {return this;} //provides pointer to RICH main object
+ TVector Counters() const{return fCounters;} //provides a set of counters
+ void ControlPlots(); //creates ~/RCP.root with a set of QA plots
+ void Display()const; //Display event
+ void DisplayEvent(Int_t,Int_t)const; //Display event
+ static Int_t Nparticles(Int_t iPid,Int_t iEventN,AliRunLoader *pRunLoader); //counts total number of particle with iPid
+ void PrintTracks (Int_t iEvent=0); //prints a list of tracks for a given event
+ void CheckPR ()const; //utility-> run staff for stack ??????
+ void ReadESD(Int_t iEventN, Int_t iChamber)const;
+ void DrawRing(TVector3 entrance,TVector3 vectorTrack,Double_t thetaCer)const;
+
+protected:
+ enum EMedia {kAir=1,kRoha,kSiO2,kC6F14,kCH4,kCsI,kGridCu,kOpSiO2,kGap,kAl,kGlass,kCu,kW,kSteel,kPerpex,kSr90,kMylar,kGel,kReflector};
+ enum ECounters {kStepManager=0,kCerProdTot,kCerProdRad,kCerKillTot,kCerKillRad,kCerKillRef,kEleProdTot};
+ AliRICHParam *fParam; //main RICH parametrization
+ //fHits and fDigits belong to AliDetector
+ TClonesArray *fSdigits; //! list of sdigits
+ Int_t fNsdigits; //! current number of sdigits
+
+ TObjArray *fDigs; //! each chamber holds it's one lists of digits
+ Int_t fNdigs[7]; //! array of current numbers of digits
+
+ TObjArray *fClus; //! each chamber holds it's one lists of clusters
+ Int_t fNclus[7]; //! array of current numbers of raw clusters
+
+ TVector fCounters; //Particle history counters, explanation in StepManager()
+
+ ClassDef(AliRICH,9) //Main RICH class
+};//class AliRICH
+
+//__________________________________________________________________________________________________
+void AliRICH::HitsCreate()
{
- 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
+ if(fHits) return;
+ AliDebug(1,"creating hits container.");
+ fHits=new TClonesArray("AliRICHHit",10000); fNhits=0;
+}
+//__________________________________________________________________________________________________
+void AliRICH::HitAdd(Int_t c,Int_t tid,TVector3 i3,TVector3 o3,Double_t eloss)
+{
+//add new RICH hit to the list of hits
+ TClonesArray &tmp=*fHits;
+ new(tmp[fNhits++])AliRICHHit(c,tid,i3,o3,eloss);
+}//AddHit()
+//__________________________________________________________________________________________________
+void AliRICH::SDigitsCreate()
+{
+ if(fSdigits) return;
+ AliDebug(1,"creating sdigits container.");
+ fSdigits=new TClonesArray("AliRICHDigit",10000); fNsdigits=0;
+}
+//__________________________________________________________________________________________________
+void AliRICH::SDigitAdd(Int_t c,TVector pad,Double_t q,Int_t pid,Int_t tid)
+{
+ Int_t cfm;
+ switch(pid){
+ case 50000050: cfm=1000000;break;//cerenkov
+ case 50000051: cfm=1000; break;//feedback
+ default: cfm=1; break;//mip
+ }
+ TClonesArray &tmp=*fSdigits; new(tmp[fNsdigits++])AliRICHDigit(c,pad,q,cfm,tid,-1,-1);
+}
+//__________________________________________________________________________________________________
+void AliRICH::DigitsCreate()
+{
+ if(fDigs) return;
+ AliDebug(1,"creating digits containers.");
+ fDigs = new TObjArray(kNchambers);
+ for(Int_t i=0;i<kNchambers;i++) {fDigs->AddAt(new TClonesArray("AliRICHDigit",10000), i); fNdigs[i]=0;}
+}
+//__________________________________________________________________________________________________
+void AliRICH::DigitAdd(int c,TVector pad,int q,int cfm,int *tid)
+{
+ TClonesArray &tmp=*((TClonesArray*)fDigs->At(c-1));
+ new(tmp[fNdigs[c-1]++])AliRICHDigit(c,pad,q,cfm,tid[0],tid[1],tid[2]);
+}
+//__________________________________________________________________________________________________
+void AliRICH::ClustersCreate()
+{
+ if(fClus) return;
+ AliDebug(1,"creating clusters containers.");
+ fClus = new TObjArray(kNchambers);
+ for(Int_t i=0;i<kNchambers;i++) {fClus->AddAt(new TClonesArray("AliRICHCluster",10000), i); fNclus[i]=0;}
+}
+//__________________________________________________________________________________________________
+void AliRICH::ClusterAdd(AliRICHCluster &cl)
+{
+ Int_t c=cl.C()-1;TClonesArray &tmp=*((TClonesArray*)fClus->At(c));
+ new(tmp[fNclus[c]++])AliRICHCluster(cl);
+}
+//__________________________________________________________________________________________________
+#endif//#ifndef AliRICH_h