--- /dev/null
+#include "TCanvas.h"
+#include "TVector3.h"
+#include "TLorentzVector.h"
+#include "TMath.h"
+#include "TF1.h"
+#include "TH1.h"
+#include "TH2.h"
+#include "TH3.h"
+#include "TList.h"
+#include "TParticle.h"
+
+#include "AliVParticle.h"
+#include "AliESDEvent.h"
+#include "AliESDkink.h"
+#include "AliESDpid.h"
+#include "AliPID.h"
+#include "AliStack.h"
+
+#include "AliAnalysisTask.h"
+#include "AliInputEventHandler.h"
+#include "AliESDInputHandler.h"
+#include "AliPIDResponse.h"
+#include "AliAnalysisManager.h"
+#include "AliESDtrackCuts.h"
+
+#include "AliAnalysisPionKinksESD.h"
+
+ClassImp(AliAnalysisPionKinksESD)
+
+//________________________________________________________________________
+AliAnalysisPionKinksESD::AliAnalysisPionKinksESD(const char *name)
+:AliAnalysisTaskSE(name),
+fMaxKinkAngKmu(0),
+fMaxKinkAngPimu(0), //functions
+
+hMult(0),
+hAcceptedMult(0),
+hMultPS(0),
+hvtx(0),
+hvtxy(0),
+hvtyz(0),
+hvtxz(0),
+hMultPSV(0),
+hPtAll(0),
+hEtaAll(0),
+hTrackPos(0),
+hTrackPosxy(0),
+hTrackPosyz(0),
+hTrackPosxz(0),
+//hTPCchi2clusters(0),
+//hdcaToVertexXY(0),
+//hdcaToVertexZ(0),
+hMultPrim(0),
+hPtPrim(0),
+hEtaPrim(0),
+hPrimTrackPos(0),
+hPrimTrackPosxy(0),
+hPrimTrackPosyz(0),
+hPrimTrackPosxz(0),
+hPt(0),
+hEta(0),
+//hRapidity(0),
+hPtKink(0),
+hEtaKink(0),
+hRapidityKink(0),
+hPmP(0),
+hKinkPosRTPCclusters1(0),
+hKinkPosRTPCclusters2(0),
+hQt(0),
+hKinkAngle(0),
+hDCAkink(0),
+hPmKinkAng(0),
+hKinkPosXY(0),
+hKinkPosZY(0),
+hKinkPosZR(0),
+hKinkPosR(0),
+hKinkPosZ(0),
+hPmd(0),
+hMinvPimu(0),
+hdEdx(0),
+hPtPosRSelected(0),
+hPtZSelected(0),
+hPtAngSelected(0),
+hPtPmSelected(0),
+hPtGoodKink(0),
+hEtaGoodKink(0),
+hRapidityGoodKink(0),
+hQtGoodKink(0),
+hPmGoodKinkAng(0),
+hPmdGoodKink(0),
+hdEdxGoodKink(0),
+hPtQtSelected(0),
+hPtMaxAngSelected(0),
+hPtRTPCclustersSelected(0),
+hRTPCclustersRTPCclustersSelected(0),
+hPtSelected(0),
+hEtaSelected(0),
+hRapiditySelected(0),
+hQtSelected(0),
+hKinkAngleSelected(0),
+hDCAkinkSelected(0),
+hPmKinkAngSelected(0),
+hKinkPosXYSelected(0),
+hKinkPosZRSelected(0),
+hKinkPosRSelected(0),
+hPmdSelected(0),
+hMinvPimuSelected(0),
+hdEdxSelected(0),
+hPtPiSelected(0),
+hEtaPiSelected(0),
+hRapidityPiSelected(0),
+hQtPiSelected(0),
+hKinkAnglePiSelected(0),
+hDCAkinkPiSelected(0),
+hPmKinkAngPiSelected(0),
+hKinkPosRTPCclusters1PiSelected(0),
+hKinkPosRTPCclusters2PiSelected(0),
+hKinkPosXYPiSelected(0),
+hKinkPosZRPiSelected(0),
+hKinkPosRPiSelected(0),
+hKinkPosZPiSelected(0),
+hPmPPiSelected(0),
+hPmdPiSelected(0),
+hMinvPimuPiSelected(0),
+hdEdxPiSelected(0),
+hPtPiSelectedPlus(0),
+hEtaPiSelectedPlus(0),
+hRapidityPiSelectedPlus(0),
+hQtPiSelectedPlus(0),
+hKinkAnglePiSelectedPlus(0),
+hDCAkinkPiSelectedPlus(0),
+hPmKinkAngPiSelectedPlus(0),
+hKinkPosXYPiSelectedPlus(0),
+hKinkPosZRPiSelectedPlus(0),
+hPmdPiSelectedPlus(0),
+hMinvPimuPiSelectedPlus(0),
+hdEdxPiSelectedPlus(0),
+hPtPiSelectedMinus(0),
+hEtaPiSelectedMinus(0),
+hRapidityPiSelectedMinus(0),
+hQtPiSelectedMinus(0),
+hKinkAnglePiSelectedMinus(0),
+hDCAkinkPiSelectedMinus(0),
+hPmKinkAngPiSelectedMinus(0),
+hKinkPosXYPiSelectedMinus(0),
+hKinkPosZRPiSelectedMinus(0),
+hPmdPiSelectedMinus(0),
+hMinvPimuPiSelectedMinus(0),
+hdEdxPiSelectedMinus(0), // reconstruction histograms
+fListOfHistos(0),
+fLowMulcut(-1), fUpMulcut(-1),
+cLowPt(0), cRapidityLim(0),
+cLowR(0), cUpR(0),
+cLowZ(0), cUpZ(0),
+cLowKinkAngle(0),
+cLowQt(0), cUpQt(0),
+cLowInvMass(0), cUpInvMass(0),
+cSigmaCut(0),
+cPdgKaon(321), cPdgPion(211), cPdgMuon(13), cPdgElectron(11),
+cKaonMass(0), cPionMass(0), cMuonMass(0), cElectronMass(0),
+nBinsMult(0), hLowMult(0), hUpMult(0),
+nBinsPt(0), hLowPt(0), hUpPt(0),
+nBinsEta(0), hLowEta(0), hUpEta(0),
+nBinsQt(0), hLowQt(0), hUpQt(0),
+nBinsR(0), hLowR(0), hUpR(0),
+nBinsZ(0), hLowZ(0), hUpZ(0),
+nBinsXY(0), hLowXY(0), hUpXY(0),
+nBinsAngle(0), hLowAngle(0), hUpAngle(0),
+nBinsZV(0), hLowZV(0), hUpZV(0),
+nBinsXYV(0), hLowXYV(0), hUpXYV(0),
+nBinsInvMass(0), hLowInvMass(0), hUpInvMass(0),
+nBinsdEdx(0), hLowdEdx(0), hUpdEdx(0), fPIDResponse(0),
+fMaxDCAtoVtxCut(0), fTrackCuts(0)
+
+{
+//Multiplicity bins
+fMaxDCAtoVtxCut=new AliESDtrackCuts("fMaxDCAtoVtxCut","fMaxDCAtoVtxCut");
+fMaxDCAtoVtxCut->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
+fMaxDCAtoVtxCut->SetMaxChi2TPCConstrainedGlobal(36);
+
+fTrackCuts = new AliESDtrackCuts("Multiplicity bins","Multiplicity bins");
+fTrackCuts->SetMinNClustersTPC(70);
+fTrackCuts->SetMaxChi2PerClusterTPC(4);
+fTrackCuts->SetAcceptKinkDaughters(kFALSE);
+fTrackCuts->SetRequireTPCRefit(kTRUE);
+fTrackCuts->SetRequireITSRefit(kTRUE);
+fTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
+fTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
+fTrackCuts->SetMaxDCAToVertexZ(2);
+fTrackCuts->SetDCAToVertex2D(kFALSE);
+fTrackCuts->SetRequireSigmaToVertex(kFALSE);
+fTrackCuts->SetEtaRange(-0.8,+0.8);
+fTrackCuts->SetPtRange(0.15, 1e10);
+
+//DefineOutput(0, TList::Class());
+DefineOutput(1, TList::Class());
+}
+
+//________________________________________________________________________
+void AliAnalysisPionKinksESD::UserCreateOutputObjects() {
+fListOfHistos=new TList();
+
+//maximum kink angle for kaons to muons
+fMaxKinkAngKmu=new TF1("fMaxKinkAngKmu","((atan([0]*[1]*(1.0/(sqrt((x^2)*(1.0-([1]^2))-([0]^2)*([1]^2))))))*180.)/[2]",1.1,10.0);
+fMaxKinkAngKmu->SetParameter(0,cKaonMass);
+fMaxKinkAngKmu->SetParameter(1,0.9127037);
+fMaxKinkAngKmu->SetParameter(2,TMath::Pi());
+
+//maximum kink angle for pions to muons
+fMaxKinkAngPimu=new TF1("fMaxKinkAngPimu","((atan([0]*[1]*(1.0/(sqrt((x^2)*(1.0-([1]^2))-([0]^2)*([1]^2))))))*180.)/[2]",0.1,10.0);
+fMaxKinkAngPimu->SetParameter(0,cPionMass);
+fMaxKinkAngPimu->SetParameter(1,0.2731374);
+fMaxKinkAngPimu->SetParameter(2,TMath::Pi());
+
+//Create histograms
+TH1::SetDefaultSumw2();
+TH2::SetDefaultSumw2();
+
+
+//Reconstruction histograms
+hMult = new TH1F("hMult", "Multiplicity (unbiased); Number of tracks; Number of events", nBinsMult, hLowMult, hUpMult);
+hAcceptedMult = new TH1F("hAcceptedMult", "Multiplicity (biased); Number of tracks; Number of events", nBinsMult, hLowMult, hUpMult);
+hMultPS = new TH1F("hMultPS", "Multiplicity after physics selection; Number of tracks; Number of events", nBinsMult, hLowMult, hUpMult);
+hvtx = new TH3F("hvtx", "Reconstructed primary vertex position; x axis; y axis; z axis", nBinsXYV, hLowXYV, hUpXYV, nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hvtxy = new TH2F("hvtxy", "Reconstructed primary vertex position in x-y plane; x axis; y axis", nBinsXYV, hLowXYV, hUpXYV, nBinsXYV, hLowXYV, hUpXYV);
+hvtyz = new TH2F("hvtyz", "Reconstructed primary vertex position in y-z plane; y axis; z axis", nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hvtxz = new TH2F("hvtxz", "Reconstructed primary vertex position in x-z plane; x axis; z axis", nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hMultPSV = new TH1F("hMultPSV", "Multiplicity after physics selection & vertex cut; Number of tracks; Number of events", nBinsMult, hLowMult, hUpMult);
+hPtAll = new TH1F("hPtAll", "Transverse momentum of all tracks; p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaAll = new TH1F("hEtaAll", "Pseudorapidity of all tracks; n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hTrackPos = new TH3F("hTrackPos", "Generetion position of all reconstructed tracks", nBinsXYV, hLowXYV, hUpXYV, nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hTrackPosxy = new TH2F("hTrackPosxy", "Generetion position of all reconstructed tracks in x-y plane; x axis; y axis", nBinsXYV, hLowXYV, hUpXYV, nBinsXYV, hLowXYV, hUpXYV);
+hTrackPosyz = new TH2F("hTrackPosyz", "Generetion position of all reconstructed tracks in y-z plane; y axis; z axis", nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hTrackPosxz = new TH2F("hTrackPosxz", "Generetion position of all reconstructed tracks in x-z plane; x axis; z axis", nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+//hTPCchi2clusters = new TH1F("hTPCchi2clusters", "#chi^{2}/Number of TPC clusters; #chi^{2}; TPC clusters)", 100, 0.0, 2.0);//
+//hdcaToVertexXY = new TH1F("hdcaToVertexXY", "Track to vertex impact parameter in x-y plane; DCA_{z} (cm); dN/d(DCA_{z})", 100, 0.0, 2.0);//
+//hdcaToVertexZ = new TH1F("hdcaToVertexZ", "Track to vertex impact parameter in z axis; DCA_{z} (cm); dN/d(DCA_{z})", 100, 0.0, 2.0);//
+hMultPrim = new TH1F("hMultPrim", "ESD primary - supposed tracks multiplicity; Number of tracks; Number of events", nBinsMult, hLowMult, hUpMult);
+hPtPrim = new TH1F("hPtPrim", "Transverse momentum of primary - supposed ESD tracks; p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaPrim = new TH1F("hEtaPrim", "Pseudorapidity of primary - supposed ESD tracks; n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hPrimTrackPos = new TH3F("hPrimTrackPos", "Generetion position of selected tracks (DCA and quality cuts)", nBinsXYV, hLowXYV, hUpXYV, nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hPrimTrackPosxy = new TH2F("hPrimTrackPosxy", "Generetion position of selected tracks in x-y plane (DCA and quality cuts); x axis; y axis", nBinsXYV, hLowXYV, hUpXYV, nBinsXYV, hLowXYV, hUpXYV);
+hPrimTrackPosyz = new TH2F("hPrimTrackPosyz", "Generetion position of selected tracks in y-z plane (DCA and quality cuts); y axis; z axis", nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hPrimTrackPosxz = new TH2F("hPrimTrackPosxz", "Generetion position of selected tracks in x-z plane (DCA and quality cuts); x axis; z axis", nBinsXYV, hLowXYV, hUpXYV, nBinsZV, hLowZV, hUpZV);
+hPt = new TH1F("hPt", "Transverse momentum of selected ESD tracks; p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEta = new TH1F("hEta", "Pseudorapidity of selected ESD tracks; n; Number of tracks dN/dn", nBinsEta, hLowEta, hUpEta);
+//hRapidity = new TH1F("hRapidity", "Rapidity of selected ESD tracks; n; Number of tracks dN/dn", nBinsEta, hLowEta, hUpEta);
+hPtKink = new TH1F("hPtKink", "Mother's transverse momentum for all ESD kinks; p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaKink = new TH1F("hEtaKink", "Mother's pseudorapidity for all ESD kinks; n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hRapidityKink = new TH1F("hRapidityKink", "Mother's rapidity for all ESD kinks; n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hPmP = new TH2F("hPmP", "Mother's momentum as calculated by kink and by track; P_{kink}; P_{track}", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hKinkPosRTPCclusters1 = new TH1F("hKinkPosRTPCclusters1", " ;kinkposR; tpc clusters",100,0,1);
+hKinkPosRTPCclusters2 = new TH2F("hKinkPosRTPCclusters2", " ;kinkposR; tpc clusters",nBinsR, hLowR, hUpR,100,0,200 );
+hQt = new TH1F("hQt", "Daughter's transverse momentum in mother's frame for all ESD kinks; q_{T} (GeV/c); dN/dq_{T}", nBinsQt, hLowQt, hUpQt);
+hKinkAngle = new TH1F("hKinkAngle", "Kink angle for all ESD kinks; #theta (#circ); dN/d#theta", nBinsAngle, hLowAngle, hUpAngle);
+hDCAkink = new TH1F("hDCAkink", "DCA between the two kink tracks; DCA(cm); Number of kinks", 100, 0.0, 2.0);
+hPmKinkAng = new TH2F("hPmKinkAng", "k, p_(GeV/c); #theta (#circ); d^{2}N/dpd#theta", nBinsPt, hLowPt, hUpPt, nBinsAngle, hLowAngle, hUpAngle);
+hKinkPosXY = new TH2F("hKinkPosXY", "X-Y Position of all kinks; X (cm); Y (cm)", nBinsXY, hLowXY, hUpXY, nBinsXY, hLowXY, hUpXY);
+hKinkPosZY = new TH2F("hKinkPosZY", "z vs y position of kinks (DCA, quality, p_{T} & y cuts); z (cm); y (cm)", nBinsZ, hLowZ, hUpZ, nBinsXY, hLowXY, hUpXY);
+hKinkPosZR = new TH2F("hKinkPosZR", "Z vs radius of all kinks position; Z (cm); R (cm)", nBinsZ, hLowZ, hUpZ, nBinsR, hLowR, hUpR);
+hKinkPosR = new TH1F("hKinkPosR", "Position radius of all ESD kinks; R (cm); dN/dR", nBinsR, hLowR, hUpR);
+hKinkPosZ = new TH1F("hKinkPosZ", "z position of kinks (DCA, quality, p_{T} & y cuts); z (cm); dN/dz", nBinsZ, -1, 1);
+hPmd = new TH2F("hPmd", "ESD mother vs daughter momentum magnitude; Mother's P (GeV/c); Daughter's P (GeV/c)", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hMinvPimu = new TH1F("hMinvPimu", "Invariant mass of ESD pions decaying to muons; m (GeV/c^{2}); dN/dm", nBinsInvMass, hLowInvMass, hUpInvMass);
+hdEdx = new TH2F("hdEdx", "dE/dx vs mother's momentum; p (GeV/c); dE/dx (GeV/cm)", nBinsPt, hLowPt, hUpPt, 100, 0.0, 300.0);
+hPtPosRSelected = new TH1F("hPtPosRSelected", "Mother's transverse momentum for selected kinks (DCA, quality, p_{T}, y & R cuts); R (cm); dN/dR", nBinsPt, hLowPt, hUpPt);
+hPtZSelected = new TH1F("hPtZSelected", "Mother's transverse momentum for selected kinks (DCA, quality, p_{T}, y, R & z cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hPtAngSelected = new TH1F("hPtAngSelected", "Mother's transverse momentum for selected kinks (DCA, quality, p_{T}, y, R, z & #theta cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hPtPmSelected = new TH1F("hPtPmSelected", "Mother's transverse momentum for selected kinks (DCA, quality, p_{T}, y, R, z, #theta & p_{track}/p{kink} cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hPtGoodKink = new TH1F("hPtGoodKink", "Mother's transverse momentum for real ESD kinks (realistic PID); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaGoodKink = new TH1F("hEtaGoodKink", "Mother's pseudorapidity for real ESD kinks; n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hRapidityGoodKink = new TH1F("hRapidityGoodKink", "Mother's rapidity for real ESD kinks; n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hQtGoodKink = new TH1F("hQtGoodKink", "Daughter's transverse momentum in mother's frame for real ESD kinks (realistic PID); q_{T} (GeV/c); dN/dq_{T}", 200, 0.0, 0.3);
+hPmGoodKinkAng = new TH2F("hPmGoodKinkAng", "Mother's momentum magnitude vs kink angle for real ESD kinks (realistic PID); p_{T} (GeV/c); #theta (#circ); d^{2}N/dp_{T}d#theta", nBinsPt, hLowPt, hUpPt, nBinsAngle, hLowAngle, hUpAngle);
+hPmdGoodKink = new TH2F("hPmdGoodKink", "Mother vs daughter momentum magnitude for real ESD kinks (realistic PID); Mother's P; Daughter's P", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hdEdxGoodKink = new TH2F("hdEdxGoodKink", "dE/dx vs mother's momentum; p (GeV/c); dE/dx (GeV/cm)", nBinsPt, hLowPt, hUpPt, 100, 0.0, 300.0);
+hPtQtSelected = new TH1F("hPtQtSelected", "Mother's transverse momentum for selected kinks (DCA, quality, p_{T}, y, R, z, #theta, p_{track}/p{kink} & q^{T} cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hPtMaxAngSelected = new TH1F("hPtMaxAngSelected", "Mother's transverse momentum for selected kinks (DCA, quality, p_{T}, y, R, z, #theta, p_{track}/p{kink}, q^{T} & #theta_{max} cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hPtRTPCclustersSelected = new TH1F("hPtRTPCclustersSelected", "Mother's transverse momentum for selected kinks (DCA, quality, p_{T}, y, R, z, #theta, p_{track}/p{kink}, q^{T}, #theta_{max} & R/TPC clusters cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hRTPCclustersRTPCclustersSelected = new TH2F("hRTPCclustersRTPCclustersSelected", "Number of TPC clusters vs radius for selected kinks (DCA, quality, p_{T}, y, R, z, #theta, p_{track}/p{kink}, q^{T}, #theta_{max} & R/TPC clusters cuts); R (cm); number of TPC clusters", nBinsR, hLowR, hUpR, 100, 0, 200);
+hPtSelected = new TH1F("hPtSelected", "Mother's transverse momentum for selected kinks (all cuts except dE/dx); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaSelected = new TH1F("hEtaSelected", "Mother's pseudorapidity for selected kinks (all cuts except dE/dx); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hRapiditySelected = new TH1F("hRapiditySelected", "Mother's rapidity for selected kinks (all cuts except dE/dx); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hQtSelected = new TH1F("hQtSelected", "Daughter's transverse momentum in mother's frame for selected kinks (all cuts except dE/dx); q_{T} (GeV/c); dN/dq_{T}", 200, 0.0, 0.3);
+hKinkAngleSelected = new TH1F("hKinkAngleSelected", "Kink angle of selected kinks (all cuts except dE/dx); #theta (#circ); dN/d#theta", nBinsAngle, hLowAngle, hUpAngle);
+hDCAkinkSelected = new TH1F("hDCAkinkSelected", "DCA; DCA(cm); Number of kinks", 100, 0.0, 2.0);
+hPmKinkAngSelected = new TH2F("hPmKinkAngSelected", "Mother's momentum magnitude vs kink angle for selected kinks (all cuts except dE/dx); p_{T} (GeV/c); #theta (#circ); d^{2}N/dp_{T}d#theta", nBinsPt, hLowPt, hUpPt, nBinsAngle, hLowAngle, hUpAngle);
+hKinkPosXYSelected = new TH2F("hKinkPosXYSelected", "X-Y Position ; X (cm); Y (cm)", nBinsXY, hLowXY, hUpXY, nBinsXY, hLowXY, hUpXY);
+hKinkPosZRSelected = new TH2F("hKinkPosZRSelected", "Z vs radius of selected kinks (all cuts except dE/dx); Z (cm); R (cm)", nBinsZ, hLowZ, hUpZ, nBinsR, hLowR, hUpR);
+hKinkPosRSelected = new TH1F("hKinkPosRSelected", "Position radius of selected kinks (all cuts except dE/dx); R (cm); dN/dR", nBinsR, hLowR, hUpR);
+hPmdSelected = new TH2F("hPmdSelected", "Mother vs daughter momentum magnitude for selected kinks (all cuts except dE/dx); Mother's P; Daughter's P", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hMinvPimuSelected = new TH1F("hMinvPimuSelected", "Invariant mass for #pi^{#pm} decaying to #mu^{#pm} for selected kinks (all cuts except dE/dx); m (GeV/c^{2}); dN/dm", nBinsInvMass, hLowInvMass, hUpInvMass);
+hdEdxSelected = new TH2F("hdEdxSelected", "dE/dx vs mother's momentum for selected kinks (all cuts except dE/dx); p (GeV/c); dE/dx (GeV/cm)", nBinsPt, hLowPt, hUpPt, 100, 0.0, 300.0);
+hPtPiSelected = new TH1F("hPtPiSelected", "Mother's transverse momentum for selected kinks (all cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaPiSelected = new TH1F("hEtaPiSelected", "Mother's pseudorapidity for selected kinks (all cuts); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hRapidityPiSelected = new TH1F("hRapidityPiSelected", "Mother's rapidity for selected kinks (all cuts); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hQtPiSelected = new TH1F("hQtPiSelected", "Daughter's transverse momentum in mother's frame for selected kinks (all cuts); q_{T} (GeV/c); dN/dq_{T}", 200, 0.0, 0.3);
+hKinkAnglePiSelected = new TH1F("hKinkAnglePiSelected", "Kink angle of selected kinks (all cuts); #theta (#circ); dN/d#theta", nBinsAngle, hLowAngle, hUpAngle);
+hDCAkinkPiSelected = new TH1F("hDCAkinkPiSelected", "DCA; DCA(cm); Number of kinks", 100, 0.0, 2.0);
+hPmKinkAngPiSelected = new TH2F("hPmKinkAngPiSelected", "Mother's momentum magnitude vs kink angle for selected kinks (all cuts); p_{T} (GeV/c); #theta (#circ); d^{2}N/dp_{T}d#theta", nBinsPt, hLowPt, hUpPt, nBinsAngle, hLowAngle, hUpAngle);
+hKinkPosRTPCclusters1PiSelected = new TH1F("hKinkPosRTPCclusters1PiSelected", " ;kinkposR; tpc clusters",100,0,1);
+hKinkPosRTPCclusters2PiSelected = new TH2F("hKinkPosRTPCclusters2PiSelected", " ;kinkposR; tpc clusters",nBinsR, hLowR, hUpR,100,0,200 );
+hKinkPosXYPiSelected = new TH2F("hKinkPosXYPiSelected", "X-Y Position ; X (cm); Y (cm)", nBinsXY, hLowXY, hUpXY, nBinsXY, hLowXY, hUpXY);
+hKinkPosZRPiSelected = new TH2F("hKinkPosZRPiSelected", "Z vs radius of selected kinks (all cuts); Z (cm); R (cm)", nBinsZ, hLowZ, hUpZ, nBinsR, hLowR, hUpR);
+hKinkPosRPiSelected = new TH1F("hKinkPosRPiSelected", "Position radius of selected kinks (all cuts); R (cm); dN/dR", nBinsR, hLowR, hUpR);
+hKinkPosZPiSelected = new TH1F("hKinkPosZPiSelected", "z position of selected kinks (all cuts); R (cm); dN/dR", nBinsZ, hLowZ, hUpZ);
+hPmPPiSelected = new TH2F("hPmPPiSelected", "Mother's momentum as calculated by kink and by track of selected kinks (all cuts); R (cm); dN/dR", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hPmdPiSelected = new TH2F("hPmdPiSelected", "Mother vs daughter momentum magnitude for selected kinks (all cuts); Mother's P; Daughter's P", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hMinvPimuPiSelected = new TH1F("hMinvPimuPiSelected", "Invariant mass for #pi^{#pm} decaying to #mu^{#pm} for selected kinks (all cuts); m (GeV/c^{2}); dN/dm", nBinsInvMass, hLowInvMass, hUpInvMass);
+hdEdxPiSelected = new TH2F("hdEdxPiSelected", "dE/dx vs mother's momentum for selected kinks (all cuts); p (GeV/c); dE/dx (GeV/cm)", nBinsPt, hLowPt, hUpPt, 100, 0.0, 300.0);
+hPtPiSelectedPlus = new TH1F("hPtPiSelectedPlus", "Mother's transverse momentum for selected positive kinks (all cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaPiSelectedPlus = new TH1F("hEtaPiSelectedPlus", "Mother's pseudorapidity for selected positive kinks (all cuts); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hRapidityPiSelectedPlus = new TH1F("hRapidityPiSelectedPlus", "Mother's rapidity for selected positive kinks (all cuts); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hQtPiSelectedPlus = new TH1F("hQtKselectedPlus", "Daughter's transverse momentum in mother's frame for selected positive kinks (all cuts); q_{T} (GeV/c); dN/dq_{T}", 200, 0.0, 0.3);
+hKinkAnglePiSelectedPlus = new TH1F("hKinkAnglePiSelectedPlus", "Kink angle for selected positive kinks (all cuts); #theta (#circ); dN/d#theta", nBinsAngle, hLowAngle, hUpAngle);
+hDCAkinkPiSelectedPlus = new TH1F("hDCAkinkPiSelectedPlus", "DCA for selected positive kinks (all cuts); DCA(cm); Number of kinks", 100, 0.0, 2.0);
+hPmKinkAngPiSelectedPlus = new TH2F("hPmKinkAngPiSelectedPlus", "Mother's momentum magnitude vs kink angle for selected positive kinks (all cuts); p_{T} (GeV/c); #theta (#circ); d^{2}N/dp_{T}d#theta", nBinsPt, hLowPt, hUpPt, nBinsAngle, hLowAngle, hUpAngle);
+hKinkPosXYPiSelectedPlus = new TH2F("hKinkPosXYPiSelectedPlus", "X-Y Position of selected positive kinks (all cuts); X (cm); Y (cm)", nBinsXY, hLowXY, hUpXY, nBinsXY, hLowXY, hUpXY);
+hKinkPosZRPiSelectedPlus = new TH2F("hKinkPosZRPiSelectedPlus", "Z vs radius of selected positive kinks (all cuts); Z (cm); R (cm)", nBinsZ, hLowZ, hUpZ,nBinsR, hLowR, hUpR);
+hPmdPiSelectedPlus = new TH2F("hPmdPiSelectedPlus", "Mother vs daughter momentum magnitude for selected positive kinks (all cuts); Mother's P; Daughter's P", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hMinvPimuPiSelectedPlus = new TH1F("hMinvPimuPiSelectedPlus", "Invariant mass for #pi^{+} decaying to #mu^{+} for selected kinks (all cuts); m (GeV/c^{2}); dN/dm",nBinsInvMass, hLowInvMass, hUpInvMass);
+hdEdxPiSelectedPlus = new TH2F("hdEdxPiSelectedPlus", "dE/dx vs mother's momentum for selected positive kinks (all cuts); p (GeV/c); dE/dx (GeV/cm)", nBinsPt, hLowPt, hUpPt, 100, 0.0, 300.0);
+
+hPtPiSelectedMinus = new TH1F("hPtPiSelectedMinus", "Mother's transverse momentum for selected negative kinks (all cuts); p_{T} (GeV/c); dN/dp_{T}", nBinsPt, hLowPt, hUpPt);
+hEtaPiSelectedMinus = new TH1F("hEtaPiSelectedMinus", "Mother's pseudorapidity for selected negative kinks (all cuts); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hRapidityPiSelectedMinus = new TH1F("hRapidityPiSelectedMinus", "Mother's rapidity for selected negative kinks (all cuts); n; dN/dn", nBinsEta, hLowEta, hUpEta);
+hQtPiSelectedMinus = new TH1F("hQtPiSelectedMinus", "Daughter's transverse momentum in mother's frame for selected negative kinks (all cuts); q_{T} (GeV/c); dN/dq_{T}", 200, 0.0, 0.3);
+hKinkAnglePiSelectedMinus = new TH1F("hKinkAnglePiSelectedMinus", "Kink angle for selected negative kinks (all cuts); #theta (#circ); dN/d#theta", nBinsAngle, hLowAngle, hUpAngle);
+hDCAkinkPiSelectedMinus = new TH1F("hDCAkinkPiSelectedMinus", "DCA for selected negative kinks (all cuts); DCA(cm); Number of kinks", 100, 0.0, 2.0);
+hPmKinkAngPiSelectedMinus = new TH2F("hPmKinkAngPiSelectedMinus", "Mother's momentum magnitude vs kink angle for selected negative kinks (all cuts); p_{T} (GeV/c); #theta (#circ); d^{2}N/dp_{T}d#theta", nBinsPt, hLowPt, hUpPt, nBinsAngle, hLowAngle, hUpAngle);
+hKinkPosXYPiSelectedMinus = new TH2F("hKinkPosXYPiSelectedMinus", "X-Y Position for selected negative kinks (all cuts); X (cm); Y (cm)", nBinsXY, hLowXY, hUpXY, nBinsXY, hLowXY, hUpXY);
+hKinkPosZRPiSelectedMinus = new TH2F("hKinkPosZRPiSelectedMinus", "Z vs radius for selected negative kinks (all cuts); Z (cm); R (cm)",nBinsZ, hLowZ, hUpZ,nBinsR, hLowR, hUpR);
+hPmdPiSelectedMinus = new TH2F("hPmdPiSelectedMinus", "Mother vs daughter momentum magnitude for selected negative kinks (all cuts); Mother's P; Daughter's P", nBinsPt, hLowPt, hUpPt, nBinsPt, hLowPt, hUpPt);
+hMinvPimuPiSelectedMinus = new TH1F("hMinvPimuPiSelectedMinus", "Invariant mass for #pi^{-} decaying to #mu^{-} for selected kinks (all cuts); m (GeV/c^{2}); dN/dm", nBinsInvMass, hLowInvMass, hUpInvMass);
+hdEdxPiSelectedMinus = new TH2F("hdEdxPiSelectedMinus", "dE/dx vs mother's momentum for selected negative kinks (all cuts); p (GeV/c); dE/dx (GeV/cm)", nBinsPt, hLowPt, hUpPt, 100, 0.0, 300.0);
+
+
+fListOfHistos->Add(hMult);
+fListOfHistos->Add(hAcceptedMult);
+fListOfHistos->Add(hMultPS);
+fListOfHistos->Add(hvtx);
+fListOfHistos->Add(hvtxy);
+fListOfHistos->Add(hvtyz);
+fListOfHistos->Add(hvtxz);
+fListOfHistos->Add(hMultPSV);
+fListOfHistos->Add(hPtAll);
+fListOfHistos->Add(hEtaAll);
+fListOfHistos->Add(hTrackPos);
+fListOfHistos->Add(hTrackPosxy);
+fListOfHistos->Add(hTrackPosyz);
+fListOfHistos->Add(hTrackPosxz);
+//fListOfHistos->Add(hTPCchi2clusters);
+//fListOfHistos->Add(hdcaToVertexXY);
+//fListOfHistos->Add(hdcaToVertexZ);
+fListOfHistos->Add(hMultPrim);
+fListOfHistos->Add(hPtPrim);
+fListOfHistos->Add(hEtaPrim);
+fListOfHistos->Add(hPrimTrackPos);
+fListOfHistos->Add(hPrimTrackPosxy);
+fListOfHistos->Add(hPrimTrackPosyz);
+fListOfHistos->Add(hPrimTrackPosxz);
+fListOfHistos->Add(hPt);
+fListOfHistos->Add(hEta);
+//fListOfHistos->Add(hRapidity);
+fListOfHistos->Add(hPtKink);
+fListOfHistos->Add(hEtaKink);
+fListOfHistos->Add(hRapidityKink);
+fListOfHistos->Add(hPmP);
+fListOfHistos->Add(hKinkPosRTPCclusters1);
+fListOfHistos->Add(hKinkPosRTPCclusters2);
+fListOfHistos->Add(hQt);
+fListOfHistos->Add(hKinkAngle);
+fListOfHistos->Add(hDCAkink);
+fListOfHistos->Add(hPmKinkAng);
+fListOfHistos->Add(hKinkPosXY);
+fListOfHistos->Add(hKinkPosZY);
+fListOfHistos->Add(hKinkPosZR);
+fListOfHistos->Add(hKinkPosR);
+fListOfHistos->Add(hKinkPosZ);
+fListOfHistos->Add(hPmd);
+fListOfHistos->Add(hMinvPimu);
+fListOfHistos->Add(hdEdx);
+fListOfHistos->Add(hPtPosRSelected);
+fListOfHistos->Add(hPtZSelected);
+fListOfHistos->Add(hPtAngSelected);
+fListOfHistos->Add(hPtPmSelected);
+fListOfHistos->Add(hPtGoodKink);
+fListOfHistos->Add(hEtaGoodKink);
+fListOfHistos->Add(hRapidityGoodKink);
+fListOfHistos->Add(hQtGoodKink);
+fListOfHistos->Add(hPmGoodKinkAng);
+fListOfHistos->Add(hPmdGoodKink);
+fListOfHistos->Add(hdEdxGoodKink);
+fListOfHistos->Add(hPtQtSelected);
+fListOfHistos->Add(hPtMaxAngSelected);
+fListOfHistos->Add(hPtRTPCclustersSelected);
+fListOfHistos->Add(hRTPCclustersRTPCclustersSelected);
+fListOfHistos->Add(hPtSelected);
+fListOfHistos->Add(hEtaSelected);
+fListOfHistos->Add(hRapiditySelected);
+fListOfHistos->Add(hQtSelected);
+fListOfHistos->Add(hKinkAngleSelected);
+fListOfHistos->Add(hDCAkinkSelected);
+fListOfHistos->Add(hPmKinkAngSelected);
+fListOfHistos->Add(hKinkPosXYSelected);
+fListOfHistos->Add(hKinkPosZRSelected);
+fListOfHistos->Add(hKinkPosRSelected);
+fListOfHistos->Add(hPmdSelected);
+fListOfHistos->Add(hMinvPimuSelected);
+fListOfHistos->Add(hdEdxSelected);
+fListOfHistos->Add(hPtPiSelected);
+fListOfHistos->Add(hEtaPiSelected);
+fListOfHistos->Add(hRapidityPiSelected);
+fListOfHistos->Add(hQtPiSelected);
+fListOfHistos->Add(hKinkAnglePiSelected);
+fListOfHistos->Add(hDCAkinkPiSelected);
+fListOfHistos->Add(hPmKinkAngPiSelected);
+fListOfHistos->Add(hKinkPosRTPCclusters1PiSelected);
+fListOfHistos->Add(hKinkPosRTPCclusters2PiSelected);
+fListOfHistos->Add(hKinkPosXYPiSelected);
+fListOfHistos->Add(hKinkPosZRPiSelected);
+fListOfHistos->Add(hKinkPosRPiSelected);
+fListOfHistos->Add(hKinkPosZPiSelected);
+fListOfHistos->Add(hPmPPiSelected);
+fListOfHistos->Add(hPmdPiSelected);
+fListOfHistos->Add(hMinvPimuPiSelected);
+fListOfHistos->Add(hdEdxPiSelected);
+
+fListOfHistos->Add(hPtPiSelectedPlus);
+fListOfHistos->Add(hEtaPiSelectedPlus);
+fListOfHistos->Add(hRapidityPiSelectedPlus);
+fListOfHistos->Add(hQtPiSelectedPlus);
+fListOfHistos->Add(hKinkAnglePiSelectedPlus);
+fListOfHistos->Add(hDCAkinkPiSelectedPlus);
+fListOfHistos->Add(hPmKinkAngPiSelectedPlus);
+fListOfHistos->Add(hKinkPosXYPiSelectedPlus);
+fListOfHistos->Add(hKinkPosZRPiSelectedPlus);
+fListOfHistos->Add(hPmdPiSelectedPlus);
+fListOfHistos->Add(hMinvPimuPiSelectedPlus);
+fListOfHistos->Add(hdEdxPiSelectedPlus);
+
+fListOfHistos->Add(hPtPiSelectedMinus);
+fListOfHistos->Add(hEtaPiSelectedMinus);
+fListOfHistos->Add(hRapidityPiSelectedMinus);
+fListOfHistos->Add(hQtPiSelectedMinus);
+fListOfHistos->Add(hKinkAnglePiSelectedMinus);
+fListOfHistos->Add(hDCAkinkPiSelectedMinus);
+fListOfHistos->Add(hPmKinkAngPiSelectedMinus);
+fListOfHistos->Add(hKinkPosXYPiSelectedMinus);
+fListOfHistos->Add(hKinkPosZRPiSelectedMinus);
+fListOfHistos->Add(hPmdPiSelectedMinus);
+fListOfHistos->Add(hMinvPimuPiSelectedMinus);
+fListOfHistos->Add(hdEdxPiSelectedMinus);
+
+fListOfHistos->SetOwner(kTRUE);
+PostData(1, fListOfHistos);
+}
+
+//________________________________________________________________________
+void AliAnalysisPionKinksESD::UserExec(Option_t *) {
+ AliVEvent *event = InputEvent();
+ if (!event) {
+ Printf("ERROR: Could not retrieve event");
+ return;
+ }
+
+ AliESDEvent* esdEvent = dynamic_cast<AliESDEvent*>(event);
+ if (!esdEvent) {
+ Printf("ERROR: Could not retrieve esd");
+ return;
+ }
+
+
+//------------------------ Data Multiplicity unbiased --------------------------//
+ Int_t NTracks = esdEvent->GetNumberOfTracks(); //number of ESD tracks
+ hMult->Fill(NTracks);
+
+//----------------------------- Accepted Multiplicity -----------------------------//
+ Float_t NAcceptedTracks = fTrackCuts->CountAcceptedTracks(esdEvent);
+ if(fLowMulcut>-1) {
+ if(NAcceptedTracks<fLowMulcut) return;
+ }
+ if(fUpMulcut>-1) {
+ if(NAcceptedTracks>fUpMulcut) return;
+ }
+ hAcceptedMult->Fill(NAcceptedTracks); //to check if the multiplicity limits are ok
+
+
+
+//----------------------------- Physics selection ------------------------------//
+ Bool_t IsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()&AliVEvent::kMB;
+ if ( IsSelected ==kFALSE) return;
+
+//--------------- Data Multiplicity after Physics selection --------------------//
+ hMultPS->Fill(NTracks);
+
+//------------------------------------ Vertex ----------------------------------//
+ const AliESDVertex* vtx = GetEventVertex(esdEvent); //ESD primary vertex
+ if (!vtx) return;
+
+ Double_t vtxpos[3]; //vertex position vector
+ vtx->GetXYZ(vtxpos);
+ hvtx->Fill(vtxpos[0], vtxpos[1], vtxpos[2]); //ESD primary vertex position (x-y-z)
+ hvtxy->Fill(vtxpos[0], vtxpos[1]);
+ hvtyz->Fill(vtxpos[1], vtxpos[2]);
+ hvtxz->Fill(vtxpos[0], vtxpos[2]);
+
+ if (TMath::Abs(vtxpos[2])>10.) return;
+
+//-------------------- Data Multiplicity after vertex cut -----------------------//
+ hMultPSV->Fill(NTracks);
+
+//------------------------------- dE/dx parameters -----------------------------//
+ if(!fPIDResponse) {
+ AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
+ AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
+ fPIDResponse = inputHandler->GetPIDResponse();
+ }
+
+//------------------------- Reconstructed data Analysis -----------------------//
+ for (Int_t iData = 0; iData<NTracks; iData++) { //loop on all ESD tracks
+ AliESDtrack *ESDtrack = esdEvent->GetTrack(iData);
+ if (!ESDtrack) {
+ Printf("ERROR: Could not receive ESD track %d", iData);
+ continue;
+ }
+
+ Double_t Pt = ESDtrack->Pt();
+ Double_t Eta = ESDtrack->Eta();
+
+ hPtAll->Fill(Pt);
+ hEtaAll->Fill(Eta);
+ //hRapidityAll->Fill(Rapidity(ESDtrack));
+
+ Double_t TrackPos[3]; //starting position of ESD tracks (x-y-z)
+ ESDtrack->GetXYZ(TrackPos);
+ hTrackPos->Fill(TrackPos[0],TrackPos[1],TrackPos[2]);
+ hTrackPosxy->Fill(TrackPos[0], TrackPos[1]);
+ hTrackPosyz->Fill(TrackPos[1], TrackPos[2]);
+ hTrackPosxz->Fill(TrackPos[0], TrackPos[2]);
+
+ if ((IsPrimaryTrack(ESDtrack) == kFALSE) || (IsGoodTrack(ESDtrack) == kFALSE)) continue; //reject bad & secondary tracks
+ hMultPrim->Fill(NTracks);
+ hPtPrim->Fill(Pt);
+ hEtaPrim->Fill(Eta);
+ //hRapidityPrim->Fill(Rapidity(ESDtrack));
+
+ hPrimTrackPos->Fill(TrackPos[0],TrackPos[1],TrackPos[2]); //starting position of primary - supposed ESD tracks (x-y-z)
+ hPrimTrackPosxy->Fill(TrackPos[0], TrackPos[1]);
+ hPrimTrackPosyz->Fill(TrackPos[1], TrackPos[2]);
+ hPrimTrackPosxz->Fill(TrackPos[0], TrackPos[2]);
+
+ if (Pt<cLowPt) continue;
+
+ hPt->Fill(Pt);
+ hEta->Fill(Eta);
+ //hRapidity->Fill(fuRapidity(ESDtrack));
+
+ Int_t KinkIndex = ESDtrack->GetKinkIndex(0); //kink index (1st component is negative if the track is a kink candidate)
+ if (KinkIndex>=0) continue; //kink selection
+
+ Double_t Rapidity = fuRapidity(ESDtrack);
+ if (TMath::Abs(Rapidity)>cRapidityLim) continue;
+
+ Double_t dEdx = ESDtrack->GetTPCsignal();
+ Double_t NTPCclusters = ESDtrack->GetTPCclusters(0);
+
+ AliESDkink *kink = esdEvent->GetKink(TMath::Abs(KinkIndex)-1);
+
+ const TVector3 KinkPos(kink->GetPosition());
+ Double_t KinkPosR = kink->GetR(); //kink's position radius
+ Double_t KinkDistance = kink->GetDistance();
+ Double_t Qt = kink->GetQt(); //daughter's transverse momentum in mother's frame
+ Double_t KinkAngle =TMath::RadToDeg()*kink->GetAngle(2); //kink angle in mother frame (3rd component is angle in rads)
+
+ const TVector3 PMother(kink->GetMotherP()); //ESD mother's momentum
+ Double_t Pmx = PMother.Px();
+ Double_t Pmy = PMother.Py();
+ Double_t Pmz = PMother.Pz();
+ Double_t Pm = PMother.Mag(); //ESD mother's momentum magnitude
+ Double_t PTrack[3];
+ ESDtrack->GetPxPyPz(PTrack);
+ TVector3 Pvector3(PTrack[0], PTrack[1], PTrack[2]);
+ Double_t P = Pvector3.Mag();
+ Double_t PTPC = ESDtrack->GetInnerParam()->GetP();
+
+ const TVector3 PDaughter(kink->GetDaughterP()); //ESD daughter's momentum
+ Double_t Pdx = PDaughter.Px();
+ Double_t Pdy = PDaughter.Py();
+ Double_t Pdz = PDaughter.Pz();
+ Double_t Pd = PDaughter.Mag(); //ESD daugter's momentum magnitude
+ Double_t Edmu = TMath::Sqrt(TMath::Power(Pd,2)+TMath::Power(cMuonMass,2)); //ESD muon daughter's energy
+
+ Double_t DP = TMath::Sqrt((Pmx-Pdx)*(Pmx-Pdx)+(Pmy-Pdy)*(Pmy-Pdy)+(Pmz-Pdz)*(Pmz-Pdz)); //transferred momentum magnitude
+ Double_t MinvPimu = TMath::Sqrt((Edmu+DP)*(Edmu+DP)-TMath::Power(Pm,2)); //pion mother's invariant mass when decaying to muon
+ Double_t MaxKinkAngPimu=fMaxKinkAngPimu->Eval(P,0.,0.,0.); //maximum decay angle in lab frame for a pion decaying to muon
+
+ hPtKink->Fill(Pt);
+ hEtaKink->Fill(Eta);
+ hRapidityKink->Fill(Rapidity);
+ hPmP->Fill(Pm,P);
+ hKinkPosRTPCclusters1->Fill(NTPCclusters/KinkPosR);
+ hKinkPosRTPCclusters2->Fill(KinkPosR, NTPCclusters);
+ hQt->Fill(Qt);
+ hKinkAngle->Fill(KinkAngle);
+ hDCAkink->Fill(KinkDistance);
+ hPmKinkAng->Fill(P, KinkAngle);
+ hKinkPosXY->Fill(KinkPos[0],KinkPos[1]);
+ hKinkPosZY->Fill(KinkPos[2],KinkPos[1]);
+ hKinkPosZR->Fill(KinkPos[2],KinkPosR);
+ hKinkPosR->Fill(KinkPosR);
+ hKinkPosZ->Fill(KinkPos[2]);
+ hPmd->Fill(Pm,Pd);
+ hMinvPimu->Fill(MinvPimu);
+ hdEdx->Fill(PTPC, dEdx);
+
+ if ((KinkPosR<cLowR)||(KinkPosR>cUpR)) continue; //selection of kinks that are detected in the main region of TPC
+
+ hPtPosRSelected->Fill(Pt);
+
+ if ((TMath::Abs(KinkPos[2])<cLowZ) || (TMath::Abs(KinkPos[2])>cUpZ)) continue;
+ hPtZSelected->Fill(Pt);
+
+
+ if (KinkAngle<cLowKinkAngle) continue;
+ hPtAngSelected->Fill(Pt);
+
+ if ((Pm/P<0.7) || (1.3<Pm/P)) continue;
+ hPtPmSelected->Fill(Pt);
+
+ if (Qt<cLowQt)continue;
+
+ //Good Kinks
+ hPtGoodKink->Fill(Pt);
+ hEtaGoodKink->Fill(Eta);
+ hRapidityGoodKink->Fill(Rapidity);
+ hQtGoodKink->Fill(Qt);
+ hPmGoodKinkAng->Fill(P, KinkAngle);
+ hPmdGoodKink->Fill(Pm,Pd);
+ hdEdxGoodKink->Fill(PTPC, dEdx);
+
+ //------------------------ realistic PID from physical criteria --------------------//
+
+ if (Qt>cUpQt) continue;
+ hPtQtSelected->Fill(Pt);
+
+ if (KinkAngle>(MaxKinkAngPimu*1.1)) continue;
+ hPtMaxAngSelected->Fill(Pt);
+
+
+// if ( ((NTPCclusters/KinkPosR)>0.63) || ((NTPCclusters/KinkPosR)<0.20) ) //good TPC tracks selection
+ Double_t tpcNClHigh = -51.67+ (11./12.)*KinkPosR;
+ Double_t tpcNClMin = -85.5 + (65./95.)*KinkPosR;
+ if ( (NTPCclusters>tpcNClHigh) || (NTPCclusters<tpcNClMin) ) continue;//good TPC tracks selection
+// if ( (NTPCclusters>((11/12)*KinkPosR-51.67)) || (NTPCclusters<((65/95)*KinkPosR-85.5)) ) continue;
+ hPtRTPCclustersSelected->Fill(Pt);
+ hRTPCclustersRTPCclustersSelected->Fill(KinkPosR,NTPCclusters);
+
+ if ((MinvPimu>cUpInvMass) || (MinvPimu<cLowInvMass)) continue;
+
+ //selected
+ hPtSelected->Fill(Pt);
+ hEtaSelected->Fill(Eta);
+ hRapiditySelected->Fill(Rapidity);
+ hQtSelected->Fill(Qt);
+ hKinkAngleSelected->Fill(KinkAngle);
+ hDCAkinkSelected->Fill(KinkDistance);
+ hPmKinkAngSelected->Fill(P, KinkAngle);
+ hKinkPosXYSelected->Fill(KinkPos[0],KinkPos[1]);
+ hKinkPosZRSelected->Fill(KinkPos[2],KinkPosR);
+ hKinkPosRSelected->Fill(KinkPosR);
+ hPmdSelected->Fill(Pm,Pd);
+ hMinvPimuSelected->Fill(MinvPimu);
+ hdEdxSelected->Fill(PTPC, dEdx);
+
+
+ Double_t NSigmaTPC = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(ESDtrack, AliPID::kPion));
+ if (NSigmaTPC>cSigmaCut) continue;
+ Double_t Sign = ESDtrack->GetSign();
+
+ // dEdx selected
+ hPtPiSelected->Fill(Pt);
+ hEtaPiSelected->Fill(Eta);
+ hRapidityPiSelected->Fill(Rapidity);
+ hQtPiSelected->Fill(Qt);
+ hKinkAnglePiSelected->Fill(KinkAngle);
+ hDCAkinkPiSelected->Fill(KinkDistance);
+ hPmKinkAngPiSelected->Fill(P, KinkAngle);
+ hKinkPosRTPCclusters1PiSelected->Fill(NTPCclusters/KinkPosR);
+ hKinkPosRTPCclusters2PiSelected->Fill(KinkPosR, NTPCclusters);
+ hKinkPosXYPiSelected->Fill(KinkPos[0],KinkPos[1]);
+ hKinkPosZRPiSelected->Fill(KinkPos[2],KinkPosR);
+ hKinkPosRPiSelected->Fill(KinkPosR);
+ hKinkPosZPiSelected->Fill(KinkPos[2]);
+ hPmPPiSelected->Fill(Pm,P);
+ hPmdPiSelected->Fill(Pm,Pd);
+ hMinvPimuPiSelected->Fill(MinvPimu);
+ hdEdxPiSelected->Fill(PTPC, dEdx);
+
+ if (Sign>0) {
+ hPtPiSelectedPlus->Fill(Pt);
+ hEtaPiSelectedPlus->Fill(Eta);
+ hRapidityPiSelectedPlus->Fill(Rapidity);
+ hQtPiSelectedPlus->Fill(Qt);
+ hKinkAnglePiSelectedPlus->Fill(KinkAngle);
+ hDCAkinkPiSelectedPlus->Fill(KinkDistance);
+ hPmKinkAngPiSelectedPlus->Fill(P, KinkAngle);
+ hKinkPosXYPiSelectedPlus->Fill(KinkPos[0],KinkPos[1]);
+ hKinkPosZRPiSelectedPlus->Fill(KinkPos[2],KinkPosR);
+ hPmdPiSelectedPlus->Fill(Pm,Pd);
+ hMinvPimuPiSelectedPlus->Fill(MinvPimu);
+ hdEdxPiSelectedPlus->Fill(PTPC, dEdx);
+
+
+ } else if (Sign<0) {
+ hPtPiSelectedMinus->Fill(Pt);
+ hEtaPiSelectedMinus->Fill(Eta);
+ hRapidityPiSelectedMinus->Fill(Rapidity);
+ hQtPiSelectedMinus->Fill(Qt);
+ hKinkAnglePiSelectedMinus->Fill(KinkAngle);
+ hDCAkinkPiSelectedMinus->Fill(KinkDistance);
+ hPmKinkAngPiSelectedMinus->Fill(P, KinkAngle);
+ hKinkPosXYPiSelectedMinus->Fill(KinkPos[0],KinkPos[1]);
+ hKinkPosZRPiSelectedMinus->Fill(KinkPos[2],KinkPosR);
+ hPmdPiSelectedMinus->Fill(Pm,Pd);
+ hMinvPimuPiSelectedMinus->Fill(MinvPimu);
+ hdEdxPiSelectedMinus->Fill(PTPC, dEdx);
+
+ }
+ } //end of ESD track loop
+ PostData(1, fListOfHistos);
+}
+
+
+//________________________________________________________________________
+void AliAnalysisPionKinksESD::Terminate(Option_t *) {
+}
+
+//_________________________________________________________________________
+const AliESDVertex* AliAnalysisPionKinksESD::GetEventVertex(AliESDEvent* esd) { //Gets ESD vertex and returns it if it is valid
+ const AliESDVertex* vertex = esd->GetPrimaryVertexTracks();
+ if(vertex->GetStatus()==kTRUE) return vertex;
+ else {
+ vertex = esd->GetPrimaryVertexSPD();
+ if((vertex->GetStatus()==kTRUE)&&(vertex->GetNContributors()>0)) return vertex;
+ else return 0;
+ }
+}
+
+//________________________________________________________________________
+Double_t AliAnalysisPionKinksESD::Energy(AliESDtrack* track) const { //calculates the energy for a pion track
+ Double_t TrackMom[3];
+ track->GetPxPyPz(TrackMom);
+ TVector3 P(TrackMom[0], TrackMom[1], TrackMom[2]);
+ //Double_t EnergyK = TMath::Sqrt(P.Mag()*P.Mag()+0.493677*0.493677); //kaon's energy
+ Double_t EnergyPi = TMath::Sqrt(P.Mag()*P.Mag()+0.13957018*0.13957018); //pion's energy
+ return EnergyPi;
+}
+
+
+//________________________________________________________________________
+Double_t AliAnalysisPionKinksESD::fuRapidity(AliESDtrack* track) const { //calculates the rapidity for a track
+ Double_t TrackMom[3];
+ track->GetPxPyPz(TrackMom);
+ TVector3 P(TrackMom[0], TrackMom[1], TrackMom[2]);
+ Double_t RapidityK = 0.5*(TMath::Log((Energy(track)+P[2])/(Energy(track)-P[2])));
+ return RapidityK;
+}
+
+
+//________________________________________________________________________
+Bool_t AliAnalysisPionKinksESD::IsGoodTrack(AliESDtrack* ESDtrack) const { //Checks if a track is acceptable as good
+ UInt_t status = ESDtrack->GetStatus();
+ if ((status&AliESDtrack::kITSrefit)==0) return kFALSE; //cut tracks that cannot be reconstructed by ITS only
+ if ((status&AliESDtrack::kTPCrefit)==0) return kFALSE; //cut tracks that cannot be reconstructed by TPC only
+
+ Double_t NTPCclusters = ESDtrack->GetTPCclusters(0);
+ Double_t TPCchi2 = ESDtrack->GetTPCchi2();
+ if (NTPCclusters<20) return kFALSE;
+ //if (NTPCclusters<30) return kFALSE; // cut sta 30 gia syst
+
+ //hTPCchi2clusters->Fill(TPCchi2/NTPCclusters);//histo to check???????
+ if (TPCchi2/NTPCclusters>3.8) return kFALSE; //cut tracks of bad quality fit with the contributing clusters
+
+ /*Double_t ExtCov[15]; //external covariances matrix
+ ESDtrack->GetExternalCovariance(ExtCov);
+ if(ExtCov[0]>2) return kFALSE; //sigma(y^2)
+ if(ExtCov[2]>2) return kFALSE; //sigma(z^2)
+ if(ExtCov[5]>0.5) return kFALSE; //sigma(sinphi^2)
+ if(ExtCov[9]>0.5) return kFALSE; //sigma(tanlamda^2)
+ if(ExtCov[14]>2) return kFALSE; //sigma(1/Pt^2)*/
+
+ return kTRUE;
+}
+
+//________________________________________________________________________
+Bool_t AliAnalysisPionKinksESD::IsPrimaryTrack(AliESDtrack* ESDtrack) const { //Checks if a track is acceptable as a primary
+ Float_t ImpParam[2]; //DCA to vertex, 0->in x-y plane, 1->in z
+ Float_t ImpParamCov[3]; //covariances of DCA to vertex
+ ESDtrack->GetImpactParameters(ImpParam,ImpParamCov);
+ //hdcaToVertexXY->Fill(ImpParam[0]);
+ //hdcaToVertexZ->Fill(ImpParam[1]);
+ if (ImpParamCov[0]<=0 || ImpParamCov[2]<=0) {
+ AliDebug (1, "Estimated DCA covariance lower or equal zero!");
+ ImpParamCov[0]=0; ImpParamCov[2]=0;
+ }
+
+ //if((TMath::Abs(ImpParam[0])>0.3) || (TMath::Abs((ImpParam[1])>2.5))) return kFALSE; //absolute DCA cut
+ if (!fMaxDCAtoVtxCut->AcceptTrack(ESDtrack)) return kFALSE;
+ else return kTRUE;
+}
+