Inheritance from TObject. Automatic streamers.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSGetter.cxx
index fdbf115..3a1b88b 100644 (file)
@@ -52,6 +52,7 @@
 #include "TROOT.h"
 #include "TObjString.h"
 #include "TFolder.h"
+#include "TParticle.h"
 
 // --- Standard library ---
 #include <iostream.h>
@@ -82,6 +83,8 @@ AliPHOSGetter::AliPHOSGetter(const char* headerFile, const char* branchTitle )
 {
   //Initialize  all lists
 
+  fDebug = 0 ; 
+  
   fHeaderFile         = headerFile ; 
   fBranchTitle        = branchTitle ;
   fSDigitsTitle       = branchTitle ; 
@@ -92,13 +95,14 @@ AliPHOSGetter::AliPHOSGetter(const char* headerFile, const char* branchTitle )
 
   fPrimaries = new TObjArray(1) ;
 
-  fModuleFolder  = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Configuration/Modules")); 
-  fHitsFolder    = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data/Hits")); 
-  fSDigitsFolder = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data/SDigits")); 
-  fDigitsFolder  = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Event/Data")); 
-  fRecoFolder    = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Event/RecData")); 
-  fQAFolder      = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Conditions/QA")); 
-  fTasksFolder   = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Tasks")) ; 
+  fModuleFolder    = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Configuration/Modules")); 
+  fPrimariesFolder = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data")); 
+  fHitsFolder      = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data/Hits")); 
+  fSDigitsFolder   = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/RunMC/Event/Data/SDigits")); 
+  fDigitsFolder    = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Event/Data")); 
+  fRecoFolder      = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Event/RecData")); 
+  fQAFolder        = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Run/Conditions/QA")); 
+  fTasksFolder     = dynamic_cast<TFolder*>(gROOT->FindObjectAny("Folders/Tasks")) ; 
 
   if ( fHeaderFile != "aliroot"  ) { // to call the getter without a file
 
@@ -117,21 +121,21 @@ AliPHOSGetter::AliPHOSGetter(const char* headerFile, const char* branchTitle )
       }
       
       gAlice = static_cast<AliRun *>(file->Get("gAlice")) ;
-      
-      if (!gAlice) {
-       cerr << "ERROR : AliPHOSGetter::AliPHOSGetter -> Cannot find gAlice in " << fHeaderFile.Data() << endl ; 
-       abort() ; 
-      }
-      if (!PHOS()) {
-       if (fDebug)
-         cout << "INFO: AliPHOSGetter -> Posting PHOS to Folders" << endl ; 
-       AliConfig * conf = AliConfig::Instance() ; 
-       conf->Add(static_cast<AliDetector*>(gAlice->GetDetector("PHOS"))) ; 
-       conf->Add(static_cast<AliModule*>(gAlice->GetDetector("PHOS"))) ; 
-     }
     }
+  }
 
+  if (!gAlice) {
+    cerr << "ERROR : AliPHOSGetter::AliPHOSGetter -> Cannot find gAlice in " << fHeaderFile.Data() << endl ; 
+    abort() ; 
+  }
+  if (!PHOS()) {
+    if (fDebug)
+      cout << "INFO: AliPHOSGetter -> Posting PHOS to Folders" << endl ; 
+    AliConfig * conf = AliConfig::Instance() ; 
+    conf->Add(static_cast<AliDetector*>(gAlice->GetDetector("PHOS"))) ; 
+    conf->Add(static_cast<AliModule*>(gAlice->GetDetector("PHOS"))) ; 
   }
+  
   fDebug=0;
 }
 //____________________________________________________________________________ 
@@ -203,6 +207,53 @@ const AliPHOSGeometry * AliPHOSGetter::PHOSGeometry()
 } 
 
 //____________________________________________________________________________ 
+Bool_t AliPHOSGetter::PostPrimaries(void) const 
+{  //------- Primaries ----------------------
+
+  // the hierarchy is //Folders/RunMC/Event/Data/Primaries
+  
+  TFolder * primariesFolder = dynamic_cast<TFolder*>(fPrimariesFolder->FindObject("Primaries")) ; 
+  if ( !primariesFolder ) {
+    if (fDebug) {
+      cout << "WARNING: AliPHOSGetter::Post Primaries -> Folder //" << fPrimariesFolder << "/Primaries/ not found!" << endl;
+      cout << "INFO:    AliPHOSGetter::Post Primaries -> Adding Folder //" << fPrimariesFolder << "/Primaries/"  << endl;
+    }
+    primariesFolder = fPrimariesFolder->AddFolder("Primaries", "Primaries particles from TreeK") ; 
+  }    
+  TClonesArray *primaries=  new TClonesArray("TParticle",1000) ;
+  primaries->SetName("Primaries") ;
+  primariesFolder->Add(primaries) ; 
+  
+  return kTRUE;
+} 
+
+//____________________________________________________________________________ 
+TObject** AliPHOSGetter::PrimariesRef(void) const 
+{  //------- Primaries ----------------------
+
+  
+  // the hierarchy is //Folders/RunMC/Event/Data/Primaries
+  if ( !fPrimariesFolder ) {
+    cerr << "ERROR: AliPHOSGetter::Post PrimariesRef -> Folder //" << fPrimariesFolder << " not found!" << endl;
+    return 0;
+  }    
+  TFolder * primariesFolder = dynamic_cast<TFolder *>(fPrimariesFolder->FindObject("Primaries")) ;
+  if ( !primariesFolder ) {
+    cerr << "ERROR: AliPHOSGetter::Post PrimariesRef -> Folder //" << fPrimariesFolder << "/Primaries/ not found!" << endl;  
+    return 0;
+  }
+  TObject * p = primariesFolder->FindObject("Primaries") ;
+  if(!p) {
+    cerr << "ERROR: AliPHOSGetter::PrimariesRef -> " << primariesFolder->GetName() << "/Primaries not found !" << endl ; 
+    return 0 ;
+  }
+  else
+    return primariesFolder->GetListOfFolders()->GetObjectRef(p) ;
+}
+
+//____________________________________________________________________________ 
 Bool_t AliPHOSGetter::PostHits(void) const 
 {  //------- Hits ----------------------
 
@@ -224,7 +275,7 @@ Bool_t AliPHOSGetter::PostHits(void) const
 } 
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::HitsRef(void) const 
+TObject** AliPHOSGetter::HitsRef(void) const 
 {  //------- Hits ----------------------
 
   
@@ -246,7 +297,7 @@ void * AliPHOSGetter::HitsRef(void) const
     return 0 ;
   }
   else
-    return static_cast<void *>(phosFolder->GetListOfFolders()->GetObjectRef(h)) ;
+    return phosFolder->GetListOfFolders()->GetObjectRef(h) ;
 }
 
 //____________________________________________________________________________ 
@@ -266,6 +317,7 @@ Bool_t AliPHOSGetter::PostSDigits(const char * name, const char * headerFile) co
     phosFolder = fSDigitsFolder->AddFolder("PHOS", "SDigits from PHOS") ; 
   }    
   TString subdir(headerFile) ;
+  subdir.ReplaceAll("/","_") ; 
   TFolder * phosSubFolder = dynamic_cast<TFolder*>(phosFolder->FindObject(subdir)) ; 
   if ( !phosSubFolder ) 
     phosSubFolder = phosFolder->AddFolder(subdir, ""); 
@@ -276,7 +328,7 @@ Bool_t AliPHOSGetter::PostSDigits(const char * name, const char * headerFile) co
       cerr <<"INFO: AliPHOSGetter::Post S -> Folder " << subdir 
           << " already exists!" << endl ;  
   }else{
-    TClonesArray * sdigits = new TClonesArray("AliPHOSDigit",1000) ;
+    TClonesArray * sdigits = new TClonesArray("AliPHOSDigit",1) ;
     sdigits->SetName(name) ;
     phosSubFolder->Add(sdigits) ;
   }
@@ -284,7 +336,7 @@ Bool_t AliPHOSGetter::PostSDigits(const char * name, const char * headerFile) co
   return kTRUE;
 } 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::SDigitsRef(const char * name, const char * file) const 
+TObject** AliPHOSGetter::SDigitsRef(const char * name, const char * file) const 
 {  //------- SDigits ----------------------
   
   // the hierarchy is //Folders/RunMC/Event/Data/PHOS/SDigits/filename/SDigits
@@ -315,7 +367,7 @@ void * AliPHOSGetter::SDigitsRef(const char * name, const char * file) const
   if(!dis)
     return 0 ;
   else
-    return static_cast<void *>(phosSubFolder->GetListOfFolders()->GetObjectRef(dis)) ;
+    return phosSubFolder->GetListOfFolders()->GetObjectRef(dis) ;
 
 }
 
@@ -353,7 +405,7 @@ Bool_t AliPHOSGetter::PostSDigitizer(AliPHOSSDigitizer * sdigitizer) const
 }
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::SDigitizerRef(const char * name) const 
+TObject** AliPHOSGetter::SDigitizerRef(const char * name) const 
 {  
 
   TTask * sd  = dynamic_cast<TTask*>(fTasksFolder->FindObject("SDigitizer")) ; 
@@ -370,7 +422,7 @@ void * AliPHOSGetter::SDigitizerRef(const char * name) const
 
   TTask * task = dynamic_cast<TTask*>(phos->GetListOfTasks()->FindObject(name)) ; 
 
-  return static_cast<void *>(phos->GetListOfTasks()->GetObjectRef(task)) ;
+  return phos->GetListOfTasks()->GetObjectRef(task) ;
 
 }
 
@@ -400,6 +452,7 @@ Bool_t AliPHOSGetter::PostSDigitizer(const char * name, const char * file) const
   TString sdname(name) ;
   sdname.Append(":") ;
   sdname.Append(file);
+  sdname.ReplaceAll("/","_") ; 
   AliPHOSSDigitizer * phossd  = dynamic_cast<AliPHOSSDigitizer *>(phos->GetListOfTasks()->FindObject( sdname )); 
   if (!phossd) {
     phossd = new AliPHOSSDigitizer() ;  
@@ -438,7 +491,7 @@ Bool_t AliPHOSGetter::PostDigits(const char * name) const
 }
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::DigitsRef(const char * name) const 
+TObject** AliPHOSGetter::DigitsRef(const char * name) const 
 { //------- Digits ----------------------
   
   // the hierarchy is //Folders/Run/Event/Data/PHOS/Digits/name
@@ -458,7 +511,7 @@ void * AliPHOSGetter::DigitsRef(const char * name) const
   if(!d)
     return 0 ;
   else
-    return static_cast<void *>(phosFolder->GetListOfFolders()->GetObjectRef(d)) ;
+    return phosFolder->GetListOfFolders()->GetObjectRef(d) ;
 
 }
 
@@ -524,7 +577,7 @@ Bool_t AliPHOSGetter::PostDigitizer(const char * name) const
 }
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::DigitizerRef(const char * name) const 
+TObject** AliPHOSGetter::DigitizerRef(const char * name) const 
 {  
   TTask * sd  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Digitizer")) ; 
   if ( !sd ) {
@@ -540,7 +593,7 @@ void * AliPHOSGetter::DigitizerRef(const char * name) const
 
   TTask * task = dynamic_cast<TTask*>(phos->GetListOfTasks()->FindObject(name)) ; 
 
-  return static_cast<void *>(phos->GetListOfTasks()->GetObjectRef(task)) ;
+  return phos->GetListOfTasks()->GetObjectRef(task) ;
 
 }
  
@@ -598,7 +651,7 @@ Bool_t AliPHOSGetter::PostRecPoints(const char * name) const
 }
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::EmcRecPointsRef(const char * name) const 
+TObject** AliPHOSGetter::EmcRecPointsRef(const char * name) const 
 { // -------------- RecPoints -------------------------------------------
   
   // the hierarchy is //Folders/Run/Event/RecData/PHOS/EMCARecPoints/name
@@ -619,12 +672,12 @@ void * AliPHOSGetter::EmcRecPointsRef(const char * name) const
   if ( !erp )   {
     return 0 ;
   }
-  return static_cast<void *>(phosFolder->GetListOfFolders()->GetObjectRef(erp)) ;
+  return phosFolder->GetListOfFolders()->GetObjectRef(erp) ;
 
 } 
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::CpvRecPointsRef(const char * name) const 
+TObject** AliPHOSGetter::CpvRecPointsRef(const char * name) const 
 { // -------------- RecPoints -------------------------------------------
   
   // the hierarchy is //Folders/Run/Event/RecData/PHOS/CPVRecPoints/name
@@ -644,7 +697,7 @@ void * AliPHOSGetter::CpvRecPointsRef(const char * name) const
   if ( !crp )   {
     return 0 ;
   }
-  return static_cast<void *>(phosFolder->GetListOfFolders()->GetObjectRef(crp)) ;
+  return phosFolder->GetListOfFolders()->GetObjectRef(crp) ;
 
 } 
 
@@ -683,7 +736,7 @@ Bool_t AliPHOSGetter::PostClusterizer(AliPHOSClusterizer * clu) const
 } 
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::ClusterizerRef(const char * name) const 
+TObject** AliPHOSGetter::ClusterizerRef(const char * name) const 
 { // ------------------ AliPHOSClusterizer ------------------------
   
   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
@@ -714,7 +767,7 @@ void * AliPHOSGetter::ClusterizerRef(const char * name) const
   }
 
   if(clu) 
-    return static_cast<void *>(l->GetObjectRef(clu)) ;
+    return l->GetObjectRef(clu) ;
   else
     return 0 ;
 }
@@ -786,7 +839,7 @@ Bool_t AliPHOSGetter::PostTrackSegments(const char * name) const
 } 
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::TrackSegmentsRef(const char * name) const 
+TObject** AliPHOSGetter::TrackSegmentsRef(const char * name) const 
 { // ---------------TrackSegments -----------------------------------
   
   // the hierarchy is //Folders/Run/Event/RecData/PHOS/TrackSegments/name
@@ -806,7 +859,7 @@ void * AliPHOSGetter::TrackSegmentsRef(const char * name) const
   if (!tss) {
     return 0 ;  
   }
-  return static_cast<void *>(phosFolder->GetListOfFolders()->GetObjectRef(tss)) ;
+  return phosFolder->GetListOfFolders()->GetObjectRef(tss) ;
 } 
 
 //____________________________________________________________________________ 
@@ -880,7 +933,7 @@ Bool_t AliPHOSGetter::PostTrackSegmentMaker(const char * name) const
 } 
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::TSMakerRef(const char * name) const 
+TObject** AliPHOSGetter::TSMakerRef(const char * name) const 
 { //------------Track Segment Maker ------------------------------
   
   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
@@ -911,7 +964,7 @@ void * AliPHOSGetter::TSMakerRef(const char * name) const
   }
   
   if(tsm) 
-    return static_cast<void *>(l->GetObjectRef(tsm)) ;
+    return l->GetObjectRef(tsm) ;
   else
     return 0 ;
   
@@ -952,7 +1005,7 @@ Bool_t AliPHOSGetter::PostRecParticles(const char * name) const
 } 
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::RecParticlesRef(const char * name) const 
+TObject** AliPHOSGetter::RecParticlesRef(const char * name) const 
 { // ---------------TrackSegments -----------------------------------
   
   // the hierarchy is //Folders/Run/Event/RecData/PHOS/TrackSegments/name
@@ -972,7 +1025,7 @@ void * AliPHOSGetter::RecParticlesRef(const char * name) const
   if (!tss) {
     return 0 ;  
   }
-  return static_cast<void *>(phosFolder->GetListOfFolders()->GetObjectRef(tss)) ;
+  return phosFolder->GetListOfFolders()->GetObjectRef(tss) ;
 }
 
 //____________________________________________________________________________ 
@@ -1050,7 +1103,7 @@ Bool_t AliPHOSGetter::PostPID(const char * name) const
 } 
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::PIDRef(const char * name) const 
+TObject** AliPHOSGetter::PIDRef(const char * name) const 
 { //------------PID ------------------------------
 
   TTask * tasks  = dynamic_cast<TTask*>(fTasksFolder->FindObject("Reconstructioner")) ; 
@@ -1081,7 +1134,7 @@ void * AliPHOSGetter::PIDRef(const char * name) const
   }
   
   if(pid) 
-    return static_cast<void *>(l->GetObjectRef(pid)) ;
+    return l->GetObjectRef(pid) ;
   else
     return 0 ;
   
@@ -1106,7 +1159,7 @@ Bool_t AliPHOSGetter::PostQA(void) const
 }
 
 //____________________________________________________________________________ 
-void * AliPHOSGetter::AlarmsRef(void) const 
+TObject** AliPHOSGetter::AlarmsRef(void) const 
 {  //------- Alarms ----------------------
 
   
@@ -1122,7 +1175,7 @@ void * AliPHOSGetter::AlarmsRef(void) const
     return 0;
   }
    
-  return static_cast<void *>(fQAFolder->GetListOfFolders()->GetObjectRef(phosFolder)) ;
+  return fQAFolder->GetListOfFolders()->GetObjectRef(phosFolder) ;
 }
 
 //____________________________________________________________________________ 
@@ -1132,23 +1185,47 @@ const TParticle * AliPHOSGetter::Primary(Int_t index) const
 
   if(index < 0) 
     return 0 ;
+  TParticle *  p = gAlice->Particle(index) ; 
+  if (p->GetFirstMother() != -1 ) {
+    cout << "AliPHOSGetter::Primary : Not a primary " << endl ; 
+  }
+  return p ; 
   
-  Int_t primaryIndex = index % 10000000 ; 
-  Int_t primaryList = (Int_t ) ((index-primaryIndex)/10000000.)  ;
   
-  if ( primaryList > 0  ) {
-    if (fDebug) {
-      cout << " Getter does not support currently Mixing of primary " << endl ;
-      cout << "   can not return primary: " << index<< " (list "<< primaryList<< " primary # " << primaryIndex << " )"<<endl ;
-    }
-    return 0;
-  }
+//   Int_t primaryIndex = index % 10000000 ; 
+//   Int_t primaryList = (Int_t ) ((index-primaryIndex)/10000000.)  ;
   
-  return gAlice->Particle(primaryIndex) ;
+//   if ( primaryList > 0  ) {
+//     if (fDebug) {
+//       cout << " Getter does not support currently Mixing of primary " << endl ;
+//       cout << "   can not return primary: " << index<< " (list "<< primaryList<< " primary # " << primaryIndex << " )"<<endl ;
+//     }
+//     return 0;
+//   }
+  
+//   return gAlice->Particle(primaryIndex) ;
   
 }
 
 //____________________________________________________________________________ 
+const TParticle * AliPHOSGetter::Secondary(TParticle* p, Int_t index) const
+{
+  // Return first (index=1) or second (index=2) secondary particle of primary particle p 
+
+  if(index <= 0) 
+    return 0 ;
+  if(index > 2)
+    return 0 ;
+
+  if(p) {
+  Int_t daughterIndex = p->GetDaughter(index-1) ; 
+  return  gAlice->Particle(daughterIndex) ; 
+  }
+  else
+    return 0 ;
+}
+
+//____________________________________________________________________________ 
 void AliPHOSGetter::ReadTreeD()
 {
   // Read the digit tree gAlice->TreeD()  
@@ -1217,10 +1294,27 @@ void AliPHOSGetter::ReadTreeH()
   if(!Hits())
     PostHits() ;
 
-  hitsbranch->SetAddress(HitsRef()) ;
-
-  hitsbranch->GetEntry(0) ;
-
+  if (hitsbranch->GetEntries() > 1 ) {
+    TClonesArray * tempo =  new TClonesArray("AliPHOSHit",1000) ;
+    TClonesArray * hits = dynamic_cast<TClonesArray*>(*HitsRef()) ; 
+    hitsbranch->SetAddress(&tempo) ;
+    Int_t index = 0 ; 
+    Int_t i = 0 ;
+    for (i = 0 ; i < hitsbranch->GetEntries() ; i++) {
+      hitsbranch->GetEntry(i) ;
+      Int_t j = 0 ; 
+      for ( j = 0 ; j < tempo->GetEntries() ; j++) { 
+       const AliPHOSHit * hit = static_cast<const AliPHOSHit *>(tempo->At(j)) ; 
+       new((*hits)[index]) AliPHOSHit( *hit ) ;
+       index++ ; 
+      }
+    }
+    delete tempo ; 
+  }
+  else {
+    hitsbranch->SetAddress(HitsRef()) ;
+    hitsbranch->GetEntry(0) ;
+  }
 }
 
 //____________________________________________________________________________ 
@@ -1241,6 +1335,7 @@ void AliPHOSGetter::Track(Int_t itrack)
   }  
   if(!Hits())
     PostHits() ;
+
   hitsbranch->SetAddress(HitsRef()) ;
   hitsbranch->GetEntry(itrack) ;
 
@@ -1334,16 +1429,18 @@ void AliPHOSGetter::ReadTreeR()
   }   
   
   // Read and Post the RecPoints
-  if(!EmcRecPoints(fRecPointsTitle) )
+  if(!EmcRecPoints(fRecPointsTitle) ) 
     PostRecPoints(fRecPointsTitle) ;
+
   emcbranch->SetAddress(EmcRecPointsRef(fRecPointsTitle)) ;
   emcbranch->GetEntry(0) ;
 
-  cpvbranch->SetAddress(CpvRecPointsRef(fRecPointsTitle)) ;
+  cpvbranch->SetAddress(CpvRecPointsRef(fRecPointsTitle)) ; 
   cpvbranch->GetEntry(0) ;
   
   if(!Clusterizer(fRecPointsTitle) )
     PostClusterizer(fRecPointsTitle) ;
+
   clusterizerbranch->SetAddress(ClusterizerRef(fRecPointsTitle)) ;
   clusterizerbranch->GetEntry(0) ;
  
@@ -1376,12 +1473,14 @@ void AliPHOSGetter::ReadTreeR()
   // Read and Post the TrackSegments
   if(!TrackSegments(fTrackSegmentsTitle))
     PostTrackSegments(fTrackSegmentsTitle) ;
+
   tsbranch->SetAddress(TrackSegmentsRef(fTrackSegmentsTitle)) ;
   tsbranch->GetEntry(0) ;
   
   // Read and Post the TrackSegment Maker
   if(!TrackSegmentMaker(fTrackSegmentsTitle))
     PostTrackSegmentMaker(fTrackSegmentsTitle) ;
   tsmakerbranch->SetAddress(TSMakerRef(fTrackSegmentsTitle)) ;
   tsmakerbranch->GetEntry(0) ;
   
@@ -1414,12 +1513,14 @@ void AliPHOSGetter::ReadTreeR()
   // Read and Post the RecParticles
   if(!RecParticles(fRecParticlesTitle))
     PostRecParticles(fRecParticlesTitle) ;
+
   rpabranch->SetAddress(RecParticlesRef(fRecParticlesTitle)) ;
   rpabranch->GetEntry(0) ;
   
   // Read and Post the PID
   if(!PID(fRecParticlesTitle))
     PostPID(fRecParticlesTitle) ;
+
   pidbranch->SetAddress(PIDRef(fRecParticlesTitle)) ;
   pidbranch->GetEntry(0) ;
   
@@ -1438,8 +1539,12 @@ void AliPHOSGetter::ReadTreeS(Int_t event)
   TCollection * folderslist = phosF->GetListOfFolders() ; 
   
   //Add current file to list if it is not there yet
-  if ( (fHeaderFile != "aliroot") && ( !folderslist->Contains(fHeaderFile) ) ){
-    phosF->AddFolder(fHeaderFile, ""); 
+  
+  TString subdir(fHeaderFile) ;
+  subdir.ReplaceAll("/","_") ; 
+
+  if ( (subdir != "aliroot") && ( !folderslist->Contains(subdir) ) ){
+    phosF->AddFolder(subdir, ""); 
   }
     
   TIter next(folderslist) ; 
@@ -1447,11 +1552,12 @@ void AliPHOSGetter::ReadTreeS(Int_t event)
   TFile * file; 
   TTree * treeS = 0;
   while ( (folder = static_cast<TFolder*>(next())) ) {
-    if(fHeaderFile.CompareTo(folder->GetName()) == 0 ) 
+    TString fileName(folder->GetName()) ; 
+    fileName.ReplaceAll("_","/") ; 
+    if(fHeaderFile.CompareTo(fileName) == 0 ) 
       treeS=gAlice->TreeS() ;
     else{
-     cout << " AliPHOSGetter::ReadTreeS 2 " <<  folder->GetName() << endl ; 
-     file = static_cast<TFile*>(gROOT->GetFile(folder->GetName())); 
+      file = static_cast<TFile*>(gROOT->GetFile(fileName)); 
       file->cd() ;
       
       // Get SDigits Tree header from file
@@ -1492,6 +1598,7 @@ void AliPHOSGetter::ReadTreeS(Int_t event)
     
     if ( !folder->FindObject(fSDigitsTitle) )  
       PostSDigits(fSDigitsTitle,folder->GetName()) ;
+
     sdigitsBranch->SetAddress(SDigitsRef(fSDigitsTitle,folder->GetName())) ;
     sdigitsBranch->GetEntry(0) ;
     
@@ -1500,6 +1607,7 @@ void AliPHOSGetter::ReadTreeS(Int_t event)
     sdname+=folder->GetName() ;
     if(!SDigitizer(sdname) ) 
       PostSDigitizer(fSDigitsTitle,folder->GetName()) ;
+
     sdigitizerBranch->SetAddress(SDigitizerRef(sdname)) ;
     sdigitizerBranch->GetEntry(0) ;
     
@@ -1510,7 +1618,9 @@ void AliPHOSGetter::ReadTreeS(Int_t event)
   next.Reset();
   folder = static_cast<TFolder*>(next());
   if(folder){
-    file   = static_cast<TFile*>(gROOT->GetFile(folder->GetName())); 
+    TString fileName(folder->GetName()) ; 
+    fileName.ReplaceAll("_","/") ; 
+    file   = static_cast<TFile*>(gROOT->GetFile(fileName)); 
     file   ->cd() ;
   }
   
@@ -1557,15 +1667,15 @@ void AliPHOSGetter::ReadTreeS(TTree * treeS, Int_t input)
     PostSDigits(sdigitsBranch->GetTitle(),filename) ;
 
   sdigitsBranch->SetAddress(SDigitsRef(sdigitsBranch->GetTitle(),filename)) ;
+  sdigitsBranch->GetEntry(0) ;
   
   TString sdname(sdigitsBranch->GetTitle()) ;
   sdname+=":" ;
   sdname+=filename ;
   if(!SDigitizer(sdigitsBranch->GetTitle()) )
     PostSDigitizer(sdigitsBranch->GetTitle(),filename) ;
+
   sdigitizerBranch->SetAddress(SDigitizerRef(sdname)) ;
-  
-  sdigitsBranch->GetEntry(0) ;
   sdigitizerBranch->GetEntry(0) ;
   
 }    
@@ -1574,16 +1684,47 @@ void AliPHOSGetter::ReadTreeS(TTree * treeS, Int_t input)
 //____________________________________________________________________________ 
 void AliPHOSGetter::ReadPrimaries()
 {
-  // Reads specific branches of primaries
+
+  
+  // Read the first entry of PHOS branch in hit tree gAlice->TreeH()
+  TTree * particleTree = gAlice->TreeK()  ; 
+  if( ! particleTree ){
+    cerr <<   "ERROR: AliPHOSGetter::ReadTreePrimaries: -> Cannot read TreeK " << endl ;
+    return ;
+  }
+  
+  TBranch * particlesbranch = static_cast<TBranch*>(particleTree->GetBranch("Particles")) ;
+  if ( !particlesbranch ) {
+    if (fDebug)
+      cout << "WARNING:  AliPHOSGetter::ReadTreePrimaries -> Cannot find branch Particles" << endl ; 
+    return ;
+  }
+
+  TParticle * particle = 0; 
+  TClonesArray * ar ; 
+  if(! (ar = Primaries()) ) { 
+    PostPrimaries() ;
+    ar = Primaries() ; 
+  }
+  ar->Delete() ; 
+  particlesbranch->SetAddress(&particle) ;
+  
+  Int_t index = 0 ; 
+  for (index = 0 ; index < particleTree->GetEntries(); index++) { 
+    particlesbranch->GetEntry(index) ;
+    new ((*ar)[index]) TParticle(*particle);
+  }
+  fNPrimaries= ar->GetEntries() ; 
   
-  fNPrimaries = gAlice->GetNtrack();
+  // Reads specific branches of primaries
+  // fNPrimaries = gAlice->GetNtrack();
   
-  //   //Check, is it necessary to open new files
-  //   TArrayI* events = fDigitizer->GetCurrentEvents() ; 
-  //   TClonesArray * filenames = fDigitizer->GetHeadersFiles() ;
+  //Check, is it necessary to open new files
+ //  TArrayI* events = fDigitizer->GetCurrentEvents() ; 
+//   TClonesArray * filenames = fDigitizer->GetHeadersFiles() ;
 //   Int_t input ;
 //   for(input = 0; input < filenames->GetEntriesFast(); input++){
-
+    
 //     TObjString * filename = (TObjString *) filenames->At(input) ;
 
 //     //Test, if this file already open
@@ -1593,59 +1734,59 @@ void AliPHOSGetter::ReadPrimaries()
 //     file->cd() ;
     
 //     // Get Kine Tree from file
-// //     char treeName[20];
-// //     sprintf(treeName,"TreeK%d",events->At(input));
-// //     TTree * treeK = (TTree*)gDirectory->Get(treeName);
-// //     if (treeK) 
-// //       treeK->SetBranchAddress("Particles", &fParticleBuffer);
-// //     else    
-// //       cout << "AliPHOSGetter: cannot find Kine Tree for event:" << events->At(input) << endl;
-
-// //     // Create the particle stack
-// //     if(!fParticles) fParticles = new TClonesArray("TParticle",1000);
-// //     // Build the pointer list
-// //     if(fParticleMap) {     <----
-// //       fParticleMap->Clear();
-// //       fParticleMap->Expand(treeK->GetEntries());
-// //     } else
-// //       fParticleMap = new TObjArray(treeK->GetEntries());
+//     char treeName[20];
+//     sprintf(treeName,"TreeK%d",events->At(input));
+//     TTree * treeK = (TTree*)gDirectory->Get(treeName);
+//     if (treeK) 
+//       treeK->SetBranchAddress("Particles", &fParticleBuffer);
+//     else    
+//       cout << "AliPHOSGetter: cannot find Kine Tree for event:" << events->At(input) << endl;
+
+//     // Create the particle stack
+//     if(!fParticles) fParticles = new TClonesArray("TParticle",1000);
+//     // Build the pointer list
+//     if(fParticleMap) {     <----
+//       fParticleMap->Clear();
+//       fParticleMap->Expand(treeK->GetEntries());
+//     } else
+//       fParticleMap = new TObjArray(treeK->GetEntries());
     
 //     // From gAlice->Particle(i) 
 
 
-// //   if(!(*fParticleMap)[i]) {
-// //     Int_t nentries = fParticles->GetEntries();
+//   if(!(*fParticleMap)[i]) {
+//     Int_t nentries = fParticles->GetEntries();
     
-// //     // algorithmic way of getting entry index
-// //     // (primary particles are filled after secondaries)
-// //     Int_t entry;
-// //     if (i<fHeader.GetNprimary())
-// //       entry = i+fHeader.GetNsecondary();
-// //     else 
-// //       entry = i-fHeader.GetNprimary();
+//     // algorithmic way of getting entry index
+//     // (primary particles are filled after secondaries)
+//     Int_t entry;
+//     if (i<fHeader.GetNprimary())
+//       entry = i+fHeader.GetNsecondary();
+//     else 
+//       entry = i-fHeader.GetNprimary();
       
-// //     // only check the algorithmic way and give
-// //     // the fatal error if it is wrong
-// //     if (entry != fParticleFileMap[i]) {
-// //       Fatal("Particle",
-// //         "!!!! The algorithmic way is WRONG: !!!\n entry: %d map: %d",
-// //  entry, fParticleFileMap[i]); 
-// //     }  
+//     // only check the algorithmic way and give
+//     // the fatal error if it is wrong
+//     if (entry != fParticleFileMap[i]) {
+//       Fatal("Particle",
+//         "!!!! The algorithmic way is WRONG: !!!\n entry: %d map: %d",
+//     entry, fParticleFileMap[i]); 
+//     }  
       
-// //     fTreeK->GetEntry(fParticleFileMap[i]);
-// //     new ((*fParticles)[nentries]) TParticle(*fParticleBuffer);
-// //     fParticleMap->AddAt((*fParticles)[nentries],i);
-// //   }
-// //   return (TParticle *) (*fParticleMap)[i];
+//     fTreeK->GetEntry(fParticleFileMap[i]);
+//     new ((*fParticles)[nentries]) TParticle(*fParticleBuffer);
+//     fParticleMap->AddAt((*fParticles)[nentries],i);
+//   }
+//   return (TParticle *) (*fParticleMap)[i];
 
    
     
-//   }
+// //   }
 
 
-//   //scan over opened files and read corresponding TreeK##
+// //   //scan over opened files and read corresponding TreeK##
 
-  return ;
+//   return ;
 }
 //____________________________________________________________________________ 
 void AliPHOSGetter::Event(const Int_t event, const char* opt)
@@ -1656,7 +1797,7 @@ void AliPHOSGetter::Event(const Int_t event, const char* opt)
     cerr << "ERROR: AliPHOSGetter::Event -> " << event << " not found in TreeE!" << endl ; 
     return ; 
   }
-  gAlice->GetEvent(event) ;
+  gAlice->GetEvent(event) ; 
 
   if(strstr(opt,"H") )
     ReadTreeH() ;
@@ -1673,13 +1814,13 @@ void AliPHOSGetter::Event(const Int_t event, const char* opt)
   if( strstr(opt,"Q") )
     ReadTreeQA() ;
 
-  //  if( strstr(opt,"P") )
+    if( strstr(opt,"P") || (strcmp(opt,"")==0) )
     ReadPrimaries() ;
 
 }
 
 //____________________________________________________________________________ 
-const TObject * AliPHOSGetter::ReturnO(TString what, TString name, TString file) const 
+TObject * AliPHOSGetter::ReturnO(TString what, TString name, TString file) const 
 {
   // get the object named "what" from the folder
   // folders are named like //Folders
@@ -1691,13 +1832,19 @@ const TObject * AliPHOSGetter::ReturnO(TString what, TString name, TString file)
   TObject * phosO  = 0 ; 
 
   //  if ( name.IsNull() ) {
-  if ( what.CompareTo("Hits") == 0 ) {
+  if ( what.CompareTo("Primaries") == 0 ) {
+    folder = dynamic_cast<TFolder *>(fPrimariesFolder->FindObject("Primaries")) ; 
+    if (folder) 
+      phosO  = dynamic_cast<TObject *>(folder->FindObject("Primaries")) ;  
+  }
+  else if ( what.CompareTo("Hits") == 0 ) {
     folder = dynamic_cast<TFolder *>(fHitsFolder->FindObject("PHOS")) ; 
     if (folder) 
       phosO  = dynamic_cast<TObject *>(folder->FindObject("Hits")) ;  
   }
-  else if ( what.CompareTo("SDigits") == 0 ) { 
-    TString path = "PHOS/" + file  ; 
+  else if ( what.CompareTo("SDigits") == 0 ) {
+    file.ReplaceAll("/","_") ; 
+    TString path = "PHOS/" + file  ;
     folder = dynamic_cast<TFolder *>(fSDigitsFolder->FindObject(path.Data())) ; 
     if (folder) { 
       if (name.IsNull())
@@ -1761,6 +1908,7 @@ const TObject * AliPHOSGetter::ReturnO(TString what, TString name, TString file)
       cerr << "ERROR : AliPHOSGetter::ReturnO -> Object " << what << " not found in " << folder->GetName() << endl ; 
     return 0 ;
   }
+
   return phosO ;
 }