]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AOD/AliAODHandler.cxx
Additional modifications for Ntrue-efficiency acquisition at final selection level...
[u/mrichter/AliRoot.git] / STEER / AOD / 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"
aa7e002c 34#include "AliAODExtension.h"
da97a08a 35#include "AliAODTracklets.h"
36#include "AliStack.h"
37#include "AliAODMCParticle.h"
dce1b636 38#include "AliAODMCHeader.h"
da97a08a 39#include "AliMCEventHandler.h"
40#include "AliMCEvent.h"
dce1b636 41#include "AliGenEventHeader.h"
42#include "AliGenHijingEventHeader.h"
43#include "AliGenDPMjetEventHeader.h"
44#include "AliGenPythiaEventHeader.h"
45#include "AliGenCocktailEventHeader.h"
26ba01d4 46#include "AliCodeTimer.h"
47#include "AliAODBranchReplicator.h"
48#include "Riostream.h"
ec4af4c1 49
66b0310c 50using std::endl;
51using std::cout;
ec4af4c1 52ClassImp(AliAODHandler)
53
54//______________________________________________________________________________
55AliAODHandler::AliAODHandler() :
f3214a54 56 AliVEventHandler(),
78f7f935 57 fIsStandard(kTRUE),
da97a08a 58 fFillAOD(kTRUE),
41b01ae4 59 fFillAODRun(kTRUE),
ca2834f6 60 fFillExtension(kTRUE),
7c3a9fbf 61 fNeedsHeaderReplication(kFALSE),
2981307f 62 fNeedsTOFHeaderReplication(kFALSE),
63 fNeedsVZEROReplication(kFALSE),
75754ba8 64 fNeedsTracksBranchReplication(kFALSE),
65 fNeedsVerticesBranchReplication(kFALSE),
66 fNeedsV0sBranchReplication(kFALSE),
e0107012 67 fNeedsCascadesBranchReplication(kFALSE),
75754ba8 68 fNeedsTrackletsBranchReplication(kFALSE),
69 fNeedsPMDClustersBranchReplication(kFALSE),
70 fNeedsJetsBranchReplication(kFALSE),
71 fNeedsFMDClustersBranchReplication(kFALSE),
72 fNeedsCaloClustersBranchReplication(kFALSE),
720f7306 73 fNeedsCaloTriggerBranchReplication(kFALSE),
3549c522 74 fNeedsMCParticlesBranchReplication(kFALSE),
866d8d78 75 fNeedsDimuonsBranchReplication(kFALSE),
fc05a533 76 fNeedsHMPIDBranchReplication(kFALSE),
75754ba8 77 fAODIsReplicated(kFALSE),
ec4af4c1 78 fAODEvent(NULL),
da97a08a 79 fMCEventH(NULL),
e910dd36 80 fTreeA(NULL),
81 fFileA(NULL),
9066c676 82 fFileName(""),
582cfeb5 83 fExtensions(NULL),
84 fFilters(NULL)
ec4af4c1 85{
86 // default constructor
87}
88
89//______________________________________________________________________________
90AliAODHandler::AliAODHandler(const char* name, const char* title):
f3214a54 91 AliVEventHandler(name, title),
78f7f935 92 fIsStandard(kTRUE),
da97a08a 93 fFillAOD(kTRUE),
41b01ae4 94 fFillAODRun(kTRUE),
ca2834f6 95 fFillExtension(kTRUE),
7c3a9fbf 96 fNeedsHeaderReplication(kFALSE),
2981307f 97 fNeedsTOFHeaderReplication(kFALSE),
98 fNeedsVZEROReplication(kFALSE),
75754ba8 99 fNeedsTracksBranchReplication(kFALSE),
100 fNeedsVerticesBranchReplication(kFALSE),
101 fNeedsV0sBranchReplication(kFALSE),
e0107012 102 fNeedsCascadesBranchReplication(kFALSE),
75754ba8 103 fNeedsTrackletsBranchReplication(kFALSE),
104 fNeedsPMDClustersBranchReplication(kFALSE),
105 fNeedsJetsBranchReplication(kFALSE),
106 fNeedsFMDClustersBranchReplication(kFALSE),
107 fNeedsCaloClustersBranchReplication(kFALSE),
fc05a533 108 fNeedsCaloTriggerBranchReplication(kFALSE),
3549c522 109 fNeedsMCParticlesBranchReplication(kFALSE),
866d8d78 110 fNeedsDimuonsBranchReplication(kFALSE),
fc05a533 111 fNeedsHMPIDBranchReplication(kFALSE),
75754ba8 112 fAODIsReplicated(kFALSE),
ec4af4c1 113 fAODEvent(NULL),
da97a08a 114 fMCEventH(NULL),
e910dd36 115 fTreeA(NULL),
116 fFileA(NULL),
9066c676 117 fFileName(""),
582cfeb5 118 fExtensions(NULL),
119 fFilters(NULL)
ec4af4c1 120{
582cfeb5 121// Normal constructor.
ec4af4c1 122}
123
124//______________________________________________________________________________
125AliAODHandler::~AliAODHandler()
126{
9066c676 127 // Destructor.
14d6fad5 128
129 delete fAODEvent;
130
9eb17d61 131 if (fFileA) fFileA->Close();
74e11085 132
9eb17d61 133 delete fFileA;
14d6fad5 134 delete fTreeA;
135 delete fExtensions;
136 delete fFilters;
ec4af4c1 137}
138
7970f4ac 139//______________________________________________________________________________
300d5701 140Bool_t AliAODHandler::Init(Option_t* opt)
ec4af4c1 141{
6989bff3 142 // Initialize IO
143 //
144 // Create the AODevent object
e0107012 145
4e6d5854 146 Bool_t createStdAOD = fIsStandard || fFillAOD;
aa399a26 147 if(!fAODEvent && createStdAOD){
ec4af4c1 148 fAODEvent = new AliAODEvent();
c8fe2783 149 if (fIsStandard)
150 fAODEvent->CreateStdContent();
6989bff3 151 }
152 //
153 // File opening according to execution mode
7970f4ac 154 TString option(opt);
155 option.ToLower();
aa399a26 156 if (createStdAOD) {
157 TDirectory *owd = gDirectory;
158 if (option.Contains("proof")) {
159 // proof
160 // Merging via files. Need to access analysis manager via interpreter.
161 gROOT->ProcessLine(Form("AliAnalysisDataContainer *c_common_out = AliAnalysisManager::GetAnalysisManager()->GetCommonOutputContainer();"));
162 gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(c_common_out, \"RECREATE\");"));
163 fFileA = gFile;
164 } else {
165 // local and grid
166 fFileA = new TFile(fFileName.Data(), "RECREATE");
167 }
168 CreateTree(1);
169 owd->cd();
170 }
9066c676 171 if (fExtensions) {
172 TIter next(fExtensions);
173 AliAODExtension *ext;
174 while ((ext=(AliAODExtension*)next())) ext->Init(option);
175 }
582cfeb5 176 if (fFilters) {
177 TIter nextf(fFilters);
178 AliAODExtension *filteredAOD;
179 while ((filteredAOD=(AliAODExtension*)nextf())) {
180 filteredAOD->SetEvent(fAODEvent);
181 filteredAOD->Init(option);
14d6fad5 182 }
582cfeb5 183 }
14d6fad5 184
6989bff3 185 return kTRUE;
ec4af4c1 186}
187
26ba01d4 188//______________________________________________________________________________
189void AliAODHandler::Print(Option_t* opt) const
190{
191 // Print info about this object
192
193 cout << opt << Form("IsStandard %d filename=%s",fIsStandard,fFileName.Data()) << endl;
194
195 if ( fExtensions )
196 {
197 cout << opt << fExtensions->GetEntries() << " extensions :" << endl;
b5b9155e 198 PrintExtensions(*fExtensions);
26ba01d4 199 }
200 if ( fFilters )
201 {
202 cout << opt << fFilters->GetEntries() << " filters :" << endl;
b5b9155e 203 PrintExtensions(*fFilters);
26ba01d4 204 }
205}
206
207//______________________________________________________________________________
b5b9155e 208void AliAODHandler::PrintExtensions(const TObjArray& array) const
26ba01d4 209{
210 // Show the list of aod extensions
211 TIter next(&array);
212 AliAODExtension* ext(0x0);
213 while ( ( ext = static_cast<AliAODExtension*>(next()) ) )
214 {
215 ext->Print(" ");
216 }
217}
218
9066c676 219//______________________________________________________________________________
da97a08a 220void AliAODHandler::StoreMCParticles(){
dce1b636 221
da97a08a 222 //
223 // Remap the labels from ESD stack and store
224 // the AODMCParticles, makes only sense if we have
225 // the mcparticles branch
226 // has to be done here since we cannot know in advance
227 // which particles are needed (e.g. by the tracks etc.)
228 //
229 // Particles have been selected by AliMCEventhanlder->SelectParticle()
230 // To use the MCEventhandler here we need to set it from the outside
231 // can vanish when Handler go to the ANALYSISalice library
dce1b636 232 //
233 // The Branch booking for mcParticles and mcHeader has to happen
234 // in an external task for now since the AODHandler does not have access
235 // the AnalysisManager. For the same reason the pointer t o the MCEventH
236 // has to passed to the AOD Handler by this task
237 // (doing this in the steering macro would not work on PROOF)
da97a08a 238
aa399a26 239 if (!fAODEvent) return;
da97a08a 240 TClonesArray *mcarray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
241 if(!mcarray)return;
da97a08a 242
dce1b636 243 AliAODMCHeader *mcHeader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName());
244 if(!mcHeader)return;
245
da97a08a 246 // Get the MC Infos.. Handler needs to be set before
247 // while adding the branch
248 // This needs to be done, not to depend on the AnalysisManager
249
250 if(!fMCEventH)return;
251 if(!fMCEventH->MCEvent())return;
252 AliStack *pStack = fMCEventH->MCEvent()->Stack();
253 if(!pStack)return;
254
255 fMCEventH->CreateLabelMap();
256
dce1b636 257 //
258 // Get the Event Header
259 //
260
261 AliHeader* header = fMCEventH->MCEvent()->Header();
9efd8e10 262 // get the MC vertex
263 AliGenEventHeader* genHeader = 0;
264 if (header) genHeader = header->GenEventHeader();
265 if (genHeader) {
266 TArrayF vtxMC(3);
267 genHeader->PrimaryVertex(vtxMC);
268 mcHeader->SetVertex(vtxMC[0],vtxMC[1],vtxMC[2]);
9efd8e10 269 // we search the MCEventHeaders first
270 // Two cases, cocktail or not...
271 AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
272 if(genCocktailHeader){
08078824 273 // we have a coktail header add the name once
9efd8e10 274 mcHeader->AddGeneratorName(genHeader->GetName());
9efd8e10 275 TList* headerList = genCocktailHeader->GetHeaders();
08078824 276 // the first entry defines some extra general settings
277 AliGenEventHeader *headerEntry = dynamic_cast<AliGenEventHeader*>(headerList->At(0));
278 if (!headerEntry) {
279 AliFatal("AliGenEventHeader entry not found in the header list");
280 } else {
281 SetMCHeaderInfo(mcHeader,headerEntry);
282 }
9efd8e10 283 }
284 else{
08078824 285 // No Cocktail just take the first one
286 SetMCHeaderInfo(mcHeader,genHeader);
9efd8e10 287 }
08078824 288 // Add all the headers and names, if no cocktail header
289 // there will be only one entry
290 mcHeader->AddCocktailHeaders(genHeader);
dce1b636 291 }
9efd8e10 292
dce1b636 293
294
295
296
297 // Store the AliAODParticlesMC
93836e1b 298 AliMCEvent* mcEvent = fMCEventH->MCEvent();
299
300 Int_t np = mcEvent->GetNumberOfTracks();
301 Int_t nprim = mcEvent->GetNumberOfPrimaries();
da97a08a 302
303
304 Int_t j = 0;
305 TClonesArray& l = *mcarray;
306
93836e1b 307 for(int i = 0; i < np; ++i){
308 if(fMCEventH->IsParticleSelected(i)){
309 Int_t flag = 0;
6cd07d0a 310 AliMCParticle* mcpart = (AliMCParticle*) mcEvent->GetTrack(i);
93836e1b 311 if(i<nprim)flag |= AliAODMCParticle::kPrimary;
312
313 if(mcEvent->IsPhysicalPrimary(i))flag |= AliAODMCParticle::kPhysicalPrim;
d4312c7a 314 if(mcEvent->IsSecondaryFromWeakDecay(i))flag |= AliAODMCParticle::kSecondaryFromWeakDecay;
315 if(mcEvent->IsSecondaryFromMaterial(i))flag |= AliAODMCParticle::kSecondaryFromMaterial;
6a9d52e4 316
93836e1b 317 if(fMCEventH->GetNewLabel(i)!=j){
318 AliError(Form("MISMATCH New label %d j: %d",fMCEventH->GetNewLabel(i),j));
da97a08a 319 }
da97a08a 320
77f43bb7 321 AliAODMCParticle mcpartTmp(mcpart,i,flag);
93836e1b 322
77f43bb7 323 mcpartTmp.SetStatus(mcpart->Particle()->GetStatusCode());
6a9d52e4 324 mcpartTmp.SetMCProcessCode(mcpart->Particle()->GetUniqueID());
93836e1b 325 //
77f43bb7 326 Int_t d0 = mcpartTmp.GetDaughter(0);
327 Int_t d1 = mcpartTmp.GetDaughter(1);
328 Int_t m = mcpartTmp.GetMother();
93836e1b 329
330 // other than for the track labels, negative values mean
331 // no daughter/mother so preserve it
332
333 if(d0<0 && d1<0){
334 // no first daughter -> no second daughter
335 // nothing to be done
336 // second condition not needed just for sanity check at the end
77f43bb7 337 mcpartTmp.SetDaughter(0,d0);
338 mcpartTmp.SetDaughter(1,d1);
93836e1b 339 } else if(d1 < 0 && d0 >= 0) {
340 // Only one daughter
341 // second condition not needed just for sanity check at the end
342 if(fMCEventH->IsParticleSelected(d0)){
77f43bb7 343 mcpartTmp.SetDaughter(0,fMCEventH->GetNewLabel(d0));
93836e1b 344 } else {
77f43bb7 345 mcpartTmp.SetDaughter(0,-1);
93836e1b 346 }
77f43bb7 347 mcpartTmp.SetDaughter(1,d1);
93836e1b 348 }
349 else if (d0 > 0 && d1 > 0 ){
350 // we have two or more daughters loop on the stack to see if they are
351 // selected
77f43bb7 352 Int_t d0Tmp = -1;
353 Int_t d1Tmp = -1;
93836e1b 354 for(int id = d0; id<=d1;++id){
355 if(fMCEventH->IsParticleSelected(id)){
77f43bb7 356 if(d0Tmp==-1){
93836e1b 357 // first time
77f43bb7 358 d0Tmp = fMCEventH->GetNewLabel(id);
359 d1Tmp = d0Tmp; // this is to have the same schema as on the stack i.e. with one daugther d0 and d1 are the same
93836e1b 360 }
77f43bb7 361 else d1Tmp = fMCEventH->GetNewLabel(id);
93836e1b 362 }
363 }
77f43bb7 364 mcpartTmp.SetDaughter(0,d0Tmp);
365 mcpartTmp.SetDaughter(1,d1Tmp);
93836e1b 366 } else {
367 AliError(Form("Unxpected indices %d %d",d0,d1));
368 }
369
370 if(m<0){
77f43bb7 371 mcpartTmp.SetMother(m);
93836e1b 372 } else {
77f43bb7 373 if(fMCEventH->IsParticleSelected(m))mcpartTmp.SetMother(fMCEventH->GetNewLabel(m));
93836e1b 374 else AliError(Form("PROBLEM Mother not selected %d \n", m));
375 }
6326aeae 376
77f43bb7 377 new (l[j++]) AliAODMCParticle(mcpartTmp);
93836e1b 378
da97a08a 379 }
da97a08a 380 }
93836e1b 381 AliInfo(Form("AliAODHandler::StoreMCParticles: Selected %d (Primaries %d / total %d) after validation \n",
da97a08a 382 j,nprim,np));
383
384 // Set the labels in the AOD output...
385 // Remapping
386
387 // AODTracks
388 TClonesArray* tracks = fAODEvent->GetTracks();
389 if(tracks){
390 for(int it = 0; it < fAODEvent->GetNTracks();++it){
391 AliAODTrack *track = fAODEvent->GetTrack(it);
392
91dece68 393 Int_t sign = 1;
394 Int_t label = track->GetLabel();
395 if(label<0){ // preserve the sign for later usage
396 label *= -1;
397 sign = -1;
398 }
399
93836e1b 400 if (label >= AliMCEvent::BgLabelOffset()) label = mcEvent->BgLabelToIndex(label);
93836e1b 401 if(label > np || track->GetLabel() == 0){
402 AliWarning(Form("Wrong ESD track label %5d (%5d)",track->GetLabel(), label));
da97a08a 403 }
93836e1b 404 if(fMCEventH->GetNewLabel(label) == 0){
405 AliWarning(Form("New label not found for %5d (%5d)",track->GetLabel(), label));
da97a08a 406 }
91dece68 407 track->SetLabel(sign*fMCEventH->GetNewLabel(label));
da97a08a 408 }
409 }
410
411 // AOD calo cluster
412 TClonesArray *clusters = fAODEvent->GetCaloClusters();
413 if(clusters){
c8fe2783 414 for (Int_t iClust = 0;iClust < fAODEvent->GetNumberOfCaloClusters(); ++iClust) {
da97a08a 415 AliAODCaloCluster * cluster = fAODEvent->GetCaloCluster(iClust);
c8fe2783 416 UInt_t nLabel = cluster->GetNLabels();
da97a08a 417 // Ugly but do not want to fragment memory by creating
418 // new Int_t (nLabel)
419 Int_t* labels = const_cast<Int_t*>(cluster->GetLabels());
420 if (labels){
421 for(UInt_t i = 0;i < nLabel;++i){
c8fe2783 422 labels[i] = fMCEventH->GetNewLabel(cluster->GetLabelAt(i));
da97a08a 423 }
424 }
425 // cluster->SetLabels(labels,nLabel);
426 }// iClust
427 }// clusters
428
429 // AOD tracklets
430 AliAODTracklets *tracklets = fAODEvent->GetTracklets();
431 if(tracklets){
432 for(int it = 0;it < tracklets->GetNumberOfTracklets();++it){
433 int label0 = tracklets->GetLabel(it,0);
434 int label1 = tracklets->GetLabel(it,1);
435 if(label0>=0)label0 = fMCEventH->GetNewLabel(label0);
436 if(label1>=0)label1 = fMCEventH->GetNewLabel(label1);
437 tracklets->SetLabel(it,0,label0);
438 tracklets->SetLabel(it,1,label1);
439 }
440 }
441
442}
443
9066c676 444//______________________________________________________________________________
5f380da9 445Bool_t AliAODHandler::FinishEvent()
ec4af4c1 446{
da97a08a 447 // Fill data structures
4e6d5854 448 if(fFillAOD && fFillAODRun && fAODEvent){
b8b7dd5c 449 fAODEvent->MakeEntriesReferencable();
e0107012 450 fTreeA->BranchRef();
b8b7dd5c 451 FillTree();
4e6d5854 452 }
f133e976 453
ca2834f6 454 if ((fFillAOD && fFillAODRun) || fFillExtension) {
307b6330 455 if (fExtensions && fFillExtension) {
456 // fFillExtension can be set by the ESD filter or by a delta filter in case of AOD inputs
14d6fad5 457 TIter next(fExtensions);
458 AliAODExtension *ext;
459 while ((ext=(AliAODExtension*)next())) ext->FinishEvent();
460 }
307b6330 461 if (fFilters && fFillAOD && fFillAODRun) {
14d6fad5 462 TIter nextf(fFilters);
463 AliAODExtension *ext;
464 while ((ext=(AliAODExtension*)nextf())) {
b8b7dd5c 465 ext->FinishEvent();
14d6fad5 466 }
467 }
aa399a26 468 }
14d6fad5 469
dddc33c5 470 if (fIsStandard && fAODEvent)
14d6fad5 471 {
472 fAODEvent->ResetStd();
473 }
474
475 if (fAODEvent)
476 {
477 TClonesArray *mcarray = static_cast<TClonesArray*>(fAODEvent->FindListObject(AliAODMCParticle::StdBranchName()));
ef89f372 478 if(mcarray) mcarray->Delete();
479
14d6fad5 480 AliAODMCHeader *mcHeader = static_cast<AliAODMCHeader*>(fAODEvent->FindListObject(AliAODMCHeader::StdBranchName()));
ef89f372 481 if(mcHeader) mcHeader->Reset();
482 }
14d6fad5 483
da97a08a 484 // Reset AOD replication flag
485 fAODIsReplicated = kFALSE;
486 return kTRUE;
ec4af4c1 487}
488
7970f4ac 489//______________________________________________________________________________
ec4af4c1 490Bool_t AliAODHandler::Terminate()
491{
9066c676 492 // Terminate
493 AddAODtoTreeUserInfo();
14d6fad5 494
495 TIter nextF(fFilters);
496 AliAODExtension *ext;
497 while ((ext=static_cast<AliAODExtension*>(nextF())))
498 {
499 ext->AddAODtoTreeUserInfo();
500 }
501
502 TIter nextE(fExtensions);
503 while ((ext=static_cast<AliAODExtension*>(nextE())))
504 {
505 ext->AddAODtoTreeUserInfo();
506 }
507
9066c676 508 return kTRUE;
ec4af4c1 509}
510
7970f4ac 511//______________________________________________________________________________
ec4af4c1 512Bool_t AliAODHandler::TerminateIO()
513{
9066c676 514 // Terminate IO
515 if (fFileA) {
aa399a26 516 fFileA->Write();
9066c676 517 fFileA->Close();
518 delete fFileA;
519 fFileA = 0;
48f1c230 520 // When closing the file, the tree is also deleted.
521 fTreeA = 0;
9066c676 522 }
14d6fad5 523
524 TIter nextF(fFilters);
525 AliAODExtension *ext;
526 while ((ext=static_cast<AliAODExtension*>(nextF())))
527 {
528 ext->TerminateIO();
9066c676 529 }
14d6fad5 530
531 TIter nextE(fExtensions);
532 while ((ext=static_cast<AliAODExtension*>(nextE())))
533 {
534 ext->TerminateIO();
582cfeb5 535 }
14d6fad5 536
9066c676 537 return kTRUE;
ec4af4c1 538}
539
7970f4ac 540//______________________________________________________________________________
954526ed 541void AliAODHandler::CreateTree(Int_t flag)
ec4af4c1 542{
543 // Creates the AOD Tree
f3214a54 544 fTreeA = new TTree("aodTree", "AliAOD tree");
ec4af4c1 545 fTreeA->Branch(fAODEvent->GetList());
954526ed 546 if (flag == 0) fTreeA->SetDirectory(0);
ec4af4c1 547}
548
7970f4ac 549//______________________________________________________________________________
ec4af4c1 550void AliAODHandler::FillTree()
551{
866d8d78 552
ec4af4c1 553 // Fill the AOD Tree
e0107012 554 fTreeA->Fill();
ec4af4c1 555}
556
7970f4ac 557//______________________________________________________________________________
ec4af4c1 558void AliAODHandler::AddAODtoTreeUserInfo()
559{
dce1b636 560 // Add aod event to tree user info
aa399a26 561 if (fTreeA) fTreeA->GetUserInfo()->Add(fAODEvent);
48f1c230 562 // Now the tree owns our fAODEvent...
563 fAODEvent = 0;
ec4af4c1 564}
490e9023 565
7970f4ac 566//______________________________________________________________________________
9066c676 567void AliAODHandler::AddBranch(const char* cname, void* addobj, const char* filename)
490e9023 568{
14d6fad5 569 // Add a new branch to the aod. Added optional filename parameter if the
570 // branch should be written to a separate file.
571
572 if (strlen(filename))
573 {
574 AliAODExtension *ext = AddExtension(filename);
575 ext->AddBranch(cname, addobj);
576 return;
577 }
578
579 // Add branch to all filters
580 // Add branch to all filters
581 if (fFilters) {
582 TIter next(fFilters);
583 AliAODExtension *ext;
584 while ((ext=(AliAODExtension*)next())) ext->AddBranch(cname, addobj);
585 }
586
587 TDirectory *owd = gDirectory;
588 if (fFileA)
589 {
590 fFileA->cd();
591 }
dce1b636 592
14d6fad5 593 char** apointer = (char**) addobj;
594 TObject* obj = (TObject*) *apointer;
595
596 fAODEvent->AddObject(obj);
597
598 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
599 const Int_t kBufsize = 32000; // default value in TTree::Branch()
600
601 if (!fTreeA->FindBranch(obj->GetName()))
602 {
603 // Do the same as if we book via
604 // TTree::Branch(TCollection*)
605
606 fTreeA->Bronch(obj->GetName(), cname, fAODEvent->GetList()->GetObjectRef(obj),
607 kBufsize, kSplitlevel - 1);
608 }
609 owd->cd();
490e9023 610}
7970f4ac 611
9066c676 612//______________________________________________________________________________
613AliAODExtension *AliAODHandler::AddExtension(const char *filename, const char *title)
614{
14d6fad5 615 // Add an AOD extension with some branches in a different file.
26ba01d4 616
14d6fad5 617 TString fname(filename);
618 if (!fname.EndsWith(".root")) fname += ".root";
619 if (!fExtensions) {
620 fExtensions = new TObjArray();
621 fExtensions->SetOwner();
622 }
623 AliAODExtension *ext = (AliAODExtension*)fExtensions->FindObject(fname);
624 if (!ext) {
625 ext = new AliAODExtension(fname, title);
626 fExtensions->Add(ext);
627 }
628 return ext;
9066c676 629}
582cfeb5 630
631//______________________________________________________________________________
632AliAODExtension *AliAODHandler::GetExtension(const char *filename) const
633{
14d6fad5 634 // Getter for AOD extensions via file name.
635 if (!fExtensions) return NULL;
636 return (AliAODExtension*)fExtensions->FindObject(filename);
582cfeb5 637}
638
639//______________________________________________________________________________
640AliAODExtension *AliAODHandler::AddFilteredAOD(const char *filename, const char *filtername)
641{
14d6fad5 642 // Add an AOD extension that can write only AOD events that pass a user filter.
643 if (!fFilters) {
644 fFilters = new TObjArray();
645 fFilters->SetOwner();
646 }
647 AliAODExtension *filter = (AliAODExtension*)fFilters->FindObject(filename);
648 if (!filter) {
649 filter = new AliAODExtension(filename, filtername, kTRUE);
650 fFilters->Add(filter);
651 }
652 return filter;
582cfeb5 653}
654
655//______________________________________________________________________________
656AliAODExtension *AliAODHandler::GetFilteredAOD(const char *filename) const
657{
14d6fad5 658 // Getter for AOD filters via file name.
659 if (!fFilters) return NULL;
660 return (AliAODExtension*)fFilters->FindObject(filename);
582cfeb5 661}
14d6fad5 662
7970f4ac 663//______________________________________________________________________________
664void AliAODHandler::SetOutputFileName(const char* fname)
665{
666// Set file name.
667 fFileName = fname;
668}
669
670//______________________________________________________________________________
671const char *AliAODHandler::GetOutputFileName()
672{
673// Get file name.
674 return fFileName.Data();
675}
dce1b636 676
90d50a8c 677//______________________________________________________________________________
678const char *AliAODHandler::GetExtraOutputs() const
679{
14d6fad5 680 // Get extra outputs as a string separated by commas.
681 static TString eoutputs;
682 eoutputs = "";
683 TObject *obj;
684 if (fExtensions) {
685 TIter next1(fExtensions);
686 while ((obj=next1())) {
687 if (!eoutputs.IsNull()) eoutputs += ",";
688 eoutputs += obj->GetName();
689 }
690 }
691 if (fFilters) {
692 TIter next2(fFilters);
693 while ((obj=next2())) {
694 if (!eoutputs.IsNull()) eoutputs += ",";
695 eoutputs += obj->GetName();
696 }
697 }
698 return eoutputs.Data();
699}
700
701//______________________________________________________________________________
702Bool_t AliAODHandler::HasExtensions() const
703{
704 // Whether or not we manage extensions
705
706 if ( fExtensions && fExtensions->GetEntries()>0 ) return kTRUE;
707
708 return kFALSE;
90d50a8c 709}
710
9066c676 711//______________________________________________________________________________
dce1b636 712void AliAODHandler::SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader *genHeader){
713
714
715 // Utility function to cover different cases for the AliGenEventHeader
716 // Needed since different ProcessType and ImpactParamter are not
717 // in the base class...
dce1b636 718
dce1b636 719 if(!genHeader)return;
720 AliGenPythiaEventHeader *pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
08078824 721 if (pythiaGenHeader) {
722 mcHeader->SetEventType(pythiaGenHeader->ProcessType());
723 mcHeader->SetPtHard(pythiaGenHeader->GetPtHard());
724 return;
725 }
726
727 AliGenDPMjetEventHeader* dpmJetGenHeader = dynamic_cast<AliGenDPMjetEventHeader*>(genHeader);
728
dce1b636 729 if (dpmJetGenHeader){
730 mcHeader->SetEventType(dpmJetGenHeader->ProcessType());
731 return;
732 }
733
734 AliGenHijingEventHeader* hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
735 if(hijingGenHeader){
736 mcHeader->SetImpactParameter(hijingGenHeader->ImpactParameter());
737 return;
738 }
739
08078824 740 // AliWarning(Form("MC Eventheader not known: %s",genHeader->GetName()));
741
dce1b636 742}
9066c676 743