-#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 <TObjArray.h>
+#include <TClonesArray.h>
+#include <TLorentzVector.h>
+#include <AliDetector.h>
+#include <AliHit.h>
+#include <AliDigit.h>
#include "AliRICHConst.h"
-#include "AliRICHSegRes.h"
-#include "DataStructures.h"
#include "AliRICHChamber.h"
-#include "AliRICHSegRes.h"
-#include <TVector.h>
-#include <TArrayF.h>
-#include <TObjArray.h>
-#include <TFile.h>
-#include <TTree.h>
-#include <TParticle.h>
-
-static const int NCH=7;
-
-
-class AliRICHPadHit;
class AliRICHRawCluster;
-class AliRICHRecHit;
-class AliRICHClusterFinder;
-class AliRICHDetect;
-class AliRICHChamber;
-class AliRICHCerenkov;
-class AliRICHSegmentation;
-class AliRICHResponse;
-class AliRICHEllipse;
-
-class AliRICH : public AliDetector {
- public:
- AliRICH();
- AliRICH(const char *name, const char *title);
- virtual ~AliRICH();
- virtual void AddHit(Int_t, Int_t*, Float_t*);
- virtual void AddCerenkov(Int_t, Int_t*, Float_t*);
- virtual void AddPadHit(Int_t*);
- virtual void AddDigits(Int_t, Int_t*, Int_t*, Int_t*);
- virtual void AddRawCluster(Int_t, const AliRICHRawCluster&);
- virtual void AddRecHit(Int_t, Float_t*);
-
+class AliRICHRecHit1D;
+class AliRICHRecHit3D;
- virtual void BuildGeometry();
- virtual void CreateGeometry() {}
- virtual void CreateMaterials() {}
- virtual void StepManager();
- Int_t DistancetoPrimitive(Int_t px, Int_t py);
- virtual Int_t IsVersion() const =0;
-//
- TClonesArray *PadHits() {return fPadHits;}
- TClonesArray *Cerenkovs() {return fCerenkovs;}
- virtual void MakeBranch(Option_t *opt=" ");
- void SetTreeAddress();
- virtual void ResetHits();
- virtual void ResetDigits();
- virtual void ResetRawClusters();
- virtual void ResetRecHits();
- virtual void FindClusters(Int_t,Int_t);
- virtual void Digitise(Int_t nev,Int_t flag,Option_t *opt=" ",Text_t *name=" ");
-//
-// Configuration Methods (per station id)
-//
-// Set Chamber Segmentation Parameters
-// id refers to the station and isec to the cathode plane
-// Set Segmentation and Response Model
- virtual void SetGeometryModel(Int_t id, AliRICHGeometry *geometry);
- virtual void SetSegmentationModel(Int_t id, AliRICHSegmentation *segmentation);
- virtual void SetResponseModel(Int_t id, AliRICHResponse *response);
- virtual void SetNsec(Int_t id, Int_t nsec);
-// Set Reconstruction Model
- virtual void SetReconstructionModel(Int_t id, AliRICHClusterFinder *reconstruction);
-// Response Simulation
- virtual Int_t MakePadHits(Float_t xhit,Float_t yhit,Float_t eloss,Int_t id,Response_t res);
-// Return reference to Chamber #id
- virtual AliRICHChamber& Chamber(Int_t id) {return *((AliRICHChamber *) (*fChambers)[id]);}
-// Retrieve pad hits for a given Hit
- virtual AliRICHPadHit* FirstPad(AliRICHHit *, TClonesArray *);
- virtual AliRICHPadHit* NextPad(TClonesArray *);
-// 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 *RecHits() {return fRecHits;}
- Int_t *Nrechits() {return fNrechits;}
- virtual TClonesArray *RecHitsAddress(Int_t id) {return ((TClonesArray *) (*fRecHits)[id]);}
-// Return pointers to reconstructed clusters
- virtual TClonesArray *RawClustAddress(Int_t id) {return ((TClonesArray *) (*fRawClusters)[id]);}
+//__________________AliRICHhit______________________________________________________________________
+//__________________________________________________________________________________________________
+//__________________________________________________________________________________________________
+class AliRICHhit : public AliHit
+{
+public:
+ inline AliRICHhit();
+ inline AliRICHhit(Int_t fIshunt, Int_t track, Int_t *vol, Float_t *hits);
+ inline AliRICHhit(Int_t track,Int_t iPID,Int_t iChamber,TLorentzVector x4,Float_t eloss);
+ virtual ~AliRICHhit() {;}
-
- protected:
- TObjArray *fChambers; // List of Tracking Chambers
- Int_t fNPadHits; // Number of clusters
- Int_t fNcerenkovs; // Number of cerenkovs
- TClonesArray *fPadHits; // List of clusters
- TObjArray *fDchambers; // List of digits
- TClonesArray *fCerenkovs; // List of cerenkovs
- Int_t *fNdch; // Number of digits
- Text_t *fFileName; // Filename for event mixing
- TObjArray *fRawClusters; // List of raw clusters
- TObjArray *fRecHits; // List of rec. hits
- Int_t *fNrawch; // Number of raw clusters
- Int_t *fNrechits; // Number of rec hits
-
- protected:
-
- ClassDef(AliRICH,1) //Hits manager for set:RICH
-};
-#endif
-
-
-
-
-
-
+ Int_t Chamber() {return fChamber;}
+ Int_t Particle() {return fParticle;}
+ Float_t Theta() {return fTheta;}
+ Float_t Phi() {return fPhi;}
+ Float_t Tlength() {return fTlength;}
+ Float_t Eloss() {return fEloss;}
+ Float_t Loss() {return fLoss;}
+ Float_t PHfirst() {return fPHfirst;}
+ Float_t PHlast() {return fPHlast;}
+ Float_t MomX() {return fMomX;}
+ Float_t MomY() {return fMomY;}
+ Float_t MomZ() {return fMomZ;}
+ Float_t CerenkovAngle() {return fMomX;}
+ Float_t MomFreoX() {return fMomX;}
+ Float_t MomFreoY() {return fMomY;}
+ Float_t MomFreoZ() {return fMomZ;}
+protected:
+ Int_t fChamber; //chamber number
+ Int_t fParticle; //particle code
+ Float_t fTheta,fPhi ; //incident theta phi angles in degrees
+ Float_t fTlength; //track length inside the chamber
+ Float_t fEloss; //ionisation energy loss in gas
+ Float_t fPHfirst; //first padhit
+ Float_t fPHlast; //last padhit
+ Float_t fLoss; // did it hit the freon?
+ Float_t fMomX,fMomY,fMomZ; //momentum at photochatode entry point
+ Float_t fNPads; // Pads hit
+ Float_t fCerenkovAngle; // Dummy cerenkov angle
+ Float_t fMomFreoX,fMomFreoY,fMomFreoZ; //momentum at freon entry point
+ ClassDef(AliRICHhit,1) //RICH hit class
+};//class AliRICHhit
+ //__________________________________________________________________________________________________
+AliRICHhit::AliRICHhit()
+ :AliHit()
+{//default ctor
+ fChamber=fParticle=kBad;
+ fTheta=fPhi=fTlength=fEloss=fPHfirst=fPHlast=fLoss=kBad;
+ fMomX=fMomY=fMomZ=fNPads=fCerenkovAngle=fMomFreoX=fMomFreoY=fMomFreoZ=kBad;
+}//AliRICHhit::default ctor
+//__________________________________________________________________________________________________
+AliRICHhit::AliRICHhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hit):
+ AliHit(shunt, track)
+{//ctor
+ fChamber=vol[0];
+ fParticle=(Int_t)hit[0];
+ fX=hit[1];fY=hit[2];fZ=hit[3];
+ fTheta=hit[4];fPhi=hit[5];
+ fTlength=hit[6];
+ fEloss=hit[7];
+ fPHfirst=(Int_t)hit[8];
+ fPHlast=(Int_t)hit[9];
+ fLoss=hit[13];
+ fMomX=hit[14];fMomY=hit[15];fMomZ=hit[16];
+ fNPads=hit[17];
+ fCerenkovAngle=hit[18];
+ fMomFreoX=hit[19];fMomFreoY=hit[20];fMomFreoZ=hit[21];
+}//AliRICHhit::ctor
+//__________________________________________________________________________________________________
+AliRICHhit::AliRICHhit(Int_t track,Int_t iPID,Int_t iChamber,TLorentzVector x4,Float_t eloss):
+ AliHit(0, track)
+{//ctor
+ fChamber=iChamber;
+ fParticle=iPID;
+ fX=x4.X();fY=x4.Y();fZ=x4.Z();
+ fEloss=eloss;
+}//AliRICHhit::ctor
+//__________________AliRICHCerenkov_________________________________________________________________
+//__________________________________________________________________________________________________
+//__________________________________________________________________________________________________
+class AliRICHCerenkov: public AliHit
+{
+public:
+ inline AliRICHCerenkov();
+ inline AliRICHCerenkov(Int_t fIshunt, Int_t track, Int_t *vol, Float_t *Cerenkovs);
+ virtual ~AliRICHCerenkov() {;}
+public:
+ Int_t fChamber; //chamber number
+ Float_t fTheta,fPhi; //incident theta phi angles in degrees
+ Float_t fTlength; //track length inside the chamber
+ Float_t fEloss; //ionisation energy loss in gas
+ Int_t fPHfirst; //first padhit
+ Int_t fPHlast; //last padhit
+ Int_t fCMother; //index of mother particle
+ Float_t fLoss; //nature of particle loss
+ Float_t fIndex; //index of photon
+ Float_t fProduction; //point of production
+ Float_t fMomX,fMomY,fMomZ; //local Momentum
+ Float_t fNPads; // Pads hit
+ Float_t fCerenkovAngle; // Cerenkov Angle
+
+ ClassDef(AliRICHCerenkov,1) //RICH cerenkov class
+};//class AliRICHCerenkov
+//__________________________________________________________________________________________________
+AliRICHCerenkov::AliRICHCerenkov()
+{//ctor
+ fChamber=kBad;
+ fX=fY=fZ=fTheta=fPhi=fTlength=fEloss=kBad;
+ fPHfirst=fPHlast=fCMother=kBad;
+ fLoss=fIndex=fProduction=fMomX=fMomY=fMomZ=fNPads=fCerenkovAngle=kBad;
+}//AliRICHCerenkov::ctor
+//__________________________________________________________________________________________________
+AliRICHCerenkov::AliRICHCerenkov(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits)
+ :AliHit(shunt, track)
+{//ctor
+ fChamber=vol[0];
+ fX=hits[1];fY=hits[2];fZ=hits[3];
+ fTheta=hits[4];fPhi=hits[5];
+ fTlength=hits[6];
+ fEloss=hits[7];
+ fPHfirst=(Int_t)hits[8];fPHlast=(Int_t)hits[9];
+ fCMother=Int_t(hits[10]);
+ fIndex = hits[11];
+ fProduction = hits[12];
+ fLoss=hits[13];
+ fMomX=hits[14];fMomY=hits[15];fMomZ=hits[16];
+ fNPads=hits[17];
+ fCerenkovAngle=hits[18];
+}//AliRICHCerenkov::ctor
+//__________________AliRICHdigit____________________________________________________________________
+//__________________________________________________________________________________________________
+//__________________________________________________________________________________________________
+class AliRICHdigit :public AliDigit
+{
+public:
+ AliRICHdigit() {fPadX=fPadY=fChamber=fAdc=fTracks[0]=fTracks[1]=fTracks[2]=kBad;}
+ inline AliRICHdigit(Int_t iC,Int_t iX,Int_t iY,Int_t iAdc,Int_t iT1,Int_t iT2,Int_t iT3);
+ virtual ~AliRICHdigit() {;}
+ Int_t C() const{return fChamber;}
+ Int_t X() const{return fPadX;}
+ Int_t Y() const{return fPadY;}
+ Int_t Pad() const{return fPad;}
+ Int_t Adc() const{return fAdc;}
+protected:
+ Int_t fChamber; //module number
+ Int_t fPadX; //pad number along X
+ Int_t fPadY; //pad number along Y
+ Int_t fPad; //pad number 1000*X+Y
+ Int_t fAdc; //ADC value
+ ClassDef(AliRICHdigit,1) //RICH digit class
+};//class AliRICHdigit
+//__________________________________________________________________________________________________
+AliRICHdigit::AliRICHdigit(Int_t iC,Int_t iX,Int_t iY,Int_t iAdc,Int_t iT0,Int_t iT1,Int_t iT2)
+{
+ fChamber=iC;fPadX=iX;fPadY=iY;fPad=1000*fPadX+fPadY;fAdc=iAdc;
+ fTracks[0]=iT0;fTracks[1]=iT1;fTracks[2]=iT2;
+}//AliRICHdigit::ctor
+//__________________AliRICH_________________________________________________________________________
+//__________________________________________________________________________________________________
+//__________________________________________________________________________________________________
+class AliRICHParam;
+class AliRICHSDigit;
+class AliRICH : public AliDetector
+{
+public:
+ AliRICH();
+ AliRICH(const char *name, const char *title);
+ AliRICH(const AliRICH& RICH):AliDetector(RICH) {;}
+ virtual ~AliRICH();
+
+ AliRICH& operator=(const AliRICH&) {return *this;}
+ virtual Int_t IsVersion()const =0;
+
+ inline void AddHit(Int_t track, Int_t *vol, Float_t *hits);//virtual
+ inline void AddHit(Int_t track,Int_t iPID,Int_t iChamber,TLorentzVector x4,Float_t eloss);
+ inline void AddCerenkov(Int_t track, Int_t *vol, Float_t *cerenkovs);
+ inline void AddSDigit(Int_t iC,Int_t iX,Int_t iY,Int_t iAdc,Int_t iT0,Int_t iT1=kBad,Int_t iT2=kBad);
+ inline void AddDigit(Int_t iC,Int_t iX,Int_t iY,Int_t iAdc,Int_t iT0,Int_t iT1=kBad,Int_t iT2=kBad);
+
+ inline void ResetHits(); //virtual
+ inline void ResetSDigits();
+ void ResetDigits(); //virtual
+
+ virtual void Hits2SDigits();
+ virtual void SDigits2Digits();
+ virtual void Digits2Reco();
+
+ AliRICHChamber* C(Int_t i) const{return (AliRICHChamber*)fChambers->At(i-1);}
+ AliRICHParam* Param() const{return fpParam;}
+ TClonesArray* SDigits() const{return fSDigits;}
+ TClonesArray* Cerenkovs() const{return fCerenkovs;}
+
+ void CreateChambers();
+ virtual void CreateMaterials(); //GEANT materials definition
+ Float_t AbsoCH4(Float_t x);
+ Float_t Fresnel(Float_t ene,Float_t pdoti, Bool_t pola);
+ virtual void BuildGeometry(); //TNode ROOT variant for event display
+ virtual void CreateGeometry(); //GEANT volumes tree for simulation
+
+ virtual void StepManager()=0;
+ void GenerateFeedbacks(Float_t eloss);
+
+ AliRICHChamber& Chamber(Int_t id) {return *((AliRICHChamber *) (*fChambers)[id]);}
+
+ void AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits);
+ void AddRawCluster(Int_t id, const AliRICHRawCluster& cluster);
+ void AddRecHit1D(Int_t id, Float_t* rechit, Float_t* photons, Int_t* padsx, Int_t* padsy);
+ void AddRecHit3D(Int_t id, Float_t* rechit, Float_t omega, Float_t theta, Float_t phi);
+ void ResetRawClusters();
+ void ResetRecHits1D();
+ void ResetRecHits3D();
+ virtual void FindClusters(Int_t nev);
+ Int_t DistancetoPrimitive(Int_t /*px*/, Int_t /*py*/) {return 9999;}
+
+ virtual void MakeBranch(Option_t *opt=" ");
+ virtual void MakeBranchInTreeD(TTree *treeD, const char *file=0);
+ virtual void SetTreeAddress();
+
+
+ TObjArray *Dchambers() {return fDchambers;}
+ TObjArray *RecHits3D() const{return fRecHits3D;}
+ TObjArray *RecHits1D() const{return fRecHits1D;}
+ Int_t *Ndch() {return fNdch;}
+ Int_t *Nrechits1D() {return fNrechits1D;}
+ Int_t *Nrechits3D() {return fNrechits3D;}
+ TClonesArray *DigitsAddress(Int_t id) {return ((TClonesArray *) (*fDchambers)[id]);}
+ TClonesArray *RecHitsAddress1D(Int_t id) const{return ((TClonesArray *) (*fRecHits1D)[id]);}
+ TClonesArray *RecHitsAddress3D(Int_t id) const{return ((TClonesArray *) (*fRecHits3D)[id]);}
+ TClonesArray *RawClustAddress(Int_t id) const{return ((TClonesArray *) (*fRawClusters)[id]);}
+ AliRICHSDigit* FirstPad(AliRICHhit *hit, TClonesArray *clusters);
+ AliRICHSDigit* NextPad(TClonesArray *clusters);
+
+ virtual void Print(Option_t *option)const;
+
+protected:
+ AliRICHParam *fpParam; //main RICH parametrization
+ TObjArray *fChambers; //list of RICH chambers
+ Int_t fNsdigits; //Current number of sdigits
+ Int_t fNcerenkovs; //Current number of cerenkovs
+ TClonesArray *fSDigits; //! List of sdigits
+ TObjArray *fDchambers; //! Array of lists of digits
+ TClonesArray *fCerenkovs; //! List of cerenkovs
+ Int_t fNdch[kNCH]; //Array of current numbers of digits
+ TObjArray *fRawClusters; //!List of raw clusters
+ TObjArray *fRecHits1D; //!List of rec. hits
+ TObjArray *fRecHits3D; //!List of rec. hits
+ Int_t fNrawch[kNCH]; //Array of current numbers of raw clusters
+ Int_t fNrechits1D[kNCH]; //Array of current numbers of rec hits 1D
+ Int_t fNrechits3D[kNCH]; //Array of current numbers of rec hits 3D
+ Int_t fCkovNumber; // Number of Cerenkov photons
+ Int_t fFreonProd; // Cerenkovs produced in freon
+ Int_t fFeedbacks; // Number of feedback photons
+
+ ClassDef(AliRICH,2) //Main RICH class
+};//class AliRICH
+
+//__________________________________________________________________________________________________
+void AliRICH::AddHit(Int_t track, Int_t *vol, Float_t *hits)
+{//Adds the current hit to the RICH hits list
+ TClonesArray &tmp=*fHits;
+ new(tmp[fNhits++])AliRICHhit(fIshunt,track,vol,hits);
+}
+//__________________________________________________________________________________________________
+void AliRICH::AddHit(Int_t track,Int_t iPID,Int_t iChamber,TLorentzVector x4,Float_t eloss)
+{//Adds the current hit to the RICH hits list
+ TClonesArray &tmp=*fHits;
+ new(tmp[fNhits++])AliRICHhit(track,iPID,iChamber,x4,eloss);
+}
+//__________________________________________________________________________________________________
+void AliRICH::AddCerenkov(Int_t track, Int_t *vol, Float_t *cerenkovs)
+{//Adds the current RICH cerenkov hit to the Cerenkovs list
+ TClonesArray &tmp=*fCerenkovs;
+ new(tmp[fNcerenkovs++]) AliRICHCerenkov(fIshunt,track,vol,cerenkovs);
+}
+//__________________________________________________________________________________________________
+void AliRICH::ResetHits()
+{//Resets hits and cerenkovs
+ AliDetector::ResetHits();
+ fNcerenkovs=0;
+ if(fCerenkovs)fCerenkovs->Clear();
+}
+//__________________________________________________________________________________________________
+void AliRICH::AddSDigit(Int_t iC,Int_t iX,Int_t iY,Int_t iAdc,Int_t iT0,Int_t iT1,Int_t iT2)
+{//Adds the current Sdigit to the RICH list of Sdigits
+ TClonesArray &tmp=*fSDigits;
+ new(tmp[fNsdigits++])AliRICHdigit(iC,iX,iY,iAdc,iT0,iT1,iT2);
+}
+//__________________________________________________________________________________________________
+void AliRICH::ResetSDigits()
+{//Resets sdigits
+ fNsdigits=0;
+ if(fSDigits)fSDigits->Clear();
+}
+//__________________________________________________________________________________________________
+void AliRICH::AddDigit(Int_t iC,Int_t iX,Int_t iY,Int_t iAdc,Int_t iT0,Int_t iT1,Int_t iT2)
+{//Adds the current Digit to the RICH list of digits
+ TClonesArray &tmp=*fDigits;
+ new(tmp[fNdigits++]) AliRICHdigit(iC,iX,iY,iAdc,iT0,iT1,iT2);
+}
+#endif