#include "AliLog.h"
#include <TTree.h>
+#include <TSystem.h>
+#include <TTreeCache.h>
#include <TFile.h>
#include <TList.h>
#include <TParticle.h>
ClassImp(AliMCEventHandler)
AliMCEventHandler::AliMCEventHandler() :
- AliVEventHandler(),
- fMCEvent(new AliMCEvent()),
+ AliInputEventHandler(),
+ fMCEvent(0),
fFileE(0),
fFileK(0),
fFileTR(0),
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
}
AliMCEventHandler::AliMCEventHandler(const char* name, const char* title) :
- AliVEventHandler(name, title),
- fMCEvent(new AliMCEvent()),
+ AliInputEventHandler(name, title),
+ fMCEvent(),
fFileE(0),
fFileK(0),
fFileTR(0),
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
delete fFileE;
delete fFileK;
delete fFileTR;
+ delete fCacheTK;
+ delete fCacheTR;
}
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;
//
// 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;
return kTRUE;
}
-Bool_t AliMCEventHandler::GetEvent(Int_t iev)
+Bool_t AliMCEventHandler::LoadEvent(Int_t iev)
{
// Load the event number 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;
// 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
return kFALSE;
}
- Bool_t result = GetEvent(entry);
+ Bool_t result = LoadEvent(entry);
if (fSubsidiaryHandlers) {
TIter next(fSubsidiaryHandlers);
}
next.Reset();
while((handler = (AliMCEventHandler*)next())) {
+ if (!handler->MCEvent()) continue;
fMCEvent->AddSubsidiaryEvent(handler->MCEvent());
}
fMCEvent->InitEvent();
// 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);
}
// 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()));
if (fFileE) {delete fFileE; fFileE = 0;}
if (fFileK) {delete fFileK; fFileK = 0;}
if (fFileTR) {delete fFileTR; fFileTR = 0;}
- fExtension="";
+ fkExtension="";
fInitOk = kFALSE;
if (fSubsidiaryHandlers) {
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) {