]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliAODHandler.cxx
MCEvent::GetTrack gives back *VParticle.
[u/mrichter/AliRoot.git] / STEER / AliAODHandler.cxx
CommitLineData
3fbf06a3 1
ec4af4c1 2/**************************************************************************
3 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
17/* $Id$ */
18
19//-------------------------------------------------------------------------
20// Implementation of the Virtual Event Handler Interface for AOD
21// Author: Andreas Morsch, CERN
22//-------------------------------------------------------------------------
23
052994fb 24
ec4af4c1 25#include <TTree.h>
e910dd36 26#include <TFile.h>
7970f4ac 27#include <TString.h>
dce1b636 28#include <TList.h>
160959a9 29#include <TROOT.h>
e910dd36 30
da97a08a 31#include "AliLog.h"
ec4af4c1 32#include "AliAODHandler.h"
33#include "AliAODEvent.h"
da97a08a 34#include "AliAODTracklets.h"
35#include "AliStack.h"
36#include "AliAODMCParticle.h"
dce1b636 37#include "AliAODMCHeader.h"
da97a08a 38#include "AliMCEventHandler.h"
39#include "AliMCEvent.h"
dce1b636 40#include "AliGenEventHeader.h"
41#include "AliGenHijingEventHeader.h"
42#include "AliGenDPMjetEventHeader.h"
43#include "AliGenPythiaEventHeader.h"
44#include "AliGenCocktailEventHeader.h"
45
46
ec4af4c1 47
48ClassImp(AliAODHandler)
49
50//______________________________________________________________________________
51AliAODHandler::AliAODHandler() :
f3214a54 52 AliVEventHandler(),
78f7f935 53 fIsStandard(kTRUE),
da97a08a 54 fFillAOD(kTRUE),
7c3a9fbf 55 fNeedsHeaderReplication(kFALSE),
75754ba8 56 fNeedsTracksBranchReplication(kFALSE),
57 fNeedsVerticesBranchReplication(kFALSE),
58 fNeedsV0sBranchReplication(kFALSE),
59 fNeedsTrackletsBranchReplication(kFALSE),
60 fNeedsPMDClustersBranchReplication(kFALSE),
61 fNeedsJetsBranchReplication(kFALSE),
62 fNeedsFMDClustersBranchReplication(kFALSE),
63 fNeedsCaloClustersBranchReplication(kFALSE),
64 fAODIsReplicated(kFALSE),
ec4af4c1 65 fAODEvent(NULL),
da97a08a 66 fMCEventH(NULL),
e910dd36 67 fTreeA(NULL),
68 fFileA(NULL),
9066c676 69 fFileName(""),
70 fExtensions(NULL)
ec4af4c1 71{
72 // default constructor
73}
74
75//______________________________________________________________________________
76AliAODHandler::AliAODHandler(const char* name, const char* title):
f3214a54 77 AliVEventHandler(name, title),
78f7f935 78 fIsStandard(kTRUE),
da97a08a 79 fFillAOD(kTRUE),
7c3a9fbf 80 fNeedsHeaderReplication(kFALSE),
75754ba8 81 fNeedsTracksBranchReplication(kFALSE),
82 fNeedsVerticesBranchReplication(kFALSE),
83 fNeedsV0sBranchReplication(kFALSE),
84 fNeedsTrackletsBranchReplication(kFALSE),
85 fNeedsPMDClustersBranchReplication(kFALSE),
86 fNeedsJetsBranchReplication(kFALSE),
87 fNeedsFMDClustersBranchReplication(kFALSE),
88 fNeedsCaloClustersBranchReplication(kFALSE),
89 fAODIsReplicated(kFALSE),
ec4af4c1 90 fAODEvent(NULL),
da97a08a 91 fMCEventH(NULL),
e910dd36 92 fTreeA(NULL),
93 fFileA(NULL),
9066c676 94 fFileName(""),
95 fExtensions(NULL)
ec4af4c1 96{
97}
98
99//______________________________________________________________________________
100AliAODHandler::~AliAODHandler()
101{
9066c676 102 // Destructor.
6989bff3 103 delete fAODEvent;
104 if(fFileA){
105 // is already handled in TerminateIO
106 fFileA->Close();
107 delete fFileA;
108 }
109 delete fTreeA;
9066c676 110 if (fExtensions) delete fExtensions;
ec4af4c1 111}
112
7970f4ac 113//______________________________________________________________________________
300d5701 114Bool_t AliAODHandler::Init(Option_t* opt)
ec4af4c1 115{
6989bff3 116 // Initialize IO
117 //
118 // Create the AODevent object
119 if(!fAODEvent){
ec4af4c1 120 fAODEvent = new AliAODEvent();
78f7f935 121 if (fIsStandard) fAODEvent->CreateStdContent();
6989bff3 122 }
123 //
124 // File opening according to execution mode
7970f4ac 125 TString option(opt);
126 option.ToLower();
160959a9 127 TDirectory *owd = gDirectory;
7970f4ac 128 if (option.Contains("proof")) {
6989bff3 129 // proof
160959a9 130 // Merging via files. Need to access analysis manager via interpreter.
20653795 131 gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(\"%s\", \"RECREATE\");", fFileName.Data()));
160959a9 132 gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->GetCommonOutputContainer()->SetFile((TFile*)0x%lx);", gFile));
133 fFileA = gFile;
6989bff3 134 } else {
135 // local and grid
7970f4ac 136 fFileA = new TFile(fFileName.Data(), "RECREATE");
6989bff3 137 }
160959a9 138 CreateTree(1);
139 owd->cd();
9066c676 140 if (fExtensions) {
141 TIter next(fExtensions);
142 AliAODExtension *ext;
143 while ((ext=(AliAODExtension*)next())) ext->Init(option);
144 }
6989bff3 145 return kTRUE;
ec4af4c1 146}
147
9066c676 148//______________________________________________________________________________
da97a08a 149void AliAODHandler::StoreMCParticles(){
dce1b636 150
da97a08a 151 //
152 // Remap the labels from ESD stack and store
153 // the AODMCParticles, makes only sense if we have
154 // the mcparticles branch
155 // has to be done here since we cannot know in advance
156 // which particles are needed (e.g. by the tracks etc.)
157 //
158 // Particles have been selected by AliMCEventhanlder->SelectParticle()
159 // To use the MCEventhandler here we need to set it from the outside
160 // can vanish when Handler go to the ANALYSISalice library
dce1b636 161 //
162 // The Branch booking for mcParticles and mcHeader has to happen
163 // in an external task for now since the AODHandler does not have access
164 // the AnalysisManager. For the same reason the pointer t o the MCEventH
165 // has to passed to the AOD Handler by this task
166 // (doing this in the steering macro would not work on PROOF)
da97a08a 167
168 TClonesArray *mcarray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
169 if(!mcarray)return;
170 mcarray->Delete();
171
dce1b636 172 AliAODMCHeader *mcHeader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName());
173 if(!mcHeader)return;
174
175 mcHeader->Reset();
176
da97a08a 177 // Get the MC Infos.. Handler needs to be set before
178 // while adding the branch
179 // This needs to be done, not to depend on the AnalysisManager
180
181 if(!fMCEventH)return;
182 if(!fMCEventH->MCEvent())return;
183 AliStack *pStack = fMCEventH->MCEvent()->Stack();
184 if(!pStack)return;
185
186 fMCEventH->CreateLabelMap();
187
dce1b636 188 //
189 // Get the Event Header
190 //
191
192 AliHeader* header = fMCEventH->MCEvent()->Header();
193 if (!header)return;
194
195 // get the MC vertex
196 AliGenEventHeader* genHeader = header->GenEventHeader();
197 TArrayF vtxMC(3);
198 genHeader->PrimaryVertex(vtxMC);
199 mcHeader->SetVertex(vtxMC[0],vtxMC[1],vtxMC[2]);
200
201 // we search the MCEventHeaders first
202 // Two cases, cocktail or not...
203 AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
204 if(genCocktailHeader){
205 // we have a coktail header
206 mcHeader->AddGeneratorName(genHeader->GetName());
207 // Loop from the back so that the first one sets the process type
208 TList* headerList = genCocktailHeader->GetHeaders();
209 for(int i = headerList->GetEntries()-1;i>=0;--i){
210 AliGenEventHeader *headerEntry = dynamic_cast<AliGenEventHeader*>(headerList->At(i));
211 SetMCHeaderInfo(mcHeader,headerEntry);
212 }
213 }
214 else{
215 // No Cocktail just take the first one
216 SetMCHeaderInfo(mcHeader,genHeader);
217 }
218
219
220
221
222 // Store the AliAODParticlesMC
93836e1b 223 AliMCEvent* mcEvent = fMCEventH->MCEvent();
224
225 Int_t np = mcEvent->GetNumberOfTracks();
226 Int_t nprim = mcEvent->GetNumberOfPrimaries();
da97a08a 227
228
229 Int_t j = 0;
230 TClonesArray& l = *mcarray;
231
93836e1b 232 for(int i = 0; i < np; ++i){
233 if(fMCEventH->IsParticleSelected(i)){
234 Int_t flag = 0;
235 AliMCParticle* mcpart = mcEvent->GetTrack(i);
93836e1b 236 if(i<nprim)flag |= AliAODMCParticle::kPrimary;
237
238 if(mcEvent->IsPhysicalPrimary(i))flag |= AliAODMCParticle::kPhysicalPrim;
239
240 if(fMCEventH->GetNewLabel(i)!=j){
241 AliError(Form("MISMATCH New label %d j: %d",fMCEventH->GetNewLabel(i),j));
da97a08a 242 }
da97a08a 243
93836e1b 244 AliAODMCParticle mcpart_tmp(mcpart,i,flag);
245
246 //
247 Int_t d0 = mcpart_tmp.GetDaughter(0);
248 Int_t d1 = mcpart_tmp.GetDaughter(1);
249 Int_t m = mcpart_tmp.GetMother();
250
251 // other than for the track labels, negative values mean
252 // no daughter/mother so preserve it
253
254 if(d0<0 && d1<0){
255 // no first daughter -> no second daughter
256 // nothing to be done
257 // second condition not needed just for sanity check at the end
258 mcpart_tmp.SetDaughter(0,d0);
259 mcpart_tmp.SetDaughter(1,d1);
260 } else if(d1 < 0 && d0 >= 0) {
261 // Only one daughter
262 // second condition not needed just for sanity check at the end
263 if(fMCEventH->IsParticleSelected(d0)){
264 mcpart_tmp.SetDaughter(0,fMCEventH->GetNewLabel(d0));
265 } else {
266 mcpart_tmp.SetDaughter(0,-1);
267 }
268 mcpart_tmp.SetDaughter(1,d1);
269 }
270 else if (d0 > 0 && d1 > 0 ){
271 // we have two or more daughters loop on the stack to see if they are
272 // selected
273 Int_t d0_tmp = -1;
274 Int_t d1_tmp = -1;
275 for(int id = d0; id<=d1;++id){
276 if(fMCEventH->IsParticleSelected(id)){
277 if(d0_tmp==-1){
278 // first time
279 d0_tmp = fMCEventH->GetNewLabel(id);
280 d1_tmp = d0_tmp; // this is to have the same schema as on the stack i.e. with one daugther d0 and d1 are the same
281 }
282 else d1_tmp = fMCEventH->GetNewLabel(id);
283 }
284 }
285 mcpart_tmp.SetDaughter(0,d0_tmp);
286 mcpart_tmp.SetDaughter(1,d1_tmp);
287 } else {
288 AliError(Form("Unxpected indices %d %d",d0,d1));
289 }
290
291 if(m<0){
292 mcpart_tmp.SetMother(m);
293 } else {
294 if(fMCEventH->IsParticleSelected(m))mcpart_tmp.SetMother(fMCEventH->GetNewLabel(m));
295 else AliError(Form("PROBLEM Mother not selected %d \n", m));
296 }
297
298 new (l[j++]) AliAODMCParticle(mcpart_tmp);
299
da97a08a 300 }
da97a08a 301 }
93836e1b 302 AliInfo(Form("AliAODHandler::StoreMCParticles: Selected %d (Primaries %d / total %d) after validation \n",
da97a08a 303 j,nprim,np));
304
305 // Set the labels in the AOD output...
306 // Remapping
307
308 // AODTracks
309 TClonesArray* tracks = fAODEvent->GetTracks();
310 if(tracks){
311 for(int it = 0; it < fAODEvent->GetNTracks();++it){
312 AliAODTrack *track = fAODEvent->GetTrack(it);
313
93836e1b 314 Int_t label = TMath::Abs(track->GetLabel());
315 if (label >= AliMCEvent::BgLabelOffset()) label = mcEvent->BgLabelToIndex(label);
316
317
318 if(label > np || track->GetLabel() == 0){
319 AliWarning(Form("Wrong ESD track label %5d (%5d)",track->GetLabel(), label));
da97a08a 320 }
93836e1b 321 if(fMCEventH->GetNewLabel(label) == 0){
322 AliWarning(Form("New label not found for %5d (%5d)",track->GetLabel(), label));
da97a08a 323 }
93836e1b 324 track->SetLabel(fMCEventH->GetNewLabel(label));
da97a08a 325 }
326 }
327
328 // AOD calo cluster
329 TClonesArray *clusters = fAODEvent->GetCaloClusters();
330 if(clusters){
331 for (Int_t iClust = 0;iClust < fAODEvent->GetNCaloClusters(); ++iClust) {
332 AliAODCaloCluster * cluster = fAODEvent->GetCaloCluster(iClust);
333 UInt_t nLabel = cluster->GetNLabel();
334 // Ugly but do not want to fragment memory by creating
335 // new Int_t (nLabel)
336 Int_t* labels = const_cast<Int_t*>(cluster->GetLabels());
337 if (labels){
338 for(UInt_t i = 0;i < nLabel;++i){
339 labels[i] = fMCEventH->GetNewLabel(cluster->GetLabel(i));
340 }
341 }
342 // cluster->SetLabels(labels,nLabel);
343 }// iClust
344 }// clusters
345
346 // AOD tracklets
347 AliAODTracklets *tracklets = fAODEvent->GetTracklets();
348 if(tracklets){
349 for(int it = 0;it < tracklets->GetNumberOfTracklets();++it){
350 int label0 = tracklets->GetLabel(it,0);
351 int label1 = tracklets->GetLabel(it,1);
352 if(label0>=0)label0 = fMCEventH->GetNewLabel(label0);
353 if(label1>=0)label1 = fMCEventH->GetNewLabel(label1);
354 tracklets->SetLabel(it,0,label0);
355 tracklets->SetLabel(it,1,label1);
356 }
357 }
358
359}
360
9066c676 361//______________________________________________________________________________
5f380da9 362Bool_t AliAODHandler::FinishEvent()
ec4af4c1 363{
da97a08a 364 // Fill data structures
365 if(fFillAOD){
f4e5f8d5 366 fAODEvent->MakeEntriesReferencable();
da97a08a 367 StoreMCParticles();
ec4af4c1 368 FillTree();
9066c676 369 if (fExtensions) {
370 TIter next(fExtensions);
371 AliAODExtension *ext;
372 while ((ext=(AliAODExtension*)next())) {
373 ext->GetAOD()->MakeEntriesReferencable();
374 ext->GetTree()->Fill();
375 }
376 }
da97a08a 377 }
378
379 if (fIsStandard) fAODEvent->ResetStd();
380 // Reset AOD replication flag
381 fAODIsReplicated = kFALSE;
382 return kTRUE;
ec4af4c1 383}
384
7970f4ac 385//______________________________________________________________________________
ec4af4c1 386Bool_t AliAODHandler::Terminate()
387{
9066c676 388 // Terminate
389 AddAODtoTreeUserInfo();
390 if (fExtensions) {
391 TIter next(fExtensions);
392 AliAODExtension *ext;
393 while ((ext=(AliAODExtension*)next())) ext->GetTree()->GetUserInfo()->Add(ext->GetAOD());
394 }
395 return kTRUE;
ec4af4c1 396}
397
7970f4ac 398//______________________________________________________________________________
ec4af4c1 399Bool_t AliAODHandler::TerminateIO()
400{
9066c676 401 // Terminate IO
402 if (fFileA) {
403 fFileA->Close();
404 delete fFileA;
405 fFileA = 0;
406 }
407 if (fExtensions) {
408 TIter next(fExtensions);
409 AliAODExtension *ext;
410 while ((ext=(AliAODExtension*)next())) ext->TerminateIO();
411 }
412 return kTRUE;
ec4af4c1 413}
414
7970f4ac 415//______________________________________________________________________________
954526ed 416void AliAODHandler::CreateTree(Int_t flag)
ec4af4c1 417{
418 // Creates the AOD Tree
f3214a54 419 fTreeA = new TTree("aodTree", "AliAOD tree");
ec4af4c1 420 fTreeA->Branch(fAODEvent->GetList());
954526ed 421 if (flag == 0) fTreeA->SetDirectory(0);
ec4af4c1 422}
423
7970f4ac 424//______________________________________________________________________________
ec4af4c1 425void AliAODHandler::FillTree()
426{
427 // Fill the AOD Tree
da97a08a 428 fTreeA->Fill();
ec4af4c1 429}
430
7970f4ac 431//______________________________________________________________________________
ec4af4c1 432void AliAODHandler::AddAODtoTreeUserInfo()
433{
dce1b636 434 // Add aod event to tree user info
da97a08a 435 fTreeA->GetUserInfo()->Add(fAODEvent);
ec4af4c1 436}
490e9023 437
7970f4ac 438//______________________________________________________________________________
9066c676 439void AliAODHandler::AddBranch(const char* cname, void* addobj, const char* filename)
490e9023 440{
9066c676 441 // Add a new branch to the aod. Added optional filename parameter if the
442 // branch should be written to a separate file.
443 if (strlen(filename)) {
444 AliAODExtension *ext = AddExtension(filename);
445 ext->AddBranch(cname, addobj);
446 return;
447 }
490e9023 448 TDirectory *owd = gDirectory;
449 if (fFileA) {
dce1b636 450 fFileA->cd();
490e9023 451 }
0134949d 452 char** apointer = (char**) addobj;
453 TObject* obj = (TObject*) *apointer;
dce1b636 454
0134949d 455 fAODEvent->AddObject(obj);
dce1b636 456
457 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
458 const Int_t kBufsize = 32000; // default value in TTree::Branch()
459
460 if (!fTreeA->FindBranch(obj->GetName())) {
461 // Do the same as if we book via
462 // TTree::Branch(TCollection*)
463
464 fTreeA->Bronch(obj->GetName(), cname, fAODEvent->GetList()->GetObjectRef(obj),
465 kBufsize, kSplitlevel - 1);
466 // fTreeA->Branch(obj->GetName(), cname, addobj);
467 }
490e9023 468 owd->cd();
469}
7970f4ac 470
9066c676 471//______________________________________________________________________________
472AliAODExtension *AliAODHandler::AddExtension(const char *filename, const char *title)
473{
474// Add an AOD extension with some branches in a different file.
475 TString fname(filename);
476 if (!fname.EndsWith(".root")) fname += ".root";
477 if (!fExtensions) {
478 fExtensions = new TObjArray();
479 fExtensions->SetOwner();
480 }
481 AliAODExtension *ext = (AliAODExtension*)fExtensions->FindObject(fname);
482 if (!ext) {
483 ext = new AliAODExtension(fname, title);
484 fExtensions->Add(ext);
485 }
486 return ext;
487}
488
7970f4ac 489//______________________________________________________________________________
490void AliAODHandler::SetOutputFileName(const char* fname)
491{
492// Set file name.
493 fFileName = fname;
494}
495
496//______________________________________________________________________________
497const char *AliAODHandler::GetOutputFileName()
498{
499// Get file name.
500 return fFileName.Data();
501}
dce1b636 502
9066c676 503//______________________________________________________________________________
dce1b636 504void AliAODHandler::SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader *genHeader){
505
506
507 // Utility function to cover different cases for the AliGenEventHeader
508 // Needed since different ProcessType and ImpactParamter are not
509 // in the base class...
510 // We don't encode process types for event cocktails yet
9066c676 511 // could be done e.g. by adding offsets depnding on the generator
dce1b636 512
513 mcHeader->AddGeneratorName(genHeader->GetName());
dce1b636 514 if(!genHeader)return;
515 AliGenPythiaEventHeader *pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
516 if (pythiaGenHeader) {
517 mcHeader->SetEventType(pythiaGenHeader->ProcessType());
0fd37a1f 518 mcHeader->SetPtHard(pythiaGenHeader->GetPtHard());
dce1b636 519 return;
520 }
521
522 AliGenDPMjetEventHeader* dpmJetGenHeader = dynamic_cast<AliGenDPMjetEventHeader*>(genHeader);
523
524 if (dpmJetGenHeader){
525 mcHeader->SetEventType(dpmJetGenHeader->ProcessType());
526 return;
527 }
528
529 AliGenHijingEventHeader* hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
530 if(hijingGenHeader){
531 mcHeader->SetImpactParameter(hijingGenHeader->ImpactParameter());
532 return;
533 }
534
535 AliWarning(Form("MC Eventheader not known: %s",genHeader->GetName()));
536
537}
9066c676 538
539ClassImp(AliAODExtension)
540
541//-------------------------------------------------------------------------
542// Support class for AOD extensions. This is created by the user analysis
543// that requires a separate file for some AOD branches. The name of the
544// AliAODExtension object is the file name where the AOD branches will be
545// stored.
546//-------------------------------------------------------------------------
547
548//______________________________________________________________________________
549AliAODExtension::~AliAODExtension()
550{
551// Destructor.
552 delete fAODEvent;
553 if(fFileE){
554 // is already handled in TerminateIO
555 fFileE->Close();
556 delete fFileE;
557 }
558 delete fTreeE;
559}
560
561//______________________________________________________________________________
562void AliAODExtension::AddBranch(const char* cname, void* addobj)
563{
564 // Add a new branch to the aod
d29168d6 565 if (!fAODEvent) {
566 char type[20];
567 gROOT->ProcessLine(Form("TString s_tmp; AliAnalysisManager::GetAnalysisManager()->GetAnalysisTypeString(s_tmp); sprintf((char*)0x%lx, \"%%s\", s_tmp.Data());", type));
568 Init(type);
569 }
9066c676 570 TDirectory *owd = gDirectory;
571 if (fFileE) {
572 fFileE->cd();
573 }
574 char** apointer = (char**) addobj;
575 TObject* obj = (TObject*) *apointer;
576
577 fAODEvent->AddObject(obj);
578
579 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
580 const Int_t kBufsize = 32000; // default value in TTree::Branch()
581
582 if (!fTreeE->FindBranch(obj->GetName())) {
583 // Do the same as if we book via
584 // TTree::Branch(TCollection*)
585
586 fTreeE->Bronch(obj->GetName(), cname, fAODEvent->GetList()->GetObjectRef(obj),
587 kBufsize, kSplitlevel - 1);
588 // fTreeA->Branch(obj->GetName(), cname, addobj);
589 }
590 owd->cd();
591}
592
593//______________________________________________________________________________
160959a9 594Bool_t AliAODExtension::Init(Option_t *option)
9066c676 595{
596// Initialize IO.
597 if(!fAODEvent) fAODEvent = new AliAODEvent();
598 TDirectory *owd = gDirectory;
160959a9 599 TString opt(option);
600 opt.ToLower();
601 if (opt.Contains("proof")) {
602 // proof
603 // Merging via files. Need to access analysis manager via interpreter.
20653795 604 gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(\"%s\", \"RECREATE\");", fName.Data()));
160959a9 605 fFileE = gFile;
606 } else {
607 fFileE = new TFile(GetName(), "RECREATE");
608 }
9066c676 609 fTreeE = new TTree("aodTree", "AliAOD tree");
610 fTreeE->Branch(fAODEvent->GetList());
9066c676 611 owd->cd();
612 return kTRUE;
613}
614
615//______________________________________________________________________________
616Bool_t AliAODExtension::TerminateIO()
617{
618 // Terminate IO
619 if (fFileE) {
620 fFileE->Write();
621 fFileE->Close();
622 delete fFileE;
623 fFileE = 0;
624 }
625 return kTRUE;
626}