]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGGA/EMCALTasks/AliAnalysisTaskEMCALIsoPhoton.cxx
Removing some meaningless const (coverity)
[u/mrichter/AliRoot.git] / PWGGA / EMCALTasks / AliAnalysisTaskEMCALIsoPhoton.cxx
index 15f3641dd7adc265bc22ed482d1ad4f4ecc73efb..79e7cccc16b81b7198ace5b05d44fba57db38b32 100644 (file)
@@ -7,6 +7,7 @@
 #include <TFile.h>
 #include <TH1F.h>
 #include <TH2F.h>
+#include <TH3F.h>
 #include <THnSparse.h>
 #include <TLorentzVector.h>
 #include <TList.h>
 #include "AliESDHeader.h"
 #include "AliESDInputHandler.h"
 #include "AliESDUtils.h"
-#include "AliESDpid.h"
 #include "AliESDtrack.h"
 #include "AliESDtrackCuts.h"
-#include "AliESDv0.h"
-#include "AliKFParticle.h"
 #include "AliMCEvent.h"
 #include "AliMCEventHandler.h"
 #include "AliStack.h"
@@ -48,22 +46,35 @@ AliAnalysisTaskEMCALIsoPhoton::AliAnalysisTaskEMCALIsoPhoton() :
   fTrigBit("kEMC7"),
   fIsTrain(0),
   fIsMc(0),
+  fDebug(0),
+  fPathStrOpt("/"),
   fExoticCut(0.97),
   fIsoConeR(0.4),
   fNDimensions(7),
   fECut(3.),
   fTrackMult(0),        
+  fMcIdFamily(""),
+  fNClusForDirPho(0),
+  fDirPhoPt(0),
+  fHigherPtCone(0),
   fESD(0),
   fMCEvent(0),
   fStack(0),
   fOutputList(0),
   fEvtSel(0),
   fNClusEt10(0),
-  fPVtxZ(0),  
-  fDirPhotonPtMC(0),
+  fRecoPV(0),
+  fPVtxZ(0),
+  fTrMultDist(0),
+  fMCDirPhotonPtEtaPhi(0),
   fDecayPhotonPtMC(0),
   fCellAbsIdVsAmpl(0),       
   fNClusHighClusE(0),
+  fHigherPtConeM02(0),
+  fClusEtMcPt(0),
+  fClusMcDetaDphi(0),
+  fNClusPerPho(0),
+  fMCDirPhotonPtEtaPhiNoClus(0),
   fHnOutput(0)
 {
   // Default constructor.
@@ -83,22 +94,35 @@ AliAnalysisTaskEMCALIsoPhoton::AliAnalysisTaskEMCALIsoPhoton(const char *name) :
   fTrigBit("kEMC7"),
   fIsTrain(0),
   fIsMc(0),
+  fDebug(0),
+  fPathStrOpt("/"),
   fExoticCut(0.97),
   fIsoConeR(0.4),
   fNDimensions(7),
   fECut(3.),
   fTrackMult(0),        
+  fMcIdFamily(""),
+  fNClusForDirPho(0),
+  fDirPhoPt(0),
+  fHigherPtCone(0),
   fESD(0),
   fMCEvent(0),
   fStack(0),
   fOutputList(0),
   fEvtSel(0),
   fNClusEt10(0),
+  fRecoPV(0),
   fPVtxZ(0),            
-  fDirPhotonPtMC(0),
+  fTrMultDist(0),
+  fMCDirPhotonPtEtaPhi(0),
   fDecayPhotonPtMC(0),
   fCellAbsIdVsAmpl(0),       
   fNClusHighClusE(0),   
+  fHigherPtConeM02(0),
+  fClusEtMcPt(0),
+  fClusMcDetaDphi(0),
+  fNClusPerPho(0),
+  fMCDirPhotonPtEtaPhiNoClus(0),
   fHnOutput(0)
 {
   // Constructor
@@ -123,7 +147,7 @@ void AliAnalysisTaskEMCALIsoPhoton::UserCreateOutputObjects()
   fOutputList = new TList();
   fOutputList->SetOwner();// Container cleans up all histos (avoids leaks in merging) 
   
-  fGeom = AliEMCALGeometry::GetInstance(fGeoName);
+  fGeom = AliEMCALGeometry::GetInstance(fGeoName.Data());
   
   fEvtSel = new TH1F("hEvtSel","Event selection counter (0=all trg, 1=pvz cut) ;evt cut ;dN/dcut}",2,0,2);
   fOutputList->Add(fEvtSel);
@@ -131,12 +155,18 @@ void AliAnalysisTaskEMCALIsoPhoton::UserCreateOutputObjects()
   fNClusEt10 = new TH1F("hNClusEt10","# of cluster with E_{T}>10 per event;E;",101,-0.5,100.5);
   fOutputList->Add(fNClusEt10);
   
+  fRecoPV = new TH1F("hRecoPV","Prim. vert. reconstruction (yes or no);reco (0=no, 1=yes) ;",2,-0.5,1.5);
+  fOutputList->Add(fRecoPV);
+
   fPVtxZ = new TH1F("hPVtxZ","primary vertex Z before cut;prim-vz(cm) ;",200,-100,100);
   fOutputList->Add(fPVtxZ);
 
-  fDirPhotonPtMC = new TH1F("hDirPhotonPtMC","photon (gq->#gammaq) p_{T};GeV/c;dN/dp_{T} (c GeV^{-1})",1000,0,100);
-  fDirPhotonPtMC->Sumw2();
-  fOutputList->Add(fDirPhotonPtMC);
+  fTrMultDist = new TH1F("fTrMultDist","track multiplicity;tracks/event;#events",200,0.5,200.5);
+  fOutputList->Add(fTrMultDist);
+
+  fMCDirPhotonPtEtaPhi = new TH3F("hMCDirPhotonPtEtaPhi","photon (gq->#gammaq) p_{T}, #eta, #phi;GeV/c;#eta;#phi",1000,0,100,154,-0.77,0.77,130,1.38,3.20);
+  fMCDirPhotonPtEtaPhi->Sumw2();
+  fOutputList->Add(fMCDirPhotonPtEtaPhi);
 
   fDecayPhotonPtMC = new TH1F("hDecayPhotonPtMC","decay photon p_{T};GeV/c;dN/dp_{T} (c GeV^{-1})",1000,0,100);
   fDecayPhotonPtMC->Sumw2();
@@ -148,13 +178,28 @@ void AliAnalysisTaskEMCALIsoPhoton::UserCreateOutputObjects()
   fNClusHighClusE = new TH2F("hNClusHighClusE","total number of clusters vs. highest clus energy in the event;E (GeV);NClus",200,0,100,301,-0.5,300.5);
   fOutputList->Add(fNClusHighClusE);
 
-  Int_t nEt=1000, nM02=400, nCeIso=1000, nTrIso=1000,  nAllIso=1000,  nCeIsoNoUE=1000,  nAllIsoNoUE=1000, nTrClDphi=200, nTrClDeta=100, nClEta=140, nClPhi=128, nTime=60, nMult=20;
-  Int_t bins[] = {nEt, nM02, nCeIso, nTrIso, nAllIso, nCeIsoNoUE, nAllIsoNoUE, nTrClDphi, nTrClDeta,nClEta,nClPhi,nTime,nMult};
+  fHigherPtConeM02 = new TH2F("hHigherPtConeM02","#lambda_{0}^{2} vs. in-cone-p_{T}^{max};p_{T}^{max} (GeV/c, in the cone);#lambda_{0}^{2}",1000,0,100,400,0,4);
+  fOutputList->Add(fHigherPtConeM02);
+
+  fClusEtMcPt = new TH2F("hClusEtMcPt","E_{T}^{clus} vs. p_{T}^{mc}; p_{T}^{mc};E_{T}^{clus}",500,0,100,500,0,100);
+  fOutputList->Add(fClusEtMcPt);
+
+  fClusMcDetaDphi = new TH2F("hClusMcDetaDphi","#Delta#phi vs. #Delta#eta (reco-mc);#Delta#eta;#Delta#phi",100,-.7,.7,100,-.7,.7);
+  fOutputList->Add(fClusMcDetaDphi);
+
+  fNClusPerPho = new TH2F("hNClusPerPho","Number of clusters per prompt photon;p_{T}^{MC};N_{clus}",500,0,100,11,-0.5,10.5);
+  fOutputList->Add(fNClusPerPho);
+
+  fMCDirPhotonPtEtaPhiNoClus = new TH3F("hMCDirPhotonPhiEtaNoClus","p_{T}, #eta and  #phi of prompt photons with no reco clusters;p_{T};#eta;#phi",1000,0,100,154,-0.77,0.77,130,1.38,3.20);
+  fOutputList->Add(fMCDirPhotonPtEtaPhiNoClus);
+
+  Int_t nEt=1000, nM02=400, nCeIso=1000, nTrIso=1000,  nAllIso=1000,  nCeIsoNoUE=1000,  nAllIsoNoUE=1000, nTrClDphi=200, nTrClDeta=100, nClEta=140, nClPhi=128, nTime=60, nMult=100, nPhoMcPt=101;
+  Int_t bins[] = {nEt, nM02, nCeIso, nTrIso, nAllIso, nCeIsoNoUE, nAllIsoNoUE, nTrClDphi, nTrClDeta,nClEta,nClPhi,nTime,nMult,nPhoMcPt};
   fNDimensions = sizeof(bins)/sizeof(Int_t);
   const Int_t ndims =   fNDimensions;
-  Double_t xmin[] = { 0.,   0.,  -10.,   -10., -10., -10., -10., -0.1,-0.05, -0.7, 1.4,-0.15e-06,-0.5};
-  Double_t xmax[] = { 100., 4., 190., 190., 190.,  190., 190., 0.1, 0.05, 0.7, 3.192, 0.15e-06,99.5};
-  fHnOutput =  new THnSparseF("fHnOutput","Output matrix: E_{T},M02,CeIso,TrIso,AllIso, CeIsoNoUESub, AllIsoNoUESub, d#phi_{trk},d#eta_{trk},#eta_{clus},#phi_{clus},T_{max},mult", ndims, bins, xmin, xmax);
+  Double_t xmin[] = { 0.,   0.,  -10.,   -10., -10., -10., -10., -0.1,-0.05, -0.7, 1.4,-0.15e-06,-0.5,-1.5};
+  Double_t xmax[] = { 100., 4., 190., 190., 190.,  190., 190., 0.1, 0.05, 0.7, 3.192, 0.15e-06,99.5,99.5};
+  fHnOutput =  new THnSparseF("fHnOutput","Output matrix: E_{T},M02,CeIso,TrIso,AllIso, CeIsoNoUESub, AllIsoNoUESub, d#phi_{trk},d#eta_{trk},#eta_{clus},#phi_{clus},T_{max},mult,mc-p_{T}^{#gamma}", ndims, bins, xmin, xmax);
   fOutputList->Add(fHnOutput);
 
 
@@ -179,13 +224,24 @@ void AliAnalysisTaskEMCALIsoPhoton::UserExec(Option_t *)
     if(fTrigBit.Contains("kEMC"))
       isSelected =  (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC7);
     else
-      isSelected =  (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
+      if(fTrigBit.Contains("kMB"))
+       isSelected =  (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
+      else
+       isSelected =  (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
   }
   if(fIsMc)
     isSelected = kTRUE;
+  if(fDebug)
+    printf("isSelected = %d, fIsMC=%d\n", isSelected, fIsMc);
   if(!isSelected )
         return; 
-
+  if(fIsMc){
+    TTree *tree = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetTree();
+    TFile *file = (TFile*)tree->GetCurrentFile();
+    TString filename = file->GetName();
+    if(!filename.Contains(fPathStrOpt.Data()))
+      return;
+  }
   fESD = dynamic_cast<AliESDEvent*>(InputEvent());
   if (!fESD) {
     printf("ERROR: fESD not available\n");
@@ -193,18 +249,29 @@ void AliAnalysisTaskEMCALIsoPhoton::UserExec(Option_t *)
   }
   
   fEvtSel->Fill(0);
+  if(fDebug)
+    printf("fESD is ok\n");
   
   AliESDVertex *pv = (AliESDVertex*)fESD->GetPrimaryVertex();
-  if(!pv) 
+  if(!pv)
     return;
+  if(!pv->GetStatus())
+    fRecoPV->Fill(0);
+  else
+    fRecoPV->Fill(1);
   fPVtxZ->Fill(pv->GetZ());
   if(TMath::Abs(pv->GetZ())>15)
     return;
+  if(fDebug)
+    printf("passed vertex cut\n");
 
   fEvtSel->Fill(1);
 
-  if (!fTracks)  
-    fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("Tracks"));
+  fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("Tracks"));
+  if(!fTracks){
+    AliError("Track array in event is NULL!");
+    return;
+  }
   // Track loop to fill a pT spectrum
   const Int_t Ntracks = fTracks->GetEntriesFast();
   for (Int_t iTracks = 0;  iTracks < Ntracks; ++iTracks) {
@@ -227,21 +294,37 @@ void AliAnalysisTaskEMCALIsoPhoton::UserExec(Option_t *)
     }
   }
   AliESDtrackCuts *fTrackCuts = new AliESDtrackCuts();
-  fTrackMult = fTrackCuts->GetReferenceMultiplicity(fESD);//kTrackletsITSTPC ,0.5);  
+  fTrackMult = fTrackCuts->GetReferenceMultiplicity(fESD);//kTrackletsITSTPC ,0.5); 
+  fTrMultDist->Fill(fTrackMult);
 
   fESD->GetEMCALClusters(fCaloClusters);
   fEMCalCells = fESD->GetEMCALCells();
   
     
-  FillClusHists(); 
-
-  fCaloClusters->Clear();
-  fSelPrimTracks->Clear();
 
   fMCEvent = MCEvent();
-  if(fMCEvent)
+  if(fMCEvent){
+    if(fDebug)
+      std::cout<<"MCevent exists\n";
     fStack = (AliStack*)fMCEvent->Stack();
+  }
+  else{
+    if(fDebug)
+      std::cout<<"ERROR: NO MC EVENT!!!!!!\n";
+  }
+  FollowGamma();
+  if(fDebug)
+    printf("passed calling of FollowGamma\n");
+  FillClusHists(); 
+  if(fDebug)
+    printf("passed calling of FillClusHists\n");
   FillMcHists();
+  if(fDebug)
+    printf("passed calling of FillMcHists\n");
+
+  fCaloClusters->Clear();
+  fSelPrimTracks->Clear();
+  fNClusForDirPho = 0;
 
   PostData(1, fOutputList);
 }      
@@ -256,8 +339,11 @@ void AliAnalysisTaskEMCALIsoPhoton::FillClusHists()
   const Int_t nclus = fCaloClusters->GetEntries();
   if(nclus==0)
     return;
+  if(fDebug)
+    printf("Inside FillClusHists and there are %d clusters\n",nclus);
   Double_t maxE = 0;
   Int_t nclus10 = 0;
+  Double_t ptmc=-1;
   for(Int_t ic=0;ic<nclus;ic++){
     maxE=0;
     AliESDCaloCluster *c = static_cast<AliESDCaloCluster*>(fCaloClusters->At(ic));
@@ -276,6 +362,8 @@ void AliAnalysisTaskEMCALIsoPhoton::FillClusHists()
     c->GetPosition(clsPos);
     TVector3 clsVec(clsPos);
     Double_t Et = c->E()*TMath::Sin(clsVec.Theta());
+    if(fDebug)
+      printf("\tcluster eta=%1.1f,phi=%1.1f,E=%1.1f\n",clsVec.Eta(),clsVec.Phi(),c->E());
     if(Et>10)
       nclus10++;
     Float_t ceiso, cephiband, cecore;
@@ -285,6 +373,12 @@ void AliAnalysisTaskEMCALIsoPhoton::FillClusHists()
     Float_t netConeArea = TMath::Pi()*(fIsoConeR*fIsoConeR - 0.04*0.04);
     GetCeIso(clsVec, ceiso, cephiband, cecore);
     GetTrIso(clsVec, triso, trphiband, trcore);
+    Double_t dr = TMath::Sqrt(c->GetTrackDx()*c->GetTrackDx() + c->GetTrackDz()*c->GetTrackDz());
+    if(Et>10 && Et<15 && dr>0.025){
+      fHigherPtConeM02->Fill(fHigherPtCone,c->GetM02());
+      if(fDebug)
+       printf("\t\tHigher track pt inside the cone: %1.1f GeV/c; M02=%1.2f\n",fHigherPtCone,c->GetM02());
+    }
     alliso = ceiso + triso;
     allphiband = cephiband + trphiband;
     allcore = cecore + trcore;
@@ -293,6 +387,7 @@ void AliAnalysisTaskEMCALIsoPhoton::FillClusHists()
     Float_t allisoue =  allphiband/phibandArea*netConeArea;
     const Int_t ndims =   fNDimensions;
     Double_t outputValues[ndims];
+    ptmc = GetClusSource(c);
     outputValues[0] = Et;
     outputValues[1] = c->GetM02();
     outputValues[2] = ceiso-cecore-ceisoue;
@@ -306,12 +401,14 @@ void AliAnalysisTaskEMCALIsoPhoton::FillClusHists()
     outputValues[10] = clsVec.Phi();
     outputValues[11] = fEMCalCells->GetCellTime(id);
     outputValues[12] = fTrackMult;
+    outputValues[13] = ptmc;
     fHnOutput->Fill(outputValues);
     if(c->E()>maxE)
       maxE = c->E();
   }
   fNClusHighClusE->Fill(maxE,nclus);
   fNClusEt10->Fill(nclus10);
+  fNClusPerPho->Fill(fDirPhoPt,fNClusForDirPho);
 } 
 
 //________________________________________________________________________
@@ -334,6 +431,9 @@ void AliAnalysisTaskEMCALIsoPhoton::GetCeIso(TVector3 vec, Float_t &iso, Float_t
   Float_t eta=-1, phi=-1;  
   for(int icell=0;icell<ncells;icell++){
     absid = TMath::Abs(fEMCalCells->GetCellNumber(icell));
+    Float_t celltime = fEMCalCells->GetCellTime(absid);
+    if(celltime>2e-8 || celltime<-2e-8)
+      continue;
     if(!fGeom)
       return;
     fGeom->EtaPhiFromIndex(absid,eta,phi);
@@ -366,6 +466,7 @@ void AliAnalysisTaskEMCALIsoPhoton::GetTrIso(TVector3 vec, Float_t &iso, Float_t
 
   if(!fSelPrimTracks)
     return;
+  fHigherPtCone = 0;
   const Int_t ntracks = fSelPrimTracks->GetEntries();
   Double_t totiso=0;
   Double_t totband=0;
@@ -382,6 +483,8 @@ void AliAnalysisTaskEMCALIsoPhoton::GetTrIso(TVector3 vec, Float_t &iso, Float_t
     Double_t deta = TMath::Abs(track->Eta()-etacl);
     Double_t R = TMath::Sqrt(deta*deta + dphi*dphi);
     Double_t pt = track->Pt();
+    if(pt>fHigherPtCone)
+      fHigherPtCone = pt;
     if(R<fIsoConeR){
       totiso += track->Pt();
       if(R<0.04)
@@ -477,6 +580,8 @@ void AliAnalysisTaskEMCALIsoPhoton ::FillMcHists()
   if(!fStack)
     return;
   Int_t nTracks = fStack->GetNtrack();
+  if(fDebug)
+    printf("Inside FillMcHists and there are %d mcparts\n",nTracks);
   for(Int_t iTrack=0;iTrack<nTracks;iTrack++){
     TParticle *mcp = static_cast<TParticle*>(fStack->Particle(iTrack));  
     if(!mcp)
@@ -484,6 +589,8 @@ void AliAnalysisTaskEMCALIsoPhoton ::FillMcHists()
     Int_t pdg = mcp->GetPdgCode();
     if(pdg!=22)
       continue;
+    if(TMath::Abs(mcp->Eta())>0.7 ||mcp->Phi()<1.4 || mcp->Phi()>3.2)
+      continue;
     Int_t imom = mcp->GetMother(0);
     if(imom<0 || imom>nTracks)
       continue;
@@ -491,8 +598,15 @@ void AliAnalysisTaskEMCALIsoPhoton ::FillMcHists()
     if(!mcmom)
       continue;
     Int_t pdgMom = mcmom->GetPdgCode();
-    if(TMath::Abs(pdgMom)<7)
-      fDirPhotonPtMC->Fill(mcp->Pt());
+    if((imom==6 || imom==7) && pdgMom==22) {
+      fMCDirPhotonPtEtaPhi->Fill(mcp->Pt(),mcp->Eta(),mcp->Phi());
+      if(fNClusForDirPho==0)
+       fMCDirPhotonPtEtaPhiNoClus->Fill(mcp->Pt(),mcp->Eta(),mcp->Phi());
+      if(fDebug){
+       printf("Found \"photonic\" parton at position %d, with pt=%1.1f, eta=%1.1f and phi=%1.1f, and status=%d,\n",imom,mcmom->Pt(), mcmom->Eta(), mcmom->Phi(), mcmom->GetStatusCode());
+       printf("with a final photon at position %d, with pt=%1.1f, eta=%1.1f and phi=%1.1f, and status=%d\n",iTrack,mcp->Pt(), mcp->Eta(), mcp->Phi(),mcp->GetStatusCode());
+      }
+    }
     else{
       if(TMath::Abs(pdgMom)>100 && TMath::Abs(pdgMom)<1000)
        fDecayPhotonPtMC->Fill(mcp->Pt());
@@ -500,6 +614,114 @@ void AliAnalysisTaskEMCALIsoPhoton ::FillMcHists()
   }
 }
 //________________________________________________________________________
+Float_t AliAnalysisTaskEMCALIsoPhoton::GetClusSource(const AliVCluster *c)
+{
+  if(!c)
+    return -1;
+  if(!fStack)
+    return -1;
+  Int_t nmcp = fStack->GetNtrack();
+  Int_t clabel = c->GetLabel();
+  if(fDebug && fMcIdFamily.Contains(Form("%d",clabel)))
+    printf("\n\t ==== Label %d is a descendent of the prompt photon ====\n\n",clabel);
+  if(!fMcIdFamily.Contains(Form("%d",clabel)))
+    return -1;
+  fNClusForDirPho++;
+  TString partonposstr = (TSubString)fMcIdFamily.operator()(0,1);
+  Int_t partonpos = partonposstr.Atoi();
+  if(fDebug)
+    printf("\t^^^^ parton position = %d ^^^^\n",partonpos);
+  if(clabel<0 || clabel>nmcp)
+    return 0;
+  Float_t clsPos[3] = {0,0,0};
+  c->GetPosition(clsPos);
+  TVector3 clsVec(clsPos);
+  Double_t Et = c->E()*TMath::Sin(clsVec.Theta());
+  TParticle *mcp = static_cast<TParticle*>(fStack->Particle(partonpos));
+  if(!mcp)
+    return -1;
+  if(fDebug){
+    printf("\tclus mc truth eta=%1.1f,phi=%1.1f,E=%1.1f, pdgcode=%d, stackpos=%d\n",mcp->Eta(),mcp->Phi(),mcp->Energy(),mcp->GetPdgCode(),clabel);
+  }
+  Int_t lab1 =  mcp->GetFirstDaughter();
+  if(lab1<0 || lab1>nmcp)
+    return -1;
+  TParticle *mcd = static_cast<TParticle*>(fStack->Particle(lab1));
+  if(!mcd)
+    return -1;
+  if(fDebug)
+    printf("\t\tmom mc truth eta=%1.1f,phi=%1.1f,E=%1.1f, pdgcode=%d, stackpos=%d\n",mcd->Eta(),mcd->Phi(),mcd->Energy(),mcd->GetPdgCode(),lab1);
+  if(mcd->GetPdgCode()==22){
+    fClusEtMcPt->Fill(mcd->Pt(), Et);
+    fClusMcDetaDphi->Fill(clsVec.Eta() - mcd->Eta(), clsVec.Phi() - mcd->Phi());
+  }
+  else{
+    printf("Warning: daughter of photon parton is not a photon\n");
+    return -1;
+  }
+  return fDirPhoPt;
+}
+//________________________________________________________________________
+void AliAnalysisTaskEMCALIsoPhoton::FollowGamma()
+{
+  if(!fStack)
+    return;
+  Int_t selfid = 6;
+  TParticle *mcp = static_cast<TParticle*>(fStack->Particle(selfid));
+  if(!mcp)
+    return;
+  if(mcp->GetPdgCode()!=22){
+    mcp = static_cast<TParticle*>(fStack->Particle(++selfid));
+    if(!mcp)
+      return;
+  }  
+  Int_t daug0f =  mcp->GetFirstDaughter();
+  Int_t daug0l =  mcp->GetLastDaughter();
+  Int_t nd0 = daug0l - daug0f;
+  if(fDebug)
+    printf("\n\tGenerated gamma (%d) eta=%1.1f,phi=%1.1f,E=%1.1f, pdgcode=%d, n-daug=%d\n",selfid,mcp->Eta(),mcp->Phi(),mcp->Energy(),mcp->GetPdgCode(),nd0+1);
+  fMcIdFamily = Form("%d,",selfid);
+  GetDaughtersInfo(daug0f,daug0l, selfid,"");
+  if(fDebug){
+    printf("\t---- end of the prompt  gamma's family tree ----\n\n");
+    printf("Family id string = %s,\n\n",fMcIdFamily.Data());
+  }
+  TParticle *md = static_cast<TParticle*>(fStack->Particle(daug0f));
+  if(!md)
+    return;
+  fDirPhoPt = md->Pt();
+}
+//________________________________________________________________________
+void AliAnalysisTaskEMCALIsoPhoton::GetDaughtersInfo(int firstd, int lastd, int selfid, const char *inputind)
+{
+  int nmcp = fStack->GetNtrack();
+  if(firstd<0 || firstd>nmcp)
+    return;
+  if(lastd<0 || lastd>nmcp)
+    return;
+  if(firstd>lastd){
+    printf("WARNING: First daughter > last (%d,%d)\n",firstd,lastd);
+    return;
+  }
+  TString indenter = Form("\t%s",inputind);
+  TParticle *dp = 0x0;
+  if(fDebug)
+    printf("\t%s--- Daughters of particle %d ---\n", indenter.Data(), selfid);
+  for(int id=firstd; id<lastd+1; id++){
+    dp =  static_cast<TParticle*>(fStack->Particle(id));
+    if(!dp)
+      continue;
+    Int_t dfd = dp->GetFirstDaughter(); 
+    Int_t dld = dp->GetLastDaughter();
+    Int_t dnd =  dld - dfd + 1;
+    Float_t vr = TMath::Sqrt(dp->Vx()*dp->Vx()+dp->Vy()*dp->Vy());
+    if(fDebug)
+      printf("\t%sParticle daughter(%d) eta=%1.1f,phi=%1.1f,E=%1.1f, vR=%1.1f, pdgcode=%d, n-daug=%d(%d,%d)\n", indenter.Data(),id, dp->Eta(), dp->Phi(), dp->Energy(), vr, dp->GetPdgCode(), dnd, dfd, dld);
+    fMcIdFamily += Form("%d,",id);
+    GetDaughtersInfo(dfd,dld,id,indenter.Data());
+  }
+}
+//________________________________________________________________________
 void AliAnalysisTaskEMCALIsoPhoton::Terminate(Option_t *) 
 {
   // Called once at the end of the query.