X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliAODHandler.cxx;h=16955922af49d823d31f89b0cb757f691e2af426;hb=e21df713c517d602f8df755137c5a742f33ec698;hp=f1c3e83801fd6343f49b4533f056153ae368e200;hpb=11e4d71631ba0dcb79c5e146cb979874c7c7f72c;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliAODHandler.cxx b/STEER/AliAODHandler.cxx index f1c3e83801f..16955922af4 100644 --- a/STEER/AliAODHandler.cxx +++ b/STEER/AliAODHandler.cxx @@ -61,13 +61,15 @@ AliAODHandler::AliAODHandler() : fNeedsJetsBranchReplication(kFALSE), fNeedsFMDClustersBranchReplication(kFALSE), fNeedsCaloClustersBranchReplication(kFALSE), + fNeedsMCParticlesBranchReplication(kFALSE), fAODIsReplicated(kFALSE), fAODEvent(NULL), fMCEventH(NULL), fTreeA(NULL), fFileA(NULL), fFileName(""), - fExtensions(NULL) + fExtensions(NULL), + fFilters(NULL) { // default constructor } @@ -86,28 +88,33 @@ AliAODHandler::AliAODHandler(const char* name, const char* title): fNeedsJetsBranchReplication(kFALSE), fNeedsFMDClustersBranchReplication(kFALSE), fNeedsCaloClustersBranchReplication(kFALSE), + fNeedsMCParticlesBranchReplication(kFALSE), fAODIsReplicated(kFALSE), fAODEvent(NULL), fMCEventH(NULL), fTreeA(NULL), fFileA(NULL), fFileName(""), - fExtensions(NULL) + fExtensions(NULL), + fFilters(NULL) { +// Normal constructor. } //______________________________________________________________________________ AliAODHandler::~AliAODHandler() { // Destructor. - delete fAODEvent; + if (fAODEvent) delete fAODEvent; if(fFileA){ // is already handled in TerminateIO fFileA->Close(); delete fFileA; + fTreeA = 0; } - delete fTreeA; - if (fExtensions) delete fExtensions; + if (fTreeA) delete fTreeA; + if (fExtensions) {fExtensions->Delete(); delete fExtensions;} + if (fFilters) {fFilters->Delete(); delete fFilters;} } //______________________________________________________________________________ @@ -128,8 +135,8 @@ Bool_t AliAODHandler::Init(Option_t* opt) if (option.Contains("proof")) { // proof // Merging via files. Need to access analysis manager via interpreter. - gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(\"%s\", \"RECREATE\");", fFileName.Data())); - gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->GetCommonOutputContainer()->SetFile((TFile*)0x%lx);", gFile)); + gROOT->ProcessLine(Form("AliAnalysisDataContainer *c_common_out = AliAnalysisManager::GetAnalysisManager()->GetCommonOutputContainer();")); + gROOT->ProcessLine(Form("AliAnalysisManager::GetAnalysisManager()->OpenProofFile(c_common_out, \"RECREATE\");")); fFileA = gFile; } else { // local and grid @@ -142,6 +149,14 @@ Bool_t AliAODHandler::Init(Option_t* opt) AliAODExtension *ext; while ((ext=(AliAODExtension*)next())) ext->Init(option); } + if (fFilters) { + TIter nextf(fFilters); + AliAODExtension *filteredAOD; + while ((filteredAOD=(AliAODExtension*)nextf())) { + filteredAOD->SetEvent(fAODEvent); + filteredAOD->Init(option); + } + } return kTRUE; } @@ -190,31 +205,33 @@ void AliAODHandler::StoreMCParticles(){ // AliHeader* header = fMCEventH->MCEvent()->Header(); - if (!header)return; - - // get the MC vertex - AliGenEventHeader* genHeader = header->GenEventHeader(); - TArrayF vtxMC(3); - genHeader->PrimaryVertex(vtxMC); - mcHeader->SetVertex(vtxMC[0],vtxMC[1],vtxMC[2]); - - // we search the MCEventHeaders first - // Two cases, cocktail or not... - AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast(genHeader); - if(genCocktailHeader){ - // we have a coktail header - mcHeader->AddGeneratorName(genHeader->GetName()); - // Loop from the back so that the first one sets the process type - TList* headerList = genCocktailHeader->GetHeaders(); - for(int i = headerList->GetEntries()-1;i>=0;--i){ - AliGenEventHeader *headerEntry = dynamic_cast(headerList->At(i)); - SetMCHeaderInfo(mcHeader,headerEntry); - } - } - else{ - // No Cocktail just take the first one - SetMCHeaderInfo(mcHeader,genHeader); + // get the MC vertex + AliGenEventHeader* genHeader = 0; + if (header) genHeader = header->GenEventHeader(); + if (genHeader) { + TArrayF vtxMC(3); + genHeader->PrimaryVertex(vtxMC); + mcHeader->SetVertex(vtxMC[0],vtxMC[1],vtxMC[2]); + + // we search the MCEventHeaders first + // Two cases, cocktail or not... + AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast(genHeader); + if(genCocktailHeader){ + // we have a coktail header + mcHeader->AddGeneratorName(genHeader->GetName()); + // Loop from the back so that the first one sets the process type + TList* headerList = genCocktailHeader->GetHeaders(); + for(int i = headerList->GetEntries()-1;i>=0;--i){ + AliGenEventHeader *headerEntry = dynamic_cast(headerList->At(i)); + SetMCHeaderInfo(mcHeader,headerEntry); + } + } + else{ + // No Cocktail just take the first one + SetMCHeaderInfo(mcHeader,genHeader); + } } + @@ -232,7 +249,7 @@ void AliAODHandler::StoreMCParticles(){ for(int i = 0; i < np; ++i){ if(fMCEventH->IsParticleSelected(i)){ Int_t flag = 0; - AliMCParticle* mcpart = mcEvent->GetTrack(i); + AliMCParticle* mcpart = (AliMCParticle*) mcEvent->GetTrack(i); if(iIsPhysicalPrimary(i))flag |= AliAODMCParticle::kPhysicalPrim; @@ -243,6 +260,7 @@ void AliAODHandler::StoreMCParticles(){ AliAODMCParticle mcpart_tmp(mcpart,i,flag); + mcpart_tmp.SetStatus(mcpart->Particle()->GetStatusCode()); // Int_t d0 = mcpart_tmp.GetDaughter(0); Int_t d1 = mcpart_tmp.GetDaughter(1); @@ -294,7 +312,7 @@ void AliAODHandler::StoreMCParticles(){ if(fMCEventH->IsParticleSelected(m))mcpart_tmp.SetMother(fMCEventH->GetNewLabel(m)); else AliError(Form("PROBLEM Mother not selected %d \n", m)); } - + new (l[j++]) AliAODMCParticle(mcpart_tmp); } @@ -311,17 +329,21 @@ void AliAODHandler::StoreMCParticles(){ for(int it = 0; it < fAODEvent->GetNTracks();++it){ AliAODTrack *track = fAODEvent->GetTrack(it); - Int_t label = TMath::Abs(track->GetLabel()); + Int_t sign = 1; + Int_t label = track->GetLabel(); + if(label<0){ // preserve the sign for later usage + label *= -1; + sign = -1; + } + if (label >= AliMCEvent::BgLabelOffset()) label = mcEvent->BgLabelToIndex(label); - - if(label > np || track->GetLabel() == 0){ AliWarning(Form("Wrong ESD track label %5d (%5d)",track->GetLabel(), label)); } if(fMCEventH->GetNewLabel(label) == 0){ AliWarning(Form("New label not found for %5d (%5d)",track->GetLabel(), label)); } - track->SetLabel(fMCEventH->GetNewLabel(label)); + track->SetLabel(sign*fMCEventH->GetNewLabel(label)); } } @@ -364,18 +386,22 @@ Bool_t AliAODHandler::FinishEvent() // Fill data structures if(fFillAOD){ fAODEvent->MakeEntriesReferencable(); - StoreMCParticles(); + // StoreMCParticles(); FillTree(); if (fExtensions) { TIter next(fExtensions); AliAODExtension *ext; - while ((ext=(AliAODExtension*)next())) { - ext->GetAOD()->MakeEntriesReferencable(); - ext->GetTree()->Fill(); + while ((ext=(AliAODExtension*)next())) ext->FinishEvent(); + } + if (fFilters) { + TIter nextf(fFilters); + AliAODExtension *ext; + while ((ext=(AliAODExtension*)nextf())) { +// ext->SetEvent(fAODEvent); + ext->FinishEvent(); } } } - if (fIsStandard) fAODEvent->ResetStd(); // Reset AOD replication flag fAODIsReplicated = kFALSE; @@ -403,12 +429,19 @@ Bool_t AliAODHandler::TerminateIO() fFileA->Close(); delete fFileA; fFileA = 0; + // When closing the file, the tree is also deleted. + fTreeA = 0; } if (fExtensions) { TIter next(fExtensions); AliAODExtension *ext; while ((ext=(AliAODExtension*)next())) ext->TerminateIO(); } + if (fFilters) { + TIter nextf(fFilters); + AliAODExtension *ext; + while ((ext=(AliAODExtension*)nextf())) ext->TerminateIO(); + } return kTRUE; } @@ -433,6 +466,8 @@ void AliAODHandler::AddAODtoTreeUserInfo() { // Add aod event to tree user info fTreeA->GetUserInfo()->Add(fAODEvent); + // Now the tree owns our fAODEvent... + fAODEvent = 0; } //______________________________________________________________________________ @@ -485,6 +520,38 @@ AliAODExtension *AliAODHandler::AddExtension(const char *filename, const char *t } return ext; } + +//______________________________________________________________________________ +AliAODExtension *AliAODHandler::GetExtension(const char *filename) const +{ +// Getter for AOD extensions via file name. + if (!fExtensions) return NULL; + return (AliAODExtension*)fExtensions->FindObject(filename); +} + +//______________________________________________________________________________ +AliAODExtension *AliAODHandler::AddFilteredAOD(const char *filename, const char *filtername) +{ +// Add an AOD extension that can write only AOD events that pass a user filter. + if (!fFilters) { + fFilters = new TObjArray(); + fFilters->SetOwner(); + } + AliAODExtension *filter = (AliAODExtension*)fFilters->FindObject(filename); + if (!filter) { + filter = new AliAODExtension(filename, filtername, kTRUE); + fFilters->Add(filter); + } + return filter; +} + +//______________________________________________________________________________ +AliAODExtension *AliAODHandler::GetFilteredAOD(const char *filename) const +{ +// Getter for AOD filters via file name. + if (!fFilters) return NULL; + return (AliAODExtension*)fFilters->FindObject(filename); +} //______________________________________________________________________________ void AliAODHandler::SetOutputFileName(const char* fname) @@ -515,6 +582,7 @@ void AliAODHandler::SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader AliGenPythiaEventHeader *pythiaGenHeader = dynamic_cast(genHeader); if (pythiaGenHeader) { mcHeader->SetEventType(pythiaGenHeader->ProcessType()); + mcHeader->SetPtHard(pythiaGenHeader->GetPtHard()); return; } @@ -544,23 +612,45 @@ ClassImp(AliAODExtension) // stored. //------------------------------------------------------------------------- +//______________________________________________________________________________ +AliAODExtension::AliAODExtension(const char* name, const char* title, Bool_t isfilter) + :TNamed(name,title), + fAODEvent(0), + fTreeE(0), + fFileE(0), + fNtotal(0), + fNpassed(0), + fSelected(kFALSE) +{ +// Constructor. + if (isfilter) { + TObject::SetBit(kFilteredAOD); + printf("####### Added AOD filter %s\n", name); + } else printf("####### Added AOD extension %s\n", name); +} + //______________________________________________________________________________ AliAODExtension::~AliAODExtension() { // Destructor. - delete fAODEvent; if(fFileE){ // is already handled in TerminateIO fFileE->Close(); delete fFileE; + fTreeE = 0; + fAODEvent = 0; } - delete fTreeE; + if (fTreeE) delete fTreeE; } //______________________________________________________________________________ void AliAODExtension::AddBranch(const char* cname, void* addobj) { // Add a new branch to the aod + if (IsFilteredAOD()) { + Error("AddBranch", "Not allowed to add branched to filtered AOD's."); + return; + } if (!fAODEvent) { char type[20]; gROOT->ProcessLine(Form("TString s_tmp; AliAnalysisManager::GetAnalysisManager()->GetAnalysisTypeString(s_tmp); sprintf((char*)0x%lx, \"%%s\", s_tmp.Data());", type)); @@ -589,6 +679,24 @@ void AliAODExtension::AddBranch(const char* cname, void* addobj) owd->cd(); } +//______________________________________________________________________________ +Bool_t AliAODExtension::FinishEvent() +{ +// Fill current event. + fNtotal++; + if (!IsFilteredAOD()) { + fAODEvent->MakeEntriesReferencable(); + fTreeE->Fill(); + return kTRUE; + } + // Filtered AOD. Fill only if event is selected. + if (!fSelected) return kTRUE; + fNpassed++; + fTreeE->Fill(); + fSelected = kFALSE; // so that next event will not be selected unless demanded + return kTRUE; +} + //______________________________________________________________________________ Bool_t AliAODExtension::Init(Option_t *option) { @@ -611,15 +719,36 @@ Bool_t AliAODExtension::Init(Option_t *option) return kTRUE; } +//______________________________________________________________________________ +void AliAODExtension::SetEvent(AliAODEvent *event) +{ +// Connects to an external event + if (!IsFilteredAOD()) { + Error("SetEvent", "Not allowed to set external event for filtered AOD's"); + return; + } + // Use the copy constructor or assignment operator to synchronize with external event. +// AliAODEvent &other = *event; +// if (!fAODEvent) fAODEvent = new AliAODEvent(other); +// else if (fSelected) *fAODEvent = other; + fAODEvent = event; +} + //______________________________________________________________________________ Bool_t AliAODExtension::TerminateIO() { // Terminate IO + if (TObject::TestBit(kFilteredAOD)) + printf("AOD Filter %s: events processed: %d passed: %d\n", GetName(), fNtotal, fNpassed); + else + printf("AOD extension %s: events processed: %d\n", GetName(), fNtotal); if (fFileE) { fFileE->Write(); fFileE->Close(); delete fFileE; fFileE = 0; + fTreeE = 0; + fAODEvent = 0; } return kTRUE; }