]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Update
authorrbailhac <rbailhac@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 May 2012 19:31:25 +0000 (19:31 +0000)
committerrbailhac <rbailhac@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 May 2012 19:31:25 +0000 (19:31 +0000)
PWGHF/hfe/AliAnalysisTaskHFE.cxx
PWGHF/hfe/AliAnalysisTaskHFEFlow.cxx
PWGHF/hfe/AliAnalysisTaskHFEFlow.h
PWGHF/hfe/AliHFEdebugTreeTask.cxx
PWGHF/hfe/AliHFEextraCuts.cxx
PWGHF/hfe/AliHFEspectrum.cxx
PWGHF/hfe/AliHFEspectrum.h
PWGHF/hfe/AliHFEtools.cxx
PWGHF/hfe/AliHFEtools.h
PWGHF/hfe/macros/AddTaskHFEtpctofv2.C
PWGHF/hfe/macros/configs/PbPb/ConfigHFE_FLOW_TOFTPC.C

index f090f419baecf4cb269424c3604e1f4ab35b05fd..c391ab4f1a323f854259166ee985fa56b0c8a3bf 100644 (file)
@@ -852,8 +852,7 @@ void AliAnalysisTaskHFE::ProcessESD(){
   memset(container, 0, sizeof(Double_t) * 10);
   // container for the output THnSparse
   Double_t dataE[6]; // [pT, eta, Phi, type, 'C' or 'B']
-  Double_t dataDca[8]; // [source, pT, dca, dcaSig, centrality]
-  Double_t eDca[6]; // [source, pT, dca, dcaSig, centrality]
+  Double_t dataDca[6]; // [source, pT, dca, centrality]
   Int_t nElectronCandidates = 0;
   AliESDtrack *track = NULL, *htrack = NULL;
   AliMCParticle *mctrack = NULL;
@@ -1020,28 +1019,23 @@ void AliAnalysisTaskHFE::ProcessESD(){
         }
       }
 
-      // check if it is the proton from the lambda decay, and yes fill the dca info
-      Double_t hfeimpactR4p=0., hfeimpactnsigmaR4p=0.;
+      Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;
+      Int_t sourceDca =-1;
       if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 211)){
         if(track->Pt()>4.){
-          fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4p, hfeimpactnsigmaR4p);
-          fQACollection->Fill("pionDcaSig",track->Pt(),hfeimpactnsigmaR4p);
-        }
-      }
-      else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 2212)){
-        fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4p, hfeimpactnsigmaR4p);
-        fQACollection->Fill("protonDcaSig",track->Pt(),hfeimpactnsigmaR4p);
-        Int_t glabel=TMath::Abs(mctrack->GetMother());
-        if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-          if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==3122){
-            fQACollection->Fill("secondaryprotonDcaSig",track->Pt(),hfeimpactnsigmaR4p);
-          }
+          fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
+          dataDca[0]=0; //pion
+          dataDca[1]=track->Pt();
+          dataDca[2]=hfeimpactR4all;
+          dataDca[3]=fCentralityF;
+          dataDca[4] = v0pid;
+          dataDca[5] = double(track->Charge());
+          fQACollection->Fill("Dca", dataDca);
         }
       }
       else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){ // to increas statistics for Martin
         if(signal){
-          fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4p, hfeimpactnsigmaR4p);
-          Int_t sourceDca =-1;
+          fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
           if(fSignalCuts->IsCharmElectron(track)){
             sourceDca=1;
           }
@@ -1057,22 +1051,16 @@ void AliAnalysisTaskHFE::ProcessESD(){
           else if(fSignalCuts->IsJpsiElectron(track)){
             sourceDca=5;
           }
-          else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
-            sourceDca=6;
-            fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
-            fQACollection->Fill("hadronsBeforeIPcutMC",mctrack->Pt());
-          }
           else {
-            sourceDca=7;
+            sourceDca=6;
           }
-          eDca[0]=sourceDca;
-          eDca[1]=track->Pt();
-          eDca[2]=hfeimpactR4p;
-          eDca[3]=hfeimpactnsigmaR4p;
-          eDca[4]=fCentralityF;
-          eDca[5] = track->Charge()/3;
-
-          fQACollection->Fill("eDca", eDca);
+          dataDca[0]=sourceDca;
+          dataDca[1]=track->Pt();
+          dataDca[2]=hfeimpactR4all;
+          dataDca[3]=fCentralityF;
+          dataDca[4] = v0pid;
+          dataDca[5] = double(track->Charge());
+          if(signal) fQACollection->Fill("Dca", dataDca);
         }
       }
     }
@@ -1209,41 +1197,16 @@ void AliAnalysisTaskHFE::ProcessESD(){
       }
     } // end of electron background analysis
 
-
-    Int_t sourceDca =-1;
     if (GetPlugin(kDEstep)) { 
       Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.,};
       Int_t elecSource = 0;
-      // minjung for IP QA(temporary ~ 2weeks)
       Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;
       fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
-      sourceDca=0;
       if(HasMCData())
       {
-       if(fSignalCuts->IsCharmElectron(track)){
-         sourceDca=1;
-        }
-       else if(fSignalCuts->IsBeautyElectron(track)){
-         sourceDca=2;
-        }
-       else if(fSignalCuts->IsGammaElectron(track)){
-         sourceDca=3;
-        }
-       else if(fSignalCuts->IsNonHFElectron(track)){
-         sourceDca=4;
-        }
-        else if(fSignalCuts->IsJpsiElectron(track)){
-          sourceDca=5;
-        }
-       else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
-         sourceDca=6;
-          fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
-          fQACollection->Fill("hadronsBeforeIPcutMC",mctrack->Pt());
-        }
-       else {
-         sourceDca=7;
-       }
-
+        if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
+            fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
+        } 
         if(fMCQA && signal) {
           
           fMCQA->SetContainerStep(0);
@@ -1288,24 +1251,13 @@ void AliAnalysisTaskHFE::ProcessESD(){
         }
       } // end of MC
 
-      dataDca[0]=sourceDca;
+      dataDca[0]=-1; //for data, don't know the origin
       dataDca[1]=track->Pt();
       dataDca[2]=hfeimpactR;
-      dataDca[3]=hfeimpactnsigmaR;
-      dataDca[4]=fCentralityF;
-      dataDca[5] = 49;
-      Double_t xr[3]={49,49,49};
-      if(HasMCData()) {
-        mctrack->XvYvZv(xr);
-        dataDca[5] = TMath::Sqrt(xr[0]*xr[0]+xr[1]*xr[1]);
-      } 
-      dataDca[6] = v0pid;
-      dataDca[7] = track->Charge()/3;
-
- //     printf("Entries dca: [%.3f|%.3f|%.3f|%f|%f]\n", dataDca[0],dataDca[1],dataDca[2],dataDca[3],dataDca[4]);
+      dataDca[3]=fCentralityF;
+      dataDca[4] = v0pid;
+      dataDca[5] = double(track->Charge());
       if (!HasMCData()) fQACollection->Fill("Dca", dataDca);
-      else if(signal) fQACollection->Fill("Dca", dataDca);
-
 
       // Fill Containers for impact parameter analysis
       if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
@@ -1355,7 +1307,6 @@ void AliAnalysisTaskHFE::ProcessESD(){
       if(HasMCData()){
         if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
           fQACollection->Fill("hadronsAfterIPcut",track->Pt());
-          fQACollection->Fill("hadronsAfterIPcutMC",mctrack->Pt());
         }
       }
     }
@@ -1407,7 +1358,27 @@ void AliAnalysisTaskHFE::ProcessAOD(){
   //printf("pass\n");
 
   fContainer->NewEvent();
+
+  // Look for kink mother
+  Int_t numberofvertices = fAOD->GetNumberOfVertices();
+  Double_t listofmotherkink[numberofvertices];
+  Int_t numberofmotherkink = 0;
+  for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {
+    AliAODVertex *aodvertex = fAOD->GetVertex(ivertex);
+    if(!aodvertex) continue;
+    if(aodvertex->GetType()==AliAODVertex::kKink) {
+      AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();
+      if(!mother) continue;
+      Int_t idmother = mother->GetID();
+      listofmotherkink[numberofmotherkink] = idmother;
+      //printf("ID %d\n",idmother);
+      numberofmotherkink++;
+    }
+  }
+  //printf("Number of kink mother in the events %d\n",numberofmotherkink);
+
+
+    // Loop over tracks
   AliAODTrack *track = NULL;
   AliAODMCParticle *mctrack = NULL;
   Double_t dataE[6]; // [pT, eta, Phi, Charge, type, 'C' or 'B']
@@ -1443,6 +1414,16 @@ void AliAnalysisTaskHFE::ProcessAOD(){
     if(fApplyCutAOD) {
       // RecKine: ITSTPC cuts  
       if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
+
+      // Reject kink mother
+      Bool_t kinkmotherpass = kTRUE;
+      for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {
+       if(track->GetID() == listofmotherkink[kinkmother]) {
+         kinkmotherpass = kFALSE;
+         continue;
+       }
+      }
+      if(!kinkmotherpass) continue;
       
       // RecPrim
       if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
@@ -1790,53 +1771,32 @@ void AliAnalysisTaskHFE::InitContaminationQA(){
 
       fQACollection->CreateTH1Farray("hadronsBeforeIPcut", "Hadrons before IP cut", nBinPt, kPtRange);
       fQACollection->CreateTH1Farray("hadronsAfterIPcut", "Hadrons after IP cut", nBinPt, kPtRange);
-      fQACollection->CreateTH1Farray("hadronsBeforeIPcutMC", "Hadrons before IP cut; MC p_{t}", nBinPt, kPtRange);
-      fQACollection->CreateTH1Farray("hadronsAfterIPcutMC", "Hadrons after IP cut; MC p_{t} ", nBinPt, kPtRange);
 
       fQACollection->CreateTH2Farray("Ke3Kecorr", "Ke3 decay e and K correlation; Ke3K p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
       fQACollection->CreateTH2Farray("Ke3K0Lecorr", "Ke3 decay e and K0L correlation; Ke3K0L p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
       fQACollection->CreateTH1Farray("Kptspectra", "Charged Kaons: MC p_{t} ", nBinPt, kPtRange);
       fQACollection->CreateTH1Farray("K0Lptspectra", "K0L: MC p_{t} ", nBinPt, kPtRange);
 
-      const Double_t kDCAbound[2] = {-5., 5.};
-      const Double_t kDCAsigbound[2] = {-50., 50.};
+      const Double_t kDCAbound[2] = {-0.2, 0.2};
 
-      const Int_t nDimDca=8;
-      const Int_t nBinDca[nDimDca] = { 9, nBinPt, 2000, 2000, 12, 500, 6, 2};
-      const Int_t nDimeDca=6;
-      const Int_t nBineDca[nDimeDca] = { 9, nBinPt, 2000, 2000, 12, 2};
-      Double_t minimaDca[nDimDca]  = { -1., 0., kDCAbound[0], kDCAsigbound[0], -1., 0, -1, -1.1};
-      Double_t maximaDca[nDimDca]  = { 8., 20., kDCAbound[1], kDCAsigbound[1], 11., 50, 5, 1.1};
+      const Int_t nDimDca=6;
+      const Int_t nBinDca[nDimDca] = { 8, nBinPt, 800, 12,  6, 2};
+      Double_t minimaDca[nDimDca]  = { -1., 0., kDCAbound[0], -1., -1, -1.1};
+      Double_t maximaDca[nDimDca]  = { 7., 20., kDCAbound[1], 11.,  5, 1.1};
 
       Double_t *sourceBins = AliHFEtools::MakeLinearBinning(nBinDca[0], minimaDca[0], maximaDca[0]);
       Double_t *dcaBins = AliHFEtools::MakeLinearBinning(nBinDca[2], minimaDca[2], maximaDca[2]);
-      Double_t *dcaSigBins = AliHFEtools::MakeLinearBinning(nBinDca[3], minimaDca[3], maximaDca[3]);
-      Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBinDca[4], minimaDca[4], maximaDca[4]);
-      Double_t *eProdRBins = AliHFEtools::MakeLinearBinning(nBinDca[5], minimaDca[5], maximaDca[5]);
-      Double_t *v0PIDBins = AliHFEtools::MakeLinearBinning(nBinDca[6], minimaDca[6], maximaDca[6]);
-      Double_t *chargeBins = AliHFEtools::MakeLinearBinning(nBinDca[7], minimaDca[7], maximaDca[7]);
+      Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBinDca[3], minimaDca[3], maximaDca[3]);
+      Double_t *v0PIDBins = AliHFEtools::MakeLinearBinning(nBinDca[4], minimaDca[4], maximaDca[4]);
+      Double_t *chargeBins = AliHFEtools::MakeLinearBinning(nBinDca[5], minimaDca[5], maximaDca[5]);
 
-      fQACollection->CreateTHnSparseNoLimits("Dca", "Dca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; dcasig; centrality bin; eProdR; v0pid; charge", nDimDca, nBinDca);
+      fQACollection->CreateTHnSparseNoLimits("Dca", "Dca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; centrality bin; v0pid; charge", nDimDca, nBinDca);
       ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(0, sourceBins);
       ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(1, kPtRange);
       ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(2, dcaBins);
-      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(3, dcaSigBins);
-      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(4, centralityBins);
-      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(5, eProdRBins);
-      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(6, v0PIDBins);
-      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(7, chargeBins);
-
-      fQACollection->CreateTHnSparseNoLimits("eDca", "eDca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; dcasig; centrality bin; charge", nDimeDca, nBineDca);
-      ((THnSparse*)(fQACollection->Get("eDca")))->SetBinEdges(0, sourceBins);
-      ((THnSparse*)(fQACollection->Get("eDca")))->SetBinEdges(1, kPtRange);
-      ((THnSparse*)(fQACollection->Get("eDca")))->SetBinEdges(2, dcaBins);
-      ((THnSparse*)(fQACollection->Get("eDca")))->SetBinEdges(3, dcaSigBins);
-      ((THnSparse*)(fQACollection->Get("eDca")))->SetBinEdges(4, centralityBins);
-      ((THnSparse*)(fQACollection->Get("eDca")))->SetBinEdges(5, chargeBins);
-
-      fQACollection->CreateTH2Farray("secondaryprotonDcaSig", "secondary proton dca significance: dca sig ", nBinPt, kPtRange, 2000, kDCAsigbound[0], kDCAsigbound[1]);
-      fQACollection->CreateTH2Farray("protonDcaSig", "proton dca significance: dca sig ", nBinPt, kPtRange, 2000, kDCAsigbound[0], kDCAsigbound[1]);
-      fQACollection->CreateTH2Farray("pionDcaSig", "pion dca significance: dca sig ", nBinPt, kPtRange, 2000, kDCAsigbound[0], kDCAsigbound[1]);
+      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(3, centralityBins);
+      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(4, v0PIDBins);
+      ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(5, chargeBins);
 
       break;
     }  
index 6fa4512e501e8d6ba00b6662d3553f53c750df74..566c3a9219b8e3fbdeef75b0c81f13c9d1362fe6 100644 (file)
@@ -28,6 +28,8 @@
 #include "TRandom3.h"\r
 #include "TProfile.h"\r
 #include "TProfile2D.h"\r
+#include "TLorentzVector.h"\r
+#include "TParticle.h"\r
 \r
 #include "AliVEventHandler.h"\r
 #include "AliAnalysisTaskSE.h"\r
 #include "AliESDVZERO.h"\r
 #include "AliESDUtils.h"\r
 #include "AliMCParticle.h"\r
+#include "AliAODMCParticle.h"\r
+#include "AliAODEvent.h"\r
+#include "AliAODVertex.h"\r
+#include "AliAODTrack.h"\r
 #include "AliVTrack.h"\r
+#include "AliESDtrack.h"\r
+#include "AliESDtrackCuts.h"\r
 #include "AliAODTrack.h"\r
+#include "AliStack.h"\r
+#include "AliMCEvent.h"\r
 \r
 #include "AliFlowCandidateTrack.h"\r
 #include "AliFlowEvent.h"\r
 #include "AliFlowTrackCuts.h"\r
 #include "AliFlowVector.h"\r
 #include "AliFlowCommonConstants.h"\r
+#include "AliKFParticle.h"\r
 \r
 #include "AliHFEcuts.h"\r
 #include "AliHFEpid.h"\r
@@ -91,13 +102,25 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow() :
   fUseMCReactionPlane(kFALSE),\r
   fMCPID(kFALSE),\r
   fNoPID(kFALSE),\r
+  fChi2OverNDFCut(999),\r
+  fMaxdca(3.0),\r
+  fMaxopeningtheta(0.02),\r
+  fMaxopeningphi(0.1),\r
+  fMaxopening3D(0.1),\r
+  fMaxInvmass(0.1),\r
   fDebugLevel(0),\r
   fcutsRP(0),\r
   fcutsPOI(0),\r
   fHFECuts(0),\r
   fPID(0),\r
   fPIDqa(0),\r
-  fflowEvent(0x0),\r
+  fflowEvent(NULL),\r
+  fHFEBackgroundCuts(0),\r
+  fPIDBackground(0),\r
+  fPIDBackgroundqa(0),\r
+  fAlgorithmMA(kTRUE),\r
+  fArraytrack(NULL),\r
+  fCounterPoolBackground(0),\r
   fHFEVZEROEventPlane(0x0),\r
   fHistEV(0),\r
   fEventPlane(0x0),\r
@@ -116,9 +139,23 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow() :
   fCosRes(0x0),\r
   fSinRes(0x0),\r
   fProfileCosRes(0x0),\r
+  fTrackingCuts(0x0),\r
+  fDeltaPhiMapsBeforePID(0x0),\r
+  fCosPhiMapsBeforePID(0x0),\r
   fDeltaPhiMaps(0x0),\r
   fCosPhiMaps(0x0),\r
-  fProfileCosPhiMaps(0x0)\r
+  fProfileCosPhiMaps(0x0),\r
+  fDeltaPhiMapsTaggedPhotonic(0x0),\r
+  fCosPhiMapsTaggedPhotonic(0x0),\r
+  fDeltaPhiMapsTaggedNonPhotonic(0x0),\r
+  fCosPhiMapsTaggedNonPhotonic(0x0),\r
+  fDeltaPhiMapsTaggedPhotonicLS(0x0),\r
+  fCosPhiMapsTaggedPhotonicLS(0x0),\r
+  fMCSourceDeltaPhiMaps(0x0),\r
+  fOppSignDeltaPhiMaps(0x0),\r
+  fSameSignDeltaPhiMaps(0x0),\r
+  fOppSignAngle(0x0),\r
+  fSameSignAngle(0x0)\r
 {\r
   // Constructor\r
 \r
@@ -156,13 +193,25 @@ AliAnalysisTaskHFEFlow:: AliAnalysisTaskHFEFlow(const char *name) :
   fUseMCReactionPlane(kFALSE),\r
   fMCPID(kFALSE),\r
   fNoPID(kFALSE),\r
+  fChi2OverNDFCut(999),\r
+  fMaxdca(3.0),\r
+  fMaxopeningtheta(0.02),\r
+  fMaxopeningphi(0.1),\r
+  fMaxopening3D(0.1),\r
+  fMaxInvmass(0.1),\r
   fDebugLevel(0),\r
   fcutsRP(0),\r
   fcutsPOI(0),\r
   fHFECuts(0),\r
   fPID(0),\r
   fPIDqa(0),\r
-  fflowEvent(0x0),\r
+  fflowEvent(NULL),\r
+  fHFEBackgroundCuts(0),\r
+  fPIDBackground(0),\r
+  fPIDBackgroundqa(0),\r
+  fAlgorithmMA(kTRUE),  \r
+  fArraytrack(NULL),\r
+  fCounterPoolBackground(0),\r
   fHFEVZEROEventPlane(0x0),\r
   fHistEV(0),\r
   fEventPlane(0x0),\r
@@ -181,9 +230,23 @@ AliAnalysisTaskHFEFlow:: AliAnalysisTaskHFEFlow(const char *name) :
   fCosRes(0x0),\r
   fSinRes(0x0),\r
   fProfileCosRes(0x0),\r
+  fTrackingCuts(0x0),\r
+  fDeltaPhiMapsBeforePID(0x0),\r
+  fCosPhiMapsBeforePID(0x0),\r
   fDeltaPhiMaps(0x0),\r
   fCosPhiMaps(0x0),\r
-  fProfileCosPhiMaps(0x0)\r
+  fProfileCosPhiMaps(0x0),\r
+  fDeltaPhiMapsTaggedPhotonic(0x0),\r
+  fCosPhiMapsTaggedPhotonic(0x0),\r
+  fDeltaPhiMapsTaggedNonPhotonic(0x0),\r
+  fCosPhiMapsTaggedNonPhotonic(0x0),\r
+  fDeltaPhiMapsTaggedPhotonicLS(0x0),\r
+  fCosPhiMapsTaggedPhotonicLS(0x0),\r
+  fMCSourceDeltaPhiMaps(0x0),\r
+  fOppSignDeltaPhiMaps(0x0),\r
+  fSameSignDeltaPhiMaps(0x0),\r
+  fOppSignAngle(0x0),\r
+  fSameSignAngle(0x0)\r
 {\r
   //\r
   // named ctor\r
@@ -201,6 +264,9 @@ AliAnalysisTaskHFEFlow:: AliAnalysisTaskHFEFlow(const char *name) :
   fPID = new AliHFEpid("hfePid");\r
   fPIDqa = new AliHFEpidQAmanager;\r
 \r
+  fPIDBackground = new AliHFEpid("hfePidBackground");\r
+  fPIDBackgroundqa = new AliHFEpidQAmanager;\r
+\r
   DefineInput(0,TChain::Class());\r
   DefineOutput(1, TList::Class());\r
   for(Int_t bincless = 0; bincless < fNbBinsCentralityQCumulant; bincless++) {\r
@@ -237,13 +303,25 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow(const AliAnalysisTaskHFEFlow &ref
   fUseMCReactionPlane(ref.fUseMCReactionPlane),\r
   fMCPID(ref.fMCPID),\r
   fNoPID(ref.fNoPID),\r
+  fChi2OverNDFCut(ref.fChi2OverNDFCut),\r
+  fMaxdca(ref.fMaxdca),\r
+  fMaxopeningtheta(ref.fMaxopeningtheta),\r
+  fMaxopeningphi(ref.fMaxopeningphi),\r
+  fMaxopening3D(ref.fMaxopening3D),\r
+  fMaxInvmass(ref.fMaxInvmass),\r
   fDebugLevel(ref.fDebugLevel),\r
   fcutsRP(0),\r
   fcutsPOI(0),\r
   fHFECuts(0),\r
   fPID(0),\r
   fPIDqa(0),\r
-  fflowEvent(0x0),\r
+  fflowEvent(NULL),\r
+  fHFEBackgroundCuts(0),\r
+  fPIDBackground(0),\r
+  fPIDBackgroundqa(0),\r
+  fAlgorithmMA(kTRUE),\r
+  fArraytrack(NULL),\r
+  fCounterPoolBackground(0),\r
   fHFEVZEROEventPlane(0x0),\r
   fHistEV(0),\r
   fEventPlane(0x0),\r
@@ -262,9 +340,23 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow(const AliAnalysisTaskHFEFlow &ref
   fCosRes(0x0),\r
   fSinRes(0x0),\r
   fProfileCosRes(0x0),\r
+  fTrackingCuts(0x0),\r
+  fDeltaPhiMapsBeforePID(0x0),\r
+  fCosPhiMapsBeforePID(0x0),\r
   fDeltaPhiMaps(0x0),\r
   fCosPhiMaps(0x0),\r
-  fProfileCosPhiMaps(0x0)\r
+  fProfileCosPhiMaps(0x0),\r
+  fDeltaPhiMapsTaggedPhotonic(0x0),\r
+  fCosPhiMapsTaggedPhotonic(0x0),\r
+  fDeltaPhiMapsTaggedNonPhotonic(0x0),\r
+  fCosPhiMapsTaggedNonPhotonic(0x0),\r
+  fDeltaPhiMapsTaggedPhotonicLS(0x0),\r
+  fCosPhiMapsTaggedPhotonicLS(0x0),\r
+  fMCSourceDeltaPhiMaps(0x0),\r
+  fOppSignDeltaPhiMaps(0x0),\r
+  fSameSignDeltaPhiMaps(0x0),\r
+  fOppSignAngle(0x0),\r
+  fSameSignAngle(0x0)\r
 {\r
   //\r
   // Copy Constructor\r
@@ -313,6 +405,14 @@ void AliAnalysisTaskHFEFlow::Copy(TObject &o) const {
   target.fUseMCReactionPlane = fUseMCReactionPlane;\r
   target.fMCPID = fMCPID;\r
   target.fNoPID = fNoPID;\r
+  target.fChi2OverNDFCut = fChi2OverNDFCut;\r
+  target.fMaxdca = fMaxdca;\r
+  target.fMaxopeningtheta = fMaxopeningtheta;\r
+  target.fMaxopeningphi = fMaxopeningphi;\r
+  target.fMaxopening3D = fMaxopening3D;\r
+  target.fMaxInvmass = fMaxInvmass;\r
+  target.fAlgorithmMA = fAlgorithmMA;\r
+  target.fCounterPoolBackground = fCounterPoolBackground;\r
   target.fDebugLevel = fDebugLevel;\r
   target.fcutsRP = fcutsRP;\r
   target.fcutsPOI = fcutsPOI;\r
@@ -327,6 +427,7 @@ AliAnalysisTaskHFEFlow::~AliAnalysisTaskHFEFlow(){
   //\r
   // Destructor\r
   //\r
+  if(fArraytrack) delete fArraytrack;\r
   if(fListHist) delete fListHist;\r
   if(fcutsRP) delete fcutsRP;\r
   if(fcutsPOI) delete fcutsPOI;\r
@@ -334,27 +435,11 @@ AliAnalysisTaskHFEFlow::~AliAnalysisTaskHFEFlow(){
   if(fPID) delete fPID;\r
   if(fPIDqa) delete fPIDqa;\r
   if(fflowEvent) delete fflowEvent;\r
-  if(fHFEVZEROEventPlane) delete fHFEVZEROEventPlane;\r
-  if(fHistEV) delete fHistEV;\r
-  if(fEventPlane) delete fEventPlane;\r
-  if(fEventPlaneaftersubtraction) delete fEventPlaneaftersubtraction;\r
-  if(fCosSin2phiep) delete fCosSin2phiep;\r
-  if(fCos2phie) delete fCos2phie;\r
-  if(fSin2phie) delete fSin2phie;\r
-  if(fCos2phiep) delete fCos2phiep;\r
-  if(fSin2phiep) delete fSin2phiep;\r
-  if(fSin2phiephiep) delete fSin2phiephiep;\r
-  if(fCosResabc) delete fCosResabc;\r
-  if(fSinResabc) delete fSinResabc;\r
-  if(fProfileCosResab) delete fProfileCosResab;\r
-  if(fProfileCosResac) delete fProfileCosResac;\r
-  if(fProfileCosResbc) delete fProfileCosResbc;\r
-  if(fCosRes) delete fCosRes;\r
-  if(fSinRes) delete fSinRes;\r
-  if(fProfileCosRes) delete fProfileCosRes;\r
-  if(fDeltaPhiMaps) delete fDeltaPhiMaps;\r
-  if(fCosPhiMaps) delete fCosPhiMaps;\r
-  if(fProfileCosPhiMaps) delete fProfileCosPhiMaps;\r
+  if(fHFEBackgroundCuts) delete fHFEBackgroundCuts;\r
+  if(fPIDBackground) delete fPIDBackground;\r
+  if(fPIDBackgroundqa) delete fPIDBackgroundqa;\r
+  //if(fHFEVZEROEventPlane) delete fHFEVZEROEventPlane;\r
\r
 \r
 }\r
 //________________________________________________________________________\r
@@ -437,7 +522,30 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   fPID->InitializePID();\r
   fPIDqa->Initialize(fPID);\r
   fPID->SortDetectors();\r
+\r
+  // HFE Background cuts\r
+\r
+  if(!fHFEBackgroundCuts){\r
+     fHFEBackgroundCuts = new AliESDtrackCuts();\r
+     fHFEBackgroundCuts->SetName("nackgroundcuts");\r
+     //Configure Default Track Cuts\r
+     fHFEBackgroundCuts->SetAcceptKinkDaughters(kFALSE);\r
+     fHFEBackgroundCuts->SetRequireTPCRefit(kTRUE);\r
+     fHFEBackgroundCuts->SetEtaRange(-0.9,0.9);\r
+     fHFEBackgroundCuts->SetRequireSigmaToVertex(kTRUE);\r
+     fHFEBackgroundCuts->SetMaxChi2PerClusterTPC(4.0);\r
+     fHFEBackgroundCuts->SetMinNClustersTPC(50);\r
+     fHFEBackgroundCuts->SetPtRange(0.3,1e10);\r
+  }\r
   \r
+  // PID background HFE\r
+  if(!fPIDBackground->GetNumberOfPIDdetectors()) fPIDBackground->AddDetector("TPC", 0);\r
+  fPIDBackground->InitializePID();\r
+  fPIDBackgroundqa->Initialize(fPIDBackground);\r
+  fPIDBackground->SortDetectors();\r
+  \r
+\r
+\r
   //**************************\r
   // Bins for the THnSparse\r
   //**************************\r
@@ -462,6 +570,12 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   Double_t binLimEta[nBinsEta+1];\r
   for(Int_t i=0; i<=nBinsEta; i++) binLimEta[i]=(Double_t)minEta + (maxEta-minEta)/nBinsEta*(Double_t)i ;\r
 \r
+  Int_t nBinsStep = 6;\r
+  Double_t minStep = 0.;\r
+  Double_t maxStep = 6.;\r
+  Double_t binLimStep[nBinsStep+1];\r
+  for(Int_t i=0; i<=nBinsStep; i++) binLimStep[i]=(Double_t)minStep + (maxStep-minStep)/nBinsStep*(Double_t)i ;\r
+\r
   Int_t nBinsEtaLess = 2;\r
   Double_t binLimEtaLess[nBinsEtaLess+1];\r
   for(Int_t i=0; i<=nBinsEtaLess; i++) binLimEtaLess[i]=(Double_t)minEta + (maxEta-minEta)/nBinsEtaLess*(Double_t)i ;\r
@@ -484,7 +598,7 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   Double_t binLimCMore[nBinsCMore+1];\r
   for(Int_t i=0; i<=nBinsCMore; i++) binLimCMore[i]=(Double_t)minCMore + (maxCMore-minCMore)/nBinsCMore*(Double_t)i ;\r
 \r
-  Int_t nBinsPhi = 25;\r
+  Int_t nBinsPhi = 12;\r
   Double_t minPhi = 0.0;\r
   Double_t maxPhi = TMath::Pi();\r
   Double_t binLimPhi[nBinsPhi+1];\r
@@ -493,17 +607,39 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
     //printf("bin phi is %f for %d\n",binLimPhi[i],i);\r
   }\r
 \r
+  Int_t nBinsAngle = 40;\r
+  Double_t minAngle = 0.0;\r
+  Double_t maxAngle = 1.0;\r
+  Double_t binLimAngle[nBinsAngle+1];\r
+  for(Int_t i=0; i<=nBinsAngle; i++) {\r
+    binLimAngle[i]=(Double_t)minAngle + (maxAngle-minAngle)/nBinsAngle*(Double_t)i ;\r
+    //printf("bin phi is %f for %d\n",binLimPhi[i],i);\r
+  }\r
+\r
   Int_t nBinsCharge = 2;\r
   Double_t minCharge = -1.0;\r
   Double_t maxCharge = 1.0;\r
   Double_t binLimCharge[nBinsCharge+1];\r
   for(Int_t i=0; i<=nBinsCharge; i++) binLimCharge[i]=(Double_t)minCharge + (maxCharge-minCharge)/nBinsCharge*(Double_t)i ;\r
+\r
+  Int_t nBinsSource = 8;\r
+  Double_t minSource = 0.;\r
+  Double_t maxSource = 8.;\r
+  Double_t binLimSource[nBinsSource+1];\r
+  for(Int_t i=0; i<=nBinsSource; i++) binLimSource[i]=(Double_t)minSource + (maxSource-minSource)/nBinsSource*(Double_t)i ;\r
+\r
+  Int_t nBinsInvMass = 50;\r
+  Double_t minInvMass = 0.;\r
+  Double_t maxInvMass = 0.3;\r
+  Double_t binLimInvMass[nBinsInvMass+1];\r
+  for(Int_t i=0; i<=nBinsInvMass; i++) binLimInvMass[i]=(Double_t)minInvMass + (maxInvMass-minInvMass)/nBinsInvMass*(Double_t)i ;\r
   \r
   //******************\r
   // Histograms\r
   //******************\r
     \r
   fListHist = new TList();\r
+  fListHist->SetOwner();\r
 \r
   // Histos\r
   fHistEV = new TH2D("fHistEV", "events", 3, 0, 3, 3, 0,3);\r
@@ -615,6 +751,14 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   // Profile cosres centrality\r
   fProfileCosRes = new TProfile("ProfileCosRes","ProfileCosRes",nBinsCMore,binLimCMore);\r
   fProfileCosRes->Sumw2();\r
+\r
+  // Debugging tracking steps\r
+  const Int_t nDimTrStep=2;\r
+  Int_t nBinTrStep[nDimTrStep] = {nBinsPt,nBinsStep};\r
+  fTrackingCuts = new THnSparseF("TrackingCuts","TrackingCuts",nDimTrStep,nBinTrStep);\r
+  fTrackingCuts->SetBinEdges(0,binLimPt);\r
+  fTrackingCuts->SetBinEdges(1,binLimStep);\r
+  fTrackingCuts->Sumw2();\r
   \r
   // Maps delta phi\r
   const Int_t nDimg=5;\r
@@ -627,6 +771,34 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   fDeltaPhiMaps->SetBinEdges(4,binLimEtaLess);\r
   fDeltaPhiMaps->Sumw2();  \r
 \r
+  const Int_t nDimgb=3;\r
+  Int_t nBingb[nDimgb] = {nBinsPhi,nBinsC,nBinsPt};\r
+\r
+  fDeltaPhiMapsBeforePID = new THnSparseF("DeltaPhiMapsBeforePID","DeltaPhiMapsBeforePID",nDimgb,nBingb);\r
+  fDeltaPhiMapsBeforePID->SetBinEdges(0,binLimPhi);\r
+  fDeltaPhiMapsBeforePID->SetBinEdges(1,binLimC);\r
+  fDeltaPhiMapsBeforePID->SetBinEdges(2,binLimPt);\r
+  fDeltaPhiMapsBeforePID->Sumw2();  \r
+\r
\r
+  fDeltaPhiMapsTaggedPhotonic = new THnSparseF("DeltaPhiMapsTaggedPhotonic","DeltaPhiMapsTaggedPhotonic",nDimgb,nBingb);\r
+  fDeltaPhiMapsTaggedPhotonic->SetBinEdges(0,binLimPhi);\r
+  fDeltaPhiMapsTaggedPhotonic->SetBinEdges(1,binLimC);\r
+  fDeltaPhiMapsTaggedPhotonic->SetBinEdges(2,binLimPt);\r
+  fDeltaPhiMapsTaggedPhotonic->Sumw2();  \r
+\r
+  fDeltaPhiMapsTaggedNonPhotonic = new THnSparseF("DeltaPhiMapsTaggedNonPhotonic","DeltaPhiMapsTaggedNonPhotonic",nDimgb,nBingb);\r
+  fDeltaPhiMapsTaggedNonPhotonic->SetBinEdges(0,binLimPhi);\r
+  fDeltaPhiMapsTaggedNonPhotonic->SetBinEdges(1,binLimC);\r
+  fDeltaPhiMapsTaggedNonPhotonic->SetBinEdges(2,binLimPt);\r
+  fDeltaPhiMapsTaggedNonPhotonic->Sumw2();  \r
+\r
+  fDeltaPhiMapsTaggedPhotonicLS = new THnSparseF("DeltaPhiMapsTaggedPhotonicLS","DeltaPhiMapsTaggedPhotonicLS",nDimgb,nBingb);\r
+  fDeltaPhiMapsTaggedPhotonicLS->SetBinEdges(0,binLimPhi);\r
+  fDeltaPhiMapsTaggedPhotonicLS->SetBinEdges(1,binLimC);\r
+  fDeltaPhiMapsTaggedPhotonicLS->SetBinEdges(2,binLimPt);\r
+  fDeltaPhiMapsTaggedPhotonicLS->Sumw2();  \r
+\r
   // Maps cos phi\r
   const Int_t nDimh=5;\r
   Int_t nBinh[nDimh] = {nBinsCos,nBinsC,nBinsPt,nBinsCharge,nBinsEtaLess};\r
@@ -638,10 +810,86 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   fCosPhiMaps->SetBinEdges(4,binLimEtaLess);\r
   fCosPhiMaps->Sumw2();\r
 \r
+  const Int_t nDimhb=3;\r
+  Int_t nBinhb[nDimhb] = {nBinsCos,nBinsC,nBinsPt};\r
+\r
+  fCosPhiMapsBeforePID = new THnSparseF("CosPhiMapsBeforePID","CosPhiMapsBeforePID",nDimhb,nBinhb);\r
+  fCosPhiMapsBeforePID->SetBinEdges(0,binLimCos);\r
+  fCosPhiMapsBeforePID->SetBinEdges(1,binLimC);\r
+  fCosPhiMapsBeforePID->SetBinEdges(2,binLimPt);\r
+  fCosPhiMapsBeforePID->Sumw2();\r
+\r
+  fCosPhiMapsTaggedPhotonic = new THnSparseF("CosPhiMapsTaggedPhotonic","CosPhiMapsTaggedPhotonic",nDimhb,nBinhb);\r
+  fCosPhiMapsTaggedPhotonic->SetBinEdges(0,binLimCos);\r
+  fCosPhiMapsTaggedPhotonic->SetBinEdges(1,binLimC);\r
+  fCosPhiMapsTaggedPhotonic->SetBinEdges(2,binLimPt);\r
+  fCosPhiMapsTaggedPhotonic->Sumw2();\r
+\r
+  fCosPhiMapsTaggedNonPhotonic = new THnSparseF("CosPhiMapsTaggedNonPhotonic","CosPhiMapsTaggedNonPhotonic",nDimhb,nBinhb);\r
+  fCosPhiMapsTaggedNonPhotonic->SetBinEdges(0,binLimCos);\r
+  fCosPhiMapsTaggedNonPhotonic->SetBinEdges(1,binLimC);\r
+  fCosPhiMapsTaggedNonPhotonic->SetBinEdges(2,binLimPt);\r
+  fCosPhiMapsTaggedNonPhotonic->Sumw2();\r
+  \r
+  fCosPhiMapsTaggedPhotonicLS = new THnSparseF("CosPhiMapsTaggedPhotonicLS","CosPhiMapsTaggedPhotonicLS",nDimhb,nBinhb);\r
+  fCosPhiMapsTaggedPhotonicLS->SetBinEdges(0,binLimCos);\r
+  fCosPhiMapsTaggedPhotonicLS->SetBinEdges(1,binLimC);\r
+  fCosPhiMapsTaggedPhotonicLS->SetBinEdges(2,binLimPt);\r
+  fCosPhiMapsTaggedPhotonicLS->Sumw2();\r
+\r
   // Profile Maps cos phi\r
   fProfileCosPhiMaps = new TProfile2D("ProfileCosPhiMaps","ProfileCosPhiMaps",nBinsC,binLimC,nBinsPt,binLimPt);\r
   fProfileCosPhiMaps->Sumw2();\r
 \r
+  // Background study\r
+  const Int_t nDimMCSource=3;\r
+  Int_t nBinMCSource[nDimMCSource] = {nBinsC,nBinsPt,nBinsSource};\r
+  fMCSourceDeltaPhiMaps = new THnSparseF("MCSourceDeltaPhiMaps","MCSourceDeltaPhiMaps",nDimMCSource,nBinMCSource);\r
+  fMCSourceDeltaPhiMaps->SetBinEdges(0,binLimC);\r
+  fMCSourceDeltaPhiMaps->SetBinEdges(1,binLimPt);\r
+  fMCSourceDeltaPhiMaps->SetBinEdges(2,binLimSource);\r
+  fMCSourceDeltaPhiMaps->Sumw2();\r
+\r
+  // Maps invmass opposite\r
+  const Int_t nDimOppSign=5;\r
+  Int_t nBinOppSign[nDimOppSign] = {nBinsPhi,nBinsC,nBinsPt,nBinsInvMass,nBinsSource};\r
+  fOppSignDeltaPhiMaps = new THnSparseF("OppSignDeltaPhiMaps","OppSignDeltaPhiMaps",nDimOppSign,nBinOppSign);\r
+  fOppSignDeltaPhiMaps->SetBinEdges(0,binLimPhi);\r
+  fOppSignDeltaPhiMaps->SetBinEdges(1,binLimC);\r
+  fOppSignDeltaPhiMaps->SetBinEdges(2,binLimPt);\r
+  fOppSignDeltaPhiMaps->SetBinEdges(3,binLimInvMass);\r
+  fOppSignDeltaPhiMaps->SetBinEdges(4,binLimSource);\r
+  fOppSignDeltaPhiMaps->Sumw2();\r
+\r
+  // Maps invmass same sign\r
+  const Int_t nDimSameSign=5;\r
+  Int_t nBinSameSign[nDimSameSign] = {nBinsPhi,nBinsC,nBinsPt,nBinsInvMass,nBinsSource};\r
+  fSameSignDeltaPhiMaps = new THnSparseF("SameSignDeltaPhiMaps","SameSignDeltaPhiMaps",nDimSameSign,nBinSameSign);\r
+  fSameSignDeltaPhiMaps->SetBinEdges(0,binLimPhi);\r
+  fSameSignDeltaPhiMaps->SetBinEdges(1,binLimC);\r
+  fSameSignDeltaPhiMaps->SetBinEdges(2,binLimPt);\r
+  fSameSignDeltaPhiMaps->SetBinEdges(3,binLimInvMass);\r
+  fSameSignDeltaPhiMaps->SetBinEdges(4,binLimSource);\r
+  fSameSignDeltaPhiMaps->Sumw2();\r
+\r
+  // Maps angle same sign\r
+  const Int_t nDimAngleSameSign=3;\r
+  Int_t nBinAngleSameSign[nDimAngleSameSign] = {nBinsAngle,nBinsC,nBinsSource};\r
+  fSameSignAngle = new THnSparseF("SameSignAngleMaps","SameSignAngleMaps",nDimAngleSameSign,nBinAngleSameSign);\r
+  fSameSignAngle->SetBinEdges(0,binLimAngle);\r
+  fSameSignAngle->SetBinEdges(1,binLimC);\r
+  fSameSignAngle->SetBinEdges(2,binLimSource);\r
+  fSameSignAngle->Sumw2();\r
+\r
+  // Maps angle opp sign\r
+  const Int_t nDimAngleOppSign=3;\r
+  Int_t nBinAngleOppSign[nDimAngleOppSign] = {nBinsAngle,nBinsC,nBinsSource};\r
+  fOppSignAngle = new THnSparseF("OppSignAngleMaps","OppSignAngleMaps",nDimAngleOppSign,nBinAngleOppSign);\r
+  fOppSignAngle->SetBinEdges(0,binLimAngle);\r
+  fOppSignAngle->SetBinEdges(1,binLimC);\r
+  fOppSignAngle->SetBinEdges(2,binLimSource);\r
+  fOppSignAngle->Sumw2();\r
+\r
 \r
   //**************************\r
   // Add to the list\r
@@ -649,6 +897,7 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
 \r
   //fListHist->Add(qaCutsRP);\r
   fListHist->Add(fPIDqa->MakeList("HFEpidQA"));\r
+  fListHist->Add(fPIDBackgroundqa->MakeList("HFEpidBackgroundQA"));\r
   fListHist->Add(fHistEV);\r
   fListHist->Add(fProfileCosRes);\r
   fListHist->Add(fProfileCosResab);\r
@@ -666,9 +915,24 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   fListHist->Add(fCosResabc);\r
   fListHist->Add(fSinRes);\r
   fListHist->Add(fSinResabc);\r
+  fListHist->Add(fTrackingCuts);\r
+  fListHist->Add(fDeltaPhiMapsBeforePID);\r
+  fListHist->Add(fCosPhiMapsBeforePID);\r
   fListHist->Add(fDeltaPhiMaps);\r
   fListHist->Add(fCosPhiMaps);\r
   fListHist->Add(fProfileCosPhiMaps);\r
+  fListHist->Add(fDeltaPhiMapsTaggedPhotonic);\r
+  fListHist->Add(fCosPhiMapsTaggedPhotonic);\r
+  fListHist->Add(fDeltaPhiMapsTaggedNonPhotonic);\r
+  fListHist->Add(fCosPhiMapsTaggedNonPhotonic);\r
+  fListHist->Add(fDeltaPhiMapsTaggedPhotonicLS);\r
+  fListHist->Add(fCosPhiMapsTaggedPhotonicLS);\r
+  fListHist->Add(fMCSourceDeltaPhiMaps);\r
+  fListHist->Add(fOppSignDeltaPhiMaps);\r
+  fListHist->Add(fSameSignDeltaPhiMaps);\r
+  fListHist->Add(fSameSignAngle);\r
+  fListHist->Add(fOppSignAngle);\r
+\r
 \r
   if(fHFEVZEROEventPlane && (fDebugLevel > 2)) fListHist->Add(fHFEVZEROEventPlane->GetOutputList());\r
   \r
@@ -706,10 +970,12 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
   Double_t valuensparseg[5];\r
   Double_t valuensparseh[5];\r
   Double_t valuensparsehprofile[3];\r
-\r
+  Double_t valuensparseMCSourceDeltaPhiMaps[3];\r
+  Double_t valuetrackingcuts[2];\r
+   \r
   AliMCEvent *mcEvent = MCEvent();\r
   AliMCParticle *mctrack = NULL;\r
-  \r
+    \r
   /////////////////\r
   // centrality\r
   /////////////////\r
@@ -774,7 +1040,8 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
   valuensparseh[1] = binct; \r
   valuensparsehprofile[1] = binct; \r
   valuecossinephiep[2] = binctMore;\r
-\r
+  valuensparseMCSourceDeltaPhiMaps[0] = binct;\r
\r
   //////////////////////\r
   // run number\r
   //////////////////////\r
@@ -787,6 +1054,11 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     fPID->InitializePID(runnumber);\r
   }\r
 \r
+  if(!fPIDBackground->IsInitialized()){\r
+    // Initialize PID with the given run number\r
+    fPIDBackground->InitializePID(runnumber);\r
+  }\r
+\r
 \r
   //////////\r
   // PID\r
@@ -798,6 +1070,7 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     return;\r
   }\r
   fPID->SetPIDResponse(pidResponse);\r
+  fPIDBackground->SetPIDResponse(pidResponse);\r
 \r
   fHistEV->Fill(binctt,0.0);\r
  \r
@@ -988,14 +1261,14 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     fEventPlane->Fill(&valuensparsea[0]);\r
 \r
     // Fill\r
-    if(fDebugLevel > 3) fCosSin2phiep->Fill(&valuecossinephiep[0]);\r
+    if(fDebugLevel > 5) fCosSin2phiep->Fill(&valuecossinephiep[0]);\r
     \r
     if(!fVZEROEventPlane) {\r
       valuensparsef[0] = diffsub1sub2a;\r
       fCosRes->Fill(&valuensparsef[0]);\r
       valuensparsefsin[0] = diffsub1sub2asin;\r
-      fSinRes->Fill(&valuensparsefsin[0]);\r
-      if(fDebugLevel > 1) {\r
+      if(fDebugLevel > 5) fSinRes->Fill(&valuensparsefsin[0]);\r
+      if(fDebugLevel > 5) {\r
        fProfileCosRes->Fill(valuensparsef[1],valuensparsef[0]);\r
       }\r
     }\r
@@ -1007,8 +1280,8 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
       valuensparsefbissin[0] = diffsubasubbsin;\r
       valuensparsefbissin[1] = diffsubbsubcsin;\r
       valuensparsefbissin[2] = diffsubasubcsin;\r
-      fSinResabc->Fill(&valuensparsefbissin[0]);\r
-      if(fDebugLevel > 1) {\r
+      if(fDebugLevel > 5) fSinResabc->Fill(&valuensparsefbissin[0]);\r
+      if(fDebugLevel > 5) {\r
        fProfileCosResab->Fill(valuensparsefbis[3],valuensparsefbis[0]);\r
        fProfileCosResac->Fill(valuensparsefbis[3],valuensparsefbis[1]);\r
        fProfileCosResbc->Fill(valuensparsefbis[3],valuensparsefbis[2]);\r
@@ -1017,97 +1290,178 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     \r
   }\r
   \r
-  //////////////////////////\r
-  // Loop over ESD track\r
-  //////////////////////////\r
\r
-\r
+  ////////////////////////////////////////\r
+  // Loop to determine pool background\r
+  /////////////////////////////////////////\r
+  if(  fArraytrack ){ \r
+     fArraytrack->~TArrayI();\r
+     new(fArraytrack) TArrayI(nbtracks);\r
+  }\r
+  else {  \r
+    fArraytrack = new TArrayI(nbtracks);\r
+  }\r
+  fCounterPoolBackground = 0;\r
   for(Int_t k = 0; k < nbtracks; k++){\r
     \r
     AliVTrack *track = (AliVTrack *) fInputEvent->GetTrack(k);\r
     if(!track) continue;\r
+    \r
+    // Track cuts\r
+    Bool_t survivedbackground = kTRUE;\r
+    if(fAODAnalysis) {\r
+      AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);\r
+      if(aodtrack) {\r
+       AliESDtrack esdTrack(aodtrack);\r
+       // set the TPC cluster info\r
+       esdTrack.SetTPCClusterMap(aodtrack->GetTPCClusterMap());\r
+       esdTrack.SetTPCSharedMap(aodtrack->GetTPCSharedMap());\r
+       esdTrack.SetTPCPointsF(aodtrack->GetTPCNclsF());\r
+       // needed to calculate the impact parameters\r
+       AliAODEvent *aodeventu = dynamic_cast<AliAODEvent *>(fInputEvent);\r
+       if(aodeventu) {\r
+         AliAODVertex *vAOD = aodeventu->GetPrimaryVertex();\r
+         Double_t pos[3],cov[6];\r
+         vAOD->GetXYZ(pos);\r
+         vAOD->GetCovarianceMatrix(cov);\r
+         const AliESDVertex vESD(pos,cov,100.,100);\r
+         esdTrack.RelateToVertex(&vESD,0.,3.);\r
+       } \r
+       if(!fHFEBackgroundCuts->IsSelected(&esdTrack)) {\r
+         survivedbackground = kFALSE;\r
+       }\r
+      }\r
+    }\r
+    else {\r
+      AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);\r
+      if(esdtrack) {\r
+       if(!fHFEBackgroundCuts->IsSelected(esdtrack)) survivedbackground = kFALSE;\r
+      }\r
+    }\r
+    // PID\r
+    if(survivedbackground) {\r
+      // PID track cuts\r
+      AliHFEpidObject hfetrack2;\r
+      if(!fAODAnalysis) hfetrack2.SetAnalysisType(AliHFEpidObject::kESDanalysis);\r
+      else hfetrack2.SetAnalysisType(AliHFEpidObject::kAODanalysis);\r
+      hfetrack2.SetRecTrack(track);\r
+      hfetrack2.SetCentrality((Int_t)binct);\r
+      //printf("centrality %f and %d\n",binct,hfetrack.GetCentrality());\r
+      hfetrack2.SetPbPb();\r
+      if(fPIDBackground->IsSelected(&hfetrack2,0x0,"recTrackCont",fPIDBackgroundqa)) {\r
+       fArraytrack->AddAt(k,fCounterPoolBackground);\r
+       fCounterPoolBackground++;\r
+       //printf("fCounterPoolBackground %d, track %d\n",fCounterPoolBackground,k);\r
+      }\r
+    }\r
+  }\r
 \r
+  // Look at kink mother in case of AOD\r
+  Int_t numberofvertices = 1;\r
+  AliAODEvent *aodevent = NULL;\r
+  Int_t numberofmotherkink = 0;  \r
+  if(fAODAnalysis) {\r
+    aodevent = dynamic_cast<AliAODEvent *>(fInputEvent);\r
+    if(aodevent) {\r
+      numberofvertices = aodevent->GetNumberOfVertices();\r
+    }\r
+  }\r
+  Double_t listofmotherkink[numberofvertices];\r
+  if(fAODAnalysis && aodevent) {\r
+    for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {\r
+      AliAODVertex *aodvertex = aodevent->GetVertex(ivertex);\r
+      if(!aodvertex) continue;\r
+      if(aodvertex->GetType()==AliAODVertex::kKink) {\r
+       AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();\r
+       if(!mother) continue;\r
+       Int_t idmother = mother->GetID();\r
+       listofmotherkink[numberofmotherkink] = idmother;\r
+       //printf("ID %d\n",idmother);\r
+       numberofmotherkink++;\r
+      }\r
+    }\r
+  }\r
+  \r
+  //////////////////////////\r
+  // Loop over track\r
+  //////////////////////////\r
+  \r
+  for(Int_t k = 0; k < nbtracks; k++){\r
+      \r
+    AliVTrack *track = (AliVTrack *) fInputEvent->GetTrack(k);\r
+    if(!track) continue;\r
+    \r
     if(fAODAnalysis) {\r
       AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);\r
       if(!aodtrack){\r
        AliError("AOD track is not there");\r
-       return;\r
+       continue;\r
       }  \r
       //printf("Find AOD track on\n");\r
       if(fUseFlagAOD){\r
        if(aodtrack->GetFlags() != fFlags) continue;  // Only process AOD tracks where the HFE is set\r
-       //printf("Check flag on\n");\r
       }\r
     }\r
     \r
     if(fApplyCut) {\r
-      //printf("Apply cut\n");\r
-      Bool_t survived = kTRUE;\r
-      for(Int_t icut = AliHFEcuts::kStepRecKineITSTPC; icut <= AliHFEcuts::kStepHFEcutsTRD; icut++){\r
-       if(!fHFECuts->CheckParticleCuts(icut + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)){\r
-         survived = kFALSE;\r
-         //printf("Cut %d\n",icut);\r
-         break;\r
-       }\r
-       //printf("Pass the cut %d\n",icut);\r
-      }\r
-      if(!survived) continue;\r
-    }\r
 \r
-    //printf("Survived\n");\r
-\r
-    // Apply PID\r
-    if(!fNoPID) {\r
-      // Apply PID for Data\r
-      if(!fMCPID) {\r
-       AliHFEpidObject hfetrack;\r
-       if(!fAODAnalysis) hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);\r
-       else hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);\r
-       hfetrack.SetRecTrack(track);\r
-       hfetrack.SetCentrality((Int_t)binct);\r
-       //printf("centrality %f and %d\n",binct,hfetrack.GetCentrality());\r
-       hfetrack.SetPbPb();\r
-       if(!fPID->IsSelected(&hfetrack,0x0,"recTrackCont",fPIDqa)) {\r
-         continue;\r
+      valuetrackingcuts[0] = track->Pt(); \r
+      valuetrackingcuts[1] = 0;\r
+\r
+      // RecKine: ITSTPC cuts  \r
+      if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;\r
+      if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);\r
+      \r
+      // Reject kink mother\r
+      if(fAODAnalysis) {\r
+       Bool_t kinkmotherpass = kTRUE;\r
+       for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {\r
+         if(track->GetID() == listofmotherkink[kinkmother]) {\r
+           kinkmotherpass = kFALSE;\r
+           continue;\r
+         }\r
        }\r
+       if(!kinkmotherpass) continue;\r
       }\r
       else {\r
-       if(!mcEvent) continue;\r
-       if(!(mctrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(track->GetLabel()))))) continue;\r
-       //printf("PdgCode %d\n",TMath::Abs(mctrack->Particle()->GetPdgCode()));\r
-       if(TMath::Abs(mctrack->Particle()->GetPdgCode())!=11) continue;\r
+       AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);\r
+       if(esdtrack){  \r
+         if(esdtrack->GetKinkIndex(0) != 0) continue; \r
+       } // Quick and dirty fix to reject both kink mothers and daughters\r
       }\r
+            \r
+      valuetrackingcuts[1] = 0; \r
+       if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);    \r
+      // RecPrim\r
+      if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepRecPrim + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;\r
+      valuetrackingcuts[1] = 1; \r
+       if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);    \r
+\r
+      // HFEcuts: ITS layers cuts\r
+       if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsITS + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;\r
+       valuetrackingcuts[1] = 2; \r
+       if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);     \r
+\r
+      // HFE cuts: TOF PID and mismatch flag\r
+      if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTOF + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;\r
+      valuetrackingcuts[1] = 3; \r
+       if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);    \r
+      \r
+      // HFE cuts: TPC PID cleanup\r
+      if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTPC + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;\r
+      valuetrackingcuts[1] = 4; \r
+       if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);    \r
+      \r
+      // HFEcuts: Nb of tracklets TRD0\r
+      if(!fHFECuts->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack, (TObject *)track)) continue;\r
+      valuetrackingcuts[1] = 5; \r
+       if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);    \r
+      \r
     }\r
 \r
+    //printf("Survived\n");\r
 \r
-    /////////////////////////////////////////////////////////////////////////////\r
-    // Add candidate to AliFlowEvent for POI and subtract from RP if needed\r
-    ////////////////////////////////////////////////////////////////////////////\r
-    Int_t idtrack = static_cast<AliVTrack*>(track)->GetID();\r
-    Bool_t found = kFALSE;\r
-    Int_t numberoffound = 0;\r
-    //printf("A: Number of tracks %d\n",fflowEvent->NumberOfTracks());\r
-    for(Int_t iRPs=0; iRPs< fflowEvent->NumberOfTracks(); iRPs++) {\r
-      AliFlowTrack *iRP = (AliFlowTrack*) (fflowEvent->GetTrack(iRPs));\r
-      //if(!iRP->InRPSelection()) continue;\r
-      if( TMath::Abs(idtrack) == TMath::Abs(iRP->GetID()) ) {\r
-       iRP->SetForPOISelection(kTRUE);\r
-       found = kTRUE;\r
-       numberoffound ++;\r
-      }\r
-    }\r
-    //printf("Found %d mal\n",numberoffound);\r
-    if(!found) {\r
-      AliFlowCandidateTrack *sTrack = (AliFlowCandidateTrack*) MakeTrack(massElectron,track->Pt(),track->Phi(), track->Eta());\r
-      sTrack->SetID(idtrack);\r
-      fflowEvent->AddTrack(sTrack);\r
-      //printf("Add the track\n");\r
-    }\r
-    //printf("B: Number of tracks %d\n",fflowEvent->NumberOfTracks());\r
-    \r
-    \r
     /////////////////////////////////////////////////////////\r
-    // Subtract electron candidate from TPC event plane\r
+    // Subtract candidate from TPC event plane\r
     ////////////////////////////////////////////////////////\r
     Float_t eventplanesubtracted = 0.0;    \r
 \r
@@ -1122,28 +1476,9 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     }\r
     else eventplanesubtracted = eventPlanea;\r
 \r
-    ////////////////////////////////////////\r
-    // Fill pt and eta for the THnSparseF\r
-    ///////////////////////////////////////\r
-\r
-    valuensparsee[2] = track->Pt();\r
-    valuensparsee[3] = track->Eta();    \r
-    valuensparseg[2] = track->Pt();\r
-    valuensparseh[2] = track->Pt();\r
-    valuensparsehprofile[2] = track->Pt();\r
-    if(track->Charge() > 0.0) {\r
-      valuensparseg[3] = 0.2;\r
-      valuensparseh[3] = 0.2;\r
-    }\r
-    else {\r
-      valuensparseg[3] = -0.2;\r
-      valuensparseh[3] = -0.2;\r
-    }\r
-    valuensparseh[4] = track->Eta();\r
-    valuensparseg[4] = track->Eta();\r
-\r
-    //printf("charge %d\n",(Int_t)track->Charge());\r
-\r
+    ///////////////////////////////////////////\r
+    // Event plane\r
+    //////////////////////////////////////////\r
     Bool_t fillEventPlane = kTRUE;\r
     if(!fVZEROEventPlane){\r
       //if((!qsub1a) || (!qsub2a) || (!eventplanedefined)) fillEventPlane = kFALSE;\r
@@ -1155,7 +1490,6 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
       }\r
     }\r
     \r
-    \r
     ///////////////\r
     // MC\r
     //////////////\r
@@ -1181,17 +1515,109 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     // Suppose phi track is between 0.0 and phi\r
     Double_t deltaphi = TVector2::Phi_0_2pi(phitrack - eventplanesubtracted);\r
     if(deltaphi > TMath::Pi()) deltaphi = deltaphi - TMath::Pi();\r
-   \r
+\r
+    ////////////////////////////////////////\r
+    // Define variables\r
+    ///////////////////////////////////////\r
+\r
+    valuensparsee[2] = track->Pt();\r
+    valuensparsee[3] = track->Eta();    \r
+    valuensparseg[2] = track->Pt();\r
+    valuensparseh[2] = track->Pt();\r
+    valuensparsehprofile[2] = track->Pt();\r
+    valuensparseMCSourceDeltaPhiMaps[1] = track->Pt();\r
+    if(track->Charge() > 0.0) {\r
+      valuensparseg[3] = 0.2;\r
+      valuensparseh[3] = 0.2;\r
+    }\r
+    else {\r
+      valuensparseg[3] = -0.2;\r
+      valuensparseh[3] = -0.2;\r
+    }\r
+    valuensparseh[4] = track->Eta();\r
+    valuensparseg[4] = track->Eta();\r
+\r
+    //printf("charge %d\n",(Int_t)track->Charge());\r
+\r
+    ////////////////////////\r
+    // Fill before PID\r
+    ///////////////////////\r
+    \r
+    if(fDebugLevel > 4) { \r
+      \r
+      valuensparseg[0] = deltaphi;\r
+      if(fillEventPlane) fDeltaPhiMapsBeforePID->Fill(&valuensparseg[0]);\r
+      \r
+      //\r
+      valuensparseh[0] = TMath::Cos(2*TVector2::Phi_mpi_pi(phitrack-eventplanesubtracted));\r
+      if(fillEventPlane) {\r
+       fCosPhiMapsBeforePID->Fill(&valuensparseh[0]);\r
+      }\r
+    }\r
+    \r
+    ////////////////////////\r
+    // Apply PID\r
+    ////////////////////////\r
+    if(!fNoPID) {\r
+      // Apply PID for Data\r
+      if(!fMCPID) {\r
+       AliHFEpidObject hfetrack;\r
+       if(!fAODAnalysis) hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);\r
+       else hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);\r
+       hfetrack.SetRecTrack(track);\r
+       hfetrack.SetCentrality((Int_t)binct);\r
+       //printf("centrality %f and %d\n",binct,hfetrack.GetCentrality());\r
+       hfetrack.SetPbPb();\r
+       if(!fPID->IsSelected(&hfetrack,0x0,"recTrackCont",fPIDqa)) {\r
+         continue;\r
+       }\r
+      }\r
+      else {\r
+       if(!mcEvent) continue;\r
+       if(!(mctrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(track->GetLabel()))))) continue;\r
+       //printf("PdgCode %d\n",TMath::Abs(mctrack->Particle()->GetPdgCode()));\r
+       if(TMath::Abs(mctrack->Particle()->GetPdgCode())!=11) continue;\r
+      }\r
+    }\r
+\r
+\r
+    /////////////////////////////////////////////////////////////////////////////\r
+    // Add candidate to AliFlowEvent for POI and subtract from RP if needed\r
+    ////////////////////////////////////////////////////////////////////////////\r
+    Int_t idtrack = static_cast<AliVTrack*>(track)->GetID();\r
+    Bool_t found = kFALSE;\r
+    Int_t numberoffound = 0;\r
+    //printf("A: Number of tracks %d\n",fflowEvent->NumberOfTracks());\r
+    for(Int_t iRPs=0; iRPs< fflowEvent->NumberOfTracks(); iRPs++) {\r
+      AliFlowTrack *iRP = (AliFlowTrack*) (fflowEvent->GetTrack(iRPs));\r
+      //if(!iRP->InRPSelection()) continue;\r
+      if( TMath::Abs(idtrack) == TMath::Abs(iRP->GetID()) ) {\r
+       iRP->SetForPOISelection(kTRUE);\r
+       found = kTRUE;\r
+       numberoffound ++;\r
+      }\r
+    }\r
+    //printf("Found %d mal\n",numberoffound);\r
+    if(!found) {\r
+      AliFlowCandidateTrack *sTrack = (AliFlowCandidateTrack*) MakeTrack(massElectron,track->Pt(),track->Phi(), track->Eta());\r
+      sTrack->SetID(idtrack);\r
+      fflowEvent->AddTrack(sTrack);\r
+      //printf("Add the track\n");\r
+    }\r
+    //printf("B: Number of tracks %d\n",fflowEvent->NumberOfTracks());\r
+    \r
+    \r
+  \r
     /////////////////////\r
     // Fill THnSparseF\r
     /////////////////////\r
 \r
     //\r
     valuensparseabis[0] = eventplanesubtracted;\r
-    if(fillEventPlane) fEventPlaneaftersubtraction->Fill(&valuensparseabis[0]);\r
+    if((fillEventPlane) && (fDebugLevel > 5)) fEventPlaneaftersubtraction->Fill(&valuensparseabis[0]);\r
     \r
 \r
-    if(fDebugLevel > 3\r
+    if(fDebugLevel > 5\r
       {\r
        //\r
        valuensparsee[0] = TMath::Cos(2*phitrack);\r
@@ -1221,7 +1647,32 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
       }\r
     }\r
     \r
-    \r
+    if(fDebugLevel > 1) {\r
+      // background\r
+      Int_t source = 0;\r
+      Int_t indexmother = -1;\r
+      source = FindMother(TMath::Abs(track->GetLabel()),mcEvent, indexmother);\r
+      valuensparseMCSourceDeltaPhiMaps[2] = source;\r
+      if(mcEvent) fMCSourceDeltaPhiMaps->Fill(&valuensparseMCSourceDeltaPhiMaps[0]);\r
+      Int_t taggedvalue = LookAtNonHFE(k,track,fInputEvent,mcEvent,binct,deltaphi,source,indexmother);\r
+      if(fillEventPlane) {\r
+       // No opposite charge partner found in the invariant mass choosen\r
+       if((taggedvalue!=2) && (taggedvalue!=6)) {\r
+         fDeltaPhiMapsTaggedNonPhotonic->Fill(&valuensparseg[0]);\r
+         fCosPhiMapsTaggedNonPhotonic->Fill(&valuensparseh[0]);\r
+       }\r
+       // One opposite charge partner found in the invariant mass choosen\r
+       if((taggedvalue==2) || (taggedvalue==6)) {\r
+         fDeltaPhiMapsTaggedPhotonic->Fill(&valuensparseg[0]);\r
+         fCosPhiMapsTaggedPhotonic->Fill(&valuensparseh[0]);\r
+       }\r
+       // One same charge partner found in the invariant mass choosen\r
+       if((taggedvalue==4) || (taggedvalue==6)) {\r
+         fDeltaPhiMapsTaggedPhotonicLS->Fill(&valuensparseg[0]);\r
+         fCosPhiMapsTaggedPhotonicLS->Fill(&valuensparseh[0]);\r
+       }\r
+      }\r
+    }\r
     \r
   }\r
 \r
@@ -1239,10 +1690,14 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
   for(Int_t bincless = 0; bincless < fNbBinsCentralityQCumulant; bincless++) {\r
     if((fBinCentralityLess[bincless]< cntr) && (cntr < fBinCentralityLess[bincless+1])) PostData(bincless+2,fflowEvent);\r
   }\r
+\r
+  if(fArraytrack) {\r
+    delete fArraytrack;\r
+    fArraytrack = NULL;\r
+  }\r
   \r
   PostData(1, fListHist);\r
 \r
-\r
  \r
 }\r
 //______________________________________________________________________________\r
@@ -1283,3 +1738,512 @@ Double_t AliAnalysisTaskHFEFlow::GetPhiAfterAddV2(Double_t phi,Double_t reaction
   }\r
   return phiend;\r
 }\r
+//_____________________________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::LookAtNonHFE(Int_t iTrack1, AliVTrack *track1, AliVEvent *vEvent, AliMCEvent *mcEvent,Int_t binct,Double_t deltaphi,Int_t source,Int_t indexmother)\r
+{      \r
+  //\r
+  // Look At Non HFE\r
+  //\r
+\r
+  // return -1 if nothing\r
+  // return 2 if opposite charge within the mass range found\r
+  // return 4 if like charge within the mass range found\r
+  // return 6 if opposite charge and like charge within the mass range found\r
+  //\r
+\r
+  Int_t taggedphotonic = -1;\r
+\r
+  Bool_t oppositetaggedphotonic = kFALSE;\r
+  Bool_t sametaggedphotonic = kFALSE;\r
+\r
+  //printf("fCounterPoolBackground %d in LookAtNonHFE!!!\n",fCounterPoolBackground);\r
+  if(!fArraytrack) return taggedphotonic;\r
+  //printf("process track %d\n",iTrack1);\r
+  \r
+  TVector3 v3D1;\r
+  TVector3 v3D2;\r
+\r
+  Double_t valuensparseDeltaPhiMaps[5];\r
+  Double_t valueangle[3];\r
+\r
+  valuensparseDeltaPhiMaps[1] = binct;\r
+  valuensparseDeltaPhiMaps[2] = track1->Pt();\r
+  valuensparseDeltaPhiMaps[0] = deltaphi;\r
+  valuensparseDeltaPhiMaps[4] = source;\r
+  \r
+  valueangle[2] = source;\r
+  valueangle[1] = binct;\r
+\r
+  //Magnetic Field\r
+  Double_t bfield = vEvent->GetMagneticField();\r
+  \r
+  for(Int_t idex = 0; idex < fCounterPoolBackground; idex++) \r
+    {\r
+\r
+      Int_t iTrack2 = fArraytrack->At(idex);\r
+      //printf("track %d\n",iTrack2);\r
+      AliVTrack* track2 = (AliVTrack *) vEvent->GetTrack(iTrack2);\r
+      if (!track2) \r
+       {\r
+         printf("ERROR: Could not receive track %d\n", iTrack2);\r
+         continue;\r
+       }\r
+      if(iTrack2==iTrack1) continue;\r
+      //printf("Different\n");\r
+\r
+      // track cuts and PID already done\r
+\r
+      // if MC look\r
+      if(mcEvent) {\r
+       Int_t source2 = 0;\r
+       Int_t indexmother2 = -1;\r
+       source2 = FindMother(TMath::Abs(track2->GetLabel()),mcEvent, indexmother2);\r
+       if((indexmother2 == indexmother) && (source == source2)) {\r
+         if(source == kElectronfromconversion) {\r
+           valueangle[2] = kElectronfromconversionboth;\r
+           valuensparseDeltaPhiMaps[4] = kElectronfromconversionboth;\r
+         }\r
+         if(source == kElectronfrompi0) {\r
+           valueangle[2] = kElectronfrompi0both;\r
+           valuensparseDeltaPhiMaps[4] = kElectronfrompi0both;\r
+         }\r
+         if(source == kElectronfrometa) {\r
+           valueangle[2] = kElectronfrometaboth;\r
+           valuensparseDeltaPhiMaps[4] = kElectronfrometaboth;\r
+         }\r
+       }\r
+      }\r
+      \r
+      if(fAlgorithmMA && (!fAODAnalysis))\r
+       {\r
+         // tracks\r
+         AliESDtrack *esdtrack2 = dynamic_cast<AliESDtrack *>(track2);   \r
+         AliESDtrack *esdtrack1 = dynamic_cast<AliESDtrack *>(track1);      \r
+         if((!esdtrack2) || (!esdtrack1)) continue;\r
+\r
+         //Variables\r
+         Double_t p1[3];\r
+         Double_t p2[3];\r
+         Double_t xt1; //radial position track 1 at the DCA point\r
+         Double_t xt2; //radial position track 2 at the DCA point\r
+         //DCA track1-track2\r
+         Double_t dca12 = esdtrack2->GetDCA(esdtrack1,bfield,xt2,xt1);\r
+\r
+         // Cut dca\r
+         if(dca12 > fMaxdca) continue;\r
+         \r
+         //Momento of the track extrapolated to DCA track-track        \r
+         //Track1\r
+         Bool_t hasdcaT1 = esdtrack1->GetPxPyPzAt(xt1,bfield,p1);\r
+         //Track2\r
+         Bool_t hasdcaT2 = esdtrack2->GetPxPyPzAt(xt2,bfield,p2);\r
+         \r
+         if(!hasdcaT1 || !hasdcaT2) AliWarning("It could be a problem in the extrapolation");\r
+         \r
+         //track1-track2 Invariant Mass\r
+         Double_t eMass = 0.000510998910; //Electron mass in GeV\r
+         Double_t pP1 = sqrt(p1[0]*p1[0]+p1[1]*p1[1]+p1[2]*p1[2]); //Track 1 momentum\r
+         Double_t pP2 = sqrt(p2[0]*p2[0]+p2[1]*p2[1]+p2[2]*p2[2]); //Track 2 momentum\r
+         Double_t eE1 = TMath::Sqrt(pP1*pP1+eMass*eMass);\r
+         Double_t eE2 = TMath::Sqrt(pP2*pP2+eMass*eMass);\r
+         \r
+         //TLorentzVector v1(p1[0],p1[1],p1[2],sqrt(eMass*eMass+pP1*pP1));\r
+         //TLorentzVector v2(p2[0],p2[1],p2[2],sqrt(eMass*eMass+pP2*pP2));\r
+         //Double_t imass = (v1+v2).M(); //Invariant Mass\r
+         //Double_t angle3D = v1.Angle(v2.Vect()); //Opening Angle (Total Angle)\r
+         \r
+         // daughter\r
+         v3D1.SetXYZ(p1[0],p1[1],p1[2]);\r
+         v3D2.SetXYZ(p2[0],p2[1],p2[2]);\r
+         Double_t openingangle = TVector2::Phi_0_2pi(v3D2.Angle(v3D1));\r
+         \r
+         // mother\r
+         TVector3 motherrec = v3D1 + v3D2;\r
+         Double_t invmass = TMath::Sqrt((eE1+eE2)*(eE1+eE2)-(motherrec.Px()*motherrec.Px()+motherrec.Py()*motherrec.Py()+motherrec.Pz()*motherrec.Pz()));\r
+         \r
+         // xy\r
+         //TVector3 vectordiff = v3D1 - v3D2;\r
+         //Double_t diffphi = TVector2::Phi_0_2pi(vectordiff.Phi());\r
+         //Double_t massxy = TMath::Sqrt((eE1+eE2)*(eE1+eE2)-(pP1*pP1+pP2*pP2+2*pP1*pP2*TMath::Cos(diffphi)));\r
+\r
+         // rz\r
+         //Double_t difftheta = TVector2::Phi_0_2pi(vectordiff.Eta());\r
+         //Double_t massrz = TMath::Sqrt((eE1+eE2)*(eE1+eE2)-(pP1*pP1+pP2*pP2+2*pP1*pP2*TMath::Cos(difftheta)));\r
+  \r
+\r
+         Float_t fCharge1 = track1->Charge();\r
+         Float_t fCharge2 = track2->Charge();\r
+\r
+         // Fill Histo\r
+         //valueangle[0] = diffphi;\r
+         //valueangle[1] = difftheta;\r
+         valueangle[0] = openingangle;\r
+         if((fCharge1*fCharge2)>0.0) fSameSignAngle->Fill(&valueangle[0]);\r
+         else fOppSignAngle->Fill(&valueangle[0]);\r
+\r
+         // Cut\r
+         if(openingangle > fMaxopening3D) continue;\r
+         //if(difftheta > fMaxopeningtheta) continue;\r
+         //if(diffphi > fMaxopeningphi) continue;\r
+\r
+         // Invmass\r
+         valuensparseDeltaPhiMaps[3] = invmass;\r
+         if((fCharge1*fCharge2)>0.0) fSameSignDeltaPhiMaps->Fill(&valuensparseDeltaPhiMaps[0]);\r
+         else fOppSignDeltaPhiMaps->Fill(&valuensparseDeltaPhiMaps[0]);\r
+         \r
+         // Cut\r
+         if(invmass < fMaxInvmass) {\r
+           if((fCharge1*fCharge2)<0.0) oppositetaggedphotonic=kTRUE;\r
+           if((fCharge1*fCharge2)>0.0) sametaggedphotonic=kTRUE;\r
+         }\r
+\r
+\r
+       }\r
+      else \r
+       {\r
+         Int_t fPDGtrack1 = 11; \r
+         Int_t fPDGtrack2 = 11;\r
+         \r
+         Float_t fCharge1 = track1->Charge();\r
+         Float_t fCharge2 = track2->Charge();\r
+         \r
+         if(fCharge1>0) fPDGtrack1 = -11;\r
+         if(fCharge2>0) fPDGtrack2 = -11;\r
+         \r
+         AliKFParticle fKFtrack1(*track1, fPDGtrack1);\r
+         AliKFParticle fKFtrack2(*track2, fPDGtrack2);\r
+         AliKFParticle fRecoGamma(fKFtrack1, fKFtrack2);\r
+         \r
+         //Reconstruction Cuts\r
+         if(fRecoGamma.GetNDF()<1) continue;\r
+         Double_t chi2OverNDF = fRecoGamma.GetChi2()/fRecoGamma.GetNDF();\r
+         if(TMath::Sqrt(TMath::Abs(chi2OverNDF))>fChi2OverNDFCut) continue;\r
+         \r
+         //Invariant Mass\r
+         Double_t imass; \r
+         Double_t width;\r
+         fRecoGamma.GetMass(imass,width);\r
+         \r
+         //Opening Angle (Total Angle)\r
+         Double_t angle = fKFtrack1.GetAngle(fKFtrack2);\r
+         valueangle[0] = angle;\r
+         if((fCharge1*fCharge2)>0.0) fSameSignAngle->Fill(&valueangle[0]);\r
+         else fOppSignAngle->Fill(&valueangle[0]);       \r
+\r
+         // Invmass\r
+         valuensparseDeltaPhiMaps[3] = imass;\r
+         if((fCharge1*fCharge2)>0.0) fSameSignDeltaPhiMaps->Fill(&valuensparseDeltaPhiMaps[0]);\r
+         else fOppSignDeltaPhiMaps->Fill(&valuensparseDeltaPhiMaps[0]);\r
+         \r
+         \r
+         // Cut\r
+         if(imass < fMaxInvmass) {\r
+           if((fCharge1*fCharge2)<0.0) oppositetaggedphotonic=kTRUE;\r
+           if((fCharge1*fCharge2)>0.0) sametaggedphotonic=kTRUE;\r
+         }\r
+       \r
+       }\r
+    }\r
+\r
+  if(oppositetaggedphotonic && sametaggedphotonic){\r
+    taggedphotonic = 6;\r
+  }\r
+\r
+  if(!oppositetaggedphotonic && sametaggedphotonic){\r
+    taggedphotonic = 4;\r
+  }\r
+\r
+  if(oppositetaggedphotonic && !sametaggedphotonic){\r
+    taggedphotonic = 2;\r
+  }\r
+\r
+  \r
+  return taggedphotonic;\r
+}\r
+\r
+//_________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::FindMother(Int_t tr, AliMCEvent *mcEvent, Int_t &indexmother){\r
+  //\r
+  // Find the mother if MC\r
+  //\r
+\r
+  if(!mcEvent) return 0;\r
+  \r
+  indexmother = IsMotherGamma(tr,mcEvent);\r
+  if(indexmother > 0) return kElectronfromconversion;\r
+  indexmother = IsMotherPi0(tr,mcEvent);\r
+  if(indexmother > 0) return kElectronfrompi0;\r
+  indexmother = IsMotherC(tr,mcEvent);\r
+  if(indexmother > 0) return kElectronfromC;\r
+  indexmother = IsMotherB(tr,mcEvent);\r
+  if(indexmother > 0) return kElectronfromB;\r
+  indexmother = IsMotherEta(tr,mcEvent);\r
+  if(indexmother > 0) return kElectronfrometa;\r
+  \r
+  return kElectronfromother;\r
+\r
+\r
+}\r
+//____________________________________________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::IsMotherGamma(Int_t tr, AliMCEvent* mcEvent) {\r
+\r
+  //\r
+  // Return the lab of gamma mother or -1 if not gamma\r
+  //\r
+\r
+  if(tr < 0) return -1;\r
+  AliVParticle *mctrack = mcEvent->GetTrack(tr);\r
+  \r
+  if(mctrack->IsA() == AliMCParticle::Class()) {\r
+    AliMCParticle *mctrackesd = NULL;\r
+    if(!(mctrackesd = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    TParticle *particle = 0x0;\r
+    particle = mctrackesd->Particle();\r
+    // Take mother\r
+    if(!particle) return -1;\r
+    Int_t imother   = particle->GetFirstMother(); \r
+    if(imother < 0) return -1;  \r
+    AliMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    TParticle * mother = mothertrack->Particle();\r
+    if(!mother) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mother->GetPdgCode();\r
+    if(TMath::Abs(pdg) == 22) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherGamma(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  if(mctrack->IsA() == AliAODMCParticle::Class()) {\r
+    AliAODMCParticle *mctrackaod = NULL;\r
+    if(!(mctrackaod = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    // Take mother\r
+    Int_t imother = mctrackaod->GetMother();\r
+    if(imother < 0) return -1;  \r
+    AliAODMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mothertrack->GetPdgCode();\r
+    if(TMath::Abs(pdg) == 22) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherGamma(imother,mcEvent);\r
+    }\r
+    return -1;\r
+\r
+  }\r
+  \r
+  return -1;\r
+\r
\r
+}\r
+//\r
+//____________________________________________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::IsMotherPi0(Int_t tr, AliMCEvent* mcEvent) {\r
+\r
+  //\r
+  // Return the lab of pi0 mother or -1 if not pi0\r
+  //\r
+\r
+  if(tr < 0) return -1;\r
+  AliVParticle *mctrack = mcEvent->GetTrack(tr);\r
+  \r
+  if(mctrack->IsA() == AliMCParticle::Class()) {\r
+    AliMCParticle *mctrackesd = NULL;\r
+    if(!(mctrackesd = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    TParticle *particle = 0x0;\r
+    particle = mctrackesd->Particle();\r
+    // Take mother\r
+    if(!particle) return -1;\r
+    Int_t imother   = particle->GetFirstMother(); \r
+    if(imother < 0) return -1;  \r
+    AliMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    TParticle * mother = mothertrack->Particle();\r
+    if(!mother) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mother->GetPdgCode();\r
+    if(TMath::Abs(pdg) == 111) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherPi0(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  if(mctrack->IsA() == AliAODMCParticle::Class()) {\r
+    AliAODMCParticle *mctrackaod = NULL;\r
+    if(!(mctrackaod = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    // Take mother\r
+    Int_t imother = mctrackaod->GetMother();\r
+    if(imother < 0) return -1;  \r
+    AliAODMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mothertrack->GetPdgCode();\r
+    if(TMath::Abs(pdg) == 111) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherPi0(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  return -1;\r
\r
+}\r
+//____________________________________________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::IsMotherC(Int_t tr, AliMCEvent* mcEvent) {\r
+\r
+  //\r
+  // Return the lab of signal mother or -1 if not signal\r
+  //\r
+\r
+  if(tr < 0) return -1;\r
+  AliVParticle *mctrack = mcEvent->GetTrack(tr);\r
+  \r
+  if(mctrack->IsA() == AliMCParticle::Class()) {\r
+    AliMCParticle *mctrackesd = NULL;\r
+    if(!(mctrackesd = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    TParticle *particle = 0x0;\r
+    particle = mctrackesd->Particle();\r
+    // Take mother\r
+    if(!particle) return -1;\r
+    Int_t imother   = particle->GetFirstMother(); \r
+    if(imother < 0) return -1;  \r
+    AliMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    TParticle * mother = mothertrack->Particle();\r
+    if(!mother) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mother->GetPdgCode();\r
+    if((TMath::Abs(pdg)==411) || (TMath::Abs(pdg)==421) || (TMath::Abs(pdg)==431) || (TMath::Abs(pdg)==4122) || (TMath::Abs(pdg)==4132) || (TMath::Abs(pdg)==4232) || (TMath::Abs(pdg)==43320)) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherC(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  if(mctrack->IsA() == AliAODMCParticle::Class()) {\r
+    AliAODMCParticle *mctrackaod = NULL;\r
+    if(!(mctrackaod = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    // Take mother\r
+    Int_t imother = mctrackaod->GetMother();\r
+    if(imother < 0) return -1;  \r
+    AliAODMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mothertrack->GetPdgCode();\r
+    if((TMath::Abs(pdg)==411) || (TMath::Abs(pdg)==421) || (TMath::Abs(pdg)==431) || (TMath::Abs(pdg)==4122) || (TMath::Abs(pdg)==4132) || (TMath::Abs(pdg)==4232) || (TMath::Abs(pdg)==43320)) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherC(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  return -1;\r
+\r
+}\r
+//____________________________________________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::IsMotherB(Int_t tr, AliMCEvent* mcEvent) {\r
+\r
+  //\r
+  // Return the lab of signal mother or -1 if not signal\r
+  //\r
+\r
+  if(tr < 0) return -1;\r
+  AliVParticle *mctrack = mcEvent->GetTrack(tr);\r
+  \r
+  if(mctrack->IsA() == AliMCParticle::Class()) {\r
+    AliMCParticle *mctrackesd = NULL;\r
+    if(!(mctrackesd = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    TParticle *particle = 0x0;\r
+    particle = mctrackesd->Particle();\r
+    // Take mother\r
+    if(!particle) return -1;\r
+    Int_t imother   = particle->GetFirstMother(); \r
+    if(imother < 0) return -1;  \r
+    AliMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    TParticle * mother = mothertrack->Particle();\r
+    if(!mother) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mother->GetPdgCode();\r
+    if((TMath::Abs(pdg)==511) || (TMath::Abs(pdg)==521) || (TMath::Abs(pdg)==531) || (TMath::Abs(pdg)==5122) || (TMath::Abs(pdg)==5132) || (TMath::Abs(pdg)==5232) || (TMath::Abs(pdg)==53320)) return imother; \r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherB(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  if(mctrack->IsA() == AliAODMCParticle::Class()) {\r
+    AliAODMCParticle *mctrackaod = NULL;\r
+    if(!(mctrackaod = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    // Take mother\r
+    Int_t imother = mctrackaod->GetMother();\r
+    if(imother < 0) return -1;  \r
+    AliAODMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mothertrack->GetPdgCode();\r
+    if((TMath::Abs(pdg)==511) || (TMath::Abs(pdg)==521) || (TMath::Abs(pdg)==531) || (TMath::Abs(pdg)==5122) || (TMath::Abs(pdg)==5132) || (TMath::Abs(pdg)==5232) || (TMath::Abs(pdg)==53320)) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherB(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  return -1;\r
+\r
+}\r
+//____________________________________________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::IsMotherEta(Int_t tr, AliMCEvent* mcEvent) {\r
+\r
+  //\r
+  // Return the lab of pi0 mother or -1 if not pi0\r
+  //\r
+\r
+ if(tr < 0) return -1;\r
+  AliVParticle *mctrack = mcEvent->GetTrack(tr);\r
+  \r
+  if(mctrack->IsA() == AliMCParticle::Class()) {\r
+    AliMCParticle *mctrackesd = NULL;\r
+    if(!(mctrackesd = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    TParticle *particle = 0x0;\r
+    particle = mctrackesd->Particle();\r
+    // Take mother\r
+    if(!particle) return -1;\r
+    Int_t imother   = particle->GetFirstMother(); \r
+    if(imother < 0) return -1;  \r
+    AliMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    TParticle * mother = mothertrack->Particle();\r
+    if(!mother) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mother->GetPdgCode();\r
+    if(TMath::Abs(pdg) == 221) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherEta(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  if(mctrack->IsA() == AliAODMCParticle::Class()) {\r
+    AliAODMCParticle *mctrackaod = NULL;\r
+    if(!(mctrackaod = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return -1;\r
+    // Take mother\r
+    Int_t imother = mctrackaod->GetMother();\r
+    if(imother < 0) return -1;  \r
+    AliAODMCParticle *mothertrack = NULL;\r
+    if(!(mothertrack = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(imother))))) return -1;\r
+    // Check gamma    \r
+    Int_t pdg = mothertrack->GetPdgCode();\r
+    if(TMath::Abs(pdg) == 221) return imother;\r
+    if(TMath::Abs(pdg) == 11) {\r
+      return IsMotherEta(imother,mcEvent);\r
+    }\r
+    return -1;\r
+  }\r
+\r
+  return -1;\r
+  \r
+}\r
index 38dc27af7a81e3fa6608ad4604b0bc20f8bb5fd1..2361a22792cecc2591ba27afcb356ada36015624 100644 (file)
 #include <AliAnalysisTaskSE.h>\r
 \r
 class TList;\r
+class AliVTrack;\r
+class AliVEvent;\r
+class AliESDtrack;\r
+class AliESDEvent;\r
+class AliMCEvent;\r
 class AliFlowTrackCuts;\r
 class AliFlowCandidateTrack;\r
 class AliHFEcuts;\r
@@ -36,11 +41,34 @@ class TProfile2D;
 class THnSparse;\r
 class AliHFEpidQAmanager;\r
 class AliFlowEvent;\r
+class AliESDtrackCuts;\r
 class AliHFEVZEROEventPlane;\r
+class TArrayI;\r
 \r
 class AliAnalysisTaskHFEFlow: public AliAnalysisTaskSE {\r
   \r
 public:\r
+\r
+  typedef enum{\r
+    kElectronfromconversion = 0,\r
+    kElectronfromconversionboth = 1,\r
+    kElectronfrompi0 = 2,\r
+    kElectronfrompi0both = 3,\r
+    kElectronfromC = 4,\r
+    kElectronfromB = 5,\r
+    kElectronfrometa = 6,\r
+    kElectronfrometaboth = 7,\r
+    kElectronfromother = 8\r
+  } FlowSource_t;\r
+  \r
+  typedef enum{\r
+    kS = 0,\r
+    kOp = 1\r
+  } FlowSign_t;\r
+\r
+\r
+\r
+\r
   AliAnalysisTaskHFEFlow();\r
   AliAnalysisTaskHFEFlow(const char *name);\r
   AliAnalysisTaskHFEFlow(const AliAnalysisTaskHFEFlow &ref);\r
@@ -58,8 +86,12 @@ public:
   \r
   AliHFEpid *GetPID() const { return fPID; }\r
   AliHFEpidQAmanager *GetPIDQAManager() const { return fPIDqa; }\r
+  AliHFEpid *GetPIDBackground() const { return fPIDBackground; }\r
+  AliHFEpidQAmanager *GetPIDBackgroundQAManager() const { return fPIDBackgroundqa; }\r
+\r
 \r
   void SetHFECuts(AliHFEcuts * const cuts) { fHFECuts = cuts; };\r
+  void SetHFEBackgroundCuts(AliESDtrackCuts * const cuts) { fHFEBackgroundCuts = cuts; };\r
   void SetSubEtaGapTPC(Bool_t  subEtaGapTPC) { fSubEtaGapTPC = subEtaGapTPC; };\r
   void SetEtaGap(Double_t  etaGap) { fEtaGap = etaGap; };\r
   void SetVZEROEventPlane(Bool_t vzeroEventPlane) { fVZEROEventPlane = vzeroEventPlane; };\r
@@ -89,6 +121,13 @@ public:
   \r
   AliFlowCandidateTrack *MakeTrack( Double_t mass, Double_t pt, Double_t phi, Double_t eta) ;\r
   Double_t GetPhiAfterAddV2(Double_t phi,Double_t reactionPlaneAngle) const;\r
+\r
+  void  SetMaxInvmass(Double_t maxInvmass) { fMaxInvmass = maxInvmass; };\r
+  void  SetMaxopening3D(Double_t maxOpening3D) { fMaxopening3D = maxOpening3D; };\r
+  void  SetMaxopeningtheta(Double_t maxOpeningtheta) { fMaxopeningtheta = maxOpeningtheta; };\r
+  void  SetMaxopeningphi(Double_t maxOpeningphi) { fMaxopeningphi = maxOpeningphi; };\r
+\r
+  Int_t    LookAtNonHFE(Int_t iTrack1, AliVTrack *track1, AliVEvent *fESD, AliMCEvent *mcEvent,Int_t binct,Double_t deltaphi,Int_t source,Int_t indexmother);\r
   \r
 private:\r
   TList     *fListHist;         //! TH list\r
@@ -123,6 +162,14 @@ private:
   Bool_t    fMCPID; // MC PID for electrons\r
   Bool_t    fNoPID; // No PID for checks\r
 \r
+  Double_t  fChi2OverNDFCut;   // Limit chi2\r
+  Double_t  fMaxdca;           // Limit dca\r
+  Double_t  fMaxopeningtheta;  // Limit opening angle in theta\r
+  Double_t  fMaxopeningphi;    // Limit opening angle in phi\r
+  Double_t  fMaxopening3D;     // Limit opening 3D\r
+  Double_t  fMaxInvmass;       // Limit invariant mass\r
+  \r
+\r
   Int_t     fDebugLevel; // Debug Level  \r
 \r
   // Cuts for FLOW PWG2\r
@@ -133,7 +180,17 @@ private:
   AliHFEcuts *fHFECuts;           // HFE cuts\r
   AliHFEpid  *fPID;               // PID cuts \r
   AliHFEpidQAmanager *fPIDqa;     // QA Manager\r
-  AliFlowEvent *fflowEvent;       //! Flow event   \r
+  AliFlowEvent *fflowEvent;       //! Flow event \r
+\r
+  // Cuts for background study\r
+  AliESDtrackCuts *fHFEBackgroundCuts;    // HFE background cuts\r
+  AliHFEpid  *fPIDBackground;             // PID background cuts \r
+  AliHFEpidQAmanager *fPIDBackgroundqa;   // QA Manager Background  \r
+  Bool_t fAlgorithmMA;                    // algorithm MA\r
+\r
+  // List of tracks\r
+  TArrayI *fArraytrack;                    // list of tracks\r
+  Int_t fCounterPoolBackground;            // number of tracks\r
 \r
   // VZERO Event plane after calibration 2010\r
   AliHFEVZEROEventPlane *fHFEVZEROEventPlane; // VZERO event plane calibrated\r
@@ -171,13 +228,45 @@ private:
   THnSparseF *fSinRes; //! Res\r
   TProfile   *fProfileCosRes; //! Profile Res\r
   \r
+  // Debuging Cuts step by step all centrality together: pt, step (6)\r
+  THnSparseF *fTrackingCuts; //! Tracking Cuts\r
+\r
+  // Before PID cut\r
+  // G Maps delta phi as function of deltaphi, centrality, pt\r
+  THnSparseF *fDeltaPhiMapsBeforePID; //! Delta phi\r
+  // H Maps cos phi : cos, centrality, pt\r
+  THnSparseF *fCosPhiMapsBeforePID; //! Cos\r
+\r
   // G Maps delta phi as function of deltaphi, centrality, pt\r
   THnSparseF *fDeltaPhiMaps; //! Delta phi\r
-  \r
   // H Maps cos phi : cos, centrality, pt\r
   THnSparseF *fCosPhiMaps;         //! Cos\r
   TProfile2D *fProfileCosPhiMaps;  //! Profile Cos\r
-  \r
+\r
+  // Background study: not statistic but tagged \r
+  THnSparseF *fDeltaPhiMapsTaggedPhotonic; //! Delta phi\r
+  THnSparseF *fCosPhiMapsTaggedPhotonic; //! Cos\r
+  THnSparseF *fDeltaPhiMapsTaggedNonPhotonic; //! Delta phi\r
+  THnSparseF *fCosPhiMapsTaggedNonPhotonic; //! Cos\r
+  THnSparseF *fDeltaPhiMapsTaggedPhotonicLS; //! Delta phi\r
+  THnSparseF *fCosPhiMapsTaggedPhotonicLS; //! Cos\r
+\r
+  // Background study: centrality, pt, source\r
+  THnSparseF *fMCSourceDeltaPhiMaps; //! Source MC\r
+  // Background study: deltaphi, centrality, pt, minv, source\r
+  THnSparseF *fOppSignDeltaPhiMaps;  //! Delta phi\r
+  THnSparseF *fSameSignDeltaPhiMaps; //! Delta phi\r
+  // Background study: angle, centrality, source\r
+  THnSparseF *fOppSignAngle;         // ! Opening Angles\r
+  THnSparseF *fSameSignAngle;        // ! Opening Angles\r
+\r
+  Int_t FindMother(Int_t tr, AliMCEvent *mcEvent, Int_t &indexmother);\r
+  Int_t IsMotherGamma(Int_t tr, AliMCEvent* mcEvent);\r
+  Int_t IsMotherPi0(Int_t tr, AliMCEvent* mcEvent);\r
+  Int_t IsMotherC(Int_t tr, AliMCEvent* mcEvent);\r
+  Int_t IsMotherB(Int_t tr, AliMCEvent* mcEvent);\r
+  Int_t IsMotherEta(Int_t tr, AliMCEvent* mcEvent);\r
+    \r
   \r
   ClassDef(AliAnalysisTaskHFEFlow, 1); // analysisclass\r
 };\r
index bba9a2f4bdf9e725c52614e9505984ce853d3e27..fe1b68205806404c71114d46ffb0f9dd2017cd41 100644 (file)
@@ -140,7 +140,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
 
   // Cut event
   if(fInputEvent->IsPileupFromSPD(3, 0.8, 3., 2., 5)){
-   AliDebug(1, "Event flagged as pileup\n");
+  AliDebug(1, "Event flagged as pileup\n");
     return;
   }
   if(!fTrackCuts->CheckEventCuts("fCutsEvRec", fInputEvent)){
@@ -217,7 +217,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
       
       // Get Production Vertex in radial direction
       Double_t vx = mcpart->Particle()->Vx(), 
-               vy = mcpart->Particle()->Vy(); 
+              vy = mcpart->Particle()->Vy(); 
       Double_t productionVertex = TMath::Sqrt(vx*vx+vy*vy);
       
       // Get Mother PDG code of the particle
@@ -247,7 +247,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
 
 
 
-         (*fDebugTree) << "MCDebug"
+    (*fDebugTree) << "MCDebug"
                     << "centrality="          << centrality
                     << "MBtrigger="           << isMBTrigger 
                     << "CentralTrigger="      << isCentralTrigger
@@ -261,7 +261,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
                     << "pdg="                 << pdg
                     << "ProductionVertex="    << productionVertex
                     << "motherPdg="           << motherPdg
-                   << "source="              << source
+                  << "source="              << source
                     << "\n";
     }
   }
@@ -275,6 +275,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
     // Cut track (Only basic track cuts)
     if(!fTrackCuts->CheckParticleCuts(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepRecKineITSTPC, track)) continue;
     // Debug streaming of PID-related quantities
+    copyTrack.~AliESDtrack();
     new(&copyTrack) AliESDtrack(*track);
     if(fTPCpid->HasEtaCorrection()) fTPCpid->ApplyEtaCorrection(&copyTrack, AliHFEpidObject::kESDanalysis); // Apply Eta Correction on copy track
     Double_t nSigmaTOF = pid->NumberOfSigmasTOF(track, AliPID::kElectron);
@@ -338,7 +339,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
         mcptTPC = ref->Pt();
       }
 
-     
+    
       TParticle *mctrack1 = mctrack->Particle();
       mesonID=GetElecSourceMC(mctrack1);
       if(mesonID==AliHFEmcQA::kGammaPi0 || mesonID==AliHFEmcQA::kPi0) mArr=0;                //pion
@@ -349,7 +350,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
       else if(mesonID==AliHFEmcQA::kGammaRho0 || mesonID==AliHFEmcQA::kRho0) mArr=5;         //rho
     
       mctrack->XvYvZv(xr);
-     
+    
       eR= TMath::Sqrt(xr[0]*xr[0]+xr[1]*xr[1]);
       eZ = xr[2];
       TParticle *mctrackt = mctrack->Particle();
@@ -358,77 +359,77 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
       AliMCParticle *mctrackmother = NULL;
 
       if(!(mArr<0)){
-         if(mesonID>=AliHFEmcQA::kGammaPi0) {  // conversion electron, be careful with the enum odering
-             Int_t glabel=TMath::Abs(mctrack->GetMother()); // gamma label
-             if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                 glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's label
-                 if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                     mesonPt = mctrackmother->Pt(); //meson pt
-                     bgcategory = 1.;
-                     mctrackmother->XvYvZv(xr);
-                     mesonR = TMath::Sqrt(xr[0]*xr[0]+xr[1]*xr[1]);
-                     mesonZ = xr[2];
-
-                     mctrackt = mctrackmother->Particle();
-                     if(mctrackt){
-                         mesonunique = mctrackt->GetUniqueID();
-                     }
-                     if(glabel>fMCEvent->GetNumberOfPrimaries()) {
-                         bgcategory = 2.;
-                         glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
-                         if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                             mesonMomPdg=mctrackmother->PdgCode();
-                             mesonMomPt=mctrackmother->Pt();
-                             if(TMath::Abs(mctrackmother->PdgCode())==310){
-                                 bgcategory = 3.;
-                                 glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother's mother
-                                 if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                                     mesonGMomPdg=mctrackmother->PdgCode();
-                                     glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
-                                     if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                                         mesonGGMomPdg=mctrackmother->PdgCode();
-                                     }
-                                 }
-                             }
-                         }
-                     }
-                 }
-             }
-         }
-         else{ // nonHFE except for the conversion electron
-             Int_t glabel=TMath::Abs(mctrack->GetMother());
-             if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                 mesonPt = mctrackmother->Pt(); //meson pt
-                 bgcategory = -1.;
-                 mctrackmother->XvYvZv(xr);
-                 mesonR = TMath::Sqrt(xr[0]*xr[0]+xr[1]*xr[1]);
-                 mesonZ = xr[2];
-
-                 mctrackt = mctrackmother->Particle();
-                 if(mctrackt){
-                     mesonunique = mctrackt->GetUniqueID();
-                 }
-                 if(glabel>fMCEvent->GetNumberOfPrimaries()) {
-                     bgcategory = -2.;
-                     glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
-                     if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                         mesonMomPdg=mctrackmother->PdgCode();
-                         mesonMomPt=mctrackmother->Pt();
-                         if(TMath::Abs(mctrackmother->PdgCode())==310){
-                             bgcategory = -3.;
-                             glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother's mother
-                             if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+    if(mesonID>=AliHFEmcQA::kGammaPi0) {  // conversion electron, be careful with the enum odering
+        Int_t glabel=TMath::Abs(mctrack->GetMother()); // gamma label
+        if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+      glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's label
+      if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+          mesonPt = mctrackmother->Pt(); //meson pt
+          bgcategory = 1.;
+          mctrackmother->XvYvZv(xr);
+          mesonR = TMath::Sqrt(xr[0]*xr[0]+xr[1]*xr[1]);
+          mesonZ = xr[2];
+
+          mctrackt = mctrackmother->Particle();
+          if(mctrackt){
+        mesonunique = mctrackt->GetUniqueID();
+          }
+          if(glabel>fMCEvent->GetNumberOfPrimaries()) {
+        bgcategory = 2.;
+        glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
+        if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+            mesonMomPdg=mctrackmother->PdgCode();
+            mesonMomPt=mctrackmother->Pt();
+            if(TMath::Abs(mctrackmother->PdgCode())==310){
+          bgcategory = 3.;
+          glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother's mother
+          if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+              mesonGMomPdg=mctrackmother->PdgCode();
+              glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
+              if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+            mesonGGMomPdg=mctrackmother->PdgCode();
+              }
+          }
+            }
+        }
+          }
+      }
+        }
+    }
+    else{ // nonHFE except for the conversion electron
+        Int_t glabel=TMath::Abs(mctrack->GetMother());
+        if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+      mesonPt = mctrackmother->Pt(); //meson pt
+      bgcategory = -1.;
+      mctrackmother->XvYvZv(xr);
+      mesonR = TMath::Sqrt(xr[0]*xr[0]+xr[1]*xr[1]);
+      mesonZ = xr[2];
+
+      mctrackt = mctrackmother->Particle();
+      if(mctrackt){
+          mesonunique = mctrackt->GetUniqueID();
+      }
+      if(glabel>fMCEvent->GetNumberOfPrimaries()) {
+          bgcategory = -2.;
+          glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
+          if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+        mesonMomPdg=mctrackmother->PdgCode();
+        mesonMomPt=mctrackmother->Pt();
+        if(TMath::Abs(mctrackmother->PdgCode())==310){
+            bgcategory = -3.;
+            glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother's mother
+            if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
                                   mesonGMomPdg=mctrackmother->PdgCode();
-                                 glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
-                                 if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
-                                     mesonGGMomPdg=mctrackmother->PdgCode();
-                                 }
-                             }
-                         }
-                     }
-                 }
-             }
-         }
+          glabel=TMath::Abs(mctrackmother->GetMother()); // gamma's mother's mother
+          if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
+                                    mesonGGMomPdg=mctrackmother->PdgCode();
+          }
+            }
+        }
+          }
+      }
+        }
+    }
       }
 
 
@@ -472,7 +473,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
     Double_t trddEdxSum[6];
     for(Int_t a=0;a<6;a++) { trddEdxSum[a]= 0.;}
     for(Int_t itl = 0; itl < 6; itl++){
-           Int_t nSliceNonZero = 0;
+      Int_t nSliceNonZero = 0;
       trddEdxSum[itl] = track->GetTRDslice(itl, 0); // in new reconstruction slice 0 contains the total charge
       for(Int_t islice = 0; islice < 8; islice++){
         if(track->GetTRDslice(itl, islice) > 0.001) nSliceNonZero++;
@@ -502,6 +503,11 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
     Double_t hfebCov[3] = {-999.,-999.,-999.};
     fExtraCuts->GetHFEImpactParameters(track, hfeb, hfebCov);
 
+    Double_t tofdx= -999.0;
+    Double_t tofdz= -999.0;
+    tofdx=track->GetTOFsignalDx();
+    tofdz=track->GetTOFsignalDz();
+
     // Fill Tree
     (*fDebugTree) << "PIDdebug"
                   << "centrality="          << centrality
@@ -535,7 +541,7 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
                   << "nclustersITS="        << nclustersITS
                   << "nclusters="           << nclustersTRD
                   << "chi2matching="        << chi2matching
-                 << "chi2PerClusterITS="   << chi2PerClusterITS
+      << "chi2PerClusterITS="   << chi2PerClusterITS
                   << "its0="                << hasClusterITS[0]
                   << "its1="                << hasClusterITS[1]
                   << "its2="                << hasClusterITS[2]
@@ -548,18 +554,18 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
                   << "trd3="                << hasTrackletTRD[3]
                   << "trd4="                << hasTrackletTRD[4]
                   << "trd5="                << hasTrackletTRD[5]
-                 << "TRDdEdxl0="           << trddEdxSum[0]
-                 << "TRDdEdxl1="           << trddEdxSum[1]
-                 << "TRDdEdxl2="           << trddEdxSum[2]
-                 << "TRDdEdxl3="           << trddEdxSum[3]
-                 << "TRDdEdxl4="           << trddEdxSum[4]
-                 << "TRDdEdxl5="           << trddEdxSum[5]
+            << "TRDdEdxl0="           << trddEdxSum[0]
+            << "TRDdEdxl1="           << trddEdxSum[1]
+            << "TRDdEdxl2="           << trddEdxSum[2]
+            << "TRDdEdxl3="           << trddEdxSum[3]
+            << "TRDdEdxl4="           << trddEdxSum[4]
+            << "TRDdEdxl5="           << trddEdxSum[5]
                   << "TOFsigmaEl="          << nSigmaTOF
                   << "TPCsigmaEl="          << nSigmaTPC
                   << "TPCdEdx="             << tPCdEdx
                   << "TRDlikeEl="           << likeEleTRD
                   << "TRDlikeEln="          << likeEleTRDn
-                 << "trdtruncmean1="       << trdtruncmean1
+            << "trdtruncmean1="       << trdtruncmean1
                   << "trdtruncmean2="       << trdtruncmean2
                   << "dcaR="                << b[0]
                   << "dcaZ="                << b[1]
@@ -573,17 +579,19 @@ void AliHFEdebugTreeTask::UserExec(Option_t *){
                   << "hfedcacovZ="          << hfebCov[2]
                   << "vx="                  << vtx[0]
                   << "vy="                  << vtx[1]
-                  << "vz="                  << vtx[2] 
-                 << "ncontrib="            << ncontrib
-                 << "mesonID="             << mesonID
-                 << "eR="                  << eR
-                 << "mesonR="              << mesonR
-                 << "eZ="                  << eZ
-                 << "mesonZ="              << mesonZ
-                 << "unique="              << unique
-                 << "mesonunique="         << mesonunique
-                 << "bgcategory="          << bgcategory
-                 << "mesonpt="             << mesonPt
+                  << "vz="                  << vtx[2]
+            << "tofdx="                << tofdx
+            << "tofdz="                << tofdz
+            << "ncontrib="            << ncontrib
+            << "mesonID="             << mesonID
+            << "eR="                  << eR
+            << "mesonR="              << mesonR
+            << "eZ="                  << eZ
+            << "mesonZ="              << mesonZ
+            << "unique="              << unique
+            << "mesonunique="         << mesonunique
+            << "bgcategory="          << bgcategory
+            << "mesonpt="             << mesonPt
                   << "mesonMomPdg="         << mesonMomPdg
                   << "mesonGMomPdg="         << mesonGMomPdg
                   << "mesonGGMomPdg="         << mesonGGMomPdg
@@ -643,18 +651,18 @@ Int_t AliHFEdebugTreeTask::GetElecSourceMC(TParticle * const mcpart)
   TParticle *partMotherCopy = mctrack->Particle();
   Int_t maPdgcode = partMother->GetPdgCode();
 
-   // if the mother is charmed hadron  
-   if ( (int(abs(maPdgcode)/100.)%10) == AliHFEmcQA::kCharm || (int(abs(maPdgcode)/1000.)%10) == AliHFEmcQA::kCharm ) {
+  // if the mother is charmed hadron  
+  if ( (int(abs(maPdgcode)/100.)%10) == AliHFEmcQA::kCharm || (int(abs(maPdgcode)/1000.)%10) == AliHFEmcQA::kCharm ) {
 
-     for (Int_t i=0; i<fNparents; i++){
+    for (Int_t i=0; i<fNparents; i++){
         if (abs(maPdgcode)==fParentSelect[0][i]){
           isFinalOpenCharm = kTRUE;
         }
-     }
-     if (!isFinalOpenCharm) return -1;
+    }
+    if (!isFinalOpenCharm) return -1;
 
-     // iterate until you find B hadron as a mother or become top ancester 
-     for (Int_t i=1; i<fgkMaxIter; i++){
+    // iterate until you find B hadron as a mother or become top ancester 
+    for (Int_t i=1; i<fgkMaxIter; i++){
 
         Int_t jLabel = partMother->GetFirstMother();
         if (jLabel == -1){
@@ -672,84 +680,84 @@ Int_t AliHFEdebugTreeTask::GetElecSourceMC(TParticle * const mcpart)
         Int_t grandMaPDG = grandMa->GetPdgCode();
 
         for (Int_t j=0; j<fNparents; j++){
-           if (abs(grandMaPDG)==fParentSelect[1][j]){
-             origin = AliHFEmcQA::kBeautyCharm;
-             return origin;
-           }
+          if (abs(grandMaPDG)==fParentSelect[1][j]){
+            origin = AliHFEmcQA::kBeautyCharm;
+            return origin;
+          }
         }
 
         partMother = grandMa;
-     } // end of iteration 
-   } // end of if
-   else if ( (int(abs(maPdgcode)/100.)%10) == AliHFEmcQA::kBeauty || (int(abs(maPdgcode)/1000.)%10) == AliHFEmcQA::kBeauty ) {
-     for (Int_t i=0; i<fNparents; i++){
+    } // end of iteration 
+  } // end of if
+  else if ( (int(abs(maPdgcode)/100.)%10) == AliHFEmcQA::kBeauty || (int(abs(maPdgcode)/1000.)%10) == AliHFEmcQA::kBeauty ) {
+    for (Int_t i=0; i<fNparents; i++){
         if (abs(maPdgcode)==fParentSelect[1][i]){
           origin = AliHFEmcQA::kDirectBeauty;
           return origin;
         }
-     }
-   } // end of if
-   else if ( abs(maPdgcode) == 22 ) { //conversion
-
-     tmpMomLabel = partMotherCopy->GetFirstMother();
-     if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(tmpMomLabel))))) return -1;
-     partMother = mctrack->Particle();
-     maPdgcode = partMother->GetPdgCode();
-     if ( abs(maPdgcode) == 111 ) {
-       origin = AliHFEmcQA::kGammaPi0;
-       return origin;
-     
-     else if ( abs(maPdgcode) == 221 ) {
-       origin = AliHFEmcQA::kGammaEta;
-       return origin;
-     
-     else if ( abs(maPdgcode) == 223 ) {
-       origin = AliHFEmcQA::kGammaOmega;
-       return origin;
-     
-     else if ( abs(maPdgcode) == 333 ) {
-       origin = AliHFEmcQA::kGammaPhi;
-       return origin;
-     }
-     else if ( abs(maPdgcode) == 331 ) {
-       origin = AliHFEmcQA::kGammaEtaPrime;
-       return origin; 
-     }
-     else if ( abs(maPdgcode) == 113 ) {
-       origin = AliHFEmcQA::kGammaRho0;
-       return origin;
-     }
-     else origin = AliHFEmcQA::kElse;
-     //origin = kGamma; // finer category above
-     return origin;
-
-   } // end of if
-   else if ( abs(maPdgcode) == 111 ) {
-     origin = AliHFEmcQA::kPi0;
-     return origin;
-   } // end of if
-   else if ( abs(maPdgcode) == 221 ) {
-     origin = AliHFEmcQA::kEta;
-     return origin;
-   } // end of if
-   else if ( abs(maPdgcode) == 223 ) {
-     origin = AliHFEmcQA::kOmega;
-     return origin;
-   } // end of if
-   else if ( abs(maPdgcode) == 333 ) {
-     origin = AliHFEmcQA::kPhi;
-     return origin;
-   } // end of if
-   else if ( abs(maPdgcode) == 331 ) {
-     origin = AliHFEmcQA::kEtaPrime;
-     return origin;
-   } // end of if
-   else if ( abs(maPdgcode) == 113 ) {
-     origin = AliHFEmcQA::kRho0;
-     return origin;
-   } // end of if
-   else{ 
+    }
+  } // end of if
+  else if ( abs(maPdgcode) == 22 ) { //conversion
+
+    tmpMomLabel = partMotherCopy->GetFirstMother();
+    if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(tmpMomLabel))))) return -1;
+    partMother = mctrack->Particle();
+    maPdgcode = partMother->GetPdgCode();
+    if ( abs(maPdgcode) == 111 ) {
+      origin = AliHFEmcQA::kGammaPi0;
+      return origin;
+    } 
+    else if ( abs(maPdgcode) == 221 ) {
+      origin = AliHFEmcQA::kGammaEta;
+      return origin;
+    } 
+    else if ( abs(maPdgcode) == 223 ) {
+      origin = AliHFEmcQA::kGammaOmega;
+      return origin;
+    } 
+    else if ( abs(maPdgcode) == 333 ) {
+      origin = AliHFEmcQA::kGammaPhi;
+      return origin;
+    }
+    else if ( abs(maPdgcode) == 331 ) {
+      origin = AliHFEmcQA::kGammaEtaPrime;
+      return origin; 
+    }
+    else if ( abs(maPdgcode) == 113 ) {
+      origin = AliHFEmcQA::kGammaRho0;
+      return origin;
+    }
+    else origin = AliHFEmcQA::kElse;
+    //origin = kGamma; // finer category above
+    return origin;
+
+  } // end of if
+  else if ( abs(maPdgcode) == 111 ) {
+    origin = AliHFEmcQA::kPi0;
+    return origin;
+  } // end of if
+  else if ( abs(maPdgcode) == 221 ) {
+    origin = AliHFEmcQA::kEta;
+    return origin;
+  } // end of if
+  else if ( abs(maPdgcode) == 223 ) {
+    origin = AliHFEmcQA::kOmega;
+    return origin;
+  } // end of if
+  else if ( abs(maPdgcode) == 333 ) {
+    origin = AliHFEmcQA::kPhi;
+    return origin;
+  } // end of if
+  else if ( abs(maPdgcode) == 331 ) {
+    origin = AliHFEmcQA::kEtaPrime;
+    return origin;
+  } // end of if
+  else if ( abs(maPdgcode) == 113 ) {
+    origin = AliHFEmcQA::kRho0;
+    return origin;
+  } // end of if
+  else{ 
     origin = AliHFEmcQA::kElse;
-   }
-   return origin;
+  }
+  return origin;
 }
index 8a518ff818292d6be73bc23abc8ddb600e4c1a20..81664352529933813348e80c8a14898004f43af4 100644 (file)
@@ -756,8 +756,10 @@ Bool_t AliHFEextraCuts::IsKinkDaughter(AliVTrack *track){
 //______________________________________________________
 Bool_t AliHFEextraCuts::IsKinkMother(AliVTrack *track){
   //
-  // Is kink Mother
+  // Is kink Mother: only for ESD since need to loop over vertices for AOD
   //
+  //
+
   TClass *type = track->IsA();
   if(type == AliESDtrack::Class()){
     AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
@@ -765,27 +767,6 @@ Bool_t AliHFEextraCuts::IsKinkMother(AliVTrack *track){
     if(esdtrack->GetKinkIndex(0)!=0) return kTRUE;
     else return kFALSE;
   }
-  else if(type == AliAODTrack::Class()){
-    AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
-    if(aodtrack){
-      //printf("find a track\n");
-      AliAODVertex *aodvertex = aodtrack->GetProdVertex();
-      if(!aodvertex) return kFALSE;
-      Int_t n = aodvertex->GetNDaughters();
-      //printf("Number of daughters %d\n",n);
-      for(Int_t k=0; k < n; k++) {
-       AliAODTrack *aodtrackdaughter = (AliAODTrack *) aodvertex->GetDaughter(k);
-       if(aodtrackdaughter){
-         AliAODVertex *aodvertexdaughter = aodtrackdaughter->GetProdVertex();
-         if(!aodvertexdaughter) continue;
-         //if(aodvertexdaughter->GetType()==AliAODVertex::kKink) printf("Daughter of type %d\n",(Int_t)aodvertexdaughter->GetType());
-         if(aodvertexdaughter->GetType()==AliAODVertex::kKink) return kTRUE;
-       }
-      }
-      return kFALSE;
-    }
-    else return kFALSE;
-  }
 
   return kFALSE;
 
index adc0ca32ca3a58e69f50cf23f0be7a409aafe1bd..9d8646d57f6fc6f424220cb01af46f98da5f96f9 100644 (file)
@@ -92,6 +92,8 @@ AliHFEspectrum::AliHFEspectrum(const char *name):
   fNumberOfIterations(5),
   fChargeChoosen(kAllCharge),
   fNCentralityBinAtTheEnd(0),
+  fTestCentralityLow(-1),
+  fTestCentralityHigh(-1),
   fHadronEffbyIPcut(NULL),
   fConversionEffbgc(NULL),
   fNonHFEEffbgc(NULL),      
@@ -116,6 +118,7 @@ AliHFEspectrum::AliHFEspectrum(const char *name):
           fEfficiencyesdTOFPIDD[k] = 0;
           fEfficiencyIPCharmD[k] = 0;     
           fEfficiencyIPBeautyD[k] = 0;    
+          fEfficiencyIPBeautyesdD[k] = 0;
           fEfficiencyIPConversionD[k] = 0;
           fEfficiencyIPNonhfeD[k] = 0;   
 
@@ -125,6 +128,7 @@ AliHFEspectrum::AliHFEspectrum(const char *name):
          fBeautyEff[k] = 0;
          fEfficiencyCharmSigD[k] = 0;
           fEfficiencyBeautySigD[k] = 0;
+          fEfficiencyBeautySigesdD[k] = 0;
       }
   }
   memset(fEtaRange, 0, sizeof(Double_t) * 2);
@@ -221,8 +225,8 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
   AliCFContainer *contaminationcontainer = datahfecontainer->GetCFContainer("hadronicBackground");
   if((!datacontainer) || (!contaminationcontainer)) return kFALSE;
 
-  AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims, -1, fChargeChoosen);
-  AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims, -1, fChargeChoosen);
+  AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
+  AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
   if((!datacontainerD) || (!contaminationcontainerD)) return kFALSE;
 
   SetContainer(datacontainerD,AliHFEspectrum::kDataContainer);
@@ -265,8 +269,8 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
              if(fBeamType==1)
              {
               
-                 fConvSourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(convtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr+1);
-                 fNonHFESourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(nonHFEtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr+1);
+               fConvSourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(convtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr+1,icentr+1);
+               fNonHFESourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(nonHFEtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr+1,icentr+1);
              }
 //           if((!fConvSourceContainer[iSource][iLevel][icentr])||(!fNonHFESourceContainer[iSource][iLevel])) return kFALSE;
          }
@@ -283,8 +287,8 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
   
   Int_t source = -1;
   if(!fInclusiveSpectrum) source = 1; //beauty
-  AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source, fChargeChoosen);
-  AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen);
+  AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
+  AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
   if((!mccontaineresdD) || (!mccontainermcD)) return kFALSE;
   SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerMC);
   SetContainer(mccontaineresdD,AliHFEspectrum::kMCContainerESD);
@@ -295,23 +299,15 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
    mccontainermcD = GetSlicedContainer(mccontainermcbg, fNbDimensions, dims, source, fChargeChoosen);
    SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerCharmMC);
 
-   SetParameterizedEff(mccontainermc, mccontainermcbg, mccontaineresd, mccontaineresdbg, dims);
-
    if(!fNonHFEsyst){
      AliCFContainer *nonHFEweightedContainerD = GetSlicedContainer(nonHFEweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
      SetContainer(nonHFEweightedContainerD,AliHFEspectrum::kMCWeightedContainerNonHFEESD);
      AliCFContainer *convweightedContainerD = GetSlicedContainer(convweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
      SetContainer(convweightedContainerD,AliHFEspectrum::kMCWeightedContainerConversionESD);
+   }
 
-     if(fBeamType==0){
-      AliCFEffGrid  *nonHFEEffGrid = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCWeightedContainerNonHFEESD),1,0);
-      fNonHFEEffbgc = (TH1D *) nonHFEEffGrid->Project(0);
-
-      AliCFEffGrid  *conversionEffGrid = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCWeightedContainerConversionESD),1,0);
-      fConversionEffbgc = (TH1D *) conversionEffGrid->Project(0);
-     }
+   SetParameterizedEff(mccontainermc, mccontainermcbg, mccontaineresd, mccontaineresdbg, dims);
 
-   }
   }
   // MC container: correlation matrix
   THnSparseF *mccorrelation = 0x0;
@@ -327,7 +323,7 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
   else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID"); // we confirmed that we get same result by using it instead of correlationstepafterDE
   //else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterDE");
   if(!mccorrelation) return kFALSE;
-  THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, dims);
+  THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, dims,fTestCentralityLow,fTestCentralityHigh);
   if(!mccorrelationD) {
     printf("No correlation\n");
     return kFALSE;
@@ -338,7 +334,7 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
   if(v0hfecontainer) {
     AliCFContainer *containerV0 = v0hfecontainer->GetCFContainer("taggedTrackContainerReco");
     if(!containerV0) return kFALSE;
-    AliCFContainer *containerV0Electron = GetSlicedContainer(containerV0, fNbDimensions, dims, AliPID::kElectron);
+    AliCFContainer *containerV0Electron = GetSlicedContainer(containerV0, fNbDimensions, dims, AliPID::kElectron,fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
     if(!containerV0Electron) return kFALSE;
     SetContainer(containerV0Electron,AliHFEspectrum::kDataContainerV0);
   }
@@ -387,6 +383,11 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
     if(fWriteToFile) ccontaminationspectrum->SaveAs("contaminationspectrum.eps");
   }
 
+  TFile *file = TFile::Open("tests.root","recreate");
+  datacontainerD->Write("data");
+  mccontainermcD->Write("mcefficiency");
+  mccorrelationD->Write("correlationmatrix");
+  file->Close();
 
   return kTRUE;
 }
@@ -933,16 +934,19 @@ Bool_t AliHFEspectrum::CorrectBeauty(Bool_t subtractcontamination){
          {
              correctedspectrum->GetAxis(0)->SetRange(i+1,i+1);
              correctedspectrumDc[i] = Normalize(correctedspectrum,i);
-             correctedspectrumDc[i]->SetTitle(Form("UnfoldingCorrectedSpectrum_%i",i));
-             correctedspectrumDc[i]->SetName(Form("UnfoldingCorrectedSpectrum_%i",i));
+              if(correctedspectrumDc[i]){
+                correctedspectrumDc[i]->SetTitle(Form("UnfoldingCorrectedSpectrum_%i",i));
+                correctedspectrumDc[i]->SetName(Form("UnfoldingCorrectedSpectrum_%i",i));
+                correctedspectrumDc[i]->Write();
+              }
              alltogetherCorrection->GetAxis(0)->SetRange(i+1,i+1);
              alltogetherspectrumDc[i] = Normalize(alltogetherCorrection,i);
-             alltogetherspectrumDc[i]->SetTitle(Form("AlltogetherSpectrum_%i",i));
-             alltogetherspectrumDc[i]->SetName(Form("AlltogetherSpectrum_%i",i));
-             correctedspectrumDc[i]->Write();
-             alltogetherspectrumDc[i]->Write();
-             
-
+              if(alltogetherspectrumDc[i]){
+                alltogetherspectrumDc[i]->SetTitle(Form("AlltogetherSpectrum_%i",i));
+                alltogetherspectrumDc[i]->SetName(Form("AlltogetherSpectrum_%i",i));
+                alltogetherspectrumDc[i]->Write();
+              }
+           
              TH1D *centrcrosscheck = correctedspectrum->Projection(0);
              centrcrosscheck->SetTitle(Form("centrality_%i",i));
              centrcrosscheck->SetName(Form("centrality_%i",i));
@@ -1023,6 +1027,7 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
   AliCFDataGrid *dataspectrumbeforesubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
   dataspectrumbeforesubstraction->SetName("dataspectrumbeforesubstraction"); 
  
+
   // Background Estimate
   AliCFContainer *backgroundContainer = GetContainer(kBackgroundData);
   if(!backgroundContainer){
@@ -1035,14 +1040,30 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
 
   if(!fInclusiveSpectrum){
     //Background subtraction for IP analysis
+
+    TH1D *incElecCent[kCentrality-1];
+    TH1D *charmCent[kCentrality-1];
+    TH1D *convCent[kCentrality-1];
+    TH1D *nonHFECent[kCentrality-1]; 
+    TH1D *subtractedCent[kCentrality-1];
     TH1D *measuredTH1Draw = (TH1D *) dataspectrumbeforesubstraction->Project(ptpr);
     CorrectFromTheWidth(measuredTH1Draw);
-    TCanvas *rawspectra = new TCanvas("rawspectra","rawspectra",600,500);
+    if(fBeamType==1){
+      THnSparseF* sparseIncElec = (THnSparseF *) dataspectrumbeforesubstraction->GetGrid();
+      for(Int_t icent =  1; icent < kCentrality-1; icent++){
+        sparseIncElec->GetAxis(0)->SetRange(icent,icent);
+        incElecCent[icent-1] = (TH1D *) sparseIncElec->Projection(ptpr);
+        CorrectFromTheWidth(incElecCent[icent-1]);
+      }
+    }
+    TCanvas *rawspectra = new TCanvas("rawspectra","rawspectra",500,400);
     rawspectra->cd();
     rawspectra->SetLogy();
-    TLegend *lRaw = new TLegend(0.65,0.65,0.95,0.95);
+    gStyle->SetOptStat(0);
+    TLegend *lRaw = new TLegend(0.55,0.55,0.85,0.85);
     measuredTH1Draw->SetMarkerStyle(20);
     measuredTH1Draw->Draw();
+    measuredTH1Draw->GetXaxis()->SetRangeUser(0.0,7.9);
     lRaw->AddEntry(measuredTH1Draw,"measured raw spectrum");
     TH1D* htemp;
     Int_t* bins=new Int_t[2];
@@ -1090,6 +1111,14 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
       lRaw->AddEntry(charmbg,"charm elecs");
       // subtract charm background
       spectrumSubtracted->Add(charmbgContainer,-1.0);
+      if(fBeamType==1){
+        THnSparseF* sparseCharmElec = (THnSparseF *) charmbgContainer->GetGrid();
+        for(Int_t icent =  1; icent < kCentrality-1; icent++){ 
+          sparseCharmElec->GetAxis(0)->SetRange(icent,icent);
+          charmCent[icent-1] = (TH1D *) sparseCharmElec->Projection(ptpr);
+          CorrectFromTheWidth(charmCent[icent-1]);
+        }
+      }
     }
     if(fIPanaConversionBgSubtract){
       // Conversion background
@@ -1104,7 +1133,14 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
       lRaw->AddEntry(conversionbg,"conversion elecs");
       // subtract conversion background
       spectrumSubtracted->Add(conversionbgContainer,-1.0);
-      printf("Conversion background subtraction is preliminary!\n");
+      if(fBeamType==1){
+        THnSparseF* sparseconvElec = (THnSparseF *) conversionbgContainer->GetGrid();
+        for(Int_t icent =  1; icent < kCentrality-1; icent++){
+          sparseconvElec->GetAxis(0)->SetRange(icent,icent);
+          convCent[icent-1] = (TH1D *) sparseconvElec->Projection(ptpr);
+          CorrectFromTheWidth(convCent[icent-1]);
+        }
+      }
     }
     if(fIPanaNonHFEBgSubtract){
       // NonHFE background
@@ -1119,8 +1155,16 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
       lRaw->AddEntry(nonhfebg,"non-HF elecs");
       // subtract Dalitz/dielectron background
       spectrumSubtracted->Add(nonHFEbgContainer,-1.0);
-      printf("Non HFE background subtraction is preliminary!\n");
+      if(fBeamType==1){
+        THnSparseF* sparseNonHFEElec = (THnSparseF *) nonHFEbgContainer->GetGrid();
+        for(Int_t icent =  1; icent < kCentrality-1; icent++){
+          sparseNonHFEElec->GetAxis(0)->SetRange(icent,icent);
+          nonHFECent[icent-1] = (TH1D *) sparseNonHFEElec->Projection(ptpr);
+          CorrectFromTheWidth(nonHFECent[icent-1]);
+        }
+      }
     }
+
     TH1D *rawbgsubtracted = (TH1D *) spectrumSubtracted->Project(ptpr);
     CorrectFromTheWidth(rawbgsubtracted);
     rawbgsubtracted->SetMarkerStyle(24);
@@ -1128,6 +1172,49 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
     lRaw->AddEntry(rawbgsubtracted,"subtracted raw spectrum");
     rawbgsubtracted->Draw("samep");
     lRaw->Draw("SAME");
+    gPad->SetGrid();
+    //rawspectra->SaveAs("rawspectra.eps");
+    
+    if(fBeamType==1){
+      THnSparseF* sparseSubtracted = (THnSparseF *) spectrumSubtracted->GetGrid();
+      for(Int_t icent =  1; icent < kCentrality-1; icent++){
+        sparseSubtracted->GetAxis(0)->SetRange(icent,icent);
+        subtractedCent[icent-1] = (TH1D *) sparseSubtracted->Projection(ptpr);
+        CorrectFromTheWidth(subtractedCent[icent-1]);
+      }
+    
+      TLegend *lCentRaw = new TLegend(0.55,0.55,0.85,0.85);
+      TCanvas *centRaw = new TCanvas("centRaw","centRaw",1000,800);
+      centRaw->Divide(3,3);
+      for(Int_t icent = 1; icent < kCentrality-1; icent++){
+        centRaw->cd(icent);
+        gPad->SetLogx();
+        gPad->SetLogy();
+        incElecCent[icent-1]->GetXaxis()->SetRangeUser(0.4,8.);
+        incElecCent[icent-1]->Draw("p");
+        incElecCent[icent-1]->SetMarkerColor(1);
+        incElecCent[icent-1]->SetMarkerStyle(20);
+        charmCent[icent-1]->Draw("samep");
+        charmCent[icent-1]->SetMarkerColor(3);
+        charmCent[icent-1]->SetMarkerStyle(20);
+        convCent[icent-1]->Draw("samep");
+        convCent[icent-1]->SetMarkerColor(4);
+        convCent[icent-1]->SetMarkerStyle(20);
+        nonHFECent[icent-1]->Draw("samep");
+        nonHFECent[icent-1]->SetMarkerColor(6);
+        nonHFECent[icent-1]->SetMarkerStyle(20);
+        subtractedCent[icent-1]->Draw("samep");
+        subtractedCent[icent-1]->SetMarkerStyle(24);
+        if(icent == 1){
+          lCentRaw->AddEntry(incElecCent[0],"inclusive electron spectrum");
+          lCentRaw->AddEntry(charmCent[0],"charm elecs");
+          lCentRaw->AddEntry(convCent[0],"conversion elecs");
+          lCentRaw->AddEntry(nonHFECent[0],"non-HF elecs");
+          lCentRaw->AddEntry(subtractedCent[0],"subtracted electron spectrum");
+          lCentRaw->Draw("SAME");
+        }
+      }
+    }
 
     delete[] bins; 
 
@@ -1345,7 +1432,6 @@ AliCFDataGrid* AliHFEspectrum::GetCharmBackground(){
 
   if(fBeamType==1)
   {
-      //charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(0);
       bins[0]=12;
       charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(1);
       bins[1]=charmbgaftertofpid->GetNbinsX();
@@ -1356,24 +1442,41 @@ AliCFDataGrid* AliHFEspectrum::GetCharmBackground(){
   ipWeightedCharmContainer->SetGrid(GetPIDxIPEff(0)); // get charm efficiency
   TH1D* parametrizedcharmpidipeff = (TH1D*)ipWeightedCharmContainer->Project(ptpr);
 
-  if(fBeamType==0)charmBackgroundGrid->Multiply(ipWeightedCharmContainer,evtnorm);
-  Double_t contents[2];
-  AliCFDataGrid *eventTemp = new AliCFDataGrid("eventTemp","eventTemp",nDim,bins);
-  if(fBeamType==1)
-  {
-      for(Int_t kCentr=0;kCentr<bins[0];kCentr++)
+  charmBackgroundGrid->Multiply(ipWeightedCharmContainer,1.);
+
+  Int_t *nBinpp=new Int_t[1];
+  Int_t* binspp=new Int_t[1];
+  binspp[0]=charmbgaftertofpid->GetNbinsX();  // number of pt bins
+
+  Int_t *nBinPbPb=new Int_t[2];
+  Int_t* binsPbPb=new Int_t[2];
+  binsPbPb[1]=charmbgaftertofpid->GetNbinsX();  // number of pt bins
+  binsPbPb[0]=12;
+
+  Int_t looppt=binspp[0];
+  if(fBeamType==1) looppt=binsPbPb[1];
+
+  for(Long_t iBin=1; iBin<= looppt;iBin++){
+      if(fBeamType==0)
       {
-         for(Int_t kpt=0;kpt<bins[1];kpt++)
-         {
-             Double_t evtnormPbPb=0;
-             if(fNMCbgEvents[kCentr]) evtnormPbPb= double(fNEvents[kCentr])/double(fNMCbgEvents[kCentr]);
-             contents[0]=kCentr;
-             contents[1]=kpt;
-              eventTemp->Fill(contents,evtnormPbPb);
-         }
+          nBinpp[0]=iBin;
+          charmBackgroundGrid->SetElementError(nBinpp, charmBackgroundGrid->GetElementError(nBinpp)*evtnorm);
+          charmBackgroundGrid->SetElement(nBinpp,charmBackgroundGrid->GetElement(nBinpp)*evtnorm);
+      }
+      if(fBeamType==1)
+      {
+          // loop over centrality
+          for(Long_t iiBin=1; iiBin<= binsPbPb[0];iiBin++){
+              nBinPbPb[0]=iiBin;
+              nBinPbPb[1]=iBin;
+              Double_t evtnormPbPb=0;
+              if(fNMCbgEvents[iiBin-1]) evtnormPbPb= double(fNEvents[iiBin-1])/double(fNMCbgEvents[iiBin-1]);
+              charmBackgroundGrid->SetElementError(nBinPbPb, charmBackgroundGrid->GetElementError(nBinPbPb)*evtnormPbPb);
+              charmBackgroundGrid->SetElement(nBinPbPb,charmBackgroundGrid->GetElement(nBinPbPb)*evtnormPbPb);
+          }
       }
-   charmBackgroundGrid->Multiply(eventTemp,1);
   }
+
   TH1D* charmbgafteripcut = (TH1D*)charmBackgroundGrid->Project(ptpr);
 
   AliCFDataGrid *weightedCharmContainer = new AliCFDataGrid("weightedCharmContainer","weightedCharmContainer",nDim,bins);
@@ -1498,7 +1601,6 @@ AliCFDataGrid* AliHFEspectrum::GetConversionBackground(){
   }
   
   Int_t stepbackground = 3;
-  if(TMath::Abs(fEtaRange[0]) < 0.5) stepbackground = 4;
 
   AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ConversionBgGrid","ConversionBgGrid",*backgroundContainer,stepbackground);
   Int_t *nBinpp=new Int_t[1];
@@ -1578,7 +1680,6 @@ AliCFDataGrid* AliHFEspectrum::GetNonHFEBackground(){
   
   
   Int_t stepbackground = 3;
-  if(TMath::Abs(fEtaRange[0]) < 0.5) stepbackground = 4;
 
   AliCFDataGrid *backgroundGrid = new AliCFDataGrid("NonHFEBgGrid","NonHFEBgGrid",*backgroundContainer,stepbackground);
   Int_t *nBinpp=new Int_t[1];
@@ -1964,7 +2065,7 @@ TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
          bins[0]=35;
 
          AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
-         beffContainer->SetGrid(GetBeautyIPEff());
+         beffContainer->SetGrid(GetBeautyIPEff(kTRUE));
          efficiencyD->Multiply(beffContainer,1);
       }
   }
@@ -1973,7 +2074,6 @@ TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
   // Unfold 
   
   AliCFUnfolding unfolding("unfolding","",fNbDimensions,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse);
-  //unfolding.SetUseCorrelatedErrors();
   if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
   unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
   if(fSetSmoothing) unfolding.UseSmoothing();
@@ -2068,7 +2168,7 @@ AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpe
          bins[0]=35;
 
          AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
-         beffContainer->SetGrid(GetBeautyIPEff());
+         beffContainer->SetGrid(GetBeautyIPEff(kFALSE));
          efficiencyD->Multiply(beffContainer,1);
       }
   }
@@ -2368,7 +2468,7 @@ AliCFContainer *AliHFEspectrum::GetContainer(AliHFEspectrum::CFContainer_t type)
   return dynamic_cast<AliCFContainer *>(fCFContainers->At(type));
 }
 //____________________________________________________________
-AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions,Int_t source,Chargetype_t charge, Int_t centrality) {
+AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions,Int_t source,Chargetype_t charge, Int_t centralitylow, Int_t centralityhigh) {
   //
   // Slice bin for a given source of electron
   // nDim is the number of dimension the corrections are done
@@ -2414,10 +2514,19 @@ AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, In
       AliInfo(Form("Normalization done in eta range [%f,%f]\n", fEtaRangeNorm[0], fEtaRangeNorm[0]));
     }
     if(ivar == 5){
-       if((centrality>= 0) && (centrality<container->GetNBins(ivar))) {
-           varMin[ivar] = binLimits[centrality];
-           varMax[ivar] = binLimits[centrality];
+       if((centralitylow>= 0) && (centralitylow<container->GetNBins(ivar)) && (centralityhigh>= 0) && (centralityhigh<container->GetNBins(ivar))) {
+           varMin[ivar] = binLimits[centralitylow];
+           varMax[ivar] = binLimits[centralityhigh];
+
+           TAxis *axistest = container->GetAxis(5,0);
+           printf("GetSlicedContainer: Number of bin in centrality direction %d\n",axistest->GetNbins());
+           printf("Project from %f to %f\n",binLimits[centralitylow],binLimits[centralityhigh]);
+           Double_t lowcentrality = axistest->GetBinLowEdge(axistest->FindBin(binLimits[centralitylow]));
+           Double_t highcentrality = axistest->GetBinUpEdge(axistest->FindBin(binLimits[centralityhigh]));
+           printf("GetSlicedContainer: Low centrality %f and high centrality %f\n",lowcentrality,highcentrality);
+       
        }
+
     }
 
 
@@ -2433,7 +2542,7 @@ AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, In
 }
 
 //_________________________________________________________________________
-THnSparseF *AliHFEspectrum::GetSlicedCorrelation(THnSparseF *correlationmatrix, Int_t nDim, Int_t *dimensions) const {
+THnSparseF *AliHFEspectrum::GetSlicedCorrelation(THnSparseF *correlationmatrix, Int_t nDim, Int_t *dimensions, Int_t centralitylow, Int_t centralityhigh) const {
   //
   // Slice correlation
   //
@@ -2444,6 +2553,43 @@ THnSparseF *AliHFEspectrum::GetSlicedCorrelation(THnSparseF *correlationmatrix,
     AliError("Problem in the dimensions");
     return NULL;
   }
+  
+  // Cut in centrality is centrality > -1
+  if((centralitylow >=0) && (centralityhigh >=0)) {
+
+    TAxis *axiscentrality0 = correlationmatrix->GetAxis(5);
+    TAxis *axiscentrality1 = correlationmatrix->GetAxis(5+((Int_t)(ndimensions/2.)));
+
+    Int_t bins0 = axiscentrality0->GetNbins();
+    Int_t bins1 = axiscentrality1->GetNbins();
+    
+    printf("Number of centrality bins: %d and %d\n",bins0,bins1);
+    if(bins0 != bins1) {
+      AliError("Problem in the dimensions");
+      return NULL;
+    }
+    
+    if((centralitylow>= 0) && (centralitylow<bins0) && (centralityhigh>= 0) && (centralityhigh<bins0)) {
+      axiscentrality0->SetRangeUser(centralitylow,centralityhigh);
+      axiscentrality1->SetRangeUser(centralitylow,centralityhigh);
+
+      Double_t lowcentrality0 = axiscentrality0->GetBinLowEdge(axiscentrality0->FindBin(centralitylow));
+      Double_t highcentrality0 = axiscentrality0->GetBinUpEdge(axiscentrality0->FindBin(centralityhigh));
+      Double_t lowcentrality1 = axiscentrality1->GetBinLowEdge(axiscentrality1->FindBin(centralitylow));
+      Double_t highcentrality1 = axiscentrality1->GetBinUpEdge(axiscentrality1->FindBin(centralityhigh));
+      printf("GetCorrelation0: Low centrality %f and high centrality %f\n",lowcentrality0,highcentrality0);
+      printf("GetCorrelation1: Low centrality %f and high centrality %f\n",lowcentrality1,highcentrality1);
+
+      TCanvas * ctestcorrelation = new TCanvas("testcorrelationprojection","testcorrelationprojection",1000,700);
+      ctestcorrelation->cd(1);
+      TH2D* projection = (TH2D *) correlationmatrix->Projection(5,5+((Int_t)(ndimensions/2.)));
+      projection->Draw("colz");
+
+    }
+    
+  }
+
+
   Int_t ndimensionsContainer = (Int_t) ndimensions/2;
   //printf("Number of dimension %d container\n",ndimensionsContainer);
 
@@ -2571,10 +2717,14 @@ THnSparse* AliHFEspectrum::GetCharmWeights(){
       loopcentr=nBinPbPb[0];
   }
 
+  // Weighting factor for pp
   Double_t weight[35]={0.859260, 0.872552, 0.847475, 0.823631, 0.839386, 0.874024, 0.916755, 0.942801, 0.965856, 0.933905, 0.933414, 0.931936, 0.847826, 0.810902, 0.796608, 0.727002, 0.659227, 0.583610, 0.549956, 0.512633, 0.472254, 0.412364, 0.353191, 0.319145, 0.305412, 0.290334, 0.269863, 0.254646, 0.230245, 0.200859, 0.275953, 0.276271, 0.227332, 0.197004, 0.474385};
   
-  // Weighting factor for PbPb
-  //Double_t weight[35]={0.645016,  0.643397,  0.617149,  0.641176,  0.752285,  0.838097,  0.996226,  1.152757,  1.243257,  1.441421,  1.526796,  1.755632,  1.731234,  1.900269,  1.859628,  1.945138,  1.943707,  1.739451,  1.640120,  1.318674,  1.041654,  0.826493,  0.704605,  0.662040,  0.572361,  0.644030,  0.479850,  0.559513,  0.504044,  0.449495,  0.227605,  0.186836,  0.038681,  0.000000,  0.000000};  
+  // Weighting factor for PbPb (0-20%)
+  //Double_t weight[35]={0.641897,  0.640472,  0.615228,  0.650469,  0.737762,  0.847867,  1.009317,  1.158594,  1.307482,  1.476973,  1.551131,  1.677131,  1.785478,  1.888933,  2.017957,  2.074757,  1.926700,  1.869495,  1.546558,  1.222873,  1.160313,  0.903375,  0.799642,  0.706244,  0.705449,  0.599947,  0.719570,  0.499422,  0.703978,  0.477452,  0.325057,  0.093391,  0.096675,  0.000000,  0.000000};
+
+  // Weighting factor for PbPb (40-80%)
+  //Double_t weight[35]={0.181953,  0.173248,  0.166799,  0.182558,  0.206581,  0.236955,  0.279390,  0.329129,  0.365260,  0.423059,  0.452057,  0.482726,  0.462627,  0.537770,  0.584663,  0.579452,  0.587194,  0.499498,  0.443299,  0.398596,  0.376695,  0.322331,  0.260890,  0.374834,  0.249114,  0.310330,  0.287326,  0.243174,  0.758945,  0.138867,  0.170576,  0.107797,  0.011390,  0.000000,  0.000000};
 
   //points
   Double_t pt[1];
@@ -2641,13 +2791,13 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
 
    TF1 *fittofpid = new TF1("fittofpid","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,8.);
    TF1 *fipfit = new TF1("fipfit","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,8.);
-   TF1 *fipfit2 = new TF1("fipfit2","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,10.0);
+   TF1 *fipfitnonhfe = new TF1("fipfitnonhfe","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.3,10.0);
 
-   TCanvas * cefficiencyParam = new TCanvas("efficiencyParam","efficiencyParam",1200,600);
-   cefficiencyParam->Divide(2,1);
-   cefficiencyParam->cd(1);
+   TCanvas * cefficiencyParamtof = new TCanvas("efficiencyParamtof","efficiencyParamtof",600,600);
+   cefficiencyParamtof->cd();
 
    AliCFContainer *mccontainermcD = 0x0;
+   AliCFContainer *mccontaineresdD = 0x0;
    TH1D* efficiencysigTOFPIDD[nCentralitybinning];
    TH1D* efficiencyTOFPIDD[nCentralitybinning];
    TH1D* efficiencysigesdTOFPIDD[nCentralitybinning];
@@ -2751,13 +2901,16 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
    legtofeff->Draw("same");
 
 
-   cefficiencyParam->cd(2);
+   TCanvas * cefficiencyParamIP = new TCanvas("efficiencyParamIP","efficiencyParamIP",500,500);
+   cefficiencyParamIP->cd();
+   gStyle->SetOptStat(0);
+
    // IP cut efficiencies
-  
    for(int icentr=0; icentr<loopcentr; icentr++)  {
 
      AliCFContainer *charmCombined = 0x0; 
      AliCFContainer *beautyCombined = 0x0;
+     AliCFContainer *beautyCombinedesd = 0x0;
 
      printf("centrality printing %i \n",icentr);
 
@@ -2777,6 +2930,13 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
 
      beautyCombined = (AliCFContainer*)mccontainermcD->Clone("beautyCombined"); 
 
+     if(fBeamType==0) mccontaineresdD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen);
+     else mccontaineresdD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
+     AliCFEffGrid* efficiencyBeautySigesd = new AliCFEffGrid("efficiencyBeautySigesd","",*mccontaineresdD);
+     efficiencyBeautySigesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
+
+     beautyCombinedesd = (AliCFContainer*)mccontaineresdD->Clone("beautyCombinedesd");
+
      source = 0; //charm mb
      if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
      else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
@@ -2797,6 +2957,15 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
      AliCFEffGrid* efficiencyBeautyCombined = new AliCFEffGrid("efficiencyBeautyCombined","",*beautyCombined); 
      efficiencyBeautyCombined->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); 
 
+     if(fBeamType==0) mccontaineresdD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen);
+     else mccontaineresdD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
+     AliCFEffGrid* efficiencyBeautyesd = new AliCFEffGrid("efficiencyBeautyesd","",*mccontaineresdD);
+     efficiencyBeautyesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
+
+     beautyCombinedesd->Add(mccontaineresdD);
+     AliCFEffGrid* efficiencyBeautyCombinedesd = new AliCFEffGrid("efficiencyBeautyCombinedesd","",*beautyCombinedesd);
+     efficiencyBeautyCombinedesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1);
+
      source = 2; //conversion mb
      if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
      else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
@@ -2812,10 +2981,12 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
      if(fIPEffCombinedSamples){
        fEfficiencyCharmSigD[icentr] = (TH1D*)efficiencyCharmCombined->Project(ptpr); //signal enhenced + mb 
        fEfficiencyBeautySigD[icentr] = (TH1D*)efficiencyBeautyCombined->Project(ptpr); //signal enhenced + mb
+       fEfficiencyBeautySigesdD[icentr] = (TH1D*)efficiencyBeautyCombinedesd->Project(ptpr); //signal enhenced + mb
      }
      else{
        fEfficiencyCharmSigD[icentr] = (TH1D*)efficiencyCharmSig->Project(ptpr); //signal enhenced only
        fEfficiencyBeautySigD[icentr] = (TH1D*)efficiencyBeautySig->Project(ptpr); //signal enhenced only
+       fEfficiencyBeautySigesdD[icentr] = (TH1D*)efficiencyBeautySigesd->Project(ptpr); //signal enhenced only
      }
      fCharmEff[icentr] = (TH1D*)efficiencyCharm->Project(ptpr); //mb only
      fBeautyEff[icentr] = (TH1D*)efficiencyBeauty->Project(ptpr); //mb only
@@ -2824,6 +2995,14 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
 
    }
 
+   if(fBeamType==0){
+     AliCFEffGrid  *nonHFEEffGrid = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCWeightedContainerNonHFEESD),1,0);
+     fNonHFEEffbgc = (TH1D *) nonHFEEffGrid->Project(0);
+
+     AliCFEffGrid  *conversionEffGrid = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCWeightedContainerConversionESD),1,0);
+     fConversionEffbgc = (TH1D *) conversionEffGrid->Project(0);
+   }
+
    for(int icentr=0; icentr<loopcentr; icentr++)  {
      fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
      fipfit->SetLineColor(2);
@@ -2832,6 +3011,13 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
      if(fBeauty2ndMethod)fEfficiencyIPBeautyD[icentr] = fEfficiencyBeautySigD[0]->GetFunction("fipfit"); //why do we need this line?
      else fEfficiencyIPBeautyD[icentr] = fEfficiencyBeautySigD[icentr]->GetFunction("fipfit");
 
+     fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
+     fipfit->SetLineColor(6);
+     fEfficiencyBeautySigesdD[icentr]->Fit(fipfit,"R");
+     fEfficiencyBeautySigesdD[icentr]->GetYaxis()->SetTitle("Efficiency");
+     if(fBeauty2ndMethod)fEfficiencyIPBeautyesdD[icentr] = fEfficiencyBeautySigesdD[0]->GetFunction("fipfit"); //why do we need this line?
+     else fEfficiencyIPBeautyesdD[icentr] = fEfficiencyBeautySigesdD[icentr]->GetFunction("fipfit");
+
      fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
      fipfit->SetLineColor(1);
      fEfficiencyCharmSigD[icentr]->Fit(fipfit,"R");
@@ -2839,17 +3025,17 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
      fEfficiencyIPCharmD[icentr] = fEfficiencyCharmSigD[icentr]->GetFunction("fipfit");
 
      if(fIPParameterizedEff){
-       fipfit2->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
-       fipfit2->SetLineColor(3);
-       fConversionEff[icentr]->Fit(fipfit2,"R");
+       fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
+       fipfitnonhfe->SetLineColor(3);
+       fConversionEff[icentr]->Fit(fipfitnonhfe,"R");
        fConversionEff[icentr]->GetYaxis()->SetTitle("Efficiency");
-       fEfficiencyIPConversionD[icentr] = fConversionEff[icentr]->GetFunction("fipfit2");
+       fEfficiencyIPConversionD[icentr] = fConversionEff[icentr]->GetFunction("fipfitnonhfe");
 
-       fipfit2->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
-       fipfit2->SetLineColor(4);
-       fNonHFEEff[icentr]->Fit(fipfit2,"R");
+       fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
+       fipfitnonhfe->SetLineColor(4);
+       fNonHFEEff[icentr]->Fit(fipfitnonhfe,"R");
        fNonHFEEff[icentr]->GetYaxis()->SetTitle("Efficiency");
-       fEfficiencyIPNonhfeD[icentr] = fNonHFEEff[icentr]->GetFunction("fipfit2");
+       fEfficiencyIPNonhfeD[icentr] = fNonHFEEff[icentr]->GetFunction("fipfitnonhfe");
      }
    }
 
@@ -2860,6 +3046,10 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
    fEfficiencyBeautySigD[0]->SetMarkerStyle(21);
    fEfficiencyBeautySigD[0]->SetMarkerColor(2);
    fEfficiencyBeautySigD[0]->SetLineColor(2);
+   fEfficiencyBeautySigesdD[0]->SetStats(0);
+   fEfficiencyBeautySigesdD[0]->SetMarkerStyle(21);
+   fEfficiencyBeautySigesdD[0]->SetMarkerColor(6);
+   fEfficiencyBeautySigesdD[0]->SetLineColor(6);
    fCharmEff[0]->SetMarkerStyle(24);
    fCharmEff[0]->SetMarkerColor(1);
    fCharmEff[0]->SetLineColor(1);
@@ -2874,29 +3064,52 @@ void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContain
    fNonHFEEff[0]->SetLineColor(4);
 
    fEfficiencyCharmSigD[0]->Draw();
+   fEfficiencyCharmSigD[0]->GetXaxis()->SetRangeUser(0.0,7.9);
+   fEfficiencyCharmSigD[0]->GetYaxis()->SetRangeUser(0.0,0.5);
+
    fEfficiencyBeautySigD[0]->Draw("same");
+   fEfficiencyBeautySigesdD[0]->Draw("same");
    //fCharmEff[0]->Draw("same");
    //fBeautyEff[0]->Draw("same");
-   fConversionEff[0]->Draw("same");
-   fNonHFEEff[0]->Draw("same");
+
+   if(fBeamType==0){
+     fConversionEffbgc->SetMarkerStyle(25);
+     fConversionEffbgc->SetMarkerColor(3);
+     fConversionEffbgc->SetLineColor(3);
+     fNonHFEEffbgc->SetMarkerStyle(25);
+     fNonHFEEffbgc->SetMarkerColor(4);
+     fNonHFEEffbgc->SetLineColor(4);
+     fConversionEffbgc->Draw("same");
+     fNonHFEEffbgc->Draw("same");
+   }
+   else{
+     fConversionEff[0]->Draw("same");
+     fNonHFEEff[0]->Draw("same");
+   }
 
    fEfficiencyIPBeautyD[0]->Draw("same");
+   fEfficiencyIPBeautyesdD[0]->Draw("same");
    fEfficiencyIPCharmD[0]->Draw("same");
    if(fIPParameterizedEff){
      fEfficiencyIPConversionD[0]->Draw("same");
      fEfficiencyIPNonhfeD[0]->Draw("same");
    }
-   TLegend *legipeff = new TLegend(0.55,0.2,0.85,0.39);
+   TLegend *legipeff = new TLegend(0.58,0.2,0.88,0.39);
    legipeff->AddEntry(fEfficiencyBeautySigD[0],"IP Step Efficiency","");
    legipeff->AddEntry(fEfficiencyBeautySigD[0],"beauty e","p");
+   legipeff->AddEntry(fEfficiencyBeautySigesdD[0],"beauty e(esd pt)","p");
    legipeff->AddEntry(fEfficiencyCharmSigD[0],"charm e","p");
-   legipeff->AddEntry(fConversionEff[0],"conversion e","p");
-   legipeff->AddEntry(fNonHFEEff[0],"Dalitz e","p");
+   legipeff->AddEntry(fConversionEffbgc,"conversion e(esd pt)","p");
+   legipeff->AddEntry(fNonHFEEffbgc,"Dalitz e(esd pt)","p");
+   //legipeff->AddEntry(fConversionEff[0],"conversion e","p");
+   //legipeff->AddEntry(fNonHFEEff[0],"Dalitz e","p");
    legipeff->Draw("same");
+   gPad->SetGrid();
+   //cefficiencyParamIP->SaveAs("efficiencyParamIP.eps");
 }
 
 //____________________________________________________________________________
-THnSparse* AliHFEspectrum::GetBeautyIPEff(){
+THnSparse* AliHFEspectrum::GetBeautyIPEff(Bool_t isMCpt){
   //
   // Return beauty electron IP cut efficiency
   //
@@ -2931,16 +3144,19 @@ THnSparse* AliHFEspectrum::GetBeautyIPEff(){
   }
   Double_t pt[1];
   Double_t weight[nCentralitybinning];
+  Double_t weightErr[nCentralitybinning];
   Double_t contents[2];
 
   for(Int_t a=0;a<11;a++)
   {
       weight[a] = 1.0;
+      weightErr[a] = 1.0;
   }
 
 
   Int_t looppt=nBin[0];
   Int_t loopcentr=1;
+  Int_t ibin[2];
   if(fBeamType==1)
   {
       loopcentr=nBinPbPb[0];
@@ -2952,25 +3168,44 @@ THnSparse* AliHFEspectrum::GetBeautyIPEff(){
       for(int i=0; i<looppt; i++)
       {
          pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
-          if(fEfficiencyIPBeautyD[icentr])
-            weight[icentr]=fEfficiencyIPBeautyD[icentr]->Eval(pt[0]);
+          if(isMCpt){
+            if(fEfficiencyIPBeautyD[icentr]){
+              weight[icentr]=fEfficiencyIPBeautyD[icentr]->Eval(pt[0]);
+              weightErr[icentr] = 0;
+            }
+            else{
+              printf("Fit failed on beauty IP cut efficiency for centrality %d. Contents in histo used!\n",icentr);
+              weight[icentr] = fEfficiencyBeautySigD[icentr]->GetBinContent(i+1); 
+              weightErr[icentr] = fEfficiencyBeautySigD[icentr]->GetBinError(i+1);
+            }
+          }
           else{
-            printf("Fit failed on beauty IP cut efficiency for centrality %d. Contents in histo used!\n",icentr);
-            weight[icentr] = fEfficiencyBeautySigD[icentr]->GetBinContent(i+1); 
+            if(fEfficiencyIPBeautyesdD[icentr]){
+              weight[icentr]=fEfficiencyIPBeautyesdD[icentr]->Eval(pt[0]);
+              weightErr[icentr] = 0;
+            }
+            else{
+              printf("Fit failed on beauty IP cut efficiency for centrality %d. Contents in histo used!\n",icentr);
+              weight[icentr] = fEfficiencyBeautySigesdD[icentr]->GetBinContent(i+1);
+              weightErr[icentr] = fEfficiencyBeautySigD[icentr]->GetBinError(i+1);
+            }
           }
 
           if(fBeamType==1){
               contents[0]=icentr;
               contents[1]=pt[0];
+              ibin[0]=icentr;
+              ibin[1]=i+1;
           }
           if(fBeamType==0){
               contents[0]=pt[0];
+              ibin[0]=i+1;
           }
           ipcut->Fill(contents,weight[icentr]);
+          ipcut->SetBinError(ibin,weightErr[icentr]);
       }
   } 
 
-
   Int_t nDimSparse = ipcut->GetNdimensions();
   Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
   Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
@@ -2988,7 +3223,7 @@ THnSparse* AliHFEspectrum::GetBeautyIPEff(){
       binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
       bintmp /= binsvar[iVar] ;
     }
-    ipcut->SetBinError(binfill,0.); // put 0 everywhere
+    //ipcut->SetBinError(binfill,0.); // put 0 everywhere
   }
 
   delete[] binsvar;
@@ -3039,7 +3274,6 @@ THnSparse* AliHFEspectrum::GetPIDxIPEff(Int_t source){
   {
       weight[a] = 1.0;
       weightErr[a] = 1.0;
-      
   }
 
   Int_t looppt=nBin[0];
@@ -3199,16 +3433,13 @@ AliCFDataGrid *AliHFEspectrum::GetRawBspectra2ndMethod(){
        nDim=2;
     }
 
-    //    const Int_t nPtbinning1 = 35;//number of pt bins, according to new binning
     const Int_t nPtbinning1 = 18;//number of pt bins, according to new binning
     const Int_t nCentralitybinning=11;//number of centrality bins
-   // Double_t kPtRange[nPtbinning1+1] = { 0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.};//pt bin limits
     Double_t kPtRange[19] = {0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 12, 16, 20};
    
     Double_t kCentralityRange[nCentralitybinning+1] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
     Int_t nBin[1] = {nPtbinning1};
     Int_t nBinPbPb[2] = {nCentralitybinning,nPtbinning1};
-    //fBSpectrum2ndMethod->GetNbinsX()
 
     AliCFDataGrid *rawBeautyContainer;
     if(fBeamType==0)  rawBeautyContainer = new AliCFDataGrid("rawBeautyContainer","rawBeautyContainer",nDim,nBin);
index a2261053041a6964397d7803097cb206b423baed..90fe822fc24802e5794a2bcf991f14fe0d27e77c 100644 (file)
@@ -104,6 +104,7 @@ class AliHFEspectrum : public TNamed{
     void SetEtaRange(Double_t etamin, Double_t etamax) { fEtaRange[0] = etamin; fEtaRange[1] = etamax; fEtaSelected = kTRUE; }
     void SetUnSetCorrelatedErrors(Bool_t unsetcorrelatederrors) {fUnSetCorrelatedErrors = unsetcorrelatederrors;};
     void SetSmoothing(Bool_t setSmoothing) {fSetSmoothing = setSmoothing;};
+    void SetTestOneBinCentrality(Double_t centralitymin, Double_t centralitymax) { fTestCentralityLow = centralitymin; fTestCentralityHigh = centralitymax;}
 
     void SetNCentralityBinAtTheEnd(Int_t nCentralityBinAtTheEnd) {fNCentralityBinAtTheEnd = nCentralityBinAtTheEnd; };
     void SetLowHighBoundaryCentralityBinAtTheEnd(Int_t low, Int_t high, Int_t i) { fLowBoundaryCentralityBinAtTheEnd[i] = low; fHighBoundaryCentralityBinAtTheEnd[i] = high;};
@@ -129,7 +130,7 @@ class AliHFEspectrum : public TNamed{
     AliCFDataGrid* GetConversionBackground();
     AliCFDataGrid* GetNonHFEBackground();
     THnSparse* GetCharmWeights();
-    THnSparse* GetBeautyIPEff();
+    THnSparse* GetBeautyIPEff(Bool_t isMCpt);
     THnSparse* GetPIDxIPEff(Int_t source);
     void CalculateNonHFEsyst(Int_t centrality = 0);
 
@@ -142,8 +143,8 @@ class AliHFEspectrum : public TNamed{
   protected:
        
     AliCFContainer *GetContainer(AliHFEspectrum::CFContainer_t contt);
-    AliCFContainer *GetSlicedContainer(AliCFContainer *cont, Int_t ndim, Int_t *dimensions,Int_t source=-1,Chargetype_t charge=kAllCharge,Int_t centrality=-1);
-    THnSparseF *GetSlicedCorrelation(THnSparseF *correlationmatrix,Int_t nDim, Int_t *dimensions) const;
+    AliCFContainer *GetSlicedContainer(AliCFContainer *cont, Int_t ndim, Int_t *dimensions,Int_t source=-1,Chargetype_t charge=kAllCharge,Int_t centralitylow=-1, Int_t centralityhigh=-1);
+    THnSparseF *GetSlicedCorrelation(THnSparseF *correlationmatrix,Int_t nDim, Int_t *dimensions,Int_t centralitylow=-1, Int_t centralityhigh=-1) const;
     TObject* GetSpectrum(const AliCFContainer * const c, Int_t step);
     TObject* GetEfficiency(const AliCFContainer * const c, Int_t step, Int_t step0);
  
@@ -166,6 +167,7 @@ class AliHFEspectrum : public TNamed{
     TF1 *fEfficiencyesdTOFPIDD[kCentrality];    // TOF PID efficiency parameterized
     TF1 *fEfficiencyIPCharmD[kCentrality];      // IP efficiency parameterized for charm
     TF1 *fEfficiencyIPBeautyD[kCentrality];     // IP efficiency parameterized for beauty 
+    TF1 *fEfficiencyIPBeautyesdD[kCentrality];  // IP efficiency parameterized for beauty for esd
     TF1 *fEfficiencyIPConversionD[kCentrality]; // IP efficiency parameterized for conversion
     TF1 *fEfficiencyIPNonhfeD[kCentrality];     // IP efficiency parameterized for nonhfe 
 
@@ -209,10 +211,13 @@ class AliHFEspectrum : public TNamed{
     Int_t fNCentralityBinAtTheEnd;// Number of centrality class at the end
     Int_t fLowBoundaryCentralityBinAtTheEnd[20];  // Boundary of the bins
     Int_t fHighBoundaryCentralityBinAtTheEnd[20];  // Boundary of the bins
+    Int_t fTestCentralityLow;                      // To test one bin in centrality only
+    Int_t fTestCentralityHigh;                     // To test one bin in centrality only
 
     THnSparseF *fHadronEffbyIPcut;// container for hadron efficiency by IP cut
     TH1D *fEfficiencyCharmSigD[kCentrality]; // charm IP cut eff from signal enhanced MC
     TH1D *fEfficiencyBeautySigD[kCentrality]; // beauty IP cut eff from signal enhanced MC
+    TH1D *fEfficiencyBeautySigesdD[kCentrality]; // beauty IP cut eff from signal enhanced MC for esd
     TH1D *fConversionEff[kCentrality];     // conversion IP cut eff
     TH1D *fNonHFEEff[kCentrality];         // nonhfe IP cut eff
     TH1D *fCharmEff[kCentrality];          // charm IP cut eff
index ec20ab39a7c6715492b5551e2089682c7dd483f3..dab9e9c85f205d6c13766c0b88034ce9c75c37d9 100644 (file)
@@ -20,6 +20,7 @@
 // Authors
 //   All authors of the HFE group
 //
+#include <TArrayD.h>
 #include <TMath.h>
 #include <TParticle.h>
 #include "TH1.h"
@@ -65,6 +66,17 @@ Double_t *AliHFEtools::MakeLinearBinning(Int_t nBins, Double_t ymin, Double_t ym
   return bins;
 }
 
+//__________________________________________
+void AliHFEtools::FillLinearBinning(TArrayD &bins, Int_t nBins, Double_t ymin, Double_t ymax){
+  //
+  // Helper function for linearly binned array
+  //
+  Double_t stepsize = (ymax - ymin) / static_cast<Double_t>(nBins);
+  bins[0] = ymin;
+  for(Int_t ibin = 1; ibin <= nBins; ibin++)
+    bins[ibin] = bins[ibin-1] + stepsize;
+}
+
 //__________________________________________
 Double_t *AliHFEtools::MakeLogarithmicBinning(Int_t nBins, Double_t ymin, Double_t ymax){
   //
@@ -79,6 +91,17 @@ Double_t *AliHFEtools::MakeLogarithmicBinning(Int_t nBins, Double_t ymin, Double
   return bins;
 }
 
+//__________________________________________
+void AliHFEtools::FillLogarithmicBinning(TArrayD &bins, Int_t nBins, Double_t ymin, Double_t ymax){
+  //
+  // Helper function for logartimically binned array
+  //
+  bins[0] = ymin;
+  Double_t factor = TMath::Power(ymax/ymin, 1./nBins);
+  for(Int_t ibin = 1; ibin <= nBins; ibin++)
+    bins[ibin] = factor * bins[ibin-1];
+}
+
 //_________________________________________
 Bool_t AliHFEtools::BinLogAxis(TObject *o, Int_t dim){
 
@@ -130,14 +153,13 @@ Bool_t AliHFEtools::BinLogAxis(TObject *o, Int_t dim){
     AliError(Form("Log binning not possible for this axis [min = %f]\n", from));
   }
   Double_t to = axis->GetXmax();
-  Double_t *newBins = new Double_t[bins+1];
+  TArrayD newBins(bins+1);
   newBins[0] = from;
   Double_t factor = TMath::Power(to/from, 1./bins);
   for(Int_t i=1; i<=bins; ++i){
     newBins[i] = factor * newBins[i-1];
   }
-  axis->Set(bins, newBins);
-  delete[] newBins;
+  axis->Set(bins, newBins.GetArray());
 
   return kTRUE;
 }
index f548bcb31092a9c4899ae0add1302a52f38d12ea..4b1b45c570d8946ac94312db47a9413902e57ab0 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <TObject.h>
 
+class TArrayD;
 class TParticle;
 class AliAODMCParticle;
 class AliPIDResponse;
@@ -38,6 +39,8 @@ class AliHFEtools : public TObject{
 
     static Double_t *MakeLinearBinning(Int_t nBins, Double_t ymin, Double_t ymax);
     static Double_t *MakeLogarithmicBinning(Int_t nBins, Double_t ymin, Double_t ymax);
+    static void FillLinearBinning(TArrayD &bins, Int_t nBins, Double_t ymin, Double_t ymax);
+    static void FillLogarithmicBinning(TArrayD &bins, Int_t nBins, Double_t ymin, Double_t ymax);
     Bool_t    BinLogAxis(TObject *o, Int_t dim);
     static Float_t GetRapidity(const TParticle *part);
     static Float_t GetRapidity(const AliAODMCParticle *part); // return rapidity
index b554d59e2e164ae6a60eb7ce10b451bfdd60d8c4..67c51f72d5f1810fcbc3f48022ae400c9b9cad99 100644 (file)
@@ -1,4 +1,4 @@
-AliAnalysisTask *AddTaskHFEtpctofv2(Int_t tpcCls=110, Double_t tpcClsr=50, Int_t tpcClspid=60, Double_t tpcsharedfraction=95, Int_t itsCls=4, Double_t chi2peritscl=36, Int_t pixellayer=2, Double_t dcaxy=100,Double_t dcaz=200, Double_t tofsig=30., Double_t tpcdedx0=0.0, Double_t tpcdedx1=0.0, Double_t tpcdedx2=0.0, Double_t tpcdedx3=0.0, Double_t tpcdedx4=0.0, Int_t vzero=3, Int_t debuglevel=3){
+AliAnalysisTask *AddTaskHFEtpctofv2(Int_t tpcCls=110, Double_t tpcClsr=50, Int_t tpcClspid=60, Double_t tpcsharedfraction=10, Int_t itsCls=4, Double_t chi2peritscl=36, Int_t pixellayer=2, Double_t dcaxy=100,Double_t dcaz=200, Double_t tofsig=30., Double_t tpcdedx0=0.0, Double_t tpcdedx1=0.0, Double_t tpcdedx2=0.0, Double_t tpcdedx3=0.0, Double_t tpcdedx4=0.0, Int_t vzero=3, Int_t debuglevel=4){
 
   // libraries in case
   gSystem->Load("libANALYSIS.so");
index bd9ca541e3430a4dc95460061a6807e179901fac..a2bb03a5913eb8d3ddaa351449f13fec9a3d3ad4 100644 (file)
@@ -14,11 +14,11 @@ AliAnalysisTaskHFEFlow* ConfigHFE_FLOW_TOFTPC(Bool_t useMC, Int_t tpcCls, Double
   printf("dcaxy %f\n",dcaxy*0.01);
   printf("dcaz %f\n",dcaz*0.01);
   printf("TOF sigma %f\n",tofsig*0.1);
-  printf("TPC min sigma cut 0: %f\n",tpcdedx0*0.01);
-  printf("TPC min sigma cut 1: %f\n",tpcdedx1*0.01);
-  printf("TPC min sigma cut 2: %f\n",tpcdedx2*0.01);
-  printf("TPC min sigma cut 3: %f\n",tpcdedx3*0.01);
-  printf("TPC min sigma cut 4: %f\n",tpcdedx4*0.01);
+  printf("TPC min sigma cut 0: %f\n",tpcdedx0*0.001);
+  printf("TPC min sigma cut 1: %f\n",tpcdedx1*0.001);
+  printf("TPC min sigma cut 2: %f\n",tpcdedx2*0.001);
+  printf("TPC min sigma cut 3: %f\n",tpcdedx3*0.001);
+  printf("TPC min sigma cut 4: %f\n",tpcdedx4*0.001);
   printf("VZERO event plane %d\n",vzero);
   printf("Debug level %d\n",debuglevel);
   
@@ -42,6 +42,17 @@ AliAnalysisTaskHFEFlow* ConfigHFE_FLOW_TOFTPC(Bool_t useMC, Int_t tpcCls, Double
   
   hfecuts->SetTOFPIDStep(kTRUE);
 
+  // Cut HFE background
+  AliESDtrackCuts *hfeBackgroundCuts = new AliESDtrackCuts();
+  hfeBackgroundCuts->SetName("backgroundcuts");
+  hfeBackgroundCuts->SetAcceptKinkDaughters(kFALSE);
+  hfeBackgroundCuts->SetRequireTPCRefit(kTRUE);
+  hfeBackgroundCuts->SetEtaRange(-0.9,0.9);
+  hfeBackgroundCuts->SetRequireSigmaToVertex(kTRUE);
+  hfeBackgroundCuts->SetMaxChi2PerClusterTPC(4.0);
+  hfeBackgroundCuts->SetMinNClustersTPC(50);
+  hfeBackgroundCuts->SetPtRange(0.3,1e10);
+
   // Name
   TString appendix(TString::Format("TPC%dTPCr%dTPCpid%dTPCShared%dITScl%dChi2perITS%dPixelLayer%dDCAr%dz%dTOFsig%dTPCmindedx0%dTPCmindedx1%dTPCmindedx2%dTPCmindedx3%dTPCmindedx4%dVZERO%dDebugLevel%d",tpcCls,(Int_t)tpcClsr,tpcClspid,(Int_t) tpcsharedfraction,itsCls,(Int_t) chi2peritscl,(Int_t) pixellayer,(Int_t)dcaxy,(Int_t)dcaz,(Int_t)tofsig,(Int_t)tpcdedx0,(Int_t)tpcdedx1,(Int_t)tpcdedx2,(Int_t)tpcdedx3,(Int_t)tpcdedx4,vzero,debuglevel));
   printf("appendix %s\n", appendix.Data());
@@ -52,9 +63,10 @@ AliAnalysisTaskHFEFlow* ConfigHFE_FLOW_TOFTPC(Bool_t useMC, Int_t tpcCls, Double
   task->SetDebugLevel(1);
   task->GetPIDQAManager()->SetHighResolutionHistos();
   task->SetHFECuts(hfecuts);
+  task->SetHFEBackgroundCuts(hfeBackgroundCuts);
   if(useMC) {
     task->SetMCPID(kTRUE);
-    //task->SetUseMCReactionPlane(kTRUE);
+    task->SetUseMCReactionPlane(kTRUE);
     task->SetAfterBurnerOn(kTRUE);
     task->SetV1V2V3V4V5(0.0,0.2,0.0,0.0,0.0);
   }
@@ -78,11 +90,11 @@ AliAnalysisTaskHFEFlow* ConfigHFE_FLOW_TOFTPC(Bool_t useMC, Int_t tpcCls, Double
     Double_t params_centr_10_20[1];
     Double_t params_centr_20_30[1];
     Double_t params_centr_per[1];
-    params_centr_0_5[0]=tpcdedx0*0.01;  // cut tuned for 0-10%
-    params_centr_5_10[0]=tpcdedx1*0.01; // cut tuned for 0-10%
-    params_centr_10_20[0]=tpcdedx2*0.01;
-    params_centr_20_30[0]=tpcdedx3*0.01;
-    params_centr_per[0]=tpcdedx4*0.01;
+    params_centr_0_5[0]=tpcdedx0*0.001;  // cut tuned for 0-10%
+    params_centr_5_10[0]=tpcdedx1*0.001; // cut tuned for 0-10%
+    params_centr_10_20[0]=tpcdedx2*0.001;
+    params_centr_20_30[0]=tpcdedx3*0.001;
+    params_centr_per[0]=tpcdedx4*0.001;
     
     char *cutmodel;
     cutmodel="pol0";
@@ -99,6 +111,17 @@ AliAnalysisTaskHFEFlow* ConfigHFE_FLOW_TOFTPC(Bool_t useMC, Int_t tpcCls, Double
   }
 
   pid->ConfigureTOF(tofsig*0.1);
+
+  // Define PID background
+  AliHFEpid *pidbackground = task->GetPIDBackground();
+  if(useMC) pidbackground->SetHasMCData(kTRUE);
+  pidbackground->AddDetector("TOF", 0);
+  pidbackground->AddDetector("TPC", 1);
+  pidbackground->ConfigureTOF(3.0);
+  pidbackground->ConfigureTPCasymmetric(0.1,20.,-2.0,5.0);
+  task->SetMaxopeningtheta(9999.0);
+  task->SetMaxopeningphi(9999.0);
+  task->SetMaxopening3D(0.5);
   
   printf("*************************************\n");
   printf("Configuring standard Task:\n");