]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/hfe/AliAnalysisTaskHFEFlow.cxx
Update code
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliAnalysisTaskHFEFlow.cxx
index a64a5fbd0bb6b5e03f291832bb2d24fcb2ca5e9f..5fd7776863d4cae3b767c84c1ea9eefab6d49486 100644 (file)
@@ -40,6 +40,7 @@
 #include "AliMCEvent.h"\r
 #include "AliESD.h"\r
 #include "AliESDEvent.h"\r
+#include "AliPID.h"\r
 #include "AliPIDResponse.h"\r
 #include "AliESDVZERO.h"\r
 #include "AliESDUtils.h"\r
@@ -61,6 +62,7 @@
 #include "AliFlowVector.h"\r
 #include "AliFlowCommonConstants.h"\r
 #include "AliKFParticle.h"\r
+#include "AliKFVertex.h"\r
 \r
 #include "AliHFEcuts.h"\r
 #include "AliHFEpid.h"\r
@@ -102,17 +104,19 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow() :
   fUseMCReactionPlane(kFALSE),\r
   fMCPID(kFALSE),\r
   fNoPID(kFALSE),\r
-  fChi2OverNDFCut(999),\r
+  fChi2OverNDFCut(3.0),\r
   fMaxdca(3.0),\r
   fMaxopeningtheta(0.02),\r
   fMaxopeningphi(0.1),\r
   fMaxopening3D(0.1),\r
   fMaxInvmass(0.1),\r
+  fSetMassConstraint(kFALSE),\r
   fDebugLevel(0),\r
   fcutsRP(0),\r
   fcutsPOI(0),\r
   fHFECuts(0),\r
   fPID(0),\r
+  fPIDTOFOnly(0),\r
   fPIDqa(0),\r
   fflowEvent(NULL),\r
   fHFEBackgroundCuts(0),\r
@@ -143,6 +147,7 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow() :
   fDeltaPhiMapsBeforePID(0x0),\r
   fCosPhiMapsBeforePID(0x0),\r
   fDeltaPhiMaps(0x0),\r
+  fDeltaPhiMapsContamination(0x0),\r
   fCosPhiMaps(0x0),\r
   fProfileCosPhiMaps(0x0),\r
   fDeltaPhiMapsTaggedPhotonic(0x0),\r
@@ -193,17 +198,19 @@ AliAnalysisTaskHFEFlow:: AliAnalysisTaskHFEFlow(const char *name) :
   fUseMCReactionPlane(kFALSE),\r
   fMCPID(kFALSE),\r
   fNoPID(kFALSE),\r
-  fChi2OverNDFCut(999),\r
+  fChi2OverNDFCut(3.0),\r
   fMaxdca(3.0),\r
   fMaxopeningtheta(0.02),\r
   fMaxopeningphi(0.1),\r
   fMaxopening3D(0.1),\r
   fMaxInvmass(0.1),\r
+  fSetMassConstraint(kFALSE),\r
   fDebugLevel(0),\r
   fcutsRP(0),\r
   fcutsPOI(0),\r
   fHFECuts(0),\r
   fPID(0),\r
+  fPIDTOFOnly(0),\r
   fPIDqa(0),\r
   fflowEvent(NULL),\r
   fHFEBackgroundCuts(0),\r
@@ -234,6 +241,7 @@ AliAnalysisTaskHFEFlow:: AliAnalysisTaskHFEFlow(const char *name) :
   fDeltaPhiMapsBeforePID(0x0),\r
   fCosPhiMapsBeforePID(0x0),\r
   fDeltaPhiMaps(0x0),\r
+  fDeltaPhiMapsContamination(0x0),\r
   fCosPhiMaps(0x0),\r
   fProfileCosPhiMaps(0x0),\r
   fDeltaPhiMapsTaggedPhotonic(0x0),\r
@@ -267,6 +275,8 @@ AliAnalysisTaskHFEFlow:: AliAnalysisTaskHFEFlow(const char *name) :
   fPIDBackground = new AliHFEpid("hfePidBackground");\r
   fPIDBackgroundqa = new AliHFEpidQAmanager;\r
 \r
+  fPIDTOFOnly = new AliHFEpid("hfePidTOFOnly");\r
+\r
   DefineInput(0,TChain::Class());\r
   DefineOutput(1, TList::Class());\r
   for(Int_t bincless = 0; bincless < fNbBinsCentralityQCumulant; bincless++) {\r
@@ -309,11 +319,13 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow(const AliAnalysisTaskHFEFlow &ref
   fMaxopeningphi(ref.fMaxopeningphi),\r
   fMaxopening3D(ref.fMaxopening3D),\r
   fMaxInvmass(ref.fMaxInvmass),\r
+  fSetMassConstraint(ref.fSetMassConstraint),\r
   fDebugLevel(ref.fDebugLevel),\r
   fcutsRP(NULL),\r
   fcutsPOI(NULL),\r
   fHFECuts(NULL),\r
   fPID(NULL),\r
+  fPIDTOFOnly(NULL),\r
   fPIDqa(NULL),\r
   fflowEvent(NULL),\r
   fHFEBackgroundCuts(NULL),\r
@@ -344,6 +356,7 @@ AliAnalysisTaskHFEFlow::AliAnalysisTaskHFEFlow(const AliAnalysisTaskHFEFlow &ref
   fDeltaPhiMapsBeforePID(NULL),\r
   fCosPhiMapsBeforePID(NULL),\r
   fDeltaPhiMaps(NULL),\r
+  fDeltaPhiMapsContamination(NULL),\r
   fCosPhiMaps(NULL),\r
   fProfileCosPhiMaps(NULL),\r
   fDeltaPhiMapsTaggedPhotonic(NULL),\r
@@ -411,6 +424,7 @@ void AliAnalysisTaskHFEFlow::Copy(TObject &o) const {
   target.fMaxopeningphi = fMaxopeningphi;\r
   target.fMaxopening3D = fMaxopening3D;\r
   target.fMaxInvmass = fMaxInvmass;\r
+  target.fSetMassConstraint =  fSetMassConstraint;\r
   target.fAlgorithmMA = fAlgorithmMA;\r
   target.fCounterPoolBackground = fCounterPoolBackground;\r
   target.fDebugLevel = fDebugLevel;\r
@@ -433,6 +447,7 @@ AliAnalysisTaskHFEFlow::~AliAnalysisTaskHFEFlow(){
   if(fcutsPOI) delete fcutsPOI;\r
   if(fHFECuts) delete fHFECuts;\r
   if(fPID) delete fPID;\r
+  if(fPIDTOFOnly) delete fPIDTOFOnly;\r
   if(fPIDqa) delete fPIDqa;\r
   if(fflowEvent) delete fflowEvent;\r
   if(fHFEBackgroundCuts) delete fHFEBackgroundCuts;\r
@@ -523,6 +538,10 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   fPIDqa->Initialize(fPID);\r
   fPID->SortDetectors();\r
 \r
+  if(!fPIDTOFOnly->GetNumberOfPIDdetectors()) fPIDTOFOnly->AddDetector("TPC", 0);\r
+  fPIDTOFOnly->InitializePID();\r
+  fPIDTOFOnly->SortDetectors();\r
+\r
   // HFE Background cuts\r
 \r
   if(!fHFEBackgroundCuts){\r
@@ -550,6 +569,7 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   // Bins for the THnSparse\r
   //**************************\r
 \r
+  /*\r
   Int_t nBinsPt = 44;\r
   Double_t minPt = 0.1;\r
   Double_t maxPt = 20.0;\r
@@ -557,6 +577,13 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   Double_t binLimPt[nBinsPt+1];\r
   for(Int_t i=0; i<=nBinsPt; i++) binLimLogPt[i]=(Double_t)TMath::Log10(minPt) + (TMath::Log10(maxPt)-TMath::Log10(minPt))/nBinsPt*(Double_t)i ;\r
   for(Int_t i=0; i<=nBinsPt; i++) binLimPt[i]=(Double_t)TMath::Power(10,binLimLogPt[i]);\r
+  */\r
+\r
+  Int_t nBinsPt = 35;\r
+  Double_t binLimPt[36] = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2,\r
+                           1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5.,\r
+                           5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.};\r
+\r
 \r
   Int_t nBinsPtPlus = fNbBinsPtQCumulant;\r
   Double_t minPtPlus = fMinPtQCumulant;\r
@@ -570,9 +597,9 @@ 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
+  Int_t nBinsStep = 7;\r
   Double_t minStep = 0.;\r
-  Double_t maxStep = 6.;\r
+  Double_t maxStep = 7.;\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
@@ -607,6 +634,22 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
     //printf("bin phi is %f for %d\n",binLimPhi[i],i);\r
   }\r
 \r
+  Int_t nBinsPhiLess = 2.0;\r
+  Double_t minPhiLess = 0.0;\r
+  Double_t maxPhiLess = 2.0;\r
+  Double_t binLimPhiLess[nBinsPhiLess+1];\r
+  for(Int_t i=0; i<=nBinsPhiLess; i++) {\r
+    binLimPhiLess[i]=(Double_t)minPhiLess + (maxPhiLess-minPhiLess)/nBinsPhiLess*(Double_t)i ;\r
+  }\r
+\r
+  Int_t nBinsTPCdEdx = 140;\r
+  Double_t minTPCdEdx = -12.0;\r
+  Double_t maxTPCdEdx = 12.0;\r
+  Double_t binLimTPCdEdx[nBinsTPCdEdx+1];\r
+  for(Int_t i=0; i<=nBinsTPCdEdx; i++) {\r
+    binLimTPCdEdx[i]=(Double_t)minTPCdEdx + (maxTPCdEdx-minTPCdEdx)/nBinsTPCdEdx*(Double_t)i ;\r
+  }\r
+\r
   Int_t nBinsAngle = 40;\r
   Double_t minAngle = 0.0;\r
   Double_t maxAngle = 1.0;\r
@@ -622,9 +665,9 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   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
+  Int_t nBinsSource = 10;\r
   Double_t minSource = 0.;\r
-  Double_t maxSource = 8.;\r
+  Double_t maxSource = 10.;\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
@@ -771,6 +814,18 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   fDeltaPhiMaps->SetBinEdges(4,binLimEtaLess);\r
   fDeltaPhiMaps->Sumw2();  \r
 \r
+  // Maps delta phi contamination\r
+  const Int_t nDimgcont=4;\r
+  Int_t nBingcont[nDimgcont] = {nBinsPhiLess,nBinsC,nBinsPt, nBinsTPCdEdx};\r
+  fDeltaPhiMapsContamination = new THnSparseF("DeltaPhiMapsContamination","DeltaPhiMapsContamination",nDimgcont,nBingcont);\r
+  fDeltaPhiMapsContamination->SetBinEdges(0,binLimPhiLess);\r
+  fDeltaPhiMapsContamination->SetBinEdges(1,binLimC);\r
+  fDeltaPhiMapsContamination->SetBinEdges(2,binLimPt);\r
+  fDeltaPhiMapsContamination->SetBinEdges(3,binLimTPCdEdx);\r
+  fDeltaPhiMapsContamination->Sumw2();  \r
+\r
+\r
+  //\r
   const Int_t nDimgb=3;\r
   Int_t nBingb[nDimgb] = {nBinsPhi,nBinsC,nBinsPt};\r
 \r
@@ -919,6 +974,7 @@ void AliAnalysisTaskHFEFlow::UserCreateOutputObjects()
   fListHist->Add(fDeltaPhiMapsBeforePID);\r
   fListHist->Add(fCosPhiMapsBeforePID);\r
   fListHist->Add(fDeltaPhiMaps);\r
+  fListHist->Add(fDeltaPhiMapsContamination);\r
   fListHist->Add(fCosPhiMaps);\r
   fListHist->Add(fProfileCosPhiMaps);\r
   fListHist->Add(fDeltaPhiMapsTaggedPhotonic);\r
@@ -972,6 +1028,7 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
   Double_t valuensparsehprofile[3];\r
   Double_t valuensparseMCSourceDeltaPhiMaps[3];\r
   Double_t valuetrackingcuts[2];\r
+  Double_t valuedeltaphicontamination[4];\r
    \r
   AliMCEvent *mcEvent = MCEvent();\r
   AliMCParticle *mctrack = NULL;\r
@@ -1041,6 +1098,7 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
   valuensparsehprofile[1] = binct; \r
   valuecossinephiep[2] = binctMore;\r
   valuensparseMCSourceDeltaPhiMaps[0] = binct;\r
+  valuedeltaphicontamination[1] = binct;\r
  \r
   //////////////////////\r
   // run number\r
@@ -1053,7 +1111,12 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     // Initialize PID with the given run number\r
     fPID->InitializePID(runnumber);\r
   }\r
+  if(!fPIDTOFOnly->IsInitialized()){\r
+    // Initialize PID with the given run number\r
+    fPIDTOFOnly->InitializePID(runnumber);\r
+  }\r
 \r
+  //\r
   if(!fPIDBackground->IsInitialized()){\r
     // Initialize PID with the given run number\r
     fPIDBackground->InitializePID(runnumber);\r
@@ -1073,6 +1136,7 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     return;\r
   }\r
   fPID->SetPIDResponse(pidResponse);\r
+  fPIDTOFOnly->SetPIDResponse(pidResponse);\r
   fPIDBackground->SetPIDResponse(pidResponse);\r
 \r
   fHistEV->Fill(binctt,0.0);\r
@@ -1134,7 +1198,9 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
   else {\r
     \r
     eventPlaneV0 = TVector2::Phi_0_2pi(vEPa->GetEventplane("V0", fInputEvent,2));\r
+    //printf("eventPlaneV0 %f\n",eventPlaneV0);\r
     if(eventPlaneV0 > TMath::Pi()) eventPlaneV0 = eventPlaneV0 - TMath::Pi();\r
+    //printf("eventPlaneV0 %f\n",eventPlaneV0);\r
     eventPlaneV0A = TVector2::Phi_0_2pi(vEPa->GetEventplane("V0A", fInputEvent,2));\r
     if(eventPlaneV0A > TMath::Pi()) eventPlaneV0A = eventPlaneV0A - TMath::Pi();\r
     eventPlaneV0C = TVector2::Phi_0_2pi(vEPa->GetEventplane("V0C", fInputEvent,2));\r
@@ -1433,31 +1499,31 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
        } // Quick and dirty fix to reject both kink mothers and daughters\r
       }\r
             \r
-      valuetrackingcuts[1] = 0\r
+      valuetrackingcuts[1] = 1\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
+      valuetrackingcuts[1] = 2\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
+       valuetrackingcuts[1] = 3\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
+      valuetrackingcuts[1] = 4\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
+      valuetrackingcuts[1] = 5\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
+      valuetrackingcuts[1] = 6\r
        if(fDebugLevel > 3) fTrackingCuts->Fill(&valuetrackingcuts[0]);    \r
       \r
     }\r
@@ -1520,10 +1586,21 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     Double_t deltaphi = TVector2::Phi_0_2pi(phitrack - eventplanesubtracted);\r
     if(deltaphi > TMath::Pi()) deltaphi = deltaphi - TMath::Pi();\r
 \r
+    ////////////////////////////////\r
+    // Determine the deltaphi bin\r
+    ///////////////////////////////\r
+\r
+    // in-plane\r
+    if(((deltaphi<(TMath::Pi()/4.)) && (deltaphi>0.0)) || ((deltaphi>(3*TMath::Pi()/4.)) && (deltaphi<TMath::Pi()))) valuedeltaphicontamination[0] = 0.5;\r
+    // out-of-plane\r
+    if((deltaphi>(TMath::Pi()/4.)) && (deltaphi<(3*TMath::Pi()/4.))) valuedeltaphicontamination[0] = 1.5;\r
+\r
     ////////////////////////////////////////\r
     // Define variables\r
     ///////////////////////////////////////\r
 \r
+\r
+    valuedeltaphicontamination[2] = track->Pt();\r
     valuensparsee[2] = track->Pt();\r
     valuensparsee[3] = track->Eta();    \r
     valuensparseg[2] = track->Pt();\r
@@ -1547,7 +1624,7 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     // Fill before PID\r
     ///////////////////////\r
     \r
-    if(fDebugLevel > 4) { \r
+    if(fDebugLevel > 5) { \r
       \r
       valuensparseg[0] = deltaphi;\r
       if(fillEventPlane) fDeltaPhiMapsBeforePID->Fill(&valuensparseg[0]);\r
@@ -1565,6 +1642,7 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
     if(!fNoPID) {\r
       // Apply PID for Data\r
       if(!fMCPID) {\r
+       // pid object\r
        AliHFEpidObject hfetrack;\r
        if(!fAODAnalysis) hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);\r
        else hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);\r
@@ -1572,6 +1650,15 @@ void AliAnalysisTaskHFEFlow::UserExec(Option_t */*option*/)
        hfetrack.SetCentrality((Int_t)binct);\r
        //printf("centrality %f and %d\n",binct,hfetrack.GetCentrality());\r
        hfetrack.SetPbPb();\r
+\r
+       // Only TOF PID\r
+       if(fPIDTOFOnly->IsSelected(&hfetrack,0x0,"recTrackCont",0x0)) {\r
+         Float_t nsigma = pidResponse->NumberOfSigmasTPC(track, AliPID::kElectron);\r
+         valuedeltaphicontamination[3] = nsigma;\r
+         fDeltaPhiMapsContamination->Fill(&valuedeltaphicontamination[0]);\r
+       }\r
+\r
+       // Complete PID TOF+TPC\r
        if(!fPID->IsSelected(&hfetrack,0x0,"recTrackCont",fPIDqa)) {\r
          continue;\r
        }\r
@@ -1778,8 +1865,15 @@ Int_t AliAnalysisTaskHFEFlow::LookAtNonHFE(Int_t iTrack1, AliVTrack *track1, Ali
   valueangle[2] = source;\r
   valueangle[1] = binct;\r
 \r
+  // Pdg code\r
+  Int_t pdg1 = CheckPdg(TMath::Abs(track1->GetLabel()),mcEvent);\r
+  Int_t numberfound = 0;\r
+\r
   //Magnetic Field\r
   Double_t bfield = vEvent->GetMagneticField();\r
+\r
+  // Get Primary vertex\r
+  const AliVVertex *pVtx = vEvent->GetPrimaryVertex();\r
   \r
   for(Int_t idex = 0; idex < fCounterPoolBackground; idex++) \r
     {\r
@@ -1795,25 +1889,34 @@ Int_t AliAnalysisTaskHFEFlow::LookAtNonHFE(Int_t iTrack1, AliVTrack *track1, Ali
       if(iTrack2==iTrack1) continue;\r
       //printf("Different\n");\r
 \r
+      // Reset the MC info\r
+      valueangle[2] = source;\r
+      valuensparseDeltaPhiMaps[4] = source;\r
+\r
       // track cuts and PID already done\r
 \r
       // if MC look\r
+      Int_t pdg2 = -100;\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
+       pdg2 = CheckPdg(TMath::Abs(track2->GetLabel()),mcEvent);\r
+       if(source2 >=0 ) {\r
+         if((indexmother2 == indexmother) && (source == source2) && ((pdg1*pdg2)<0.0)) {\r
+           if(source == kElectronfromconversion) {\r
+             valueangle[2] = kElectronfromconversionboth;\r
+             valuensparseDeltaPhiMaps[4] = kElectronfromconversionboth;\r
+             numberfound++;\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
@@ -1914,41 +2017,66 @@ Int_t AliAnalysisTaskHFEFlow::LookAtNonHFE(Int_t iTrack1, AliVTrack *track1, Ali
          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
+         AliKFParticle ktrack1(*track1, fPDGtrack1);\r
+         AliKFParticle ktrack2(*track2, fPDGtrack2);\r
+         AliKFParticle recoGamma(ktrack1, ktrack2);\r
          \r
          //Reconstruction Cuts\r
-         if(fRecoGamma.GetNDF()<1) continue;\r
-         Double_t chi2OverNDF = fRecoGamma.GetChi2()/fRecoGamma.GetNDF();\r
+         if(recoGamma.GetNDF()<1) continue;\r
+         Double_t chi2OverNDF = recoGamma.GetChi2()/recoGamma.GetNDF();\r
          if(TMath::Sqrt(TMath::Abs(chi2OverNDF))>fChi2OverNDFCut) continue;\r
-         \r
+\r
+         // DCA\r
+         //Double_t dca12 = ktrack1.GetDistanceFromParticle(ktrack2);\r
+         //if(dca12 > fMaxdca) continue;         \r
+\r
+         // if set mass constraint\r
+         if(fSetMassConstraint && pVtx) {\r
+           AliKFVertex primV(*pVtx);\r
+           primV += recoGamma;\r
+           primV -= ktrack1;\r
+           primV -= ktrack2;\r
+           recoGamma.SetProductionVertex(primV);\r
+           recoGamma.SetMassConstraint(0,0.0001);\r
+         }    \r
+\r
          //Invariant Mass\r
          Double_t imass; \r
          Double_t width;\r
-         fRecoGamma.GetMass(imass,width);\r
+         recoGamma.GetMass(imass,width);\r
          \r
          //Opening Angle (Total Angle)\r
-         Double_t angle = fKFtrack1.GetAngle(fKFtrack2);\r
+         Double_t angle = ktrack1.GetAngle(ktrack2);\r
          valueangle[0] = angle;\r
          if((fCharge1*fCharge2)>0.0) fSameSignAngle->Fill(&valueangle[0]);\r
-         else fOppSignAngle->Fill(&valueangle[0]);       \r
+         else fOppSignAngle->Fill(&valueangle[0]);\r
+\r
+         // Cut\r
+         if(angle > fMaxopening3D) continue;     \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
+         else {\r
+           fOppSignDeltaPhiMaps->Fill(&valuensparseDeltaPhiMaps[0]);\r
+           /*\r
+           if(valueangle[2] == kElectronfromconversionboth) {\r
+             printf("Reconstructed charge1 %f, charge 2 %f and invmass %f\n",fCharge1,fCharge2,imass);\r
+             printf("MC charge1 %d, charge 2 %d\n",pdg1,pdg2);\r
+             printf("DCA %f\n",dca12);\r
+             printf("Number of found %d\n",numberfound);\r
+           }\r
+           */\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
+  \r
   if(oppositetaggedphotonic && sametaggedphotonic){\r
     taggedphotonic = 6;\r
   }\r
@@ -1964,7 +2092,6 @@ Int_t AliAnalysisTaskHFEFlow::LookAtNonHFE(Int_t iTrack1, AliVTrack *track1, Ali
   \r
   return taggedphotonic;\r
 }\r
-\r
 //_________________________________________________________________________\r
 Int_t AliAnalysisTaskHFEFlow::FindMother(Int_t tr, AliMCEvent *mcEvent, Int_t &indexmother){\r
   //\r
@@ -1972,6 +2099,12 @@ Int_t AliAnalysisTaskHFEFlow::FindMother(Int_t tr, AliMCEvent *mcEvent, Int_t &i
   //\r
 \r
   if(!mcEvent) return 0;\r
+\r
+  Int_t pdg = CheckPdg(tr,mcEvent);\r
+  if(TMath::Abs(pdg)!= 11) {\r
+    indexmother = -1;\r
+    return kNoElectron;\r
+  }\r
   \r
   indexmother = IsMotherGamma(tr,mcEvent);\r
   if(indexmother > 0) return kElectronfromconversion;\r
@@ -1987,6 +2120,38 @@ Int_t AliAnalysisTaskHFEFlow::FindMother(Int_t tr, AliMCEvent *mcEvent, Int_t &i
   return kElectronfromother;\r
 \r
 \r
+}\r
+//____________________________________________________________________________________________________________\r
+Int_t AliAnalysisTaskHFEFlow::CheckPdg(Int_t tr, AliMCEvent* mcEvent) {\r
+\r
+  //\r
+  // Return the pdg of the particle\r
+  //\r
+\r
+\r
+  Int_t pdgcode = -1;\r
+  if(tr < 0) return pdgcode;\r
+\r
+  if(!mcEvent) return pdgcode;\r
+\r
+  AliVParticle *mctrack = mcEvent->GetTrack(tr);\r
\r
+  \r
+  if(mctrack->IsA() == AliMCParticle::Class()) {\r
+    AliMCParticle *mctrackesd = NULL;\r
+    if(!(mctrackesd = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return pdgcode;\r
+    pdgcode = mctrackesd->PdgCode();\r
+  }\r
+\r
+  if(mctrack->IsA() == AliAODMCParticle::Class()) {\r
+    AliAODMCParticle *mctrackaod = NULL;\r
+    if(!(mctrackaod = dynamic_cast<AliAODMCParticle *>(mcEvent->GetTrack(TMath::Abs(tr))))) return pdgcode;\r
+    pdgcode = mctrackaod->GetPdgCode();\r
+  }\r
+  \r
+  return pdgcode;\r
+\r
\r
 }\r
 //____________________________________________________________________________________________________________\r
 Int_t AliAnalysisTaskHFEFlow::IsMotherGamma(Int_t tr, AliMCEvent* mcEvent) {\r