-#ifndef ALIRICH_H
-#define ALIRICH_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 "AliRICHChamber.h"
-static const int kNCH=7;
-class TFile;
+#include "AliRICHDigit.h"
+#include "AliRICHSDigit.h"
-class AliRICHHit;
-class AliRICHSDigit;
class AliRICHRawCluster;
class AliRICHRecHit1D;
class AliRICHRecHit3D;
-class AliRICHClusterFinder;
-class AliRICHDetect;
-class AliRICHChamber;
-class AliRICHCerenkov;
-class AliSegmentation;
-class AliRICHResponse;
-class AliRICHEllipse;
-class AliRICHGeometry;
-class AliRICHMerger;
-
-class AliRICH : public AliDetector {
- public:
- AliRICH();
- AliRICH(const char *name, const char *title);
- AliRICH(const AliRICH& RICH);
- virtual ~AliRICH();
- 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);
-
-
- virtual void BuildGeometry();
- virtual void CreateGeometry();
- virtual void CreateMaterials();
- 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 Int_t IsVersion() const =0;
-//
- TClonesArray *SDigits() {return fSDigits;}
- TClonesArray *Cerenkovs() {return fCerenkovs;}
- virtual void MakeBranch(Option_t *opt=" ", 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);
- virtual void Hits2SDigits();
- virtual void SDigits2Digits();
- virtual void SDigits2Digits(Int_t nev, Int_t flag);
- virtual void Digits2Reco();
-//
-// 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, AliSegmentation *segmentation);
- virtual void SetResponseModel(Int_t id, AliRICHResponse *response);
-// Set Reconstruction Model
- virtual void SetReconstructionModel(Int_t id, AliRICHClusterFinder *reconstruction);
-// Set source debugging level
- void SetDebugLevel(Int_t level) {fDebugLevel=level;}
-// Set Merger
- virtual void SetMerger(AliRICHMerger* thisMerger) {fMerger=thisMerger;}
-// Get source debugging level
- Int_t GetDebugLevel() {return fDebugLevel;}
-// Response Simulation
- virtual Int_t Hits2SDigits(Float_t xhit,Float_t yhit,Float_t eloss,Int_t id, ResponseType res);
-// Return reference to Chamber #id
- virtual AliRICHChamber& Chamber(Int_t id) {return *((AliRICHChamber *) (*fChambers)[id]);}
-// Retrieve pad hits for a given Hit
- virtual AliRICHSDigit* FirstPad(AliRICHHit *hit, TClonesArray *clusters);
- virtual AliRICHSDigit* NextPad(TClonesArray *clusters);
-// 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() {return fRecHits1D;}
- Int_t *Nrechits1D() {return fNrechits1D;}
- virtual TClonesArray *RecHitsAddress1D(Int_t id) {return ((TClonesArray *) (*fRecHits1D)[id]);}
- TObjArray *RecHits3D() {return fRecHits3D;}
- Int_t *Nrechits3D() {return fNrechits3D;}
- virtual TClonesArray *RecHitsAddress3D(Int_t id) {return ((TClonesArray *) (*fRecHits3D)[id]);}
-
-// Return pointers to reconstructed clusters
- virtual TClonesArray *RawClustAddress(Int_t id) {return ((TClonesArray *) (*fRawClusters)[id]);}
-// Assignment operator
- AliRICH& operator=(const AliRICH& rhs);
-
-// Analysis routines
- // Full events
- virtual void DiagnosticsFE(Int_t evNumber1=0,Int_t evNumber2=0);
- // Single events
- virtual void DiagnosticsSE(Int_t diaglevel,Int_t evNumber1=0,Int_t evNumber2=0);
-
- protected:
- TObjArray *fChambers; // List of Tracking Chambers
- 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 eent for event mixing
- Text_t *fFileName; // ! File with background hits
- AliRICHMerger *fMerger; // ! pointer to merger
-
- ClassDef(AliRICH,1) //Hits manager for set:RICH
-};
-#endif
-
-
-
+//__________________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() {;}
+
+ Int_t C() {return fChamber;}
+ Int_t Chamber() {return fChamber;}
+ Int_t Pid() {return fPid;}
+ Int_t Particle() {return fPid;}
+ 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;}
+ void Print(Option_t *option)const; //virtual
+protected:
+ Int_t fChamber; //chamber number
+ Int_t fPid; //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=fPid=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];
+ fPid=(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;
+ fPid=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=fQdc=fTracks[0]=fTracks[1]=fTracks[2]=kBad;}
+ inline AliRICHdigit(Int_t iC,Int_t iX,Int_t iY,Int_t iQdc,Int_t iT1,Int_t iT2,Int_t iT3);
+ virtual ~AliRICHdigit() {;}
+ inline Int_t Compare(const TObject *pObj) const;//virtual
+ Bool_t IsSortable() const{return kTRUE;}//virtual
+ Int_t C() const{return fChamber;}
+ Int_t X() const{return fPadX;}
+ Int_t Y() const{return fPadY;}
+ Int_t Id() const{return fChamber*1000000+fPadX*1000+fPadY;}
+ Int_t Qdc() const{return fQdc;}
+ Int_t T(Int_t i) const{return fTracks[i];}
+ void Print(Option_t *option)const; //virtual
+protected:
+ Int_t fChamber; //module number
+ Int_t fPadX; //pad number along X
+ Int_t fPadY; //pad number along Y
+ Int_t fQdc; //ADC value
+ ClassDef(AliRICHdigit,1) //RICH digit class
+};//class AliRICHdigit
+//__________________________________________________________________________________________________
+AliRICHdigit::AliRICHdigit(Int_t iC,Int_t iX,Int_t iY,Int_t iQdc,Int_t iT0,Int_t iT1,Int_t iT2)
+{
+ fChamber=iC;fPadX=iX;fPadY=iY;fQdc=iQdc;
+ fTracks[0]=iT0;fTracks[1]=iT1;fTracks[2]=iT2;
+}//AliRICHdigit::ctor
+//__________________________________________________________________________________________________
+Int_t AliRICHdigit::Compare(const TObject *pObj)const
+{
+ if(Id()==((AliRICHdigit*)pObj)->Id())
+ return 0;
+ else if(Id()>((AliRICHdigit*)pObj)->Id())
+ return 1;
+ else
+ return -1;
+}//Int_t AliRICHdigit::Compare(const TObject *pObj)
+
+//__________________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;
+ void Hits2SDigits(); //virtual
+ void SDigits2Digits(); //virtual
+ void Digits2Reco(); //virtual
+
+ inline void CreateHits();
+ inline void CreateSdigits();
+ inline void CreateDigits();
+ inline void CreateClusters();
+ 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 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 AddSdigit(TObject *pDigit);
+ 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); //virtual
+ void AddCluster() {;}
+ void ResetHits() {AliDetector::ResetHits();fNcerenkovs=0;if(fCerenkovs)fCerenkovs->Clear();fNspecials=0;if(fSpecials)fSpecials->Clear();} //virtual
+ void ResetSdigits() {fNsdigits=0; if(fSdigits) fSdigits ->Clear();}
+ void ResetClusters(){if(fClusters)for(int i=0;i<kNCH;i++){fClusters->At(i)->Clear();fNclusters[i]=0;}}
+ //Hits provided by AliDetector
+ TClonesArray* Sdigits() const{return fSdigits;}
+ TClonesArray* Digits(Int_t iC) const{if(fDchambers) return (TClonesArray *)fDchambers->At(iC-1);else return 0;}//virtual
+ TClonesArray* Clusters(Int_t iC) const{if(fClusters) return (TClonesArray *)fClusters->At(iC-1);else return 0;}
+
+ AliRICHChamber* C(Int_t iC) const{return (AliRICHChamber*)fChambers->At(iC-1);}
+ AliRICHParam* Param() const{return fpParam;}
+
+ AliRICHhit* FirstHit(Int_t iTrkN) {return (AliRICHhit*)AliDetector::FirstHit(iTrkN);} //virtual
+ AliRICHhit* NextHit() {return (AliRICHhit*)AliDetector::NextHit();} //virtual
+
+ TClonesArray* Specials() const{return fSpecials;}
+ TClonesArray* Cerenkovs() const{return fCerenkovs;}
+
+
+ inline void AddCerenkov(Int_t track, Int_t *vol, Float_t *cerenkovs);
+ inline void AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits);
+ inline void CreateCerenkovsOld();
+ inline void CreateSpecialsOld();
+ inline void CreateDigitsOld();
+ inline void CreateRawClustersOld();
+ inline void CreateRecos1Old();
+ inline void CreateRecos3Old();
+ void ResetDigits() {if(fDchambers) for(int i=0;i<kNCH;i++){fDchambers->At(i)->Clear();fNdch[i]=0;}} //virtual
+ void ResetSpecials(){fNspecials=0; if(fSpecials) fSpecials->Clear();}
+ void ResetRawClusters(){if(fRawClusters)for(int i=0;i<kNCH;i++){fRawClusters->At(i)->Clear();fNrawch[i]=0;}}
+ void ResetRecHits1D() {if(fRecHits1D) for(int i=0;i<kNCH;i++){fRecHits1D ->At(i)->Clear();fNrechits1D[i]=0;}}
+ void ResetRecHits3D() {if(fRecHits3D) for(int i=0;i<kNCH;i++){fRecHits3D ->At(i)->Clear();fNrechits3D[i]=0;}}
+
+ void CreateChambers();
+ void CreateMaterials(); //virtual
+ virtual void BuildGeometry(); //virtual
+ virtual void CreateGeometry(); //virtual
+ Float_t AbsoCH4(Float_t x);
+ Float_t Fresnel(Float_t ene,Float_t pdoti, Bool_t pola);
+
+ virtual void StepManager()=0;
+ void GenerateFeedbacks(Int_t iChamber,Float_t eloss);
+ void Print(Option_t *option)const;//virtual
+ void MakeBranch(Option_t *opt=" ");
+ void SetTreeAddress();//virtual
+
+
+
+ AliRICHChamber& Chamber(Int_t id) {return *((AliRICHChamber *) (*fChambers)[id]);}
+ inline void AddSDigit(Int_t *);
+ 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);
+ TObjArray *Dchambers() const{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) const{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]);}
+// Int_t DistancetoPrimitive(Int_t /*px*/, Int_t /*py*/) {return 9999;}
+
+protected:
+ AliRICHParam *fpParam; //main RICH parametrization
+ TObjArray *fChambers; //list of RICH chambers
+ //fHits and fDigits belong to AliDetector
+ TClonesArray *fSdigits; //! List of sdigits
+ Int_t fNsdigits; //Current number of sdigits
+ TObjArray *fDigitsNew; //! Each chamber holds it's one lists of digits
+ Int_t fNdigitsNew[kNCH]; //Array of current numbers of digits
+ TObjArray *fClusters; //! Each chamber holds it's one lists of clusters
+ Int_t fNclusters[kNCH]; //Array of current numbers of raw clusters
+ TClonesArray *fCerenkovs; //! ??? List of cerenkovs
+ Int_t fNcerenkovs; //??? Current number of cerenkovs
+ TClonesArray *fSpecials; //! ??? List of specials
+ Int_t fNspecials; //??? Current number of specials
+ TObjArray *fDchambers; //! Array of lists of digits
+ Int_t fNdch[kNCH]; //Array of current numbers of digits
+ TObjArray *fRawClusters; //! Array of lists of raw clusters
+ Int_t fNrawch[kNCH]; //Array of current numbers of raw clusters
+ TObjArray *fRecHits1D; //!List of rec. hits
+ Int_t fNrechits1D[kNCH]; //Array of current numbers of rec hits 1D
+ TObjArray *fRecHits3D; //!List of rec. hits
+ 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,3) //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);
+}//AddHit() old
+//__________________________________________________________________________________________________
+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);
+}//AddHit() new
+//__________________________________________________________________________________________________
+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::AddSdigit(TObject *pDigit)
+{//Adds the current Sdigit to the RICH list of Sdigits
+ TClonesArray &tmp=*fSdigits;
+ tmp[fNsdigits++]=pDigit;
+}//AddSdigit()
+//__________________________________________________________________________________________________
+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 corresponding RICH list of digits (individual list per chamber)
+ TClonesArray &tmp=*((TClonesArray*)fDigitsNew->At(iC-1));
+ new(tmp[fNdigitsNew[iC-1]++]) AliRICHdigit(iC,iX,iY,iAdc,iT0,iT1,iT2);
+}//AddDigit()
+//__________________________________________________________________________________________________
+void AliRICH::CreateHits()
+{
+ if(fHits) return;
+ if(GetDebug())Info("CreateHits","creating hits container.");
+ fHits=new TClonesArray("AliRICHhit",10000); fNhits=0;
+}//CreateHits()
+//__________________________________________________________________________________________________
+void AliRICH::CreateSdigits()
+{
+ if(fSdigits) return;
+ if(GetDebug())Info("CreateSdigits","creating sdigits container.");
+ fSdigits=new TClonesArray("AliRICHdigit",10000); fNsdigits=0;
+}//CreateSdigits()
+//__________________________________________________________________________________________________
+void AliRICH::CreateDigits()
+{
+ if(fDigitsNew) return;
+ if(GetDebug())Info("CreateDigits","creating digits containers.");
+ fDigitsNew = new TObjArray(kNCH);
+ for(Int_t i=0;i<kNCH;i++) {fDigitsNew->AddAt(new TClonesArray("AliRICHdigit",10000), i); fNdigitsNew[i]=0;}
+}//CreateDigits()
+//__________________________________________________________________________________________________
+void AliRICH::CreateClusters()
+{
+ if(fClusters) return;
+ if(GetDebug())Info("CreateClusters","creating clusters containers.");
+ fClusters = new TObjArray(kNCH);
+ for(Int_t i=0;i<kNCH;i++) {fClusters->AddAt(new TClonesArray("AliRICHcluster",10000), i); fNclusters[i]=0;}
+}//CreateClusters()
+//__________________________________________________________________________________________________
+void AliRICH::CreateCerenkovsOld()
+{
+ if(fCerenkovs) return;
+ if(GetDebug())Info("CreateCerenkovs","creating cerenkovs container.");
+ fCerenkovs=new TClonesArray("AliRICHCerenkov",10000); fNcerenkovs=0;
+}//CreateCerenkovsOld()
+//__________________________________________________________________________________________________
+void AliRICH::CreateSpecialsOld()
+{
+ if(fSpecials) return;
+ if(GetDebug())Info("CreateSpecialsOld","creating SDigits special container.");
+ fSpecials=new TClonesArray("AliRICHSDigit",100000); fNspecials=0;
+}//CreateSpecialsOld()
+//__________________________________________________________________________________________________
+void AliRICH::CreateDigitsOld()
+{
+ if(fDchambers) return;
+ if(GetDebug())Info("CreateDigitsOld","creating digits containers.");
+ fDchambers = new TObjArray(kNCH);
+ for(Int_t i=0;i<kNCH;i++) fDchambers->AddAt(new TClonesArray("AliRICHDigit",10000), i);
+}//CreateDigitsOld()
+//__________________________________________________________________________________________________
+void AliRICH::CreateRawClustersOld()
+{
+ if(fRawClusters) return;
+ if(GetDebug())Info("CreateClustersOld","creating clusters containers.");
+ fRawClusters = new TObjArray(kNCH);
+ for(Int_t i=0; i<kNCH ;i++) fRawClusters->AddAt(new TClonesArray("AliRICHRawCluster",10000), i);
+}//CreateRawClustersOld()
+//__________________________________________________________________________________________________
+void AliRICH::CreateRecos1Old()
+{
+ if(fRecHits1D) return;
+ if(GetDebug())Info("CreateRecos1DOld","creating recos 1 containers.");
+ fRecHits1D = new TObjArray(kNCH);
+ for(Int_t i=0; i<kNCH ;i++) fRecHits1D->AddAt(new TClonesArray("AliRICHRecHit1D",1000), i);
+}
+//__________________________________________________________________________________________________
+void AliRICH::CreateRecos3Old()
+{
+ if(fRecHits3D) return;
+ if(GetDebug())Info("CreateRecos3DOld","creating recos 3 containers.");
+ fRecHits3D = new TObjArray(kNCH);
+ for(Int_t i=0; i<kNCH ;i++) fRecHits3D->AddAt(new TClonesArray("AliRICHRecHit3D",1000), i);
+}
+//__________________________________________________________________________________________________
+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::AddSDigit(Int_t *aSDigit)
+{// Adds the current Sdigit to the RICH list of Specials
+ TClonesArray &lSDigits = *fSpecials;
+ new(lSDigits[fNspecials++]) AliRICHSDigit(aSDigit);
+}//AddSDigit
+//__________________________________________________________________________________________________
+void AliRICH::AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits)
+{// Adds the current digit to the RICH list of S digits
+ TClonesArray &ldigits = *((TClonesArray*)fDchambers->At(id));
+ new(ldigits[fNdch[id]++]) AliRICHDigit(tracks,charges,digits);
+}//AddDigits
+//__________________________________________________________________________________________________
+#endif//#ifndef AliRICH_h