]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/STEERBase/AliMCEventHandler.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / STEER / STEERBase / AliMCEventHandler.cxx
index 1af064cfc6d87bdbcaf8a26ba0de78dbbd5371cd..dddd823f9c76ff1038e9f42e321b8b0b7e513738 100644 (file)
@@ -35,6 +35,8 @@
 #include "AliLog.h"
 
 #include <TTree.h>
+#include <TSystem.h>
+#include <TTreeCache.h>
 #include <TFile.h>
 #include <TList.h>
 #include <TParticle.h>
@@ -45,8 +47,8 @@
 ClassImp(AliMCEventHandler)
 
 AliMCEventHandler::AliMCEventHandler() :
-    AliVEventHandler(),
-    fMCEvent(new AliMCEvent()),
+    AliInputEventHandler(),
+    fMCEvent(0),
     fFileE(0),
     fFileK(0),
     fFileTR(0),
@@ -60,14 +62,17 @@ AliMCEventHandler::AliMCEventHandler() :
     fNEvent(-1),
     fEvent(-1),
     fPathName(new TString("./")),
-    fExtension(""),
+    fkExtension(""),
     fFileNumber(0),
     fEventsPerFile(0),
     fReadTR(kTRUE),
     fInitOk(kFALSE),
     fSubsidiaryHandlers(0),
     fEventsInContainer(0),
-    fPreReadMode(kNoPreRead)
+    fPreReadMode(kLmPreRead), // was kNoPreRead
+    fCacheSize(0),
+    fCacheTK(0),
+    fCacheTR(0)
 {
   //
   // Default constructor
@@ -77,8 +82,8 @@ AliMCEventHandler::AliMCEventHandler() :
 }
 
 AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
-    AliVEventHandler(name, title),
-    fMCEvent(new AliMCEvent()),
+    AliInputEventHandler(name, title),
+    fMCEvent(),
     fFileE(0),
     fFileK(0),
     fFileTR(0),
@@ -92,14 +97,17 @@ AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
     fNEvent(-1),
     fEvent(-1),
     fPathName(new TString("./")),
-    fExtension(""),
+    fkExtension(""),
     fFileNumber(0),
     fEventsPerFile(0),
     fReadTR(kTRUE),
     fInitOk(kFALSE),
     fSubsidiaryHandlers(0),
     fEventsInContainer(0),
-    fPreReadMode(kNoPreRead)
+    fPreReadMode(kLmPreRead), // was kNoPreRead
+    fCacheSize(0),
+    fCacheTK(0),
+    fCacheTR(0)
 {
   //
   // Constructor
@@ -115,6 +123,8 @@ AliMCEventHandler::~AliMCEventHandler()
     delete fFileE;
     delete fFileK;
     delete fFileTR;
+    delete fCacheTK;
+    delete fCacheTR;
 }
 
 Bool_t AliMCEventHandler::Init(Option_t* opt)
@@ -125,20 +135,21 @@ Bool_t AliMCEventHandler::Init(Option_t* opt)
     //
     fFileE = TFile::Open(Form("%sgalice.root", fPathName->Data()));
     if (!fFileE) {
-       AliError(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
-       fInitOk = kFALSE;
-       return kFALSE;
+      AliError(Form("AliMCEventHandler:galice.root not found in directory %s ! \n", fPathName->Data()));
+      fInitOk = kFALSE;
+      return kFALSE;
     }
     
     //
     // Tree E
     fFileE->GetObject("TE", fTreeE);
     // Connect Tree E to the MCEvent
+    if (!fMCEvent) fMCEvent = new AliMCEvent();
     fMCEvent->ConnectTreeE(fTreeE);
     fNEvent = fTreeE->GetEntries();
     //
     // Tree K
-    fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
+    fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fkExtension));
     if (!fFileK) {
        AliError(Form("AliMCEventHandler:Kinematics.root not found in directory %s ! \n", fPathName->Data()));
        fInitOk = kFALSE;
@@ -149,7 +160,7 @@ Bool_t AliMCEventHandler::Init(Option_t* opt)
     //
     // Tree TR
     if (fReadTR) {
-       fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
+       fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fkExtension));
        if (!fFileTR) {
            AliError(Form("AliMCEventHandler:TrackRefs.root not found in directory %s ! \n", fPathName->Data()));
            fInitOk = kFALSE;
@@ -176,7 +187,7 @@ Bool_t AliMCEventHandler::Init(Option_t* opt)
     return kTRUE;
 }
 
-Bool_t AliMCEventHandler::GetEvent(Int_t iev)
+Bool_t AliMCEventHandler::LoadEvent(Int_t iev)
 {
     // Load the event number iev
     //
@@ -184,7 +195,10 @@ Bool_t AliMCEventHandler::GetEvent(Int_t iev)
   if (!fInitOk) return kFALSE;
     
   Int_t inew  = iev / fEventsPerFile;
+  Bool_t firsttree = (fTreeK==0) ? kTRUE : kFALSE;
+//  Bool_t newtree = firsttree;
   if (inew != fFileNumber) {
+//    newtree = kTRUE;
     fFileNumber = inew;
     if (!OpenFile(fFileNumber)){
       return kFALSE;
@@ -227,47 +241,72 @@ Bool_t AliMCEventHandler::GetEvent(Int_t iev)
     // Connect TR to MCEvent
     fMCEvent->ConnectTreeTR(fTreeTR);
   }
-
-  //
+  // Now setup the caches if not yet done
+  if (fCacheSize) {
+    fTreeK->SetCacheSize(fCacheSize);
+    fCacheTK = (TTreeCache*) fFileK->GetCacheRead(fTreeK);
+    TTreeCache::SetLearnEntries(1);
+    fTreeK->AddBranchToCache("*",kTRUE);
+    if (firsttree) Info("LoadEvent","Read cache enabled %lld bytes for TreeK",fCacheSize);
+    if (fTreeTR) {
+      fTreeTR->SetCacheSize(fCacheSize);
+      fCacheTR = (TTreeCache*) fFileTR->GetCacheRead(fTreeTR);
+      TTreeCache::SetLearnEntries(1);
+      fTreeTR->AddBranchToCache("*",kTRUE);
+      if (firsttree) Info("LoadEvent","Read cache enabled %lld bytes for TreeTR",fCacheSize);
+    } 
+//    } else {
+      // We need to reuse the previous caches and every new event is a new tree
+//      if (fCacheTK) {
+//         fCacheTK->ResetCache();
+//         if (fFileK) fFileK->SetCacheRead(fCacheTK, fTreeK);
+//         fCacheTK->UpdateBranches(fTreeK);
+//      }
+//      if (fCacheTR) {
+//         fCacheTR->ResetCache();
+//         if (fFileTR) fFileTR->SetCacheRead(fCacheTR, fTreeTR);
+//         fCacheTR->UpdateBranches(fTreeTR);
+//      }   
+  }  
   return kTRUE;
 }
 
 Bool_t AliMCEventHandler::OpenFile(Int_t i)
 {
     // Open file i
+    fInitOk = kFALSE;
     if (i > 0) {
-       fExtension = Form("%d", i);
+      fkExtension = Form("%d", i);
     } else {
-       fExtension = "";
+      fkExtension = "";
     }
     
-    
+    if (fFileK && fCacheTK) fFileK->SetCacheRead(0, fTreeK);
     delete fFileK;
-    fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fExtension));
+    fFileK = TFile::Open(Form("%sKinematics%s.root", fPathName->Data(), fkExtension));
     if (!fFileK) {
-       AliError(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
-       fInitOk = kFALSE;
-       return kFALSE;
+      AliError(Form("AliMCEventHandler:Kinematics%s.root not found in directory %s ! \n", fkExtension, fPathName->Data()));
+      delete fMCEvent; fMCEvent=0;
+      return fInitOk;
     }
     
+    fInitOk = kTRUE;
     if (fReadTR) {
-       delete fFileTR;
-       fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fExtension));
-       if (!fFileTR) {
-           AliWarning(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fExtension, fPathName->Data()));
-           fInitOk = kFALSE;
-           return kFALSE;
-       }
+      if (fFileTR && fCacheTR) fFileTR->SetCacheRead(0, fTreeTR);
+      delete fFileTR;
+      fFileTR = TFile::Open(Form("%sTrackRefs%s.root", fPathName->Data(), fkExtension));
+      if (!fFileTR) {
+        AliError(Form("AliMCEventHandler:TrackRefs%s.root not found in directory %s ! \n", fkExtension, fPathName->Data()));
+        return fInitOk;
+      }
     }
-    
-    fInitOk = kTRUE;
-
-    return kTRUE;
+    return fInitOk;
 }
 
 Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
 { 
     // Begin event
+    if (!fInitOk) return kFALSE;
     fParticleSelected.Delete();
     fLabelMap.Delete();
     // Read the next event
@@ -289,7 +328,7 @@ Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
        return kFALSE;
     }
     
-    Bool_t result = GetEvent(entry);
+    Bool_t result = LoadEvent(entry);
 
     if (fSubsidiaryHandlers) {
        TIter next(fSubsidiaryHandlers);
@@ -299,6 +338,7 @@ Bool_t AliMCEventHandler::BeginEvent(Long64_t entry)
        }
        next.Reset();
        while((handler = (AliMCEventHandler*)next())) {
+         if (!handler->MCEvent()) continue;
            fMCEvent->AddSubsidiaryEvent(handler->MCEvent());
        }
        fMCEvent->InitEvent();
@@ -316,6 +356,7 @@ void AliMCEventHandler::SelectParticle(Int_t i){
   // taking the absolute values here, need to take care 
   // of negative daughter and mother
   // IDs when setting!
+    if (!fInitOk) return;
     if (TMath::Abs(i) >= AliMCEvent::BgLabelOffset()) i =  fMCEvent->BgLabelToIndex(TMath::Abs(i));
     if(!IsParticleSelected(TMath::Abs(i)))fParticleSelected.Add(TMath::Abs(i),1);
 }
@@ -419,23 +460,18 @@ Bool_t AliMCEventHandler::Notify(const char *path)
   // The directory is taken from the 'path' argument
   // Reconnect trees
     TString fileName(path);
-    if(fileName.Contains("AliESDs.root")){
-       fileName.ReplaceAll("AliESDs.root", "");
-    }
-    else if(fileName.Contains("AliESDs_wSDD.root")){
-       fileName.ReplaceAll("AliESDs_wSDD.root", "");
-    }
-    else if(fileName.Contains("AliAOD.root")){
-       fileName.ReplaceAll("AliAOD.root", "");
-    }
-    else if(fileName.Contains("galice.root")){
-       // for running with galice and kinematics alone...
-       fileName.ReplaceAll("galice.root", "");
-    }
-    else if (fileName.BeginsWith("root:")) {
+    TString dirname = gSystem->DirName(fileName);
+    TString basename = gSystem->BaseName(fileName);
+    Int_t index = basename.Index("#");
+    basename = basename(0, index+1);
+    fileName = dirname;
+    fileName += "/";
+    fileName += basename;
+    /*
+    if (fileName.BeginsWith("root:")) {
       fileName.Append("?ZIP=");
     }
-
+    */
     *fPathName = fileName;
     AliInfo(Form("Path: -%s-\n", fPathName->Data()));
     
@@ -474,7 +510,7 @@ void AliMCEventHandler::ResetIO()
     if (fFileE)  {delete fFileE;  fFileE  = 0;}
     if (fFileK)  {delete fFileK;  fFileK  = 0;}
     if (fFileTR) {delete fFileTR; fFileTR = 0;}
-    fExtension="";
+    fkExtension="";
     fInitOk = kFALSE;
 
     if (fSubsidiaryHandlers) {
@@ -491,8 +527,18 @@ void AliMCEventHandler::ResetIO()
 Bool_t AliMCEventHandler::FinishEvent()
 {
     // Clean-up after each event
-    delete fDirTR;  fDirTR = 0;
-    delete fDirK;   fDirK  = 0;    
+   if (fFileK && fCacheTK) {
+      fTreeK->SetCacheSize(0);
+      fCacheTK = 0;  
+      fFileK->SetCacheRead(0, fTreeK);
+   }   
+   if (fFileTR && fCacheTR) {
+      fTreeTR->SetCacheSize(0);
+      fCacheTR = 0;
+      fFileTR->SetCacheRead(0, fTreeTR);
+   }
+   delete fDirTR;  fDirTR = 0;
+   delete fDirK;   fDirK  = 0;    
     if (fInitOk) fMCEvent->FinishEvent();
 
     if (fSubsidiaryHandlers) {