]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliAnalysisTaskMultiDielectron.cxx
Merge remote-tracking branch 'origin/master' into mergingFlat
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliAnalysisTaskMultiDielectron.cxx
index 597b1232d3dbd3631a6738e8f3a76cf935cbd3ef..62f3c60e758d0e4918e3c55dd3eadf185f039f4c 100644 (file)
 #include <AliAnalysisManager.h>
 #include <AliVEvent.h>
 #include <AliTriggerAnalysis.h>
+#include <AliPIDResponse.h>
+#include <AliTPCPIDResponse.h>
 
 #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<AliDielectron*>(nextDie())) ){
     die->Init();
-    if (die->GetHistogramList()) fListHistos.Add(const_cast<THashList*>(die->GetHistogramList()));
-    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();
@@ -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<AliESDEvent*>(InputEvent()), AliTriggerAnalysis::kV0AND)) return;
-  }
+  if(fTriggerOnV0AND){
+  if(isESD){if (!fTriggerAnalysis->IsOfflineTriggerFired(static_cast<AliESDEvent*>(InputEvent()), AliTriggerAnalysis::kV0AND))
+            return;}
+  if(isAOD){if(!((static_cast<AliAODEvent*>(InputEvent()))->GetVZEROData()->GetV0ADecision() == AliVVZERO::kV0BB &&
+            (static_cast<AliAODEvent*>(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<AliDielectron*>(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<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);
@@ -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<AliDielectron*>(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; 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);
 }