1 /*************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 // Class for impact parameter (DCA) of charged particles
17 // Study resolution and pull: prepare for beauty study
20 // Hongyan Yang <hongyan@physi.uni-heidelberg.de>
21 // Carlo Bombonati <carlo.bombonati@cern.ch>
27 #include <TParticle.h>
28 #include "AliMCParticle.h"
29 #include "AliESDtrack.h"
30 #include "AliESDEvent.h"
31 #include "AliMCEvent.h"
33 #include "AliHFEdca.h"
37 //________________________________________________________________________
38 const Char_t* AliHFEdca::fgkParticles[12] = {
40 "electron", "muonMinus","pionMinus", "kaonMinus", "protonMinus",
41 "positron", "muonPlus", "pionPlus", "kaonPlus", "protonPlus",
42 "allNegative", "allPositive"
44 //________________________________________________________________________
45 const Int_t AliHFEdca::fgkColorPart[12] = {
46 // colors assigned to particles
47 kRed, kBlue, kGreen+2, kYellow+2, kMagenta,
48 kRed+2, kBlue+2, kGreen+4, kYellow+4, kMagenta+2,
54 //________________________________________________________________________
55 const Float_t AliHFEdca::fgkPtIntv[44] = {
57 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,
58 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8,
59 3.0, 3.3, 3.6, 3.9, 4.2, 4.5, 5.0, 5.5, 6.0, 6.5,
60 7.0, 8.0, 9.0, 10., 11., 12., 13., 14., 15., 16.,
63 //________________________________________________________________________
64 const Char_t *AliHFEdca::fgkDcaVar[2] = {
65 "deltaDcaXY", "deltaDcaZ"};
67 //________________________________________________________________________
68 const Char_t *AliHFEdca::fgkDcaVarTitle[2] ={
69 ";residual #Delta(d_{xy}) [#mum];couts", ";residual #Delta(d_{z}) [#mum];counts"};
72 //________________________________________________________________________
73 const Char_t *AliHFEdca::fgkPullDcaVar[2] = {
74 "pullDcaXY", "pullDcaZ"
77 //________________________________________________________________________
78 const Char_t *AliHFEdca::fgkPullDcaVarTitle[2] = {
79 ";(dca_{xy}^{ESD}-dca_{xy}^{MC})/(#sigma_{track}#oplus#sigma_{Vxy});counts",
80 ";(dca_{z}^{ESD}-dca_{z}^{MC})/(#sigma_{track}#oplus#sigma_{Vz}); counts"
83 //________________________________________________________________________
84 AliHFEdca::AliHFEdca():
89 // default constructor
93 //________________________________________________________________________
94 AliHFEdca::AliHFEdca(const AliHFEdca &dca):
103 //_______________________________________________________________________________________________
105 AliHFEdca::operator=(const AliHFEdca &)
108 // Assignment operator
111 Printf("Not yet implemented.");
115 //________________________________________________________________________
116 AliHFEdca::~AliHFEdca()
118 // default destructor
120 for(Int_t j=0; j<kNParticles; j++){
121 for(Int_t i=0; i<kNPtBins; i++){
122 if(fHistDcaXYRes[j][i]) delete fHistDcaXYRes[j][i];
123 if(fHistDcaZRes[j][i]) delete fHistDcaZRes[j][i];
124 if(fHistDcaXYPull[j][i]) delete fHistDcaXYPull[j][i];
125 if(fHistDcaXYPull[j][i]) delete fHistDcaZPull[j][i];
129 if(fResidualList) delete fResidualList;
130 if(fPullList) delete fPullList;
132 Printf("analysis done\n");
135 //________________________________________________________________________
136 void AliHFEdca::InitAnalysis(){
138 Printf("initialize analysis\n");
143 //________________________________________________________________________
144 void AliHFEdca::PostAnalysis() const
147 // moved to dcaPostAnalysis.C
150 //________________________________________________________________________
151 void AliHFEdca::CreateHistogramsResidual(TList *residualList){
156 fHistDcaXYRes[kNParticles][kNPtBins]=0x0;
157 fHistDcaZRes[kNParticles][kNPtBins]=0x0;
159 const Int_t nBins = 1000;
160 const Float_t maxXYBin = 1000.;
161 const Float_t maxZBin = 1000.;
164 for(Int_t k=0; k<kNDcaVar; k++){
165 TString histTitle((const char*)fgkDcaVarTitle[k]);
167 for(Int_t j=0; j<kNParticles; j++){
168 for(Int_t i=0; i<kNPtBins; i++){
170 TString histName((const char*)fgkParticles[j]);
172 histName += Form("_%s_pT-%.1f-%.1f", (const char*)fgkDcaVar[k], fgkPtIntv[i], fgkPtIntv[i+1]);
175 fHistDcaXYRes[j][i] = new TH1F((const char*)histName, (const char*)histTitle, nBins, -maxXYBin, maxXYBin);
176 fHistDcaXYRes[j][i]->SetLineColor((const int)fgkColorPart[j]);
179 fHistDcaZRes[j][i] = new TH1F((const char*)histName, (const char*)histTitle, nBins, -maxZBin, maxZBin);
180 fHistDcaZRes[j][i]->SetLineColor((const int)fgkColorPart[j]);
186 // TList *fResidualList = 0;
187 residualList->SetOwner();
188 residualList->SetName("residual");
189 for(Int_t iPart=0; iPart<kNParticles; iPart++){
190 for(Int_t iPtBin=0; iPtBin<kNPtBins; iPtBin++){
191 residualList->Add(fHistDcaXYRes[iPart][iPtBin]);
192 residualList->Add(fHistDcaZRes[iPart][iPtBin]);
193 } // loop over pt bins
194 } // loop over particles (pos, neg)
202 //________________________________________________________________________
203 void AliHFEdca::CreateHistogramsPull(TList *pullList){
207 const Int_t nBins = 1000;
208 const Float_t maxXYBin = 20.;
209 const Float_t maxZBin = 20.;
212 // for pull -----------------------------------------------------------------------
213 fHistDcaXYPull[kNParticles][kNPtBins]=0x0;
214 fHistDcaZPull[kNParticles][kNPtBins]=0x0;
217 for(Int_t k=0; k<kNDcaVar; k++){
218 TString histTitle((const char*)fgkPullDcaVarTitle[k]);
220 for(Int_t j=0; j<kNParticles; j++){
221 for(Int_t i=0; i<kNPtBins; i++){
223 TString histName((const char*)fgkParticles[j]);
225 histName += Form("_%s_pT-%.1f-%.1f", (const char*)fgkPullDcaVar[k], fgkPtIntv[i], fgkPtIntv[i+1]);
228 fHistDcaXYPull[j][i] = new TH1F((const char*)histName, (const char*)histTitle, nBins, 1-maxXYBin, 1+maxXYBin);
229 fHistDcaXYPull[j][i]->SetLineColor((const int)fgkColorPart[j]);
232 fHistDcaZPull[j][i] = new TH1F((const char*)histName, (const char*)histTitle, nBins, 1-maxZBin, 1+maxZBin);
233 fHistDcaZPull[j][i]->SetLineColor((const int)fgkColorPart[j]);
239 // TList *fPullList = 0;
240 pullList->SetOwner();
241 pullList->SetName("pull");
242 for(Int_t iPart=0; iPart<kNParticles; iPart++){
243 for(Int_t iPtBin=0; iPtBin<kNPtBins; iPtBin++){
244 pullList->Add(fHistDcaXYPull[iPart][iPtBin]);
245 pullList->Add(fHistDcaZPull[iPart][iPtBin]);
246 } // loop over pt bins
247 } // loop over particles (pos, neg)
254 //_______________________________________________________________________________________________
255 void AliHFEdca::FillHistograms(AliESDEvent * const esdEvent, AliESDtrack * const track, AliMCEvent * const mcEvent)
257 // filling historgams track by track
259 // obtaining reconstructed dca ------------------------------------------------------------------
260 Float_t esdpx = track->Px();
261 Float_t esdpy = track->Py();
262 Float_t esdpt = TMath::Sqrt(esdpx*esdpx+esdpy*esdpy);
263 Float_t b[2]; // dca in cm
264 Float_t bCov[3]; // covariance matrix
265 track->GetImpactParameters(b,bCov);
267 // obtaining errors of dca ------------------------------------------------------------------
268 const AliESDVertex *primVtx = esdEvent->GetPrimaryVertex();
269 Float_t magneticField = 5; // initialized as 5kG
270 magneticField = esdEvent->GetMagneticField(); // in kG
272 Double_t dz[2]; // error of dca in cm
274 track->PropagateToDCA(primVtx,magneticField, 1000., dz, covardz);
276 // calculate mcDca ------------------------------------------------------------------
278 AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(track->GetLabel())));
279 TParticle *part = mctrack->Particle();
280 Int_t pdg = part->GetPdgCode();
282 if(pdg==kPDGelectron || pdg==kPDGmuon
283 || pdg==-kPDGpion || pdg==-kPDGkaon || pdg==-kPDGproton) charge = -1;
285 Float_t vx = part->Vx(); // in cm
286 Float_t vy = part->Vy(); // in cm
287 Float_t vz = part->Vz(); // in cm
289 Float_t vxy = TMath::Sqrt(vx*vx+vy*vy);
291 Float_t mcpx = part->Px();
292 Float_t mcpy = part->Py();
293 Float_t mcpt = TMath::Sqrt(mcpx*mcpx+mcpy*mcpy);
295 const Float_t conv[2] = {1.783/1.6, 2.99792458};
296 Float_t radiusMc = mcpt/(TMath::Abs(magneticField)/10.)*conv[0]*conv[1]; // pt in GeV/c, magnetic field in Tesla
298 Float_t nx = esdpx/mcpt;
299 Float_t ny = esdpy/mcpt;
302 radius = TMath::Abs(radiusMc);
303 Float_t mcDcaXY = (radius - TMath::Sqrt(vxy*vxy/100./100. + radius*radius + 2*radius*charge*(vx*ny-vy*nx)/100.)) ; // in meters
305 // printf("magnetic Field = %.3f \t", magneticField);
306 // printf("pt=esd %.3f/mc %.3f GeV/c, radius=esd %.3f/mc %.3f meter \n", esdpt, mcpt, radiusEsd, radiusMc);
307 // printf("mcDcaXY=%.5f micron, esdDcaXY=%.5f micron \t ", mcDcaXY*1.e6, b[0]*1e4);
308 // printf("mcDcaZ=%.5f micron, esdDcaZ=%.5f micron\n\n", vz*1e6, b[1]*1e4);
310 Double_t mcDca[2] = {mcDcaXY*100, vz}; // in cm
312 Double_t residual[2] = {0, 0};
313 Double_t pull[2] = {0, 0};
314 Double_t error[2] ={TMath::Sqrt(covardz[0]), TMath::Sqrt(covardz[2])};
315 for(Int_t i=0; i<2; i++){
316 residual[i] = dz[i] - mcDca[i]; // in centimeters
317 if(error[i]!=0)pull[i] = residual[i]/error[i]; // unitless
318 // printf("error[%d]=%.6f residual[%d]=%.6f pull[%d]=%.6f\n", i, error[i], i, residual[i], i, pull[i]);
321 Int_t fPdgParticle[10] = {
322 kPDGelectron, kPDGmuon, -kPDGpion, -kPDGkaon, -kPDGproton,
323 -kPDGelectron, -kPDGmuon, kPDGpion, kPDGkaon, kPDGproton};
325 for(Int_t iPart=0; iPart<kNParticles-2; iPart++){
328 for(Int_t iPtBin=0; iPtBin<kNPtBins; iPtBin++){
329 if(pdg==fPdgParticle[iPart] && (esdpt>fgkPtIntv[iPtBin] && esdpt<=fgkPtIntv[iPtBin+1])) {
330 fHistDcaXYRes[iPart][iPtBin]->Fill(residual[0]*1.0e4); // in microns
331 fHistDcaZRes[iPart][iPtBin]->Fill(residual[1]*1.0e4); // in microns
332 fHistDcaXYPull[iPart][iPtBin]->Fill(pull[0]);
333 fHistDcaZPull[iPart][iPtBin]->Fill(pull[1]);
340 // for charged particles
341 for(Int_t iPtBin=0; iPtBin<kNPtBins; iPtBin++){
342 if(esdpt>fgkPtIntv[iPtBin] && esdpt<=fgkPtIntv[iPtBin+1]){
344 if(charge>0) iPart = 11;
345 fHistDcaXYRes[iPart][iPtBin]->Fill(residual[0]*1e4);
346 fHistDcaZRes[iPart][iPtBin]->Fill(residual[1]*1e4);
347 fHistDcaXYPull[iPart][iPtBin]->Fill(pull[0]);
348 fHistDcaZPull[iPart][iPtBin]->Fill(pull[1]);