In AddTaskPHOSPi0Flow.C set Cent. Bin past event buffers/lists,
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDInputHandlerRP.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 //-------------------------------------------------------------------------
19 //     Event handler for ESD input reading the RecPoint Trees in parallel
20 //     Author: Andreas Morsch, CERN
21 //-------------------------------------------------------------------------
22
23 #include <TTree.h>
24 #include <TList.h>
25 #include <TFile.h>
26 #include <TArchiveFile.h>
27 #include <TSystemDirectory.h>
28 #include <TString.h>
29 #include <TObjString.h>
30 #include <TObjArray.h>
31 #include <TProcessID.h>
32 #include <TSystem.h>
33
34 #include "AliESDInputHandlerRP.h"
35 #include "AliESDEvent.h"
36 #include "AliESD.h"
37 #include "AliLog.h"
38
39 ClassImp(AliESDInputHandlerRP)
40
41 //______________________________________________________________________________
42 AliESDInputHandlerRP::AliESDInputHandlerRP() :
43     AliESDInputHandler(),
44     fRTrees(   new TObjArray()),
45     fRDirs (   new TObjArray()),
46     fRFiles(   new TList()),
47     fDetectors(new TList()),
48     fDirR(0),
49     fEventNumber(-1),
50     fFileNumber(0),
51     fEventsPerFile(0),
52     fExtension(""),
53     fPathName(new TString("./")),
54     fIsArchive(kFALSE)
55 {
56   // Default constructor
57 }
58
59
60 //______________________________________________________________________________
61 AliESDInputHandlerRP::AliESDInputHandlerRP(const char* name, const char* title):
62     AliESDInputHandler(name, title),
63     fRTrees(   new TObjArray()),
64     fRDirs (   new TObjArray()),
65     fRFiles(   new TList()),
66     fDetectors(new TList()),
67     fDirR(0),
68     fEventNumber(-1),
69     fFileNumber(0),
70     fEventsPerFile(0),
71     fExtension(""),
72     fPathName(new TString("./")),
73     fIsArchive(kFALSE)
74 {
75     // Constructor
76 }
77
78 //______________________________________________________________________________
79 AliESDInputHandlerRP::~AliESDInputHandlerRP() 
80 {
81   // Destructor
82 }
83
84 Bool_t AliESDInputHandlerRP::Init(Option_t* opt)
85 {
86     //
87     // Initialize input
88     //
89     if (!(strcmp(opt, "proof")) || !(strcmp(opt, "local"))) return kTRUE;
90     //
91     TIter next(fDetectors);
92     TNamed* det;
93     TFile* file = 0;
94     while ((det = (TNamed*) next()))
95     {
96         if (!fIsArchive) {
97             file = TFile::Open(Form("%s%s.RecPoints.root", fPathName->Data(), det->GetName()));
98         } else {
99             file = TFile::Open(Form("%s#%s.RecPoints.root", fPathName->Data(), det->GetName()));
100         }
101         if (!file) {
102           AliError(Form("AliESDInputHandlerRP: %s.RecPoints.root not found in %s ! \n", det->GetName(), fPathName->Data()));
103           return kFALSE;
104         }
105         fRFiles->Add(file);
106     }
107
108     if (file) {
109         fEventsPerFile = file->GetNkeys() - file->GetNProcessIDs();
110     } else {
111         AliError(Form("AliESDInputHandlerRP: No file with RecPoints found in %s ! \n", fPathName->Data()));
112         return kFALSE;
113     }
114     
115
116     // Reset the event number
117     fEventNumber      = -1;
118     fFileNumber       =  0;
119     // Get number of events from esd tree 
120     printf("AliESDInputHandlerRP::Init() %d %d\n",__LINE__, fNEvents);
121     //
122     AliESDInputHandler::Init(opt);
123     //
124     return kTRUE;
125 }
126
127 Bool_t AliESDInputHandlerRP::BeginEvent(Long64_t entry)
128 {
129     // Begin the next event
130     //
131     if (entry == -1) {
132         fEventNumber++;
133         entry = fEventNumber;
134     } else {
135         fEventNumber = entry;
136     }
137     
138     if (entry >= fNEvents) {
139         AliWarning(Form("AliESDInputHandlerRP: Event number out of range %5lld %5d\n", entry, fNEvents));
140         return kFALSE;
141     }
142     
143     LoadEvent(entry);
144
145     // Delegate to base class
146     return AliESDInputHandler::BeginEvent(entry);
147
148 }
149
150 Bool_t AliESDInputHandlerRP::LoadEvent(Int_t iev)
151 {
152     // Load the event number iev
153     //
154     // Calculate the file number
155   if (fEventsPerFile<=0) return kFALSE;
156     Int_t inew  = iev / fEventsPerFile;
157     if (inew != fFileNumber) {
158         fFileNumber = inew;
159         if (!OpenFile(fFileNumber)){
160             return kFALSE;
161         }
162     }
163     // Folder name
164     char folder[20];
165     snprintf(folder, 20, "Event%d", iev);
166     // Tree R
167     TIter next(fRFiles);
168     TFile* file;
169     Int_t idx  = 0;
170     
171     while ((file = (TFile*) next()))
172     {
173         file->GetObject(folder, fDirR);
174         
175         if (!fDirR) {
176             AliWarning(Form("AliESDInputHandlerRP: Event #%5d not found\n", iev));
177             return kFALSE;
178         }
179         TTree* tree = 0;
180         fDirR->GetObject("TreeR", tree);
181         fRDirs ->AddAt(fDirR, idx  );
182         fRTrees->AddAt(tree,  idx++);
183     }
184     return kTRUE;
185 }
186
187 Bool_t AliESDInputHandlerRP::OpenFile(Int_t i)
188 {
189     // Open file i
190     Bool_t ok = kTRUE;
191     if (i > 0) {
192         fExtension = Form("%d", i);
193     } else {
194         fExtension = "";
195     }
196     
197     fRFiles->Delete();
198     TIter next(fDetectors);
199     TNamed* det;
200     TFile* file;
201     while ((det = (TNamed*) next()))
202     {
203         if (!fIsArchive) {
204             file = TFile::Open(Form("%s%s.RecPoints%s.root", fPathName->Data(), det->GetName(), fExtension));
205         } else {
206             file = TFile::Open(Form("%s#%s.RecPoints%s.root", fPathName->Data(), det->GetName(), fExtension));
207         }
208         if (!file) AliFatal(Form("AliESDInputHandlerRP: RecPoints.root not found in %s ! \n", fPathName->Data()));
209         fRFiles->Add(file);
210     }
211     return ok;
212 }
213
214 Bool_t AliESDInputHandlerRP::Notify(const char *path)
215 {
216   // Notify about directory change
217   // The directory is taken from the 'path' argument
218   // 
219
220     // Get path to directory
221     TString fileName(path);
222     if (fileName.IsNull()) return kFALSE;
223     AliInfo(Form("Directory change %s \n", path));
224
225     TString esdname = gSystem->BaseName(fileName);
226     Int_t index = esdname.Index("#")+1;
227     if (index) esdname.Remove(0,index);
228
229     if(fileName.Contains("#")){
230     // If this is an archive it will contain a # 
231       fIsArchive = kTRUE;
232     } else  if(fileName.Contains(esdname)){
233       fileName.ReplaceAll(esdname, "");
234     }
235
236     //
237     // At this point we have a path to the directory or to the archive anchor
238     *fPathName = fileName;
239     //
240     // Now filter the files containing RecPoints *.RecPoints.*
241
242     TSeqCollection* members;
243
244     
245     if (fIsArchive) {
246         // Archive
247       TFile* file = TFile::Open(fPathName->Data());
248       TArchiveFile* arch = file->GetArchive();
249       members = arch->GetMembers();
250       fPathName->ReplaceAll("#", "");
251       fPathName->ReplaceAll(esdname, "");
252     } else {
253         // Directory or alien archive
254       if (fileName.BeginsWith("alien:")) {
255         TFile* file = TFile::Open(Form("%s/root_archive.zip", fPathName->Data()));
256         TArchiveFile* arch = file->GetArchive();
257         members = arch->GetMembers();
258       } else {  
259         TString wd = gSystem->WorkingDirectory();
260         TSystemDirectory dir(".", fPathName->Data());
261         members = dir.GetListOfFiles();
262         gSystem->cd(wd);
263       }  
264     }
265
266     TIter next(members);
267     TFile* entry;
268     Int_t ien = 0;
269     fDetectors->Delete();
270     
271     while ( (entry = (TFile*) next()) )
272     {
273         TString name(entry->GetName());
274         TObjArray* tokens = name.Tokenize(".");
275         Int_t ntok = 0;
276         if (tokens) {
277           ntok = tokens->GetEntries();
278         } else {
279           continue;
280         }
281         if (ntok <= 1) continue;
282         TString str = ((TObjString*) tokens->At(1))->GetString();
283         if (!(strcmp(str.Data(), "RecPoints"))){
284             TString det = ((TObjString*) tokens->At(0))->GetString();
285             printf("Found file with RecPoints for %s \n", det.Data());
286             TNamed* ent = new TNamed(det.Data(), det.Data());
287             fRTrees->AddAt(0, ien);
288             ent->SetUniqueID(ien++);
289             fDetectors->Add(ent);
290         }
291         if(tokens) delete tokens;
292     } // loop over files
293
294
295     // Now we have the path and the list of detectors
296     
297     printf("AliESDInputHandlerRP::Notify() Path: %s\n", fPathName->Data());
298     //
299     ResetIO();
300     InitIO("");
301     // Some clean-up
302     if (members) members->Delete();
303
304     AliESDInputHandler::Notify(path);
305     
306     return kTRUE;
307 }
308
309 Bool_t AliESDInputHandlerRP::FinishEvent()
310 {
311     // Clean-up after each event
312     fRDirs->Delete();
313     AliESDInputHandler::FinishEvent();
314     return kTRUE;
315 }
316
317 void AliESDInputHandlerRP::ResetIO()
318 {
319 // Delete trees and files
320     fRFiles->Clear("nodelete");
321     fExtension="";
322 }
323
324 TTree* AliESDInputHandlerRP::GetTreeR(const char* det)
325 {
326 // Return pointer to RecPoint tree for detector det
327     TNamed* entry = (TNamed*) (fDetectors->FindObject(det));
328     if (!entry) {
329         AliWarning(Form("AliESDInputHandlerRP: No RecPoints for detector %s available \n", det));
330         return 0;
331     } else {
332         Int_t ien = entry->GetUniqueID();
333         return ((TTree*) (fRTrees->At(ien)));
334     }
335 }