24 #include "AliAnalysisManager.h"
25 #include "TParticle.h"
27 #include "AliPIDResponse.h"
29 #include "AliESDtrackCuts.h"
30 #include "AliAODMCParticle.h"
31 #include "AliAODMCHeader.h"
32 #include "AliAODEvent.h"
43 fV0ReaderName("V0ReaderV1"),
44 fConversionGammas(NULL),
45 fConversionCuts(NULL),
48 fNumberOfESDTracks(0),
53 ffillHistograms(kFALSE),
58 hNGoodESDTracks(NULL),
60 hNContributorsVertex(NULL),
67 hGammaChi2perNDF(NULL),
69 hGammaArmenteros(NULL),
70 hGammaCosinePointingAngle(NULL),
75 hElecNfindableClsTPC(NULL),
76 hPosiNfindableClsTPC(NULL),
80 hElectronITSdEdxP(NULL),
82 hElectronNSigmadEdxP(NULL),
83 hElectronNSigmadEdxEta(NULL),
84 hElectronNSigmaPiondEdxP(NULL),
85 hElectronNSigmaITSP(NULL),
86 hElectronNSigmaTOFP(NULL),
88 hPositronITSdEdxP(NULL),
90 hPositronNSigmadEdxP(NULL),
91 hPositronNSigmadEdxEta(NULL),
92 hPositronNSigmaPiondEdxP(NULL),
93 hPositronNSigmaITSP(NULL),
94 hPositronNSigmaTOFP(NULL),
125 fnGammaCandidates(1),
134 fV0ReaderName(
"V0ReaderV1"),
135 fConversionGammas(NULL),
136 fConversionCuts(NULL),
139 fNumberOfESDTracks(0),
144 ffillHistograms(kFALSE),
149 hNGoodESDTracks(NULL),
151 hNContributorsVertex(NULL),
152 hITSClusterPhi(NULL),
158 hGammaChi2perNDF(NULL),
160 hGammaArmenteros(NULL),
161 hGammaCosinePointingAngle(NULL),
166 hElecNfindableClsTPC(NULL),
167 hPosiNfindableClsTPC(NULL),
170 hElectrondEdxP(NULL),
171 hElectronITSdEdxP(NULL),
173 hElectronNSigmadEdxP(NULL),
174 hElectronNSigmadEdxEta(NULL),
175 hElectronNSigmaPiondEdxP(NULL),
176 hElectronNSigmaITSP(NULL),
177 hElectronNSigmaTOFP(NULL),
178 hPositrondEdxP(NULL),
179 hPositronITSdEdxP(NULL),
181 hPositronNSigmadEdxP(NULL),
182 hPositronNSigmadEdxEta(NULL),
183 hPositronNSigmaPiondEdxP(NULL),
184 hPositronNSigmaITSP(NULL),
185 hPositronNSigmaTOFP(NULL),
218 fnGammaCandidates(1),
224 DefineInput(0, TChain::Class());
225 DefineOutput(1, TList::Class());
254 hVertexZ =
new TH1F(
"Vertex_Z",
"Vertex_Z",300,-15,15);
262 else hNV0Tracks =
new TH1I(
"V0 Multiplicity",
"V0 Multiplicity",2000,0,2000);
267 hGammaPt =
new TH1F(
"Gamma_Pt",
"Gamma_Pt",250,0,25);
269 hGammaPhi =
new TH1F(
"Gamma_Phi",
"Gamma_Phi",360,0,2*TMath::Pi());
271 hGammaPhi_Pos =
new TH1F(
"GammaPhi_EtaPos",
"GammaPhi_EtaPos",360,0,2*TMath::Pi());
273 hGammaPhi_Neg =
new TH1F(
"GammaPhi_EtaNeg",
"GammaPhi_EtaNeg",360,0,2*TMath::Pi());
276 hGammaEta =
new TH1F(
"Gamma_Eta",
"Gamma_Eta",600,-1.5,1.5);
278 hGammaChi2perNDF =
new TH1F(
"Gamma_Chi2perNDF",
"Gamma_Chi2perNDF",500,0,100);
280 hGammaPsiPair =
new TH1F(
"Gamma_PsiPair",
"Gamma_PsiPair",500,0,2);
289 hElecPt =
new TH2F(
"Electron_Positron_Pt",
"Electron_Positron_Pt",250,0,25,250,0,25);
291 hElecEta =
new TH2F(
"Electron_Positron_Eta",
"Electron_Positron_Eta",600,-1.5,1.5,600,-1.5,1.5);
293 hElecPhi =
new TH2F(
"Electron_Positron_Phi",
"Electron_Positron_Phi",360,0,2*TMath::Pi(),360,0,2*TMath::Pi());
295 hElecClsTPC =
new TH1F(
"Electron_ClusterTPC",
"Electron_ClusterTPC",200,0,200);
297 hPosiClsTPC =
new TH1F(
"Positron_ClusterTPC",
"Positron_ClusterTPC",200,0,200);
300 hElecNfindableClsTPC =
new TH1F(
"Electron_findableClusterTPC",
"Electron_findableClusterTPC",100,0,1);
302 hPosiNfindableClsTPC =
new TH1F(
"Positron_findableClusterTPC",
"Positron_findableClusterTPC",100,0,1);
305 hElectrondEdxP =
new TH2F(
"Electron_dEdx_P",
"Electron_dEdx_P",100, 0.05, 20, 200, 0, 200);
308 hPositrondEdxP =
new TH2F(
"Positron_dEdx_P",
"Positron_dEdx_P",100, 0.05, 20, 200, 0, 200);
328 hElectronTOFP =
new TH2F(
"Electron_TOF_P",
"Electron_TOF_P",100, 0.05, 20, 600, -1000, 29000);
331 hPositronTOFP =
new TH2F(
"Positron_TOF_P",
"Positron_TOF_P",100, 0.05, 20, 600, -1000, 29000);
354 hInvMassPair =
new TH2F(
"Gamma_InvMassPair_Pt",
"Gamma invariant mass vs Pt",200,0,0.2,250,0,25);
467 printf(
" Gamma Conversion QA Task %s :: Eta Shift Manually Set to %f \n\n",
478 if(eventQuality != 0){
484 Int_t eventNotAccepted =
486 if(eventNotAccepted)
return;
521 if (gamma==NULL)
continue;
549 AliVEvent*
event = (AliVEvent*) InputEvent();
574 if(!negTrack||!posTrack)
return;
590 fDaughterProp(3) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kElectron);
591 fDaughterProp(22) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kPion);
593 fDaughterProp(10) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kElectron);
594 fDaughterProp(23) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kPion);
595 Int_t nPosClusterITS = 0;
596 Int_t nNegClusterITS = 0;
597 for(
Int_t itsLayer = 0; itsLayer<6;itsLayer++){
598 if(TESTBIT(negTrack->GetITSClusterMap(),itsLayer)){
601 if(TESTBIT(posTrack->GetITSClusterMap(),itsLayer)){
609 if (nPosClusterITS > 0 ){
611 fDaughterProp(20) = pidResonse->NumberOfSigmasITS(posTrack,AliPID::kElectron);
616 if (nNegClusterITS > 0 ){
618 fDaughterProp(21) = pidResonse->NumberOfSigmasITS(negTrack,AliPID::kElectron);
625 if((posTrack->GetStatus() & AliESDtrack::kTOFpid) && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
626 Double_t t0pos = pidResonse->GetTOFResponse().GetStartTime(posTrack->P());
628 posTrack->GetIntegratedTimes(timesPos,9);
629 Double_t TOFsignalPos = posTrack->GetTOFsignal();
630 Double_t dTpos = TOFsignalPos - t0pos - timesPos[0];
632 fDaughterProp(5) = pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron);
637 if((negTrack->GetStatus() & AliESDtrack::kTOFpid) && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
638 Double_t t0neg = pidResonse->GetTOFResponse().GetStartTime(negTrack->P());
640 negTrack->GetIntegratedTimes(timesNeg,9);
641 Double_t TOFsignalNeg = negTrack->GetTOFsignal();
642 Double_t dTneg = TOFsignalNeg - t0neg - timesNeg[0];
644 fDaughterProp(12) = pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron);
683 if(!negTrack||!posTrack)
return;
686 hElecPt->Fill(negTrack->Pt(),posTrack->Pt());
687 hElecEta->Fill(negTrack->Eta(),posTrack->Eta());
688 hElecPhi->Fill(negTrack->Phi(),posTrack->Phi());
696 hElectronNSigmadEdxP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kElectron));
697 hElectronNSigmadEdxEta->Fill(negTrack->Eta() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kElectron));
700 hPositronNSigmadEdxP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kElectron));
701 hPositronNSigmadEdxEta->Fill(posTrack->Eta() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kElectron));
705 if((negTrack->GetStatus() & AliESDtrack::kTOFpid)==0 && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
706 Double_t t0neg = pidResonse->GetTOFResponse().GetStartTime(negTrack->P());
708 negTrack->GetIntegratedTimes(timesNeg,9);
709 Double_t TOFsignalNeg = negTrack->GetTOFsignal();
710 Double_t dTneg = TOFsignalNeg - t0neg - timesNeg[0];
712 hElectronNSigmaTOFP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron));
714 if((posTrack->GetStatus() & AliESDtrack::kTOFpid)==0 && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
715 Double_t t0pos = pidResonse->GetTOFResponse().GetStartTime(posTrack->P());
717 posTrack->GetIntegratedTimes(timesPos,9);
718 Double_t TOFsignalPos = posTrack->GetTOFsignal();
719 Double_t dTpos = TOFsignalPos - t0pos - timesPos[0];
721 hPositronNSigmaTOFP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron));
724 Int_t nPosClusterITS = 0;
725 Int_t nNegClusterITS = 0;
726 for(
Int_t itsLayer = 0; itsLayer<6;itsLayer++){
727 if(TESTBIT(negTrack->GetITSClusterMap(),itsLayer)){
730 if(TESTBIT(posTrack->GetITSClusterMap(),itsLayer)){
734 Double_t negtrackPhi = negTrack->Phi();
735 Double_t postrackPhi = posTrack->Phi();
740 if (nPosClusterITS > 0 ){
742 hPositronNSigmaITSP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasITS(posTrack,AliPID::kElectron));
744 if (nNegClusterITS > 0 ){
746 hElectronNSigmaITSP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasITS(negTrack,AliPID::kElectron));
758 Bool_t selectPrimaries=kTRUE;
759 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
760 EsdTrackCuts->SetMaxDCAToVertexZ(2);
761 EsdTrackCuts->SetEtaRange(-0.8, 0.8);
762 EsdTrackCuts->SetPtRange(0.15);
764 for(
Int_t iTracks = 0; iTracks <
fInputEvent->GetNumberOfTracks(); iTracks++){
765 AliESDtrack* curTrack = (AliESDtrack*)
fInputEvent->GetTrack(iTracks);
766 if(!curTrack)
continue;
774 for(
Int_t iTracks = 0; iTracks<
fInputEvent->GetNumberOfTracks(); iTracks++){
775 AliAODTrack* curTrack = (AliAODTrack*)
fInputEvent->GetTrack(iTracks);
776 if(curTrack->GetID()<0)
continue;
777 if(!curTrack->IsHybridGlobalConstrainedGlobal())
continue;
778 if(TMath::Abs(curTrack->Eta())>0.8)
continue;
779 if(curTrack->Pt()<0.15)
continue;
791 Int_t pdgCodePos = 0;
792 Int_t pdgCodeNeg = 0;
795 const AliVVertex* primVtxMC =
fMCEvent->GetPrimaryVertex();
796 Double_t mcProdVtxX = primVtxMC->GetX();
797 Double_t mcProdVtxY = primVtxMC->GetY();
798 Double_t mcProdVtxZ = primVtxMC->GetZ();
801 if(posDaughter == NULL || negDaughter == NULL) {
805 }
else if( posDaughter->GetMother(0) != negDaughter->GetMother(0) || (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)) {
808 pdgCodePos=TMath::Abs(posDaughter->GetPdgCode());
809 pdgCodeNeg=TMath::Abs(negDaughter->GetPdgCode());
810 if(pdgCodePos==11 && pdgCodeNeg==11)
return 10;
811 if(pdgCodePos==11 && pdgCodeNeg==11 &&
812 (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1))
return 15;
814 if(pdgCodePos==211 && pdgCodeNeg==211) kind = 11;
815 if((pdgCodePos==211 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==211)) kind = 12;
816 if((pdgCodePos==11 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==11)) kind = 16;
817 if((pdgCodePos==11 && pdgCodeNeg==321) ||(pdgCodePos==321 && pdgCodeNeg==11)) kind = 17;
818 if((pdgCodePos==211 && pdgCodeNeg==321) ||(pdgCodePos==321 && pdgCodeNeg==211)) kind = 18;
819 if((pdgCodePos==211 && pdgCodeNeg==11) ||(pdgCodePos==11 && pdgCodeNeg==211)) kind = 13;
820 if(pdgCodePos==321 && pdgCodeNeg==321) kind = 14;
822 pdgCodePos=posDaughter->GetPdgCode();
823 pdgCodeNeg=negDaughter->GetPdgCode();
827 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11)
return 2;
828 else if ( !(pdgCodeNeg==pdgCodePos)){
829 if(pdgCode == 111)
return 3;
830 else if (pdgCode == 221)
return 4;
831 else if (!(negDaughter->GetUniqueID() != 5 || posDaughter->GetUniqueID() !=5)){
832 if(pdgCode == 22 && gammaIsPrimary){
834 }
else if (pdgCode == 22){
849 TClonesArray *AODMCTrackArray =
dynamic_cast<TClonesArray*
>(
fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
850 if (AODMCTrackArray!=NULL && TruePhotonCandidate!=NULL){
851 AliAODMCParticle *posDaughter = (AliAODMCParticle*) AODMCTrackArray->At(TruePhotonCandidate->
GetMCLabelPositive());
852 AliAODMCParticle *negDaughter = (AliAODMCParticle*) AODMCTrackArray->At(TruePhotonCandidate->
GetMCLabelNegative());
853 Int_t pdgCodePos = 0;
854 Int_t pdgCodeNeg = 0;
856 if(posDaughter == NULL || negDaughter == NULL) {
858 }
else if( posDaughter->GetMother() != negDaughter->GetMother() || (posDaughter->GetMother() == negDaughter->GetMother() && posDaughter->GetMother() ==-1)) {
860 pdgCodePos=TMath::Abs(posDaughter->GetPdgCode());
861 pdgCodeNeg=TMath::Abs(negDaughter->GetPdgCode());
862 if(pdgCodePos==11 && pdgCodeNeg==11) kind = 10;
863 if(pdgCodePos==11 && pdgCodeNeg==11 &&
864 (posDaughter->GetMother() == negDaughter->GetMother() && posDaughter->GetMother() ==-1))kind = 15;
866 if(pdgCodePos==211 && pdgCodeNeg==211) kind = 11;
867 if((pdgCodePos==211 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==211)) kind = 12;
868 if((pdgCodePos==11 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==11)) kind = 16;
869 if((pdgCodePos==11 && pdgCodeNeg==321) ||(pdgCodePos==321 && pdgCodeNeg==11)) kind = 17;
870 if((pdgCodePos==211 && pdgCodeNeg==321) ||(pdgCodePos==321 && pdgCodeNeg==211)) kind = 18;
871 if((pdgCodePos==211 && pdgCodeNeg==11) ||(pdgCodePos==11 && pdgCodeNeg==211)) kind = 13;
872 if(pdgCodePos==321 && pdgCodeNeg==321) kind = 14;
874 AliAODMCParticle *Photon = (AliAODMCParticle*) AODMCTrackArray->At(posDaughter->GetMother());
875 pdgCodePos=posDaughter->GetPdgCode();
876 pdgCodeNeg=negDaughter->GetPdgCode();
878 if ( Photon->GetPdgCode())
879 pdgCode = Photon->GetPdgCode();
880 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11) kind = 2;
881 else if ( !(pdgCodeNeg==pdgCodePos)){
882 if(pdgCode == 111) kind = 3;
883 else if (pdgCode == 221) kind = 4;
884 else if (!(negDaughter->GetMCProcessCode() != 5 || posDaughter->GetMCProcessCode() !=5)){
885 const AliVVertex* primVtxMC =
fMCEvent->GetPrimaryVertex();
886 Double_t mcProdVtxX = primVtxMC->GetX();
887 Double_t mcProdVtxY = primVtxMC->GetY();
888 Double_t mcProdVtxZ = primVtxMC->GetZ();
891 if(pdgCode == 22 && isPrimary){
893 }
else if (pdgCode == 22){
919 if(!PhotonCandidate)
continue;
929 Bool_t AODLabelPos = kFALSE;
930 Bool_t AODLabelNeg = kFALSE;
933 AliAODTrack *tempDaughter =
static_cast<AliAODTrack*
>(
fInputEvent->GetTrack(i));
946 if(AODLabelNeg && AODLabelPos){
950 if(!AODLabelPos || !AODLabelNeg){
952 AliAODTrack *tempDaughter =
static_cast<AliAODTrack*
>(
fInputEvent->GetTrack(i));
953 if(tempDaughter->GetID()<0){
967 if(AODLabelNeg && AODLabelPos){
971 if(!AODLabelPos || !AODLabelNeg){
972 cout<<
"WARNING!!! AOD TRACKS NOT FOUND FOR"<<endl;
992 TAxis *axisafter = histoRebin->GetXaxis();
993 Int_t bins = axisafter->GetNbins();
994 Double_t from = axisafter->GetXmin();
998 Double_t factor = TMath::Power(to/from, 1./bins);
999 for(
Int_t i=1; i<=bins; ++i) newbins[i] = factor * newbins[i-1];
1000 axisafter->Set(bins, newbins);
TParticle * GetMCParticle(AliMCEvent *mcEvent)
void SetPeriodEnum(TString periodName)
virtual Double_t GetPhotonPhi() const
Int_t GetMCLabelPositive() const
TH2F * hPositronNSigmadEdxEta
void SetLogBinningXTH2(TH2 *histoRebin)
TH2F * hPositronNSigmaTOFP
Double_t GetArmenterosAlpha() const
Int_t GetSignalRejection()
Int_t GetFirstTPCRow(Double_t radius)
TH2F * hPositronNSigmaITSP
void SetMCLabelNegative(Int_t label)
TH2F * hPositronNSigmadEdxP
Bool_t AreAODsRelabeled()
PeriodVar GetPeriodEnum()
void SetPeriodEnumExplicit(PeriodVar periodEnum)
void DoEtaShift(Bool_t doEtaShift)
Float_t GetPsiPair() const
Double_t GetConversionZ() const
TH2F * hElectronNSigmadEdxEta
TH2F * hElectronNSigmaITSP
TParticle * GetPositiveMCDaughter(AliMCEvent *mcEvent)
Int_t GetNumberOfContributorsVtx(AliVEvent *event)
TH2F * hElectronNSigmaTOFP
TH2F * hPositronNSigmaPiondEdxP
TH1F * hElecNfindableClsTPC
TH1F * hPosiNfindableClsTPC
Bool_t GetProduceV0FindingEfficiency()
TParticle * GetNegativeMCDaughter(AliMCEvent *mcEvent)
AliConversionPhotonCuts * fConversionCuts
Float_t GetChi2perNDF() const
void GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *event)
Double_t GetArmenterosQt() const
TClonesArray * fConversionGammas
Int_t IsEventAcceptedByCut(AliConvEventCuts *ReaderCuts, AliVEvent *event, AliMCEvent *mcEvent, Int_t isHeavyIon, Bool_t isEMCALAnalysis)
virtual void UserExec(Option_t *option)
TVectorF fGammaPhotonProp
void SetMCLabelPositive(Int_t label)
Int_t GetTrackLabelNegative() const
AliV0ReaderV1 * fV0Reader
Bool_t IsConversionPrimaryESD(AliMCEvent *mcEvent, Long_t eventpos, Double_t prodVtxX, Double_t prodVtxY, Double_t prodVtxZ)
Int_t GetTrackLabelPositive() const
UInt_t IsTruePhotonESD(AliAODConversionPhoton *TruePhotonCandidate)
void RelabelAODPhotonCandidates(Bool_t mode)
AliConversionPhotonCuts * GetConversionCuts()
TH1I * hNContributorsVertex
Class handling all kinds of selection cuts for Gamma Conversion analysis.
virtual ~AliAnalysisTaskConversionQA()
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
TH1F * hGammaCosinePointingAngle
void GetCorrectEtaShiftFromPeriod()
Int_t GetMCLabelNegative() const
Double_t GetConversionY() const
UInt_t IsTruePhotonAOD(AliAODConversionPhoton *TruePhotonCandidate)
AliAnalysisTaskConversionQA()
AliConvEventCuts * fEventCuts
void SetLabelPositive(Int_t label)
Track labels.
void SetLabelNegative(Int_t label)
TClonesArray * GetReconstructedGammas() const
AliVTrack * GetTrack(AliVEvent *event, Int_t label)
virtual Double_t GetPhotonPt() const
TList * GetAcceptedHeader()
Class handling all kinds of selection cuts for Gamma Conversion analysis.
virtual void Terminate(Option_t *)
AliConvEventCuts * GetEventCuts()
void ProcessQATree(AliAODConversionPhoton *gamma)
Bool_t IsConversionPrimaryAOD(AliVEvent *event, AliAODMCParticle *AODMCParticle, Double_t prodVtxX, Double_t prodVtxY, Double_t prodVtxZ)
void ProcessQA(AliAODConversionPhoton *gamma)
Int_t IsParticleFromBGEvent(Int_t index, AliMCEvent *mcEvent, AliVEvent *event=0x0)
Cut functions.
virtual void UserCreateOutputObjects()
TH2F * hElectronNSigmadEdxP
Double_t GetCosineOfPointingAngle(const AliConversionPhotonBase *photon, AliVEvent *event) const
Double_t GetConversionRadius() const
void RelabelAODs(Bool_t relabel=kTRUE)
Double_t GetConversionX() const
Bool_t PhotonIsSelected(AliConversionPhotonBase *photon, AliVEvent *event)
TList * GetV0FindingEfficiencyHistograms()
TList * GetCutHistograms()
TH2F * hElectronNSigmaPiondEdxP