]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/ESD/AliESDtrack.cxx
Extended functionality of GetTPCClusterDensity + methods to manipulate
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDtrack.cxx
CommitLineData
ae982df3 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
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 **************************************************************************/
ae982df3 15//-----------------------------------------------------------------
16// Implementation of the ESD track class
4427806c 17// ESD = Event Summary Data
15614b8b 18// This is the class to deal with during the phisics analysis of data
4427806c 19// Origin: Iouri Belikov, CERN
20// e-mail: Jouri.Belikov@cern.ch
4df45162 21//
22//
23//
24// What do you need to know before starting analysis
25// (by Marian Ivanov: marian.ivanov@cern.ch)
26//
27//
28// AliESDtrack:
29// 1. What is the AliESDtrack
30// 2. What informations do we store
31// 3. How to use the information for analysis
32//
33//
34// 1.AliESDtrack is the container of the information about the track/particle
35// reconstructed during Barrel Tracking.
36// The track information is propagated from one tracking detector to
37// other using the functionality of AliESDtrack - Current parameters.
38//
39// No global fit model is used.
40// Barrel tracking use Kalman filtering technique, it gives optimal local
41// track parameters at given point under certian assumptions.
42//
43// Kalman filter take into account additional effect which are
44// difficult to handle using global fit.
45// Effects:
46// a.) Multiple scattering
47// b.) Energy loss
48// c.) Non homogenous magnetic field
49//
50// In general case, following barrel detectors are contributing to
51// the Kalman track information:
52// a. TPC
53// b. ITS
54// c. TRD
55//
56// In general 3 reconstruction itteration are performed:
57// 1. Find tracks - sequence TPC->ITS
58// 2. PropagateBack - sequence ITS->TPC->TRD -> Outer PID detectors
59// 3. Refit invward - sequence TRD->TPC->ITS
60// The current tracks are updated after each detector (see bellow).
61// In specical cases a track sanpshots are stored.
62//
63//
64// For some type of analysis (+visualization) track local parameters at
65// different position are neccesary. A snapshots during the track
66// propagation are created.
67// (See AliExternalTrackParam class for desctiption of variables and
68// functionality)
69// Snapshots:
70// a. Current parameters - class itself (AliExternalTrackParam)
71// Contributors: general case TRD->TPC->ITS
72// Preferable usage: Decission - primary or secondary track
73// NOTICE - By default the track parameters are stored at the DCA point
74// to the primary vertex. optimal for primary tracks,
75// far from optimal for secondary tracks.
76// b. Constrained parameters - Kalman information updated with
77// the Primary vertex information
78// Contributors: general case TRD->TPC->ITS
79// Preferable usage: Use only for tracks selected as primary
80// NOTICE - not real constrain - taken as additional measurement
81// with corresponding error
82// Function:
83// const AliExternalTrackParam *GetConstrainedParam() const {return fCp;}
84// c. Inner parameters - Track parameters at inner wall of the TPC
85// Contributors: general case TRD->TPC
86// function:
87// const AliExternalTrackParam *GetInnerParam() const { return fIp;}
88//
89// d. TPCinnerparam - contributors - TPC only
90// Contributors: TPC
91// Preferable usage: Requested for HBT study
92// (smaller correlations as using also ITS information)
93// NOTICE - the track parameters are propagated to the DCA to
94// to primary vertex
95// Optimal for primary, far from optimal for secondary tracks
96// Function:
97// const AliExternalTrackParam *GetTPCInnerParam() const {return fTPCInner;}
98//
99// e. Outer parameters -
100// Contributors- general case - ITS-> TPC -> TRD
101// The last point - Outer parameters radius is determined
102// e.a) Local inclination angle bigger than threshold -
103// Low momenta tracks
104// e.a) Catastrofic energy losss in material
105// e.b) Not further improvement (no space points)
106// Usage:
107// a.) Tracking: Starting parameter for Refit inward
108// b.) Visualization
109// c.) QA
110// NOTICE: Should be not used for the physic analysis
111// Function:
112// const AliExternalTrackParam *GetOuterParam() const { return fOp;}
113//
ae982df3 114//-----------------------------------------------------------------
115
e1e6896f 116#include <TMath.h>
49edfa08 117#include <TParticle.h>
c180f65d 118#include <TDatabasePDG.h>
4c3dc2a0 119#include <TMatrixD.h>
ae982df3 120
49d13e89 121#include "AliESDVertex.h"
ae982df3 122#include "AliESDtrack.h"
95621324 123#include "AliESDEvent.h"
ae982df3 124#include "AliKalmanTrack.h"
4f6e22bd 125#include "AliVTrack.h"
5f7789fc 126#include "AliLog.h"
15e85efa 127#include "AliTrackPointArray.h"
0c19adf7 128#include "TPolyMarker3D.h"
4c3dc2a0 129#include "AliTrackerBase.h"
40b4e5ea 130#include "AliTPCdEdxInfo.h"
ae982df3 131
132ClassImp(AliESDtrack)
133
562dd0b4 134void SetPIDValues(Double_t * dest, const Double_t * src, Int_t n) {
d27bbc79 135 // This function copies "n" PID weights from "scr" to "dest"
136 // and normalizes their sum to 1 thus producing conditional probabilities.
137 // The negative weights are set to 0.
138 // In case all the weights are non-positive they are replaced by
139 // uniform probabilities
140
141 if (n<=0) return;
142
143 Float_t uniform = 1./(Float_t)n;
144
145 Float_t sum = 0;
146 for (Int_t i=0; i<n; i++)
147 if (src[i]>=0) {
148 sum+=src[i];
149 dest[i] = src[i];
150 }
151 else {
152 dest[i] = 0;
153 }
154
155 if(sum>0)
156 for (Int_t i=0; i<n; i++) dest[i] /= sum;
157 else
158 for (Int_t i=0; i<n; i++) dest[i] = uniform;
159}
160
ae982df3 161//_______________________________________________________________________
162AliESDtrack::AliESDtrack() :
c9ec41e8 163 AliExternalTrackParam(),
562dd0b4 164 fCp(0),
165 fIp(0),
166 fTPCInner(0),
167 fOp(0),
c38d443f 168 fHMPIDp(0),
59c31692 169 fFriendTrack(NULL),
9f638f03 170 fTPCFitMap(159),//number of padrows
562dd0b4 171 fTPCClusterMap(159),//number of padrows
172 fTPCSharedMap(159),//number of padrows
90e48c0c 173 fFlags(0),
90e48c0c 174 fID(0),
562dd0b4 175 fLabel(0),
176 fITSLabel(0),
177 fTPCLabel(0),
178 fTRDLabel(0),
ab37ab1e 179 fTOFCalChannel(-1),
ce3f4882 180 fTOFindex(-1),
562dd0b4 181 fHMPIDqn(0),
81aa7a0d 182 fHMPIDcluIdx(-1),
f1cedef3 183 fCaloIndex(kEMCALNoMatch),
562dd0b4 184 fHMPIDtrkTheta(0),
185 fHMPIDtrkPhi(0),
186 fHMPIDsignal(0),
90e48c0c 187 fTrackLength(0),
d7ddf1e9 188 fdTPC(0),fzTPC(0),
189 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
436dfe39 190 fCchi2TPC(0),
49d13e89 191 fD(0),fZ(0),
192 fCdd(0),fCdz(0),fCzz(0),
562dd0b4 193 fCchi2(0),
90e48c0c 194 fITSchi2(0),
90e48c0c 195 fTPCchi2(0),
949840f6 196 fTPCchi2Iter1(0),
562dd0b4 197 fTRDchi2(0),
198 fTOFchi2(0),
199 fHMPIDchi2(0),
b5b2b4db 200 fGlobalChi2(0),
562dd0b4 201 fITSsignal(0),
90e48c0c 202 fTPCsignal(0),
e1d4c1b5 203 fTPCsignalS(0),
40b4e5ea 204 fTPCdEdxInfo(0),
90e48c0c 205 fTRDsignal(0),
90e48c0c 206 fTRDQuality(0),
23d49657 207 fTRDBudget(0),
ab37ab1e 208 fTOFsignal(99999),
209 fTOFsignalToT(99999),
210 fTOFsignalRaw(99999),
211 fTOFsignalDz(999),
212 fTOFsignalDx(999),
213 fTOFdeltaBC(999),
214 fTOFl0l1(999),
f1cedef3 215 fCaloDx(0),
216 fCaloDz(0),
562dd0b4 217 fHMPIDtrkX(0),
218 fHMPIDtrkY(0),
219 fHMPIDmipX(0),
220 fHMPIDmipY(0),
221 fTPCncls(0),
222 fTPCnclsF(0),
223 fTPCsignalN(0),
949840f6 224 fTPCnclsIter1(0),
225 fTPCnclsFIter1(0),
562dd0b4 226 fITSncls(0),
227 fITSClusterMap(0),
25015f7a 228 fITSSharedMap(0),
562dd0b4 229 fTRDncls(0),
230 fTRDncls0(0),
ed15ef4f 231 fTRDntracklets(0),
6984f7c1 232 fTRDnSlices(0),
6dc21f57 233 fTRDslices(0x0),
95621324 234 fVertexID(-2),// -2 means an orphan track
4c3dc2a0 235 fESDEvent(0),
236 fCacheNCrossedRows(-10),
237 fCacheChi2TPCConstrainedVsGlobal(-10),
238 fCacheChi2TPCConstrainedVsGlobalVertex(0)
ae982df3 239{
240 //
241 // The default ESD constructor
242 //
ddfbc51a 243 if (!OnlineMode()) fFriendTrack=new AliESDfriendTrack();
244
245 Int_t i;
246 for (i=kNITSchi2Std;i--;) fITSchi2Std[i] = 0;
247 for (i=0; i<AliPID::kSPECIES; i++) {
4a78b8c5 248 fTrackTime[i]=0.;
562dd0b4 249 fR[i]=0.;
250 fITSr[i]=0.;
251 fTPCr[i]=0.;
252 fTRDr[i]=0.;
253 fTOFr[i]=0.;
254 fHMPIDr[i]=0.;
2bad268c 255 }
ac2f7574 256
ddfbc51a 257 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
258 for (i=0; i<3; i++) { fV0Indexes[i]=0;}
259 for (i=0;i<kTRDnPlanes;i++) {
260 fTRDTimBin[i]=0;
261 }
262 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
263 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
264 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
265 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
266 for (i=0;i<12;i++) {fITSModule[i]=-1;}
c4d11b15 267}
268
59c31692 269bool AliESDtrack::fgkOnlineMode=false;
270
c4d11b15 271//_______________________________________________________________________
90e48c0c 272AliESDtrack::AliESDtrack(const AliESDtrack& track):
c9ec41e8 273 AliExternalTrackParam(track),
562dd0b4 274 fCp(0),
275 fIp(0),
276 fTPCInner(0),
277 fOp(0),
c38d443f 278 fHMPIDp(0),
562dd0b4 279 fFriendTrack(0),
9f638f03 280 fTPCFitMap(track.fTPCFitMap),
562dd0b4 281 fTPCClusterMap(track.fTPCClusterMap),
282 fTPCSharedMap(track.fTPCSharedMap),
90e48c0c 283 fFlags(track.fFlags),
90e48c0c 284 fID(track.fID),
562dd0b4 285 fLabel(track.fLabel),
286 fITSLabel(track.fITSLabel),
287 fTPCLabel(track.fTPCLabel),
288 fTRDLabel(track.fTRDLabel),
289 fTOFCalChannel(track.fTOFCalChannel),
290 fTOFindex(track.fTOFindex),
291 fHMPIDqn(track.fHMPIDqn),
292 fHMPIDcluIdx(track.fHMPIDcluIdx),
f1cedef3 293 fCaloIndex(track.fCaloIndex),
562dd0b4 294 fHMPIDtrkTheta(track.fHMPIDtrkTheta),
295 fHMPIDtrkPhi(track.fHMPIDtrkPhi),
296 fHMPIDsignal(track.fHMPIDsignal),
90e48c0c 297 fTrackLength(track.fTrackLength),
d7ddf1e9 298 fdTPC(track.fdTPC),fzTPC(track.fzTPC),
299 fCddTPC(track.fCddTPC),fCdzTPC(track.fCdzTPC),fCzzTPC(track.fCzzTPC),
436dfe39 300 fCchi2TPC(track.fCchi2TPC),
49d13e89 301 fD(track.fD),fZ(track.fZ),
302 fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
90e48c0c 303 fCchi2(track.fCchi2),
90e48c0c 304 fITSchi2(track.fITSchi2),
90e48c0c 305 fTPCchi2(track.fTPCchi2),
949840f6 306 fTPCchi2Iter1(track.fTPCchi2Iter1),
562dd0b4 307 fTRDchi2(track.fTRDchi2),
308 fTOFchi2(track.fTOFchi2),
309 fHMPIDchi2(track.fHMPIDchi2),
b5b2b4db 310 fGlobalChi2(track.fGlobalChi2),
562dd0b4 311 fITSsignal(track.fITSsignal),
90e48c0c 312 fTPCsignal(track.fTPCsignal),
e1d4c1b5 313 fTPCsignalS(track.fTPCsignalS),
40b4e5ea 314 fTPCdEdxInfo(0),
90e48c0c 315 fTRDsignal(track.fTRDsignal),
90e48c0c 316 fTRDQuality(track.fTRDQuality),
23d49657 317 fTRDBudget(track.fTRDBudget),
90e48c0c 318 fTOFsignal(track.fTOFsignal),
85324138 319 fTOFsignalToT(track.fTOFsignalToT),
d321691a 320 fTOFsignalRaw(track.fTOFsignalRaw),
321 fTOFsignalDz(track.fTOFsignalDz),
a5d9ff0f 322 fTOFsignalDx(track.fTOFsignalDx),
d86081b1 323 fTOFdeltaBC(track.fTOFdeltaBC),
324 fTOFl0l1(track.fTOFl0l1),
f1cedef3 325 fCaloDx(track.fCaloDx),
326 fCaloDz(track.fCaloDz),
f4b3bbb7 327 fHMPIDtrkX(track.fHMPIDtrkX),
328 fHMPIDtrkY(track.fHMPIDtrkY),
329 fHMPIDmipX(track.fHMPIDmipX),
330 fHMPIDmipY(track.fHMPIDmipY),
562dd0b4 331 fTPCncls(track.fTPCncls),
332 fTPCnclsF(track.fTPCnclsF),
333 fTPCsignalN(track.fTPCsignalN),
949840f6 334 fTPCnclsIter1(track.fTPCnclsIter1),
335 fTPCnclsFIter1(track.fTPCnclsIter1),
562dd0b4 336 fITSncls(track.fITSncls),
337 fITSClusterMap(track.fITSClusterMap),
25015f7a 338 fITSSharedMap(track.fITSSharedMap),
562dd0b4 339 fTRDncls(track.fTRDncls),
340 fTRDncls0(track.fTRDncls0),
ed15ef4f 341 fTRDntracklets(track.fTRDntracklets),
6984f7c1 342 fTRDnSlices(track.fTRDnSlices),
6dc21f57 343 fTRDslices(0x0),
95621324 344 fVertexID(track.fVertexID),
4c3dc2a0 345 fESDEvent(track.fESDEvent),
346 fCacheNCrossedRows(track.fCacheNCrossedRows),
347 fCacheChi2TPCConstrainedVsGlobal(track.fCacheChi2TPCConstrainedVsGlobal),
348 fCacheChi2TPCConstrainedVsGlobalVertex(track.fCacheChi2TPCConstrainedVsGlobalVertex)
90e48c0c 349{
c4d11b15 350 //
351 //copy constructor
352 //
e400c4a6 353 for (Int_t i=kNITSchi2Std;i--;) fITSchi2Std[i] = track.fTrackTime[i];
ddfbc51a 354 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i]=track.fTrackTime[i];
355 for (Int_t i=0;i<AliPID::kSPECIES;i++) fR[i]=track.fR[i];
c4d11b15 356 //
ddfbc51a 357 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i];
c4d11b15 358 //
ddfbc51a 359 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i];
360 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=track.fITSdEdxSamples[i];}
361 for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
362 for (Int_t i=0; i<3;i++) { fKinkIndexes[i]=track.fKinkIndexes[i];}
363 for (Int_t i=0; i<3;i++) { fV0Indexes[i]=track.fV0Indexes[i];}
e546b023 364 //
ddfbc51a 365 for (Int_t i=0;i<kTRDnPlanes;i++) {
366 fTRDTimBin[i]=track.fTRDTimBin[i];
6984f7c1 367 }
368
ddfbc51a 369 if (fTRDnSlices) {
370 fTRDslices=new Double32_t[fTRDnSlices];
371 for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=track.fTRDslices[i];
e546b023 372 }
ddfbc51a 373
374
375 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i];
376 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
377 for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
378 for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
379 for (Int_t i=0;i<12;i++) fITSModule[i]=track.fITSModule[i];
380 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i]=track.fHMPIDr[i];
381
382 if (track.fCp) fCp=new AliExternalTrackParam(*track.fCp);
383 if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
384 if (track.fTPCInner) fTPCInner=new AliExternalTrackParam(*track.fTPCInner);
385 if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
386 if (track.fHMPIDp) fHMPIDp=new AliExternalTrackParam(*track.fHMPIDp);
387 if (track.fTPCdEdxInfo) fTPCdEdxInfo = new AliTPCdEdxInfo(*track.fTPCdEdxInfo);
388
389
390 if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
ae982df3 391}
15e85efa 392
4f6e22bd 393//_______________________________________________________________________
394AliESDtrack::AliESDtrack(const AliVTrack *track) :
395 AliExternalTrackParam(track),
396 fCp(0),
397 fIp(0),
398 fTPCInner(0),
399 fOp(0),
c38d443f 400 fHMPIDp(0),
4f6e22bd 401 fFriendTrack(0),
9f638f03 402 fTPCFitMap(159),//number of padrows
4f6e22bd 403 fTPCClusterMap(159),//number of padrows
404 fTPCSharedMap(159),//number of padrows
405 fFlags(0),
406 fID(),
407 fLabel(0),
408 fITSLabel(0),
409 fTPCLabel(0),
410 fTRDLabel(0),
ab37ab1e 411 fTOFCalChannel(-1),
4f6e22bd 412 fTOFindex(-1),
413 fHMPIDqn(0),
81aa7a0d 414 fHMPIDcluIdx(-1),
f1cedef3 415 fCaloIndex(kEMCALNoMatch),
4f6e22bd 416 fHMPIDtrkTheta(0),
417 fHMPIDtrkPhi(0),
418 fHMPIDsignal(0),
419 fTrackLength(0),
420 fdTPC(0),fzTPC(0),
421 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
422 fCchi2TPC(0),
423 fD(0),fZ(0),
424 fCdd(0),fCdz(0),fCzz(0),
425 fCchi2(0),
426 fITSchi2(0),
427 fTPCchi2(0),
949840f6 428 fTPCchi2Iter1(0),
4f6e22bd 429 fTRDchi2(0),
430 fTOFchi2(0),
431 fHMPIDchi2(0),
b5b2b4db 432 fGlobalChi2(0),
4f6e22bd 433 fITSsignal(0),
434 fTPCsignal(0),
435 fTPCsignalS(0),
40b4e5ea 436 fTPCdEdxInfo(0),
4f6e22bd 437 fTRDsignal(0),
438 fTRDQuality(0),
439 fTRDBudget(0),
ab37ab1e 440 fTOFsignal(99999),
441 fTOFsignalToT(99999),
442 fTOFsignalRaw(99999),
443 fTOFsignalDz(999),
444 fTOFsignalDx(999),
445 fTOFdeltaBC(999),
446 fTOFl0l1(999),
f1cedef3 447 fCaloDx(0),
448 fCaloDz(0),
4f6e22bd 449 fHMPIDtrkX(0),
450 fHMPIDtrkY(0),
451 fHMPIDmipX(0),
452 fHMPIDmipY(0),
453 fTPCncls(0),
454 fTPCnclsF(0),
455 fTPCsignalN(0),
949840f6 456 fTPCnclsIter1(0),
457 fTPCnclsFIter1(0),
4f6e22bd 458 fITSncls(0),
459 fITSClusterMap(0),
25015f7a 460 fITSSharedMap(0),
4f6e22bd 461 fTRDncls(0),
462 fTRDncls0(0),
ed15ef4f 463 fTRDntracklets(0),
4f6e22bd 464 fTRDnSlices(0),
6dc21f57 465 fTRDslices(0x0),
95621324 466 fVertexID(-2), // -2 means an orphan track
4c3dc2a0 467 fESDEvent(0),
468 fCacheNCrossedRows(-10),
469 fCacheChi2TPCConstrainedVsGlobal(-10),
470 fCacheChi2TPCConstrainedVsGlobalVertex(0)
4f6e22bd 471{
472 //
610e3088 473 // ESD track from AliVTrack.
474 // This is not a copy constructor !
4f6e22bd 475 //
476
610e3088 477 if (track->InheritsFrom("AliExternalTrackParam")) {
478 AliError("This is not a copy constructor. Use AliESDtrack(const AliESDtrack &) !");
479 AliWarning("Calling the default constructor...");
480 AliESDtrack();
481 return;
482 }
483
4f6e22bd 484 // Reset all the arrays
ddfbc51a 485 Int_t i;
486 for (i=kNITSchi2Std;i--;) fITSchi2Std[i] = 0;
487 for (i=0; i<AliPID::kSPECIES; i++) {
4f6e22bd 488 fTrackTime[i]=0.;
489 fR[i]=0.;
490 fITSr[i]=0.;
491 fTPCr[i]=0.;
492 fTRDr[i]=0.;
493 fTOFr[i]=0.;
494 fHMPIDr[i]=0.;
495 }
496
ddfbc51a 497 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
498 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
499 for (i=0;i<kTRDnPlanes;i++) {
500 fTRDTimBin[i]=0;
501 }
502 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
503 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
504 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
505 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
506 for (i=0;i<12;i++) {fITSModule[i]=-1;}
4f6e22bd 507
508 // Set the ID
509 SetID(track->GetID());
510
511 // Set ITS cluster map
512 fITSClusterMap=track->GetITSClusterMap();
25015f7a 513 fITSSharedMap=0;
4f6e22bd 514
d577eec9 515 fITSncls=0;
ddfbc51a 516 for(i=0; i<6; i++) {
517 if(HasPointOnITSLayer(i)) fITSncls++;
518 }
519
07cc7a48 520 // Set TPC ncls
521 fTPCncls=track->GetTPCNcls();
ddfbc51a 522
523
4f6e22bd 524 // Set the combined PID
525 const Double_t *pid = track->PID();
ddfbc51a 526 if(pid){
527 for (i=0; i<AliPID::kSPECIES; i++) fR[i]=pid[i];
528 }
4f6e22bd 529 // AliESD track label
530 SetLabel(track->GetLabel());
39ca41b3 531 // Set the status
532 SetStatus(track->GetStatus());
4f6e22bd 533}
534
49edfa08 535//_______________________________________________________________________
536AliESDtrack::AliESDtrack(TParticle * part) :
537 AliExternalTrackParam(),
562dd0b4 538 fCp(0),
539 fIp(0),
540 fTPCInner(0),
541 fOp(0),
c38d443f 542 fHMPIDp(0),
562dd0b4 543 fFriendTrack(0),
9f638f03 544 fTPCFitMap(159),//number of padrows
562dd0b4 545 fTPCClusterMap(159),//number of padrows
546 fTPCSharedMap(159),//number of padrows
49edfa08 547 fFlags(0),
49edfa08 548 fID(0),
562dd0b4 549 fLabel(0),
550 fITSLabel(0),
551 fTPCLabel(0),
552 fTRDLabel(0),
ab37ab1e 553 fTOFCalChannel(-1),
ce3f4882 554 fTOFindex(-1),
562dd0b4 555 fHMPIDqn(0),
81aa7a0d 556 fHMPIDcluIdx(-1),
f1cedef3 557 fCaloIndex(kEMCALNoMatch),
562dd0b4 558 fHMPIDtrkTheta(0),
559 fHMPIDtrkPhi(0),
560 fHMPIDsignal(0),
49edfa08 561 fTrackLength(0),
d7ddf1e9 562 fdTPC(0),fzTPC(0),
563 fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
436dfe39 564 fCchi2TPC(0),
49edfa08 565 fD(0),fZ(0),
566 fCdd(0),fCdz(0),fCzz(0),
562dd0b4 567 fCchi2(0),
49edfa08 568 fITSchi2(0),
49edfa08 569 fTPCchi2(0),
949840f6 570 fTPCchi2Iter1(0),
562dd0b4 571 fTRDchi2(0),
572 fTOFchi2(0),
573 fHMPIDchi2(0),
b5b2b4db 574 fGlobalChi2(0),
562dd0b4 575 fITSsignal(0),
49edfa08 576 fTPCsignal(0),
49edfa08 577 fTPCsignalS(0),
40b4e5ea 578 fTPCdEdxInfo(0),
49edfa08 579 fTRDsignal(0),
49edfa08 580 fTRDQuality(0),
581 fTRDBudget(0),
ab37ab1e 582 fTOFsignal(99999),
583 fTOFsignalToT(99999),
584 fTOFsignalRaw(99999),
585 fTOFsignalDz(999),
586 fTOFsignalDx(999),
587 fTOFdeltaBC(999),
588 fTOFl0l1(999),
f1cedef3 589 fCaloDx(0),
590 fCaloDz(0),
562dd0b4 591 fHMPIDtrkX(0),
592 fHMPIDtrkY(0),
593 fHMPIDmipX(0),
594 fHMPIDmipY(0),
595 fTPCncls(0),
596 fTPCnclsF(0),
597 fTPCsignalN(0),
949840f6 598 fTPCnclsIter1(0),
599 fTPCnclsFIter1(0),
562dd0b4 600 fITSncls(0),
601 fITSClusterMap(0),
25015f7a 602 fITSSharedMap(0),
562dd0b4 603 fTRDncls(0),
604 fTRDncls0(0),
ed15ef4f 605 fTRDntracklets(0),
6984f7c1 606 fTRDnSlices(0),
6dc21f57 607 fTRDslices(0x0),
95621324 608 fVertexID(-2), // -2 means an orphan track
4c3dc2a0 609 fESDEvent(0),
610 fCacheNCrossedRows(-10),
611 fCacheChi2TPCConstrainedVsGlobal(-10),
612 fCacheChi2TPCConstrainedVsGlobalVertex(0)
49edfa08 613{
614 //
615 // ESD track from TParticle
616 //
617
618 // Reset all the arrays
ddfbc51a 619 Int_t i;
620 for (i=kNITSchi2Std;i--;) fITSchi2Std[i] = 0;
621 for (i=0; i<AliPID::kSPECIES; i++) {
49edfa08 622 fTrackTime[i]=0.;
623 fR[i]=0.;
624 fITSr[i]=0.;
625 fTPCr[i]=0.;
626 fTRDr[i]=0.;
627 fTOFr[i]=0.;
f4b3bbb7 628 fHMPIDr[i]=0.;
49edfa08 629 }
630
ddfbc51a 631 for (i=0; i<3; i++) { fKinkIndexes[i]=0;}
632 for (i=0; i<3; i++) { fV0Indexes[i]=-1;}
633 for (i=0;i<kTRDnPlanes;i++) {
634 fTRDTimBin[i]=0;
635 }
636 for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
637 for (i=0;i<4;i++) {fTPCPoints[i]=0;}
638 for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
639 for (i=0;i<10;i++) {fTOFInfo[i]=0;}
640 for (i=0;i<12;i++) {fITSModule[i]=-1;}
49edfa08 641
642 // Calculate the AliExternalTrackParam content
643
644 Double_t xref;
645 Double_t alpha;
646 Double_t param[5];
647 Double_t covar[15];
648
649 // Calculate alpha: the rotation angle of the corresponding local system (TPC sector)
650 alpha = part->Phi()*180./TMath::Pi();
651 if (alpha<0) alpha+= 360.;
652 if (alpha>360) alpha -= 360.;
653
654 Int_t sector = (Int_t)(alpha/20.);
655 alpha = 10. + 20.*sector;
656 alpha /= 180;
657 alpha *= TMath::Pi();
658
659 // Covariance matrix: no errors, the parameters are exact
ddfbc51a 660 for (i=0; i<15; i++) covar[i]=0.;
49edfa08 661
662 // Get the vertex of origin and the momentum
663 TVector3 ver(part->Vx(),part->Vy(),part->Vz());
664 TVector3 mom(part->Px(),part->Py(),part->Pz());
665
666 // Rotate to the local coordinate system (TPC sector)
667 ver.RotateZ(-alpha);
668 mom.RotateZ(-alpha);
669
670 // X of the referense plane
671 xref = ver.X();
672
673 Int_t pdgCode = part->GetPdgCode();
674
675 Double_t charge =
676 TDatabasePDG::Instance()->GetParticle(pdgCode)->Charge();
677
678 param[0] = ver.Y();
679 param[1] = ver.Z();
680 param[2] = TMath::Sin(mom.Phi());
681 param[3] = mom.Pz()/mom.Pt();
682 param[4] = TMath::Sign(1/mom.Pt(),charge);
683
684 // Set AliExternalTrackParam
685 Set(xref, alpha, param, covar);
686
687 // Set the PID
688 Int_t indexPID = 99;
689
690 switch (TMath::Abs(pdgCode)) {
691
692 case 11: // electron
693 indexPID = 0;
694 break;
695
696 case 13: // muon
697 indexPID = 1;
698 break;
699
700 case 211: // pion
701 indexPID = 2;
702 break;
703
704 case 321: // kaon
705 indexPID = 3;
706 break;
707
708 case 2212: // proton
709 indexPID = 4;
710 break;
711
712 default:
713 break;
714 }
715
716 // If the particle is not e,mu,pi,K or p the PID probabilities are set to 0
717 if (indexPID < AliPID::kSPECIES) {
718 fR[indexPID]=1.;
719 fITSr[indexPID]=1.;
720 fTPCr[indexPID]=1.;
721 fTRDr[indexPID]=1.;
722 fTOFr[indexPID]=1.;
f4b3bbb7 723 fHMPIDr[indexPID]=1.;
49edfa08 724
725 }
726 // AliESD track label
727 SetLabel(part->GetUniqueID());
728
729}
730
c4d11b15 731//_______________________________________________________________________
732AliESDtrack::~AliESDtrack(){
733 //
734 // This is destructor according Coding Conventrions
735 //
736 //printf("Delete track\n");
ddfbc51a 737 delete fIp;
738 delete fTPCInner;
739 delete fOp;
740 delete fHMPIDp;
741 delete fCp;
742 if (fFriendTrack) delete fFriendTrack;
743 if (fTPCdEdxInfo) delete fTPCdEdxInfo;
744 fFriendTrack=NULL;
745 if(fTRDnSlices)
746 delete[] fTRDslices;
b5732bf0 747
748 //Reset cached values - needed for TClonesArray in AliESDInputHandler
749 fCacheNCrossedRows = -10.;
750 fCacheChi2TPCConstrainedVsGlobal = -10.;
751 if(fCacheChi2TPCConstrainedVsGlobalVertex) fCacheChi2TPCConstrainedVsGlobalVertex = 0;
752
ddfbc51a 753}
754
755AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
756
732a24fe 757
758 if(&source == this) return *this;
759 AliExternalTrackParam::operator=(source);
760
ddfbc51a 761
762 if(source.fCp){
763 // we have the trackparam: assign or copy construct
764 if(fCp)*fCp = *source.fCp;
765 else fCp = new AliExternalTrackParam(*source.fCp);
732a24fe 766 }
ddfbc51a 767 else{
768 // no track param delete the old one
769 if(fCp)delete fCp;
770 fCp = 0;
732a24fe 771 }
ddfbc51a 772
773 if(source.fIp){
774 // we have the trackparam: assign or copy construct
775 if(fIp)*fIp = *source.fIp;
776 else fIp = new AliExternalTrackParam(*source.fIp);
732a24fe 777 }
ddfbc51a 778 else{
779 // no track param delete the old one
780 if(fIp)delete fIp;
781 fIp = 0;
732a24fe 782 }
ddfbc51a 783
784
785 if(source.fTPCInner){
786 // we have the trackparam: assign or copy construct
787 if(fTPCInner) *fTPCInner = *source.fTPCInner;
788 else fTPCInner = new AliExternalTrackParam(*source.fTPCInner);
732a24fe 789 }
ddfbc51a 790 else{
791 // no track param delete the old one
792 if(fTPCInner)delete fTPCInner;
793 fTPCInner = 0;
40b4e5ea 794 }
ddfbc51a 795
796 if(source.fTPCdEdxInfo) {
797 if(fTPCdEdxInfo) *fTPCdEdxInfo = *source.fTPCdEdxInfo;
798 fTPCdEdxInfo = new AliTPCdEdxInfo(*source.fTPCdEdxInfo);
732a24fe 799 }
ddfbc51a 800
801 if(source.fOp){
802 // we have the trackparam: assign or copy construct
803 if(fOp) *fOp = *source.fOp;
804 else fOp = new AliExternalTrackParam(*source.fOp);
732a24fe 805 }
ddfbc51a 806 else{
807 // no track param delete the old one
808 if(fOp)delete fOp;
809 fOp = 0;
c38d443f 810 }
ddfbc51a 811
812
813 if(source.fHMPIDp){
814 // we have the trackparam: assign or copy construct
815 if(fHMPIDp) *fHMPIDp = *source.fHMPIDp;
816 else fHMPIDp = new AliExternalTrackParam(*source.fHMPIDp);
c38d443f 817 }
ddfbc51a 818 else{
819 // no track param delete the old one
820 if(fHMPIDp)delete fHMPIDp;
821 fHMPIDp = 0;
e546b023 822 }
ddfbc51a 823
732a24fe 824 // copy also the friend track
825 // use copy constructor
ddfbc51a 826 if(source.fFriendTrack){
827 // we have the trackparam: assign or copy construct
828 delete fFriendTrack; fFriendTrack=new AliESDfriendTrack(*source.fFriendTrack);
732a24fe 829 }
ddfbc51a 830 else{
831 // no track param delete the old one
832 delete fFriendTrack; fFriendTrack= 0;
833 }
834
835 fTPCFitMap = source.fTPCFitMap;
732a24fe 836 fTPCClusterMap = source.fTPCClusterMap;
837 fTPCSharedMap = source.fTPCSharedMap;
838 // the simple stuff
839 fFlags = source.fFlags;
840 fID = source.fID;
841 fLabel = source.fLabel;
842 fITSLabel = source.fITSLabel;
ddfbc51a 843 for(int i = 0; i< 12;++i){
844 fITSModule[i] = source.fITSModule[i];
845 }
732a24fe 846 fTPCLabel = source.fTPCLabel;
847 fTRDLabel = source.fTRDLabel;
ddfbc51a 848 for(int i = 0; i< 3;++i){
849 fTOFLabel[i] = source.fTOFLabel[i];
850 }
732a24fe 851 fTOFCalChannel = source.fTOFCalChannel;
852 fTOFindex = source.fTOFindex;
853 fHMPIDqn = source.fHMPIDqn;
854 fHMPIDcluIdx = source.fHMPIDcluIdx;
f1cedef3 855 fCaloIndex = source.fCaloIndex;
e400c4a6 856 for (int i=kNITSchi2Std;i--;) fITSchi2Std[i] = source.fITSchi2Std[i];
ddfbc51a 857 for(int i = 0; i< 3;++i){
732a24fe 858 fKinkIndexes[i] = source.fKinkIndexes[i];
859 fV0Indexes[i] = source.fV0Indexes[i];
860 }
ddfbc51a 861
862 for(int i = 0; i< AliPID::kSPECIES;++i){
732a24fe 863 fR[i] = source.fR[i];
864 fITSr[i] = source.fITSr[i];
865 fTPCr[i] = source.fTPCr[i];
866 fTRDr[i] = source.fTRDr[i];
867 fTOFr[i] = source.fTOFr[i];
868 fHMPIDr[i] = source.fHMPIDr[i];
869 fTrackTime[i] = source.fTrackTime[i];
870 }
ddfbc51a 871
732a24fe 872 fHMPIDtrkTheta = source.fHMPIDtrkTheta;
873 fHMPIDtrkPhi = source.fHMPIDtrkPhi;
874 fHMPIDsignal = source.fHMPIDsignal;
ddfbc51a 875
876
732a24fe 877 fTrackLength = source. fTrackLength;
d7ddf1e9 878 fdTPC = source.fdTPC;
879 fzTPC = source.fzTPC;
880 fCddTPC = source.fCddTPC;
881 fCdzTPC = source.fCdzTPC;
882 fCzzTPC = source.fCzzTPC;
436dfe39 883 fCchi2TPC = source.fCchi2TPC;
ddfbc51a 884
732a24fe 885 fD = source.fD;
886 fZ = source.fZ;
887 fCdd = source.fCdd;
888 fCdz = source.fCdz;
889 fCzz = source.fCzz;
732a24fe 890 fCchi2 = source.fCchi2;
ddfbc51a 891
732a24fe 892 fITSchi2 = source.fITSchi2;
893 fTPCchi2 = source.fTPCchi2;
949840f6 894 fTPCchi2Iter1 = source.fTPCchi2Iter1;
732a24fe 895 fTRDchi2 = source.fTRDchi2;
896 fTOFchi2 = source.fTOFchi2;
897 fHMPIDchi2 = source.fHMPIDchi2;
ddfbc51a 898
b5b2b4db 899 fGlobalChi2 = source.fGlobalChi2;
ddfbc51a 900
732a24fe 901 fITSsignal = source.fITSsignal;
ddfbc51a 902 for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=source.fITSdEdxSamples[i];}
732a24fe 903 fTPCsignal = source.fTPCsignal;
904 fTPCsignalS = source.fTPCsignalS;
ddfbc51a 905 for(int i = 0; i< 4;++i){
906 fTPCPoints[i] = source.fTPCPoints[i];
907 }
732a24fe 908 fTRDsignal = source.fTRDsignal;
ddfbc51a 909
910 for(int i = 0;i < kTRDnPlanes;++i){
911 fTRDTimBin[i] = source.fTRDTimBin[i];
732a24fe 912 }
ddfbc51a 913
914 if(fTRDnSlices)
915 delete[] fTRDslices;
916 fTRDslices=0;
917 fTRDnSlices=source.fTRDnSlices;
6984f7c1 918 if (fTRDnSlices) {
ddfbc51a 919 fTRDslices=new Double32_t[fTRDnSlices];
920 for(int j = 0;j < fTRDnSlices;++j) fTRDslices[j] = source.fTRDslices[j];
6984f7c1 921 }
ddfbc51a 922
732a24fe 923 fTRDQuality = source.fTRDQuality;
924 fTRDBudget = source.fTRDBudget;
925 fTOFsignal = source.fTOFsignal;
926 fTOFsignalToT = source.fTOFsignalToT;
927 fTOFsignalRaw = source.fTOFsignalRaw;
928 fTOFsignalDz = source.fTOFsignalDz;
a5d9ff0f 929 fTOFsignalDx = source.fTOFsignalDx;
d86081b1 930 fTOFdeltaBC = source.fTOFdeltaBC;
931 fTOFl0l1 = source.fTOFl0l1;
ddfbc51a 932
933 for(int i = 0;i<10;++i){
934 fTOFInfo[i] = source.fTOFInfo[i];
935 }
936
732a24fe 937 fHMPIDtrkX = source.fHMPIDtrkX;
938 fHMPIDtrkY = source.fHMPIDtrkY;
939 fHMPIDmipX = source.fHMPIDmipX;
940 fHMPIDmipY = source.fHMPIDmipY;
941
942 fTPCncls = source.fTPCncls;
943 fTPCnclsF = source.fTPCnclsF;
944 fTPCsignalN = source.fTPCsignalN;
949840f6 945 fTPCnclsIter1 = source.fTPCnclsIter1;
946 fTPCnclsFIter1 = source.fTPCnclsFIter1;
732a24fe 947
948 fITSncls = source.fITSncls;
949 fITSClusterMap = source.fITSClusterMap;
25015f7a 950 fITSSharedMap = source.fITSSharedMap;
732a24fe 951 fTRDncls = source.fTRDncls;
952 fTRDncls0 = source.fTRDncls0;
ed15ef4f 953 fTRDntracklets = source.fTRDntracklets;
6dc21f57 954 fVertexID = source.fVertexID;
b5732bf0 955
956 fCacheNCrossedRows = source.fCacheNCrossedRows;
957 fCacheChi2TPCConstrainedVsGlobal = source.fCacheChi2TPCConstrainedVsGlobal;
958 fCacheChi2TPCConstrainedVsGlobalVertex = source.fCacheChi2TPCConstrainedVsGlobalVertex;
959
732a24fe 960 return *this;
961}
962
ddfbc51a 963
964
732a24fe 965void AliESDtrack::Copy(TObject &obj) const {
966
967 // this overwrites the virtual TOBject::Copy()
968 // to allow run time copying without casting
969 // in AliESDEvent
970
971 if(this==&obj)return;
972 AliESDtrack *robj = dynamic_cast<AliESDtrack*>(&obj);
973 if(!robj)return; // not an AliESDtrack
974 *robj = *this;
975
976}
977
ddfbc51a 978
979
00dce61a 980void AliESDtrack::AddCalibObject(TObject * object){
981 //
982 // add calib object to the list
983 //
ddfbc51a 984 if (!fFriendTrack) fFriendTrack = new AliESDfriendTrack;
59c31692 985 if (!fFriendTrack) return;
00dce61a 986 fFriendTrack->AddCalibObject(object);
987}
988
989TObject * AliESDtrack::GetCalibObject(Int_t index){
990 //
991 // return calib objct at given position
992 //
993 if (!fFriendTrack) return 0;
994 return fFriendTrack->GetCalibObject(index);
995}
996
997
f12d42ce 998Bool_t AliESDtrack::FillTPCOnlyTrack(AliESDtrack &track){
b9ca886f 999
1000 // Fills the information of the TPC-only first reconstruction pass
1001 // into the passed ESDtrack object. For consistency fTPCInner is also filled
1002 // again
1003
ddfbc51a 1004
1005
5b305f70 1006 // For data produced before r26675
1007 // RelateToVertexTPC was not properly called during reco
1008 // so you'll have to call it again, before FillTPCOnlyTrack
1009 // Float_t p[2],cov[3];
1010 // track->GetImpactParametersTPC(p,cov);
1011 // if(p[0]==0&&p[1]==0) // <- Default values
1012 // track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
1013
1014
ddfbc51a 1015 if(!fTPCInner)return kFALSE;
b9ca886f 1016
1017 // fill the TPC track params to the global track parameters
1018 track.Set(fTPCInner->GetX(),fTPCInner->GetAlpha(),fTPCInner->GetParameter(),fTPCInner->GetCovariance());
1019 track.fD = fdTPC;
1020 track.fZ = fzTPC;
1021 track.fCdd = fCddTPC;
1022 track.fCdz = fCdzTPC;
1023 track.fCzz = fCzzTPC;
ddfbc51a 1024
67ed91d3 1025 // copy the inner params
ddfbc51a 1026 if(track.fIp) *track.fIp = *fIp;
1027 else track.fIp = new AliExternalTrackParam(*fIp);
1028
b9ca886f 1029 // copy the TPCinner parameters
ddfbc51a 1030 if(track.fTPCInner) *track.fTPCInner = *fTPCInner;
1031 else track.fTPCInner = new AliExternalTrackParam(*fTPCInner);
b9ca886f 1032 track.fdTPC = fdTPC;
1033 track.fzTPC = fzTPC;
1034 track.fCddTPC = fCddTPC;
1035 track.fCdzTPC = fCdzTPC;
1036 track.fCzzTPC = fCzzTPC;
436dfe39 1037 track.fCchi2TPC = fCchi2TPC;
b9ca886f 1038
b9ca886f 1039 // copy all other TPC specific parameters
1040
1041 // replace label by TPC label
1042 track.fLabel = fTPCLabel;
1043 track.fTPCLabel = fTPCLabel;
1044
1045 track.fTPCchi2 = fTPCchi2;
949840f6 1046 track.fTPCchi2Iter1 = fTPCchi2Iter1;
b9ca886f 1047 track.fTPCsignal = fTPCsignal;
1048 track.fTPCsignalS = fTPCsignalS;
ddfbc51a 1049 for(int i = 0;i<4;++i)track.fTPCPoints[i] = fTPCPoints[i];
b9ca886f 1050
1051 track.fTPCncls = fTPCncls;
1052 track.fTPCnclsF = fTPCnclsF;
1053 track.fTPCsignalN = fTPCsignalN;
949840f6 1054 track.fTPCnclsIter1 = fTPCnclsIter1;
1055 track.fTPCnclsFIter1 = fTPCnclsFIter1;
b9ca886f 1056
1057 // PID
ddfbc51a 1058 for(int i=0;i<AliPID::kSPECIES;++i){
b9ca886f 1059 track.fTPCr[i] = fTPCr[i];
1060 // combined PID is TPC only!
1061 track.fR[i] = fTPCr[i];
1062 }
9f638f03 1063 track.fTPCFitMap = fTPCFitMap;
b9ca886f 1064 track.fTPCClusterMap = fTPCClusterMap;
1065 track.fTPCSharedMap = fTPCSharedMap;
ddfbc51a 1066
1067
b9ca886f 1068 // reset the flags
1069 track.fFlags = kTPCin;
1070 track.fID = fID;
1071
b1cfce51 1072 track.fFlags |= fFlags & kTPCpid; //copy the TPCpid status flag
b9ca886f 1073
ddfbc51a 1074 for (Int_t i=0;i<3;i++) track.fKinkIndexes[i] = fKinkIndexes[i];
b9ca886f 1075
1076 return kTRUE;
ddfbc51a 1077
b9ca886f 1078}
1079
9559cbc4 1080//_______________________________________________________________________
1081void AliESDtrack::MakeMiniESDtrack(){
1082 // Resets everything except
1083 // fFlags: Reconstruction status flags
1084 // fLabel: Track label
1085 // fID: Unique ID of the track
d7ddf1e9 1086 // Impact parameter information
9559cbc4 1087 // fR[AliPID::kSPECIES]: combined "detector response probability"
8497bca0 1088 // Running track parameters in the base class (AliExternalTrackParam)
9559cbc4 1089
1090 fTrackLength = 0;
562dd0b4 1091
ddfbc51a 1092 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTrackTime[i] = 0;
1093
9559cbc4 1094 // Reset track parameters constrained to the primary vertex
ddfbc51a 1095 delete fCp;fCp = 0;
1096
9559cbc4 1097 // Reset track parameters at the inner wall of TPC
ddfbc51a 1098 delete fIp;fIp = 0;
1099 delete fTPCInner;fTPCInner=0;
9559cbc4 1100 // Reset track parameters at the inner wall of the TRD
ddfbc51a 1101 delete fOp;fOp = 0;
c38d443f 1102 // Reset track parameters at the HMPID
ddfbc51a 1103 delete fHMPIDp;fHMPIDp = 0;
1104
1105
9559cbc4 1106 // Reset ITS track related information
1107 fITSchi2 = 0;
9559cbc4 1108 fITSncls = 0;
62665e7f 1109 fITSClusterMap=0;
25015f7a 1110 fITSSharedMap=0;
9559cbc4 1111 fITSsignal = 0;
ddfbc51a 1112 for (Int_t i=0;i<4;i++) fITSdEdxSamples[i] = 0.;
1113 for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0;
9559cbc4 1114 fITSLabel = 0;
9559cbc4 1115
1116 // Reset TPC related track information
1117 fTPCchi2 = 0;
949840f6 1118 fTPCchi2Iter1 = 0;
9559cbc4 1119 fTPCncls = 0;
e1d4c1b5 1120 fTPCnclsF = 0;
949840f6 1121 fTPCnclsIter1 = 0;
9f638f03 1122 fTPCnclsFIter1 = 0;
1123 fTPCFitMap = 0;
9559cbc4 1124 fTPCClusterMap = 0;
eb7f6854 1125 fTPCSharedMap = 0;
9559cbc4 1126 fTPCsignal= 0;
e1d4c1b5 1127 fTPCsignalS= 0;
1128 fTPCsignalN= 0;
ddfbc51a 1129 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0;
9559cbc4 1130 fTPCLabel=0;
ddfbc51a 1131 for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
1132 for (Int_t i=0; i<3;i++) fKinkIndexes[i] = 0;
1133 for (Int_t i=0; i<3;i++) fV0Indexes[i] = 0;
9559cbc4 1134
1135 // Reset TRD related track information
1136 fTRDchi2 = 0;
1137 fTRDncls = 0;
1138 fTRDncls0 = 0;
9559cbc4 1139 fTRDsignal = 0;
ddfbc51a 1140 for (Int_t i=0;i<kTRDnPlanes;i++) {
1141 fTRDTimBin[i] = 0;
1142 }
1143 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0;
9559cbc4 1144 fTRDLabel = 0;
9559cbc4 1145 fTRDQuality = 0;
ed15ef4f 1146 fTRDntracklets = 0;
ddfbc51a 1147 if(fTRDnSlices)
1148 delete[] fTRDslices;
1149 fTRDslices=0x0;
6984f7c1 1150 fTRDnSlices=0;
23d49657 1151 fTRDBudget = 0;
9559cbc4 1152
1153 // Reset TOF related track information
1154 fTOFchi2 = 0;
ce3f4882 1155 fTOFindex = -1;
ab37ab1e 1156 fTOFsignal = 99999;
1157 fTOFCalChannel = -1;
1158 fTOFsignalToT = 99999;
1159 fTOFsignalRaw = 99999;
1160 fTOFsignalDz = 999;
1161 fTOFsignalDx = 999;
1162 fTOFdeltaBC = 999;
1163 fTOFl0l1 = 999;
ddfbc51a 1164 for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
1165 for (Int_t i=0;i<3;i++) fTOFLabel[i] = -1;
1166 for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
9559cbc4 1167
f4b3bbb7 1168 // Reset HMPID related track information
1169 fHMPIDchi2 = 0;
562dd0b4 1170 fHMPIDqn = 0;
81aa7a0d 1171 fHMPIDcluIdx = -1;
f4b3bbb7 1172 fHMPIDsignal = 0;
ddfbc51a 1173 for (Int_t i=0;i<AliPID::kSPECIES;i++) fHMPIDr[i] = 0;
562dd0b4 1174 fHMPIDtrkTheta = 0;
1175 fHMPIDtrkPhi = 0;
1176 fHMPIDtrkX = 0;
1177 fHMPIDtrkY = 0;
1178 fHMPIDmipX = 0;
1179 fHMPIDmipY = 0;
f1cedef3 1180 fCaloIndex = kEMCALNoMatch;
9559cbc4 1181
b5b2b4db 1182 // reset global track chi2
1183 fGlobalChi2 = 0;
1184
6dc21f57 1185 fVertexID = -2; // an orphan track
ddfbc51a 1186
1187 delete fFriendTrack; fFriendTrack = 0;
9559cbc4 1188}
ec729fb0 1189
bf7942ff 1190//_______________________________________________________________________
1191Int_t AliESDtrack::GetPID() const
1192{
1193 // Returns the particle most probable id
ddfbc51a 1194 Int_t i;
1195 for (i=0; i<AliPID::kSPECIES-1; i++) if (fR[i] != fR[i+1]) break;
bf7942ff 1196 //
1197 if (i == AliPID::kSPECIES-1) return AliPID::kPion; // If all the probabilities are equal, return the pion mass
1198 //
ae982df3 1199 Float_t max=0.;
1200 Int_t k=-1;
ddfbc51a 1201 for (i=0; i<AliPID::kSPECIES; i++) if (fR[i]>max) {k=i; max=fR[i];}
bf7942ff 1202 //
db3989b3 1203 if (k==0) { // dE/dx "crossing points" in the TPC
bf7942ff 1204 Double_t p=GetP();
1205 if ((p>0.38)&&(p<0.48))
1206 if (fR[0]<fR[3]*10.) return AliPID::kKaon;
1207 if ((p>0.75)&&(p<0.85))
1208 if (fR[0]<fR[4]*10.) return AliPID::kProton;
1209 return AliPID::kElectron;
db3989b3 1210 }
bf7942ff 1211 if (k==1) return AliPID::kMuon;
1212 if (k==2||k==-1) return AliPID::kPion;
1213 if (k==3) return AliPID::kKaon;
1214 if (k==4) return AliPID::kProton;
1215 AliWarning("Undefined PID !");
1216 return AliPID::kPion;
1217}
1218
1219//_______________________________________________________________________
a512bf97 1220Int_t AliESDtrack::GetTOFBunchCrossing(Double_t b) const
bf7942ff 1221{
1222 // Returns the number of bunch crossings after trigger (assuming 25ns spacing)
bf7942ff 1223 const double kSpacing = 25e3; // min interbanch spacing
1224 const double kShift = 0;
3f2db92f 1225 Int_t bcid = kTOFBCNA; // defualt one
a512bf97 1226 if (!IsOn(kTOFout) || !IsOn(kESDpid)) return bcid; // no info
1227 //
1228 double tdif = fTOFsignal;
1229 if (IsOn(kTIME)) { // integrated time info is there
1230 int pid = GetPID();
1231 tdif -= fTrackTime[pid];
1232 }
1233 else { // assume integrated time info from TOF radius and momentum
1234 const double kRTOF = 385.;
1235 const double kCSpeed = 3.e-2; // cm/ps
1236 double p = GetP();
1237 if (p<0.01) return bcid;
1238 double m = GetMass();
1239 double curv = GetC(b);
1240 double path = TMath::Abs(curv)>kAlmost0 ? // account for curvature
1241 2./curv*TMath::ASin(kRTOF*curv/2.)*TMath::Sqrt(1.+GetTgl()*GetTgl()) : kRTOF;
1242 tdif -= path/kCSpeed*TMath::Sqrt(1.+m*m/(p*p));
1243 }
bf7942ff 1244 bcid = TMath::Nint((tdif - kShift)/kSpacing);
1245 return bcid;
ae982df3 1246}
1247
6b5b49c9 1248//______________________________________________________________________________
1249Double_t AliESDtrack::M() const
1250{
2850a7f3 1251 // Returns the assumed mass
1252 // (the pion mass, if the particle can't be identified properly).
9be82450 1253 static Bool_t printerr=kTRUE;
1254 if (printerr) {
1255 AliWarning("WARNING !!! ... THIS WILL BE PRINTED JUST ONCE !!!");
1256 printerr = kFALSE;
1257 AliWarning("This is the ESD mass. Use it with care !");
1258 }
6b5b49c9 1259 return GetMass();
1260}
1261
aad8d435 1262//______________________________________________________________________________
1263Double_t AliESDtrack::E() const
1264{
1265 // Returns the energy of the particle given its assumed mass.
1266 // Assumes the pion mass if the particle can't be identified properly.
1267
1268 Double_t m = M();
1269 Double_t p = P();
1270 return TMath::Sqrt(p*p + m*m);
1271}
1272
1273//______________________________________________________________________________
1274Double_t AliESDtrack::Y() const
1275{
1276 // Returns the rapidity of a particle given its assumed mass.
1277 // Assumes the pion mass if the particle can't be identified properly.
1278
1279 Double_t e = E();
1280 Double_t pz = Pz();
e03e4544 1281 if (e != TMath::Abs(pz)) { // energy was not equal to pz
aad8d435 1282 return 0.5*TMath::Log((e+pz)/(e-pz));
1283 } else { // energy was equal to pz
1284 return -999.;
1285 }
1286}
1287
ae982df3 1288//_______________________________________________________________________
c9ec41e8 1289Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
ae982df3 1290 //
1291 // This function updates track's running parameters
1292 //
15614b8b 1293 Bool_t rc=kTRUE;
1294
9b859005 1295 SetStatus(flags);
1296 fLabel=t->GetLabel();
1297
1298 if (t->IsStartedTimeIntegral()) {
1299 SetStatus(kTIME);
ddfbc51a 1300 Double_t times[10];t->GetIntegratedTimes(times); SetIntegratedTimes(times);
9b859005 1301 SetIntegratedLength(t->GetIntegratedLength());
1302 }
1303
6c94f330 1304 Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
59c31692 1305 if (fFriendTrack) {
ddfbc51a 1306 if (flags==kITSout) fFriendTrack->SetITSOut(*t);
1307 if (flags==kTPCout) fFriendTrack->SetTPCOut(*t);
1308 if (flags==kTRDrefit) fFriendTrack->SetTRDIn(*t);
59c31692 1309 }
ddfbc51a 1310
ae982df3 1311 switch (flags) {
ddfbc51a 1312
6c3c2a50 1313 case kITSin:
1314 fITSchi2Std[0] = t->GetChi2();
1315 //
1316 case kITSout:
1317 fITSchi2Std[1] = t->GetChi2();
ddfbc51a 1318 case kITSrefit:
1319 {
6c3c2a50 1320 fITSchi2Std[2] = t->GetChi2();
48704648 1321 fITSClusterMap=0;
ae982df3 1322 fITSncls=t->GetNumberOfClusters();
59c31692 1323 if (fFriendTrack) {
ddfbc51a 1324 Int_t* indexITS = new Int_t[AliESDfriendTrack::kMaxITScluster];
1325 for (Int_t i=0;i<AliESDfriendTrack::kMaxITScluster;i++) {
6d3a7bbf 1326 indexITS[i]=t->GetClusterIndex(i);
ddfbc51a 1327
62665e7f 1328 if (i<fITSncls) {
6d3a7bbf 1329 Int_t l=(indexITS[i] & 0xf0000000) >> 28;
ddfbc51a 1330 SETBIT(fITSClusterMap,l);
62665e7f 1331 }
1332 }
ddfbc51a 1333 fFriendTrack->SetITSIndices(indexITS,AliESDfriendTrack::kMaxITScluster);
1334 delete [] indexITS;
1335 }
1336
ae982df3 1337 fITSchi2=t->GetChi2();
ae982df3 1338 fITSsignal=t->GetPIDsignal();
6e5b1b04 1339 fITSLabel = t->GetLabel();
57483eb1 1340 // keep in fOp the parameters outside ITS for ITS stand-alone tracks
1341 if (flags==kITSout) {
ddfbc51a 1342 if (!fOp) fOp=new AliExternalTrackParam(*t);
1343 else
1344 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1345 }
6d3a7bbf 1346 }
ae982df3 1347 break;
ddfbc51a 1348
9b859005 1349 case kTPCin: case kTPCrefit:
ddfbc51a 1350 {
6e5b1b04 1351 fTPCLabel = t->GetLabel();
949840f6 1352 if (flags==kTPCin) {
ddfbc51a 1353 fTPCInner=new AliExternalTrackParam(*t);
1354 fTPCnclsIter1=t->GetNumberOfClusters();
1355 fTPCchi2Iter1=t->GetChi2();
949840f6 1356 }
ddfbc51a 1357 if (!fIp) fIp=new AliExternalTrackParam(*t);
1358 else
1359 fIp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
6d3a7bbf 1360 }
5d6fb68d 1361 // Intentionally no break statement; need to set general TPC variables as well
9b859005 1362 case kTPCout:
ddfbc51a 1363 {
1d303a24 1364 if (flags & kTPCout){
ddfbc51a 1365 if (!fOp) fOp=new AliExternalTrackParam(*t);
1366 else
1367 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
1d303a24 1368 }
e1d4c1b5 1369 fTPCncls=t->GetNumberOfClusters();
ae982df3 1370 fTPCchi2=t->GetChi2();
a866ac60 1371
5d6fb68d 1372 if (fFriendTrack) { // Copy cluster indices
ddfbc51a 1373 Int_t* indexTPC = new Int_t[AliESDfriendTrack::kMaxTPCcluster];
1374 for (Int_t i=0;i<AliESDfriendTrack::kMaxTPCcluster;i++)
1375 indexTPC[i]=t->GetClusterIndex(i);
5d6fb68d 1376 fFriendTrack->SetTPCIndices(indexTPC,AliESDfriendTrack::kMaxTPCcluster);
ddfbc51a 1377 delete [] indexTPC;
5d6fb68d 1378 }
ae982df3 1379 fTPCsignal=t->GetPIDsignal();
ddfbc51a 1380 }
ae982df3 1381 break;
ddfbc51a 1382
64130601 1383 case kTRDin: case kTRDrefit:
1384 break;
1385 case kTRDout:
ddfbc51a 1386 {
51ad6848 1387 fTRDLabel = t->GetLabel();
2f83b7a6 1388 fTRDchi2 = t->GetChi2();
1389 fTRDncls = t->GetNumberOfClusters();
59c31692 1390 if (fFriendTrack) {
ddfbc51a 1391 Int_t* indexTRD = new Int_t[AliESDfriendTrack::kMaxTRDcluster];
1392 for (Int_t i=0;i<AliESDfriendTrack::kMaxTRDcluster;i++) indexTRD[i]=-2;
1393 for (Int_t i=0;i<6;i++) indexTRD[i]=t->GetTrackletIndex(i);
6d3a7bbf 1394 fFriendTrack->SetTRDIndices(indexTRD,AliESDfriendTrack::kMaxTRDcluster);
ddfbc51a 1395 delete [] indexTRD;
59c31692 1396 }
ddfbc51a 1397
79e94bf8 1398 fTRDsignal=t->GetPIDsignal();
ddfbc51a 1399 }
79e94bf8 1400 break;
c4d11b15 1401 case kTRDbackup:
ddfbc51a 1402 if (!fOp) fOp=new AliExternalTrackParam(*t);
1403 else
1404 fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
c4d11b15 1405 fTRDncls0 = t->GetNumberOfClusters();
1406 break;
1407 case kTOFin:
1408 break;
1409 case kTOFout:
1410 break;
d0862fea 1411 case kTRDStop:
1412 break;
c38d443f 1413 case kHMPIDout:
ddfbc51a 1414 if (!fHMPIDp) fHMPIDp=new AliExternalTrackParam(*t);
1415 else
1416 fHMPIDp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
c38d443f 1417 break;
ae982df3 1418 default:
5f7789fc 1419 AliError("Wrong flag !");
ae982df3 1420 return kFALSE;
1421 }
ddfbc51a 1422
15614b8b 1423 return rc;
ae982df3 1424}
1425
1426//_______________________________________________________________________
1427void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
1428 //---------------------------------------------------------------------
1429 // This function returns external representation of the track parameters
1430 //---------------------------------------------------------------------
c9ec41e8 1431 x=GetX();
ddfbc51a 1432 for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i];
15614b8b 1433}
1434
67c3dcbe 1435//_______________________________________________________________________
a866ac60 1436void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
67c3dcbe 1437 //---------------------------------------------------------------------
1438 // This function returns external representation of the cov. matrix
1439 //---------------------------------------------------------------------
ddfbc51a 1440 for (Int_t i=0; i<15; i++) cov[i]=AliExternalTrackParam::GetCovariance()[i];
67c3dcbe 1441}
1442
67c3dcbe 1443//_______________________________________________________________________
c0b978f0 1444Bool_t AliESDtrack::GetConstrainedExternalParameters
1445 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
67c3dcbe 1446 //---------------------------------------------------------------------
1447 // This function returns the constrained external track parameters
1448 //---------------------------------------------------------------------
c0b978f0 1449 if (!fCp) return kFALSE;
1450 alpha=fCp->GetAlpha();
c9ec41e8 1451 x=fCp->GetX();
ddfbc51a 1452 for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
c0b978f0 1453 return kTRUE;
67c3dcbe 1454}
c9ec41e8 1455
67c3dcbe 1456//_______________________________________________________________________
c0b978f0 1457Bool_t
67c3dcbe 1458AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
1459 //---------------------------------------------------------------------
1460 // This function returns the constrained external cov. matrix
1461 //---------------------------------------------------------------------
c0b978f0 1462 if (!fCp) return kFALSE;
ddfbc51a 1463 for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
c0b978f0 1464 return kTRUE;
67c3dcbe 1465}
1466
c0b978f0 1467Bool_t
1468AliESDtrack::GetInnerExternalParameters
1469 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1470 //---------------------------------------------------------------------
c9ec41e8 1471 // This function returns external representation of the track parameters
1472 // at the inner layer of TPC
9b859005 1473 //---------------------------------------------------------------------
c0b978f0 1474 if (!fIp) return kFALSE;
1475 alpha=fIp->GetAlpha();
c9ec41e8 1476 x=fIp->GetX();
ddfbc51a 1477 for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
c0b978f0 1478 return kTRUE;
9b859005 1479}
1480
c0b978f0 1481Bool_t
1482AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
c9ec41e8 1483 //---------------------------------------------------------------------
1484 // This function returns external representation of the cov. matrix
1485 // at the inner layer of TPC
1486 //---------------------------------------------------------------------
c0b978f0 1487 if (!fIp) return kFALSE;
ddfbc51a 1488 for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
c0b978f0 1489 return kTRUE;
9b859005 1490}
1491
d61ca12d 1492void
1493AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
1494 //
1495 // This is a direct setter for the outer track parameters
1496 //
1497 SetStatus(flags);
1498 if (fOp) delete fOp;
1499 fOp=new AliExternalTrackParam(*p);
1500}
1501
c38d443f 1502void
1503AliESDtrack::SetOuterHmpParam(const AliExternalTrackParam *p, ULong_t flags) {
1504 //
1505 // This is a direct setter for the outer track parameters
1506 //
1507 SetStatus(flags);
ddfbc51a 1508 if (fHMPIDp) delete fHMPIDp;
1509 fHMPIDp=new AliExternalTrackParam(*p);
c38d443f 1510}
1511
c0b978f0 1512Bool_t
1513AliESDtrack::GetOuterExternalParameters
1514 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1515 //---------------------------------------------------------------------
c9ec41e8 1516 // This function returns external representation of the track parameters
1517 // at the inner layer of TRD
a866ac60 1518 //---------------------------------------------------------------------
c0b978f0 1519 if (!fOp) return kFALSE;
1520 alpha=fOp->GetAlpha();
c9ec41e8 1521 x=fOp->GetX();
ddfbc51a 1522 for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
c0b978f0 1523 return kTRUE;
a866ac60 1524}
c9ec41e8 1525
c38d443f 1526Bool_t
1527AliESDtrack::GetOuterHmpExternalParameters
1528 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
1529 //---------------------------------------------------------------------
1530 // This function returns external representation of the track parameters
1531 // at the inner layer of TRD
1532 //---------------------------------------------------------------------
1533 if (!fHMPIDp) return kFALSE;
1534 alpha=fHMPIDp->GetAlpha();
1535 x=fHMPIDp->GetX();
ddfbc51a 1536 for (Int_t i=0; i<5; i++) p[i]=fHMPIDp->GetParameter()[i];
c38d443f 1537 return kTRUE;
1538}
1539
c0b978f0 1540Bool_t
1541AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
a866ac60 1542 //---------------------------------------------------------------------
c9ec41e8 1543 // This function returns external representation of the cov. matrix
1544 // at the inner layer of TRD
a866ac60 1545 //---------------------------------------------------------------------
c0b978f0 1546 if (!fOp) return kFALSE;
ddfbc51a 1547 for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
c0b978f0 1548 return kTRUE;
a866ac60 1549}
1550
c38d443f 1551Bool_t
1552AliESDtrack::GetOuterHmpExternalCovariance(Double_t cov[15]) const {
1553 //---------------------------------------------------------------------
1554 // This function returns external representation of the cov. matrix
1555 // at the inner layer of TRD
1556 //---------------------------------------------------------------------
1557 if (!fHMPIDp) return kFALSE;
ddfbc51a 1558 for (Int_t i=0; i<15; i++) cov[i]=fHMPIDp->GetCovariance()[i];
c38d443f 1559 return kTRUE;
1560}
1561
98937d93 1562Int_t AliESDtrack::GetNcls(Int_t idet) const
1563{
1564 // Get number of clusters by subdetector index
1565 //
1566 Int_t ncls = 0;
1567 switch(idet){
1568 case 0:
1569 ncls = fITSncls;
1570 break;
1571 case 1:
1572 ncls = fTPCncls;
1573 break;
1574 case 2:
1575 ncls = fTRDncls;
1576 break;
1577 case 3:
ce3f4882 1578 if (fTOFindex != -1)
98937d93 1579 ncls = 1;
1580 break;
81aa7a0d 1581 case 4: //PHOS
1582 break;
1583 case 5: //HMPID
1584 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1585 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1586 ncls = 1;
1587 }
1588 }
1589 break;
98937d93 1590 default:
1591 break;
1592 }
1593 return ncls;
1594}
1595
ef7253ac 1596Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
98937d93 1597{
1598 // Get cluster index array by subdetector index
1599 //
1600 Int_t ncls = 0;
1601 switch(idet){
1602 case 0:
1603 ncls = GetITSclusters(idx);
1604 break;
1605 case 1:
ef7253ac 1606 ncls = GetTPCclusters(idx);
98937d93 1607 break;
1608 case 2:
1609 ncls = GetTRDclusters(idx);
1610 break;
1611 case 3:
ce3f4882 1612 if (fTOFindex != -1) {
1613 idx[0] = fTOFindex;
98937d93 1614 ncls = 1;
1615 }
1616 break;
313af949 1617 case 4: //PHOS
1618 break;
1619 case 5:
81aa7a0d 1620 if ((fHMPIDcluIdx >= 0) && (fHMPIDcluIdx < 7000000)) {
1621 if ((fHMPIDcluIdx%1000000 != 9999) && (fHMPIDcluIdx%1000000 != 99999)) {
1622 idx[0] = GetHMPIDcluIdx();
1623 ncls = 1;
1624 }
313af949 1625 }
1626 break;
1627 case 6: //EMCAL
1628 break;
98937d93 1629 default:
1630 break;
1631 }
1632 return ncls;
1633}
1634
ae982df3 1635//_______________________________________________________________________
1636void AliESDtrack::GetIntegratedTimes(Double_t *times) const {
4427806c 1637 // Returns the array with integrated times for each particle hypothesis
ddfbc51a 1638 for (Int_t i=0; i<AliPID::kSPECIES; i++) times[i]=fTrackTime[i];
ae982df3 1639}
1640
1641//_______________________________________________________________________
1642void AliESDtrack::SetIntegratedTimes(const Double_t *times) {
4427806c 1643 // Sets the array with integrated times for each particle hypotesis
ddfbc51a 1644 for (Int_t i=0; i<AliPID::kSPECIES; i++) fTrackTime[i]=times[i];
ae982df3 1645}
1646
c630aafd 1647//_______________________________________________________________________
4427806c 1648void AliESDtrack::SetITSpid(const Double_t *p) {
1649 // Sets values for the probability of each particle type (in ITS)
d27bbc79 1650 SetPIDValues(fITSr,p,AliPID::kSPECIES);
c630aafd 1651 SetStatus(AliESDtrack::kITSpid);
1652}
1653
1654//_______________________________________________________________________
1655void AliESDtrack::GetITSpid(Double_t *p) const {
4427806c 1656 // Gets the probability of each particle type (in ITS)
ddfbc51a 1657 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fITSr[i];
c630aafd 1658}
1659
ae982df3 1660//_______________________________________________________________________
562dd0b4 1661Char_t AliESDtrack::GetITSclusters(Int_t *idx) const {
ae982df3 1662 //---------------------------------------------------------------------
1663 // This function returns indices of the assgined ITS clusters
1664 //---------------------------------------------------------------------
59c31692 1665 if (idx && fFriendTrack) {
6d3a7bbf 1666 Int_t *index=fFriendTrack->GetITSindices();
ddfbc51a 1667 for (Int_t i=0; i<AliESDfriendTrack::kMaxITScluster; i++) {
6d3a7bbf 1668 if ( (i>=fITSncls) && (i<6) ) idx[i]=-1;
1669 else {
1670 if (index) {
1671 idx[i]=index[i];
1672 }
1673 else idx[i]= -2;
1674 }
1675 }
15e85efa 1676 }
ae982df3 1677 return fITSncls;
1678}
1679
89f1b176 1680//_______________________________________________________________________
1681Bool_t AliESDtrack::GetITSModuleIndexInfo(Int_t ilayer,Int_t &idet,Int_t &status,
1682 Float_t &xloc,Float_t &zloc) const {
1683 //----------------------------------------------------------------------
1684 // This function encodes in the module number also the status of cluster association
1685 // "status" can have the following values:
1686 // 1 "found" (cluster is associated),
1687 // 2 "dead" (module is dead from OCDB),
1688 // 3 "skipped" (module or layer forced to be skipped),
1689 // 4 "outinz" (track out of z acceptance),
1690 // 5 "nocls" (no clusters in the road),
1691 // 6 "norefit" (cluster rejected during refit),
1692 // 7 "deadzspd" (holes in z in SPD)
1693 // Also given are the coordinates of the crossing point of track and module
1694 // (in the local module ref. system)
1695 // WARNING: THIS METHOD HAS TO BE SYNCHRONIZED WITH AliITStrackV2::GetModuleIndexInfo()!
1696 //----------------------------------------------------------------------
1697
1698 if(fITSModule[ilayer]==-1) {
89f1b176 1699 idet = -1;
1700 status=0;
1701 xloc=-99.; zloc=-99.;
1702 return kFALSE;
1703 }
1704
1705 Int_t module = fITSModule[ilayer];
1706
1707 idet = Int_t(module/1000000);
1708
1709 module -= idet*1000000;
1710
1711 status = Int_t(module/100000);
1712
1713 module -= status*100000;
1714
1715 Int_t signs = Int_t(module/10000);
1716
1717 module-=signs*10000;
1718
1719 Int_t xInt = Int_t(module/100);
1720 module -= xInt*100;
1721
1722 Int_t zInt = module;
1723
1724 if(signs==1) { xInt*=1; zInt*=1; }
1725 if(signs==2) { xInt*=1; zInt*=-1; }
1726 if(signs==3) { xInt*=-1; zInt*=1; }
1727 if(signs==4) { xInt*=-1; zInt*=-1; }
1728
1729 xloc = 0.1*(Float_t)xInt;
1730 zloc = 0.1*(Float_t)zInt;
1731
1732 if(status==4) idet = -1;
1733
1734 return kTRUE;
1735}
1736
ae982df3 1737//_______________________________________________________________________
562dd0b4 1738UShort_t AliESDtrack::GetTPCclusters(Int_t *idx) const {
ae982df3 1739 //---------------------------------------------------------------------
1740 // This function returns indices of the assgined ITS clusters
1741 //---------------------------------------------------------------------
59c31692 1742 if (idx && fFriendTrack) {
15e85efa 1743 Int_t *index=fFriendTrack->GetTPCindices();
6d3a7bbf 1744
1745 if (index){
ddfbc51a 1746 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=index[i];
6d3a7bbf 1747 }
1748 else {
ddfbc51a 1749 for (Int_t i=0; i<AliESDfriendTrack::kMaxTPCcluster; i++) idx[i]=-2;
6d3a7bbf 1750 }
15e85efa 1751 }
ae982df3 1752 return fTPCncls;
1753}
8c6a71ab 1754
4c3dc2a0 1755//_______________________________________________________________________
1756Float_t AliESDtrack::GetTPCCrossedRows() const
1757{
1758 // This function calls GetTPCClusterInfo with some default parameters which are used in the track selection and caches the outcome
1759 // because GetTPCClusterInfo is quite time-consuming
1760
1761 if (fCacheNCrossedRows > -1)
1762 return fCacheNCrossedRows;
1763
1764 fCacheNCrossedRows = GetTPCClusterInfo(2, 1);
1765 return fCacheNCrossedRows;
1766}
1767
6a6f0c1f 1768//_______________________________________________________________________
25f906db 1769Float_t AliESDtrack::GetTPCClusterInfo(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1, Int_t bitType ) const
6a6f0c1f 1770{
1771 //
1772 // TPC cluster information
1773 // type 0: get fraction of found/findable clusters with neighbourhood definition
1774 // 1: findable clusters with neighbourhood definition
1775 // 2: found clusters
25f906db 1776 // bitType:
1777 // 0 - all cluster used
1778 // 1 - clusters used for the kalman update
6a6f0c1f 1779 // definition of findable clusters:
1780 // a cluster is defined as findable if there is another cluster
1781 // within +- nNeighbours pad rows. The idea is to overcome threshold
1782 // effects with a very simple algorithm.
1783 //
1784
6a6f0c1f 1785
1786 Int_t found=0;
1787 Int_t findable=0;
1788 Int_t last=-nNeighbours;
25f906db 1789 const TBits & clusterMap = (bitType%2==0) ? fTPCClusterMap : fTPCFitMap;
6a6f0c1f 1790
25f906db 1791 Int_t upperBound=clusterMap.GetNbits();
59c31692 1792 if (upperBound>row1) upperBound=row1;
ddfbc51a 1793 for (Int_t i=row0; i<upperBound; ++i){
6a6f0c1f 1794 //look to current row
25f906db 1795 if (clusterMap[i]) {
6a6f0c1f 1796 last=i;
1797 ++found;
1798 ++findable;
1799 continue;
1800 }
1801 //look to nNeighbours before
1802 if ((i-last)<=nNeighbours) {
1803 ++findable;
1804 continue;
1805 }
1806 //look to nNeighbours after
1807 for (Int_t j=i+1; j<i+1+nNeighbours; ++j){
25f906db 1808 if (clusterMap[j]){
6a6f0c1f 1809 ++findable;
1810 break;
1811 }
1812 }
1813 }
25f906db 1814 if (type==2) return found;
1815 if (type==1) return findable;
1816
1817 if (type==0){
1818 Float_t fraction=0;
1819 if (findable>0)
1820 fraction=(Float_t)found/(Float_t)findable;
1821 else
1822 fraction=0;
1823 return fraction;
1824 }
1825 return 0; // undefined type - default value
1826}
1827
1828//_______________________________________________________________________
1829Float_t AliESDtrack::GetTPCClusterDensity(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1, Int_t bitType ) const
1830{
1831 //
1832 // TPC cluster density - only rows where signal before and after given row are used
1833 // - slower function
1834 // type 0: get fraction of found/findable clusters with neighbourhood definition
1835 // 1: findable clusters with neighbourhood definition
1836 // 2: found clusters
1837 // bitType:
1838 // 0 - all cluster used
1839 // 1 - clusters used for the kalman update
1840 // definition of findable clusters:
1841 // a cluster is defined as findable if there is another cluster
1842 // within +- nNeighbours pad rows. The idea is to overcome threshold
1843 // effects with a very simple algorithm.
1844 //
1845 Int_t found=0;
1846 Int_t findable=0;
1847 // Int_t last=-nNeighbours;
1848 const TBits & clusterMap = (bitType%2==0) ? fTPCClusterMap : fTPCFitMap;
1849 Int_t upperBound=clusterMap.GetNbits();
1850 if (upperBound>row1) upperBound=row1;
1851 for (Int_t i=row0; i<upperBound; ++i){
1852 Bool_t isUp=kFALSE;
1853 Bool_t isDown=kFALSE;
1854 for (Int_t idelta=1; idelta<=nNeighbours; idelta++){
1855 if (i-idelta>=0 && clusterMap[i-idelta]) isDown=kTRUE;
1856 if (i+idelta<upperBound && clusterMap[i+idelta]) isUp=kTRUE;
1857 }
1858 if (isUp&&isDown){
1859 ++findable;
1860 if (clusterMap[i]) ++found;
1861 }
1862 }
1863 if (type==2) return found;
82cc468e 1864 if (type==1) return findable;
1865
6a6f0c1f 1866 if (type==0){
82cc468e 1867 Float_t fraction=0;
1868 if (findable>0)
1869 fraction=(Float_t)found/(Float_t)findable;
1870 else
1871 fraction=0;
1872 return fraction;
1873 }
1874 return 0; // undefined type - default value
6a6f0c1f 1875}
1876
25f906db 1877
1878
1879
6a6f0c1f 1880//_______________________________________________________________________
562dd0b4 1881Double_t AliESDtrack::GetTPCdensity(Int_t row0, Int_t row1) const{
81e97e0d 1882 //
1883 // GetDensity of the clusters on given region between row0 and row1
1884 // Dead zone effect takin into acoount
1885 //
59c31692 1886 if (!fFriendTrack) return 0.0;
81e97e0d 1887 Int_t good = 0;
1888 Int_t found = 0;
1889 //
15e85efa 1890 Int_t *index=fFriendTrack->GetTPCindices();
81e97e0d 1891 for (Int_t i=row0;i<=row1;i++){
15e85efa 1892 Int_t idx = index[i];
1893 if (idx!=-1) good++; // track outside of dead zone
1894 if (idx>0) found++;
81e97e0d 1895 }
1896 Float_t density=0.5;
a3061175 1897 if (good>TMath::Max((row1-row0)*0.5,0.0)) density = Float_t(found)/Float_t(good);
81e97e0d 1898 return density;
1899}
c84a5e9e 1900
8c6a71ab 1901//_______________________________________________________________________
1902void AliESDtrack::SetTPCpid(const Double_t *p) {
4427806c 1903 // Sets values for the probability of each particle type (in TPC)
d27bbc79 1904 SetPIDValues(fTPCr,p,AliPID::kSPECIES);
8c6a71ab 1905 SetStatus(AliESDtrack::kTPCpid);
1906}
1907
1908//_______________________________________________________________________
1909void AliESDtrack::GetTPCpid(Double_t *p) const {
4427806c 1910 // Gets the probability of each particle type (in TPC)
ddfbc51a 1911 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTPCr[i];
8c6a71ab 1912}
1913
bb2ceb1f 1914//_______________________________________________________________________
562dd0b4 1915UChar_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
bb2ceb1f 1916 //---------------------------------------------------------------------
1917 // This function returns indices of the assgined TRD clusters
1918 //---------------------------------------------------------------------
59c31692 1919 if (idx && fFriendTrack) {
6d3a7bbf 1920 Int_t *index=fFriendTrack->GetTRDindices();
ddfbc51a 1921
1922 if (index) {
1923 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=index[i];
1924 }
1925 else {
1926 for (Int_t i=0; i<AliESDfriendTrack::kMaxTRDcluster; i++) idx[i]=-2;
1927 }
15e85efa 1928 }
bb2ceb1f 1929 return fTRDncls;
1930}
1931
5bc3e158 1932//_______________________________________________________________________
1933UChar_t AliESDtrack::GetTRDtracklets(Int_t *idx) const {
0ad488b0 1934//
1935// This function returns the number of TRD tracklets used in tracking
1936// and it fills the indices of these tracklets in the array "idx" as they
1937// are registered in the TRD track list.
1938//
1939// Caution :
1940// 1. The idx array has to be allocated with a size >= AliESDtrack::kTRDnPlanes
1941// 2. The idx array store not only the index but also the layer of the tracklet.
1942// Therefore tracks with TRD gaps contain default values for indices [-1]
1943
59c31692 1944 if (!fFriendTrack) return 0;
0ad488b0 1945 if (!idx) return GetTRDntracklets();
6d3a7bbf 1946 Int_t *index=fFriendTrack->GetTRDindices();
1947 Int_t n = 0;
ddfbc51a 1948 for (Int_t i=0; i<kTRDnPlanes; i++){
6d3a7bbf 1949 if (index){
1950 if(index[i]>=0) n++;
1951 idx[i]=index[i];
1952 }
1953 else idx[i] = -2;
5bc3e158 1954 }
0ad488b0 1955 return n;
5bc3e158 1956}
1957
c630aafd 1958//_______________________________________________________________________
1959void AliESDtrack::SetTRDpid(const Double_t *p) {
4427806c 1960 // Sets values for the probability of each particle type (in TRD)
d27bbc79 1961 SetPIDValues(fTRDr,p,AliPID::kSPECIES);
c630aafd 1962 SetStatus(AliESDtrack::kTRDpid);
1963}
1964
1965//_______________________________________________________________________
1966void AliESDtrack::GetTRDpid(Double_t *p) const {
4427806c 1967 // Gets the probability of each particle type (in TRD)
ddfbc51a 1968 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTRDr[i];
c630aafd 1969}
1970
79e94bf8 1971//_______________________________________________________________________
1972void AliESDtrack::SetTRDpid(Int_t iSpecies, Float_t p)
1973{
4427806c 1974 // Sets the probability of particle type iSpecies to p (in TRD)
79e94bf8 1975 fTRDr[iSpecies] = p;
1976}
1977
562dd0b4 1978Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
79e94bf8 1979{
4427806c 1980 // Returns the probability of particle type iSpecies (in TRD)
79e94bf8 1981 return fTRDr[iSpecies];
1982}
1983
fae4c212 1984//____________________________________________________
1985Int_t AliESDtrack::GetNumberOfTRDslices() const
1986{
1987 // built in backward compatibility
1988 Int_t idx = fTRDnSlices - (kTRDnPlanes<<1);
1989 return idx<18 ? fTRDnSlices/kTRDnPlanes : idx/kTRDnPlanes;
1990}
1991
1992//____________________________________________________
1993Double_t AliESDtrack::GetTRDmomentum(Int_t plane, Double_t *sp) const
1994{
1995//Returns momentum estimation and optional its error (sp)
1996// in TRD layer "plane".
1997
1998 if (!fTRDnSlices) {
ba8cee18 1999 AliDebug(2, "No TRD info allocated for this track.");
fae4c212 2000 return -1.;
2001 }
2002 if ((plane<0) || (plane>=kTRDnPlanes)) {
ba8cee18 2003 AliWarning(Form("Request for TRD plane[%d] outside range.", plane));
fae4c212 2004 return -1.;
2005 }
2006
2007 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
2008 // Protection for backward compatibility
2009 if(idx<(GetNumberOfTRDslices()*kTRDnPlanes)) return -1.;
2010
2011 if(sp) (*sp) = fTRDslices[idx+kTRDnPlanes];
2012 return fTRDslices[idx];
2013}
2014
2015//____________________________________________________
2016Double_t AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
2017 //Gets the charge from the slice of the plane
2018
2019 if(!fTRDslices) {
2020 //AliError("No TRD slices allocated for this track !");
2021 return -1.;
2022 }
2023 if ((plane<0) || (plane>=kTRDnPlanes)) {
2024 AliError("Info for TRD plane not available !");
2025 return -1.;
2026 }
2027 Int_t ns=GetNumberOfTRDslices();
2028 if ((slice<-1) || (slice>=ns)) {
2029 //AliError("Wrong TRD slice !");
2030 return -1.;
2031 }
2032
2033 if(slice>=0) return fTRDslices[plane*ns + slice];
2034
2035 // return average of the dEdx measurements
2036 Double_t q=0.; Double32_t *s = &fTRDslices[plane*ns];
ddfbc51a 2037 for (Int_t i=0; i<ns; i++, s++) if((*s)>0.) q+=(*s);
fae4c212 2038 return q/ns;
2039}
2040
2041//____________________________________________________
6984f7c1 2042void AliESDtrack::SetNumberOfTRDslices(Int_t n) {
2043 //Sets the number of slices used for PID
fae4c212 2044 if (fTRDnSlices) return;
ddfbc51a 2045
fae4c212 2046 fTRDnSlices=n;
ddfbc51a 2047 fTRDslices=new Double32_t[fTRDnSlices];
2048
fae4c212 2049 // set-up correctly the allocated memory
2050 memset(fTRDslices, 0, n*sizeof(Double32_t));
ddfbc51a 2051 for (Int_t i=GetNumberOfTRDslices(); i--;) fTRDslices[i]=-1.;
6984f7c1 2052}
2053
fae4c212 2054//____________________________________________________
6984f7c1 2055void AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
2056 //Sets the charge q in the slice of the plane
fae4c212 2057 if(!fTRDslices) {
6984f7c1 2058 AliError("No TRD slices allocated for this track !");
2059 return;
2060 }
6984f7c1 2061 if ((plane<0) || (plane>=kTRDnPlanes)) {
fae4c212 2062 AliError("Info for TRD plane not allocated !");
6984f7c1 2063 return;
2064 }
fae4c212 2065 Int_t ns=GetNumberOfTRDslices();
6984f7c1 2066 if ((slice<0) || (slice>=ns)) {
2067 AliError("Wrong TRD slice !");
2068 return;
2069 }
2070 Int_t n=plane*ns + slice;
2071 fTRDslices[n]=q;
2072}
2073
6984f7c1 2074
fae4c212 2075//____________________________________________________
2076void AliESDtrack::SetTRDmomentum(Double_t p, Int_t plane, Double_t *sp)
2077{
2078 if(!fTRDslices) {
2079 AliError("No TRD slices allocated for this track !");
2080 return;
6984f7c1 2081 }
fae4c212 2082 if ((plane<0) || (plane>=kTRDnPlanes)) {
2083 AliError("Info for TRD plane not allocated !");
2084 return;
6984f7c1 2085 }
2086
fae4c212 2087 Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
2088 // Protection for backward compatibility
2089 if(idx<GetNumberOfTRDslices()*kTRDnPlanes) return;
6984f7c1 2090
fae4c212 2091 if(sp) fTRDslices[idx+kTRDnPlanes] = (*sp);
2092 fTRDslices[idx] = p;
6984f7c1 2093}
2094
2095
c630aafd 2096//_______________________________________________________________________
2097void AliESDtrack::SetTOFpid(const Double_t *p) {
4427806c 2098 // Sets the probability of each particle type (in TOF)
d27bbc79 2099 SetPIDValues(fTOFr,p,AliPID::kSPECIES);
c630aafd 2100 SetStatus(AliESDtrack::kTOFpid);
2101}
2102
51ad6848 2103//_______________________________________________________________________
2104void AliESDtrack::SetTOFLabel(const Int_t *p) {
2105 // Sets (in TOF)
ddfbc51a 2106 for (Int_t i=0; i<3; i++) fTOFLabel[i]=p[i];
51ad6848 2107}
2108
c630aafd 2109//_______________________________________________________________________
2110void AliESDtrack::GetTOFpid(Double_t *p) const {
4427806c 2111 // Gets probabilities of each particle type (in TOF)
ddfbc51a 2112 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fTOFr[i];
c630aafd 2113}
2114
51ad6848 2115//_______________________________________________________________________
2116void AliESDtrack::GetTOFLabel(Int_t *p) const {
2117 // Gets (in TOF)
ddfbc51a 2118 for (Int_t i=0; i<3; i++) p[i]=fTOFLabel[i];
51ad6848 2119}
2120
2121//_______________________________________________________________________
2122void AliESDtrack::GetTOFInfo(Float_t *info) const {
2123 // Gets (in TOF)
ddfbc51a 2124 for (Int_t i=0; i<10; i++) info[i]=fTOFInfo[i];
51ad6848 2125}
2126
2127//_______________________________________________________________________
2128void AliESDtrack::SetTOFInfo(Float_t*info) {
2129 // Gets (in TOF)
ddfbc51a 2130 for (Int_t i=0; i<10; i++) fTOFInfo[i]=info[i];
51ad6848 2131}
2132
4a78b8c5 2133
2134
4a78b8c5 2135//_______________________________________________________________________
f4b3bbb7 2136void AliESDtrack::SetHMPIDpid(const Double_t *p) {
2137 // Sets the probability of each particle type (in HMPID)
2138 SetPIDValues(fHMPIDr,p,AliPID::kSPECIES);
2139 SetStatus(AliESDtrack::kHMPIDpid);
4a78b8c5 2140}
2141
3876bdbf 2142//_______________________________________________________________________
ddfbc51a 2143void AliESDtrack::SetTPCdEdxInfo(AliTPCdEdxInfo * dEdxInfo){
2144 if(fTPCdEdxInfo) delete fTPCdEdxInfo;
3876bdbf 2145 fTPCdEdxInfo = dEdxInfo;
2146}
2147
4a78b8c5 2148//_______________________________________________________________________
f4b3bbb7 2149void AliESDtrack::GetHMPIDpid(Double_t *p) const {
2150 // Gets probabilities of each particle type (in HMPID)
ddfbc51a 2151 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fHMPIDr[i];
4a78b8c5 2152}
2153
ddfbc51a 2154
2155
8c6a71ab 2156//_______________________________________________________________________
2157void AliESDtrack::SetESDpid(const Double_t *p) {
4427806c 2158 // Sets the probability of each particle type for the ESD track
d27bbc79 2159 SetPIDValues(fR,p,AliPID::kSPECIES);
8c6a71ab 2160 SetStatus(AliESDtrack::kESDpid);
2161}
2162
2163//_______________________________________________________________________
2164void AliESDtrack::GetESDpid(Double_t *p) const {
4427806c 2165 // Gets probability of each particle type for the ESD track
ddfbc51a 2166 for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
8c6a71ab 2167}
2168
d7ddf1e9 2169//_______________________________________________________________________
436dfe39 2170Bool_t AliESDtrack::RelateToVertexTPC(const AliESDVertex *vtx,
2171Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
d7ddf1e9 2172 //
436dfe39 2173 // Try to relate the TPC-only track parameters to the vertex "vtx",
d7ddf1e9 2174 // if the (rough) transverse impact parameter is not bigger then "maxd".
2175 // Magnetic field is "b" (kG).
2176 //
2177 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2178 // b) The impact parameters and their covariance matrix are calculated.
436dfe39 2179 // c) An attempt to constrain the TPC-only params to the vertex is done.
2180 // The constrained params are returned via "cParam".
d7ddf1e9 2181 //
436dfe39 2182 // In the case of success, the returned value is kTRUE
2183 // otherwise, it's kFALSE)
2184 //
d7ddf1e9 2185
2186 if (!fTPCInner) return kFALSE;
2187 if (!vtx) return kFALSE;
2188
2189 Double_t dz[2],cov[3];
2190 if (!fTPCInner->PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2191
2192 fdTPC = dz[0];
2193 fzTPC = dz[1];
2194 fCddTPC = cov[0];
2195 fCdzTPC = cov[1];
2196 fCzzTPC = cov[2];
2197
436dfe39 2198 Double_t covar[6]; vtx->GetCovMatrix(covar);
2199 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2200 Double_t c[3]={covar[2],0.,covar[5]};
2201
2202 Double_t chi2=GetPredictedChi2(p,c);
2203 if (chi2>kVeryBig) return kFALSE;
2204
2205 fCchi2TPC=chi2;
2206
2207 if (!cParam) return kTRUE;
2208
2209 *cParam = *fTPCInner;
2210 if (!cParam->Update(p,c)) return kFALSE;
2211
d7ddf1e9 2212 return kTRUE;
2213}
2214
266a0f9b 2215//_______________________________________________________________________
2216Bool_t AliESDtrack::RelateToVertexTPCBxByBz(const AliESDVertex *vtx,
2217Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2218 //
2219 // Try to relate the TPC-only track parameters to the vertex "vtx",
2220 // if the (rough) transverse impact parameter is not bigger then "maxd".
2221 //
2222 // All three components of the magnetic field ,"b[3]" (kG),
2223 // are taken into account.
2224 //
2225 // a) The TPC-only paramters are extapolated to the DCA to the vertex.
2226 // b) The impact parameters and their covariance matrix are calculated.
2227 // c) An attempt to constrain the TPC-only params to the vertex is done.
2228 // The constrained params are returned via "cParam".
2229 //
2230 // In the case of success, the returned value is kTRUE
2231 // otherwise, it's kFALSE)
2232 //
2233
2234 if (!fTPCInner) return kFALSE;
2235 if (!vtx) return kFALSE;
2236
2237 Double_t dz[2],cov[3];
2238 if (!fTPCInner->PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2239
2240 fdTPC = dz[0];
2241 fzTPC = dz[1];
2242 fCddTPC = cov[0];
2243 fCdzTPC = cov[1];
2244 fCzzTPC = cov[2];
2245
2246 Double_t covar[6]; vtx->GetCovMatrix(covar);
2247 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2248 Double_t c[3]={covar[2],0.,covar[5]};
2249
2250 Double_t chi2=GetPredictedChi2(p,c);
2251 if (chi2>kVeryBig) return kFALSE;
2252
2253 fCchi2TPC=chi2;
2254
2255 if (!cParam) return kTRUE;
2256
2257 *cParam = *fTPCInner;
2258 if (!cParam->Update(p,c)) return kFALSE;
2259
2260 return kTRUE;
2261}
2262
49d13e89 2263//_______________________________________________________________________
436dfe39 2264Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx,
2265Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
49d13e89 2266 //
2267 // Try to relate this track to the vertex "vtx",
2268 // if the (rough) transverse impact parameter is not bigger then "maxd".
2269 // Magnetic field is "b" (kG).
2270 //
2271 // a) The track gets extapolated to the DCA to the vertex.
2272 // b) The impact parameters and their covariance matrix are calculated.
2273 // c) An attempt to constrain this track to the vertex is done.
436dfe39 2274 // The constrained params are returned via "cParam".
49d13e89 2275 //
436dfe39 2276 // In the case of success, the returned value is kTRUE
2277 // (otherwise, it's kFALSE)
49d13e89 2278 //
b5d34a4c 2279
2280 if (!vtx) return kFALSE;
2281
e99a34df 2282 Double_t dz[2],cov[3];
2283 if (!PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
2284
2285 fD = dz[0];
2286 fZ = dz[1];
2287 fCdd = cov[0];
2288 fCdz = cov[1];
2289 fCzz = cov[2];
49d13e89 2290
e99a34df 2291 Double_t covar[6]; vtx->GetCovMatrix(covar);
2292 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2293 Double_t c[3]={covar[2],0.,covar[5]};
3231f9e5 2294
e99a34df 2295 Double_t chi2=GetPredictedChi2(p,c);
436dfe39 2296 if (chi2>kVeryBig) return kFALSE;
2297
2298 fCchi2=chi2;
49d13e89 2299
436dfe39 2300
266a0f9b 2301 //--- Could now these lines be removed ? ---
2302 delete fCp;
2303 fCp=new AliExternalTrackParam(*this);
2304
2305 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
2306 //----------------------------------------
2307
2308 fVertexID = vtx->GetID();
2309
2310 if (!cParam) return kTRUE;
2311
2312 *cParam = *this;
2313 if (!cParam->Update(p,c)) return kFALSE;
2314
2315 return kTRUE;
2316}
2317
2318//_______________________________________________________________________
2319Bool_t AliESDtrack::RelateToVertexBxByBz(const AliESDVertex *vtx,
2320Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
2321 //
2322 // Try to relate this track to the vertex "vtx",
2323 // if the (rough) transverse impact parameter is not bigger then "maxd".
2324 // Magnetic field is "b" (kG).
2325 //
2326 // a) The track gets extapolated to the DCA to the vertex.
2327 // b) The impact parameters and their covariance matrix are calculated.
2328 // c) An attempt to constrain this track to the vertex is done.
2329 // The constrained params are returned via "cParam".
2330 //
2331 // In the case of success, the returned value is kTRUE
2332 // (otherwise, it's kFALSE)
2333 //
2334
2335 if (!vtx) return kFALSE;
2336
2337 Double_t dz[2],cov[3];
2338 if (!PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
2339
2340 fD = dz[0];
2341 fZ = dz[1];
2342 fCdd = cov[0];
2343 fCdz = cov[1];
2344 fCzz = cov[2];
2345
2346 Double_t covar[6]; vtx->GetCovMatrix(covar);
2347 Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
2348 Double_t c[3]={covar[2],0.,covar[5]};
2349
2350 Double_t chi2=GetPredictedChi2(p,c);
2351 if (chi2>kVeryBig) return kFALSE;
2352
2353 fCchi2=chi2;
2354
2355
436dfe39 2356 //--- Could now these lines be removed ? ---
e99a34df 2357 delete fCp;
2358 fCp=new AliExternalTrackParam(*this);
49d13e89 2359
e99a34df 2360 if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
436dfe39 2361 //----------------------------------------
2362
6dc21f57 2363 fVertexID = vtx->GetID();
436dfe39 2364
2365 if (!cParam) return kTRUE;
2366
2367 *cParam = *this;
2368 if (!cParam->Update(p,c)) return kFALSE;
2369
49d13e89 2370 return kTRUE;
2371}
2372
ac2f7574 2373//_______________________________________________________________________
2374void AliESDtrack::Print(Option_t *) const {
2375 // Prints info on the track
b9ca886f 2376 AliExternalTrackParam::Print();
5f7789fc 2377 printf("ESD track info\n") ;
304864ab 2378 Double_t p[AliPID::kSPECIESN] ;
ac2f7574 2379 Int_t index = 0 ;
2380 if( IsOn(kITSpid) ){
2381 printf("From ITS: ") ;
2382 GetITSpid(p) ;
304864ab 2383 for(index = 0 ; index < AliPID::kSPECIES; index++)
ac2f7574 2384 printf("%f, ", p[index]) ;
2385 printf("\n signal = %f\n", GetITSsignal()) ;
2386 }
2387 if( IsOn(kTPCpid) ){
2388 printf("From TPC: ") ;
2389 GetTPCpid(p) ;
304864ab 2390 for(index = 0 ; index < AliPID::kSPECIES; index++)
ac2f7574 2391 printf("%f, ", p[index]) ;
2392 printf("\n signal = %f\n", GetTPCsignal()) ;
2393 }
2394 if( IsOn(kTRDpid) ){
2395 printf("From TRD: ") ;
2396 GetTRDpid(p) ;
304864ab 2397 for(index = 0 ; index < AliPID::kSPECIES; index++)
ac2f7574 2398 printf("%f, ", p[index]) ;
6984f7c1 2399 printf("\n signal = %f\n", GetTRDsignal()) ;
ac2f7574 2400 }
2401 if( IsOn(kTOFpid) ){
2402 printf("From TOF: ") ;
2403 GetTOFpid(p) ;
304864ab 2404 for(index = 0 ; index < AliPID::kSPECIES; index++)
ac2f7574 2405 printf("%f, ", p[index]) ;
2406 printf("\n signal = %f\n", GetTOFsignal()) ;
2407 }
f4b3bbb7 2408 if( IsOn(kHMPIDpid) ){
2409 printf("From HMPID: ") ;
2410 GetHMPIDpid(p) ;
304864ab 2411 for(index = 0 ; index < AliPID::kSPECIES; index++)
ac2f7574 2412 printf("%f, ", p[index]) ;
f4b3bbb7 2413 printf("\n signal = %f\n", GetHMPIDsignal()) ;
ac2f7574 2414 }
ac2f7574 2415}
6c94f330 2416
0c19adf7 2417
2418//
2419// Draw functionality
2420// Origin: Marian Ivanov, Marian.Ivanov@cern.ch
2421//
2422void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR, Float_t maxR, Float_t stepR){
2423 //
2424 // Fill points in the polymarker
2425 //
2426 TObjArray arrayRef;
2427 arrayRef.AddLast(new AliExternalTrackParam(*this));
2428 if (fIp) arrayRef.AddLast(new AliExternalTrackParam(*fIp));
2429 if (fOp) arrayRef.AddLast(new AliExternalTrackParam(*fOp));
c38d443f 2430 if (fHMPIDp) arrayRef.AddLast(new AliExternalTrackParam(*fHMPIDp));
0c19adf7 2431 //
2432 Double_t mpos[3]={0,0,0};
2433 Int_t entries=arrayRef.GetEntries();
ddfbc51a 2434 for (Int_t i=0;i<entries;i++){
0c19adf7 2435 Double_t pos[3];
2436 ((AliExternalTrackParam*)arrayRef.At(i))->GetXYZ(pos);
2437 mpos[0]+=pos[0]/entries;
2438 mpos[1]+=pos[1]/entries;
2439 mpos[2]+=pos[2]/entries;
2440 }
2441 // Rotate to the mean position
2442 //
2443 Float_t fi= TMath::ATan2(mpos[1],mpos[0]);
2444 for (Int_t i=0;i<entries;i++){
2445 Bool_t res = ((AliExternalTrackParam*)arrayRef.At(i))->Rotate(fi);
2446 if (!res) delete arrayRef.RemoveAt(i);
2447 }
2448 Int_t counter=0;
2449 for (Double_t r=minR; r<maxR; r+=stepR){
2450 Double_t sweight=0;
2451 Double_t mlpos[3]={0,0,0};
2452 for (Int_t i=0;i<entries;i++){
2453 Double_t point[3]={0,0,0};
2454 AliExternalTrackParam *param = ((AliExternalTrackParam*)arrayRef.At(i));
2455 if (!param) continue;
2456 if (param->GetXYZAt(r,magF,point)){
2457 Double_t weight = 1./(10.+(r-param->GetX())*(r-param->GetX()));
2458 sweight+=weight;
2459 mlpos[0]+=point[0]*weight;
2460 mlpos[1]+=point[1]*weight;
2461 mlpos[2]+=point[2]*weight;
2462 }
2463 }
2464 if (sweight>0){
2465 mlpos[0]/=sweight;
2466 mlpos[1]/=sweight;
2467 mlpos[2]/=sweight;
2468 pol->SetPoint(counter,mlpos[0],mlpos[1], mlpos[2]);
047640da 2469 // printf("xyz\t%f\t%f\t%f\n",mlpos[0], mlpos[1],mlpos[2]);
0c19adf7 2470 counter++;
2471 }
2472 }
2473}
1d4882da 2474
2475//_______________________________________________________________________
2476void AliESDtrack::SetITSdEdxSamples(const Double_t s[4]) {
2477 //
2478 // Store the dE/dx samples measured by the two SSD and two SDD layers.
2479 // These samples are corrected for the track segment length.
2480 //
ddfbc51a 2481 for (Int_t i=0; i<4; i++) fITSdEdxSamples[i]=s[i];
1d4882da 2482}
2483
2484//_______________________________________________________________________
2485void AliESDtrack::GetITSdEdxSamples(Double_t *s) const {
2486 //
2487 // Get the dE/dx samples measured by the two SSD and two SDD layers.
2488 // These samples are corrected for the track segment length.
2489 //
ddfbc51a 2490 for (Int_t i=0; i<4; i++) s[i]=fITSdEdxSamples[i];
1d4882da 2491}
949840f6 2492
2493
2494UShort_t AliESDtrack::GetTPCnclsS(Int_t i0,Int_t i1) const{
2495 //
beb01154 2496 // get number of shared TPC clusters
949840f6 2497 //
2498 return fTPCSharedMap.CountBits(i0)-fTPCSharedMap.CountBits(i1);
2499}
beb01154 2500
2501UShort_t AliESDtrack::GetTPCncls(Int_t i0,Int_t i1) const{
2502 //
2503 // get number of TPC clusters
2504 //
2505 return fTPCClusterMap.CountBits(i0)-fTPCClusterMap.CountBits(i1);
2506}
4c3dc2a0 2507
2508//____________________________________________________________________
2509Double_t AliESDtrack::GetChi2TPCConstrainedVsGlobal(const AliESDVertex* vtx) const
2510{
2511 // Calculates the chi2 between the TPC track (TPCinner) constrained to the primary vertex and the global track
2512 //
2513 // Returns -1 in case the calculation failed
2514 //
2515 // Value is cached as a non-persistent member.
2516 //
2517 // Code adapted from original code by GSI group (Jacek, Marian, Michael)
2518
2519 // cache, ignoring that a different vertex might be passed
2520 if (fCacheChi2TPCConstrainedVsGlobalVertex == vtx)
2521 return fCacheChi2TPCConstrainedVsGlobal;
2522
2523 fCacheChi2TPCConstrainedVsGlobal = -1;
2524 fCacheChi2TPCConstrainedVsGlobalVertex = vtx;
2525
2526 Double_t x[3];
2527 GetXYZ(x);
2528 Double_t b[3];
2529 AliTrackerBase::GetBxByBz(x,b);
2530
2531 if (!fTPCInner) {
2532 AliWarning("Could not get TPC Inner Param.");
2533 return fCacheChi2TPCConstrainedVsGlobal;
2534 }
2535
2536 // clone for constraining
ddfbc51a 2537 AliExternalTrackParam* tpcInnerC = new AliExternalTrackParam(*fTPCInner);
2538 if (!tpcInnerC) {
2539 AliWarning("Clone of TPCInnerParam failed.");
2540 return fCacheChi2TPCConstrainedVsGlobal;
2541 }
4c3dc2a0 2542
2543 // transform to the track reference frame
ddfbc51a 2544 Bool_t isOK = tpcInnerC->Rotate(GetAlpha());
2545 isOK &= tpcInnerC->PropagateTo(GetX(), b[2]);
4c3dc2a0 2546 if (!isOK) {
ddfbc51a 2547 delete tpcInnerC;
2548 tpcInnerC = 0;
4c3dc2a0 2549 AliWarning("Rotation/Propagation of track failed.") ;
2550 return fCacheChi2TPCConstrainedVsGlobal;
2551 }
2552
2553 // constrain TPCinner
ddfbc51a 2554 isOK = tpcInnerC->ConstrainToVertex(vtx, b);
4c3dc2a0 2555
2556 // transform to the track reference frame
ddfbc51a 2557 isOK &= tpcInnerC->Rotate(GetAlpha());
2558 isOK &= tpcInnerC->PropagateTo(GetX(), b[2]);
4c3dc2a0 2559
2560 if (!isOK) {
2561 AliWarning("ConstrainTPCInner failed.") ;
ddfbc51a 2562 delete tpcInnerC;
2563 tpcInnerC = 0;
4c3dc2a0 2564 return fCacheChi2TPCConstrainedVsGlobal;
2565 }
2566
2567 // calculate chi2 between vi and vj vectors
2568 // with covi and covj covariance matrices
2569 // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)
2570 TMatrixD deltaT(5,1);
2571 TMatrixD delta(1,5);
2572 TMatrixD covarM(5,5);
2573
ddfbc51a 2574 for (Int_t ipar=0; ipar<5; ipar++) {
2575 deltaT(ipar,0) = tpcInnerC->GetParameter()[ipar] - GetParameter()[ipar];
2576 delta(0,ipar) = tpcInnerC->GetParameter()[ipar] - GetParameter()[ipar];
4c3dc2a0 2577
2578 for (Int_t jpar=0; jpar<5; jpar++) {
2579 Int_t index = GetIndex(ipar,jpar);
ddfbc51a 2580 covarM(ipar,jpar) = GetCovariance()[index]+tpcInnerC->GetCovariance()[index];
4c3dc2a0 2581 }
2582 }
2583 // chi2 distance TPC constrained and TPC+ITS
2584 TMatrixD covarMInv = covarM.Invert();
2585 TMatrixD mat2 = covarMInv*deltaT;
2586 TMatrixD chi2 = delta*mat2;
ddfbc51a 2587
2588 delete tpcInnerC;
2589 tpcInnerC = 0;
2590
4c3dc2a0 2591 fCacheChi2TPCConstrainedVsGlobal = chi2(0,0);
2592 return fCacheChi2TPCConstrainedVsGlobal;
2593}