X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PWGDQ%2Fdielectron%2FAliAnalysisTaskMultiDielectron.cxx;h=62f3c60e758d0e4918e3c55dd3eadf185f039f4c;hb=e72663d5ea704f30a9a1df4852c98d2cb07d29d7;hp=597b1232d3dbd3631a6738e8f3a76cf935cbd3ef;hpb=a14d0b3eedd3b6f9e394e419df943b5ccb116944;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx b/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx index 597b1232d3d..62f3c60e758 100644 --- a/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx +++ b/PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx @@ -29,11 +29,14 @@ #include #include #include +#include +#include #include "AliDielectron.h" #include "AliDielectronHistos.h" #include "AliDielectronCF.h" #include "AliDielectronMC.h" +#include "AliDielectronMixingHandler.h" #include "AliAnalysisTaskMultiDielectron.h" ClassImp(AliAnalysisTaskMultiDielectron) @@ -41,13 +44,19 @@ ClassImp(AliAnalysisTaskMultiDielectron) //_________________________________________________________________________________ AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron() : AliAnalysisTaskSE(), + fPairArray(0x0), fListDielectron(), fListHistos(), fListCF(), fSelectPhysics(kFALSE), fTriggerMask(AliVEvent::kMB), + fExcludeTriggerMask(0), fTriggerOnV0AND(kFALSE), + fFiredTrigger(""), + fFiredExclude(kFALSE), fRejectPileup(kFALSE), + fBeamEnergy(-1.), + fTriggerLogic(kAny), fTriggerAnalysis(0x0), fEventFilter(0x0), fEventStat(0x0) @@ -60,13 +69,19 @@ AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron() : //_________________________________________________________________________________ AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron(const char *name) : AliAnalysisTaskSE(name), + fPairArray(0x0), fListDielectron(), fListHistos(), fListCF(), fSelectPhysics(kFALSE), fTriggerMask(AliVEvent::kMB), + fExcludeTriggerMask(0), fTriggerOnV0AND(kFALSE), + fFiredTrigger(""), + fFiredExclude(kFALSE), fRejectPileup(kFALSE), + fBeamEnergy(-1.), + fTriggerLogic(kAny), fTriggerAnalysis(0x0), fEventFilter(0x0), fEventStat(0x0) @@ -85,7 +100,24 @@ AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron(const char *name) fListCF.SetOwner(); } +//_________________________________________________________________________________ +AliAnalysisTaskMultiDielectron::~AliAnalysisTaskMultiDielectron() +{ + // + // Destructor + // + //histograms and CF are owned by the dielectron framework. + //however they are streamed to file, so in the first place the + //lists need to be owner... + fListHistos.SetOwner(kFALSE); + fListCF.SetOwner(kFALSE); + + // if(fPairArray) { delete fPairArray; fPairArray=0; } + // try to reduce memory issues + if(fEventStat) { delete fEventStat; fEventStat=0; } + if(fTriggerAnalysis) { delete fTriggerAnalysis; fTriggerAnalysis=0; } +} //_________________________________________________________________________________ void AliAnalysisTaskMultiDielectron::UserCreateOutputObjects() { @@ -95,16 +127,18 @@ void AliAnalysisTaskMultiDielectron::UserCreateOutputObjects() if (!fListHistos.IsEmpty()||!fListCF.IsEmpty()) return; //already initialised - AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); - Bool_t isESD=man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class(); +// AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager(); +// Bool_t isESD=man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class(); // Bool_t isAOD=man->GetInputEventHandler()->IsA()==AliAODInputHandler::Class(); TIter nextDie(&fListDielectron); AliDielectron *die=0; while ( (die=static_cast(nextDie())) ){ die->Init(); - if (die->GetHistogramList()) fListHistos.Add(const_cast(die->GetHistogramList())); - if (die->GetCFManagerPair()) fListCF.Add(const_cast(die->GetCFManagerPair()->GetContainer())); + if (die->GetHistogramList()) fListHistos.Add(const_cast(die->GetHistogramList())); + if (die->GetHistogramArray()) fListHistos.Add(const_cast(die->GetHistogramArray())); + if (die->GetQAHistArray()) fListHistos.Add(const_cast(die->GetQAHistArray())); + if (die->GetCFManagerPair()) fListCF.Add(const_cast(die->GetCFManagerPair()->GetContainer())); } Int_t cuts=fListDielectron.GetEntries(); @@ -119,7 +153,7 @@ void AliAnalysisTaskMultiDielectron::UserCreateOutputObjects() fEventStat->GetXaxis()->SetBinLabel(4,"Bin4 not used"); fEventStat->GetXaxis()->SetBinLabel(5,"Bin5 not used"); - if (fTriggerOnV0AND&&isESD) fEventStat->GetXaxis()->SetBinLabel(3,"V0and triggers"); + if(fTriggerOnV0AND) fEventStat->GetXaxis()->SetBinLabel(3,"V0and triggers"); if (fEventFilter) fEventStat->GetXaxis()->SetBinLabel(4,"After Event Filter"); if (fRejectPileup) fEventStat->GetXaxis()->SetBinLabel(5,"After Pileup rejection"); @@ -154,45 +188,34 @@ void AliAnalysisTaskMultiDielectron::UserExec(Option_t *) AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler()); if (!inputHandler) return; +// AliPIDResponse *pidRes=inputHandler->GetPIDResponse(); if ( inputHandler->GetPIDResponse() ){ + // for the 2.76 pass2 MC private train. Together with a sigma shift of -0.169 +// pidRes->GetTPCResponse().SetSigma(4.637e-3,2.41332105409873257e+04); AliDielectronVarManager::SetPIDResponse( inputHandler->GetPIDResponse() ); } else { - //load esd pid bethe bloch parameters depending on the existance of the MC handler - // yes: MC parameters - // no: data parameters - - //ESD case - if (isESD){ - if (!AliDielectronVarManager::GetESDpid()){ - - if (AliDielectronMC::Instance()->HasMC()) { - AliDielectronVarManager::InitESDpid(); - } else { - AliDielectronVarManager::InitESDpid(1); - } - } - } - //AOD case - if (isAOD){ - if (!AliDielectronVarManager::GetAODpidUtil()){ - if (AliDielectronMC::Instance()->HasMC()) { - AliDielectronVarManager::InitAODpidUtil(); - } else { - AliDielectronVarManager::InitAODpidUtil(1); - } - } - } - } - // Was event selected ? - UInt_t isSelected = AliVEvent::kAny; - if( fSelectPhysics && inputHandler && inputHandler->GetEventSelection() ) { - isSelected = inputHandler->IsEventSelected(); - isSelected&=fTriggerMask; + AliFatal("This task needs the PID response attached to the input event handler!"); } + // Was event selected ? + ULong64_t isSelected = AliVEvent::kAny; + Bool_t isRejected = kFALSE; + if( fSelectPhysics && inputHandler){ + if((isESD && inputHandler->GetEventSelection()) || isAOD){ + isSelected = inputHandler->IsEventSelected(); + if (fExcludeTriggerMask && (isSelected&fExcludeTriggerMask)) isRejected=kTRUE; + if (fTriggerLogic==kAny) isSelected&=fTriggerMask; + else if (fTriggerLogic==kExact) isSelected=((isSelected&fTriggerMask)==fTriggerMask); + + TString firedTriggerClasses=InputEvent()->GetFiredTriggerClasses(); + if(!fFiredTrigger.IsNull()) isSelected=(firedTriggerClasses.Contains(fFiredTrigger))^fFiredExclude; + } + } + + //Before physics selection fEventStat->Fill(kAllEvents); - if (isSelected==0) { + if (isSelected==0||isRejected) { PostData(3,fEventStat); return; } @@ -200,10 +223,36 @@ void AliAnalysisTaskMultiDielectron::UserExec(Option_t *) fEventStat->Fill(kSelectedEvents); //V0and - if (fTriggerOnV0AND&&isESD){ - if (!fTriggerAnalysis->IsOfflineTriggerFired(static_cast(InputEvent()), AliTriggerAnalysis::kV0AND)) return; - } + if(fTriggerOnV0AND){ + if(isESD){if (!fTriggerAnalysis->IsOfflineTriggerFired(static_cast(InputEvent()), AliTriggerAnalysis::kV0AND)) + return;} + if(isAOD){if(!((static_cast(InputEvent()))->GetVZEROData()->GetV0ADecision() == AliVVZERO::kV0BB && + (static_cast(InputEvent()))->GetVZEROData()->GetV0CDecision() == AliVVZERO::kV0BB) ) + return;} + } + + fEventStat->Fill(kV0andEvents); + + //Fill Event histograms before the event filter + TIter nextDie(&fListDielectron); + AliDielectron *die=0; + Bool_t hasMC=AliDielectronMC::Instance()->HasMC(); + while ( (die=static_cast(nextDie())) ){ + AliDielectronHistos *h=die->GetHistoManager(); + if (h){ + AliDielectronVarManager::SetFillMap(h->GetUsedVars()); + if (hasMC && AliDielectronMC::Instance()->ConnectMCEvent() && h->GetHistogramList()->FindObject("MCEvent_noCuts")) { + AliDielectronVarManager::SetEvent(AliDielectronMC::Instance()->GetMCEvent()); + h->FillClass("MCEvent_noCuts",AliDielectronVarManager::kNMaxValues,AliDielectronVarManager::GetData()); + } + if (h->GetHistogramList()->FindObject("Event_noCuts")) { + AliDielectronVarManager::SetEvent(InputEvent()); + h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,AliDielectronVarManager::GetData()); + } + } + } + nextDie.Reset(); //event filter if (fEventFilter) { @@ -222,13 +271,27 @@ void AliAnalysisTaskMultiDielectron::UserExec(Option_t *) AliKFParticle::SetField( bz ); AliDielectronPID::SetCorrVal((Double_t)InputEvent()->GetRunNumber()); + AliDielectronPair::SetBeamEnergy(InputEvent(), fBeamEnergy); //Process event in all AliDielectron instances - TIter nextDie(&fListDielectron); - AliDielectron *die=0; + // TIter nextDie(&fListDielectron); + // AliDielectron *die=0; + Bool_t sel=kFALSE; Int_t idie=0; while ( (die=static_cast(nextDie())) ){ - die->Process(InputEvent()); + if(die->DoEventProcess()) { + sel= die->Process(InputEvent()); + // input for internal train + if(die->DontClearArrays()) { + fPairArray = (*(die->GetPairArraysPointer())); + + } + } + else { + // internal train + if(sel) die->Process(fPairArray); + } + if (die->HasCandidates()){ Int_t ncandidates=die->GetPairArray(1)->GetEntriesFast(); if (ncandidates==1) fEventStat->Fill((kNbinsEvent)+2*idie); @@ -236,7 +299,7 @@ void AliAnalysisTaskMultiDielectron::UserExec(Option_t *) } ++idie; } - + PostData(1, &fListHistos); PostData(2, &fListCF); PostData(3,fEventStat); @@ -249,9 +312,50 @@ void AliAnalysisTaskMultiDielectron::FinishTaskOutput() // Write debug tree // TIter nextDie(&fListDielectron); + Int_t ic=0; AliDielectron *die=0; + AliDielectron *die2=0; + fPairArray=0x0; + + // main loop while ( (die=static_cast(nextDie())) ){ + ic++; + + // debug tree die->SaveDebugTree(); + + // skip internal train tasks in main loop + if(!die->DoEventProcess()) continue; + + // mix remaining + AliDielectronMixingHandler *mix=die->GetMixingHandler(); + if (!mix || !mix->GetMixUncomplete()) continue; + + // loop over all pools + for (Int_t ipool=0; ipoolGetNumberOfBins(); ++ipool){ + // printf("mix remaining %04d/%04d \n",ipool,mix->GetNumberOfBins()); + if(! mix->MixRemaining(die, ipool) ) { fPairArray=0x0; continue; } + + fPairArray = (*(die->GetPairArraysPointer())); + if(!fPairArray) continue; + + // loop over internal train task candidates + for(Int_t i=ic; i(fListDielectron.At(i)); + // abort if tasks following are not internal wagons + if(die2->DoEventProcess()) break; + // fill internal train output + die2->SetPairArraysPointer(fPairArray); + // printf(" --> fill internal train output %s \n",die2->GetName()); + die2->FillHistogramsFromPairArray(kTRUE); + } + // printf("\n\n\n===============\ncall mix in Terminate: %p (%p)\n=================\n\n",mix,die); + + } + } + + PostData(1, &fListHistos); + PostData(2, &fListCF); }