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