]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/SPECTRA/Kinks/AliAnalysisKinkESDMC.cxx
kinks new binning
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / Kinks / AliAnalysisKinkESDMC.cxx
1 /**************************************************************************
2  * Authors: Martha Spyropoulou-Stassinaki and the  members 
3  * of the Greek group at Physics Department of Athens University
4  * Paraskevi Ganoti, Anastasia Belogianni and Filimon Roukoutakis 
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 //-----------------------------------------------------------------
17 //                 AliAnalysisKinkESDMC class
18 //       Example of an analysis task for kink topology study
19 //      Kaons from kink topology are 'identified' in this code
20 //-----------------------------------------------------------------
21
22 #include "TChain.h"
23 #include "TTree.h"
24 #include "TH1F.h"
25 #include "TH2F.h"
26 #include "TH3F.h"
27 #include "TH1D.h"
28 #include "TH2D.h"
29 #include "TParticle.h"
30 #include <TVector3.h>
31 #include "TF1.h"
32
33 #include "AliAnalysisTask.h"
34 #include "AliAnalysisManager.h"
35 #include "AliTrackReference.h"
36
37 #include "AliVEvent.h"
38 #include "AliESDEvent.h"
39 #include "AliMCEvent.h"
40 #include "AliAnalysisKinkESDMC.h"
41 #include "AliStack.h"
42 #include "AliESDpid.h"
43 #include "AliESDkink.h"
44 #include "AliESDtrack.h"
45 #include "AliESDtrackCuts.h"
46 #include "AliPhysicsSelectionTask.h"
47 #include "AliInputEventHandler.h"
48 #include "AliESDInputHandler.h"
49 #include "AliAnalysisManager.h"
50 #include "AliVEvent.h"
51  #include "AliPIDResponse.h"
52 ///#include "AliTPCpidESD.h"
53
54 ClassImp(AliAnalysisKinkESDMC)
55
56
57 //________________________________________________________________________
58 AliAnalysisKinkESDMC::AliAnalysisKinkESDMC(const char *name) 
59   : AliAnalysisTaskSE(name), fHistPtESD(0),fHistPt(0),fHistQtAll(0),fHistQt1(0),fHistQt2(0)
60   , fHistPtKaon(0),fHistPtKPDG(0),fHistEta(0),fHistEtaK(0),fptKMC(0),fMultiplMC(0),fESDMult(0),frad(0),
61   fradMC(0), fKinkKaon(0), fKinkKaonBg(0), fM1kaon(0),  fgenPtEtR(0),fPtKink(0),  
62    fcodeH(0), fdcodeH(0), fAngMomK(0),fAngMomPi(0), fAngMomKC(0),  fMultESDK(0), fMultMCK(0),
63  fSignPtNcl(0), fSignPtEta(0), fSignPtEtaMC(0), fSignPtMC(0),  fEtaNcl(0), fSignPt(0), fChi2NclTPC(0), fRatChi2Ncl(0),
64   fRadiusNcl(0),  fTPCSgnlP(0), fTPCSgnlPa(0),  fSignPtGen(0),
65   fRpr(0),fZpr(0), fdcatoVxXY(0),    fMCEtaKaon(0),
66  fZvXv(0),fZvYv(0),fXvYv(0),fPtPrKink(0),fgenPtEtRP(0),fgenPtEtRN(0),fkinkKaonP(0),fkinkKaonN(0),
67    frapidESDK(0), frapidKMC(0),  fPtKPlMC(0), fPtKMnMC(0),  
68      fHistPtKaoP(0), fHistPtKaoN(0), fHiPtKPDGP(0), fHiPtKPDGN(0),fKinKBGP(0),fKinKBGN(0), 
69     fQtKMu(0),fQtKPi(0),fQtKEl(0),fFakepipi(0), fFakeKPi(0),
70      fDCAkink(0), fDCAkinkBG(0), fPosiKink(0),  fPosiKinkK(0), fPosiKinKXZ(0), fPosiKinKYZ(0),  fPosiKinKBgZY(0), 
71     fcode2(0), fcode4(0), fZkinkZDau(0),  
72          fQtKMuMC(0),  fQtKElMC(0), fQtKPiMC(0),   fQtK3PiP(0),fQtK3PiM(0),  fmaxAngMomKmu(0),
73            fPosiKinKBgZX(0), fPosiKinKBgXY(0),  fMinvPi(0),fMinvKa(0),fMinvPr(0),
74                         fTPCSgnlPtpc(0),
75        fTPCMomNSgnl(0),  fMothKinkMomSgnl(0), fNSigmTPC(0),  fTPCSgnlKinkDau(0),fcodeDau1(0),fcodeDau2(0), fMothKinkMomSgnlD(0), 
76      fInvMassMuNuAll(0),   fInvMassMuNuPt(0), fInvMassMuNuPtAll(0), fRatioCrossedRows(0), fRatioCrossedRowsKink(0), fRadiusPt(0), fRadiusPtcln(0),
77       fRadiusPtKaon(0), fRadiusPtPion(0), fRadiusPtFake(0), fPtCut1(0), fPtCut2(0), fPtCut3(0),  fAngMomKKinks(0),     
78   flengthMCK(0), flifetiMCK(0), flifetim2(0), fLHelESDK(0),flifeInt(0), flifeYuri(0), flenYuri(0), flenTrRef(0),flifeSmall(0), flifetime(0),flifTiESDK(0),  
79     flifeKink(), flenHelx(0), fradPtRapMC(0), fradPtRapDC(0), fradPtRapESD(0), fRadNclcln(0),
80     f1(0), f2(0),
81   fListOfHistos(0),fLowMulcut(-1),fUpMulcut(-1), fKinkRadUp(200),fKinkRadLow(130), fLowCluster(20), fLowQt(.12),  fCutsMul(0),fMaxDCAtoVtxCut(0), fPIDResponse(0)
82
83 {
84   // Constructor
85
86   // Define input and output slots here
87
88         DefineOutput(1, TList::Class());
89 }
90
91 //________________________________________________________________________
92 void AliAnalysisKinkESDMC::UserCreateOutputObjects() 
93 {
94     
95   // Input slot #0 works with a TChain
96   // DefineInput(0, TChain::Class());liESDtrackCuts("Mul","Mul");
97         fCutsMul=new AliESDtrackCuts("Mul","Mul");
98         fCutsMul->SetMinNClustersTPC(70);
99         fCutsMul->SetMaxChi2PerClusterTPC(4);
100         fCutsMul->SetAcceptKinkDaughters(kFALSE);
101         fCutsMul->SetRequireTPCRefit(kTRUE);
102         // ITS
103         fCutsMul->SetRequireITSRefit(kTRUE);
104         fCutsMul->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
105                                                 AliESDtrackCuts::kAny);
106         fCutsMul->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
107
108         fCutsMul->SetMaxDCAToVertexZ(2);
109         fCutsMul->SetDCAToVertex2D(kFALSE);
110         fCutsMul->SetRequireSigmaToVertex(kFALSE);
111
112         fCutsMul->SetEtaRange(-0.8,+0.8);
113         fCutsMul->SetPtRange(0.15, 1e10);
114 //
115                    fMaxDCAtoVtxCut=new AliESDtrackCuts("fMaxDCA", "fMaxDCA");
116        fMaxDCAtoVtxCut->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
117     fMaxDCAtoVtxCut->SetMaxChi2TPCConstrainedGlobal(36);
118
119         // Create histograms
120         // Called once
121
122         f1=new TF1("f1","((atan([0]*[1]*(1.0/(sqrt((x^2)*(1.0-([1]^2))-([0]^2)*([1]^2))))))*180.)/[2]",1.1,10.0);
123         f1->SetParameter(0,0.493677);
124         f1->SetParameter(1,0.9127037);
125         f1->SetParameter(2,TMath::Pi());
126
127
128         f2=new TF1("f2","((atan([0]*[1]*(1.0/(sqrt((x^2)*(1.0-([1]^2))-([0]^2)*([1]^2))))))*180.)/[2]",0.1,10.0);
129         f2->SetParameter(0,0.13957018);
130         f2->SetParameter(1,0.2731374);
131         f2->SetParameter(2,TMath::Pi());
132 //
133       Double_t gPt7K0[45] = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8,0.9,1.0,
134                         1.1, 1.2, 1.3, 1.4, 1.5, 1.6,1.7,1.8,1.9,  2.0,
135                          2.2, 2.4, 2.6, 2.8,  3.0,   3.3, 3.6, 3.9,
136                          4.2, 4.6,5.0, 5.4, 5.9,  6.5,   7.0,7.5, 8.0,8.5,  9.2, 10., 11., 12., 13.5,15.0 };  // David K0
137 //
138                   Double_t gPt7Comb[48] = { 
139 //! ! ! ! !  KINK FROM HERE --------------->
140 0.25,0.30,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0, 1.1, 1.2,
141 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9,
142 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8,5.0, 5.5, 6
143  };  // 25/11/2013 from Francesco
144 /*
145    Double_t gPt7TOF[47] = { 0.2,0.25, 0.3,0.35,  0.4,0.45,  0.5,0.55,  0.6,0.65,  0.7,0.75,  0.8, 0.85, 0.9, 0.95, 1.0,
146                         1.1, 1.2, 1.3, 1.4, 1.5, 1.6,1.7,1.8,1.9,  2.0,
147                          2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,2.8, 2.9, 3.0,
148                          3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8,5.0 };  //  Barbara TOF Kch
149 */
150         fHistPtESD = new TH1F("fHistPtESD", "P_{T} distribution",200, 0.0,10.0);
151         fHistPt = new TH1F("fHistPt", "P_{T} distribution",200, 0.0,10.0); 
152         fHistQtAll = new TH1F("fHistQtAll", "Q_{T} distr All Kinks ",100, 0.0,.300); 
153         fHistQt1= new TH1F("fHistQt1", "Q_{T} distribution",100, 0.0,.300); 
154         fHistQt2= new TH1F("fHistQt2", "Q_{T} distribution",100, 0.0,.300); 
155 //      fHistPtKaon = new TH1F("fHistPtKaon", "P_{T}Kaon distribution",200, 0.0,10.0); 
156         fHistPtKaon = new TH1F("fHistPtKaon", "P_{T}Kaon distribution",47,gPt7Comb ); 
157         fHistPtKPDG = new TH1F("fHistPtKPDG", "P_{T}Kaon distribution",47, gPt7Comb   ); 
158         fHistEta= new TH1F("fHistEta", "Eta distribution", 26,-1.3, 1.3); 
159         fHistEtaK= new TH1F("fHistEtaK", "EtaK distribution", 26,-1.3, 1.3); 
160         fptKMC= new TH1F("fptKMC", "P_{T}Kaon generated",47,  gPt7Comb  ); 
161         fMultiplMC= new TH1F("fMultiplMC", " charge particle multipl",100, 0.0,2500.);
162         fESDMult= new TH1F("fESDMult", "charge multipliESD",100, 0.0,100.); 
163         frad= new TH1F("frad", "radius  K ESD recon",100,0.,1000.); 
164         fradMC= new TH1F("fradMC", "radius  K generated",100,0.,1000.); 
165         fKinkKaon= new TH1F("fKinkKaon", "P_{T}Kaon kinks identi", 47, gPt7Comb  ); 
166         fKinkKaonBg= new TH1F("fKinkKaonBg", "P_{T}Kaon kinks backgr",47 , gPt7Comb ); 
167         //fM1kaon= new TH1F("fM1kaon","Invar m(kaon) from kink->mu+netrino decay",180,0.1, 1.0); 
168         fM1kaon= new TH1F("fM1kaon","Invar m(kaon) from kink->mu+netrino decay",600,0.1, 0.7); 
169         fgenPtEtR= new TH1F("fgenPtEtR", "P_{T}Kaon distribution", 47, gPt7Comb  ); 
170         fPtKink= new TH1F("fPtKink", "P_{T}Kaon Kink  bution",47, gPt7Comb  ); 
171         fcodeH   = new TH2F("fcodeH", "code vrs dcode dist. kinks,K",100,0.,2500.,100,0.,2500.);
172         fdcodeH = new TH2F("fdcodeH", "code vrs dcode dist. kinks,K",100,0.,2500.,100,0.,2500.);
173         fAngMomK= new TH2F("fAngMomK","Decay angle vrs Mother Mom,K",100,0.0,10.0,80,0.,80.);
174         fAngMomPi= new TH2F("fAngMomPi","Decay angle vrs Mother Mom,Pi",100,0.0,10.0,80,0.,80.);
175         fAngMomKC= new TH2F("fAngMomKC","Decay angle vrs Mother Mom,K",100,0.0,10.0,80,0.,80.);
176         fMultESDK=new TH1F("fMultESDK", "charge multipliESD kaons",100, 0.,2500.); 
177         fMultMCK=new TH1F("fMultMCK", "charge multipli MC kaons",100, 0.,2500.); 
178         fSignPtNcl= new TH2F("fSignPtNcl","SignPt vrs Ncl,K",80,-4.,4.0,70,20.,160.);
179         fSignPtEta= new TH2F("fSignPtEta","SignPt vrs Eta,K",80,-4.0,4.0,30,-1.5,1.5);
180         fSignPtEtaMC= new TH2F("fSignPtEtaMC","SignPt vrs Eta,K",80,-4.0,4.0,30,-1.5,1.5);
181         fSignPtMC= new TH1F("fSignPtMC","SignPt ,K",100,-5.,5.0);
182         fEtaNcl= new TH2F("fEtaNcl","Eta vrs Ncl,K",26,-1.3,1.3,70,20.,160.);
183         fSignPt= new TH1F("fSignPt","SignPt ,K",100,-5.,5.0);
184         fChi2NclTPC= new TH2F("fChi2NclTPC","Chi2vrs nclust,K",100,0.,500., 70,20, 160);
185         fRatChi2Ncl= new TH1F("fRatChi2Ncl","Ratio chi2/nclusters in TPC,K",50,0.0,5.0);
186         fRadiusNcl = new TH2F("fRadiusNcl","KinkRadius Ncl,K",75,100.,250., 80,0, 160);
187         fTPCSgnlP = new TH2F("fTPCSgnlP","Kink TCP de/dx,K",300,0.,15.,150,0.,300);
188         fTPCSgnlPa= new TH2F("fTPCSgnlPa","Kink TCP de/dx,a",300,0.,15.,150,0.,300);
189         fSignPtGen= new TH1F("fSignPtGen","SignPtGen ,K",100,-5.0,5.0);
190         fRpr = new TH1D("fRpr", "rad distribution  PID pr",100,-1.0,1.0);
191         fZpr = new TH1D("fZpr", "z distribution PID pr  ",60,-15.,15.);
192         fdcatoVxXY = new TH1D("fdcatoVxXY", "dca  distribution PID  ",20,-1.,1.);
193         fMCEtaKaon = new TH1F("fMCEtaKaon"," Hist of Eta K -Kink Selecied",26,-1.3,1.3);
194         fZvXv= new TH2F("fZvXv","Xv-Zv main vtx",60,-0.5,0.5, 60, -15., 15.);
195         fZvYv= new TH2F("fZvYv","Yv-Zv main vtx",60,-0.5,0.5, 60, -15., 15.);
196         fXvYv= new TH2F("fXvYv","Xv-Yv main vtx", 60,-1.5,1.5, 60, -1.5, 1.5);
197         fPtPrKink=new TH1F("fPtPrKink","pt of ESD  kaonKink tracks",300, 0.0,15.0);
198         fgenPtEtRP= new TH1F("fgenPtEtRP", "P_{T}Kaon distribution positive", 47, gPt7Comb  ); 
199         fgenPtEtRN= new TH1F("fgenPtEtRN", "P_{T}Kaon distribution negative", 47, gPt7Comb  ); 
200         fkinkKaonP= new TH1F("fKinkKaonP", "P_{T}Kaon distribution positive", 47, gPt7Comb  ); 
201         fkinkKaonN= new TH1F("fKinkKaonN", "P_{T}Kaon distribution negative", 47, gPt7Comb  ); 
202         frapidESDK= new TH1F("frapidESDK", "rapidity distribution", 26,-1.3, 1.3); 
203         frapidKMC = new TH1F("frapidKMC ", "rapidity distri  MC  ",26,-1.3, 1.3); 
204         fPtKPlMC= new TH1F("fPtKPlMC", "P_{T}Kaon Pos  generated", 47, gPt7Comb  ); 
205         fPtKMnMC= new TH1F("fPtKMnMC", "P_{T}Kaon Minusgenerated",47 , gPt7Comb  ); 
206         fHistPtKaoP= new TH1F("fHistPtKaoP", "P_{T}Kaon Pos ESD", 47, gPt7Comb   ); 
207         fHistPtKaoN= new TH1F("fHistPtKaoN", "P_{T}Kaon Neg ESD", 47, gPt7Comb   ); 
208         fHiPtKPDGP= new TH1F("fHiPtKPDGP", "P_{T}Kaon Pos ESD", 47,  gPt7Comb  ); 
209         fHiPtKPDGN= new TH1F("fHiPtKPDGN", "P_{T}Kaon neg ESD", 47, gPt7Comb   ); 
210         fKinKBGP  = new TH1F("fKinKBGP  ", "P_{T}Kaon Pos ESD", 47, gPt7Comb   ); 
211         fKinKBGN= new TH1F("fKinKBGN", "P_{T}Kaon neg ESD", 47, gPt7Comb   ); 
212         fQtKMu= new TH1F("fQtKMu", "Q_{T} distribution  K to mu ",100, 0.0,.300); 
213         fQtKPi= new TH1F("fQtKPi", "Q_{T} distribution K to pi",100, 0.0,.300); 
214         fQtKEl= new TH1F("fQtKEl", "Q_{T} distribution   K to elec",100, 0.0,.300); 
215         fFakepipi = new TH1F("fFakepipi", "P_{T}fake pipi   ",47 , gPt7Comb   ); 
216         fFakeKPi = new TH1F("fFakeKPi", "P_{T}fake Kpi   ", 47, gPt7Comb   ); 
217         fDCAkink = new TH1F("fDCAkink", "DCA kink vetrex ",50, 0.0,1.0); 
218         fDCAkinkBG = new TH1F("fDCAkinkBG", "DCA kink vetrex ",50, 0.0,1.0); 
219         fPosiKink= new TH2F("fPosiKink", "Y vrx kink Vrex ",100, -300.0,300.0,100, -300, 300.); 
220         fPosiKinkK= new TH2F("fPosiKinkK", "Y vrx kink VrexK ",100, -300.0,300.0,100, -300, 300.); 
221         fPosiKinKXZ= new TH2F("fPosiKinKXZ", "Y vrx kink VrexK ",100, -300.0,300.0,100, -300, 300.); 
222         fPosiKinKYZ= new TH2F("fPosiKinKYZ", "Y vrx kink VrexK ",100, -300.0,300.0,100, -300, 300.); 
223         fPosiKinKBgZY= new TH2F("fPosiKinKBgZY", "Y vrx Z kink Vrexbg ",100, -300.0,300.0,100, -300, 300.); 
224         fcode2   = new TH2F("fcode2", "code vrs dcode dist. kinks,K",100,0.,2500.,100,0.,2500.);
225         fcode4   = new TH2F("fcode4", "code vrs dcode dist. kinks,K",100,0.,2500.,100,0.,2500.);
226         fZkinkZDau = new TH2F("fZkinkZDau", "Y vrx kink VrexK ",100, -300.0,300.0,100, -300, 300.); 
227   fQtKMuMC= new TH1F("fQtKMuMC", "Q_{T} distribution  K to mu MC",100, 0.0,.300); 
228   fQtKPiMC= new TH1F("fQtKPiMC", "Q_{T} distribution K to pi MC",100, 0.0,.300); 
229   fQtKElMC= new TH1F("fQtKElMC", "Q_{T} distribution   K to elec MC",100, 0.0,.300); 
230   fQtK3PiP= new TH1F("fQtK3PiP", "Q_{T} distribution K to 3pi ",100, 0.0,.300); 
231   fQtK3PiM= new TH1F("fQtK3PiM", "Q_{T} distribution K to 3pi ",100, 0.0,.300); 
232   fmaxAngMomKmu= new TH2F("fmaxAngMomKmu","Decay angle vrs Mother Mom,Kmu",100,0.0,10.0,80,0.,80.);
233         fPosiKinKBgZX= new TH2F("fPosiKinKBgZX", "X vrx Z kink Vrexbg ",100, -20.0,20.0,100, 0., 300.); 
234         fPosiKinKBgXY= new TH2F("fPosiKinKBgXY", "Y vrx X kink Vrexbg ",100, -300.0,300.0,100, -300, 300.); 
235         fMinvPi= new TH1F("fMinvPi","Invar m(kaon) from kink-> decay",100,0.0, 1.2); 
236         fMinvKa= new TH1F("fMinvKa","Invar m(kaon) from kink-> decay",100,0.0, 2.0); 
237         fMinvPr= new TH1F("fMinvPr","Invar m(kaon) from kink-> decay",100,0.0, 1.2); 
238                 fTPCSgnlPtpc = new TH2F("fTPCSgnlPtpc","TPC signal de/dx Mom TPC,K  ",100,0.0,8.0,100, 0., 250.    );
239     fTPCMomNSgnl = new TH2F("fTPCMomNsgnl","TPC signal de/dx Mom TPC,K  ",100,0.0,8.0,20 , -10., 10.);
240     fMothKinkMomSgnl  = new TH2F("fMothKinkMomSgnl","TPC signal de/dx Mom TPC,Kink  ",100,0.0,250.,100, 0., 250.    );
241     fNSigmTPC    = new TH1F("fNSigmTPC","TPC Nsigma  de/dx  TPC,K  ", 30 , -7.5, 7.5);
242     fTPCSgnlKinkDau = new TH2F("fTPCSgnlKinkDau","TPC signal de/dx Mom,K",100,0.0,8.0,100,0.,250.);
243         fcodeDau1   = new TH2F("fcodeDau1", "code vrs dcode dist. kinks,K",100,0.,500.,100,0.,500.);
244         fcodeDau2   = new TH2F("fcodeDau2", "code vrs dcode dist. kinks,K",100,0.,500.,100,0.,500.);
245     fMothKinkMomSgnlD = new TH2F("fMothKinkMomSgnlD","TPC signal de/dx Mom TPC,Kink  ",100,0.0,250.,100, 0., 250.    );
246         //fInvMassMuNuAll = new TH1F("fInvMassMuNuAll","Invar from kink->mu+netrino decay",180,0.1, 1.0); 
247         fInvMassMuNuAll = new TH1F("fInvMassMuNuAll","Invar from kink->mu+netrino decay",600,0.1, 0.7); //  22/8/2013 
248         //fInvMassMuNuPt  = new TH2F("fInvMassMuNuPt","Invar from kink->mu+netrino decay vs Pt",180,0.1, 1.0, 100, 0. , 10.); 
249         fInvMassMuNuPt  = new TH2F("fInvMassMuNuPt","Invar from kink->mu+netrino decay vs Pt",600,0.1, 0.7, 100, 0. , 10.); //  22/8/2013
250         fInvMassMuNuPtAll  = new TH2F("fInvMassMuNuPtAll","Invar from kink->mu+netrino decay vs Pt",600,0.1, 0.7, 100, 0. , 10.); //  22/8/2013
251       fRatioCrossedRows = new TH1F("fRatioCrossedRows","Ratio crossed rows  in TPC",20,0.0,1.0);
252   fRatioCrossedRowsKink = new TH1F("fRatioCrossedRowsKink","Ratio crossed rows  in TPC for kinks",20,0.0,1.0);
253   fRadiusPt =new TH2F("fRadiusPt","radius vs pt  ",80, 90.,250.,100, 0.,10.              );
254   fRadiusPtcln =new TH2F("fRadiusPtcln","radius vs pt clean ",80, 90.,250.,100, 0.,10.              );
255   fRadiusPtKaon  =new TH2F("fRadiusPtKaon","radius vs pt Kaon PDG ",80, 90.,250.,100, 0.,10.              );
256   fRadiusPtPion  =new TH2F("fRadiusPtPion","radius vs pt Pion PDG ",80, 90.,250.,100, 0.,10.              );
257   fRadiusPtFake  =new TH2F("fRadiusPtFake","radius vs pt Pion Fake ",80, 90.,250.,100, 0.,10.              );
258   fPtCut1 = new TH1F("fPtCut1", "P_{T}Kaon distribution",300, 0.0,15.0);
259   fPtCut2 = new TH1F("fPtCut2", "P_{T}Kaon distribution",300, 0.0,15.0);
260   fPtCut3 = new TH1F("fPtCut3", "P_{T}Kaon distribution",300, 0.0,15.0);
261   fAngMomKKinks = new TH2F("fAngMomKKinks","Decay angle vrs Mother Mom,Kinks",300,0.0,15.0,100,0.,100.);
262    flengthMCK=new TH1F("flengthMCK", "length of K  MCref decay ",100,0.,1000.0);
263   flifetiMCK=new TH1F("flifetiMCK", "lifetime ref K   Decay   ",100,0.,1000.0);
264   flifetim2 =new TH1F("flifetim2", "lifetime ref K   Decay   ",100,0.,1000.0);
265   fLHelESDK =new TH1F("fLHelESDK", "lifetime ref K   Decay   ",100,0.,1000.0);
266   flifeInt =new TH1F("flifeInt", "lifetime ref K   Decay   ",100,0.,1000.0);
267   flifeYuri=new TH1F("flifeYuri","lifetime ref K   Decay   ",100,0.,1000.0);
268   flenYuri=new TH1F("flenYuri","lifetime ref K   Decay   ",100,0.,1000.0);
269   flenTrRef =new TH1F("flenTrRef","lifetime ref K   Decay   ",100,0.,1000.0);
270   flifeSmall=new TH1F("flifeSmall","lifetime ref K   Decay   ",100,0.,1000.0);
271   flifetime =new TH1F("flifetime","lifetime ref K   Decay   ",100,0.,1000.0);
272   flifTiESDK=new TH1F("flifTiESDK","lifetime ref K   Decay   ",100,0.,1000.0);
273   flifeKink =new TH1F("flifeKink", "lifetime ref K   Decay   ",100,0.,1000.0);
274   flenHelx  =new TH1F("flenHelx", "lifetime ref K   Decay   ",100,0.,1000.0);
275      fradPtRapMC=new TH3F("fradPtRapMC","rad pt rap dat",28,100.,240., 20, 0., 5., 20, -1., 1. );
276      fradPtRapDC=new TH3F("fradPtRapDC","rad pt rap dat",28,100.,240., 20, 0., 5., 20, -1., 1. );
277      fradPtRapESD=new TH3F("fradPtRapESD","rad pt rap dat",28,100.,240., 20, 0., 5., 20, -1., 1. );
278         fRadNclcln = new TH2F("fRadNclcln","KinkRadius Ncl,K",75,100.,250., 80,0, 160);
279
280
281
282
283    fListOfHistos=new TList();
284    fListOfHistos->SetOwner();
285    fListOfHistos->Add(fHistPtESD);
286    fListOfHistos->Add(fHistPt);
287    fListOfHistos->Add(fHistQtAll);
288    fListOfHistos->Add(fHistQt1);
289    fListOfHistos->Add(fHistQt2);
290    fListOfHistos->Add(fHistPtKaon);
291    fListOfHistos->Add(fHistPtKPDG);
292    fListOfHistos->Add(fHistEta);
293    fListOfHistos->Add(fHistEtaK);
294    fListOfHistos->Add(fptKMC);
295    fListOfHistos->Add(fMultiplMC);
296    fListOfHistos->Add(fESDMult);
297    fListOfHistos->Add(frad);
298    fListOfHistos->Add(fradMC);
299    fListOfHistos->Add(fKinkKaon);
300    fListOfHistos->Add(fKinkKaonBg);
301    fListOfHistos->Add(fM1kaon);
302    fListOfHistos->Add(fgenPtEtR);
303    fListOfHistos->Add(fPtKink);
304    fListOfHistos->Add(fcodeH);
305    fListOfHistos->Add(fdcodeH);
306    fListOfHistos->Add(fAngMomK);
307    fListOfHistos->Add(fAngMomPi);
308    fListOfHistos->Add(fAngMomKC);
309    fListOfHistos->Add(fMultESDK);
310    fListOfHistos->Add(fMultMCK);
311    fListOfHistos->Add(fSignPtNcl);
312    fListOfHistos->Add(fSignPtEta);
313    fListOfHistos->Add(fSignPtEtaMC);
314    fListOfHistos->Add(fSignPtMC);
315    fListOfHistos->Add(fEtaNcl);
316    fListOfHistos->Add(fSignPt);
317    fListOfHistos->Add(fChi2NclTPC);
318    fListOfHistos->Add(fRatChi2Ncl); 
319    fListOfHistos->Add(fRadiusNcl); 
320    fListOfHistos->Add(fTPCSgnlP); 
321    fListOfHistos->Add(fTPCSgnlPa); 
322    fListOfHistos->Add(fSignPtGen);
323    fListOfHistos->Add(fRpr);
324    fListOfHistos->Add(fZpr);
325    fListOfHistos->Add(fdcatoVxXY);
326    fListOfHistos->Add(fMCEtaKaon);
327    fListOfHistos->Add(fZvXv);
328    fListOfHistos->Add(fZvYv);
329    fListOfHistos->Add(fXvYv);
330    fListOfHistos->Add(fPtPrKink);
331    fListOfHistos->Add(fgenPtEtRP);
332    fListOfHistos->Add(fgenPtEtRN);
333    fListOfHistos->Add(fkinkKaonP);
334    fListOfHistos->Add(fkinkKaonN);
335    fListOfHistos->Add(frapidESDK);
336    fListOfHistos->Add(frapidKMC);
337    fListOfHistos->Add(fPtKPlMC);
338    fListOfHistos->Add(fPtKMnMC);
339    fListOfHistos->Add(fHistPtKaoP);
340    fListOfHistos->Add(fHistPtKaoN);
341    fListOfHistos->Add(fHiPtKPDGP);
342    fListOfHistos->Add(fHiPtKPDGN);
343    fListOfHistos->Add(fKinKBGP);
344    fListOfHistos->Add(fKinKBGN);
345    fListOfHistos->Add(fQtKMu);
346    fListOfHistos->Add(fQtKPi);
347    fListOfHistos->Add(fQtKEl);
348    fListOfHistos->Add(fFakepipi);
349    fListOfHistos->Add(fFakeKPi);
350    fListOfHistos->Add(fDCAkink);
351    fListOfHistos->Add(fDCAkinkBG);
352    fListOfHistos->Add(fPosiKink);
353    fListOfHistos->Add(fPosiKinkK);
354    fListOfHistos->Add(fPosiKinKXZ);
355    fListOfHistos->Add(fPosiKinKYZ);
356    fListOfHistos->Add(fPosiKinKBgZY);
357    fListOfHistos->Add(fcode2);
358    fListOfHistos->Add(fcode4);
359    fListOfHistos->Add(fZkinkZDau);
360    fListOfHistos->Add(fQtKMuMC);
361    fListOfHistos->Add(fQtKPiMC);
362    fListOfHistos->Add(fQtKElMC);
363    fListOfHistos->Add(fQtK3PiP);
364    fListOfHistos->Add(fQtK3PiM);
365    fListOfHistos->Add(fmaxAngMomKmu);
366    fListOfHistos->Add(fPosiKinKBgZX);
367    fListOfHistos->Add(fPosiKinKBgXY);
368    fListOfHistos->Add(fMinvPi);
369    fListOfHistos->Add(fMinvKa);
370    fListOfHistos->Add(fMinvPr);
371    fListOfHistos->Add(fTPCSgnlPtpc);
372    fListOfHistos->Add(fTPCMomNSgnl);
373    fListOfHistos->Add(fMothKinkMomSgnl);
374    fListOfHistos->Add(fNSigmTPC);
375    fListOfHistos->Add(fTPCSgnlKinkDau);
376    fListOfHistos->Add(fcodeDau1);
377    fListOfHistos->Add(fcodeDau2);
378    fListOfHistos->Add(fMothKinkMomSgnlD);
379    fListOfHistos->Add(fInvMassMuNuAll);
380    fListOfHistos->Add(fInvMassMuNuPt);
381    fListOfHistos->Add(fInvMassMuNuPtAll);
382    fListOfHistos->Add(fRatioCrossedRows);
383    fListOfHistos->Add(fRatioCrossedRowsKink);
384    fListOfHistos->Add(fRadiusPt);
385    fListOfHistos->Add(fRadiusPtcln);
386    fListOfHistos->Add(fRadiusPtKaon);
387    fListOfHistos->Add(fRadiusPtPion);
388    fListOfHistos->Add(fRadiusPtFake);
389    fListOfHistos->Add(fPtCut1);
390    fListOfHistos->Add(fPtCut2);
391    fListOfHistos->Add(fPtCut3);
392    fListOfHistos->Add(fAngMomKKinks);
393    fListOfHistos->Add(flengthMCK);
394    fListOfHistos->Add(flifetiMCK);
395    fListOfHistos->Add(flifetim2);
396    fListOfHistos->Add(fLHelESDK);
397    fListOfHistos->Add(flifeInt);
398    fListOfHistos->Add(flifeYuri);
399    fListOfHistos->Add(flenYuri);
400    fListOfHistos->Add(flenTrRef);
401    fListOfHistos->Add(flifeSmall); 
402    fListOfHistos->Add(flifetime); 
403    fListOfHistos->Add(flifTiESDK); 
404    fListOfHistos->Add(flifeKink); 
405    fListOfHistos->Add(flenHelx); 
406    fListOfHistos->Add(fradPtRapMC); 
407    fListOfHistos->Add(fradPtRapDC); 
408    fListOfHistos->Add(fradPtRapESD); 
409    fListOfHistos->Add(fRadNclcln); 
410
411   PostData(1, fListOfHistos);
412 }
413
414 //________________________________________________________________________
415 void AliAnalysisKinkESDMC::UserExec(Option_t *) 
416 {
417   // Main loop
418   // Called for each event
419
420   // Process MC truth, therefore we receive the AliAnalysisManager and ask it for the AliMCEventHandler
421   // This handler can return the current MC event
422   
423    AliVEvent *event = InputEvent();
424   if (!event) {
425      Printf("ERROR: Could not retrieve event");
426      return;
427   }
428
429   AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
430   if (!esd) {
431      Printf("ERROR: Could not retrieve esd");
432      return;
433 }
434
435   AliMCEvent* mcEvent = MCEvent();
436   if (!mcEvent) {
437      Printf("ERROR: Could not retrieve MC event");
438      return;
439   }
440      fMultMCK->Fill(mcEvent->GetNumberOfTracks() );
441 //
442
443
444 //   multiplicity selection 
445    Float_t refmultiplicity=fCutsMul->CountAcceptedTracks(esd);
446         if(fLowMulcut>-1)
447         {
448                 if(refmultiplicity<fLowMulcut)
449                         return;
450         }
451         if(fUpMulcut>-1)
452         {
453                 if(refmultiplicity>fUpMulcut)
454                         return;
455         }
456
457
458        fMultESDK->Fill(refmultiplicity);
459
460
461
462
463   Printf("MC particles: %d", mcEvent->GetNumberOfTracks());
464
465   AliStack* stack=mcEvent->Stack();
466   
467 //primary tracks  in MC
468          Int_t  nPrim = stack->GetNprimary();
469 //
470      
471   // loop over mc particles
472
473   // variable to count tracks
474   Int_t nMCTracks = 0;
475   Int_t nMCKinkKs = 0;
476
477 //   15/2/12 OK   for (Int_t iMc = 0; iMc < nPrim; iMc++)
478  //for (Int_t iMc = 0; iMc < stack->GetNtrack(); iMc++)
479  for (Int_t iMc = 0; iMc < mcEvent->GetNumberOfTracks(); iMc++)
480   {
481
482     TParticle* particle = stack->Particle(iMc);
483
484     if (!particle)
485     {
486     //  AliDebug(AliLog::kError, Form("UNEXPECTED: particle with label %d not found in stack (mc loop).", iMc));
487       continue;
488     }
489 // keep only primaries
490   if (!stack->IsPhysicalPrimary(iMc)) continue;
491
492  //   
493
494             Double_t ptK = particle->Pt();
495
496      if( ptK <0.200) continue;       //    12/2/2012
497 //
498
499                 Float_t charg=0;
500       Float_t code = particle->GetPdgCode();
501             Int_t  mcProcess=-1011;
502 //---------------------------------------kaon selection 
503       if ((code==321)||(code==-321)){
504             
505     
506           Double_t   etracKMC= TMath::Sqrt(particle->P() *particle->P()  + 0.493677 *0.493677  );
507          Double_t rapidiKMC = 0.5 * (TMath::Log(  (etracKMC +particle->Pz())/( etracKMC-particle->Pz() )) )  ;
508
509      if ( TMath::Abs( rapidiKMC) > 0.7) continue;   // 
510             frapidKMC ->Fill(rapidiKMC) ;  //18/feb rapiddistr of PDG kink ESD  kaons
511  
512             
513 //  maximum angle    vrs momentum
514   //   Double_t maxDecAnKmu=f1->Eval(particle->P(),      0.,0.,0.);
515  //       fmaxAngMomKmu->Fill(particle->P() , maxDecAnKmu);
516
517                if(code > 0 ) charg =1;
518                if(code < 0 ) charg =-1;
519                          Float_t chargPt= charg*ptK;
520
521               fptKMC->Fill(ptK);
522          fSignPtGen->Fill(chargPt);// kaon gensign pt
523               if (charg==1 )  fPtKPlMC->Fill( ptK );
524                if ( charg==-1) fPtKMnMC->Fill( ptK  );
525 // primary   vertex
526             //      Double_t mVx=particle->Vx();
527             //     Double_t mVy=particle->Vy();
528                  Double_t mVz=particle->Vz();
529 // 25/11/2012  ???????back 10/1/2013
530                                                 TClonesArray* trArray=0;
531                                                 TParticle* tempParticle=0;
532
533                                             TVector3 DecayMomentumK(0,0,0);  
534                                               Float_t lengthKMC=0;
535                       if (mcEvent->GetParticleAndTR(iMc, tempParticle, trArray) != -1) {
536                                                 AliTrackReference* MCtrackReference = static_cast<AliTrackReference*>(trArray->Last());
537                                                    lengthKMC = MCtrackReference->GetLength();
538  
539 //                      DecayMomentumK.SetXYZ(MCtrackReference->Px(), MCtrackReference->Py(), MCtrackReference->Pz());
540                                               }
541                    flenTrRef ->Fill(lengthKMC);
542          flifetime ->Fill(  (lengthKMC*0.493667  /particle->P()));  // 19/7
543                  if ((lengthKMC>100.)&& (lengthKMC<300.) )  flifeSmall->Fill( (lengthKMC*0.493667/particle->P() ) ); 
544
545        Int_t nMCKpi =0;
546        Int_t mcProc4 =0;
547        Int_t mcProc13=0;
548         Double_t radiusD=0;
549    //    Double_t lengthK =0.;
550        Double_t LengthK =0.;
551        Double_t lenYuri =0.;
552         Double_t MCQt =0.;
553         Double_t MCQt3[2];
554             Int_t firstD=particle->GetFirstDaughter();
555             Int_t lastD=particle->GetLastDaughter();
556
557              if( (lastD<=0) || (firstD<=0)  ) continue; 
558
559                      if ( lastD > mcEvent->GetNumberOfTracks() ) continue;
560                      if (firstD > mcEvent->GetNumberOfTracks() ) continue;
561 // 25/112012
562 //                                              TClonesArray* trArray=0;
563 //                                              TParticle* tempParticle=0;
564  //                                           TVector3 DecayMomentumK(0,0,0);  
565 //loop on secondaries
566              for (Int_t k=firstD;k<=lastD;k++) {
567               if ( k > 0 )    {
568              TParticle*    daughter1=stack->Particle(k);   // 27/8   
569              Float_t dcode = daughter1->GetPdgCode();
570
571 //     mother momentum trackrefs    and QtMC     // 17/9/2010,  test Feb 2011
572                                                 if (mcEvent->GetParticleAndTR(iMc, tempParticle, trArray) != -1) { 
573                                                 AliTrackReference* MCtrackReference = static_cast<AliTrackReference*>(trArray->Last());
574                         DecayMomentumK.SetXYZ(MCtrackReference->Px(), MCtrackReference->Py(), MCtrackReference->Pz());
575                               }
576                                                 const TVector3 MCP3d(daughter1->Px(), daughter1->Py(), daughter1->Pz()); //MC daughter's momentum
577                                                  MCQt = MCP3d.Perp(DecayMomentumK); //MC daughter's transverse momentum in mother's frame
578 //
579                   Double_t MCKinkAngle = TMath::ASin(MCQt/daughter1->P() ); 
580                 Double_t  MCKinkAngle2= TMath::RadToDeg() * MCKinkAngle; // in degrees 
581              //    fmaxAngMomKmu->Fill(particle->P() , MCKinkAngle2);// MC 
582 //
583              mcProcess=daughter1->GetUniqueID();
584                   radiusD=daughter1->R();
585 // secondary vertex
586                //   Double_t hVx=daughter1->Vx();
587               //  Double_t hVy=daughter1->Vy();
588                   Double_t hVz=daughter1->Vz();
589
590            LengthK = TMath::Sqrt( radiusD*radiusD  + ( mVz-hVz) * (mVz-hVz) );  //   19/7/2010 mss
591
592 //          lengthK = TMath::Sqrt( (mVx -hVx)*( mVx    -hVx)  + ( mVy    -hVy)* (mVy    -hVy ) + ( mVz   -hVz ) * (mVz     -hVz) );
593             lenYuri  = (TMath::Abs( mVz-hVz))* (TMath::Sqrt( 1.+ ( ptK*ptK)/ (particle->Pz() * particle->Pz()) )) ;
594
595        if(mcProcess==13) {
596     mcProc13++;
597                  
598       if(mcProc13==1)     flifeInt  ->Fill(  (lengthKMC*0.493667  /particle->P()));  // 19/7
599
600    //            if( (charg==1)&&(mcProc13==1 )) fradIntKP->Fill(daughter1->R());
601
602      //            if( ( charg ==-1)&&(mcProc13==1))  fradIntKM->Fill(daughter1->R());
603   }  
604
605
606 //
607      if (mcProcess==4) {        
608     
609     mcProc4++;
610    if ( mcProc4==1)  {
611    // 10/1/13                if( (radiusD >120.)&&( radiusD< 210.) )  {
612           flifeYuri ->Fill(  (lenYuri  *0.493667  /particle->P()));  // 19/7
613                   flifetiMCK->Fill(LengthK);
614                   flenYuri  ->Fill(lenYuri);
615 // 10/1/13                    }
616
617   //                    flengthMCK->Fill(lengthK);  //
618   //      flifetime ->Fill(  (lengthK*0.493667  /particle->P()));  // 19/7
619                       flengthMCK->Fill(lengthKMC);  //
620         flifetime ->Fill(  (lengthKMC*0.493667  /particle->P()));  // 19/7
621             fradPtRapMC->Fill( radiusD, 1./ptK, rapidiKMC);  // systematics 26/8
622   }
623
624
625 //
626     if (  ( ( code==321 )&&( dcode ==-13  ))||( ( code ==-321)&&(dcode== 13) ) || ( ( code==321 )&&( dcode ==-11  )) || ( (code ==-321)&&(dcode== 11))) {  
627                       flifetim2 ->Fill(  (lengthKMC*0.493667  /particle->P()));
628            //   8/2/2013allgh radius    if( (radiusD >120.)&&( radiusD< 210.) )  
629            //   14/2/13 if( (radiusD >130.)&&( radiusD< 200.) )  
630            if( (radiusD >fKinkRadLow )&&( radiusD< fKinkRadUp) )  
631                  fmaxAngMomKmu->Fill(particle->P() , MCKinkAngle2);// MC 
632               } 
633
634       if (( (TMath::Abs(code)==321 )&&(TMath::Abs(dcode)  ==211  ))&& ( mcProc4<2)) flifetim2->Fill( lengthKMC *0.493667 /particle->P()) ;//19/7
635
636      // test feb 2013                    if ((TMath::Abs(hVz)<0.5) || (TMath::Abs(hVz )>225)) continue;
637 ///   inside radius region ----------------------------------------------
638                        if(MCKinkAngle2 < 2.) continue;  // as in ESD 
639                         //          ======  8/2/13 if (((daughter1->R())>120)&&((daughter1->R())<210)&& (MCQt>0.120)  ){
640                         if (((daughter1->R())> fKinkRadLow )&&((daughter1->R())< fKinkRadUp )&& (MCQt>fLowQt)  ){
641
642         if ( ( code==321 )&&( dcode ==-13  ))   {  
643             fradPtRapDC->Fill( radiusD, 1./ptK, rapidiKMC);  // systematics 26/8
644                   fradMC->Fill(daughter1->R());
645             fQtKMuMC ->Fill(MCQt );//to muon
646             fgenPtEtR->Fill( ptK );//to muon
647             fgenPtEtRP->Fill( ptK );//to muon
648          fMCEtaKaon  ->Fill(rapidiKMC );//to muon
649          fSignPtEtaMC->Fill(ptK,rapidiKMC );//to muon
650          fSignPtMC->Fill(ptK);//to muon
651                  flifetiMCK->Fill(   lenYuri*0.4933667/particle->P()  );
652                     //  flifetiMCK->Fill(   LengthK*0.4933667/   ptK        
653     } //  positive kaon   
654         if (  ( code ==-321)&&(dcode== 13)){
655         fgenPtEtR->Fill(  ptK   );//to muon
656             fQtKMuMC ->Fill(MCQt );//to muon
657                fgenPtEtRN->Fill(ptK);  //  
658         fSignPtEtaMC->Fill(chargPt,rapidiKMC );//to muon
659         fMCEtaKaon  ->Fill(rapidiKMC );//to muon
660             fradPtRapDC->Fill( radiusD, 1./ptK, rapidiKMC);  // systematics 26/8
661                   fradMC->Fill(daughter1->R());
662          fSignPtMC->Fill(chargPt);//to muon
663                           flifetiMCK->Fill(   lenYuri*0.4933667/particle->P() ) ;
664           //           flifetiMCK->Fill(   LengthK*0.4933667/  ptK   ) ;  
665
666     } //  negative code
667       //  if (( ( code==321 )&& ( dcode ==211  ))|| (( code == -321 )&& ( dcode ==-211))) fgenPtEtR->Fill( ptK );//to pion
668         if ( ( code==321 )&&( dcode ==-11  ))   {  
669             fQtKElMC ->Fill(MCQt );//to muon
670             fgenPtEtR->Fill( ptK );//to electron
671             fgenPtEtRP->Fill( ptK );//to muon
672          fMCEtaKaon  ->Fill(rapidiKMC );//to electron
673             fradPtRapDC->Fill( radiusD, 1./ptK, rapidiKMC);  // systematics 26/8
674                   fradMC->Fill(daughter1->R());
675          fSignPtEtaMC->Fill(ptK,rapidiKMC );//to electron
676          fSignPtMC->Fill(ptK);
677                       flifetiMCK->Fill(   lenYuri*0.4933667/particle->P()  );
678         //             flifetiMCK->Fill(   LengthK*0.4933667/ ptK      );
679
680     } //  positive kaon   
681         if (  ( code ==-321)&&(dcode== 11)){
682         fgenPtEtR->Fill(   ptK  );//to electron
683             fQtKElMC ->Fill(MCQt );//to muon
684                fgenPtEtRN->Fill(ptK);  //  
685         fSignPtEtaMC->Fill(chargPt,rapidiKMC  );//to electron
686         fMCEtaKaon  ->Fill(rapidiKMC  );//to electron
687             fradPtRapDC->Fill( radiusD, 1./ptK, rapidiKMC);  // systematics 26/8
688                   fradMC->Fill(daughter1->R());
689          fSignPtMC->Fill(chargPt);//to electron 
690                               flifetiMCK->Fill(   lenYuri*0.4933667/particle->P()  );
691       //               flifetiMCK->Fill(   LengthK*0.4933667/   ptK         );
692
693     } //  negative code
694
695         if (( ( code==321 )&& ( dcode ==211  ))|| (( code == -321 )&& ( dcode ==-211)))    nMCKpi++ ; 
696         if (( ( code==321 )&& ( dcode ==211  ))|| (( code == -321 )&& ( dcode ==-211)))   {                
697                  if ( nMCKpi > 0) {
698               MCQt3[nMCKpi-1] = MCQt ;// k to pipipi 
699 }
700                        } 
701     nMCKinkKs++;
702        }
703
704                     }//    decay
705          } // positive k
706        }//  daughters
707
708
709
710                  if ( code > 0) {
711               if( nMCKpi == 1) fgenPtEtR->Fill(ptK);  //  k to pipi
712               if( nMCKpi == 1) fgenPtEtRP->Fill(ptK);  //  k to pipi
713               if( nMCKpi == 1) fSignPtEtaMC->Fill(ptK,rapidiKMC );  //  k to pipi
714               if( nMCKpi == 1) fSignPtMC->Fill(ptK);  //  k to pipi
715               if( nMCKpi == 1) fMCEtaKaon->Fill(rapidiKMC );  //  k to pipi
716                   if(nMCKpi==1) fradMC->Fill(radiusD       );
717                   if(nMCKpi==1) fQtKPiMC->Fill( MCQt   );
718                 if (nMCKpi==1)  fradPtRapDC->Fill( radiusD, 1./ptK, rapidiKMC);  // systematics 26/8
719                   if(nMCKpi==1)     flifetiMCK->Fill(   lenYuri*0.4933667/particle->P()  );
720              //   if(nMCKpi==1)     flifetiMCK->Fill(   LengthK*0.4933667/      ptK      );
721    }   //positive kaon 
722      //
723            if ( code < 0) {
724  
725               if( nMCKpi == 1) fgenPtEtR->Fill(   ptK );  //  k to pipi
726               if( nMCKpi == 1) fgenPtEtRN->Fill(ptK);  //  k to pipi
727               if( nMCKpi == 1) fSignPtEtaMC->Fill(chargPt,rapidiKMC );  //  k to pipi
728               if( nMCKpi == 1) fSignPtMC->Fill(chargPt);  //  k to pipi
729               if( nMCKpi == 1) fMCEtaKaon->Fill(rapidiKMC );  //  k to pipi
730                   if(nMCKpi==1) fradMC->Fill(radiusD       );
731                   if(nMCKpi==1) fQtKPiMC->Fill( MCQt   );
732                              if( nMCKpi== 1) fradPtRapDC->Fill( radiusD, 1./ptK, rapidiKMC);  // systematics 26/8
733                  if(nMCKpi==1)     flifetiMCK->Fill(   lenYuri*0.4933667/particle->P()  );
734          //       if(nMCKpi==1)     flifetiMCK->Fill(   LengthK*0.4933667/      ptK      );
735
736    }   //negative K
737
738       }   /// kaons  loop 
739
740
741       
742     nMCTracks++;
743   }// end of mc particle
744
745 //  Phys sel    2012 EFF calculation      
746 Bool_t isSelected =
747 ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()&AliVEvent::kMB;
748
749          if ( isSelected ==kFALSE) return;   //  24/6/11 apo MF
750 //
751        fMultiplMC->Fill(nPrim);
752 //=======================================================================================
753 //            main vertex selection 
754   const AliESDVertex *vertex=GetEventVertex(esd);
755     if(!vertex) return;
756 ///
757 //       fMultiplMC->Fill(nPrim);
758 //
759 /*  / apo Alexander  Feb 2012
760     AliESDpid *fESDpid = new AliESDpid();
761     if (!fESDpid) fESDpid =
762   ((AliESDInputHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetESDpid();                
763 */       ///========================================================================
764 //               apo Eftihi 
765                   if(!fPIDResponse) {
766     AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
767     AliInputEventHandler* inputHandler =
768 (AliInputEventHandler*)(man->GetInputEventHandler());
769     fPIDResponse = inputHandler->GetPIDResponse();
770   }
771
772   
773     Double_t vpos[3];
774      vertex->GetXYZ(vpos);
775     fZpr->Fill(vpos[2]);         
776     if ( TMath::Abs( vpos[2])  > 10. ) return;  ///  it is applied on ESD and generation 
777
778   Double_t vtrack[3], ptrack[3];
779   
780      
781  // Int_t nESDTracK = 0;
782
783    Int_t nGoodTracks =  esd->GetNumberOfTracks();
784 //
785     fESDMult->Fill(nGoodTracks);
786      
787 //
788       Double_t nsigmall = 100.0;
789        Double_t nsigma = 100.0;
790        Double_t nsigmaPion =-100.0;
791        Double_t nsigmaPi=-100.0;
792   //     Double_t dEdxDauMC  =   0.0;
793
794 //
795 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
796
797     AliESDtrack* trackD = esd->GetTrack(iTrack);
798     if (!trackD) {
799       Printf("ERROR: Could not receive track %d", iTrack);
800       continue;
801     }
802
803          //       Int_t indexKinkDau=trackD->GetKinkIndex(0);
804 // daughter kink 
805           nsigmaPion     = (fPIDResponse->NumberOfSigmasTPC(trackD  , AliPID::kPion));// 26/10 eftihis
806  //   nsigmaPion= (fESDpid->NumberOfSigmasTPC(trackD,AliPID::kPion));
807  //   22/11/12 if((indexKinkDau >0)&& (nsigmaPion>1.2)) fTPCSgnlKinkDau->Fill(trackD->P(), (trackD->GetTPCsignal()  ) ) ;  //  daughter kink 
808  //if((indexKinkDau >0)) fTPCSgnlKinkDau->Fill(trackD->P(), (trackD->GetTPCsignal()  ) ) ;  //  daughter kink 
809 // if((indexKinkDau >0))    dEdxDauMC   = trackD->GetTPCsignal()     ;  //  daughter kink 
810    }
811
812 // loop on ESD tracks 
813
814 //
815    for (Int_t iTracks = 0; iTracks < esd->GetNumberOfTracks(); iTracks++) {
816
817     AliESDtrack* track = esd->GetTrack(iTracks);
818     if (!track) {
819       Printf("ERROR: Could not receive track %d", iTracks);
820       continue;
821     }
822     
823
824
825 //    sigmas    
826              nsigmall  = (fPIDResponse->NumberOfSigmasTPC(track, AliPID::kKaon));
827 //    nsigma = TMath::Abs(fESDpid->NumberOfSigmasTPC(track,AliPID::kKaon));
828  //   nsigmall = (fESDpid->NumberOfSigmasTPC(track,AliPID::kKaon));
829        nsigma  = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(track, AliPID::kKaon));
830
831 //==================================
832   Float_t nCrossedRowsTPC = track->GetTPCClusterInfo(2,1);
833   Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
834   if (track->GetTPCNclsF()>0) {
835     ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / track->GetTPCNclsF();
836     fRatioCrossedRows->Fill(ratioCrossedRowsOverFindableClustersTPC);
837    }
838
839     fHistPt->Fill(track->Pt());
840
841     
842   Double_t tpcNCl = track->GetTPCclusters(0);  // 
843   //Int_t tpcNCl = track->GetTPCclusters(0);  // 
844      Double_t tpcSign = track->GetSign();  // 
845
846   Int_t label = track->GetLabel();
847
848     label = TMath::Abs(label);
849
850      if(label > mcEvent->GetNumberOfTracks()) continue; //  
851
852     TParticle * part = stack->Particle(label);
853     if (!part) continue;
854 // loop only on Primary tracks
855      if (label > nPrim) continue; /// primary tracks only   ,21/3/10  EFF study
856
857      //    pt cut 
858       if ( (track->Pt())<.200)continue;   //12/2/2012     -------------------------------------------
859
860     UInt_t status=track->GetStatus();
861
862      if((status&AliESDtrack::kITSrefit)==0) continue;
863     if((status&AliESDtrack::kTPCrefit)==0) continue;   //6 feb
864      //  if((track->GetTPCchi2()/track->GetTPCclusters(0))>3.8) continue;
865      //if((track->GetTPCchi2()/track->GetTPCclusters(0))>4.5) continue;   // test 10/3/2012
866      if((track->GetTPCchi2()/track->GetTPCclusters(0))>4.0) continue;   // test 10/3/2012
867
868       Double_t extCovPos[15];
869       track->GetExternalCovariance(extCovPos);    
870 //   
871
872
873     track->GetXYZ(vtrack);
874  fXvYv->Fill(vtrack[0],vtrack[1]);  
875  fZvYv->Fill(vtrack[0],vtrack[2]);  
876  fZvXv->Fill(vtrack[1],vtrack[2]);  
877
878 // track momentum
879      track->GetPxPyPz(ptrack);
880     
881     TVector3 trackMom(ptrack[0],ptrack[1],ptrack[2]);
882     
883           Double_t   etracK= TMath::Sqrt(trackMom.Mag()*trackMom.Mag() + 0.493677 *0.493677  );
884          Double_t rapiditK = 0.5 * (TMath::Log(  (etracK + ptrack[2]  ) / ( etracK - ptrack[2])  ))  ;
885     Double_t trackEta=trackMom.Eta();
886    // Double_t trMoment= trackMom.Mag();
887     Double_t trackPt = track->Pt();
888     
889       
890     Float_t bpos[2];
891     Float_t bCovpos[3];
892     track->GetImpactParameters(bpos,bCovpos);
893     
894     if (bCovpos[0]<=0 || bCovpos[2]<=0) {
895      Printf("Estimated b resolution lower or equal zero!");
896      bCovpos[0]=0; bCovpos[2]=0;
897     }
898
899     Float_t dcaToVertexXYpos = bpos[0];
900 //    Float_t dcaToVertexZpos = bpos[1];
901     
902     //fRpr->Fill(dcaToVertexZpos);
903     fRpr->Fill(dcaToVertexXYpos);
904
905           //if((TMath::Abs(dcaToVertexXYpos) >0.3)||(TMath::Abs(dcaToVertexZpos)>2.5)) continue;  //   22/7/11
906    //       if((TMath::Abs(dcaToVertexXYpos) >0.24)||(TMath::Abs(dcaToVertexZpos)>2.5)) continue;  //   12/2/13
907                      if (!fMaxDCAtoVtxCut->AcceptTrack(track)) continue;
908     
909
910  //  cut on eta 
911  //       if(  (TMath::Abs(trackEta )) > 0.9 ) continue;
912         if(  (TMath::Abs(rapiditK  )) > 0.7 ) continue; ////   rapid K, Feb 20
913     fHistPtESD->Fill(track->Pt());
914
915    // Add Kink analysis
916    
917                 Int_t indexKinkPos=track->GetKinkIndex(0);
918 //  loop on mother kinks
919                 if(indexKinkPos<0){
920                fPtKink->Fill(track->Pt()); /// pt from track
921
922                     fRatioCrossedRowsKink->Fill(ratioCrossedRowsOverFindableClustersTPC);
923
924         // select kink class    
925
926           AliESDkink *kink=esd->GetKink(TMath::Abs(indexKinkPos)-1);
927 //
928         
929 // DCA kink
930           Double_t  Dist2 = kink->GetDistance();
931   //        fDCAkink->Fill( Dist2   );
932 //
933           Int_t eSDfLabel1=kink->GetLabel(0);
934           TParticle *particle1= stack->Particle(TMath::Abs(eSDfLabel1));
935           Int_t code1= particle1->GetPdgCode();
936  //         Int_t mcProcssMo= particle1->GetUniqueID();
937           
938           Int_t eSDfLabeld=kink->GetLabel(1);
939           TParticle *particled= stack->Particle(TMath::Abs(eSDfLabeld));
940           Int_t dcode1= particled->GetPdgCode();
941           Int_t mcProcssDa= particled->GetUniqueID();
942 //
943 //    loop on MC daugthres for 3Pi    24/9/2010
944        Int_t nESDKpi =0;
945        if(mcProcssDa==4) {
946             Int_t firstDa=particle1->GetFirstDaughter();
947             Int_t lastDa=particle1->GetLastDaughter();
948
949              if( (lastDa<=0) || (firstDa<=0)  ) continue; 
950
951                      if ( lastDa > mcEvent->GetNumberOfTracks() ) continue;
952                      if (firstDa > mcEvent->GetNumberOfTracks() ) continue;
953 //loop on secondaries
954              for (Int_t kk=firstDa;kk<=lastDa;kk++) {
955               if ( kk > 0 )    {
956              TParticle*    daughter3=stack->Particle(kk);   // 24/9   
957              Float_t dcode3= daughter3->GetPdgCode();
958         if (( ( code1==321 )&& ( dcode3==211  ))|| (( code1 == -321 )&& ( dcode3==-211)))    nESDKpi++ ; 
959              }
960              }
961              }
962 //---------------------------edw telos  9/2010
963                   Double_t hVzdau=particled->Vz();
964
965            const TVector3 motherMfromKink(kink->GetMotherP());
966            const TVector3 daughterMKink(kink->GetDaughterP());
967            Float_t qT=kink->GetQt();
968     //   Float_t motherPt=motherMfromKink.Pt();
969 // Kink  mother momentum 
970 //     Double_t trMomTPCKink=motherMfromKink.Mag();
971 // TPC mother momentun
972   //   Double_t trMomTPC=track->GetTPCmomentum();
973        //     Float_t etaMother=motherMfromKink.Eta();
974
975
976            fHistQtAll->Fill(qT) ;  //  Qt   distr
977         
978            const TVector3 vposKink(kink->GetPosition());
979           fPosiKink ->Fill( vposKink[0], vposKink[1]  );
980
981                    Double_t dxKink = vpos[0]-vposKink[0], dyKink=vpos[1]-vposKink[1], dzKink=vpos[2]-vposKink[2] ;
982   //   Double_t  dzKink=vpos[2]-vposKink[2] ;    ///  ??
983    Double_t lifeKink= TMath::Sqrt( dxKink*dxKink + dyKink*dyKink + dzKink*dzKink ) ;
984
985              Double_t  tanLamda   = track-> GetTgl()    ;//  ??
986                                   if (tanLamda ==0 )  continue;//   ??
987         Double_t lenHelx = (TMath::Abs(dzKink    )   ) *(TMath::Sqrt( 1. + tanLamda *tanLamda  ) ) / ( TMath::Abs( tanLamda))  ;// ??
988
989
990
991
992            Float_t kinkAngle=TMath::RadToDeg()*kink->GetAngle(2);
993
994 //       fake kinks, small Qt and small kink angle
995     if(( kinkAngle<1.))  fHistQt1  ->Fill(qT) ;  //  Qt   distr
996 //
997     if(       ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==321))) fFakeKPi->Fill(track->Pt());
998     if(       ( (TMath::Abs(code1)==211)&&(TMath::Abs(dcode1)==211))) fFakepipi->Fill(track->Pt());
999 //
1000
1001 //remove the double taracks 
1002            if( (kinkAngle<2.)  ) continue;    // test 15/7 2010 , it removes 3  from   10000 good Kaons 
1003          //  BG  ?????==============
1004               if ( TMath::Abs(vposKink[2]) >  225. ) continue ; 
1005               if ( TMath::Abs(vposKink[2]) <  0.5 ) continue ; 
1006
1007                     fPtCut1   ->Fill(trackPt );
1008                   fChi2NclTPC->Fill( (track->GetTPCchi2() ) ,  tpcNCl );
1009
1010              Float_t signPt= tpcSign*trackPt;
1011 //
1012            if  ( (TMath::Abs(code1)==211)&&(TMath::Abs(dcode1)==13))      
1013            fRadiusPtPion->Fill( kink->GetR(), track->Pt()); //
1014
1015          if(       ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==13))||    
1016            ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==11))  ||    
1017            ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==211))  ) { 
1018            fRadiusPtKaon->Fill( kink->GetR(), track->Pt()); //
1019               }
1020 //
1021          // ======8/1/13 if((kink->GetR()>120.)&&(kink->GetR()<210.)&&(TMath::Abs(rapiditK)<0.7)&&(label<nPrim)) {
1022          if((kink->GetR()> fKinkRadLow )&&(kink->GetR()< fKinkRadUp )&&(TMath::Abs(rapiditK)<0.7)&&(label<nPrim)) {
1023     if(       ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==13))) fQtKMu->Fill(qT);
1024     if     ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==11))   fQtKEl->Fill(qT); 
1025     if     ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==211))   fQtKPi->Fill(qT); 
1026     if  (( nESDKpi>1) &&    ( ((code1)==321)&&((dcode1)==211)) )   fQtK3PiP->Fill(qT); 
1027     if  (( nESDKpi>1) &&    ( ((code1)==-321)&&((dcode1)==-211)) )   fQtK3PiM->Fill(qT); 
1028          if(       ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==13))||    
1029            ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==11))  ||    
1030            ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==211))  ) { 
1031          if(qT>fLowQt)        fHistPtKPDG->Fill(track->Pt());  // ALL KAONS (pdg) inside ESD  kink sample
1032         if(qT>fLowQt )    {
1033       if(code1>0.)  fHiPtKPDGP->Fill(trackPt             ); // 26/feb  // ALL KAONS (pdg) inside ESD  kink sample
1034       if(code1<0.)  fHiPtKPDGN->Fill(      trackPt       ); // 26/feb  // ALL KAONS (pdg) inside ESD  kink sample
1035                    }
1036             fHistEta->Fill(trackEta) ;  //   Eta distr of PDG kink ESD  kaons
1037             frapidESDK->Fill(rapiditK) ;  //18/feb rapiddistr of PDG kink ESD  kaons
1038       if( qT > fLowQt  )  fHistQt2->Fill(qT);  // PDG ESD kaons            
1039            fRadiusPt->Fill( kink->GetR(), track->Pt()); //
1040      }
1041      }
1042
1043
1044            //Double_t maxDecAngKmu=f1->Eval(motherMfromKink.Mag(),0.,0.,0.);
1045            Double_t maxDecAngKmu=f1->Eval(track->P(),      0.,0.,0.);
1046            Double_t maxDecAngpimu=f2->Eval(track->P(),   0.,0.,0.);
1047 //  two dimensional plot 
1048                 if(TMath::Abs(code1)==321) fAngMomK->Fill(track->P(),            kinkAngle); 
1049                 if(TMath::Abs(code1)==211) fAngMomPi->Fill( track->P(), kinkAngle); 
1050 //_______
1051
1052 //
1053 // invariant mass of mother track decaying to mu
1054          Float_t energyDaughterMu=TMath::Sqrt(daughterMKink.Mag()*daughterMKink.Mag()+0.105658*0.105658);
1055          Float_t energyDaughterPi=TMath::Sqrt(daughterMKink.Mag()*daughterMKink.Mag()+0.139570*0.139570);
1056          Float_t energyDaughterKa=TMath::Sqrt(daughterMKink.Mag()*daughterMKink.Mag()+0.493677*0.493677);
1057 //       Float_t energyDaughterPr=TMath::Sqrt(daughterMKink.Mag()*daughterMKink.Mag()+0.938658*0.938658);
1058          Float_t p1XM= motherMfromKink.Px();
1059          Float_t p1YM= motherMfromKink.Py();
1060          Float_t p1ZM= motherMfromKink.Pz();
1061          Float_t p2XM= daughterMKink.Px();
1062          Float_t p2YM= daughterMKink.Py();
1063          Float_t p2ZM= daughterMKink.Pz();
1064          Float_t p3Daughter=TMath::Sqrt(((p1XM-p2XM)*(p1XM-p2XM))+((p1YM-p2YM)*(p1YM-p2YM))+((p1ZM-p2ZM)*(p1ZM-p2ZM)));
1065          Double_t invariantMassKmu= TMath::Sqrt((energyDaughterMu+p3Daughter)*(energyDaughterMu+p3Daughter)-motherMfromKink.Mag()*motherMfromKink.Mag());
1066          Double_t invariantMassKpi= TMath::Sqrt((energyDaughterPi+p3Daughter)*(energyDaughterPi+p3Daughter)-motherMfromKink.Mag()*motherMfromKink.Mag());
1067          Double_t invariantMassKK = TMath::Sqrt((energyDaughterKa+p3Daughter)*(energyDaughterKa+p3Daughter)-motherMfromKink.Mag()*motherMfromKink.Mag());
1068          fInvMassMuNuAll ->Fill(invariantMassKmu);
1069          fInvMassMuNuPtAll ->Fill(invariantMassKmu,  trackPt);
1070            //    20/4 testRadiusPt->Fill( kink->GetR(), track->Pt()); //
1071   
1072
1073                if (qT> fLowQt )     fSignPtNcl->Fill( signPt  ,   tpcNCl   );
1074
1075 //
1076     //  if((qT>0.12)&&((kink->GetR()>120.)&&(kink->GetR()<210.))&&(TMath::Abs(rapiditK )<0.7)) {
1077     if((qT> fLowQt )&&((kink->GetR()> fKinkRadLow )&&(kink->GetR()< fKinkRadUp ))&&(TMath::Abs(rapiditK )<0.7)) {
1078          fM1kaon->Fill(invariantMassKmu);
1079          fMinvPi->Fill(invariantMassKpi);
1080          fMinvKa->Fill(invariantMassKK);
1081          fRadiusNcl->Fill( (kink->GetR()) ,(track->GetTPCclusters(0)  ) ) ;
1082                         }
1083
1084 //
1085          //  if ( tpcNCl<30  ) continue;
1086       //   test for systematics  , march 13   if ( tpcNCl<50. ) continue;
1087             if ( tpcNCl<fLowCluster  ) continue;
1088       //   if (  ( tpcNCl<20. )|| ( tpcNCl > 100.)  )  continue;//   test   , den edwse kati shmantiko
1089
1090                              //if( ( ( track->GetTPCclusters(0) ) / (kink->GetR() ) ) > 0.63 ) continue;
1091       Double_t tpcNClHigh = -51.67+ (11./12.)  *( kink->GetR() ) ;
1092          if (tpcNCl >  tpcNClHigh  )   fcodeH->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1093         if (  tpcNCl  >tpcNClHigh)   fZkinkZDau->Fill( vposKink[2],hVzdau              );
1094            if (tpcNCl > tpcNClHigh) fRadiusPtFake->Fill( kink->GetR(), track->Pt()); //
1095
1096      Double_t tpcNClMin  = -85.5 + (65./95.)  *( kink->GetR() ) ;
1097                // if ( tpcNClMin < tpcNCl ) continue;   
1098                if ( tpcNCl > tpcNClHigh) continue;
1099                if ( tpcNCl < tpcNClMin ) continue;
1100  //
1101
1102 //  kaon selection from kinks
1103            
1104    //=====  8/2/13 if((kinkAngle>maxDecAngpimu)&&(qT>0.12)&&(qT<0.30)&&((kink->GetR()>120.)&&(kink->GetR()<210.))&&(TMath::Abs(rapiditK )<0.7)&&(invariantMassKmu<0.8)) {
1105    if((kinkAngle>maxDecAngpimu)&&(qT>fLowQt )&&(qT<0.30)&&((kink->GetR()> fKinkRadLow )&&(kink->GetR()< fKinkRadUp ))&&(TMath::Abs(rapiditK )<0.7)&&(invariantMassKmu<0.8)) {
1106 // 29092010     if((kinkAngle>maxDecAngpimu)&&(qT>0.120)&&(qT<0.25)&&((kink->GetR()>120.)&&(kink->GetR()<210.))&&(TMath::Abs(rapiditK )<0.7)&&(invariantMassKmu<0.6)) {
1107 //  if((kinkAngle>maxDecAngpimu)&&(qT>0.04)&&(qT<0.30)&&((kink->GetR()>133.)&&(kink->GetR()<179.))&&(TMath::Abs(rapiditK )<0.5)&&(invariantMassKmu<0.6)) {   
1108
1109                 fAngMomKKinks->Fill(track->P(), kinkAngle);
1110             fPtCut2   ->Fill(trackPt );
1111
1112                  if ( (kinkAngle>maxDecAngKmu*0.98)&& ( track->P() > 1.2 ) ) continue; // maximum angle s
1113                  if ( (kinkAngle<maxDecAngpimu*1.20)  )  continue; // maximum angle s
1114
1115                 fPtCut3   ->Fill(trackPt );
1116      //fTPCSgnlPa->Fill(track->P(),track->GetTPCsignal());
1117      fTPCSgnlPa->Fill(track->GetInnerParam()->GetP(),track->GetTPCsignal());
1118                 //    if( nsigma > 3.5 )      fcode2->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1119                   if(nsigma  > 3.5) continue;  // 1/11/12
1120       // test 16/2/13           if(nsigma  > 3.5) continue;  // 15/2/13
1121                //  if(nsigma  > 4.0) continue; // test 17/2/2011  4% or more ? bg? 
1122 //
1123    fTPCSgnlP->Fill(track->GetInnerParam()->GetP(), (track->GetTPCsignal()  ) ) ;
1124           
1125          fInvMassMuNuPt ->Fill(invariantMassKmu,  trackPt);
1126 //  loop on kink daughters inside  mother's loop 
1127           Int_t ESDLabelM   =  0. ;                                      
1128           Int_t ESDLabelD   =  0. ;                                      
1129        Double_t dEdxDauMC  =   0.0;
1130         Double_t raDAU=0.;
1131         Int_t Ikink =0;
1132         Int_t IRkink =0;
1133 for (Int_t jTrack = 0; jTrack < esd->GetNumberOfTracks(); jTrack++) {
1134
1135     AliESDtrack* trackDau = esd->GetTrack(jTrack);
1136     if (!trackDau) {
1137       Printf("ERROR: Could not receive track %d", jTrack);
1138       continue;
1139     }
1140                 Int_t indexKinkDAU =trackDau->GetKinkIndex(0);
1141                      if (indexKinkDAU <0  ){
1142           AliESDkink *kinkDau=esd->GetKink(TMath::Abs(indexKinkDAU)-1);
1143                raDAU= kinkDau->GetR();
1144            ESDLabelM=kinkDau->GetLabel(0);   //  mothers's label
1145                 ESDLabelM = TMath::Abs(ESDLabelM);
1146            ESDLabelD=kinkDau->GetLabel(1);   //  Daughter'slabel
1147                 ESDLabelD = TMath::Abs(ESDLabelD);
1148                      if ( kink->GetR() == kinkDau->GetR() ) IRkink++;
1149                      if ( ESDLabelM == label ) Ikink++  ;
1150    }
1151   //           if (( ESDLabelM== eSDfLabel1))   { 
1152              if (   (Ikink >0)  && (IRkink>0 )       )   { 
1153 // daughter kink 
1154      //if(indexKinkDAU >0)     nsigmaPi     = (fPIDResponse->NumberOfSigmasTPC(trackDau,AliPID::kPion));// 26/10 eftihis
1155      if(indexKinkDAU >0)     nsigmaPi     = (fPIDResponse->NumberOfSigmasTPC(trackDau,AliPID::kKaon));// 26/10 eftihis
1156  //   nsigmaPion= (fESDpid->NumberOfSigmasTPC(trackD,AliPID::kPion));
1157  //   22/11/12 if((indexKinkDau >0)&& (nsigmaPion>1.2)) fTPCSgnlKinkDau->Fill(trackD->P(), (trackD->GetTPCsignal()  ) ) ;  //  daughter kink 
1158  //if((indexKinkDau >0)) fTPCSgnlKinkDau->Fill(trackD->P(), (trackD->GetTPCsignal()  ) ) ;  //  daughter kink 
1159  if((indexKinkDAU      >0))    dEdxDauMC   = trackDau->GetTPCsignal()     ;  //  daughter kink 
1160    }
1161    }
1162 // end internal loop for kink daughters
1163
1164       //   fTPCSgnlP->Fill(trMomTPC  , (track->GetTPCsignal()  ) ) ;
1165       //   fTPCSgnlPtpc->Fill(trMomTPC  , (track->GetTPCsignal()  ) ) ;
1166          //fMothKinkMomSgnl ->Fill(trMomTPCKink  , (track->GetTPCsignal()  ) ) ;
1167      //    fMothKinkMomSgnl ->Fill( dEdxDauMC     , (track->GetTPCsignal()  ) ) ;
1168          // fTPCMomNSgnl->Fill(trMomTPC ,pidResponse->NumberOfSigmasTPC(track, AliPID::kKaon)  );     
1169          fNSigmTPC   ->Fill(nsigmall );
1170 //  daughter selection 
1171   //fTPCSgnlKinkDau->Fill( daughterMKink.Mag() ,     dEdxDauMC  ) ;  //  daughter kink 
1172            // if(  nsigmaPion > 1.0 )        fcode4->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1173        //    if( dEdxDauMC > 1.5 *(track->GetTPCsignal()   ) )       fcode4->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1174 // 
1175          //fTPCMomNSgnl->Fill(trMomTPC ,nsigmall );
1176          fTPCMomNSgnl->Fill(track->GetInnerParam()->GetP() ,nsigmall );
1177 //
1178
1179           fRadNclcln->Fill( (kink->GetR()) ,(track->GetTPCclusters(0)  ) ) ;
1180            fRadiusPtcln->Fill( kink->GetR(), trackPt); // 
1181
1182              fAngMomKC->Fill(track->P()           , kinkAngle);
1183                                     fHistPtKaon->Fill(track->Pt()         );   //all PID kink-kaon
1184         if( code1>0.)     fHistPtKaoP->Fill(track->Pt()         );   //all PID kink-kaon
1185         if( code1<0.)    fHistPtKaoN->Fill(track->Pt()         );   //all PID kink-kaon
1186 // systematics
1187                  fradPtRapESD->Fill(kink->GetR(), 1./ track->Pt(), rapiditK);
1188 //
1189                 fHistEtaK->Fill(rapiditK );
1190                  frad->Fill( kink->GetR() );
1191                flenHelx->Fill( lenHelx   );  //??
1192                 flifeKink ->Fill(lifeKink      );//??
1193                         fLHelESDK ->Fill(  ( lenHelx /track->P() )*0.493677);// for all 'PID' kaons  31/7/11// ??
1194                       flifTiESDK->Fill(  ( lifeKink    /track->P() )*0.493677);  //  ??
1195
1196
1197  
1198                   fSignPtNcl->Fill( signPt  ,   tpcNCl   );
1199                   fSignPtEta->Fill(signPt  , rapiditK  );
1200                   fEtaNcl->Fill(rapiditK, tpcNCl    );
1201                   fSignPt->Fill( signPt   );
1202        fRatChi2Ncl-> Fill((track->GetTPCchi2()/track->GetTPCclusters(0) )) ;
1203     fdcatoVxXY->Fill(dcaToVertexXYpos);
1204
1205 //  kaons from k to mun and k to pipi and to e decay 
1206          if(       ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==13))||    
1207            ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==11))  ||    
1208            ( (TMath::Abs(code1)==321)&&(TMath::Abs(dcode1)==211))  ) { 
1209
1210          if ( label<=nPrim ) fPtPrKink->Fill(track->Pt());
1211
1212                                   //         flifetim2  ->Fill(  ( lenHelx /track->P() )*0.493667); // to compare with fLHelESDK
1213                       flifTiESDK->Fill(  ( lifeKink    /track->P() )*0.493667);
1214
1215
1216
1217               fKinkKaon->Fill(track->Pt());        
1218           fDCAkink->Fill( Dist2   );
1219           fPosiKinkK->Fill( vposKink[0], vposKink[1]  );
1220           fPosiKinKXZ->Fill( vposKink[0], vposKink[2]  );
1221           fPosiKinKYZ->Fill( vposKink[1], vposKink[2]  );
1222         if( code1>0.)     fkinkKaonP->Fill(trackPt);  //                  kPtPID kink-kaon
1223         if( code1<0.)    fkinkKaonN->Fill(trackPt);    //    PID kink-kaon
1224 //     daughters
1225            if((((nsigmaPi) > 0.)&& ( dEdxDauMC > 70.  ) ))       fcode4->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1226           if ( TMath::Abs(dEdxDauMC - track->GetTPCsignal() ) <  2)  fcode2->Fill( TMath::Abs(code1), TMath::Abs(dcode1));  
1227        //  fTPCSgnlPtpc->Fill(trMomTPC  , (track->GetTPCsignal()  ) ) ;
1228   fTPCSgnlPtpc   ->Fill( daughterMKink.Mag() ,     dEdxDauMC  ) ;  //  daughter kink 
1229          fMothKinkMomSgnlD->Fill( dEdxDauMC     , (track->GetTPCsignal()  ) ) ;
1230                              }
1231          else {
1232               fKinkKaonBg->Fill(track->Pt());     
1233          fMothKinkMomSgnl ->Fill( dEdxDauMC     , (track->GetTPCsignal()  ) ) ;
1234 //  fTPCSgnlKinkDau->Fill( daughterMKink.Mag() ,     dEdxDauMC  ) ;  //  daughter kink 
1235    //        if( dEdxDauMC > 1.5 *(track->GetTPCsignal()   ) )       fcode4->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1236       //     if(( (track->P())<1. )&& ( dEdxDauMC > 1.5 *(track->GetTPCsignal()   ) ))   fcodeDau1  ->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1237            if( (( nsigmaPi) > 0. ) && ((  dEdxDauMC > 70  ) ))   fcodeDau1  ->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1238           if ( TMath::Abs(dEdxDauMC - track->GetTPCsignal() ) <  2)  fcodeDau2->Fill( TMath::Abs(code1), TMath::Abs(dcode1));  
1239   fTPCSgnlKinkDau->Fill( daughterMKink.Mag() ,     dEdxDauMC  ) ;  //  daughter kink 
1240 //
1241          fMinvPr->Fill(invariantMassKmu);
1242 //
1243           fDCAkinkBG->Fill( Dist2   );
1244           fPosiKinKBgXY->Fill( vposKink[0], vposKink[1]  );
1245           fPosiKinKBgZY->Fill( vposKink[2], vposKink[1]  );
1246           fPosiKinKBgZX->Fill( vposKink[2], kink->GetR() );  //  31/7/11 
1247         if( code1>0.)     fKinKBGP  ->Fill(   trackPt          );   //all PID kink-kaon
1248         if( code1<0.)     fKinKBGN  ->Fill( trackPt          );   //all PID kink-kaonl
1249  fdcodeH->Fill( TMath::Abs(code1), TMath::Abs(dcode1));   // put it here,  22/10/2009
1250  //        if (eSDfLabel1==eSDfLabeld)   fcodeH->Fill(TMath::Abs(code1), TMath::Abs(dcode1));
1251    //      if (eSDfLabeld>nPrim     )   fZkinkZDau->Fill( vposKink[2],hVzdau              );
1252
1253           }   // primary and all +BG    
1254
1255         }  //  kink selection 
1256                   
1257
1258         }  //End Kink Information    
1259   
1260
1261   } //track loop 
1262
1263 //                                       } // vx 10 cm only on  esd
1264   PostData(1, fListOfHistos);
1265
1266 }      
1267
1268 //________________________________________________________________________
1269 void AliAnalysisKinkESDMC::Terminate(Option_t *) 
1270 {
1271   // Draw result to the screen 
1272   // Called once at the end of the query
1273
1274 }
1275
1276 const AliESDVertex* AliAnalysisKinkESDMC::GetEventVertex(const AliESDEvent* esd) const
1277   // Get the vertex from the ESD and returns it if the vertex is valid
1278   
1279 {
1280   // Get the vertex 
1281   
1282 // 10/4  const AliESDVertex* vertex = esd->GetPrimaryVertex();
1283   const AliESDVertex* vertex = esd->GetPrimaryVertexTracks();
1284
1285   //if((vertex->GetStatus()==kTRUE)&&(vertex->GetNContributors()>2)) return vertex;
1286   if((vertex->GetStatus()==kTRUE)) return vertex;
1287   else
1288   { 
1289      vertex = esd->GetPrimaryVertexSPD();
1290       if((vertex->GetStatus()==kTRUE)&&(vertex->GetNContributors()>0)) return vertex;
1291   //   if((vertex->GetStatus()==kTRUE)) return vertex;
1292      else
1293      return 0;
1294   }
1295 }