]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliDielectron.cxx
Add event selection depending on high energy clusters existance in EMCal to speed...
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectron.cxx
index 29930501055a614ab54c589d7c1718a583bfbdb6..0f54a71fb7da44b91e4ea58c5b9385f39242875d 100644 (file)
@@ -47,8 +47,6 @@ The names are available via the function PairClassName(Int_t i)
 #include <TMath.h>
 #include <TObject.h>
 
-#include <AliESDEvent.h>
-#include <AliESDtrack.h>
 #include <AliKFParticle.h>
 
 #include <AliEventplane.h>
@@ -105,6 +103,8 @@ AliDielectron::AliDielectron() :
   fPdgLeg2(11),
   fSignalsMC(0x0),
   fNoPairing(kFALSE),
+  fUseKF(kTRUE),
+  fHistoArray(0x0),
   fHistos(0x0),
   fPairCandidates(new TObjArray(11)),
   fCfManagerPair(0x0),
@@ -144,6 +144,8 @@ AliDielectron::AliDielectron(const char* name, const char* title) :
   fPdgLeg2(11),
   fSignalsMC(0x0),
   fNoPairing(kFALSE),
+  fUseKF(kTRUE),
+  fHistoArray(0x0),
   fHistos(0x0),
   fPairCandidates(new TObjArray(11)),
   fCfManagerPair(0x0),
@@ -174,6 +176,7 @@ AliDielectron::~AliDielectron()
   //
   // Default destructor
   //
+  if (fHistoArray) delete fHistoArray;
   if (fHistos) delete fHistos;
   if (fPairCandidates) delete fPairCandidates;
   if (fDebugTree) delete fDebugTree;
@@ -208,6 +211,10 @@ void AliDielectron::Init()
   if(fVZERORecenteringFilename.Contains(".root")) AliDielectronVarManager::SetVZERORecenteringFile(fVZERORecenteringFilename.Data());
   
   if (fMixing) fMixing->Init(this);
+  if (fHistoArray) {
+    fHistoArray->SetSignalsMC(fSignalsMC);
+    fHistoArray->Init();
+  }
 } 
 
 //________________________________________________________________
@@ -265,9 +272,9 @@ void AliDielectron::Process(AliVEvent *ev1, AliVEvent *ev2)
 
   // TPC event plane correction
   AliEventplane *cevplane = new AliEventplane();
-  if (ev1 && fPreFilterEventPlane && ( fEventPlanePreFilter.GetCuts()->GetEntries()>0 || fEventPlanePOIPreFilter.GetCuts()->GetEntries()>0)) 
+  if (ev1 && cevplane && fPreFilterEventPlane && ( fEventPlanePreFilter.GetCuts()->GetEntries()>0 || fEventPlanePOIPreFilter.GetCuts()->GetEntries()>0)) 
     EventPlanePreFilter(0, 1, fTracks[0], fTracks[1], ev1, cevplane);
-  
+
   if (!fNoPairing){
     // create pairs and fill pair candidate arrays
     for (Int_t itrackArr1=0; itrackArr1<4; ++itrackArr1){
@@ -293,8 +300,10 @@ void AliDielectron::Process(AliVEvent *ev1, AliVEvent *ev2)
   }
 
   //in case there is a histogram manager, fill the QA histograms
+  if (fHistos && fSignalsMC) FillMCHistograms(ev1);
   if (fHistos) FillHistograms(ev1);
 
+
   // clear arrays
   if (!fDontClearArrays) ClearArrays();
   AliDielectronVarManager::SetTPCEventPlane(0x0);
@@ -314,9 +323,12 @@ void AliDielectron::ProcessMC(AliVEvent *ev1)
 
   if(!fSignalsMC) return;
   //loop over all MC data and Fill the CF container if it exist
-  if (!fCfManagerPair) return;
-  fCfManagerPair->SetPdgMother(fPdgMother);
-  if(!fCfManagerPair->GetStepForMCtruth()) return;
+  if (!fCfManagerPair && !fHistoArray) return;
+  if(fCfManagerPair) fCfManagerPair->SetPdgMother(fPdgMother);
+
+  Bool_t bFillCF = (fCfManagerPair ? fCfManagerPair->GetStepForMCtruth()  : kFALSE);
+  Bool_t bFillHF = (fHistoArray    ? fHistoArray->GetStepForMCGenerated() : kFALSE);
+  if(!bFillCF && !bFillHF) return;
 
   // signals to be studied
   Int_t nSignals = fSignalsMC->GetEntries();
@@ -381,13 +393,15 @@ void AliDielectron::ProcessMC(AliVEvent *ev1)
     // mix the particles which satisfy only one of the signal branches
     for(Int_t i1=0;i1<indexes1[isig];++i1) {
       for(Int_t i2=0;i2<indexes2[isig];++i2) {
-       fCfManagerPair->FillMC(labels1[isig][i1], labels2[isig][i2], isig);
+       if(bFillCF) fCfManagerPair->FillMC(labels1[isig][i1], labels2[isig][i2], isig);
+       if(bFillHF) fHistoArray->Fill(labels1[isig][i1], labels2[isig][i2], isig);
       }
     }
     // mix the particles which satisfy both branches
     for(Int_t i1=0;i1<indexes12[isig];++i1) {
       for(Int_t i2=0; i2<i1; ++i2) {
-       fCfManagerPair->FillMC(labels12[isig][i1], labels12[isig][i2], isig);
+       if(bFillCF) fCfManagerPair->FillMC(labels12[isig][i1], labels12[isig][i2], isig);
+       if(bFillHF) fHistoArray->Fill(labels12[isig][i1], labels12[isig][i2], isig);
       }
     }
   }    // end loop over signals
@@ -577,13 +591,6 @@ void AliDielectron::FillTrackArrays(AliVEvent * const ev, Int_t eventNr)
   for (Int_t itrack=0; itrack<ntracks; ++itrack){
     //get particle
     AliVParticle *particle=ev->GetTrack(itrack);
-    //TODO: temporary solution, perhaps think about a better implementation
-    //      This is needed to use AliESDpidCuts, which relies on the ESD event
-    //      is set as a AliESDtrack attribute... somehow ugly!
-    if (ev->IsA()==AliESDEvent::Class()){
-      AliESDtrack *track=static_cast<AliESDtrack*>(particle);
-      track->SetESDEvent(static_cast<AliESDEvent*>(ev)); //only in trunk...
-    }
 
     //apply track cuts
     if (fTrackFilter.IsSelected(particle)!=selectedMask) continue;
@@ -702,6 +709,7 @@ void AliDielectron::EventPlanePreFilter(Int_t arr1, Int_t arr2, TObjArray arrTra
   Int_t ntrack1=arrTracks1.GetEntriesFast();
   Int_t ntrack2=arrTracks2.GetEntriesFast();
   AliDielectronPair candidate;
+  candidate.SetKFUsage(fUseKF);
   
   UInt_t selectedMask=(1<<fEventPlanePOIPreFilter.GetCuts()->GetEntries())-1;
   for (Int_t itrack1=0; itrack1<ntrack1; ++itrack1){
@@ -793,7 +801,7 @@ void AliDielectron::PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1,
   Int_t ntrack1=arrTracks1.GetEntriesFast();
   Int_t ntrack2=arrTracks2.GetEntriesFast();
   AliDielectronPair candidate;
-
+  candidate.SetKFUsage(fUseKF);
   // flag arrays for track removal
   Bool_t *bTracks1 = new Bool_t[ntrack1];
   for (Int_t itrack1=0; itrack1<ntrack1; ++itrack1) bTracks1[itrack1]=kFALSE;
@@ -933,6 +941,7 @@ void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2)
   Int_t ntrack2=arrTracks2.GetEntriesFast();
 
   AliDielectronPair *candidate=new AliDielectronPair;
+  candidate->SetKFUsage(fUseKF);
 
   UInt_t selectedMask=(1<<fPairFilter.GetCuts()->GetEntries())-1;
   
@@ -953,6 +962,8 @@ void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2)
       
       //CF manager for the pair
       if (fCfManagerPair) fCfManagerPair->Fill(cutMask,candidate);
+      //histogram array for the pair
+      if (fHistoArray) fHistoArray->Fill(pairIndex,candidate);
 
       //apply cut
       if (cutMask!=selectedMask) continue;
@@ -961,6 +972,7 @@ void AliDielectron::FillPairArrays(Int_t arr1, Int_t arr2)
       PairArray(pairIndex)->Add(candidate);
       //get a new candidate
       candidate=new AliDielectronPair;
+         candidate->SetKFUsage(fUseKF);
     }
   }
   //delete the surplus candidate
@@ -977,6 +989,7 @@ void AliDielectron::FillPairArrayTR()
   
   while ( fTrackRotator->NextCombination() ){
     AliDielectronPair candidate;
+    candidate.SetKFUsage(fUseKF);
     candidate.SetTracks(&fTrackRotator->GetKFTrackP(), &fTrackRotator->GetKFTrackN(),
                         fTrackRotator->GetVTrackP(),fTrackRotator->GetVTrackN());
     candidate.SetType(kEv1PMRot);
@@ -986,6 +999,8 @@ void AliDielectron::FillPairArrayTR()
     
     //CF manager for the pair
     if (fCfManagerPair) fCfManagerPair->Fill(cutMask,&candidate);
+    //histogram array for the pair
+    if (fHistoArray) fHistoArray->Fill((Int_t)kEv1PMRot,&candidate);
     
     //apply cut
     if (cutMask==selectedMask) {
@@ -1032,3 +1047,45 @@ void AliDielectron::AddSignalMC(AliDielectronSignalMC* signal) {
   }
   fSignalsMC->Add(signal);
 }
+//________________________________________________________________
+void AliDielectron::FillMCHistograms(const AliVEvent *ev) {
+  //
+  // fill QA MC histograms for pairs and legs of all added mc signals
+  //
+
+  if (!fSignalsMC) return;
+  TString className,className2;
+  Double_t values[AliDielectronVarManager::kNMaxValues]={0.};
+  AliDielectronVarManager::Fill(ev, values); // get event informations
+  //loop over all added mc signals
+  for(Int_t isig=0; isig<fSignalsMC->GetEntries(); isig++) {
+
+    className.Form("Pair_%s",fSignalsMC->At(isig)->GetName());
+    className2.Form("Track_Legs_%s",fSignalsMC->At(isig)->GetName());
+    Bool_t pairClass=fHistos->GetHistogramList()->FindObject(className.Data())!=0x0;
+    Bool_t legClass=fHistos->GetHistogramList()->FindObject(className2.Data())!=0x0;
+    if(!pairClass && !legClass) return;
+
+    Int_t ntracks=PairArray(AliDielectron::kEv1PM)->GetEntriesFast(); // only SE +-
+    for (Int_t ipair=0; ipair<ntracks; ++ipair){
+      AliDielectronPair *pair=static_cast<AliDielectronPair*>(PairArray(AliDielectron::kEv1PM)->UncheckedAt(ipair));
+
+      Bool_t isMCtruth = AliDielectronMC::Instance()->IsMCTruth(pair, (AliDielectronSignalMC*)fSignalsMC->At(isig));
+      if(isMCtruth) {
+       //fill pair information
+       if (pairClass){
+         AliDielectronVarManager::Fill(pair, values);
+         fHistos->FillClass(className, AliDielectronVarManager::kNMaxValues, values);
+       }
+       //fill leg information, both + and - in the same histo
+       if (legClass){
+         AliDielectronVarManager::Fill(pair->GetFirstDaughter(),values);
+         fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
+         AliDielectronVarManager::Fill(pair->GetSecondDaughter(),values);
+         fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
+       }
+      } //is signal
+    } //loop: pairs
+  } //loop: MCsignals
+
+}