2 /**************************************************************************
3 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
19 //-------------------------------------------------------------------------
20 // Implementation of the Virtual Event Handler Interface for AOD
21 // Author: Andreas Morsch, CERN
22 //-------------------------------------------------------------------------
32 #include "AliAODHandler.h"
33 #include "AliAODEvent.h"
34 #include "AliAODExtension.h"
35 #include "AliAODTracklets.h"
37 #include "AliAODMCParticle.h"
38 #include "AliAODMCHeader.h"
39 #include "AliMCEventHandler.h"
40 #include "AliMCEvent.h"
41 #include "AliGenEventHeader.h"
42 #include "AliGenHijingEventHeader.h"
43 #include "AliGenDPMjetEventHeader.h"
44 #include "AliGenPythiaEventHeader.h"
45 #include "AliGenCocktailEventHeader.h"
46 #include "AliCodeTimer.h"
47 #include "AliAODBranchReplicator.h"
48 #include "Riostream.h"
52 ClassImp(AliAODHandler)
54 //______________________________________________________________________________
55 AliAODHandler::AliAODHandler() :
60 fFillExtension(kTRUE),
61 fNeedsHeaderReplication(kFALSE),
62 fNeedsTOFHeaderReplication(kFALSE),
63 fNeedsVZEROReplication(kFALSE),
64 fNeedsTracksBranchReplication(kFALSE),
65 fNeedsVerticesBranchReplication(kFALSE),
66 fNeedsV0sBranchReplication(kFALSE),
67 fNeedsCascadesBranchReplication(kFALSE),
68 fNeedsTrackletsBranchReplication(kFALSE),
69 fNeedsPMDClustersBranchReplication(kFALSE),
70 fNeedsJetsBranchReplication(kFALSE),
71 fNeedsFMDClustersBranchReplication(kFALSE),
72 fNeedsCaloClustersBranchReplication(kFALSE),
73 fNeedsCaloTriggerBranchReplication(kFALSE),
74 fNeedsMCParticlesBranchReplication(kFALSE),
75 fNeedsDimuonsBranchReplication(kFALSE),
76 fNeedsHMPIDBranchReplication(kFALSE),
77 fAODIsReplicated(kFALSE),
78 fTreeBuffSize(30000000),
88 // default constructor
91 //______________________________________________________________________________
92 AliAODHandler::AliAODHandler(const char* name, const char* title):
93 AliVEventHandler(name, title),
97 fFillExtension(kTRUE),
98 fNeedsHeaderReplication(kFALSE),
99 fNeedsTOFHeaderReplication(kFALSE),
100 fNeedsVZEROReplication(kFALSE),
101 fNeedsTracksBranchReplication(kFALSE),
102 fNeedsVerticesBranchReplication(kFALSE),
103 fNeedsV0sBranchReplication(kFALSE),
104 fNeedsCascadesBranchReplication(kFALSE),
105 fNeedsTrackletsBranchReplication(kFALSE),
106 fNeedsPMDClustersBranchReplication(kFALSE),
107 fNeedsJetsBranchReplication(kFALSE),
108 fNeedsFMDClustersBranchReplication(kFALSE),
109 fNeedsCaloClustersBranchReplication(kFALSE),
110 fNeedsCaloTriggerBranchReplication(kFALSE),
111 fNeedsMCParticlesBranchReplication(kFALSE),
112 fNeedsDimuonsBranchReplication(kFALSE),
113 fNeedsHMPIDBranchReplication(kFALSE),
114 fAODIsReplicated(kFALSE),
115 fTreeBuffSize(30000000),
125 // Normal constructor.
128 //______________________________________________________________________________
129 AliAODHandler::~AliAODHandler()
135 if (fFileA) fFileA->Close();
143 //______________________________________________________________________________
144 Bool_t AliAODHandler::Init(Option_t* opt)
148 // Create the AODevent object
150 Bool_t createStdAOD = fIsStandard || fFillAOD;
151 if(!fAODEvent && createStdAOD){
152 fAODEvent = new AliAODEvent();
154 fAODEvent->CreateStdContent();
157 // File opening according to execution mode
161 TDirectory *owd = gDirectory;
162 if (option.Contains("proof")) {
164 // Merging via files. Need to access analysis manager via interpreter.
165 gROOT->ProcessLine(Form("AliAnalysisDataContainer *c_common_out = AliAnalysisManager::GetAnalysisManager()->GetCommonOutputContainer();"));
166 gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(c_common_out, \"RECREATE\");"));
170 fFileA = new TFile(fFileName.Data(), "RECREATE");
176 TIter next(fExtensions);
177 AliAODExtension *ext;
178 while ((ext=(AliAODExtension*)next())) ext->Init(option);
181 TIter nextf(fFilters);
182 AliAODExtension *filteredAOD;
183 while ((filteredAOD=(AliAODExtension*)nextf())) {
184 filteredAOD->SetEvent(fAODEvent);
185 filteredAOD->Init(option);
192 //______________________________________________________________________________
193 void AliAODHandler::Print(Option_t* opt) const
195 // Print info about this object
197 cout << opt << Form("IsStandard %d filename=%s",fIsStandard,fFileName.Data()) << endl;
201 cout << opt << fExtensions->GetEntries() << " extensions :" << endl;
202 PrintExtensions(*fExtensions);
206 cout << opt << fFilters->GetEntries() << " filters :" << endl;
207 PrintExtensions(*fFilters);
211 //______________________________________________________________________________
212 void AliAODHandler::PrintExtensions(const TObjArray& array) const
214 // Show the list of aod extensions
216 AliAODExtension* ext(0x0);
217 while ( ( ext = static_cast<AliAODExtension*>(next()) ) )
223 //______________________________________________________________________________
224 void AliAODHandler::StoreMCParticles(){
227 // Remap the labels from ESD stack and store
228 // the AODMCParticles, makes only sense if we have
229 // the mcparticles branch
230 // has to be done here since we cannot know in advance
231 // which particles are needed (e.g. by the tracks etc.)
233 // Particles have been selected by AliMCEventhanlder->SelectParticle()
234 // To use the MCEventhandler here we need to set it from the outside
235 // can vanish when Handler go to the ANALYSISalice library
237 // The Branch booking for mcParticles and mcHeader has to happen
238 // in an external task for now since the AODHandler does not have access
239 // the AnalysisManager. For the same reason the pointer t o the MCEventH
240 // has to passed to the AOD Handler by this task
241 // (doing this in the steering macro would not work on PROOF)
243 if (!fAODEvent) return;
244 TClonesArray *mcarray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
247 AliAODMCHeader *mcHeader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName());
250 // Get the MC Infos.. Handler needs to be set before
251 // while adding the branch
252 // This needs to be done, not to depend on the AnalysisManager
254 if(!fMCEventH)return;
255 if(!fMCEventH->MCEvent())return;
256 AliStack *pStack = fMCEventH->MCEvent()->Stack();
259 fMCEventH->CreateLabelMap();
262 // Get the Event Header
265 AliHeader* header = fMCEventH->MCEvent()->Header();
267 AliGenEventHeader* genHeader = 0;
268 if (header) genHeader = header->GenEventHeader();
271 genHeader->PrimaryVertex(vtxMC);
272 mcHeader->SetVertex(vtxMC[0],vtxMC[1],vtxMC[2]);
273 // we search the MCEventHeaders first
274 // Two cases, cocktail or not...
275 AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
276 if(genCocktailHeader){
277 // we have a coktail header add the name once
278 mcHeader->AddGeneratorName(genHeader->GetName());
279 TList* headerList = genCocktailHeader->GetHeaders();
280 // the first entry defines some extra general settings
281 AliGenEventHeader *headerEntry = dynamic_cast<AliGenEventHeader*>(headerList->At(0));
283 AliFatal("AliGenEventHeader entry not found in the header list");
285 SetMCHeaderInfo(mcHeader,headerEntry);
289 // No Cocktail just take the first one
290 SetMCHeaderInfo(mcHeader,genHeader);
292 // Add all the headers and names, if no cocktail header
293 // there will be only one entry
294 mcHeader->AddCocktailHeaders(genHeader);
301 // Store the AliAODParticlesMC
302 AliMCEvent* mcEvent = fMCEventH->MCEvent();
304 Int_t np = mcEvent->GetNumberOfTracks();
305 Int_t nprim = mcEvent->GetNumberOfPrimaries();
309 TClonesArray& l = *mcarray;
311 for(int i = 0; i < np; ++i){
312 if(fMCEventH->IsParticleSelected(i)){
314 AliMCParticle* mcpart = (AliMCParticle*) mcEvent->GetTrack(i);
315 if(i<nprim)flag |= AliAODMCParticle::kPrimary;
317 if(mcEvent->IsPhysicalPrimary(i))flag |= AliAODMCParticle::kPhysicalPrim;
318 if(mcEvent->IsSecondaryFromWeakDecay(i))flag |= AliAODMCParticle::kSecondaryFromWeakDecay;
319 if(mcEvent->IsSecondaryFromMaterial(i))flag |= AliAODMCParticle::kSecondaryFromMaterial;
321 if(fMCEventH->GetNewLabel(i)!=j){
322 AliError(Form("MISMATCH New label %d j: %d",fMCEventH->GetNewLabel(i),j));
325 AliAODMCParticle mcpartTmp(mcpart,i,flag);
327 mcpartTmp.SetStatus(mcpart->Particle()->GetStatusCode());
328 mcpartTmp.SetMCProcessCode(mcpart->Particle()->GetUniqueID());
330 Int_t d0 = mcpartTmp.GetDaughter(0);
331 Int_t d1 = mcpartTmp.GetDaughter(1);
332 Int_t m = mcpartTmp.GetMother();
334 // other than for the track labels, negative values mean
335 // no daughter/mother so preserve it
338 // no first daughter -> no second daughter
339 // nothing to be done
340 // second condition not needed just for sanity check at the end
341 mcpartTmp.SetDaughter(0,d0);
342 mcpartTmp.SetDaughter(1,d1);
343 } else if(d1 < 0 && d0 >= 0) {
345 // second condition not needed just for sanity check at the end
346 if(fMCEventH->IsParticleSelected(d0)){
347 mcpartTmp.SetDaughter(0,fMCEventH->GetNewLabel(d0));
349 mcpartTmp.SetDaughter(0,-1);
351 mcpartTmp.SetDaughter(1,d1);
353 else if (d0 > 0 && d1 > 0 ){
354 // we have two or more daughters loop on the stack to see if they are
358 for(int id = d0; id<=d1;++id){
359 if(fMCEventH->IsParticleSelected(id)){
362 d0Tmp = fMCEventH->GetNewLabel(id);
363 d1Tmp = d0Tmp; // this is to have the same schema as on the stack i.e. with one daugther d0 and d1 are the same
365 else d1Tmp = fMCEventH->GetNewLabel(id);
368 mcpartTmp.SetDaughter(0,d0Tmp);
369 mcpartTmp.SetDaughter(1,d1Tmp);
371 AliError(Form("Unxpected indices %d %d",d0,d1));
375 mcpartTmp.SetMother(m);
377 if(fMCEventH->IsParticleSelected(m))mcpartTmp.SetMother(fMCEventH->GetNewLabel(m));
378 else AliError(Form("PROBLEM Mother not selected %d \n", m));
381 new (l[j++]) AliAODMCParticle(mcpartTmp);
385 AliInfo(Form("AliAODHandler::StoreMCParticles: Selected %d (Primaries %d / total %d) after validation \n",
388 // Set the labels in the AOD output...
392 TClonesArray* tracks = fAODEvent->GetTracks();
395 for(int it = 0; it < fAODEvent->GetNumberOfTracks();++it){
396 AliAODTrack *track = fAODEvent->GetTrack(it);
399 Int_t label = track->GetLabel();
400 if(label<0){ // preserve the sign for later usage
405 if (label >= AliMCEvent::BgLabelOffset()) label = mcEvent->BgLabelToIndex(label);
406 if(label > np || track->GetLabel() == 0){
407 AliWarning(Form("Wrong ESD track label %5d (%5d)",track->GetLabel(), label));
409 if(fMCEventH->GetNewLabel(label) == 0) {
410 AliWarning(Form("New label not found for %5d (%5d)",track->GetLabel(), label));
412 track->SetLabel(sign*fMCEventH->GetNewLabel(label));
414 track->GetTOFLabel(tofLabel);
416 for (Int_t i = 0; i < 3; i++) {
417 label = tofLabel[i]; // esd label
418 Int_t nlabel = label; // new label
419 if (label < 0) continue;
420 if (label >= AliMCEvent::BgLabelOffset()) nlabel = mcEvent->BgLabelToIndex(label);
421 if(nlabel > np || label == 0) {
422 AliWarning(Form("Wrong TOF label %5d (%5d)", label, nlabel));
424 if(fMCEventH->GetNewLabel(label) == 0){
425 AliWarning(Form("New TOF label not found for %5d %5d",i, label ));
426 tofLabel[i] = -label;
428 tofLabel[i] = fMCEventH->GetNewLabel(label);
431 track->SetTOFLabel(tofLabel);
436 TClonesArray *clusters = fAODEvent->GetCaloClusters();
438 for (Int_t iClust = 0;iClust < fAODEvent->GetNumberOfCaloClusters(); ++iClust) {
439 AliAODCaloCluster * cluster = fAODEvent->GetCaloCluster(iClust);
440 UInt_t nLabel = cluster->GetNLabels();
441 // Ugly but do not want to fragment memory by creating
442 // new Int_t (nLabel)
443 Int_t* labels = const_cast<Int_t*>(cluster->GetLabels());
445 for(UInt_t i = 0;i < nLabel;++i){
446 labels[i] = fMCEventH->GetNewLabel(cluster->GetLabelAt(i));
449 // cluster->SetLabels(labels,nLabel);
453 // AOD calo cells MC label re-index
454 Int_t iCell, nCell, cellMCLabel, cellMCLabelNew;;
456 Double_t cellE, cellT, cellEFrac;
457 AliAODCaloCells *cells;
460 cells = fAODEvent->GetEMCALCells();
462 nCell = cells->GetNumberOfCells() ;
463 for( iCell = 0; iCell < nCell; iCell++ ){
464 cells->GetCell( iCell, cellAbsId, cellE, cellT, cellMCLabel, cellEFrac );
465 // GetNewLabel returns 1 in case when -1 is supplied
466 if( cellMCLabel < 0 )
467 cellMCLabelNew = cellMCLabel;
469 cellMCLabelNew = fMCEventH->GetNewLabel( cellMCLabel );
471 cells->SetCell( iCell, cellAbsId, cellE, cellT, cellMCLabelNew, cellEFrac );
475 cells = fAODEvent->GetPHOSCells();
477 nCell = cells->GetNumberOfCells() ;
478 for( iCell = 0; iCell < nCell; iCell++ ){
479 cells->GetCell( iCell, cellAbsId, cellE, cellT, cellMCLabel, cellEFrac );
480 // GetNewLabel returns 1 in case when -1 is supplied
481 if( cellMCLabel < 0 )
482 cellMCLabelNew = cellMCLabel;
484 cellMCLabelNew = fMCEventH->GetNewLabel( cellMCLabel );
486 cells->SetCell( iCell, cellAbsId, cellE, cellT, cellMCLabelNew, cellEFrac );
491 AliAODTracklets *tracklets = fAODEvent->GetTracklets();
493 for(int it = 0;it < tracklets->GetNumberOfTracklets();++it){
494 int label0 = tracklets->GetLabel(it,0);
495 int label1 = tracklets->GetLabel(it,1);
496 if(label0>=0)label0 = fMCEventH->GetNewLabel(label0);
497 if(label1>=0)label1 = fMCEventH->GetNewLabel(label1);
498 tracklets->SetLabel(it,0,label0);
499 tracklets->SetLabel(it,1,label1);
505 //______________________________________________________________________________
506 Bool_t AliAODHandler::FinishEvent()
508 // Fill data structures
509 if(fFillAOD && fFillAODRun && fAODEvent){
510 fAODEvent->MakeEntriesReferencable();
515 if ((fFillAOD && fFillAODRun) || fFillExtension) {
516 if (fExtensions && fFillExtension) {
517 // fFillExtension can be set by the ESD filter or by a delta filter in case of AOD inputs
518 TIter next(fExtensions);
519 AliAODExtension *ext;
520 while ((ext=(AliAODExtension*)next())) ext->FinishEvent();
522 if (fFilters && fFillAOD && fFillAODRun) {
523 TIter nextf(fFilters);
524 AliAODExtension *ext;
525 while ((ext=(AliAODExtension*)nextf())) {
531 if (fIsStandard && fAODEvent)
533 fAODEvent->ResetStd();
538 TClonesArray *mcarray = static_cast<TClonesArray*>(fAODEvent->FindListObject(AliAODMCParticle::StdBranchName()));
539 if(mcarray) mcarray->Delete();
541 AliAODMCHeader *mcHeader = static_cast<AliAODMCHeader*>(fAODEvent->FindListObject(AliAODMCHeader::StdBranchName()));
542 if(mcHeader) mcHeader->Reset();
545 // Reset AOD replication flag
546 fAODIsReplicated = kFALSE;
550 //______________________________________________________________________________
551 Bool_t AliAODHandler::Terminate()
554 AddAODtoTreeUserInfo();
556 TIter nextF(fFilters);
557 AliAODExtension *ext;
558 while ((ext=static_cast<AliAODExtension*>(nextF())))
560 ext->AddAODtoTreeUserInfo();
563 TIter nextE(fExtensions);
564 while ((ext=static_cast<AliAODExtension*>(nextE())))
566 ext->AddAODtoTreeUserInfo();
572 //______________________________________________________________________________
573 Bool_t AliAODHandler::TerminateIO()
581 // When closing the file, the tree is also deleted.
585 TIter nextF(fFilters);
586 AliAODExtension *ext;
587 while ((ext=static_cast<AliAODExtension*>(nextF())))
592 TIter nextE(fExtensions);
593 while ((ext=static_cast<AliAODExtension*>(nextE())))
601 //______________________________________________________________________________
602 void AliAODHandler::CreateTree(Int_t flag)
604 // Creates the AOD Tree
605 fTreeA = new TTree("aodTree", "AliAOD tree");
606 fTreeA->Branch(fAODEvent->GetList());
607 if (flag == 0) fTreeA->SetDirectory(0);
611 //______________________________________________________________________________
612 void AliAODHandler::FillTree()
616 Long64_t nbf = fTreeA->Fill();
617 if (fTreeBuffSize>0 && fTreeA->GetAutoFlush()<0 && (fMemCountAOD += nbf)>fTreeBuffSize ) { // default limit is still not reached
618 nbf = fTreeA->GetZipBytes();
619 if (nbf>0) nbf = -nbf;
620 else nbf = fTreeA->GetEntries();
621 fTreeA->SetAutoFlush(nbf);
622 AliInfo(Form("Calling fTreeA->SetAutoFlush(%lld) | W:%lld T:%lld Z:%lld",
623 nbf,fMemCountAOD,fTreeA->GetTotBytes(),fTreeA->GetZipBytes()));
628 //______________________________________________________________________________
629 void AliAODHandler::AddAODtoTreeUserInfo()
631 // Add aod event to tree user info
632 if (fTreeA) fTreeA->GetUserInfo()->Add(fAODEvent);
633 // Now the tree owns our fAODEvent...
637 //______________________________________________________________________________
638 void AliAODHandler::AddBranch(const char* cname, void* addobj, const char* filename)
640 // Add a new branch to the aod. Added optional filename parameter if the
641 // branch should be written to a separate file.
643 if (strlen(filename))
645 AliAODExtension *ext = AddExtension(filename);
646 ext->AddBranch(cname, addobj);
650 // Add branch to all filters
651 // Add branch to all filters
653 TIter next(fFilters);
654 AliAODExtension *ext;
655 while ((ext=(AliAODExtension*)next())) ext->AddBranch(cname, addobj);
658 TDirectory *owd = gDirectory;
664 char** apointer = (char**) addobj;
665 TObject* obj = (TObject*) *apointer;
667 fAODEvent->AddObject(obj);
669 const Int_t kSplitlevel = 99; // default value in TTree::Branch()
670 const Int_t kBufsize = 32000; // default value in TTree::Branch()
672 if (!fTreeA->FindBranch(obj->GetName()))
674 // Do the same as if we book via
675 // TTree::Branch(TCollection*)
677 fTreeA->Bronch(obj->GetName(), cname, fAODEvent->GetList()->GetObjectRef(obj),
678 kBufsize, kSplitlevel - 1);
683 //______________________________________________________________________________
684 AliAODExtension *AliAODHandler::AddExtension(const char *filename, const char *title, Bool_t tomerge)
686 // Add an AOD extension with some branches in a different file.
688 TString fname(filename);
689 if (!fname.EndsWith(".root")) fname += ".root";
691 fExtensions = new TObjArray();
692 fExtensions->SetOwner();
694 AliAODExtension *ext = (AliAODExtension*)fExtensions->FindObject(fname);
696 ext = new AliAODExtension(fname, title);
697 fExtensions->Add(ext);
699 ext->SetToMerge(tomerge);
703 //______________________________________________________________________________
704 AliAODExtension *AliAODHandler::GetExtension(const char *filename) const
706 // Getter for AOD extensions via file name.
707 if (!fExtensions) return NULL;
708 return (AliAODExtension*)fExtensions->FindObject(filename);
711 //______________________________________________________________________________
712 AliAODExtension *AliAODHandler::AddFilteredAOD(const char *filename, const char *filtername, Bool_t tomerge)
714 // Add an AOD extension that can write only AOD events that pass a user filter.
716 fFilters = new TObjArray();
717 fFilters->SetOwner();
719 AliAODExtension *filter = (AliAODExtension*)fFilters->FindObject(filename);
721 filter = new AliAODExtension(filename, filtername, kTRUE);
722 fFilters->Add(filter);
724 filter->SetToMerge(tomerge);
728 //______________________________________________________________________________
729 AliAODExtension *AliAODHandler::GetFilteredAOD(const char *filename) const
731 // Getter for AOD filters via file name.
732 if (!fFilters) return NULL;
733 return (AliAODExtension*)fFilters->FindObject(filename);
736 //______________________________________________________________________________
737 void AliAODHandler::SetOutputFileName(const char* fname)
743 //______________________________________________________________________________
744 const char *AliAODHandler::GetOutputFileName() const
747 return fFileName.Data();
750 //______________________________________________________________________________
751 const char *AliAODHandler::GetExtraOutputs(Bool_t merge) const
753 // Get extra outputs as a string separated by commas.
754 static TString eoutputs;
756 AliAODExtension *obj;
758 TIter next1(fExtensions);
759 while ((obj=(AliAODExtension*)next1())) {
760 if (merge && !obj->IsToMerge()) continue;
761 if (!eoutputs.IsNull()) eoutputs += ",";
762 eoutputs += obj->GetName();
766 TIter next2(fFilters);
767 while ((obj=(AliAODExtension*)next2())) {
768 if (merge && !obj->IsToMerge()) continue;
769 if (!eoutputs.IsNull()) eoutputs += ",";
770 eoutputs += obj->GetName();
773 return eoutputs.Data();
776 //______________________________________________________________________________
777 Bool_t AliAODHandler::HasExtensions() const
779 // Whether or not we manage extensions
781 if ( fExtensions && fExtensions->GetEntries()>0 ) return kTRUE;
786 //______________________________________________________________________________
787 void AliAODHandler::SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader *genHeader){
790 // Utility function to cover different cases for the AliGenEventHeader
791 // Needed since different ProcessType and ImpactParamter are not
792 // in the base class...
794 if(!genHeader)return;
795 AliGenPythiaEventHeader *pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
796 if (pythiaGenHeader) {
797 mcHeader->SetEventType(pythiaGenHeader->ProcessType());
798 mcHeader->SetPtHard(pythiaGenHeader->GetPtHard());
802 AliGenDPMjetEventHeader* dpmJetGenHeader = dynamic_cast<AliGenDPMjetEventHeader*>(genHeader);
804 if (dpmJetGenHeader){
805 mcHeader->SetEventType(dpmJetGenHeader->ProcessType());
809 AliGenHijingEventHeader* hijingGenHeader = dynamic_cast<AliGenHijingEventHeader*>(genHeader);
811 mcHeader->SetImpactParameter(hijingGenHeader->ImpactParameter());
815 // AliWarning(Form("MC Eventheader not known: %s",genHeader->GetName()));