]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGGA/GammaConv/AliAnalysisTaskGammaConvDalitzV1.cxx
set magnetic field if not set
[u/mrichter/AliRoot.git] / PWGGA / GammaConv / AliAnalysisTaskGammaConvDalitzV1.cxx
index cd42f1ed1e04975a1ca4e78ae07a711351506759..543713119c6a2aa8ee5cb832d2592e4f31bfaf99 100644 (file)
@@ -1,9 +1,9 @@
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
- * Author: Pedro González, Pedro Ladrón de Guevara, Ernesto López Torres, *
- *         Eulogio Serradilla                                             *
- * Version 2                                                           *
+ * Author: Pedro Gonz??lez, Pedro Ladr??n de Guevara, Ernesto L??pez Torres, *
+ *         Eulogio Serradilla, Ana Marin, Friederike Bock                 *
+ * Version 2                                                              *
  *                                                                        *
  * Permission to use, copy, modify and distribute this software and its   *
  * documentation strictly for non-commercial purposes is hereby granted   *
@@ -15,6 +15,7 @@
  **************************************************************************/
 
 // Analysis task for pi0->e+e-gamma (Dalitz decay)
+// Analysis task for chic->JPsi+gamma
 
 #include <vector>
 
 #include "TList.h"
 #include "TChain.h"
 #include "TDirectory.h"
-
+#include "TTree.h"
+#include "TH1.h"
+#include "TH1F.h"
+#include "THnSparse.h"
+#include "TH2F.h"
 #include "AliStack.h"
 #include "AliAnalysisManager.h"
 #include "AliESDInputHandler.h"
 #include "AliCentrality.h"
 #include "AliMultiplicity.h"
 #include "AliAnalysisTaskGammaConvDalitzV1.h"
-#include "TH1.h"
-#include "TH2F.h"
-#include "THnSparse.h"
+
 
 ClassImp( AliAnalysisTaskGammaConvDalitzV1 )
 
 //-----------------------------------------------------------------------------------------------
 AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1():
-   fV0Reader(NULL),
+fV0Reader(NULL),
    fElecSelector(NULL),
    fBGHandler(NULL),
    fESDEvent(NULL),
@@ -65,6 +68,7 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1():
    fCutFolder(NULL),
    fESDList(NULL),
    fBackList(NULL),
+   fMotherList(NULL),
    fTrueList(NULL),
    fMCList(NULL),
    fOutputContainer(0),
@@ -83,18 +87,62 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1():
    hESDConvGammaPt(NULL),
    hESDDalitzElectronPt(NULL),
    hESDDalitzPositronPt(NULL),
+   hESDDalitzElectronPhi(NULL),
+   hESDDalitzPositronPhi(NULL),
+   hESDDalitzElectronAfterPt(NULL),
+   hESDDalitzPositronAfterPt(NULL),
+   hESDDalitzElectronAfterPhi(NULL),
+   hESDDalitzPositronAfterPhi(NULL),
+   hESDDalitzElectronAfterNFindClsTPC(NULL),
+   hESDDalitzPositronAfterNFindClsTPC(NULL),
+   hESDDalitzPosEleAfterDCAxy(NULL),
+   hESDDalitzPosEleAfterDCAz(NULL),
+   hESDDalitzPosEleAfterTPCdEdx(NULL),
+   hESDDalitzPosEleAfterTPCdEdxSignal(NULL),
+   hESDMotherPhi(NULL),
    hESDEposEnegPsiPairDPhi(NULL),
+   hESDEposEnegInvMassPt(NULL),
+   hESDEposEnegLikeSignBackInvMassPt(NULL),
    hESDMotherInvMassPt(NULL),
+   hESDPi0MotherInvMassPt(NULL),
+   hESDPi0MotherDiffInvMassPt(NULL),
+   hESDPi0MotherDiffLimInvMassPt(NULL),
    sESDMotherInvMassPtZM(NULL),
    hESDMotherBackInvMassPt(NULL),
    sESDMotherBackInvMassPtZM(NULL),
+   hMCAllGammaPt(NULL),
+   hMCConvGammaPt(NULL),
+   hMCConvGammaRSPt(NULL),
+   hMCAllPositronsPt(NULL),
+   hMCAllElectronsPt(NULL),
+   hMCPi0DalitzGammaPt(NULL),
+   hMCPi0DalitzElectronPt(NULL),
+   hMCPi0DalitzPositronPt(NULL),
    hMCPi0Pt(NULL),
+   hMCPi0GGPt(NULL),
    hMCEtaPt(NULL),
+   hMCEtaGGPt(NULL), 
    hMCPi0InAccPt(NULL),
    hMCEtaInAccPt(NULL),
+   hMCChiCPt(NULL),
+   hMCChiCInAccPt(NULL),
+   hESDEposEnegTruePi0DalitzInvMassPt(NULL),
+   hESDEposEnegTruePi0DalitzPsiPairDPhi(NULL),
+   hESDEposEnegTrueEtaDalitzInvMassPt(NULL),
+   hESDEposEnegTrueEtaDalitzPsiPairDPhi(NULL),
+   hESDEposEnegTruePhotonInvMassPt(NULL),
+   hESDEposEnegTruePhotonPsiPairDPhi(NULL),
+   hESDEposEnegTrueJPsiInvMassPt(NULL),
+   hESDTrueMotherChiCInvMassPt(NULL),
+   hESDTrueMotherChiCDiffInvMassPt(NULL),
    hESDTrueMotherInvMassPt(NULL),
+   hESDTrueMotherDalitzInvMassPt(NULL),
    hESDTrueMotherPi0GGInvMassPt(NULL),
+   hESDTruePrimaryMotherPi0GGInvMassPt(NULL),
+   hESDTrueSecondaryMotherPi0GGInvMassPt(NULL),
    hESDTruePrimaryMotherInvMassMCPt(NULL),
+   hESDTruePrimaryMotherInvMassPt(NULL),
+   hESDTruePrimaryMotherW0WeightingInvMassPt(NULL),
    hESDTruePrimaryPi0DalitzESDPtMCPt(NULL),
    hESDTrueSecondaryMotherInvMassPt(NULL),
    hESDTrueSecondaryMotherFromK0sInvMassPt(NULL),
@@ -102,8 +150,20 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1():
    hESDTrueBckContInvMassPt(NULL),
    hESDTrueMotherGGInvMassPt(NULL),
    hESDTrueConvGammaPt(NULL),
+   hESDTruePositronPt(NULL),
+   hESDTrueElectronPt(NULL),
+   hESDTrueSecConvGammaPt(NULL),
+   hESDTrueSecPositronPt(NULL),
+   hESDTrueSecElectronPt(NULL),
+   hESDTruePi0DalitzConvGammaPt(NULL),
+   hESDTruePi0DalitzPositronPt(NULL),
+   hESDTruePi0DalitzElectronPt(NULL),
+   hESDTruePi0DalitzSecConvGammaPt(NULL),
+   hESDTruePi0DalitzSecPositronPt(NULL),
+   hESDTruePi0DalitzSecElectronPt(NULL),
    hNEvents(NULL),
    hNGoodESDTracks(NULL),
+   hEtaShift(NULL),
    fRandom(0),
    fUnsmearedPx(NULL),
    fUnsmearedPy(NULL),
@@ -114,11 +174,13 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1():
    fNumberOfESDTracks(0),
    fMoveParticleAccordingToVertex(kFALSE),
    fIsHeavyIon(kFALSE),
-   fDoMesonAnalysis(kTRUE)
+   fDoMesonAnalysis(kTRUE),
+   fDoChicAnalysis(kFALSE),
+   fDoMesonQA(kFALSE),
+   fIsFromMBHeader(kTRUE),
+   fIsMC(kFALSE)
 {
-   // Define input and output slots here
-  // DefineInput(0, TChain::Class());
-  // DefineOutput(1, TList::Class());
+
 }
 
 //-----------------------------------------------------------------------------------------------
@@ -133,6 +195,7 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1( const char*
    fCutFolder(NULL),
    fESDList(NULL),
    fBackList(NULL),
+   fMotherList(NULL),
    fTrueList(NULL),
    fMCList(NULL),
    fOutputContainer(0),
@@ -151,18 +214,62 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1( const char*
    hESDConvGammaPt(NULL),
    hESDDalitzElectronPt(NULL),
    hESDDalitzPositronPt(NULL),
+   hESDDalitzElectronPhi(NULL),
+   hESDDalitzPositronPhi(NULL),
+   hESDDalitzElectronAfterPt(NULL),
+   hESDDalitzPositronAfterPt(NULL),
+   hESDDalitzElectronAfterPhi(NULL),
+   hESDDalitzPositronAfterPhi(NULL),
+   hESDDalitzElectronAfterNFindClsTPC(NULL),
+   hESDDalitzPositronAfterNFindClsTPC(NULL),
+   hESDDalitzPosEleAfterDCAxy(NULL),
+   hESDDalitzPosEleAfterDCAz(NULL),
+   hESDDalitzPosEleAfterTPCdEdx(NULL),
+   hESDDalitzPosEleAfterTPCdEdxSignal(NULL),
+   hESDMotherPhi(NULL),
    hESDEposEnegPsiPairDPhi(NULL),
+   hESDEposEnegInvMassPt(NULL),
+   hESDEposEnegLikeSignBackInvMassPt(NULL),
    hESDMotherInvMassPt(NULL),
+   hESDPi0MotherInvMassPt(NULL),
+   hESDPi0MotherDiffInvMassPt(NULL),
+   hESDPi0MotherDiffLimInvMassPt(NULL),
    sESDMotherInvMassPtZM(NULL),
    hESDMotherBackInvMassPt(NULL),
    sESDMotherBackInvMassPtZM(NULL),
+   hMCAllGammaPt(NULL),
+   hMCConvGammaPt(NULL),
+   hMCConvGammaRSPt(NULL),
+   hMCAllPositronsPt(NULL),
+   hMCAllElectronsPt(NULL),
+   hMCPi0DalitzGammaPt(NULL),
+   hMCPi0DalitzElectronPt(NULL),
+   hMCPi0DalitzPositronPt(NULL),
    hMCPi0Pt(NULL),
+   hMCPi0GGPt(NULL),
    hMCEtaPt(NULL),
+   hMCEtaGGPt(NULL),
    hMCPi0InAccPt(NULL),
    hMCEtaInAccPt(NULL),
+   hMCChiCPt(NULL),
+   hMCChiCInAccPt(NULL),
+   hESDEposEnegTruePi0DalitzInvMassPt(NULL),
+   hESDEposEnegTruePi0DalitzPsiPairDPhi(NULL),
+   hESDEposEnegTrueEtaDalitzInvMassPt(NULL),
+   hESDEposEnegTrueEtaDalitzPsiPairDPhi(NULL),
+   hESDEposEnegTruePhotonInvMassPt(NULL),
+   hESDEposEnegTruePhotonPsiPairDPhi(NULL),
+   hESDEposEnegTrueJPsiInvMassPt(NULL),
+   hESDTrueMotherChiCInvMassPt(NULL),
+   hESDTrueMotherChiCDiffInvMassPt(NULL),
    hESDTrueMotherInvMassPt(NULL),
+   hESDTrueMotherDalitzInvMassPt(NULL),
    hESDTrueMotherPi0GGInvMassPt(NULL),
+   hESDTruePrimaryMotherPi0GGInvMassPt(NULL),
+   hESDTrueSecondaryMotherPi0GGInvMassPt(NULL),
    hESDTruePrimaryMotherInvMassMCPt(NULL),
+   hESDTruePrimaryMotherInvMassPt(NULL),
+   hESDTruePrimaryMotherW0WeightingInvMassPt(NULL),
    hESDTruePrimaryPi0DalitzESDPtMCPt(NULL),
    hESDTrueSecondaryMotherInvMassPt(NULL),
    hESDTrueSecondaryMotherFromK0sInvMassPt(NULL),
@@ -170,8 +277,20 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1( const char*
    hESDTrueBckContInvMassPt(NULL),
    hESDTrueMotherGGInvMassPt(NULL),
    hESDTrueConvGammaPt(NULL),
+   hESDTruePositronPt(NULL),
+   hESDTrueElectronPt(NULL),
+   hESDTrueSecConvGammaPt(NULL),
+   hESDTrueSecPositronPt(NULL),
+   hESDTrueSecElectronPt(NULL),
+   hESDTruePi0DalitzConvGammaPt(NULL),
+   hESDTruePi0DalitzPositronPt(NULL),
+   hESDTruePi0DalitzElectronPt(NULL),
+   hESDTruePi0DalitzSecConvGammaPt(NULL),
+   hESDTruePi0DalitzSecPositronPt(NULL),
+   hESDTruePi0DalitzSecElectronPt(NULL),
    hNEvents(NULL),
    hNGoodESDTracks(NULL),
+   hEtaShift(NULL),
    fRandom(0),
    fUnsmearedPx(NULL),
    fUnsmearedPy(NULL),
@@ -182,20 +301,22 @@ AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1( const char*
    fNumberOfESDTracks(0),
    fMoveParticleAccordingToVertex(kFALSE),
    fIsHeavyIon(kFALSE),
-   fDoMesonAnalysis(kTRUE)
+   fDoMesonAnalysis(kTRUE),
+   fDoChicAnalysis(kFALSE),
+   fDoMesonQA(kFALSE),
+   fIsFromMBHeader(kTRUE),
+   fIsMC(kFALSE)
 {
-        DefineInput(0, TChain::Class());
-        DefineOutput(1, TList::Class());
-       // DefineOutput(2, TList::Class());
-
+   DefineOutput(1, TList::Class());
 }
 
 //-----------------------------------------------------------------------------------------------
 AliAnalysisTaskGammaConvDalitzV1::~AliAnalysisTaskGammaConvDalitzV1()
 {
-//
-// virtual destructor
-//
+   //
+   // virtual destructor
+   //
+   cout<<"Destructor"<<endl;
 
    if(fGoodGammas){
       delete fGoodGammas;
@@ -217,410 +338,813 @@ AliAnalysisTaskGammaConvDalitzV1::~AliAnalysisTaskGammaConvDalitzV1()
       delete[] fBGHandler;
       fBGHandler = 0x0;
    }
+   if( fGammasPool ){
+      delete[] fGammasPool;
+      fGammasPool = 0x0;
+   }
 }
-
 //___________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::InitBack(){
 
-   Double_t *zBinLimitsArray = new Double_t[9];
-   zBinLimitsArray[0] = -50.00;
-   zBinLimitsArray[1] = -3.375;
-   zBinLimitsArray[2] = -1.605;
-   zBinLimitsArray[3] = -0.225;
-   zBinLimitsArray[4] = 1.065;
-   zBinLimitsArray[5] = 2.445;
-   zBinLimitsArray[6] = 4.245;
-   zBinLimitsArray[7] = 50.00;
-   zBinLimitsArray[8] = 1000.00;
-
-   Double_t *multiplicityBinLimitsArrayTracks = new Double_t[6];
-   multiplicityBinLimitsArrayTracks[0] = 0;
-   multiplicityBinLimitsArrayTracks[1] = 8.5;
-   multiplicityBinLimitsArrayTracks[2] = 16.5;
-   multiplicityBinLimitsArrayTracks[3] = 27.5;
-   multiplicityBinLimitsArrayTracks[4] = 41.5;
-   multiplicityBinLimitsArrayTracks[5] = 200.;
-   if(fIsHeavyIon){
-      multiplicityBinLimitsArrayTracks[0] = 0;
-      multiplicityBinLimitsArrayTracks[1] = 200.;
-      multiplicityBinLimitsArrayTracks[2] = 500.;
-      multiplicityBinLimitsArrayTracks[3] = 1000.;
-      multiplicityBinLimitsArrayTracks[4] = 1500.;
-      multiplicityBinLimitsArrayTracks[5] = 5000.;
-   }
-
-   Double_t *multiplicityBinLimitsArrayV0s = new Double_t[5];
-   multiplicityBinLimitsArrayV0s[0] = 2;
-   multiplicityBinLimitsArrayV0s[1] = 3;
-   multiplicityBinLimitsArrayV0s[2] = 4;
-   multiplicityBinLimitsArrayV0s[3] = 5;
-   multiplicityBinLimitsArrayV0s[4] = 9999;
-   if(fIsHeavyIon){
-      multiplicityBinLimitsArrayV0s[0] = 2;
-      multiplicityBinLimitsArrayV0s[1] = 10;
-      multiplicityBinLimitsArrayV0s[2] = 30;
-      multiplicityBinLimitsArrayV0s[3] = 50;
-      multiplicityBinLimitsArrayV0s[4] = 9999;
-   }
-
    const Int_t nDim = 4;
-   Int_t nBins[nDim] = {1000,250,8,5};
+   Int_t nBins[nDim] = {800,250,7,4};
    Double_t xMin[nDim] = {0,0, 0,0};
-   Double_t xMax[nDim] = {1,25,8,5};
-
+   Double_t xMax[nDim] = {0.8,25,7,4};
+   
    sESDMotherInvMassPtZM = new THnSparseF*[fnCuts];
    sESDMotherBackInvMassPtZM = new THnSparseF*[fnCuts];
 
    fBGHandler = new AliGammaConversionAODBGHandler*[fnCuts];
-
+   //fBGHandlerRP = new AliConversionAODBGHandlerRP*[fnCuts];
    for(Int_t iCut = 0; iCut<fnCuts;iCut++){
+      //if (((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->DoBGCalculation()){
 
+         
+         TString cutstringElectron     =   ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
+         TString cutstringMeson        =   ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
+         TString cutstringGamma        =   ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
 
-      TString cutstringElectron =((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
-      TString cutstringMeson= ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
-      TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
 
+         
+         Int_t collisionSystem = atoi((TString)(((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber())(0,1));
+         Int_t centMin = atoi((TString)(((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber())(1,1));
+         Int_t centMax = atoi((TString)(((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber())(2,1));
+         
+         if(collisionSystem == 1 || collisionSystem == 2 ||
+            collisionSystem == 5 || collisionSystem == 8 ||
+            collisionSystem == 9){
+            centMin = centMin*10;
+            centMax = centMax*10; 
+         }
+         else if(collisionSystem == 3 || collisionSystem == 6){
+            centMin = centMin*5;
+            centMax = centMax*5;
+         }
+         else if(collisionSystem == 4 || collisionSystem == 7){
+            centMin = ((centMin*5)+45);
+            centMax = ((centMax*5)+45);
+         }
 
-      fBackList[iCut] = new TList();
-      fBackList[iCut]->SetName(Form("%s_%s_%s Back histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
-      fBackList[iCut]->SetOwner(kTRUE);
-      fCutFolder[iCut]->Add(fBackList[iCut]);
 
+         fBackList[iCut] = new TList();
+         fBackList[iCut]->SetName(Form("%s_%s_%s Back histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
+         fBackList[iCut]->SetOwner(kTRUE);
+         fCutFolder[iCut]->Add(fBackList[iCut]);
 
+         sESDMotherBackInvMassPtZM[iCut] = new THnSparseF("Back_Back_InvMass_Pt_z_m","Back_Back_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
+         fBackList[iCut]->Add(sESDMotherBackInvMassPtZM[iCut]);
 
+         fMotherList[iCut] = new TList();
+         fMotherList[iCut]->SetName(Form("%s_%s_%s Mother histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
+         fMotherList[iCut]->SetOwner(kTRUE);
+         fCutFolder[iCut]->Add(fMotherList[iCut]);
 
-      sESDMotherInvMassPtZM[iCut] = new THnSparseF("Back_Mother_InvMass_Pt_z_m","Back_Mother_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
-      sESDMotherInvMassPtZM[iCut]->Sumw2();
-      fBackList[iCut]->Add(sESDMotherInvMassPtZM[iCut]);
-      sESDMotherBackInvMassPtZM[iCut] = new THnSparseF("Back_Back_InvMass_Pt_z_m","Back_Back_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
-      sESDMotherBackInvMassPtZM[iCut]->Sumw2();
-      fBackList[iCut]->Add(sESDMotherBackInvMassPtZM[iCut]);
+         sESDMotherInvMassPtZM[iCut] = new THnSparseF("Back_Mother_InvMass_Pt_z_m","Back_Mother_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
+         fMotherList[iCut]->Add(sESDMotherInvMassPtZM[iCut]);
 
-      if(((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->UseTrackMultiplicity()){
-         fBGHandler[iCut] = new AliGammaConversionAODBGHandler(9,6,((AliConversionMesonCuts*)fCutGammaArray->At(iCut))->NumberOfBGEvents());
-         fBGHandler[iCut]->Initialize(zBinLimitsArray, multiplicityBinLimitsArrayTracks);
-      }
-      else{
-         fBGHandler[iCut] = new AliGammaConversionAODBGHandler(9,5,((AliConversionMesonCuts*)fCutGammaArray->At(iCut))->NumberOfBGEvents());
-         fBGHandler[iCut]->Initialize(zBinLimitsArray, multiplicityBinLimitsArrayV0s);
-      }
+         
+         fBGHandler[iCut] = new AliGammaConversionAODBGHandler(
+                                                                  collisionSystem,centMin,centMax,
+                                                                  ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->NumberOfRotationEvents(),
+                                                                  ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->UseTrackMultiplicity());
+        
+        if( ( (AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetBKGMethod() == 3 ){
+         fGammasPool[iCut] = new TList();
+        }
+
+      //}
    }
 }
 
 //______________________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::UserCreateOutputObjects()
 {
-//
-// Create ouput objects
-//
+   //
+   // Create ouput objects
+   //
+
+   // Create the output container
+   if(fOutputContainer != NULL){
+      delete fOutputContainer;
+      fOutputContainer = NULL;
+   }
+   if(fOutputContainer == NULL){
+      fOutputContainer = new TList();
+      fOutputContainer->SetOwner(kTRUE);
+   }
 
-       // Create the output container
-       if(fOutputContainer != NULL){
-               delete fOutputContainer;
-               fOutputContainer = NULL;
-       }
-       if(fOutputContainer == NULL){
-               fOutputContainer = new TList();
-               fOutputContainer->SetOwner(kTRUE);
-       }
+   fGoodGammas = new TList();
+   //fGoodGammas->SetOwner(kTRUE);
 
-       fGoodGammas = new TList();
-        //fGoodGammas->SetOwner(kTRUE);
 
-       
-        fGoodVirtualGammas = new TList();
-           //fGoodVirtualGammas->SetOwner(kTRUE);
+   fGoodVirtualGammas = new TList();
+   //fGoodVirtualGammas->SetOwner(kTRUE);
+
+
+
+   fGammasPool                     = new TList*[fnCuts];
+   fCutFolder                      = new TList*[fnCuts];
+   fESDList                        = new TList*[fnCuts];
+   fBackList                       = new TList*[fnCuts];
+   fMotherList                     = new TList*[fnCuts];
+   hNEvents                        = new TH1I*[fnCuts];
+   hNGoodESDTracks                 = new TH1I*[fnCuts];
+   hEtaShift                       = new TProfile*[fnCuts];
+   hESDConvGammaPt                 = new TH1F*[fnCuts];
+   hESDDalitzElectronPt            = new TH1F*[fnCuts];
+   hESDDalitzPositronPt            = new TH1F*[fnCuts];
+   hESDDalitzElectronPhi          = new TH1F*[fnCuts];
+   hESDDalitzPositronPhi          = new TH1F*[fnCuts];
+   
+   if( fDoMesonQA ) {
+   hESDDalitzElectronAfterPt      = new TH1F*[fnCuts];
+   hESDDalitzPositronAfterPt       = new TH1F*[fnCuts];
+   hESDDalitzElectronAfterPhi      = new TH1F*[fnCuts];
+   hESDDalitzPositronAfterPhi      = new TH1F*[fnCuts];
+   hESDDalitzElectronAfterNFindClsTPC = new TH2F*[fnCuts];
+   hESDDalitzPositronAfterNFindClsTPC = new TH2F*[fnCuts];
+   hESDDalitzPosEleAfterDCAxy     = new TH2F*[fnCuts];
+   hESDDalitzPosEleAfterDCAz       = new TH2F*[fnCuts];
+   hESDDalitzPosEleAfterTPCdEdx    = new TH2F*[fnCuts];
+   hESDDalitzPosEleAfterTPCdEdxSignal = new TH2F*[fnCuts];
+   hESDMotherPhi                   = new TH1F*[fnCuts];
+   hESDEposEnegPsiPairDPhi         = new TH2F*[fnCuts];
+   hESDEposEnegInvMassPt           = new TH2F*[fnCuts];
+   hESDEposEnegLikeSignBackInvMassPt = new TH2F*[fnCuts];
+   
+   }
+   
+   
+   
+   hESDMotherInvMassPt             = new TH2F*[fnCuts];
+   
+   if(fDoChicAnalysis) {
+   hESDPi0MotherInvMassPt          = new TH2F*[fnCuts];
+   hESDPi0MotherDiffInvMassPt      = new TH2F*[fnCuts];
+   hESDPi0MotherDiffLimInvMassPt   = new TH2F*[fnCuts];
+   }
+   
+   
+   hESDMotherBackInvMassPt         = new TH2F*[fnCuts];
+
+
+   for(Int_t iCut = 0; iCut<fnCuts;iCut++){
+
+
+      TString cutstringElectron =((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
+      TString cutstringMeson= ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
+      TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
+
+      fCutFolder[iCut] = new TList();
+      fCutFolder[iCut]->SetName(Form("Cut Number %s_%s_%s",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
+      fCutFolder[iCut]->SetOwner(kTRUE);
+      fOutputContainer->Add(fCutFolder[iCut]);
+
+      fESDList[iCut] = new TList();
+      fESDList[iCut]->SetName(Form("%s_%s_%s ESD histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
+      fESDList[iCut]->SetOwner(kTRUE);
+
+
+
+      hNEvents[iCut] = new TH1I("NEvents","NEvents",9,-0.5,8.5);
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(1,"Accepted");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(2,"Centrality");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(3,"Missing MC");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(4,"Trigger");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(5,"Vertex Z");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(6,"Cont. Vertex");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(7,"Pile-Up");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(8,"no SDD");
+      hNEvents[iCut]->GetXaxis()->SetBinLabel(9,"no V0AND");
+      fESDList[iCut]->Add(hNEvents[iCut]);
 
 
-       
 
+      if(fIsHeavyIon) hNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",3000,0,3000);
+      else hNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
+      fESDList[iCut]->Add(hNGoodESDTracks[iCut]);
 
-        fGammasPool = new TList*[fnCuts];
+      hEtaShift[iCut] = new TProfile("Eta Shift","Eta Shift",1, -0.5,0.5);
+      fESDList[iCut]->Add(hEtaShift[iCut]);
 
-       fCutFolder = new TList*[fnCuts];
-       fESDList = new TList*[fnCuts];
-       fBackList = new TList*[fnCuts];
-       hNEvents = new TH1I*[fnCuts];
-       hNGoodESDTracks = new TH1I*[fnCuts];
-       hESDConvGammaPt = new TH1F*[fnCuts];
-       hESDDalitzElectronPt = new TH1F*[fnCuts];
-       hESDDalitzPositronPt = new TH1F*[fnCuts];
-        hESDEposEnegPsiPairDPhi = new TH2F*[fnCuts];
+      hESDConvGammaPt[iCut] = new TH1F("ESD_ConvGamma_Pt","ESD_ConvGamma_Pt",250,0,25);
+      fESDList[iCut]->Add(hESDConvGammaPt[iCut]);
+
+      hESDDalitzElectronPt[iCut] = new TH1F("ESD_DalitzElectron_Pt","ESD_DalitzElectron_Pt",1000,0,25);
+      fESDList[iCut]->Add(hESDDalitzElectronPt[iCut]);
+
+      hESDDalitzPositronPt[iCut] = new TH1F("ESD_DalitzPositron_Pt","ESD_DalitzPositron_Pt",1000,0,25);
+      fESDList[iCut]->Add(hESDDalitzPositronPt[iCut]);
+      
+      
+      hESDDalitzElectronPhi[iCut] = new TH1F("ESD_DalitzElectron_Phi","ESD_DalitzElectron_Phi",360,0,2*TMath::Pi());
+      fESDList[iCut]->Add(hESDDalitzElectronPhi[iCut]);
+
+      hESDDalitzPositronPhi[iCut] = new TH1F("ESD_DalitzPositron_Phi","ESD_DalitzPositron_Phi",360,0,2*TMath::Pi());
+      fESDList[iCut]->Add(hESDDalitzPositronPhi[iCut]);
+      
+     
+      
+      if ( fDoMesonQA ) {
        
-       //if(fDoMesonAnalysis){
-               hESDMotherInvMassPt = new TH2F*[fnCuts];
-               hESDMotherBackInvMassPt = new TH2F*[fnCuts];
-       //}
-       for(Int_t iCut = 0; iCut<fnCuts;iCut++){
-
-
-               TString cutstringElectron =((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
-               TString cutstringMeson= ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
-               TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
-
-               fCutFolder[iCut] = new TList();
-               fCutFolder[iCut]->SetName(Form("Cut Number %s_%s_%s",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
-               fCutFolder[iCut]->SetOwner(kTRUE);
-               fOutputContainer->Add(fCutFolder[iCut]);
-               fESDList[iCut] = new TList();
-               fESDList[iCut]->SetName(Form("%s_%s_%s ESD histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
-               fESDList[iCut]->SetOwner(kTRUE);
-               hNEvents[iCut] = new TH1I("NEvents","NEvents",7,-0.5,6.5);
-               fESDList[iCut]->Add(hNEvents[iCut]);
-               if(fIsHeavyIon) hNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",3000,0,3000);
-               else hNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
-               fESDList[iCut]->Add(hNGoodESDTracks[iCut]);
-               hESDConvGammaPt[iCut] = new TH1F("ESD_ConvGamma_Pt","ESD_ConvGamma_Pt",250,0,25);
-                fESDList[iCut]->Add(hESDConvGammaPt[iCut]);
-               hESDDalitzElectronPt[iCut] = new TH1F("ESD_DalitzElectron_Pt","ESD_DalitzElectron_Pt",250,0,25);
-                fESDList[iCut]->Add(hESDDalitzElectronPt[iCut]);
-               hESDDalitzPositronPt[iCut] = new TH1F("ESD_DalitzPositron_Pt","ESD_DalitzPositron_Pt",250,0,25);
-                fESDList[iCut]->Add(hESDDalitzPositronPt[iCut]);
-                
-         
-                hESDEposEnegPsiPairDPhi[iCut] = new TH2F("ESD_EposEneg_PsiPair_DPhi","ESD_EposEneg_PsiPair_DPhi", 100, -1.0*TMath::Pi(), TMath::Pi(),100,-1.0*TMath::Pi(), TMath::Pi() );
-                fESDList[iCut]->Add(hESDEposEnegPsiPairDPhi[iCut]);
-                
-                 
+        
+      
+      hESDDalitzElectronAfterPt[iCut] = new TH1F("ESD_DalitzElectron_After_Pt","ESD_DalitzElectron_After_Pt",1000,0,25);
+      fESDList[iCut]->Add(hESDDalitzElectronAfterPt[iCut]);
 
+      hESDDalitzPositronAfterPt[iCut] = new TH1F("ESD_DalitzPositron_After_Pt","ESD_DalitzPositron_After_Pt",1000,0,25);
+      fESDList[iCut]->Add(hESDDalitzPositronAfterPt[iCut]);
+                  
+      hESDDalitzElectronAfterPhi[iCut] = new TH1F("ESD_DalitzElectron_After_Phi","ESD_DalitzElectron_After_Phi",360,0,2*TMath::Pi());
+      fESDList[iCut]->Add(hESDDalitzElectronAfterPhi[iCut]);
+
+      hESDDalitzPositronAfterPhi[iCut] = new TH1F("ESD_DalitzPositron_After_Phi","ESD_DalitzPositron_After_Phi",360,0,2*TMath::Pi());
+      fESDList[iCut]->Add(hESDDalitzPositronAfterPhi[iCut]);
+      
+      hESDDalitzElectronAfterNFindClsTPC[iCut]  = new TH2F("ESD_DalitzElectron_After_NFindClsTPC","ESD_DalitzElectron_After_NFindClsTPC",100,0,1,400,0.,10.);
+      fESDList[iCut]->Add(hESDDalitzElectronAfterNFindClsTPC[iCut]);
+      
+      hESDDalitzPositronAfterNFindClsTPC[iCut]  = new TH2F("ESD_DalitzPositron_After_NFindClsTPC","ESD_DalitzPositron_After_NFindClsTPC",100,0,1,400,0.,10.);
+      fESDList[iCut]->Add(hESDDalitzPositronAfterNFindClsTPC[iCut]);
+      
+      hESDDalitzPosEleAfterDCAxy[iCut] = new TH2F("ESD_DalitzPosEle_After_DCAxy","ESD_DalitzPosEle_After_DCAxy",800,-4.0,4.0,400,0.,10.);
+      fESDList[iCut]->Add(hESDDalitzPosEleAfterDCAxy[iCut]);
+      
+      hESDDalitzPosEleAfterDCAz[iCut]  = new TH2F("ESD_DalitzPosEle_After_DCAz","ESD_DalitzPosEle_After_DCAz",800,-4.0,4.0,400,0.,10.);
+      fESDList[iCut]->Add(hESDDalitzPosEleAfterDCAz[iCut]);
+      
+      hESDDalitzPosEleAfterTPCdEdx[iCut] = new TH2F("ESD_DalitzPosEle_After_TPCdEdx","ESD_DalitzPosEle_After_TPCdEdx",150,0.05,20,400,-10,10);
+      fESDList[iCut]->Add(hESDDalitzPosEleAfterTPCdEdx[iCut]);
+      
+      hESDDalitzPosEleAfterTPCdEdxSignal[iCut] =new TH2F("ESD_DalitzPosEle_After_TPCdEdxSignal","ESD_DalitzPosEle_After_TPCdEdxSignal" ,150,0.05,20.0,800,0.0,200);
+      fESDList[iCut]->Add(hESDDalitzPosEleAfterTPCdEdxSignal[iCut]);  
+      
+      hESDMotherPhi[iCut] = new TH1F("ESD_DalitzMother_Phi","ESD_DalitzMother_Phi",360,0,2*TMath::Pi());
+      fESDList[iCut]->Add(hESDMotherPhi[iCut]);
+      
+      hESDEposEnegPsiPairDPhi[iCut] = new TH2F("ESD_EposEneg_PsiPair_DPhi","ESD_EposEneg_PsiPair_DPhi", 100, -1.0,1.0,100,-1.0,1.0 );
+      fESDList[iCut]->Add(hESDEposEnegPsiPairDPhi[iCut]);
 
-               // hESDDalitzPositronPt[iCut] = new TH1F("ESD_EposEneg_PsiPair_vs_DPhi","ESD_EposEneg_PsiPair_vs_DPhi",250,0,25);
+      hESDEposEnegInvMassPt[iCut] = new TH2F("ESD_EposEneg_InvMassPt","ESD_EposEneg_InvMassPt",5000,0.,5.,100,0.,10.);
+      fESDList[iCut]->Add(hESDEposEnegInvMassPt[iCut]);
+      
+      hESDEposEnegLikeSignBackInvMassPt[iCut]  = new TH2F("ESD_EposEneg_LikeSignBack_InvMassPt","ESD_EposEneg_LikeSignBack_InvMassPt",5000,0.,5.,100,0.,10.);
+      fESDList[iCut]->Add(hESDEposEnegLikeSignBackInvMassPt[iCut]);
+      
+      }
+      
+      
+      
+      
+      
+      
      
-//             if(fDoMesonAnalysis){
-                       hESDMotherInvMassPt[iCut] = new TH2F("ESD_DalitzMother_InvMass_Pt","ESD_DalitzMother_InvMass_Pt",1000,0,1,250,0,25);
-                       fESDList[iCut]->Add(hESDMotherInvMassPt[iCut]);
-                       hESDMotherBackInvMassPt[iCut] = new TH2F("ESD_DalitzBackground_InvMass_Pt","ESD_DalitzBackground_InvMass_Pt",1000,0,1,250,0,25);
-                       fESDList[iCut]->Add(hESDMotherBackInvMassPt[iCut]);
-//             }
-               fCutFolder[iCut]->Add(fESDList[iCut]);
-
-
-             if( fCutElectronArray ){
-                if( ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutHistograms() ) {
-                    fCutFolder[iCut]->Add( ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutHistograms() );
-                }
-            }
 
-             if( fCutMesonArray  ) {
-                if( ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutHistograms() ) {
-                    fCutFolder[iCut]->Add( ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutHistograms());
-                }
-             }
+      hESDMotherInvMassPt[iCut] = new TH2F("ESD_DalitzMother_InvMass_Pt","ESD_DalitzMother_InvMass_Pt",800,0,0.8,250,0,25);
+      fESDList[iCut]->Add(hESDMotherInvMassPt[iCut]);
+                                                                                 
+       
+      if( fDoChicAnalysis) {
+                  
+      hESDPi0MotherInvMassPt[iCut] = new TH2F("ESD_Pi0Mother_InvMass_Pt","ESD_Pi0Mother_InvMass_Pt",4000,0,4,250,0,25);
+      fESDList[iCut]->Add(hESDPi0MotherInvMassPt[iCut]);
+  
+      hESDPi0MotherDiffInvMassPt[iCut] = new TH2F("ESD_Pi0Mother_DiffInvMass_Pt","ESD_Pi0Mother_DiffInvMass_Pt",2000,0,2,250,0,25);
+      fESDList[iCut]->Add(hESDPi0MotherDiffInvMassPt[iCut]);
 
-            if( fCutGammaArray ) {
-                if( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutHistograms() ) {
-                    fCutFolder[iCut]->Add( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutHistograms()  );
-                }
-            }
+      hESDPi0MotherDiffLimInvMassPt[iCut] = new TH2F("ESD_Pi0Mother_DiffLimInvMass_Pt","ESD_Pi0Mother_DiffLimInvMass_Pt",2000,0,2,250,0,25);
+      fESDList[iCut]->Add(hESDPi0MotherDiffLimInvMassPt[iCut]);
+      
+      }
 
 
-       }
+      hESDMotherBackInvMassPt[iCut] = new TH2F("ESD_DalitzBackground_InvMass_Pt","ESD_DalitzBackground_InvMass_Pt",800,0,0.8,250,0,25);
+      fESDList[iCut]->Add(hESDMotherBackInvMassPt[iCut]);
 
-       //if(fDoMesonAnalysis){
-               InitBack(); // Init Background Handler
-       //}
-
-       if(MCEvent()){
-               // MC Histogramms
-               fMCList = new TList*[fnCuts];
-               // True Histogramms
-               fTrueList = new TList*[fnCuts];
-               hESDTrueConvGammaPt = new TH1F*[fnCuts];        
-               //if(fDoMesonAnalysis){
-                       hMCPi0Pt = new TH1F*[fnCuts];
-                       hMCEtaPt = new TH1F*[fnCuts];
-                       hMCPi0InAccPt = new TH1F*[fnCuts];
-                       hMCEtaInAccPt = new TH1F*[fnCuts];
-
-                       hESDTrueMotherInvMassPt = new TH2F*[fnCuts];
-                        hESDTrueMotherPi0GGInvMassPt = new TH2F*[fnCuts];
-                       hESDTruePrimaryPi0DalitzESDPtMCPt = new TH2F*[fnCuts];
-                       hESDTruePrimaryMotherInvMassMCPt = new TH2F*[fnCuts];
-                       hESDTrueSecondaryMotherInvMassPt = new TH2F*[fnCuts];
-                       hESDTrueSecondaryMotherFromK0sInvMassPt = new TH2F*[fnCuts];
-                       hESDTrueBckGGInvMassPt = new TH2F*[fnCuts];
-                       hESDTrueBckContInvMassPt = new TH2F*[fnCuts];
-                       hESDTrueMotherGGInvMassPt = new TH2F*[fnCuts];
-               //}
-
-               for(Int_t iCut = 0; iCut<fnCuts;iCut++){
-                       TString cutstringElectron =((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
-                       TString cutstringMeson= ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
-                       TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
-
-                       fMCList[iCut] = new TList();
-                       fMCList[iCut]->SetName(Form("%s_%s_%s MC histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
-                       fMCList[iCut]->SetOwner(kTRUE);
-                       fCutFolder[iCut]->Add(fMCList[iCut]);
-                       
-                               hMCPi0Pt[iCut] = new TH1F("MC_Pi0_Pt","MC_Pi0_Pt",250,0,25);
-                               fMCList[iCut]->Add(hMCPi0Pt[iCut]);
-                               hMCEtaPt[iCut] = new TH1F("MC_Eta_Pt","MC_Eta_Pt",250,0,25);
-                               fMCList[iCut]->Add(hMCEtaPt[iCut]);
-                               hMCPi0InAccPt[iCut] = new TH1F("MC_Pi0DalitzInAcc_Pt","MC_Pi0DalitzInAcc_Pt",250,0,25);
-                               fMCList[iCut]->Add(hMCPi0InAccPt[iCut]);
-                               hMCEtaInAccPt[iCut] = new TH1F("MC_EtaDalitzInAcc_Pt","MC_EtaDalitzInAcc_Pt",250,0,25);
-                               fMCList[iCut]->Add(hMCEtaInAccPt[iCut]);
+
+      if ( fDoMesonQA ) {
+       
+      TAxis *AxisAfter = hESDDalitzPosEleAfterTPCdEdx[iCut]->GetXaxis(); 
+      Int_t bins = AxisAfter->GetNbins();
+      Double_t from = AxisAfter->GetXmin();
+      Double_t to = AxisAfter->GetXmax();
+      Double_t *newBins = new Double_t[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];
+
+      AxisAfter->Set(bins, newBins);
+      AxisAfter = hESDDalitzPosEleAfterTPCdEdxSignal[iCut]->GetXaxis(); 
+      AxisAfter->Set(bins, newBins);
+
+      delete [] newBins;
+      
+      }
+
+            
+      
+      fCutFolder[iCut]->Add(fESDList[iCut]);
+
+   }
+
+
+   InitBack(); // Init Background Handler
+
+
+   //if(MCEvent()){
+    if( fIsMC ){
+      // MC Histogramms
+      fMCList = new TList*[fnCuts];
+      // True Histogramms
+      fTrueList = new TList*[fnCuts];
+      hESDTrueConvGammaPt = new TH1F*[fnCuts];
+      hESDTruePositronPt  = new TH1F*[fnCuts];
+      hESDTrueElectronPt  = new TH1F*[fnCuts];
+      hESDTrueSecConvGammaPt = new TH1F*[fnCuts];
+      hESDTrueSecPositronPt  = new TH1F*[fnCuts];
+      hESDTrueSecElectronPt  = new TH1F*[fnCuts];
+      hESDTruePi0DalitzConvGammaPt = new TH1F*[fnCuts];
+      hESDTruePi0DalitzPositronPt  = new TH1F*[fnCuts];
+      hESDTruePi0DalitzElectronPt  = new TH1F*[fnCuts];
+      hESDTruePi0DalitzSecConvGammaPt = new TH1F*[fnCuts];
+      hESDTruePi0DalitzSecPositronPt  = new TH1F*[fnCuts];
+      hESDTruePi0DalitzSecElectronPt  = new TH1F*[fnCuts];
+      //if(fDoMesonAnalysis){
+      hMCAllGammaPt  = new TH1F*[fnCuts];
+      hMCConvGammaPt = new TH1F*[fnCuts];
+      hMCConvGammaRSPt = new TH1F*[fnCuts];
+      hMCAllPositronsPt = new TH1F*[fnCuts];
+      hMCAllElectronsPt = new TH1F*[fnCuts];
+      hMCPi0DalitzGammaPt    = new TH1F*[fnCuts];
+      hMCPi0DalitzElectronPt = new TH1F*[fnCuts];
+      hMCPi0DalitzPositronPt = new TH1F*[fnCuts];
+      hMCPi0Pt = new TH1F*[fnCuts];
+      hMCPi0GGPt =  new TH1F*[fnCuts];
+      hMCEtaPt = new TH1F*[fnCuts];
+      hMCEtaGGPt = new TH1F*[fnCuts];
+      hMCPi0InAccPt = new TH1F*[fnCuts];
+      hMCEtaInAccPt = new TH1F*[fnCuts];
+                       hMCChiCPt = new TH1F*[fnCuts];
+                       hMCChiCInAccPt = new TH1F*[fnCuts];
                        
-                       fTrueList[iCut] = new TList();
-                       fTrueList[iCut]->SetName(Form("%s_%s_%s True histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
-                       fTrueList[iCut]->SetOwner(kTRUE);
-                       fCutFolder[iCut]->Add(fTrueList[iCut]);
-
-                       hESDTrueConvGammaPt[iCut] = new TH1F("ESD_TrueConvGamma_Pt","ESD_TrueConvGamma_Pt",250,0,25);
-                        fTrueList[iCut]->Add(hESDTrueConvGammaPt[iCut]);
-
-                       hESDTrueMotherInvMassPt[iCut] = new TH2F("ESD_TrueMother_InvMass_Pt","ESD_TrueMother_InvMass_Pt",1000,0,1,250,0,25);
-                       fTrueList[iCut]->Add(hESDTrueMotherInvMassPt[iCut]);
-
-                        hESDTrueMotherPi0GGInvMassPt[iCut] = new TH2F("ESD_TrueMotherPi0GG_InvMass_Pt","ESD_TrueMotherPi0GG_InvMass_Pt",1000,0,1,250,0,25);
-                                fTrueList[iCut]->Add(hESDTrueMotherPi0GGInvMassPt[iCut]);
-                               hESDTruePrimaryPi0DalitzESDPtMCPt[iCut] = new TH2F("ESD_TruePrimaryPi0Dalitz_ESDPt_MCPt","ESD_TruePrimaryPi0Dalitz_ESDPt_MCPt",250,0,25,250,0,25);
-                               fTrueList[iCut]->Add(hESDTruePrimaryPi0DalitzESDPtMCPt[iCut]);
-                               hESDTruePrimaryMotherInvMassMCPt[iCut] = new TH2F("ESD_TruePrimaryMother_InvMass_MCPt","ESD_TrueDalitzPrimaryMother_InvMass_MCPt",1000,0,1,250,0,25);
-                               fTrueList[iCut]->Add(hESDTruePrimaryMotherInvMassMCPt[iCut]);
-                               hESDTrueSecondaryMotherInvMassPt[iCut] = new TH2F("ESD_TrueDalitzSecondaryMother_InvMass_Pt","ESD_TrueDalitzSecondaryMother_InvMass_Pt",1000,0,1,250,0,25);
-                               fTrueList[iCut]->Add(hESDTrueSecondaryMotherInvMassPt[iCut]);
-//                             hESDTrueSecondaryMotherFromK0sInvMassPt[iCut] = new TH2F("ESD_TrueDalitzSecondaryMotherFromK0s_InvMass_Pt","ESD_TrueDalitzSecondaryMotherFromK0s_InvMass_Pt",1000,0,1,250,0,25);
-//                             fTrueList[iCut]->Add(hESDTrueSecondaryMotherFromK0sInvMassPt[iCut]);
-                               hESDTrueBckGGInvMassPt[iCut] = new TH2F("ESD_TrueDalitzBckGG_InvMass_Pt","ESD_TrueDalitzBckGG_InvMass_Pt",1000,0,1,250,0,25);
-                               fTrueList[iCut]->Add(hESDTrueBckGGInvMassPt[iCut]);
-                               hESDTrueBckContInvMassPt[iCut] = new TH2F("ESD_TrueDalitzBckCont_InvMass_Pt","ESD_TrueDalitzBckCont_InvMass_Pt",1000,0,1,250,0,25);
-                               fTrueList[iCut]->Add(hESDTrueBckContInvMassPt[iCut]);
-//                             hESDTrueMotherGGInvMassPt[iCut] = new TH2F("ESD_TrueGammaGamma_InvMass_Pt","ESD_TrueGammaGamma_InvMass_Pt",1000,0,1,250,0,25);
-//                             fTrueList[iCut]->Add(hESDTrueMotherGGInvMassPt[iCut]);
                        
-               }
-       }
+      if ( fDoMesonQA ) {
+       hESDEposEnegTruePi0DalitzInvMassPt           = new TH2F*[fnCuts];
+        hESDEposEnegTruePi0DalitzPsiPairDPhi         = new TH2F*[fnCuts];
+       hESDEposEnegTrueEtaDalitzInvMassPt           = new TH2F*[fnCuts];
+        hESDEposEnegTrueEtaDalitzPsiPairDPhi         = new TH2F*[fnCuts];
+       hESDEposEnegTruePhotonInvMassPt              = new TH2F*[fnCuts];
+        hESDEposEnegTruePhotonPsiPairDPhi            = new TH2F*[fnCuts];
+       hESDEposEnegTrueJPsiInvMassPt                = new TH2F*[fnCuts];
+      }
+      
+      
+      if( fDoChicAnalysis ){
+      hESDTrueMotherChiCInvMassPt = new TH2F*[fnCuts];
+      hESDTrueMotherChiCDiffInvMassPt = new TH2F*[fnCuts];
+      }
+      
+      
+      hESDTrueMotherInvMassPt = new TH2F*[fnCuts];
+      hESDTrueMotherDalitzInvMassPt = new TH2F*[fnCuts];
+      hESDTrueMotherPi0GGInvMassPt = new TH2F*[fnCuts];
+      hESDTruePrimaryMotherPi0GGInvMassPt = new TH2F*[fnCuts];
+      hESDTrueSecondaryMotherPi0GGInvMassPt = new TH2F*[fnCuts];
+      hESDTruePrimaryPi0DalitzESDPtMCPt = new TH2F*[fnCuts];
+      hESDTruePrimaryMotherInvMassMCPt = new TH2F*[fnCuts];
+      hESDTruePrimaryMotherInvMassPt   = new TH2F*[fnCuts];
+      hESDTruePrimaryMotherW0WeightingInvMassPt = new TH2F*[fnCuts];
+      hESDTrueSecondaryMotherInvMassPt = new TH2F*[fnCuts];
+      hESDTrueSecondaryMotherFromK0sInvMassPt = new TH2F*[fnCuts];
+      hESDTrueBckGGInvMassPt = new TH2F*[fnCuts];
+      hESDTrueBckContInvMassPt = new TH2F*[fnCuts];
+      hESDTrueMotherGGInvMassPt = new TH2F*[fnCuts];
+      //}
+
+      for(Int_t iCut = 0; iCut<fnCuts;iCut++){
+         TString cutstringElectron =((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
+         TString cutstringMeson= ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
+         TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
+
+         fMCList[iCut] = new TList();
+         fMCList[iCut]->SetName(Form("%s_%s_%s MC histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
+         fMCList[iCut]->SetOwner(kTRUE);
+         fCutFolder[iCut]->Add(fMCList[iCut]);
+
+
+       hMCAllGammaPt[iCut] = new TH1F("MC_AllGamma_Pt","MC_AllGamma_Pt",250,0,25);
+       fMCList[iCut]->Add(hMCAllGammaPt[iCut]);
+       
+       hMCConvGammaPt[iCut] = new TH1F("MC_ConvGamma_Pt","MC_ConvGamma_Pt",250,0,25);
+       fMCList[iCut]->Add(hMCConvGammaPt[iCut]);
+       
+       hMCConvGammaRSPt[iCut] = new TH1F("MC_ConvGamma_RS_Pt","MC_ConvGamma_RS_Pt",250,0,25);
+        fMCList[iCut]->Add(hMCConvGammaRSPt[iCut]);
+       
+                                
+       hMCAllPositronsPt[iCut] = new TH1F("MC_AllPositrons_Pt","MC_AllPositrons_Pt",1000,0,25);
+       fMCList[iCut]->Add(hMCAllPositronsPt[iCut]);
+                                
+                                hMCAllElectronsPt[iCut] = new TH1F("MC_AllElectrons_Pt","MC_AllElectrons_Pt",1000,0,25);
+                                fMCList[iCut]->Add(hMCAllElectronsPt[iCut]);
+                                
+                                hMCPi0DalitzGammaPt[iCut] = new TH1F("MC_Pi0DalitzGamma_Pt","MC_Pi0DalitzGamma_Pt",250,0,25);
+                                 hMCPi0DalitzGammaPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCPi0DalitzGammaPt[iCut]);
+                                
+                                hMCPi0DalitzPositronPt[iCut] = new TH1F("MC_Pi0DalitzPositron_Pt","MC_Pi0DalitzPositron_Pt",1000,0,25);
+                                 hMCPi0DalitzPositronPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCPi0DalitzPositronPt[iCut]);
+                                
+                                hMCPi0DalitzElectronPt[iCut] = new TH1F("MC_Pi0DalitzElectron_Pt","MC_Pi0DalitzElectron_Pt",1000,0,25);
+                                 hMCPi0DalitzElectronPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCPi0DalitzElectronPt[iCut]);
+                                
+                                
+                                hMCPi0Pt[iCut] = new TH1F("MC_Pi0_Pt","MC_Pi0_Pt",250,0,25);
+                                 hMCPi0Pt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCPi0Pt[iCut]);
+                                
+                                hMCPi0GGPt[iCut] = new TH1F("MC_Pi0_GG_Pt","MC_Pi0_GG_Pt",250,0,25);
+                                 hMCPi0GGPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCPi0GGPt[iCut]);
+                                
+                                hMCEtaPt[iCut] = new TH1F("MC_Eta_Pt","MC_Eta_Pt",250,0,25);
+                                 hMCEtaPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCEtaPt[iCut]);
+
+                                hMCEtaGGPt[iCut] = new TH1F("MC_Eta_GG_Pt","MC_Eta_GG_Pt",250,0,25);
+                                 hMCEtaGGPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCEtaGGPt[iCut]);
+                                
+                                hMCPi0InAccPt[iCut] = new TH1F("MC_Pi0DalitzInAcc_Pt","MC_Pi0DalitzInAcc_Pt",250,0,25);
+                                 hMCPi0InAccPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCPi0InAccPt[iCut]);
+
+                                hMCEtaInAccPt[iCut] = new TH1F("MC_EtaDalitzInAcc_Pt","MC_EtaDalitzInAcc_Pt",250,0,25);
+                                 hMCEtaInAccPt[iCut]->Sumw2();
+                                fMCList[iCut]->Add(hMCEtaInAccPt[iCut]);
+
+                                hMCChiCPt[iCut] = new TH1F("MC_ChiC_Pt","MC_ChiC_Pt",250,0,25);
+                                fMCList[iCut]->Add(hMCChiCPt[iCut]);
+
+                                hMCChiCInAccPt[iCut] = new TH1F("MC_ChiCInAcc_Pt","MC_ChiCInAcc_Pt",250,0,25);
+                                fMCList[iCut]->Add(hMCChiCInAccPt[iCut]);
+
+         fTrueList[iCut] = new TList();
+         fTrueList[iCut]->SetName(Form("%s_%s_%s True histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
+         fTrueList[iCut]->SetOwner(kTRUE);
+         fCutFolder[iCut]->Add(fTrueList[iCut]);
+
+        if ( fDoMesonQA ) {
+
+
+        hESDEposEnegTruePi0DalitzInvMassPt[iCut] = new TH2F("ESD_EposEneg_TruePi0Dalitz_InvMassPt","ESD_EposEneg_TruePi0Dalitz_InvMassPt",5000,0.,5.,100,0.,10.);
+        fTrueList[iCut]->Add(hESDEposEnegTruePi0DalitzInvMassPt[iCut]);
+
+         hESDEposEnegTruePi0DalitzPsiPairDPhi[iCut] = new TH2F("ESD_EposEneg_TruePi0Dalitz_PsiPair_DPhi","ESD_EposEneg_TruePi0Dalitz_PsiPair_DPhi", 100, -1.0,1.0,100,-1.0,1.0 );
+         fTrueList[iCut]->Add(hESDEposEnegTruePi0DalitzPsiPairDPhi[iCut]);
+
+        
+        hESDEposEnegTrueEtaDalitzInvMassPt[iCut] = new TH2F("ESD_EposEneg_TrueEtaDalitz_InvMassPt","ESD_EposEneg_TrueEtaDalitz_InvMassPt",5000,0.,5.,100,0.,10.);
+        fTrueList[iCut]->Add(hESDEposEnegTrueEtaDalitzInvMassPt[iCut]);
+
+         hESDEposEnegTrueEtaDalitzPsiPairDPhi[iCut] = new TH2F("ESD_EposEneg_TrueEtaDalitz_PsiPair_DPhi","ESD_EposEneg_TrueEtaDalitz_PsiPair_DPhi", 100, -1.0,1.0,100,-1.0,1.0 );
+         fTrueList[iCut]->Add(hESDEposEnegTrueEtaDalitzPsiPairDPhi[iCut]);
+        
+        hESDEposEnegTruePhotonInvMassPt[iCut] = new TH2F("ESD_EposEneg_TruePhoton_InvMassPt","ESD_EposEneg_TruePhoton_InvMassPt",5000,0.,5.,100,0.,10.);
+        fTrueList[iCut]->Add(hESDEposEnegTruePhotonInvMassPt[iCut]);
+        
+         hESDEposEnegTruePhotonPsiPairDPhi[iCut] = new TH2F("ESD_EposEneg_TruePhoton_PsiPair_DPhi","ESD_EposEneg_TruePhoton_PsiPair_DPhi", 100, -1.0,1.0,100,-1.0,1.0 );
+         fTrueList[iCut]->Add(hESDEposEnegTruePhotonPsiPairDPhi[iCut]);
+        hESDEposEnegTrueJPsiInvMassPt[iCut] = new TH2F("ESD_EposEneg_TrueJPsi_InvMassPt","ESD_EposEneg_TrueJPsi_InvMassPt",5000,0.,5.,100,0.,10.);
+        fTrueList[iCut]->Add(hESDEposEnegTrueJPsiInvMassPt[iCut]);
+
+
+
+
+
+        }
+
+
+         hESDTruePositronPt[iCut] = new TH1F("ESD_TruePositron_Pt","ESD_TruePositron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTruePositronPt[iCut]);
+
+         hESDTrueElectronPt[iCut] = new TH1F("ESD_TrueElectron_Pt","ESD_TrueElectron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTrueElectronPt[iCut]);
+        
+        hESDTrueSecPositronPt[iCut] = new TH1F("ESD_TrueSecPositron_Pt","ESD_TrueSecPositron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTrueSecPositronPt[iCut]);
+
+         hESDTrueSecElectronPt[iCut] = new TH1F("ESD_TrueSecElectron_Pt","ESD_TrueSecElectron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTrueSecElectronPt[iCut]); 
+
+         hESDTrueConvGammaPt[iCut] = new TH1F("ESD_TrueConvGamma_Pt","ESD_TrueConvGamma_Pt",250,0,25);
+         fTrueList[iCut]->Add(hESDTrueConvGammaPt[iCut]);
+        
+        hESDTrueSecConvGammaPt[iCut] = new TH1F("ESD_TrueSecConvGamma_Pt","ESD_TrueSecConvGamma_Pt",250,0,25);
+         fTrueList[iCut]->Add(hESDTrueSecConvGammaPt[iCut]);
+
+         hESDTruePi0DalitzConvGammaPt[iCut] = new TH1F("ESD_TruePi0DalitzConvGamma_Pt","ESD_TruePi0DalitzConvGamma_Pt",250,0,25);
+         fTrueList[iCut]->Add(hESDTruePi0DalitzConvGammaPt[iCut]);
+
+         hESDTruePi0DalitzElectronPt[iCut] = new TH1F("ESD_TruePi0DalitzElectron_Pt","ESD_TruePi0DalitzElectron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTruePi0DalitzElectronPt[iCut]);
+
+         hESDTruePi0DalitzPositronPt[iCut] = new TH1F("ESD_TruePi0DalitzPositron_Pt","ESD_TruePi0DalitzPositron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTruePi0DalitzPositronPt[iCut]);
+        
+        hESDTruePi0DalitzSecConvGammaPt[iCut] = new TH1F("ESD_TruePi0DalitzSecConvGamma_Pt","ESD_TruePi0DalitzSecConvGamma_Pt",250,0,25);
+         fTrueList[iCut]->Add(hESDTruePi0DalitzSecConvGammaPt[iCut]);
+        
+        hESDTruePi0DalitzSecElectronPt[iCut] = new TH1F("ESD_TruePi0DalitzSecElectron_Pt","ESD_TruePi0DalitzSecElectron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTruePi0DalitzSecElectronPt[iCut]);
+
+         hESDTruePi0DalitzSecPositronPt[iCut] = new TH1F("ESD_TruePi0DalitzSecPositron_Pt","ESD_TruePi0DalitzSecPositron_Pt",1000,0,25);
+         fTrueList[iCut]->Add(hESDTruePi0DalitzSecPositronPt[iCut]);
+
+        if( fDoChicAnalysis) { 
+          
+        hESDTrueMotherChiCInvMassPt[iCut] = new TH2F("ESD_TrueMotherChiC_InvMass_Pt","ESD_TrueMotherChiC_InvMass_Pt",4000,0,4,250,0,25);
+         fTrueList[iCut]->Add(hESDTrueMotherChiCInvMassPt[iCut]);
+
+        hESDTrueMotherChiCDiffInvMassPt[iCut] = new TH2F("ESD_TrueMotherChiCDiff_InvMass_Pt","ESD_TrueMotherChiCDiff_InvMass_Pt",2000,0,2,250,0,25);
+         fTrueList[iCut]->Add(hESDTrueMotherChiCDiffInvMassPt[iCut]);
+        
+        }
+
+        hESDTrueMotherInvMassPt[iCut] = new TH2F("ESD_TrueMother_InvMass_Pt","ESD_TrueMother_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTrueMotherInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTrueMotherInvMassPt[iCut]);
+        
+        hESDTrueMotherDalitzInvMassPt[iCut] = new TH2F("ESD_TrueMother_Dalitz_InvMass_Pt","ESD_TrueMother_Dalitz_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTrueMotherDalitzInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTrueMotherDalitzInvMassPt[iCut]);
+        
+        
+        
+        
+
+         hESDTrueMotherPi0GGInvMassPt[iCut] = new TH2F("ESD_TrueMotherPi0GG_InvMass_Pt","ESD_TrueMotherPi0GG_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTrueMotherPi0GGInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTrueMotherPi0GGInvMassPt[iCut]);
+
+         hESDTruePrimaryMotherPi0GGInvMassPt[iCut] = new TH2F("ESD_TruePrimaryMotherPi0GG_InvMass_Pt","ESD_TruePrimaryMotherPi0GG_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTruePrimaryMotherPi0GGInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTruePrimaryMotherPi0GGInvMassPt[iCut]);
+
+         hESDTrueSecondaryMotherPi0GGInvMassPt[iCut] = new TH2F("ESD_TrueSecondaryMotherPi0GG_InvMass_Pt","ESD_TrueSecondaryMotherPi0GG_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTrueSecondaryMotherPi0GGInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTrueSecondaryMotherPi0GGInvMassPt[iCut]);
+
+         hESDTruePrimaryPi0DalitzESDPtMCPt[iCut] = new TH2F("ESD_TruePrimaryPi0Dalitz_ESDPt_MCPt","ESD_TruePrimaryPi0Dalitz_ESDPt_MCPt",250,0,25,250,0,25);
+         hESDTruePrimaryPi0DalitzESDPtMCPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTruePrimaryPi0DalitzESDPtMCPt[iCut]);
+         hESDTruePrimaryMotherInvMassMCPt[iCut] = new TH2F("ESD_TruePrimaryMother_InvMass_MCPt","ESD_TrueDalitzPrimaryMother_InvMass_MCPt",800,0,0.8,250,0,25);
+         hESDTruePrimaryMotherInvMassMCPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTruePrimaryMotherInvMassMCPt[iCut]);
+         hESDTruePrimaryMotherInvMassPt[iCut] = new TH2F("ESD_TruePrimaryMother_InvMass_Pt","ESD_TruePrimaryMother_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTruePrimaryMotherInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTruePrimaryMotherInvMassPt[iCut]);
+        hESDTruePrimaryMotherW0WeightingInvMassPt[iCut] = new TH2F("ESD_TruePrimaryMotherW0Weighting_InvMass_Pt","ESD_TruePrimaryMotherW0Weighting_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTruePrimaryMotherW0WeightingInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTruePrimaryMotherW0WeightingInvMassPt[iCut]); 
+
+         hESDTrueSecondaryMotherInvMassPt[iCut] = new TH2F("ESD_TrueDalitzSecondaryMother_InvMass_Pt","ESD_TrueDalitzSecondaryMother_InvMass_Pt",800,0,0.8,250,0,25);
+         hESDTrueSecondaryMotherInvMassPt[iCut]->Sumw2();
+         fTrueList[iCut]->Add(hESDTrueSecondaryMotherInvMassPt[iCut]);
+         //                            hESDTrueSecondaryMotherFromK0sInvMassPt[iCut] = new TH2F("ESD_TrueDalitzSecondaryMotherFromK0s_InvMass_Pt","ESD_TrueDalitzSecondaryMotherFromK0s_InvMass_Pt",1000,0,1,250,0,25);
+         //                            fTrueList[iCut]->Add(hESDTrueSecondaryMotherFromK0sInvMassPt[iCut]);
+         hESDTrueBckGGInvMassPt[iCut] = new TH2F("ESD_TrueDalitzBckGG_InvMass_Pt","ESD_TrueDalitzBckGG_InvMass_Pt",800,0,0.8,250,0,25);
+         fTrueList[iCut]->Add(hESDTrueBckGGInvMassPt[iCut]);
+         hESDTrueBckContInvMassPt[iCut] = new TH2F("ESD_TrueDalitzBckCont_InvMass_Pt","ESD_TrueDalitzBckCont_InvMass_Pt",800,0,0.8,250,0,25);
+         fTrueList[iCut]->Add(hESDTrueBckContInvMassPt[iCut]);
+         //                            hESDTrueMotherGGInvMassPt[iCut] = new TH2F("ESD_TrueGammaGamma_InvMass_Pt","ESD_TrueGammaGamma_InvMass_Pt",1000,0,1,250,0,25);
+         //                            fTrueList[iCut]->Add(hESDTrueMotherGGInvMassPt[iCut]);
+
+      }
+   }
+   
+   fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
+   if(!fV0Reader){printf("Error: No V0 Reader");return;} // GetV0Reader
+     
+   if(fV0Reader)
+      if((AliConversionCuts*)fV0Reader->GetConversionCuts())
+         if(((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms())
+            fOutputContainer->Add(((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms());
+        
+        
+        
+   fElecSelector=(AliDalitzElectronSelector*)AliAnalysisManager::GetAnalysisManager()->GetTask("ElectronSelector");
+   if(!fElecSelector){printf("Error: No ElectronSelector");return;} // GetV0Reader
+     
+    if( fElecSelector ){
+
+      if ( ((AliDalitzElectronCuts*)fElecSelector->GetDalitzElectronCuts())->GetCutHistograms() ){
+         fOutputContainer->Add( ((AliDalitzElectronCuts*)fElecSelector->GetDalitzElectronCuts())->GetCutHistograms() );
+      }
+   }  
+
+   for(Int_t iCut = 0; iCut<fnCuts;iCut++){
+
+      if( fCutElectronArray ){
+         if( ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutHistograms() ) {
+            fCutFolder[iCut]->Add( ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutHistograms() );
+         }
+      }
+
+      if( fCutMesonArray  ) {
+         if( ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutHistograms() ) {
+            fCutFolder[iCut]->Add( ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutHistograms());
+         }
+      }
+
+      if( fCutGammaArray ) {
+         if( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutHistograms() ) {
+            fCutFolder[iCut]->Add( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutHistograms()  );
+         }
+      }
+   }
 
-       PostData(1, fOutputContainer);
+   PostData(1, fOutputContainer);
 
 }
 
 //______________________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::UserExec(Option_t *)
 {
-//
-// Execute analysis for current event
-//        
+
+   //
+   // Execute analysis for current event
+   //
 
    fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
    if(!fV0Reader){printf("Error: No V0 Reader");return;} // GetV0Reader
 
+
    Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
 
-   if(eventQuality != 0){// Event Not Accepted
-      for(Int_t iCut = 0; iCut<fnCuts; iCut++){
-         hNEvents[iCut]->Fill(eventQuality);
-      }
+   if(eventQuality == 2 || eventQuality == 3){// Event Not Accepted due to MC event missing or wrong trigger for V0ReaderV1
+        for(Int_t iCut = 0; iCut<fnCuts; iCut++){
+          hNEvents[iCut]->Fill(eventQuality);
+        }
       return;
    }
 
+
    fElecSelector=(AliDalitzElectronSelector*)AliAnalysisManager::GetAnalysisManager()->GetTask("ElectronSelector");
    if(!fElecSelector){printf("Error: No ElectronSelector");return;} // GetV0Reader
 
 
-   
-   fMCEvent = MCEvent();
-   fESDEvent = (AliESDEvent*) InputEvent();
-   fReaderGammas = fV0Reader->GetReconstructedGammas(); // Gammas from default Cut
+   if(fIsMC)         fMCEvent        =  MCEvent();
+   fESDEvent        = (AliESDEvent*)InputEvent();
+   fReaderGammas    = fV0Reader->GetReconstructedGammas(); // Gammas from default Cut
    fSelectorElectronIndex = fElecSelector->GetReconstructedElectronsIndex(); // Electrons from default Cut
    fSelectorPositronIndex = fElecSelector->GetReconstructedPositronsIndex(); // Positrons from default Cut
-   CountESDTracks(); // Estimate Event Multiplicity
 
-   AddTaskContainers(); //Add conatiner
+   //CountESDTracks(); // Estimate Event Multiplicity
+   fNumberOfESDTracks = fV0Reader->GetNumberOfPrimaryTracks();
+   //AddTaskContainers(); //Add conatiner
 
-    for(Int_t iCut = 0; iCut<fnCuts; iCut++){
+   for(Int_t iCut = 0; iCut<fnCuts; iCut++){
       fiCut = iCut;
 
-      if(fIsHeavyIon && !((AliConversionCuts*)fCutGammaArray->At(iCut))->IsCentralitySelected(fESDEvent)){
-
-         hNEvents[iCut]->Fill(1); // Check Centrality --> Not Accepted => eventQuality = 1
+      Int_t eventNotAccepted =
+         ((AliConversionCuts*)fCutGammaArray->At(iCut))
+         ->IsEventAcceptedByConversionCut(fV0Reader->GetConversionCuts(),fInputEvent,fMCEvent,fIsHeavyIon);
+        
+      if(eventNotAccepted){
+         //                    cout << "event rejected due to wrong trigger: " <<eventNotAccepted << endl;
+         hNEvents[iCut]->Fill(eventNotAccepted); // Check Centrality, PileUp, SDD and V0AND --> Not Accepted => eventQuality = 1
          continue;
+      }
 
+      if(eventQuality != 0){// Event Not Accepted
+         //                    cout << "event rejected due to: " <<eventQuality << endl;
+         hNEvents[iCut]->Fill(eventQuality);
+         continue;
       }
+
       hNEvents[iCut]->Fill(eventQuality);
 
       hNGoodESDTracks[iCut]->Fill(fNumberOfESDTracks);
 
       if(fMCEvent){ // Process MC Particle
-         fMCStack = fMCEvent->Stack();
+         
+       
+       
+       fMCStack = fMCEvent->Stack();
+        
+         if(((AliConversionCuts*)fCutGammaArray->At(iCut))->GetSignalRejection() != 0){
+             ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetNotRejectedParticles(((AliConversionCuts*)fCutGammaArray->At(iCut))->GetSignalRejection(),
+                                                                                    ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetAcceptedHeader(),
+                                                                                      fMCEvent);
+         } 
+        
          ProcessMCParticles();
       }
 
       ProcessPhotonCandidates(); // Process this cuts gammas
       ProcessElectronCandidates(); // Process this cuts gammas
+      
+      if(((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->UseMCPSmearing() && fMCEvent){
+       
+            fUnsmearedPx = new Double_t[fGoodGammas->GetEntries()]; // Store unsmeared Momenta
+            fUnsmearedPy = new Double_t[fGoodGammas->GetEntries()];
+            fUnsmearedPz = new Double_t[fGoodGammas->GetEntries()];
+            fUnsmearedE =  new Double_t[fGoodGammas->GetEntries()];
+
+            for(Int_t gamma=0;gamma<fGoodGammas->GetEntries();gamma++){ // Smear the AODPhotons in MC
+             
+               fUnsmearedPx[gamma] = ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->Px();
+               fUnsmearedPy[gamma] = ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->Py();
+               fUnsmearedPz[gamma] = ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->Pz();
+               fUnsmearedE[gamma] =  ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->E();
+               ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->SmearParticle(dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(gamma)));
+              
+            }           
+        }
+  
+
       CalculatePi0DalitzCandidates();
       CalculateBackground();
       UpdateEventByEventData();
       
-               
-//       if(fDoMesonAnalysis){ // Meson Analysis
-//          CalculatePi0Candidates(); // Combine Gammas
-//          CalculateBackground(); // Combinatorial Background
-//          UpdateEventByEventData(); // Store Event for mixed Events  
-//        }
+      
+      if(((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->UseMCPSmearing() && fMCEvent){
+       
+          for(Int_t gamma=0;gamma<fGoodGammas->GetEntries();gamma++){ // Smear the AODPhotons in MC
+               ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetPx(fUnsmearedPx[gamma]); // Reset Unsmeared Momenta
+               ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetPy(fUnsmearedPy[gamma]);
+               ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetPz(fUnsmearedPz[gamma]);
+               ((AliAODConversionPhoton*)fGoodGammas->At(gamma))->SetE(fUnsmearedE[gamma]);
+            }
+            delete[] fUnsmearedPx; fUnsmearedPx = 0x0;
+            delete[] fUnsmearedPy; fUnsmearedPy = 0x0;
+            delete[] fUnsmearedPz; fUnsmearedPz = 0x0;
+            delete[] fUnsmearedE;  fUnsmearedE  = 0x0;
+           
+       }
+
+
       fGoodGammas->Clear(); // delete this cuts good gammas
       fGoodVirtualGammas->Clear(); // delete this cuts good gammas
    }
 
-    fSelectorElectronIndex.clear();
-    fSelectorPositronIndex.clear();
+   fSelectorElectronIndex.clear();
+   fSelectorPositronIndex.clear();
 
-    PostData( 1, fOutputContainer );
+   PostData( 1, fOutputContainer );
 }
 
-void AliAnalysisTaskGammaConvDalitzV1::Terminate(const Option_t *)
+Bool_t AliAnalysisTaskGammaConvDalitzV1::Notify()
 {
+   for(Int_t iCut = 0; iCut<fnCuts;iCut++){
+      
 
+      if( !((AliConversionCuts*)fCutGammaArray->At(iCut))->GetDoEtaShift() ){
 
+         /*if (((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift() != 0.){
+            printf("Error: Gamma Conversion Dalitz Task %s :: Eta Shift not requested but set to %f, reset to 00. \n\n",
+                   (((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber()).Data(),((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift());
+            ((AliConversionCuts*)fCutGammaArray->At(iCut))->SetEtaShift(0.);
+            ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->SetEtaShift(0.);
+      
+            
+         }*/
+         hEtaShift[iCut]->Fill(0.,0.);
+         continue; // No Eta Shift requested, continue
+      }
+    
+      
+      if( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift() == 0.0){ // Eta Shift requested but not set, get shift automatically
+         ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCorrectEtaShiftFromPeriod(fV0Reader->GetPeriodName());
+         ((AliConversionCuts*)fCutGammaArray->At(iCut))->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once   
+        ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->SetEtaShift( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift() );
+         hEtaShift[iCut]->Fill(0.,(((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift()));
+         continue;
+      }
+      else{
+         printf(" Gamma Conversion Dalitz Task %s :: Eta Shift Manually Set to %f \n\n",
+         (((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber()).Data(),((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift());
+         ((AliConversionCuts*)fCutGammaArray->At(iCut))->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once   
+        ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->SetEtaShift( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift() );
+          hEtaShift[iCut]->Fill(0.,(((AliConversionCuts*)fCutGammaArray->At(iCut))->GetEtaShift()));
+      }
+   }
+   
+   return kTRUE;
 }
 
-void AliAnalysisTaskGammaConvDalitzV1::AddTaskContainers()
-{
-//
-
-
-   // cout<<"Entro a dfdsfasdfdsfasdfsdfds terminate: "<<endl;
-
-
-    if( fElecSelector ){
-        
-         //cout<<"Entro al fElecSelector: "<<endl;
-
-         TList *temp0 =  ((AliDalitzElectronCuts*)fElecSelector->GetDalitzElectronCuts())->GetCutHistograms(); 
-
-        if (  temp0 ) {
-
-               if( ! fOutputContainer->Contains( temp0 ) ) { 
-                       fOutputContainer->Add( temp0 );
-                       cout<<" Add fElecSelector: "<<endl;
-               }
-
-        }
-    }
-
-
-    if ( fV0Reader ) {
-
-       TList *temp1 = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms();
-
-        if(  temp1  ) {
-               if( ! fOutputContainer->Contains( temp1 ) ) {
-
-                       fOutputContainer->Add( temp1 );
-                       cout<<"Add GammaConv"<<endl;
-               }
-        }
-    }
 
+void AliAnalysisTaskGammaConvDalitzV1::Terminate(const Option_t *)
+{
 
-   // fOutputContainer->Print();
+///Grid
 
-   // if( fDebug ) AliInfo("Not to do anything in Terminate");
 }
-
-
 //________________________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::ProcessPhotonCandidates()
 {
@@ -628,15 +1152,37 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessPhotonCandidates()
    TList *GoodGammasStepOne = new TList();
    TList *GoodGammasStepTwo = new TList();
    // Loop over Photon Candidates allocated by ReaderV1
+   
    for(Int_t i = 0; i < fReaderGammas->GetEntriesFast(); i++){
       AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) fReaderGammas->At(i);
       if(!PhotonCandidate) continue;
-      if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelected(PhotonCandidate,fESDEvent)) continue;
       
-      if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut() && 
+      
+      fIsFromMBHeader = kTRUE;
+      
+      if( fMCEvent && ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetSignalRejection() != 0 ){
+       
+         Int_t isPosFromMBHeader
+            = ((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack, fInputEvent);
+         if(isPosFromMBHeader == 0 && ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetSignalRejection() != 3) continue;
+         
+         Int_t isNegFromMBHeader
+            = ((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
+         if(isNegFromMBHeader == 0 && ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetSignalRejection() != 3) continue;
+         
+
+         if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
+      }
+      
+      if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelected(PhotonCandidate,fESDEvent)) continue;
+
+      if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut() &&
          !((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // if no post reader loop is required add to events good gammas
+         
          fGoodGammas->Add(PhotonCandidate);
-         hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
+        if(fIsFromMBHeader){
+             hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
+        }
          if(fMCEvent){
             ProcessTruePhotonCandidates(PhotonCandidate);
          }
@@ -646,8 +1192,8 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessPhotonCandidates()
          nV0++;
          GoodGammasStepOne->Add(PhotonCandidate);
       }
-      else if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut() && 
-              ((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // shared electron is disabled, step one not needed -> step two
+      else if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut() &&
+               ((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // shared electron is disabled, step one not needed -> step two
          GoodGammasStepTwo->Add(PhotonCandidate);
       }
    }
@@ -655,10 +1201,26 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessPhotonCandidates()
       for(Int_t i = 0;i<GoodGammasStepOne->GetEntries();i++){
          AliAODConversionPhoton *PhotonCandidate= (AliAODConversionPhoton*) GoodGammasStepOne->At(i);
          if(!PhotonCandidate) continue;
+         
+         
+         fIsFromMBHeader = kTRUE;
+         if(fMCEvent && ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetSignalRejection() != 0){
+            Int_t isPosFromMBHeader
+               = ((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack,fInputEvent);
+            Int_t isNegFromMBHeader
+               = ((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
+            if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
+         }
+         
+         
          if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->RejectSharedElectronV0s(PhotonCandidate,i,GoodGammasStepOne->GetEntries())) continue;
-         if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // To Colse v0s cut diabled, step two not needed 
+         if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // To Colse v0s cut diabled, step two not needed
             fGoodGammas->Add(PhotonCandidate);
-            hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
+           
+            if(fIsFromMBHeader){
+               hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
+            }
+            
             if(fMCEvent){
                ProcessTruePhotonCandidates(PhotonCandidate);
             }
@@ -670,9 +1232,22 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessPhotonCandidates()
       for(Int_t i = 0;i<GoodGammasStepTwo->GetEntries();i++){
          AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) GoodGammasStepTwo->At(i);
          if(!PhotonCandidate) continue;
+         
+         if(fMCEvent && ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetSignalRejection() != 0){
+            Int_t isPosFromMBHeader
+               = ((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack,fInputEvent);
+            Int_t isNegFromMBHeader
+               = ((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
+            if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
+         }
+         
          if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->RejectToCloseV0s(PhotonCandidate,GoodGammasStepTwo,i)) continue;
          fGoodGammas->Add(PhotonCandidate); // Add gamma to current cut TList
-         hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt()); // Differences to old V0Reader in p_t due to conversion KF->TLorentzVector
+        
+         if(fIsFromMBHeader){
+             hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt()); // Differences to old V0Reader in p_t due to conversion KF->TLorentzVector
+         }
+        
          if(fMCEvent){
             ProcessTruePhotonCandidates(PhotonCandidate);
          }
@@ -697,6 +1272,11 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessTruePhotonCandidates(AliAODConvers
    if(posDaughter->GetMother(0) != negDaughter->GetMother(0)){  // Not Same Mother == Combinatorial Bck
       return;
    }
+   
+   else if (posDaughter->GetMother(0) == -1){
+      return;
+   }
+   
    if(TMath::Abs(posDaughter->GetPdgCode())!=11 || TMath::Abs(negDaughter->GetPdgCode())!=11) return; //One Particle is not electron
    if(posDaughter->GetPdgCode()==negDaughter->GetPdgCode()) return; // Same Charge
    if(posDaughter->GetUniqueID() != 5 || negDaughter->GetUniqueID() !=5) return;// check if the daughters come from a conversion
@@ -705,114 +1285,371 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessTruePhotonCandidates(AliAODConvers
    if(Photon->GetPdgCode() != 22) return; // Mother is no Photon
 
    // True Photon
-   hESDTrueConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
-}
-
+  
+  Int_t labelGamma = TruePhotonCandidate->GetMCParticleLabel(MCStack);
+  
+  if( labelGamma < MCStack->GetNprimary() ){
+    if( fIsFromMBHeader ){
+      hESDTrueConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
+    }
+  }
+  else {
+    if( fIsFromMBHeader){
+      hESDTrueSecConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
+    }
+  }
+  if( IsPi0DalitzDaughter(labelGamma) == kTRUE ) {
+        if( labelGamma < MCStack->GetNprimary() ) {
+         if( fIsFromMBHeader ){
+           hESDTruePi0DalitzConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
+         }
+       }
+       else {
+         if( fIsFromMBHeader ) {
+           hESDTruePi0DalitzSecConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
+         }
+       }
+  }
+   
+}
 
 //________________________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::ProcessElectronCandidates(){
 
-   Float_t magField = fInputEvent->GetMagneticField();
+   Double_t magField = fInputEvent->GetMagneticField();
 
 
    if( magField  < 0.0 ){
-       magField =  1.0;
+      magField =  1.0;
    }
    else {
-       magField =  -1.0;  
+      magField =  -1.0;
    }
-    
 
-  
 
+   vector<Int_t> lGoodElectronIndexPrev(0);
+   vector<Int_t> lGoodPositronIndexPrev(0);
+   
+   
   
-    vector<Int_t> lGoodElectronIndex(0);
-    vector<Int_t> lGoodPositronIndex(0);
 
+   for(UInt_t i = 0; i < fSelectorElectronIndex.size(); i++){
+    AliESDtrack* electronCandidate = fESDEvent->GetTrack(fSelectorElectronIndex[i]);
+    if(! ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelected(electronCandidate) ) continue;
+       lGoodElectronIndexPrev.push_back(   fSelectorElectronIndex[i] );
+       hESDDalitzElectronPt[fiCut]->Fill(electronCandidate->Pt());
+        hESDDalitzElectronPhi[fiCut]->Fill(electronCandidate->Phi());
+         if( fMCEvent ) {
+         Int_t labelelectron = TMath::Abs( electronCandidate->GetLabel() );
+           if( labelelectron < fMCStack->GetNtrack() ){
+             TParticle* electron = fMCStack->Particle(labelelectron);
+               if( electron->GetPdgCode() ==  11 ){
+                   if( labelelectron < fMCStack->GetNprimary() ){
+                     hESDTrueElectronPt[fiCut]->Fill(electronCandidate->Pt());    //primary electron
+                   }
+                   else{
+                     hESDTrueSecElectronPt[fiCut]->Fill(electronCandidate->Pt()); //secondary electron
+                   }
+                   if( IsPi0DalitzDaughter(labelelectron) == kTRUE ) {
+                       if( labelelectron < fMCStack->GetNprimary() ) {
+                         hESDTruePi0DalitzElectronPt[fiCut]->Fill(electronCandidate->Pt());
+                       }
+                       else{
+                         hESDTruePi0DalitzSecElectronPt[fiCut]->Fill(electronCandidate->Pt());
+                       }
+                   }
+               }
+           }
+       }
+   }
 
-    lGoodElectronIndex.clear();
-    lGoodPositronIndex.clear();
+   for(UInt_t i = 0; i < fSelectorPositronIndex.size(); i++){
 
-    
-    for(UInt_t i = 0; i < fSelectorElectronIndex.size(); i++){
+      AliESDtrack* positronCandidate = fESDEvent->GetTrack( fSelectorPositronIndex[i] );
+      if(! ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelected(positronCandidate) ) continue;
+       lGoodPositronIndexPrev.push_back(   fSelectorPositronIndex[i]  );
+        hESDDalitzPositronPt[fiCut]->Fill( positronCandidate->Pt() );
+       hESDDalitzPositronPhi[fiCut]->Fill( positronCandidate->Phi() );
+      
+        if( fMCEvent ) {
+         Int_t labelpositron = TMath::Abs( positronCandidate->GetLabel() );
+         if( labelpositron < fMCStack->GetNtrack() ) {
+           TParticle* positron = fMCStack->Particle(labelpositron);
+            if( positron->GetPdgCode() ==  -11 ){
+             if( labelpositron < fMCStack->GetNprimary() ){
+               hESDTruePositronPt[fiCut]->Fill(positronCandidate->Pt());
+             }
+             else{
+               hESDTrueSecPositronPt[fiCut]->Fill(positronCandidate->Pt());
+             }
+             if( IsPi0DalitzDaughter(labelpositron) == kTRUE ) {
+               if( labelpositron < fMCStack->GetNprimary() ){
+                 hESDTruePi0DalitzPositronPt[fiCut]->Fill(positronCandidate->Pt());
+               }
+               else{
+                 hESDTruePi0DalitzSecPositronPt[fiCut]->Fill(positronCandidate->Pt());
+               }
+              }
+            }
+          }
+        }
+    }
 
-        AliESDtrack* electronCandidate = fESDEvent->GetTrack(fSelectorElectronIndex[i]);
-        if(! ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelected(electronCandidate) ) continue;
-        lGoodElectronIndex.push_back(   fSelectorElectronIndex[i] );
-        hESDDalitzElectronPt[fiCut]->Fill(electronCandidate->Pt());
 
-    }
+   vector<Bool_t> lElectronPsiIndex(lGoodElectronIndexPrev.size(), kTRUE);
+   vector<Bool_t> lPositronPsiIndex(lGoodPositronIndexPrev.size(), kTRUE);
 
-    for(UInt_t i = 0; i < fSelectorPositronIndex.size(); i++){
 
-        AliESDtrack* positronCandidate = fESDEvent->GetTrack(fSelectorPositronIndex[i]);
-        if(! ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelected(positronCandidate) ) continue;
-        lGoodPositronIndex.push_back(   fSelectorPositronIndex[i] );
-        hESDDalitzPositronPt[fiCut]->Fill(positronCandidate->Pt());
+   if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->DoPsiPairCut() == kTRUE ){
 
-    }
+      for( UInt_t i = 0; i < lGoodElectronIndexPrev.size(); i++ ) {
 
+         AliESDtrack *electronCandidate = fESDEvent->GetTrack(lGoodElectronIndexPrev[i]);
 
+         for(UInt_t j = 0; j <  lGoodPositronIndexPrev.size(); j++){
+            AliESDtrack *positronCandidate = fESDEvent->GetTrack(lGoodPositronIndexPrev[j]);
+            Double_t psiPair = GetPsiPair(positronCandidate,electronCandidate);
+            Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->GetConstrainedParam()->Phi()-positronCandidate->GetConstrainedParam()->Phi());
 
+            if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->IsFromGammaConversion(psiPair,deltaPhi ) ){
+               lElectronPsiIndex[i] = kFALSE;
+               lPositronPsiIndex[j] = kFALSE;
+            }
+         }
+      }
+   }
 
 
-       
+   vector<Int_t> lGoodElectronIndex(0);
+   vector<Int_t> lGoodPositronIndex(0);
+   
+
+   for( UInt_t i = 0; i < lGoodElectronIndexPrev.size(); i++ ) {
+
+       if(  lElectronPsiIndex[i] == kTRUE )
+       lGoodElectronIndex.push_back(   lGoodElectronIndexPrev[i]  );
+   }
+
+   for( UInt_t i = 0; i < lGoodPositronIndexPrev.size(); i++ ) {
+
+        if(  lPositronPsiIndex[i] == kTRUE )
+        lGoodPositronIndex.push_back(   lGoodPositronIndexPrev[i]  );
+   }
+
+
+
+    
+   
    for(UInt_t i = 0; i < lGoodElectronIndex.size(); i++){
 
+      //if( lElectronPsiIndex[i] == kFALSE ) continue;
 
-               AliESDtrack* electronCandidate = fESDEvent->GetTrack(lGoodElectronIndex[i]);
 
-               AliKFParticle electronCandidateKF( *electronCandidate->GetConstrainedParam(), ::kElectron );
-                
-               for(UInt_t j = 0; j < lGoodPositronIndex.size(); j++){
-                   AliESDtrack* positronCandidate = fESDEvent->GetTrack(lGoodPositronIndex[j]);
-                        AliKFParticle positronCandidateKF( *positronCandidate->GetConstrainedParam(), ::kPositron );
-                       
-                        if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->DoPsiPairCut() == kTRUE ){
+      AliESDtrack *electronCandidate = fESDEvent->GetTrack(lGoodElectronIndex[i]);
 
-                           
+      AliKFParticle electronCandidateKF( *electronCandidate->GetConstrainedParam(), ::kElectron );
 
-                            
-                            Double_t psiPair = ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetPsiPair(electronCandidate,positronCandidate);
-                            Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->GetConstrainedParam()->Phi()-positronCandidate->GetConstrainedParam()->Phi());
-
-                           
-
-                            if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->IsFromGammaConversion(psiPair,deltaPhi ) ){
-                                 continue;
-                            }
-                              hESDEposEnegPsiPairDPhi[fiCut]->Fill(deltaPhi,psiPair);
-
-                          }
-
-
-                          AliKFConversionPhoton* virtualPhoton = new AliKFConversionPhoton(electronCandidateKF,positronCandidateKF);
-
-                         //if(fUseImprovedVertex == kTRUE){
-                                AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
-                                primaryVertexImproved+=*virtualPhoton;
-                                virtualPhoton->SetProductionVertex(primaryVertexImproved);
-                         //}
-                          
-                          virtualPhoton->SetTrackLabels( lGoodPositronIndex[j], lGoodElectronIndex[i]);
-
-                          if(fMCEvent){
-
-                               // AliStack *fMCStack= fMCEvent->Stack();
-                                Int_t labeln=TMath::Abs(electronCandidate->GetLabel());
-                                Int_t labelp=TMath::Abs(positronCandidate->GetLabel());
-                                TParticle *fNegativeMCParticle = fMCStack->Particle(labeln);
-                                TParticle *fPositiveMCParticle = fMCStack->Particle(labelp);
-                                if( fPositiveMCParticle && fNegativeMCParticle) {
-                                    virtualPhoton->SetMCLabelPositive(labelp);
-                                    virtualPhoton->SetMCLabelNegative(labeln);
-                                }
-                          }
-                          AliAODConversionPhoton *vphoton = new AliAODConversionPhoton(virtualPhoton); //To Apply PsiPairCut
-                          fGoodVirtualGammas->Add(  vphoton );
-            }
+      for(UInt_t j = 0; j < lGoodPositronIndex.size(); j++){
+
+         //if( lPositronPsiIndex[j] == kFALSE ) continue;
+
+         AliESDtrack *positronCandidate = fESDEvent->GetTrack(lGoodPositronIndex[j]);
+         AliKFParticle positronCandidateKF( *positronCandidate->GetConstrainedParam(), ::kPositron );
+                                Bool_t isPhoton    = kFALSE;
+                                Bool_t isPi0Dalitz = kFALSE;
+                                Bool_t isEtaDalitz = kFALSE;
+                                Bool_t isJPsi      = kFALSE;
+
+         Double_t psiPair = GetPsiPair(positronCandidate,electronCandidate);
+         Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->GetConstrainedParam()->Phi()-positronCandidate->GetConstrainedParam()->Phi());
+         
+
+        AliKFConversionPhoton* virtualPhoton = NULL;
+         virtualPhoton = new AliKFConversionPhoton(electronCandidateKF,positronCandidateKF);
+
+
+         AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
+         primaryVertexImproved+=*virtualPhoton;
+         virtualPhoton->SetProductionVertex(primaryVertexImproved);
+
+         virtualPhoton->SetTrackLabels( lGoodPositronIndex[j], lGoodElectronIndex[i]);
+        
+         
+        if( fMCEvent ) {
+          
+         Int_t labeln=TMath::Abs(electronCandidate->GetLabel());
+          Int_t labelp=TMath::Abs(positronCandidate->GetLabel());
+          TParticle *fNegativeMCParticle = fMCStack->Particle(labeln);
+          TParticle *fPositiveMCParticle = fMCStack->Particle(labelp);
+          
+           if( fPositiveMCParticle && fNegativeMCParticle) {
+               virtualPhoton->SetMCLabelPositive(labelp);
+               virtualPhoton->SetMCLabelNegative(labeln);
+           }
+        }
+        
+         AliAODConversionPhoton *vphoton = new AliAODConversionPhoton(virtualPhoton); //To Apply PsiPairCut
+           
+         if ( fDoMesonQA ) {
+
+             if( fMCEvent ) {
+
+             TParticle *mcVgamma=virtualPhoton->GetMCParticle(fMCStack);
+
+             if(mcVgamma){
+             // Check if it is a true photon
+             if(mcVgamma->GetPdgCode() == 22){
+               isPhoton = kTRUE;
+             }else if(mcVgamma->GetPdgCode() == 443){
+               isJPsi = kTRUE;
+             }
+             else if( IsDalitz( mcVgamma ) ){
+               if     ( mcVgamma->GetPdgCode() == 111 ) isPi0Dalitz = kTRUE;
+               else if( mcVgamma->GetPdgCode() == 221 ) isEtaDalitz = kTRUE;
+             }
+             }
+
+             if(isPhoton){
+                    hESDEposEnegTruePhotonInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
+                    hESDEposEnegTruePhotonPsiPairDPhi[fiCut]->Fill(deltaPhi,psiPair);
+              }
+             else if(isJPsi){
+                    hESDEposEnegTrueJPsiInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
+              }
+             else if(isPi0Dalitz){
+                    hESDEposEnegTruePi0DalitzInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
+                    hESDEposEnegTruePi0DalitzPsiPairDPhi[fiCut]->Fill(deltaPhi,psiPair);
+              }
+             else if(isEtaDalitz){
+                    hESDEposEnegTrueEtaDalitzInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
+                    hESDEposEnegTrueEtaDalitzPsiPairDPhi[fiCut]->Fill(deltaPhi,psiPair);
+              }
+           }
+         }
+        
+      
+        
+        if ( fDoMesonQA ) {
+          
+         hESDEposEnegPsiPairDPhi[fiCut]->Fill(deltaPhi,psiPair);   
+         hESDEposEnegInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
+                        
+        }
+                                
+        if( ! fDoChicAnalysis ) {
+       
+                 if (  ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoMassCut() == kTRUE )  {
+                   
+                    Double_t MassCutMax = 1000.0;
+                    if(  ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->GetMassCutLowPt() >= ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->GetMassCutHighPt() ){
+                      MassCutMax = ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->GetMassCutLowPt();
+                    }
+                    else {
+                      MassCutMax = ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->GetMassCutHighPt();
+                    }
+                    
+                    if( vphoton->GetMass() > MassCutMax ) {
+                      
+                      
+                      delete vphoton;
+                      vphoton = 0x0;
+                      delete virtualPhoton;
+                      virtualPhoton = 0x0;
+                      continue;
+                      
+                    }
+                    
+                 }
+        }
+        
+        
+         fGoodVirtualGammas->Add(  vphoton );
+        delete virtualPhoton;
+        virtualPhoton=NULL;
+                                
+      }
    }
    
+   //Computing mixing event
+   
+   if(  fDoMesonQA ) {
+
+      for(UInt_t i = 0; i < lGoodElectronIndex.size(); i++){
+         
+         //if( lElectronPsiIndex[i] == kFALSE ) continue;
+         
+          AliESDtrack *electronCandidate1 = fESDEvent->GetTrack(lGoodElectronIndex[i]);
+
+          AliKFParticle electronCandidate1KF( *electronCandidate1->GetConstrainedParam(), ::kElectron );
+         
+        
+          for(UInt_t j = i+1; j < lGoodElectronIndex.size(); j++){
+           
+              //if( lElectronPsiIndex[j] == kFALSE ) continue;
+              
+              
+               AliESDtrack *electronCandidate2 = fESDEvent->GetTrack(lGoodElectronIndex[j]);
+
+                AliKFParticle electronCandidate2KF( *electronCandidate2->GetConstrainedParam(), ::kElectron );
+              
+               AliKFConversionPhoton* virtualPhoton = new AliKFConversionPhoton(electronCandidate1KF,electronCandidate2KF);
+               
+               AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
+               primaryVertexImproved+=*virtualPhoton;
+               virtualPhoton->SetProductionVertex(primaryVertexImproved);
+
+                   
+               AliAODConversionPhoton *vphoton = new AliAODConversionPhoton(virtualPhoton); 
+               hESDEposEnegLikeSignBackInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
+               delete vphoton;
+               delete virtualPhoton;
+               vphoton = 0x0;
+               virtualPhoton = 0x0;            
+          
+         }
+   }   
+   
+   
+      for(UInt_t i = 0; i < lGoodPositronIndex.size(); i++){
+     
+   
+         
+         //if( lPositronPsiIndex[i] == kFALSE ) continue;
+         
+          AliESDtrack *positronCandidate1 = fESDEvent->GetTrack(lGoodPositronIndex[i]);
+
+          AliKFParticle positronCandidate1KF( *positronCandidate1->GetConstrainedParam(), ::kPositron );
+         
+        
+          for(UInt_t j = i+1; j < lGoodPositronIndex.size(); j++){
+           
+             // if( lPositronPsiIndex[j] == kFALSE ) continue;
+              
+               AliESDtrack *positronCandidate2 = fESDEvent->GetTrack(lGoodPositronIndex[j]);
+
+                AliKFParticle positronCandidate2KF( *positronCandidate2->GetConstrainedParam(), ::kPositron );
+              
+               AliKFConversionPhoton* virtualPhoton = new AliKFConversionPhoton(positronCandidate1KF,positronCandidate2KF);
+               AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
+               primaryVertexImproved+=*virtualPhoton;
+               virtualPhoton->SetProductionVertex(primaryVertexImproved);
+              
+               AliAODConversionPhoton *vphoton = new AliAODConversionPhoton(virtualPhoton); 
+               hESDEposEnegLikeSignBackInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
+               
+               
+               delete vphoton;
+               delete virtualPhoton;  
+               vphoton = 0x0;
+               virtualPhoton = 0x0;
+          
+         }
+   }   
+
+   }
 }
 
 //________________________________________________________________________
@@ -820,19 +1657,21 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculatePi0DalitzCandidates(){
 
    // Conversion Gammas
 
-  
+
 
 
    if( fGoodGammas->GetEntries() > 0 && fGoodVirtualGammas->GetEntries() > 0 ){
 
-   
+      vector<Bool_t> lGoodVirtualGamma(fGoodVirtualGammas->GetEntries(), kFALSE);
+     
       for(Int_t GammaIndex=0; GammaIndex<fGoodGammas->GetEntries(); GammaIndex++){
 
          AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(GammaIndex));
-
+         if (gamma==NULL) continue;
          for(Int_t virtualGammaIndex=0;virtualGammaIndex<fGoodVirtualGammas->GetEntries();virtualGammaIndex++){
 
             AliAODConversionPhoton *Vgamma=dynamic_cast<AliAODConversionPhoton*>(fGoodVirtualGammas->At(virtualGammaIndex));
+            if (Vgamma==NULL) continue;
             //Check for same Electron ID
             if(gamma->GetTrackLabelPositive() == Vgamma->GetTrackLabelPositive() ||
                gamma->GetTrackLabelNegative() == Vgamma->GetTrackLabelNegative() ||
@@ -841,30 +1680,169 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculatePi0DalitzCandidates(){
 
             AliAODConversionMother *pi0cand = new AliAODConversionMother(gamma,Vgamma);
             pi0cand->SetLabels(GammaIndex,virtualGammaIndex);
+                      
 
-              if( ( ((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(pi0cand,kTRUE)) ){
-               hESDMotherInvMassPt[fiCut]->Fill(pi0cand->M(),pi0cand->Pt());
-              // if(pi0cand->GetAlpha()<0.1){
-              //    hESDMotherInvMassEalpha[fiCut]->Fill(pi0cand->M(),pi0cand->E());
-              // }
-               Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
+            if( ( ((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(pi0cand,kTRUE,((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetEtaShift())) ){
+             
+             //cout<< "Meson Accepted "<<endl;
+             
+              Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
                Int_t mbin = 0;
-               if(((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->UseTrackMultiplicity()){
+               if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity() ){
                   mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fNumberOfESDTracks);
                } else {
                   mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fGoodGammas->GetEntries());
                }
-               Double_t sparesFill[4] = {pi0cand->M(),pi0cand->Pt(),zbin,mbin};
-               sESDMotherInvMassPtZM[fiCut]->Fill(sparesFill,1);
-               if(fMCEvent){
+             
+             AliESDtrack *positronVgamma = 0;
+             AliESDtrack *electronVgamma = 0;
+             
+             Double_t clsToFPos = -1.0;
+             Double_t clsToFNeg = -1.0;
+             
+             Float_t dcaToVertexXYPos = -1.0;
+             Float_t dcaToVertexZPos  = -1.0;
+             Float_t dcaToVertexXYNeg = -1.0;
+             Float_t dcaToVertexZNeg  = -1.0;
+             
+             
+              if ( fDoMesonQA ) {
+             
+               positronVgamma = fESDEvent->GetTrack( Vgamma->GetTrackLabelPositive() );
+               electronVgamma = fESDEvent->GetTrack( Vgamma->GetTrackLabelNegative() );
+               clsToFPos = ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetNFindableClustersTPC(positronVgamma);
+               clsToFNeg = ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetNFindableClustersTPC(electronVgamma);
+             
+               Float_t bPos[2];
+               Float_t bCovPos[3];
+               positronVgamma->GetImpactParameters(bPos,bCovPos);
+               if (bCovPos[0]<=0 || bCovPos[2]<=0) {
+                 AliDebug(1, "Estimated b resolution lower or equal zero!");
+                 bCovPos[0]=0; bCovPos[2]=0;
+               }
+             
+               Float_t bNeg[2];
+               Float_t bCovNeg[3];
+               positronVgamma->GetImpactParameters(bNeg,bCovNeg);
+               if (bCovNeg[0]<=0 || bCovNeg[2]<=0) {
+                 AliDebug(1, "Estimated b resolution lower or equal zero!");
+                 bCovNeg[0]=0; bCovNeg[2]=0;
+               }
+             
+               dcaToVertexXYPos = bPos[0];
+               dcaToVertexZPos  = bPos[1];
+               dcaToVertexXYNeg = bNeg[0];
+               dcaToVertexZNeg  = bNeg[1];
+             
+              }
+                     
+             
+              if(  ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoMassCut() == kTRUE ) {
+               
+               
+                if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->MassCut( pi0cand->Pt() , Vgamma->GetMass() ) == kTRUE ){
+         
+                hESDMotherInvMassPt[fiCut]->Fill(pi0cand->M(),pi0cand->Pt());
+               
+                Double_t sparesFill[4] = {pi0cand->M(),pi0cand->Pt(),(Double_t)zbin,(Double_t)mbin};
+                 sESDMotherInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                
+                
+                   if ( fDoMesonQA ) {
+                   
+                    hESDMotherPhi[fiCut]->Fill(pi0cand->Phi());
+                
+                       if( lGoodVirtualGamma[virtualGammaIndex] == kFALSE ) {
+                
+                         hESDDalitzElectronAfterPt[fiCut]->Fill(  electronVgamma->Pt()  );
+                         hESDDalitzPositronAfterPt[fiCut]->Fill(  positronVgamma->Pt()  );
+                
+                         hESDDalitzElectronAfterPhi[fiCut]->Fill( electronVgamma->Phi() );
+                         hESDDalitzPositronAfterPhi[fiCut]->Fill( positronVgamma->Phi() );
+                     
+                         hESDDalitzElectronAfterNFindClsTPC[fiCut]->Fill(clsToFNeg,electronVgamma->Pt());
+                         hESDDalitzPositronAfterNFindClsTPC[fiCut]->Fill(clsToFPos,positronVgamma->Pt());
+                     
+                     
+                         hESDDalitzPosEleAfterDCAxy[fiCut]->Fill(  dcaToVertexXYNeg, electronVgamma->Pt() );
+                         hESDDalitzPosEleAfterDCAz[fiCut]->Fill(   dcaToVertexZNeg,  electronVgamma->Pt() );
+                         hESDDalitzPosEleAfterDCAxy[fiCut]->Fill(  dcaToVertexXYPos, positronVgamma->Pt() );
+                         hESDDalitzPosEleAfterDCAz[fiCut]->Fill(   dcaToVertexZPos,  positronVgamma->Pt() );
+                     
+                         hESDDalitzPosEleAfterTPCdEdx[fiCut]->Fill( positronVgamma->P(),((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(positronVgamma, AliPID::kElectron) );
+                         hESDDalitzPosEleAfterTPCdEdx[fiCut]->Fill( electronVgamma->P(),((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(electronVgamma, AliPID::kElectron) );
+                     
+                         hESDDalitzPosEleAfterTPCdEdxSignal[fiCut]->Fill( positronVgamma->P(), TMath::Abs(positronVgamma->GetTPCsignal()));
+                         hESDDalitzPosEleAfterTPCdEdxSignal[fiCut]->Fill( electronVgamma->P(), TMath::Abs(electronVgamma->GetTPCsignal()));
+                     
+                         lGoodVirtualGamma[virtualGammaIndex] = kTRUE;
+                     }
+                   }
+      
+                
+               }
+             }
+             else {
+                hESDMotherInvMassPt[fiCut]->Fill(pi0cand->M(),pi0cand->Pt());
+                Double_t sparesFill[4] = {pi0cand->M(),pi0cand->Pt(),(Double_t)zbin,(Double_t)mbin};
+                 sESDMotherInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                
+                
+                  if ( fDoMesonQA ) {
+                
+                   hESDMotherPhi[fiCut]->Fill(pi0cand->Phi());
+                
+                   if( lGoodVirtualGamma[virtualGammaIndex] == kFALSE ) {
+                
+                     hESDDalitzElectronAfterPt[fiCut]->Fill(  electronVgamma->Pt()  );
+                     hESDDalitzPositronAfterPt[fiCut]->Fill(  positronVgamma->Pt()  );
+                
+                     hESDDalitzElectronAfterPhi[fiCut]->Fill( electronVgamma->Phi() );
+                     hESDDalitzPositronAfterPhi[fiCut]->Fill( positronVgamma->Phi() );
+                     
+                     hESDDalitzElectronAfterNFindClsTPC[fiCut]->Fill(clsToFNeg,electronVgamma->Pt());
+                     hESDDalitzPositronAfterNFindClsTPC[fiCut]->Fill(clsToFPos,positronVgamma->Pt());
+                     
+                     hESDDalitzPosEleAfterDCAxy[fiCut]->Fill(  dcaToVertexXYNeg, electronVgamma->Pt() );
+                     hESDDalitzPosEleAfterDCAz[fiCut]->Fill(   dcaToVertexZNeg,  electronVgamma->Pt() );
+                     hESDDalitzPosEleAfterDCAxy[fiCut]->Fill(  dcaToVertexXYPos, positronVgamma->Pt() );
+                     hESDDalitzPosEleAfterDCAz[fiCut]->Fill(   dcaToVertexZPos,  positronVgamma->Pt() );
+                     
+                     hESDDalitzPosEleAfterTPCdEdx[fiCut]->Fill( positronVgamma->P(),((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(positronVgamma, AliPID::kElectron) );
+                     hESDDalitzPosEleAfterTPCdEdx[fiCut]->Fill( electronVgamma->P(),((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(electronVgamma, AliPID::kElectron) );
+                     
+                     hESDDalitzPosEleAfterTPCdEdxSignal[fiCut]->Fill( positronVgamma->P(), TMath::Abs(positronVgamma->GetTPCsignal()));
+                     hESDDalitzPosEleAfterTPCdEdxSignal[fiCut]->Fill( electronVgamma->P(), TMath::Abs(electronVgamma->GetTPCsignal()));
+                     
+                     
+                     lGoodVirtualGamma[virtualGammaIndex] = kTRUE;
+                
+                   }
+                  }
+             }
+              
+              if( fDoChicAnalysis) {
+              
+               hESDPi0MotherInvMassPt[fiCut]->Fill(pi0cand->M(),pi0cand->Pt());
+                
+               Double_t diffMass = pi0cand->M() - Vgamma->GetMass();
+    
+               hESDPi0MotherDiffInvMassPt[fiCut]->Fill( diffMass , pi0cand->Pt() );
+       
+               if( Vgamma->GetMass() > 2.5 && Vgamma->GetMass() < 3.4){
+               hESDPi0MotherDiffLimInvMassPt[fiCut]->Fill( diffMass , pi0cand->Pt() );
+               }
+              }
+               
+              if(fMCEvent){
                   ProcessTrueMesonCandidates(pi0cand,gamma,Vgamma);
-               }
               }
+            }
             delete pi0cand;
             pi0cand=0x0;
          }
       }
-    }
+   }
 }
 
 //________________________________________________________________________
@@ -872,7 +1850,7 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculateBackground(){
 
    Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
    Int_t mbin = 0;
-   
+
    Int_t method = 0;
 
    method = ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->GetBKGMethod();
@@ -900,8 +1878,8 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculateBackground(){
 
             for(Int_t iCurrent=0;iCurrent<fGoodVirtualGammas->GetEntries();iCurrent++){
                AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualGammas->At(iCurrent));
-               
-                for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
+
+               for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
                   AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
 
                   if(fMoveParticleAccordingToVertex == kTRUE && method == 1 ){
@@ -909,10 +1887,24 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculateBackground(){
                   }
 
                   AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(&currentEventGoodV0,&previousGoodV0);
-                  if( ( ((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE) ) ){
-                     hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
-                     Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),zbin,mbin};
-                     sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                            
+
+                  if( ( ((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE, ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetEtaShift()))){
+                     if(  ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoMassCut() == kTRUE ) {
+                       
+                       if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->MassCut( backgroundCandidate->Pt() , currentEventGoodV0.GetMass() ) == kTRUE ){
+                         
+                        // cout<<" Mass dalitz: "<<currentEventGoodV0.GetMass()<<endl;
+                         hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
+                         Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
+                         sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                        }
+                     }
+                     else {
+                       hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
+                       Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
+                       sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                     }       
                   }
                   delete backgroundCandidate;
                   backgroundCandidate = 0x0;
@@ -928,7 +1920,9 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculateBackground(){
                   bgEventVertex = fBGHandler[fiCut]->GetBGEventVertex(zbin,mbin,nEventsInBG);
                }
                for(Int_t iCurrent=0;iCurrent<fGoodVirtualGammas->GetEntries();iCurrent++){
+
                   AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualGammas->At(iCurrent));
+
                   for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
 
                      AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
@@ -938,11 +1932,24 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculateBackground(){
                      }
 
                      AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(&currentEventGoodV0,&previousGoodV0);
-
-                     if((((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE))){
-                        hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
-                        Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),zbin,mbin};
-                        sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                               
+                     if((((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE,((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetEtaShift()))){
+                      
+                      if(  ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoMassCut() == kTRUE ) {
+                       
+                         if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->MassCut( backgroundCandidate->Pt() , currentEventGoodV0.GetMass() ) == kTRUE ){
+                       
+                      
+                         hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
+                         Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
+                         sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                       }
+                      }
+                      else {
+                         hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
+                         Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
+                         sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                      }
                      }
                      delete backgroundCandidate;
                      backgroundCandidate = 0x0;
@@ -955,27 +1962,43 @@ void AliAnalysisTaskGammaConvDalitzV1::CalculateBackground(){
 
    else if( method == 3 ){
 
-            for(Int_t iCurrent=0;iCurrent<fGoodVirtualGammas->GetEntries();iCurrent++){
+      for(Int_t iCurrent=0;iCurrent<fGoodVirtualGammas->GetEntries();iCurrent++){
 
-               AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualGammas->At(iCurrent));
+         AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualGammas->At(iCurrent));
 
-                for(Int_t iPrevious=0;iPrevious<fGammasPool[fiCut]->GetEntries();iPrevious++){
-                
-                  AliAODConversionPhoton previousGoodV0 = *(AliAODConversionPhoton*)((fGammasPool[fiCut]->At(iPrevious) ));
+         for(Int_t iPrevious=0;iPrevious<fGammasPool[fiCut]->GetEntries();iPrevious++){
 
-                
-                  AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(&currentEventGoodV0,&previousGoodV0);
+            AliAODConversionPhoton previousGoodV0 = *(AliAODConversionPhoton*)((fGammasPool[fiCut]->At(iPrevious) ));
 
-                  if((((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE))){
 
-                     hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
-                     Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),zbin,mbin};
-                     sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
-                  }
-                  delete backgroundCandidate;
-                  backgroundCandidate = 0x0;
-               }
+            AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(&currentEventGoodV0,&previousGoodV0);
+                      
+
+            if((((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE, ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetEtaShift()))){
+             
+              if(  ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoMassCut() == kTRUE ) {
+               
+                   if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->MassCut( backgroundCandidate->Pt() , currentEventGoodV0.GetMass() ) == kTRUE ){
+                 
+                     
+                 hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
+                 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
+                 sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
+                 
+                 }
+              }
+              else{
+                
+                hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
+                Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
+                sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1); 
+                
+              }
             }
+            delete backgroundCandidate;
+            backgroundCandidate = 0x0;
+         }
+      }
    }
 
 }
@@ -986,42 +2009,49 @@ void AliAnalysisTaskGammaConvDalitzV1::UpdateEventByEventData(){
    Int_t method = 0;
 
    method = ( (AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetBKGMethod();
+
    
+
+
    if( method == 1 ) {
 
-   if(fGoodGammas->GetEntries() >0 ){
+      if(fGoodGammas->GetEntries() > 0 ){
 
-      if(((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity()){
-         fBGHandler[fiCut]->AddEvent(fGoodGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fNumberOfESDTracks);
-      }
+         if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity() ){
+            fBGHandler[fiCut]->AddEvent(fGoodGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fNumberOfESDTracks);
+         }
 
-      else{ // means we use #V0s for multiplicity
-         fBGHandler[fiCut]->AddEvent(fGoodGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fGoodGammas->GetEntries());
+         else{ // means we use #V0s for multiplicity
+            fBGHandler[fiCut]->AddEvent(fGoodGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fGoodGammas->GetEntries());
+         }
       }
-    }
    }
 
    else if ( method == 2 ){
-    
-    if(fGoodVirtualGammas->GetEntries() >0 ){
-      if(((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity()){
-         fBGHandler[fiCut]->AddEvent(fGoodVirtualGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fNumberOfESDTracks);
+
+      if(fGoodVirtualGammas->GetEntries() > 0 ){
+         if(((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity()){
+            fBGHandler[fiCut]->AddEvent(fGoodVirtualGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fNumberOfESDTracks);
+         }
+         else{ // means we use #V0s for multiplicity
+            fBGHandler[fiCut]->AddEvent(fGoodVirtualGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fGoodVirtualGammas->GetEntries());
+         }
       }
-      else{ // means we use #V0s for multiplicity
-         fBGHandler[fiCut]->AddEvent(fGoodVirtualGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fGoodGammas->GetEntries());
-     }
    }
-  }
-  else if ( method  == 3 ) {
-        
-               for(Int_t index = 0; index < fGoodGammas->GetEntries(); index ++){
+   else if ( method  == 3 ) {
+
+
+
+      for(Int_t index = 0; index < fGoodGammas->GetEntries(); index++){
+
+
+         if ( fGammasPool[fiCut]->GetEntries() > ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->NumberOfRotationEvents() ){
+            fGammasPool[fiCut]->RemoveLast();
+         }
+         fGammasPool[fiCut]->AddFirst( new AliAODConversionPhoton(*(AliAODConversionPhoton*)(fGoodGammas->At(index)) ) );
 
-                            if ( fGammasPool[fiCut]->GetEntries() > 10 ){
-                                    fGammasPool[fiCut]->RemoveLast();
-                            }
-                 fGammasPool[fiCut]->AddFirst(dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(index)));
-               }
       }
+   }
 }
 //______________________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::ProcessTrueMesonCandidates(AliAODConversionMother *Pi0Candidate, AliAODConversionPhoton *TrueGammaCandidate, AliAODConversionPhoton *TrueVirtualGammaCandidate)
@@ -1031,16 +2061,33 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessTrueMesonCandidates(AliAODConversi
 
    AliStack *MCStack = fMCEvent->Stack();
 
-
-   if(TrueGammaCandidate->GetV0Index()<fESDEvent->GetNumberOfV0s()){
+   if( TrueGammaCandidate->GetV0Index()<fESDEvent->GetNumberOfV0s()    ){
+     
+     
+     //cout<<"Entro True Meson"<<endl;
 
 
       Bool_t isTruePi0 = kFALSE;
       Bool_t isTrueEta = kFALSE;
+      Bool_t massCutAccept = kFALSE;
+      //Bool_t isTrueChiC = kFALSE;
       Int_t gammaMCLabel = TrueGammaCandidate->GetMCParticleLabel(MCStack);
       Int_t gammaMotherLabel = -1;
 
 
+      if(  ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoMassCut() == kTRUE ) {
+          
+           if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->MassCut( Pi0Candidate->Pt() , TrueVirtualGammaCandidate->GetMass() ) == kTRUE ){
+             
+              massCutAccept = kTRUE;
+           }
+      }
+      else {
+             massCutAccept  = kTRUE;
+      }
+      
+      
+      
 
 
       if(gammaMCLabel != -1){ // Gamma is Combinatorial; MC Particles don't belong to the same Mother
@@ -1055,84 +2102,155 @@ void AliAnalysisTaskGammaConvDalitzV1::ProcessTrueMesonCandidates(AliAODConversi
          if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){  // Electrons ...
 
             if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
-               
-                    if(gammaMC->GetPdgCode() == 22){ // ... with Gamma Mother
-                     gammaMotherLabel=gammaMC->GetFirstMother();
-                    }
-           }
-        }
-       }
 
+               if(gammaMC->GetPdgCode() == 22){ // ... with Gamma Mother
+                  gammaMotherLabel=gammaMC->GetFirstMother();
+               }
+            }
+         }
+      }
 
-         Int_t virtualGammaMCLabel = TrueVirtualGammaCandidate->GetMCParticleLabel(MCStack);
-         Int_t virtualGammaMotherLabel = -1;
-         Int_t virtualGamma = 1;
 
-         if(virtualGammaMCLabel != -1){ // Gamma is Combinatorial; MC Particles don't belong to the same Mother
-            // Daughters Gamma 1
-            TParticle * negativeMC = (TParticle*)TrueVirtualGammaCandidate->GetNegativeMCDaughter(MCStack);
-            TParticle * positiveMC = (TParticle*)TrueVirtualGammaCandidate->GetPositiveMCDaughter(MCStack);
-            TParticle * virtualGammaMotherMC = (TParticle*)MCStack->Particle(virtualGammaMCLabel);
-            if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){  // Electrons ...
+      Int_t virtualGammaMCLabel = TrueVirtualGammaCandidate->GetMCParticleLabel(MCStack);
+      Int_t virtualGammaMotherLabel = -1;
+      Int_t virtualGamma = 1;
+      Int_t virtualGammaGrandMotherLabel =-1;
+
+
+      if(virtualGammaMCLabel != -1){ // Gamma is Combinatorial; MC Particles don't belong to the same Mother
+         // Daughters Gamma 1
+         TParticle * negativeMC = (TParticle*)TrueVirtualGammaCandidate->GetNegativeMCDaughter(MCStack);
+         TParticle * positiveMC = (TParticle*)TrueVirtualGammaCandidate->GetPositiveMCDaughter(MCStack);
+         TParticle * virtualGammaMotherMC = (TParticle*)MCStack->Particle(virtualGammaMCLabel);
+
+         if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){  // Electrons ...
 
             if( virtualGammaMotherMC->GetPdgCode() != 22 ){
-                  virtualGammaMotherLabel=virtualGammaMCLabel;
-            }                  
-             
-             else if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
-               
-                    virtualGammaMotherLabel=virtualGammaMotherMC->GetFirstMother();
-                    virtualGamma = 0; //no virtual gamma
-                
-             }
+               virtualGammaMotherLabel=virtualGammaMCLabel;
+           if(virtualGammaMotherMC->GetPdgCode() == 443){
+              virtualGammaGrandMotherLabel=virtualGammaMotherMC->GetFirstMother();
+           }
+           }
+
+            else if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
+               virtualGammaMotherLabel=virtualGammaMotherMC->GetFirstMother();
+               virtualGamma = 0; //no virtual gamma
             }
          }
+      }
 
 
-         if(gammaMotherLabel>=0 && ( gammaMotherLabel == virtualGammaMotherLabel) ){
+      if(gammaMotherLabel >= 0 && ( gammaMotherLabel == virtualGammaMotherLabel) ){
 
-            if(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetPdgCode() == 111){
-               isTruePi0=kTRUE;
-            }
+         if(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetPdgCode() == 111){
+            isTruePi0=kTRUE;
+         }
 
-            if(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetPdgCode() == 221){
-               isTrueEta=kTRUE;
+         if(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetPdgCode() == 221){
+            isTrueEta=kTRUE;
+         }
+         
+        
+       }
+
+       if( fDoChicAnalysis) {
+       if(gammaMotherLabel>=0 && ( gammaMotherLabel == virtualGammaGrandMotherLabel) ){
+         if(((TParticle*)MCStack->Particle(virtualGammaGrandMotherLabel))->GetPdgCode() == 445 ||
+           ((TParticle*)MCStack->Particle(virtualGammaGrandMotherLabel))->GetPdgCode() == 10443 ||
+           ((TParticle*)MCStack->Particle(virtualGammaGrandMotherLabel))->GetPdgCode() == 20443 ){
+             //isTrueChiC=kTRUE;
+             hESDTrueMotherChiCInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
+             hESDTrueMotherChiCDiffInvMassPt[fiCut]->Fill(Pi0Candidate->M()-TrueVirtualGammaCandidate->GetMass(),Pi0Candidate->Pt());
+            }
+         }  
+       }
+
+      if( ( isTruePi0 || isTrueEta) && massCutAccept ){ // True Pion or Eta
+       
+         if ( virtualGamma == 1 ) { //True Dalitz      
+
+            Float_t weighted= 1;
+            
+            if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoWeights() ) {
+                if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
+                    if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
+                        weighted= ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
+                    }
+                }
             }
 
-         }
+            hESDTrueMotherInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt(),weighted);
+           hESDTrueMotherDalitzInvMassPt[fiCut]->Fill( TrueVirtualGammaCandidate->GetMass(),Pi0Candidate->Pt(),weighted);
 
-         if(isTruePi0 || isTrueEta ){ // True Pion or Eta
-            if ( virtualGamma == 1 ) { //True Dalitz
-            hESDTrueMotherInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
-            if(gammaMotherLabel <= MCStack->GetNprimary()){ // Only primary pi0 for efficiency calculation
-               hESDTruePrimaryMotherInvMassMCPt[fiCut]->Fill(Pi0Candidate->M(),((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->Pt());
+            if(gammaMotherLabel < MCStack->GetNprimary()){ // Only primary pi0 for efficiency calculation
+             
+              
+               hESDTruePrimaryMotherInvMassPt[fiCut]->Fill( Pi0Candidate->M(),Pi0Candidate->Pt(),weighted);
+              hESDTruePrimaryMotherW0WeightingInvMassPt[fiCut]->Fill( Pi0Candidate->M(), Pi0Candidate->Pt() );
+              
+               hESDTruePrimaryMotherInvMassMCPt[fiCut]->Fill(Pi0Candidate->M(),((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->Pt(),weighted);
                if(isTruePi0){ // Only primaries for unfolding
-                  hESDTruePrimaryPi0DalitzESDPtMCPt[fiCut]->Fill(Pi0Candidate->Pt(),((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->Pt());
+                  hESDTruePrimaryPi0DalitzESDPtMCPt[fiCut]->Fill(Pi0Candidate->Pt(),((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->Pt(),weighted);
                }
             }
-            if(gammaMotherLabel > MCStack->GetNprimary()){ // Secondary Meson
-               hESDTrueSecondaryMotherInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
-               //if (((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetMother(0) >-1){
-               //   if(MCStack->Particle(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetMother(0))->GetPdgCode()==kK0Short){
-               //      hESDTrueSecondaryMotherFromK0sInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
-               //   }
-               }
+            else { // Secondary Meson
+              Float_t weightedSec= 1;
+
+              if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoWeights() ) { 
+                  Int_t secMotherLabel = ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetMother(0);
+                  if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack, fInputEvent) && MCStack->Particle(gammaMotherLabel)->GetPdgCode()==310){
+                    weightedSec= ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),secMotherLabel, fMCStack, fInputEvent)/2.; //invariant mass is additive thus the weight for the daughters has to be devide by two for the K0s at a certain pt
+                  }
+              }
+
+              hESDTrueSecondaryMotherInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt(),weightedSec); 
+            }
+         }
+
+         
+         else if ( virtualGamma == 0 ){
+
+              Float_t weighted= 1;
+
+             if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoWeights() ) {
+              if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
+                if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
+                    weighted= ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
+                }
+              }
+            }
+
+            hESDTrueMotherPi0GGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt(),weighted); // Pi0 from GG
+
+            if( gammaMotherLabel < MCStack->GetNprimary() ){
+                hESDTruePrimaryMotherPi0GGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt(),weighted);
+            }
+            else {
+            
+            Float_t weightedSec= 1;
+           
+            if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoWeights() ) { 
+                Int_t secMotherLabel = ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetMother(0);
+                   if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack, fInputEvent) && MCStack->Particle(gammaMotherLabel)->GetPdgCode()==310){
+                            weightedSec= ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),secMotherLabel, fMCStack, fInputEvent)/2.; //invariant mass is additive thus the weight for the daughters has to be devide by two for the K0s at a certain pt
+                   }
             }
-            else if ( virtualGamma == 0 ){
-              hESDTrueMotherPi0GGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt()); // Pi0 from GG
+                    hESDTrueSecondaryMotherPi0GGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt(),weightedSec);
             }
          }
-    
-        if(!isTruePi0 && !isTrueEta){ // Background
-            if(gammaMotherLabel>-1 && virtualGammaMotherLabel>-1 && virtualGamma == 0){ // Both Tracks are Photons and have a mother but not Pi0 or Eta
-               hESDTrueBckGGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
-            } else { // No photon or without mother
-               hESDTrueBckContInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
-            } 
-        }
-    }
+      }
+
+      if(!isTruePi0 && !isTrueEta && massCutAccept ){ // Background
+         if(gammaMotherLabel>-1 && virtualGammaMotherLabel>-1 && virtualGamma == 0){ // Both Tracks are Photons and have a mother but not Pi0 or Eta
+            hESDTrueBckGGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
+         } else { // No photon or without mother
+            hESDTrueBckContInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
+         }
+      }
+   }
 }
+
+
 //________________________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::MoveParticleAccordingToVertex(AliAODConversionPhoton* particle,const AliGammaConversionAODBGHandler::GammaConversionVertex *vertex){
    //see header file for documentation
@@ -1149,10 +2267,9 @@ void AliAnalysisTaskGammaConvDalitzV1::MoveParticleAccordingToVertex(AliAODConve
 //________________________________________________________________________
 void AliAnalysisTaskGammaConvDalitzV1::CountESDTracks(){
 
-   AliESDtrackCuts *EsdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
    // Using standard function for setting Cuts
    Bool_t selectPrimaries=kTRUE;
-   EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
+   AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
    EsdTrackCuts->SetMaxDCAToVertexZ(2);
    EsdTrackCuts->SetEtaRange(-0.8, 0.8);
    EsdTrackCuts->SetPtRange(0.15);
@@ -1173,50 +2290,205 @@ void AliAnalysisTaskGammaConvDalitzV1::CountESDTracks(){
 void AliAnalysisTaskGammaConvDalitzV1::ProcessMCParticles()
 {
 
-
    // Loop over all primary MC particle
+
    for(Int_t i = 0; i < fMCStack->GetNprimary(); i++) {
+     
+     
       TParticle* particle = (TParticle *)fMCStack->Particle(i);
       if (!particle) continue;
-
-     
-         if(((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelectedMCDalitz(particle,fMCStack)){
-            if(particle->GetPdgCode() == 111)hMCPi0Pt[fiCut]->Fill(particle->Pt()); // All MC Pi0
-            if(particle->GetPdgCode() == 221)hMCEtaPt[fiCut]->Fill(particle->Pt()); // All MC Eta
-            // Check the acceptance for both gammas
-            if(particle->GetNDaughters() == 3){
-               TParticle* gamma    = 0;
-               TParticle* electron = 0;
-               TParticle* positron = 0;
-              
-                 
-               for(Int_t index=particle->GetFirstDaughter(); index<= particle->GetLastDaughter();index++){
-               
-                       
-                    TParticle* temp = (TParticle*)fMCStack->Particle( index );
-
-                    switch( temp->GetPdgCode() ) {
-                                case ::kPositron:
-                                        electron = temp;
-                                        break;
-                                case ::kElectron:
-                                        positron = temp;
-                                        break;
-                                case ::kGamma:
-                                        gamma    = temp;
-                                        break;
-                        }
-               }
-               if( gamma  && electron && positron ) {
-
-                 if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelectedMC(gamma,fMCStack,kFALSE) &&
-                    TMath::Abs( electron->Eta() ) < ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetEtaCut()  &&
-                    TMath::Abs( positron->Eta() ) < ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetEtaCut() ){
-                  if(particle->GetPdgCode() == 111)hMCPi0InAccPt[fiCut]->Fill(particle->Pt()); // MC Pi0Dalitz with gamma and e+e- in acc
-                  if(particle->GetPdgCode() == 221)hMCEtaInAccPt[fiCut]->Fill(particle->Pt()); // MC EtaDalitz with gamma and e+e- in acc
-               }
-              }
-            }
+      
+      
+      Bool_t mcIsFromMB = kTRUE;
+      Int_t isMCFromMBHeader = -1;
+           
+      if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetSignalRejection() != 0) {
+         isMCFromMBHeader
+            = ((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(i,fMCStack,fInputEvent);
+         if(isMCFromMBHeader == 0 && ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetSignalRejection() != 3) continue;
+         if(isMCFromMBHeader != 2) mcIsFromMB = kFALSE;
+      }    
+    
+      if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelectedMC(particle,fMCStack,kFALSE)){
+         hMCAllGammaPt[fiCut]->Fill(particle->Pt()); // All MC Gamma
+      }
+      
+      if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelectedMC(particle,fMCStack,kTRUE)){
+         hMCConvGammaPt[fiCut]->Fill(particle->Pt());
+         if(mcIsFromMB){
+            hMCConvGammaRSPt[fiCut]->Fill(particle->Pt());
          }
+      } // Converted MC Gamma
+       
+      if(((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelectedMC(i,fMCStack)){
+                       if( particle->GetPdgCode() == -11)hMCAllPositronsPt[fiCut]->Fill(particle->Pt()); // All positrons
+                       if( particle->GetPdgCode() ==  11)hMCAllElectronsPt[fiCut]->Fill(particle->Pt()); // All electrons
       }
+       
+      if(((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelectedMC( particle,fMCStack,((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetEtaShift() ) ){
+       
+                       Float_t weighted= 1;
+                   
+                    if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoWeights() ) { 
+                       if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack, fInputEvent)){
+                         if (particle->Pt()>0.005){
+                           weighted= ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
+                         }
+                       }
+                   }
+
+                       if(particle->GetPdgCode() == 111)hMCPi0GGPt[fiCut]->Fill( particle->Pt() , weighted); // All MC Pi0 GG decay
+                       if(particle->GetPdgCode() == 221)hMCEtaGGPt[fiCut]->Fill( particle->Pt() , weighted); // All MC Eta GG decay
+      }
+      
+      
+      Int_t labelgamma           = -1;
+      Int_t labelelectron = -1;
+      Int_t labelpositron = -1;
+
+
+      if( ((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelectedMCDalitz(particle,fMCStack,labelelectron,labelpositron,labelgamma,((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetEtaShift())  )
+      {
+       
+       
+               Float_t weighted= 1;
+                  if( ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->DoWeights() ) { 
+                       if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack,fInputEvent)){
+                         if (particle->Pt()>0.005){
+                           weighted= ((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
+                         }
+                       }
+                  }
+                       if(particle->GetPdgCode() == 111)hMCPi0Pt[fiCut]->Fill(particle->Pt(), weighted); // All MC Pi0
+                       if(particle->GetPdgCode() == 221)hMCEtaPt[fiCut]->Fill(particle->Pt(), weighted); // All MC Eta
+                       
+                       // Check the acceptance for gamma and electrons
+                       
+                                        
+                               TParticle *gamma    = fMCStack->Particle(labelgamma);
+                               TParticle *electron = fMCStack->Particle(labelelectron);
+                               TParticle *positron = fMCStack->Particle(labelpositron);
+                               
+           
+                               if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelectedMC(gamma,fMCStack,kFALSE) &&
+                                  ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelectedMC(labelelectron,fMCStack) &&
+                                  ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelectedMC(labelpositron,fMCStack) ) {
+                                  
+                                       if(particle->GetPdgCode() == 111){ 
+                                         
+                                               hMCPi0InAccPt[fiCut]->Fill(particle->Pt() , weighted); // MC Pi0Dalitz with gamma and e+e- in acc
+                                               hMCPi0DalitzGammaPt[fiCut]->Fill( gamma->Pt() ,weighted );
+                                               hMCPi0DalitzPositronPt[fiCut]->Fill( positron->Pt(),weighted );
+                                               hMCPi0DalitzElectronPt[fiCut]->Fill( electron->Pt(),weighted );
+                                               
+                                       }
+                                       if(particle->GetPdgCode() == 221)hMCEtaInAccPt[fiCut]->Fill(particle->Pt(), weighted ); // MC EtaDalitz with gamma and e+e- in acc
+                               }
+               
+                       
+       }
+               Int_t labelgammaChiC=-1;
+               Int_t labelpositronChiC=-1;
+               Int_t labelelectronChiC=-1;
+
+               if(((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelectedMCChiC(particle,fMCStack,labelelectronChiC,labelpositronChiC,labelgammaChiC,((AliConversionCuts*)fCutGammaArray->At(fiCut))->GetEtaShift())){
+                 
+                       hMCChiCPt[fiCut]->Fill(particle->Pt()); // All MC ChiC
+                       TParticle * gammaChiC  =fMCStack->Particle(labelgammaChiC);
+
+                       if( ((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelectedMC( gammaChiC,fMCStack,kFALSE) &&
+                           ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelectedMC(labelelectronChiC,fMCStack) && 
+                           ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelectedMC(labelpositronChiC,fMCStack) ){
+                               hMCChiCInAccPt[fiCut]->Fill(particle->Pt()); // All MC ChiC
+                       } 
+               }
+       }
+}
+//_____________________________________________________________________________
+Bool_t AliAnalysisTaskGammaConvDalitzV1::IsDalitz(TParticle *fMCMother) const
+{
+
+       if( fMCMother->GetNDaughters() != 3 ) return kFALSE;
+       if( fMCMother->GetPdgCode() != 111 && fMCMother->GetPdgCode() != 221 ) return kFALSE;
+       
+       
+       TParticle *positron = 0x0;
+       TParticle *electron = 0x0;
+       TParticle *gamma    = 0x0;
+       
+       for(Int_t index= fMCMother->GetFirstDaughter();index<= fMCMother->GetLastDaughter();index++){                           
+
+               TParticle* temp = (TParticle*)fMCStack->Particle( index );
+               
+               switch( temp->GetPdgCode() ) {
+               case ::kPositron:
+                       positron =  temp;
+                       break;
+               case ::kElectron:
+                       electron =  temp;
+                       break;
+               case ::kGamma:
+                       gamma    =  temp;
+                       break;
+               }
+       }
+  
+       if( positron && electron && gamma) return kTRUE;
+       
+       return kFALSE;
+}
+//_____________________________________________________________________________________
+Bool_t AliAnalysisTaskGammaConvDalitzV1::IsPi0DalitzDaughter( Int_t label ) const
+{
+//
+// Returns true if the particle comes from Pi0 -> e+ e- gamma
+//
+        
+        Int_t motherLabel = fMCStack->Particle( label )->GetMother(0);
+        
+        if( motherLabel < 0 || motherLabel >= fMCStack->GetNtrack() ) return kFALSE;
+        
+        TParticle* mother = fMCStack->Particle( motherLabel );
+       
+       if( mother->GetPdgCode() != 111 ) return kFALSE;
+       
+       if( IsDalitz( mother ) ) return kTRUE;
+       
+       
+       return kFALSE;
+        
+       
+}
+
+
+//_____________________________________________________________________________
+Double_t AliAnalysisTaskGammaConvDalitzV1::GetPsiPair( const AliESDtrack *trackPos, const AliESDtrack *trackNeg ) const
+{
+   //
+   // This angle is a measure for the contribution of the opening in polar
+   // direction ?0 to the opening angle ? Pair
+   //
+   // Ref. Measurement of photons via conversion pairs with the PHENIX experiment at RHIC
+   //      Master Thesis. Thorsten Dahms. 2005
+   // https://twiki.cern.ch/twiki/pub/ALICE/GammaPhysicsPublications/tdahms_thesis.pdf
+   //
+   Double_t momPos[3];
+   Double_t momNeg[3];
+   if( trackPos->GetConstrainedPxPyPz(momPos) == 0 ) trackPos->GetPxPyPz( momPos );
+   if( trackNeg->GetConstrainedPxPyPz(momNeg) == 0 ) trackNeg->GetPxPyPz( momNeg );
+
+   TVector3 posDaughter;
+   TVector3 negDaughter;
+
+   posDaughter.SetXYZ( momPos[0], momPos[1], momPos[2] );
+   negDaughter.SetXYZ( momNeg[0], momNeg[1], momNeg[2] );
+
+   Double_t deltaTheta = negDaughter.Theta() - posDaughter.Theta();
+   Double_t openingAngle =  posDaughter.Angle( negDaughter );  //TMath::ACos( posDaughter.Dot(negDaughter)/(negDaughter.Mag()*posDaughter.Mag()) );
+
+   if( openingAngle < 1e-20 ) return 0.;
+
+   Double_t psiAngle = TMath::ASin( deltaTheta/openingAngle );
+
+   return psiAngle;
 }