]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RICH/AliRICH.h
old and new style in paralel
[u/mrichter/AliRoot.git] / RICH / AliRICH.h
index 712d2b4b3c84377295145c59c17c461e365031aa..b567391acacb1a9dbc95c065cbf9698245dcac8c 100644 (file)
-#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