]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGGA/GammaConv/AliAnalysisTaskConversionQA.cxx
removed old software from directory, fixed Addtask macro for main task, applied cover...
[u/mrichter/AliRoot.git] / PWGGA / GammaConv / AliAnalysisTaskConversionQA.cxx
index 3bf6c825927efda22099164941812822e7a0af4a..f05ba5018e07ff5c487fc110f500d2dc6ffc9f4a 100644 (file)
@@ -1,16 +1,16 @@
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- *                                                                                                                                                                                             *
- * Authors: Svein Lindal, Daniel Lohner                                                                                        *
- * Version 1.0                                                                                                                                                         *
- *                                                                                                                                                                                             *
- * Permission to use, copy, modify and distribute this software and its         *
- * documentation strictly for non-commercial purposes is hereby granted         *
- * without fee, provided that the above copyright notice appears in all         *
- * copies and that both the copyright notice and this permission notice         *
- * appear in the supporting documentation. The authors make no claims   *
- * about the suitability of this software for any purpose. It is                       *
- * provided "as is" without express or implied warranty.                                               *
+ *                                                                       *
+ * Authors: Svein Lindal, Daniel Lohner                                          *
+ * Version 1.0                                                           *
+ *                                                                       *
+ * Permission to use, copy, modify and distribute this software and its          *
+ * documentation strictly for non-commercial purposes is hereby granted          *
+ * without fee, provided that the above copyright notice appears in all          *
+ * copies and that both the copyright notice and this permission notice          *
+ * appear in the supporting documentation. The authors make no claims    *
+ * about the suitability of this software for any purpose. It is         *
+ * provided "as is" without express or implied warranty.                 *
  **************************************************************************/
 
 ////////////////////////////////////////////////
@@ -26,6 +26,7 @@
 #include "TVectorF.h"
 #include "AliPIDResponse.h"
 #include "TFile.h"
+#include "AliESDtrackCuts.h"
 
 class iostream;
 
@@ -35,11 +36,57 @@ ClassImp(AliAnalysisTaskConversionQA)
 
 //________________________________________________________________________
 AliAnalysisTaskConversionQA::AliAnalysisTaskConversionQA(const char *name) : AliAnalysisTaskSE(name),
+   fV0Reader(NULL),
    fConversionGammas(NULL),
    fConversionCuts(NULL),
+   fInputEvent(NULL),
+   fNumberOfESDTracks(0),
+   fMCEvent(NULL),
+   fMCStack(NULL),
    fStreamQA(NULL),
    fIsHeavyIon(kFALSE),
-   fOutputList(NULL)
+   ffillTree(kFALSE),
+   ffillHistograms(kFALSE),
+   fOutputList(NULL),
+   fESDList(NULL),
+   hVertexZ(NULL),
+   hNGoodESDTracks(NULL),
+   hNV0Tracks(NULL),
+   hNContributorsVertex(NULL),
+   hITSClusterPhi(NULL),
+   hGammaPt(NULL),
+   hGammaPhi(NULL),
+   hGammaEta(NULL),
+   hGammaChi2perNDF(NULL),
+   hGammaPsiPair(NULL),
+   hGammaQt(NULL),
+   hGammaCosinePointingAngle(NULL),
+   hGammaXY(NULL),
+   hGammaZR(NULL),
+   hElecPt(NULL),
+   hElecEta(NULL),
+   hElecPhi(NULL),
+   hElecNfindableClsTPC(NULL),
+   hPosiNfindableClsTPC(NULL),
+   fTrueList(NULL),
+   hTrueResoulutionR(NULL),
+   hTrueResoulutionZ(NULL),
+   hTrueResoulutionPhi(NULL),
+   hTrueGammaPt(NULL),
+   hTrueGammaPhi(NULL),
+   hTrueGammaEta(NULL),
+   hTrueGammaMass(NULL),
+   hTrueGammaChi2perNDF(NULL),
+   hTrueGammaPsiPair(NULL),
+   hTrueGammaQt(NULL),
+   hTrueGammaCosinePointingAngle(NULL),
+   hTrueGammaXY(NULL),
+   hTrueGammaZR(NULL),
+   hTrueElecPt(NULL),
+   hTrueElecEta(NULL),
+   hTrueElecPhi(NULL),
+   hTrueElecNfindableClsTPC(NULL),
+   hTruePosiNfindableClsTPC(NULL)
 {
    // Default constructor
 
@@ -69,13 +116,116 @@ void AliAnalysisTaskConversionQA::UserCreateOutputObjects()
       fOutputList = new TList();
       fOutputList->SetOwner(kTRUE);
    }
+   
 
-   // V0 Reader Cuts
-   TString cutnumber = fConversionCuts->GetCutNumber();
+   if(ffillHistograms){
+      TH1::SetDefaultSumw2(kTRUE);
+      
+      fESDList = new TList();
+      fESDList->SetOwner(kTRUE);
+      fESDList->SetName("ESD QA");
+      fOutputList->Add(fESDList);
 
-   fStreamQA = new TTreeSRedirector(Form("GammaConvV1_QA_%s.root",cutnumber.Data()));
-   PostData(1, fOutputList);
+      hVertexZ = new TH1F("Vertex_Z","Vertex_Z",300,-15,15);
+      fESDList->Add(hVertexZ);
+      hNContributorsVertex = new TH1I("ContrVertex_Z","ContrVertex_Z",3000,0,3000);
+      fESDList->Add(hNContributorsVertex);
+      if(fIsHeavyIon) hNGoodESDTracks = new TH1I("GoodESDTracks","GoodESDTracks",3000,0,3000);
+      else hNGoodESDTracks = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
+      fESDList->Add(hNGoodESDTracks);
+      if(fIsHeavyIon) hNV0Tracks = new TH1I("V0 Multiplicity","V0 Multiplicity",30000,0,30000);
+      else hNV0Tracks = new TH1I("V0 Multiplicity","V0 Multiplicity",2000,0,2000);
+      fESDList->Add(hNV0Tracks);
+
+      hITSClusterPhi = new TH2F("ITSClusterPhi","hITSClusterPhi",72,0,2*TMath::Pi(),7,0,7);
+      fESDList->Add(hITSClusterPhi);
+      hGammaPt = new TH1F("Gamma_Pt","Gamma_Pt",250,0,25);
+      fESDList->Add(hGammaPt);
+      hGammaPhi = new TH1F("Gamma_Phi","Gamma_Phi",360,0,2*TMath::Pi());
+      fESDList->Add(hGammaPhi);
+      hGammaEta = new TH1F("Gamma_Eta","Gamma_Eta",400,-1.2,1.2);
+      fESDList->Add(hGammaEta);
+      hGammaChi2perNDF = new TH1F("Gamma_Chi2perNDF","Gamma_Chi2perNDF",500,0,100);
+      fESDList->Add(hGammaChi2perNDF);
+      hGammaPsiPair = new TH1F("Gamma_PsiPair","Gamma_PsiPair",500,0,2);
+      fESDList->Add(hGammaPsiPair);
+      hGammaQt = new TH1F("Gamma_Qt","Gamma_Qt",400,0,0.1);
+      fESDList->Add(hGammaQt);
+      hGammaCosinePointingAngle = new TH1F("Gamma_CosinePointingAngle","Gamma_CosinePointingAngle",900,0.7,1.);
+      fESDList->Add(hGammaCosinePointingAngle);
+      hGammaXY = new TH2F("Gamma_ConversionPoint_XY","Gamma_ConversionPoint_XY",960,-120,120,960,-120,120);
+      fESDList->Add(hGammaXY);
+      hGammaZR= new TH2F("Gamma_ConversionPoint_ZR","Gamma_ConversionPoint_ZR",1200,-150,150,480,0,120);
+      fESDList->Add(hGammaZR);
+
+      hElecPt = new TH2F("Electron_Positron_Pt","Electron_Positron_Pt",250,0,25,250,0,25);
+      fESDList->Add(hElecPt);
+      hElecEta = new TH2F("Electron_Positron_Eta","Electron_Positron_Eta",400,-1.2,1.2,400,-1.2,1.2);
+      fESDList->Add(hElecEta);
+      hElecPhi = new TH2F("Electron_Positron_Phi","Electron_Positron_Phi",360,0,2*TMath::Pi(),360,0,2*TMath::Pi());
+      fESDList->Add(hElecPhi);
+      hElecNfindableClsTPC = new TH1F("Electron_findableClusterTPC","Electron_findableClusterTPC",100,0,1);
+      fESDList->Add(hElecNfindableClsTPC);
+      hPosiNfindableClsTPC = new TH1F("Positron_findableClusterTPC","Positron_findableClusterTPC",100,0,1);
+      fESDList->Add(hPosiNfindableClsTPC);
+
+      if(MCEvent()){
+         fTrueList = new TList();
+         fTrueList->SetOwner(kTRUE);
+         fTrueList->SetName("True QA");
+         fOutputList->Add(fTrueList);
+
+         hTrueResoulutionR = new TH2F("True_ConversionPointResolution_R","True_ConversionPointResolution_R",240,0,120,200,-20,20);
+         fTrueList->Add(hTrueResoulutionR);
+         hTrueResoulutionZ = new TH2F("True_ConversionPointResolution_Z","True_ConversionPointResolution_Z",480,-120,120,200,-20,20);
+         fTrueList->Add(hTrueResoulutionZ);
+         hTrueResoulutionPhi = new TH2F("True_ConversionPointResolution_Phi","True_ConversionPointResolution_Phi",360,0,2*TMath::Pi(),200,-20,20);
+         fTrueList->Add(hTrueResoulutionPhi);
+
+         hTrueGammaPt = new TH1F("True_Gamma_Pt","True_Gamma_Pt",250,0,25);
+         fTrueList->Add(hTrueGammaPt);
+         hTrueGammaPhi = new TH1F("True_Gamma_Phi","True_Gamma_Phi",360,0,2*TMath::Pi());
+         fTrueList->Add(hTrueGammaPhi);
+         hTrueGammaEta = new TH1F("True_Gamma_Eta","True_Gamma_Eta",400,-1.2,1.2);
+         fTrueList->Add(hTrueGammaEta);
+         hTrueGammaMass = new TH1F("True_Gamma_Mass","True_Gamma_Mass",1000,0,0.3);
+         fTrueList->Add(hTrueGammaMass);
+         hTrueGammaChi2perNDF = new TH1F("True_Gamma_Chi2perNDF","True_Gamma_Chi2perNDF",500,0,100);
+         fTrueList->Add(hTrueGammaChi2perNDF);
+         hTrueGammaPsiPair = new TH1F("True_Gamma_PsiPair","True_Gamma_PsiPair",500,0,2);
+         fTrueList->Add(hTrueGammaPsiPair);
+         hTrueGammaQt = new TH1F("True_Gamma_Qt","True_Gamma_Qt",400,0,0.1);
+         fTrueList->Add(hTrueGammaQt);
+         hTrueGammaCosinePointingAngle = new TH1F("True_Gamma_CosinePointingAngle","True_Gamma_CosinePointingAngle",900,0.7,1.);
+         fTrueList->Add(hTrueGammaCosinePointingAngle);
+         hTrueGammaXY = new TH2F("True_Gamma_ConversionPoint_XY","True_Gamma_ConversionPoint_XY",960,-120,120,960,-120,120);
+         fTrueList->Add(hTrueGammaXY);
+         hTrueGammaZR= new TH2F("TrueGamma_ConversionPoint_ZR","TrueGamma_ConversionPoint_ZR",1200,-150,150,480,0,120);
+         fTrueList->Add(hTrueGammaZR);
 
+         hTrueElecPt = new TH2F("True_Electron_Positron_Pt","True_Electron_Positron_Pt",250,0,25,250,0,25);
+         fTrueList->Add(hTrueElecPt);
+         hTrueElecEta = new TH2F("True_Electron_Positron_Eta","True_Electron_Positron_Eta",400,-1.2,1.2,400,-1.2,1.2);
+         fTrueList->Add(hTrueElecEta);
+         hTrueElecPhi = new TH2F("True_Electron_Positron_Phi","True_Electron_Positron_Phi",360,0,2*TMath::Pi(),360,0,2*TMath::Pi());
+         fTrueList->Add(hTrueElecPhi);
+         hTrueElecNfindableClsTPC = new TH1F("True_Electron_findableClusterTPC","True_Electron_findableClusterTPC",100,0,1);
+         fTrueList->Add(hTrueElecNfindableClsTPC);
+         hTruePosiNfindableClsTPC = new TH1F("True_Positron_findableClusterTPC","True_Positron_findableClusterTPC",100,0,1);
+         fTrueList->Add(hTruePosiNfindableClsTPC);
+      }
+      if(fConversionCuts->GetCutHistograms()){
+         fOutputList->Add(fConversionCuts->GetCutHistograms());
+      }
+      TH1::SetDefaultSumw2(kFALSE);
+   }
+   
+   if(ffillTree){
+      TString cutnumber = fConversionCuts->GetCutNumber();
+      fStreamQA = new TTreeSRedirector(Form("GammaConvV1_QATree_%s.root",cutnumber.Data()),"recreate");
+   }
+
+   PostData(1, fOutputList);
 }
 
 //________________________________________________________________________
@@ -87,63 +237,162 @@ void AliAnalysisTaskConversionQA::UserExec(Option_t *){
    if(eventQuality != 0){// Event Not Accepted
       return;
    }
-   AliESDEvent* event = (AliESDEvent*) InputEvent();
-   if(fIsHeavyIon && !fConversionCuts->IsCentralitySelected(event)) return;
+   fInputEvent = InputEvent();
+   fMCEvent = MCEvent();
+   if(fMCEvent) fMCStack = fMCEvent->Stack();
+
+   Int_t eventNotAccepted =
+      fConversionCuts->IsEventAcceptedByConversionCut(fV0Reader->GetConversionCuts(),fInputEvent,fMCEvent,fIsHeavyIon);
+   if(eventNotAccepted) return; // Check Centrality, PileUp, SDD and V0AND --> Not Accepted => eventQuality = 1
 
    fConversionGammas=fV0Reader->GetReconstructedGammas();
 
-   ProcessQA();
+   if(fMCEvent){
+      if(fConversionCuts->GetSignalRejection() != 0){
+         fConversionCuts->GetNotRejectedParticles(fConversionCuts->GetSignalRejection(),
+                                                  fConversionCuts->GetAcceptedHeader(),
+                                                  fMCEvent);
+      }
+   }
+
+   if(ffillHistograms){
+      CountESDTracks();
+      hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
+      hNContributorsVertex->Fill(fConversionCuts->GetNumberOfContributorsVtx(fInputEvent));
+      hNGoodESDTracks->Fill(fNumberOfESDTracks);
+      hNV0Tracks->Fill(fInputEvent->GetVZEROData()->GetMTotV0A()+fInputEvent->GetVZEROData()->GetMTotV0C());
+   }
+
+   for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
+      AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
+      if (gamma==NULL) continue;
+      if(fMCEvent && fConversionCuts->GetSignalRejection() != 0){
+         if(!fConversionCuts->IsParticleFromBGEvent(gamma->GetMCLabelPositive(), fMCStack))
+            continue;
+         if(!fConversionCuts->IsParticleFromBGEvent(gamma->GetMCLabelNegative(), fMCStack))
+            continue;
+      }
+      if(!fConversionCuts->PhotonIsSelected(gamma,fInputEvent)){
+         continue;
+      }
+
+      if(ffillTree) ProcessQATree(gamma);
+      if(ffillHistograms) ProcessQA(gamma);
+   }
+
    PostData(1, fOutputList);
 }
 
 
 ///________________________________________________________________________
-void AliAnalysisTaskConversionQA::ProcessQA(){
+void AliAnalysisTaskConversionQA::ProcessQATree(AliAODConversionPhoton *gamma){
 
    // Fill Histograms for QA and MC
    AliESDEvent* event = (AliESDEvent*) InputEvent();
    AliPIDResponse* pidResonse = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetPIDResponse();
-   for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
-      AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
-      if(!fConversionCuts->PhotonIsSelected(gamma,event)) continue;
-      Float_t gammaPt = gamma->GetPhotonPt();
-      Float_t gammaPhi = gamma->GetPhotonPhi();
-      Float_t gammaTheta = gamma->Theta();
-      Float_t gammaChi2NDF = gamma->GetChi2perNDF();
-      Float_t gammaQt = gamma->GetArmenterosQt();
-      Float_t gammaAlpha = gamma->GetArmenterosAlpha();
-      Float_t gammaPsiPair = gamma->GetPsiPair();
-      TVectorF daughterProp(14);
-      AliVTrack * negTrack = fConversionCuts->GetTrack(event, gamma->GetTrackLabelNegative());
-      AliVTrack * posTrack = fConversionCuts->GetTrack(event, gamma->GetTrackLabelPositive());
-      if(!negTrack||!posTrack)return;
-
-      daughterProp(0) = posTrack->Pt();
-      daughterProp(7) = negTrack->Pt();
-      daughterProp(1) = posTrack->Theta();
-      daughterProp(8) = negTrack->Theta();
+
+   Float_t gammaPt = gamma->GetPhotonPt();
+   Float_t gammaPhi = gamma->GetPhotonPhi();
+   Float_t gammaTheta = gamma->Theta();
+   Float_t gammaChi2NDF = gamma->GetChi2perNDF();
+   Float_t gammaQt = gamma->GetArmenterosQt();
+   Float_t gammaAlpha = gamma->GetArmenterosAlpha();
+   Float_t gammaPsiPair = gamma->GetPsiPair();
+   Float_t gammaCosPointing = fConversionCuts->GetCosineOfPointingAngle(gamma,event);
+   TVectorF conversionPoint(3);
+   conversionPoint(0) = gamma->GetConversionX();
+   conversionPoint(1) = gamma->GetConversionY();
+   conversionPoint(2) = gamma->GetConversionZ();
+   TVectorF daughterProp(18);
+   AliESDtrack * negTrack = fConversionCuts->GetESDTrack(event, gamma->GetTrackLabelNegative());
+   AliESDtrack * posTrack = fConversionCuts->GetESDTrack(event, gamma->GetTrackLabelPositive());
+
+   if(!negTrack||!posTrack)return;
+
+   Bool_t isTruePhoton = kFALSE;
+   if(fMCEvent){
+      if(IsTruePhoton(gamma)) isTruePhoton = kTRUE;
+   }
+
+   daughterProp(0) = posTrack->Pt();
+   daughterProp(7) = negTrack->Pt();
+   daughterProp(1) = posTrack->Theta();
+   daughterProp(8) = negTrack->Theta();
+   Double32_t signalPos[4] = {0,0,0,0};
+   Char_t nclPos[3];
+   Char_t nrowsPos[3];
+   if (posTrack->GetTPCdEdxInfo()) {
+      posTrack->GetTPCdEdxInfo()->GetTPCSignalRegionInfo(signalPos,nclPos,nrowsPos);
+      daughterProp(2) = signalPos[0];
+      daughterProp(14) = signalPos[1];
+      daughterProp(16) = signalPos[2];
+   } else {
       daughterProp(2) = posTrack->GetTPCsignal();
+      daughterProp(14) = 0;
+      daughterProp(16) = 0;
+   }
+   Double32_t signalNeg[4] = {0,0,0,0};
+   Char_t nclNeg[3];
+   Char_t nrowsNeg[3];
+   if (negTrack->GetTPCdEdxInfo()) {
+      negTrack->GetTPCdEdxInfo()->GetTPCSignalRegionInfo(signalNeg,nclNeg,nrowsNeg);
+      daughterProp(9) = signalNeg[0];
+      daughterProp(15) = signalNeg[1];
+      daughterProp(17) = signalNeg[2];
+   } else {
       daughterProp(9) = negTrack->GetTPCsignal();
-      daughterProp(3) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kElectron);
-      daughterProp(10) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kElectron);
-      if((posTrack->GetStatus() & AliESDtrack::kTOFpid) && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
-         daughterProp(4) = posTrack->GetTOFsignal();
-         daughterProp(5) = pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron);
-      } else {
-         daughterProp(4) = 20000;
-         daughterProp(5) = -20;
-      }
-      if((negTrack->GetStatus() & AliESDtrack::kTOFpid) && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
-         daughterProp(11) = negTrack->GetTOFsignal();
-         daughterProp(12) = pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron);
-      } else {
-         daughterProp(11) = 20000;
-         daughterProp(12) = -20;
-      }
-      daughterProp(6) = (Float_t)posTrack->GetNcls(1)/(Float_t)posTrack->GetTPCNclsF();
-      daughterProp(13) = (Float_t)negTrack->GetNcls(1)/(Float_t)negTrack->GetTPCNclsF();
+      daughterProp(15) = 0;
+      daughterProp(17) = 0;
+   }
+   daughterProp(3) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kElectron);
+   daughterProp(10) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kElectron);
+   if((posTrack->GetStatus() & AliESDtrack::kTOFpid) && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
+      Double_t t0pos = pidResonse->GetTOFResponse().GetStartTime(posTrack->P());
+      Double_t timesPos[5];
+      posTrack->GetIntegratedTimes(timesPos);
+      Double_t TOFsignalPos =  posTrack->GetTOFsignal();
+      Double_t dTpos = TOFsignalPos - t0pos - timesPos[0];
+      daughterProp(4) = dTpos;
+      daughterProp(5) = pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron);
+   } else {
+      daughterProp(4) = 20000;
+      daughterProp(5) = -20;
+   }
+   if((negTrack->GetStatus() & AliESDtrack::kTOFpid) && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
+      Double_t t0neg = pidResonse->GetTOFResponse().GetStartTime(negTrack->P());
+      Double_t timesNeg[5];
+      negTrack->GetIntegratedTimes(timesNeg);
+      Double_t TOFsignalNeg =  negTrack->GetTOFsignal();
+      Double_t dTneg = TOFsignalNeg - t0neg - timesNeg[0];
+      daughterProp(11) = dTneg;
+      daughterProp(12) = pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron);
+   } else {
+      daughterProp(11) = 20000;
+      daughterProp(12) = -20;
+   }
+
+   daughterProp(6) = (Float_t)posTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius()));
+   //posTrack->GetNcls(1)/(Float_t)posTrack->GetTPCNclsF();
+   daughterProp(13) = (Float_t)negTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius()));
+   //negTrack->GetNcls(1)/(Float_t)negTrack->GetTPCNclsF();
 
-      if (fStreamQA){
+   if (fStreamQA){
+      if(fMCEvent){
+         (*fStreamQA)<<"PhotonQA"
+                     << "pt=" << gammaPt
+                     << "phi=" << gammaPhi
+                     << "theta=" << gammaTheta
+                     << "chi2ndf=" << gammaChi2NDF
+                     << "qt="<< gammaQt
+                     << "alpha=" << gammaAlpha
+                     << "psipair=" << gammaPsiPair
+                     << "cosPoint=" << gammaCosPointing
+                     << "TruePhoton=" << isTruePhoton
+                     << "conversionPoint=" << &conversionPoint
+                     << "daugtherProp.=" << &daughterProp
+                     << "\n";
+      }
+      else{
          (*fStreamQA)<<"PhotonQA"
                      << "pt=" << gammaPt
                      << "phi=" << gammaPhi
@@ -152,17 +401,144 @@ void AliAnalysisTaskConversionQA::ProcessQA(){
                      << "qt="<< gammaQt
                      << "alpha=" << gammaAlpha
                      << "psipair=" << gammaPsiPair
+                     << "cosPoint=" << gammaCosPointing
+                     << "conversionPoint=" << &conversionPoint
                      << "daugtherProp.=" << &daughterProp
                      << "\n";
       }
    }
 }
 
+//_____________________________________________________________________________________________________
+void AliAnalysisTaskConversionQA::ProcessQA(AliAODConversionPhoton *gamma){
+
+
+   // Fill Histograms for QA and MC
+   hGammaPt->Fill(gamma->GetPhotonPt());
+   hGammaPhi->Fill(gamma->GetPhotonPhi());
+   hGammaEta->Fill(gamma->Eta());
+   hGammaChi2perNDF->Fill(gamma->GetChi2perNDF());
+   hGammaPsiPair->Fill(gamma->GetPsiPair());
+   hGammaQt->Fill(gamma->GetArmenterosQt());
+   hGammaCosinePointingAngle->Fill(fConversionCuts->GetCosineOfPointingAngle(gamma,fInputEvent));
+   hGammaXY->Fill(gamma->GetConversionX(),gamma->GetConversionY());
+   hGammaZR->Fill(gamma->GetConversionZ(),gamma->GetConversionRadius());
+
+   AliESDtrack * negTrack = fConversionCuts->GetESDTrack((AliESDEvent*)fInputEvent, gamma->GetTrackLabelNegative());
+   AliESDtrack * posTrack = fConversionCuts->GetESDTrack((AliESDEvent*)fInputEvent, gamma->GetTrackLabelPositive());
+   if(!negTrack||!posTrack)return;
+
+   Double_t negtrackPhi = negTrack->Phi();
+   Double_t postrackPhi = posTrack->Phi();
+   hITSClusterPhi->Fill(negtrackPhi,6);
+   hITSClusterPhi->Fill(postrackPhi,6);
+   for(Int_t itsLayer = 0; itsLayer<6;itsLayer++){
+      if(TESTBIT(negTrack->GetITSClusterMap(),itsLayer)){
+         hITSClusterPhi->Fill(negtrackPhi,itsLayer);
+      }
+      if(TESTBIT(posTrack->GetITSClusterMap(),itsLayer)){
+         hITSClusterPhi->Fill(postrackPhi,itsLayer);
+      }
+   }
+
+   hElecPt->Fill(negTrack->Pt(),posTrack->Pt());
+   hElecEta->Fill(negTrack->Eta(),posTrack->Eta());
+   hElecPhi->Fill(negTrack->Phi(),posTrack->Phi());
+
+   hElecNfindableClsTPC->Fill((Float_t)posTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius())));
+   hPosiNfindableClsTPC->Fill((Float_t)negTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius())));
+
+   // hElecNfindableClsTPC->Fill((Float_t)negTrack->GetNcls(1)/(Float_t)negTrack->GetTPCNclsF());
+   // hPosiNfindableClsTPC->Fill((Float_t)posTrack->GetNcls(1)/(Float_t)posTrack->GetTPCNclsF());
+
+   if(fMCEvent) ProcessTrueQA(gamma,negTrack,posTrack);
+}
 
 //________________________________________________________________________
-void AliAnalysisTaskConversionQA::Terminate(Option_t *)
+void AliAnalysisTaskConversionQA::ProcessTrueQA(AliAODConversionPhoton *TruePhotonCandidate, AliESDtrack *elec, AliESDtrack *posi)
 {
-   if (fStreamQA){
-      fStreamQA->GetFile()->Write();
+
+   if(!IsTruePhoton(TruePhotonCandidate)) return;
+
+   TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(fMCStack);
+   TParticle *mcPhoton = TruePhotonCandidate->GetMCParticle(fMCStack);
+
+   // True Photon
+   hTrueResoulutionR->Fill(TruePhotonCandidate->GetConversionRadius(),
+                           TruePhotonCandidate->GetConversionRadius()-negDaughter->R());
+   hTrueResoulutionZ->Fill(TruePhotonCandidate->GetConversionZ(),
+                           TruePhotonCandidate->GetConversionZ()-negDaughter->Vz());
+   hTrueResoulutionPhi->Fill(TruePhotonCandidate->Phi(),
+                             TruePhotonCandidate->Phi()-mcPhoton->Phi());
+   hTrueGammaPt->Fill(TruePhotonCandidate->Pt());
+   hTrueGammaPhi->Fill(TruePhotonCandidate->Phi());
+   hTrueGammaEta->Fill(TruePhotonCandidate->Eta());
+   hTrueGammaMass->Fill(TruePhotonCandidate->GetMass());
+   hTrueGammaChi2perNDF->Fill(TruePhotonCandidate->GetChi2perNDF());
+   hTrueGammaPsiPair->Fill(TruePhotonCandidate->GetPsiPair());
+   hTrueGammaQt->Fill(TruePhotonCandidate->GetArmenterosQt());
+   hTrueGammaCosinePointingAngle->Fill(fConversionCuts->GetCosineOfPointingAngle(TruePhotonCandidate,fInputEvent));
+   hTrueGammaXY->Fill(TruePhotonCandidate->GetConversionX(),TruePhotonCandidate->GetConversionY());
+   hTrueGammaZR->Fill(TruePhotonCandidate->GetConversionZ(),TruePhotonCandidate->GetConversionRadius());
+
+   hTrueElecPt->Fill(elec->Pt(),posi->Pt());
+   hTrueElecEta->Fill(elec->Eta(),posi->Eta());
+   hTrueElecPhi->Fill(elec->Phi(),posi->Phi());
+   hTrueElecNfindableClsTPC
+      ->Fill((Float_t)elec->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(TruePhotonCandidate->GetConversionRadius())));
+   hTruePosiNfindableClsTPC
+      ->Fill((Float_t)posi->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(TruePhotonCandidate->GetConversionRadius())));
+   // hTrueElecNfindableClsTPC->Fill((Float_t)elec->GetNcls(1)/(Float_t)elec->GetTPCNclsF());
+   // hTruePosiNfindableClsTPC->Fill((Float_t)posi->GetNcls(1)/(Float_t)posi->GetTPCNclsF());
+
+}
+//________________________________________________________________________
+void AliAnalysisTaskConversionQA::CountESDTracks(){
+
+   // Using standard function for setting Cuts
+   Bool_t selectPrimaries=kTRUE;
+   AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
+   EsdTrackCuts->SetMaxDCAToVertexZ(2);
+   EsdTrackCuts->SetEtaRange(-0.8, 0.8);
+   EsdTrackCuts->SetPtRange(0.15);
+
+   fNumberOfESDTracks = 0;
+   for(Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
+      AliESDtrack* curTrack = (AliESDtrack*)fInputEvent->GetTrack(iTracks);
+      if(!curTrack) continue;
+      // if(fMCEvent && fConversionCuts->GetSignalRejection() != 0){
+      //    if(!fConversionCuts->IsParticleFromBGEvent(abs(curTrack->GetLabel()), fMCStack)) continue;
+      // }
+      if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
    }
+   delete EsdTrackCuts;
+   EsdTrackCuts=0x0;
+
+   return;
+}
+//________________________________________________________________________
+Bool_t AliAnalysisTaskConversionQA::IsTruePhoton(AliAODConversionPhoton *TruePhotonCandidate)
+{
+   TParticle *posDaughter = TruePhotonCandidate->GetPositiveMCDaughter(fMCStack);
+   TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(fMCStack);
+
+   if(posDaughter == NULL || negDaughter == NULL) return kFALSE; // One particle does not exist
+   Int_t pdgCode[2] = {abs(posDaughter->GetPdgCode()),abs(negDaughter->GetPdgCode())};
+   if(posDaughter->GetMother(0) != negDaughter->GetMother(0)) return kFALSE;
+   else if(posDaughter->GetMother(0) == -1) return kFALSE;
+
+   if(pdgCode[0]!=11 || pdgCode[1]!=11) return kFALSE; //One Particle is not electron
+   if(posDaughter->GetPdgCode()==negDaughter->GetPdgCode()) return kFALSE; // Same Charge
+   if(posDaughter->GetUniqueID() != 5 || negDaughter->GetUniqueID() !=5) return kFALSE;// check if the daughters come from a conversion
+
+   TParticle *Photon = TruePhotonCandidate->GetMCParticle(fMCStack);
+   if(Photon->GetPdgCode() != 22) return kFALSE; // Mother is no Photon
+
+   return kTRUE;
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskConversionQA::Terminate(Option_t *)
+{
+
 }