]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDInputHandlerRP.cxx
Added new cuts, fixed bug in backround calculation.
[u/mrichter/AliRoot.git] / STEER / AliESDInputHandlerRP.cxx
index fbab91e6d8ca5333f5b2fa86e1b5765e89f193f8..7fb0693bcfc0e62142ea21ac3028f881c1ba2109 100644 (file)
@@ -13,7 +13,7 @@
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/* $Id: AliESDInputHandler.cxx 24521 2008-03-14 16:43:54Z morsch $ */
+/* $Id$ */
 
 //-------------------------------------------------------------------------
 //     Event handler for ESD input reading the RecPoint Trees in parallel
 #include <TTree.h>
 #include <TList.h>
 #include <TFile.h>
+#include <TArchiveFile.h>
+#include <TSystemDirectory.h>
 #include <TString.h>
 #include <TObjString.h>
+#include <TObjArray.h>
 #include <TProcessID.h>
+#include <TSystem.h>
 
 #include "AliESDInputHandlerRP.h"
 #include "AliESDEvent.h"
@@ -37,41 +41,46 @@ ClassImp(AliESDInputHandlerRP)
 //______________________________________________________________________________
 AliESDInputHandlerRP::AliESDInputHandlerRP() :
     AliESDInputHandler(),
-    fRTrees(new TList()),
-    fRFiles(new TList()),
+    fRTrees(   new TObjArray()),
+    fRDirs (   new TObjArray()),
+    fRFiles(   new TList()),
+    fDetectors(new TList()),
     fDirR(0),
     fEventNumber(-1),
-    fNEvent(-1),
     fFileNumber(0),
     fEventsPerFile(0),
     fExtension(""),
-    fPathName(new TString("./"))
+    fPathName(new TString("./")),
+    fIsArchive(kFALSE)
 {
-  // default constructor
+  // Default constructor
 }
 
-//______________________________________________________________________________
-AliESDInputHandlerRP::~AliESDInputHandlerRP() 
-{
-  // destructor
-}
 
 //______________________________________________________________________________
 AliESDInputHandlerRP::AliESDInputHandlerRP(const char* name, const char* title):
     AliESDInputHandler(name, title),
-    fRTrees(new TList()),
-    fRFiles(new TList()),
+    fRTrees(   new TObjArray()),
+    fRDirs (   new TObjArray()),
+    fRFiles(   new TList()),
+    fDetectors(new TList()),
     fDirR(0),
     fEventNumber(-1),
-    fNEvent(-1),
     fFileNumber(0),
     fEventsPerFile(0),
     fExtension(""),
-    fPathName(new TString("./"))
+    fPathName(new TString("./")),
+    fIsArchive(kFALSE)
 {
     // Constructor
 }
 
+//______________________________________________________________________________
+AliESDInputHandlerRP::~AliESDInputHandlerRP() 
+{
+  // Destructor
+}
+
 Bool_t AliESDInputHandlerRP::Init(Option_t* opt)
 {
     //
@@ -79,27 +88,43 @@ Bool_t AliESDInputHandlerRP::Init(Option_t* opt)
     //
     if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
     //
-    TFile* file;
+    TIter next(fDetectors);
+    TNamed* det;
+    TFile* file = 0;
+    while ((det = (TNamed*) next()))
+    {
+       if (!fIsArchive) {
+           file = TFile::Open(Form("%s%s.RecPoints.root", fPathName->Data(), det->GetName()));
+       } else {
+           file = TFile::Open(Form("%s#%s.RecPoints.root", fPathName->Data(), det->GetName()));
+       }
+       if (!file) {
+         AliError(Form("AliESDInputHandlerRP: %s.RecPoints.root not found in %s ! \n", det->GetName(), fPathName->Data()));
+         return kFALSE;
+       }
+       fRFiles->Add(file);
+    }
+
+    if (file) {
+       fEventsPerFile = file->GetNkeys() - file->GetNProcessIDs();
+    } else {
+       AliError(Form("AliESDInputHandlerRP: No file with RecPoints found in %s ! \n", fPathName->Data()));
+       return kFALSE;
+    }
     
-    file = TFile::Open(Form("%sTPC.RecPoints.root", fPathName->Data()));
-    if (!file) AliFatal(Form("AliESDInputHandlerRP: TPC.RecPoints.root not found in %s ! \n", fPathName->Data()));
-    fRFiles->Add(file);
-    fEventsPerFile = file->GetNkeys() - file->GetNProcessIDs();
+
     // Reset the event number
     fEventNumber      = -1;
     fFileNumber       =  0;
-    fNEvent           =  fTree->GetEntries();
-    
-    printf("AliESDInputHandler::Init() %d\n",__LINE__);
+    // Get number of events from esd tree 
+    printf("AliESDInputHandlerRP::Init() %d %d\n",__LINE__, fNEvents);
     return kTRUE;
 }
 
 Bool_t AliESDInputHandlerRP::BeginEvent(Long64_t entry)
 {
     // Begin the next event
-    // Delegate to base class
-    AliESDInputHandler::BeginEvent(entry);
-//
+    //
     if (entry == -1) {
        fEventNumber++;
        entry = fEventNumber;
@@ -107,18 +132,24 @@ Bool_t AliESDInputHandlerRP::BeginEvent(Long64_t entry)
        fEventNumber = entry;
     }
     
-    if (entry >= fNEvent) {
-       AliWarning(Form("AliESDInputHandlerRP: Event number out of range %5d %5d\n", entry, fNEvent));
+    if (entry >= fNEvents) {
+       AliWarning(Form("AliESDInputHandlerRP: Event number out of range %5d %5d\n", entry, fNEvents));
        return kFALSE;
     }
-    return GetEvent(entry);
+    
+    LoadEvent(entry);
+
+    // Delegate to base class
+    return AliESDInputHandler::BeginEvent(entry);
+
 }
 
-Bool_t AliESDInputHandlerRP::GetEvent(Int_t iev)
+Bool_t AliESDInputHandlerRP::LoadEvent(Int_t iev)
 {
     // Load the event number iev
     //
     // Calculate the file number
+  if (fEventsPerFile<=0) return kFALSE;
     Int_t inew  = iev / fEventsPerFile;
     if (inew != fFileNumber) {
        fFileNumber = inew;
@@ -130,19 +161,23 @@ Bool_t AliESDInputHandlerRP::GetEvent(Int_t iev)
     char folder[20];
     sprintf(folder, "Event%d", iev);
     // Tree R
-    TFile* file = (TFile*) (fRFiles->At(0));
+    TIter next(fRFiles);
+    TFile* file;
+    Int_t idx  = 0;
     
-    file->GetObject(folder, fDirR);
-    if (!fDirR) {
-       AliWarning(Form("AliESDInputHandlerRP: Event #%5d not found\n", iev));
-       return kFALSE;
+    while ((file = (TFile*) next()))
+    {
+       file->GetObject(folder, fDirR);
+       
+       if (!fDirR) {
+           AliWarning(Form("AliESDInputHandlerRP: Event #%5d not found\n", iev));
+           return kFALSE;
+       }
+       TTree* tree = 0;
+       fDirR->GetObject("TreeR", tree);
+       fRDirs ->AddAt(fDirR, idx  );
+       fRTrees->AddAt(tree,  idx++);
     }
-    
-    TTree* tree;
-    fDirR ->GetObject("TreeR", tree);
-    fRTrees->Add(tree);
-    tree->ls();
-    
     return kTRUE;
 }
 
@@ -157,11 +192,18 @@ Bool_t AliESDInputHandlerRP::OpenFile(Int_t i)
     }
     
     fRFiles->Delete();
+    TIter next(fDetectors);
+    TNamed* det;
     TFile* file;
-    file = TFile::Open(Form("%sTPC.RecPoints%s.root", fPathName->Data(), fExtension));
-    if (!file) {
-       AliFatal(Form("AliESDInputHandlerRP: TPC.RecPoints.root not found in %s ! \n", fPathName->Data()));
-       ok = kFALSE;
+    while ((det = (TNamed*) next()))
+    {
+       if (!fIsArchive) {
+           file = TFile::Open(Form("%s%s.RecPoints%s.root", fPathName->Data(), det->GetName(), fExtension));
+       } else {
+           file = TFile::Open(Form("%s#%s.RecPoints%s.root", fPathName->Data(), det->GetName(), fExtension));
+       }
+       if (!file) AliFatal(Form("AliESDInputHandlerRP: RecPoints.root not found in %s ! \n", fPathName->Data()));
+       fRFiles->Add(file);
     }
     return ok;
 }
@@ -170,26 +212,89 @@ Bool_t AliESDInputHandlerRP::Notify(const char *path)
 {
   // Notify about directory change
   // The directory is taken from the 'path' argument
-  // Reconnect trees
+  // 
+    AliInfo(Form("Directory change %s \n", path));
+    // Get path to directory
     TString fileName(path);
-    if(fileName.Contains("AliESDs.root")){
-       fileName.ReplaceAll("AliESDs.root", "");
+
+    if(fileName.Contains("#")){
+    // If this is an archive it will contain a # 
+      fIsArchive = kTRUE;
+    } else  if(fileName.Contains("AliESDs.root")){
+      fileName.ReplaceAll("AliESDs.root", "");
     }
 
+    //
+    // At this point we have a path to the directory or to the archive anchor
     *fPathName = fileName;
+    //
+    // Now filter the files containing RecPoints *.RecPoints.*
 
-    printf("AliESDInputHandlerRP::Notify() Path: %s\n", fPathName->Data());
+    TSeqCollection* members;
+
+    
+    if (fIsArchive) {
+       // Archive
+      TFile* file = TFile::Open(fPathName->Data());
+      TArchiveFile* arch = file->GetArchive();
+      members = arch->GetMembers();
+      fPathName->ReplaceAll("#AliESDs.root", "");
+    } else {
+       // Directory or alien archive
+      if (fileName.BeginsWith("alien:")) {
+        TFile* file = TFile::Open(Form("%s/root_archive.zip", fPathName->Data()));
+        TArchiveFile* arch = file->GetArchive();
+        members = arch->GetMembers();
+      } else {  
+        TString wd = gSystem->WorkingDirectory();
+        TSystemDirectory dir(".", fPathName->Data());
+        members = dir.GetListOfFiles();
+        gSystem->cd(wd);
+      }  
+    }
+
+    TIter next(members);
+    TFile* entry;
+    Int_t ien = 0;
+    fDetectors->Delete();
     
+    while ( (entry = (TFile*) next()) )
+    {
+       TString name(entry->GetName());
+       TObjArray* tokens = name.Tokenize(".");
+       Int_t ntok = tokens->GetEntries();
+       if (ntok <= 1) continue;
+       TString str = ((TObjString*) tokens->At(1))->GetString();
+       if (!(strcmp(str.Data(), "RecPoints"))){
+           TString det = ((TObjString*) tokens->At(0))->GetString();
+           printf("Found file with RecPoints for %s \n", det.Data());
+           TNamed* ent = new TNamed(det.Data(), det.Data());
+           fRTrees->AddAt(0, ien);
+           ent->SetUniqueID(ien++);
+           fDetectors->Add(ent);
+       }
+       if(tokens) delete tokens;
+    } // loop over files
+
+
+    // Now we have the path and the list of detectors
+    
+    printf("AliESDInputHandlerRP::Notify() Path: %s\n", fPathName->Data());
+    //
     ResetIO();
     InitIO("");
+    // Some clean-up
+    if (members) members->Delete();
 
+    AliESDInputHandler::Notify(path);
+    
     return kTRUE;
 }
 
 Bool_t AliESDInputHandlerRP::FinishEvent()
 {
     // Clean-up after each event
-    delete fDirR;  fDirR = 0;
+    fRDirs->Delete();
     AliESDInputHandler::FinishEvent();
     return kTRUE;
 }
@@ -197,7 +302,19 @@ Bool_t AliESDInputHandlerRP::FinishEvent()
 void AliESDInputHandlerRP::ResetIO()
 {
 // Delete trees and files
-    fRTrees->Delete();
-    fRFiles->Delete();
+    fRFiles->Clear("nodelete");
     fExtension="";
 }
+
+TTree* AliESDInputHandlerRP::GetTreeR(const char* det)
+{
+// Return pointer to RecPoint tree for detector det
+    TNamed* entry = (TNamed*) (fDetectors->FindObject(det));
+    if (!entry) {
+       AliWarning(Form("AliESDInputHandlerRP: No RecPoints for detector %s available \n", det));
+       return 0;
+    } else {
+       Int_t ien = entry->GetUniqueID();
+       return ((TTree*) (fRTrees->At(ien)));
+    }
+}