//_________________________________________________________________________________
AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron() :
AliAnalysisTaskSE(),
+ fPairArray(0x0),
fListDielectron(),
fListHistos(),
fListCF(),
fTriggerMask(AliVEvent::kMB),
fExcludeTriggerMask(0),
fTriggerOnV0AND(kFALSE),
+ fFiredTrigger(""),
+ fFiredExclude(kFALSE),
fRejectPileup(kFALSE),
fBeamEnergy(-1.),
fTriggerLogic(kAny),
//_________________________________________________________________________________
AliAnalysisTaskMultiDielectron::AliAnalysisTaskMultiDielectron(const char *name) :
AliAnalysisTaskSE(name),
+ fPairArray(0x0),
fListDielectron(),
fListHistos(),
fListCF(),
fTriggerMask(AliVEvent::kMB),
fExcludeTriggerMask(0),
fTriggerOnV0AND(kFALSE),
+ fFiredTrigger(""),
+ fFiredExclude(kFALSE),
fRejectPileup(kFALSE),
fBeamEnergy(-1.),
fTriggerLogic(kAny),
//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()
AliDielectron *die=0;
while ( (die=static_cast<AliDielectron*>(nextDie())) ){
die->Init();
- if (die->GetHistogramList()) fListHistos.Add(const_cast<THashList*>(die->GetHistogramList()));
- if (die->GetHistogramArray()) fListHistos.Add(const_cast<TObjArray*>(die->GetHistogramArray()));
- if (die->GetCFManagerPair()) fListCF.Add(const_cast<AliCFContainer*>(die->GetCFManagerPair()->GetContainer()));
+ if (die->GetHistogramList()) fListHistos.Add(const_cast<THashList*>(die->GetHistogramList()));
+ if (die->GetHistogramArray()) fListHistos.Add(const_cast<TObjArray*>(die->GetHistogramArray()));
+ if (die->GetQAHistArray()) fListHistos.Add(const_cast<TObjArray*>(die->GetQAHistArray()));
+ if (die->GetCFManagerPair()) fListCF.Add(const_cast<AliCFContainer*>(die->GetCFManagerPair()->GetContainer()));
}
Int_t cuts=fListDielectron.GetEntries();
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;
}
}
//Fill Event histograms before the event filter
TIter nextDie(&fListDielectron);
AliDielectron *die=0;
- Double_t values[AliDielectronVarManager::kNMaxValues]={0};
- Double_t valuesMC[AliDielectronVarManager::kNMaxValues]={0};
- AliDielectronVarManager::SetEvent(InputEvent());
- AliDielectronVarManager::Fill(InputEvent(),values);
- AliDielectronVarManager::Fill(InputEvent(),valuesMC);
Bool_t hasMC=AliDielectronMC::Instance()->HasMC();
- if (hasMC) {
- if (AliDielectronMC::Instance()->ConnectMCEvent())
- AliDielectronVarManager::Fill(AliDielectronMC::Instance()->GetMCEvent(),valuesMC);
- }
-
while ( (die=static_cast<AliDielectron*>(nextDie())) ){
AliDielectronHistos *h=die->GetHistoManager();
if (h){
- if (h->GetHistogramList()->FindObject("Event_noCuts"))
- h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,values);
- if (hasMC && h->GetHistogramList()->FindObject("MCEvent_noCuts"))
- h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,valuesMC);
+ 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();
//Process event in all AliDielectron instances
// TIter nextDie(&fListDielectron);
// AliDielectron *die=0;
+ Bool_t sel=kFALSE;
Int_t idie=0;
while ( (die=static_cast<AliDielectron*>(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);
}
++idie;
}
-
+
PostData(1, &fListHistos);
PostData(2, &fListCF);
PostData(3,fEventStat);
// Write debug tree
//
TIter nextDie(&fListDielectron);
+ Int_t ic=0;
AliDielectron *die=0;
+ AliDielectron *die2=0;
+ fPairArray=0x0;
+
+ // main loop
while ( (die=static_cast<AliDielectron*>(nextDie())) ){
+ ic++;
+
+ // debug tree
die->SaveDebugTree();
+
+ // skip internal train tasks in main loop
+ if(!die->DoEventProcess()) continue;
+
+ // mix remaining
AliDielectronMixingHandler *mix=die->GetMixingHandler();
-// printf("\n\n\n===============\ncall mix in Terminate: %p (%p)\n=================\n\n",mix,die);
- if (mix) mix->MixRemaining(die);
+ if (!mix || !mix->GetMixUncomplete()) continue;
+
+ // loop over all pools
+ for (Int_t ipool=0; ipool<mix->GetNumberOfBins(); ++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.GetEntries(); i++) {
+ die2 = static_cast<AliDielectron*>(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);
}