]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/TRD/info/AliTRDtrackInfo.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGPP / TRD / info / AliTRDtrackInfo.cxx
CommitLineData
1ee39b3a 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**************************************************************************/
15
16/* $Id: AliTRDtrackInfo.cxx 27496 2008-07-22 08:35:45Z cblume $ */
17
18////////////////////////////////////////////////////////////////////////////
19// //
20// Reconstruction QA //
21// //
22// Authors: //
23// Alex Bercuci <A.Bercuci@gsi.de> //
24// Markus Fasel <M.Fasel@gsi.de> //
25// //
26////////////////////////////////////////////////////////////////////////////
27
28#include "TDatabasePDG.h"
b9ddd472 29#include "TPDGCode.h"
4226db3e 30#include "TVectorT.h"
1ee39b3a 31
32#include "AliTrackReference.h"
eb05d549 33#include "AliTrackPointArray.h"
1ee39b3a 34#include "AliExternalTrackParam.h"
35
36#include "AliTRDseedV1.h"
37#include "AliTRDtrackV1.h"
38#include "AliTRDgeometry.h"
39#include "AliTRDtrackerV1.h"
40
41#include "AliTRDtrackInfo.h"
42
43ClassImp(AliTRDtrackInfo)
44ClassImp(AliTRDtrackInfo::AliMCinfo)
45ClassImp(AliTRDtrackInfo::AliESDinfo)
5066aa9a 46Double_t AliTRDtrackInfo::AliMCinfo::fgKalmanStep = 2.;
3ceb45ae 47Bool_t AliTRDtrackInfo::AliMCinfo::fgKalmanUpdate = kTRUE;
1ee39b3a 48
49//___________________________________________________
50AliTRDtrackInfo::AliTRDtrackInfo():
51 TObject()
52 ,fNClusters(0)
f232df0d 53 ,fTRDtrack(NULL)
54 ,fMC(NULL)
1ee39b3a 55 ,fESD()
56{
57 //
58 // Default constructor
59 //
60}
61
62
63//___________________________________________________
64AliTRDtrackInfo::AliTRDtrackInfo(const AliTRDtrackInfo &trdInfo):
65 TObject((const TObject&)trdInfo)
66 ,fNClusters(trdInfo.fNClusters)
f232df0d 67 ,fTRDtrack(NULL)
a340fe39 68 ,fMC(NULL)
1ee39b3a 69 ,fESD(trdInfo.fESD)
70{
71 //
72 // copy Entries
73 //
74
75 if(trdInfo.fMC) fMC = new AliMCinfo(*trdInfo.fMC);
eb05d549 76 SetTrack(trdInfo.fTRDtrack);
1ee39b3a 77}
78
79//___________________________________________________
80AliTRDtrackInfo::AliMCinfo::AliMCinfo()
81 :fLabel(0)
eb05d549 82 ,fTRDlabel(0)
1ee39b3a 83 ,fPDG(0)
84 ,fNTrackRefs(0)
95d47440 85 ,fEta(-999.)
86 ,fPhi(-999.)
87 ,fPt(-1.)
1ee39b3a 88{
89 // Set 0-Pointers
90 memset(fTrackRefs, 0, sizeof(AliTrackReference *) * 12);
91}
92
93//___________________________________________________
94AliTRDtrackInfo::AliMCinfo::AliMCinfo(const AliMCinfo &mc)
95 :fLabel(mc.fLabel)
eb05d549 96 ,fTRDlabel(mc.fTRDlabel)
1ee39b3a 97 ,fPDG(mc.fPDG)
98 ,fNTrackRefs(mc.fNTrackRefs)
95d47440 99 ,fEta(mc.fEta)
100 ,fPhi(mc.fPhi)
101 ,fPt(mc.fPt)
1ee39b3a 102{
103 //
104 // Constructor
105 //
106
107 memset(fTrackRefs, 0, sizeof(AliTrackReference *) * 12);
108 for(Int_t ien = 0; ien < 12; ien++){
109 if(mc.fTrackRefs[ien])
110 fTrackRefs[ien] = new AliTrackReference(*(mc.fTrackRefs[ien]));
111 }
112}
113
b9ddd472 114//________________________________________________________
115Int_t AliTRDtrackInfo::AliMCinfo::GetPID() const
116{
61f6b45e 117// Translate pdg code to PID index
118
b9ddd472 119 switch(fPDG){
120 case kElectron:
121 case kPositron: return AliPID::kElectron;
122 case kMuonPlus:
123 case kMuonMinus: return AliPID::kMuon;
124 case kPiPlus:
125 case kPiMinus: return AliPID::kPion;
126 case kKPlus:
127 case kKMinus: return AliPID::kKaon;
128 case kProton:
129 case kProtonBar: return AliPID::kProton;
130 }
131 return -1;
132}
133
1ee39b3a 134//___________________________________________________
135AliTRDtrackInfo::AliESDinfo::AliESDinfo()
5047978d 136 :fSteer(0)
b9ddd472 137 ,fId(-1)
1ee39b3a 138 ,fStatus(0)
139 ,fKinkIndex(0)
140 ,fTPCncls(0)
2b33fd9c 141 ,fTPCdedx(0.)
f036f7ec 142 ,fTOFbeta(0.)
3ceb45ae 143 ,fTOFbc(0)
1ee39b3a 144 ,fTRDpidQuality(0)
145 ,fTRDnSlices(0)
eb05d549 146 ,fPt(0.)
147 ,fPhi(-999.)
148 ,fEta(-999.)
f232df0d 149 ,fTRDslices(NULL)
150 ,fOP(NULL)
35983729 151 ,fTPCout(NULL)
b9058d72 152 ,fITSout(NULL)
eb05d549 153 ,fTPArray(NULL)
1ee39b3a 154{
155 //
156 // Constructor
157 //
158
159 memset(fTRDr, 0, AliPID::kSPECIES*sizeof(Double32_t));
d80a6a00 160 memset(fTRDv0pid, 0, AliPID::kSPECIES*sizeof(Int_t));
1ee39b3a 161}
162
163//___________________________________________________
164AliTRDtrackInfo::AliESDinfo::AliESDinfo(const AliESDinfo &esd)
5047978d 165 :fSteer(esd.fSteer)
b9ddd472 166 ,fId(esd.fId)
1ee39b3a 167 ,fStatus(esd.fStatus)
168 ,fKinkIndex(esd.fKinkIndex)
169 ,fTPCncls(esd.fTPCncls)
2b33fd9c 170 ,fTPCdedx(esd.fTPCdedx)
f036f7ec 171 ,fTOFbeta(esd.fTOFbeta)
3ceb45ae 172 ,fTOFbc(esd.fTOFbc)
1ee39b3a 173 ,fTRDpidQuality(esd.fTRDpidQuality)
174 ,fTRDnSlices(esd.fTRDnSlices)
eb05d549 175 ,fPt(esd.fPt)
176 ,fPhi(esd.fPhi)
177 ,fEta(esd.fEta)
f232df0d 178 ,fTRDslices(NULL)
179 ,fOP(NULL)
35983729 180 ,fTPCout(NULL)
b9058d72 181 ,fITSout(NULL)
eb05d549 182 ,fTPArray(NULL)
1ee39b3a 183{
184 //
185 // Constructor
186 //
187
188 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
d80a6a00 189 memcpy(fTRDv0pid, esd.fTRDv0pid, AliPID::kSPECIES*sizeof(Int_t));
1ee39b3a 190
191 if(fTRDnSlices){
192 fTRDslices = new Double32_t[fTRDnSlices];
193 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
194 }
eb05d549 195 SetOuterParam(esd.fOP);
196 SetTPCoutParam(esd.fTPCout);
197 SetITSoutParam(esd.fITSout);
198 SetTrackPointArray(esd.fTPArray);
1ee39b3a 199}
200
201
202//___________________________________________________
203AliTRDtrackInfo::~AliTRDtrackInfo()
204{
205 //
206 // Destructor
207 //
208
209 if(fMC) delete fMC;
210 if(fTRDtrack) delete fTRDtrack;
211}
212
213//___________________________________________________
214AliTRDtrackInfo::AliMCinfo::~AliMCinfo()
215{
216 //
217 // Destructor
218 //
219
220 fNTrackRefs = 0;
221 for(Int_t ien = 0; ien < 12; ien++){
222 if(fTrackRefs[ien]) delete fTrackRefs[ien];
f232df0d 223 fTrackRefs[ien] = NULL;
1ee39b3a 224 }
225}
226
227//___________________________________________________
228AliTRDtrackInfo::AliESDinfo::~AliESDinfo()
229{
230 //
231 // Destructor
232 //
233
234 if(fTRDnSlices){
235 delete [] fTRDslices;
f232df0d 236 fTRDslices = NULL;
1ee39b3a 237 fTRDnSlices = 0;
238 }
f232df0d 239 if(fOP) delete fOP; fOP = NULL;
35983729 240 if(fTPCout) delete fTPCout; fTPCout = NULL;
b9058d72 241 if(fITSout) delete fITSout; fITSout = NULL;
eb05d549 242 if(fTPArray) delete fTPArray;
1ee39b3a 243}
244
8778aca3 245//___________________________________________________
246void AliTRDtrackInfo::AliESDinfo::Delete(const Option_t *){
247 //
248 // Delete Pointer members
249 //
250 if(fTRDnSlices){
251 delete [] fTRDslices;
252 fTRDslices = NULL;
253 fTRDnSlices = 0;
254 }
255 if(fOP) delete fOP; fOP = NULL;
35983729 256 if(fTPCout) delete fTPCout; fTPCout = NULL;
b9058d72 257 if(fITSout) delete fITSout; fITSout = NULL;
eb05d549 258 if(fTPArray) delete fTPArray; fTPArray = NULL;
8778aca3 259}
260
1ee39b3a 261
262//___________________________________________________
263AliTRDtrackInfo& AliTRDtrackInfo::operator=(const AliTRDtrackInfo &trdInfo)
264{
265 //
266 // = Operator
267 //
01ccc21a 268 if(this == &trdInfo) return *this;
1ee39b3a 269
270 fNClusters = trdInfo.fNClusters;
1881bb2b 271 fESD = trdInfo.fESD;
1ee39b3a 272
273 if(trdInfo.fMC){
2c33fb46 274 if(!fMC) fMC = new AliMCinfo(*trdInfo.fMC);
275 else{
276 fMC->~AliMCinfo();
1ee39b3a 277 new(fMC) AliMCinfo(*trdInfo.fMC);
2c33fb46 278 }
1881bb2b 279 } else {if(fMC) delete fMC; fMC = NULL;}
1ee39b3a 280
eb05d549 281 SetTrack(trdInfo.fTRDtrack);
1ee39b3a 282
283 return *this;
284}
285
286//___________________________________________________
287AliTRDtrackInfo::AliMCinfo& AliTRDtrackInfo::AliMCinfo::operator=(const AliMCinfo &mc)
288{
289 //
290 // Assignment operator
291 //
292
01ccc21a 293 if(this == &mc) return *this;
1ee39b3a 294 fLabel = mc.fLabel;
eb05d549 295 fTRDlabel = mc.fTRDlabel;
1ee39b3a 296 fPDG = mc.fPDG;
297 fNTrackRefs = mc.fNTrackRefs;
298
299 AliTrackReference **itr = &fTrackRefs[0];
300 AliTrackReference* const *jtr = &mc.fTrackRefs[0];
eb05d549 301 for(Int_t ien = 0; ien < 2*AliTRDgeometry::kNlayer; ien++, itr++, jtr++){
1ee39b3a 302 if((*jtr)){
303 if(!(*itr)) (*itr) = new AliTrackReference(*(*jtr));
2c33fb46 304 else{
305 (*itr)->~AliTrackReference();
306 new(&(*itr)) AliTrackReference(*(*jtr));
307 }
1881bb2b 308 } else {if((*itr)) delete (*itr); (*itr) = NULL;}
1ee39b3a 309 }
310 return *this;
311}
312
313//___________________________________________________
314AliTRDtrackInfo::AliESDinfo& AliTRDtrackInfo::AliESDinfo::operator=(const AliESDinfo &esd)
315{
316 //
317 // Assignment operator
318 //
319
01ccc21a 320 if(this == &esd) return *this;
5047978d 321 fSteer = esd.fSteer;
1ee39b3a 322 fId = esd.fId;
01ccc21a 323 fStatus = esd.fStatus;
324 fKinkIndex = esd.fKinkIndex;
325 fTPCncls = esd.fTPCncls;
2b33fd9c 326 fTPCdedx = esd.fTPCdedx;
f036f7ec 327 fTOFbeta = esd.fTOFbeta;
01ccc21a 328 fTOFbc = esd.fTOFbc;
329 fTRDpidQuality= esd.fTRDpidQuality;
1ee39b3a 330 fTRDnSlices = esd.fTRDnSlices;
eb05d549 331 fPt = esd.fPt;
332 fPhi = esd.fPhi;
333 fEta = esd.fEta;
178d284a 334
1ee39b3a 335 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
01ccc21a 336 memcpy(fTRDv0pid, esd.fTRDv0pid, AliPID::kSPECIES*sizeof(Int_t));
1ee39b3a 337
338 if(fTRDnSlices){
56838f9d 339 if(!fTRDslices) fTRDslices = new Double32_t[fTRDnSlices];
1ee39b3a 340 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
341 }
eb05d549 342 SetOuterParam(esd.fOP);
343 SetTPCoutParam(esd.fTPCout);
344 SetITSoutParam(esd.fITSout);
345 SetTrackPointArray(esd.fTPArray);
1ee39b3a 346
347 return *this;
348}
349
350//___________________________________________________
351void AliTRDtrackInfo::Delete(const Option_t *)
352{
353 //
354 // Delete
355 //
356
2c33fb46 357 AliDebug(2, Form("track[%p] mc[%p]", (void*)fTRDtrack, (void*)fMC));
1ee39b3a 358 fNClusters = 0;
f232df0d 359 if(fMC) delete fMC; fMC = NULL;
8778aca3 360 fESD.Delete(NULL);
f232df0d 361 if(fTRDtrack) delete fTRDtrack; fTRDtrack = NULL;
1ee39b3a 362}
363
364//___________________________________________________
365void AliTRDtrackInfo::SetTrack(const AliTRDtrackV1 *track)
366{
367 //
368 // Set the TRD track
369 //
370
eb05d549 371 if(track){
372 if(!fTRDtrack) fTRDtrack = new AliTRDtrackV1(*track);
373 else{
374 fTRDtrack->~AliTRDtrackV1();
375 new(fTRDtrack) AliTRDtrackV1(*track);
376 }
377 if(track->IsOwner()) fTRDtrack->SetOwner();
378 } else {
379 if(fTRDtrack) delete fTRDtrack; fTRDtrack = NULL;
380 }
381}
382
383//___________________________________________________
384void AliTRDtrackInfo::AliESDinfo::SetTrackPointArray(const AliTrackPointArray *tps)
385{
386 //
387 // Set the track point array for alignment task
388 //
389
390
391 if(tps){
392 if(!fTPArray) fTPArray = new AliTrackPointArray(*tps);
393 else{
394 fTPArray->~AliTrackPointArray();
395 new(fTPArray) AliTrackPointArray(*tps);
396 }
397 } else {
398 if(fTPArray) delete fTPArray; fTPArray = NULL;
2c33fb46 399 }
1ee39b3a 400}
401
402//___________________________________________________
403void AliTRDtrackInfo::AddTrackRef(const AliTrackReference *tref)
404{
405 //
406 // Add track reference
407 //
408
eb05d549 409 if(fMC->fNTrackRefs >= 2*AliTRDgeometry::kNlayer){
1ee39b3a 410 SetCurved();
411 return;
412 }
413 // Make a copy for the object in order to avoid ownership problems
414 fMC->fTrackRefs[fMC->fNTrackRefs++] = new AliTrackReference(*tref);
415}
416
417//___________________________________________________
418AliTrackReference* AliTRDtrackInfo::GetTrackRef(Int_t idx) const
419{
420//
421// Returns a track reference
422//
f232df0d 423 if(!fMC) return NULL;
424 return (idx>=0 && idx < 12) ? fMC->fTrackRefs[idx] : NULL;
1ee39b3a 425}
426
427//___________________________________________________
61f6b45e 428AliTrackReference* AliTRDtrackInfo::GetTrackRef(const AliTRDseedV1* const tracklet) const
1ee39b3a 429{
430//
431// Returns a track reference
432//
f232df0d 433 if(!fMC) return NULL;
1ee39b3a 434 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
435 AliTrackReference * const* jtr = &(fMC->fTrackRefs[0]);
436 for(Int_t itr = 0; itr < fMC->fNTrackRefs; itr++, ++jtr){
437 if(!(*jtr)) break;
438 if(TMath::Abs(tracklet->GetX0() - (*jtr)->LocalX()) < cw) return (*jtr);
439 }
f232df0d 440 return NULL;
1ee39b3a 441}
442
443//___________________________________________________
444Int_t AliTRDtrackInfo::GetNumberOfClusters() const
445{
446 //
447 // Returns the number of clusters
448 //
449
450 Int_t n = 0;
451 if(!fTRDtrack) return 0;
452 if(fTRDtrack->GetNumberOfTracklets() == 0) return n;
f232df0d 453 AliTRDseedV1 *tracklet = NULL;
eb05d549 454 for(Int_t ip=0; ip<AliTRDgeometry::kNlayer; ip++){
1ee39b3a 455 if(!(tracklet = const_cast<AliTRDseedV1 *>(fTRDtrack->GetTracklet(ip)))) continue;
456 n+=tracklet->GetN();
457 }
458 return n;
459}
460
461
462//___________________________________________________
eb05d549 463void AliTRDtrackInfo::AliESDinfo::SetOuterParam(const AliExternalTrackParam *op)
1ee39b3a 464{
465 //
466 // Set outer track parameters
467 //
468
eb05d549 469 if(op){
470 if(fOP){
471 fOP->~AliExternalTrackParam();
472 // RS: Constructor from VTrack was used instead of Constructor from AliExternalTrackParam
473 new(fOP) AliExternalTrackParam(*op);
474 } else fOP = new AliExternalTrackParam(*op);
475 } else {
476 if(fOP) delete fOP; fOP = NULL;
477 }
1ee39b3a 478}
479
b9058d72 480//___________________________________________________
eb05d549 481void AliTRDtrackInfo::AliESDinfo::SetITSoutParam(const AliExternalTrackParam *op)
b9058d72 482{
483 //
484 // Set TPCout track parameters
485 //
486
eb05d549 487 if(op){
488 if(fITSout){
489 fITSout->~AliExternalTrackParam();
490 // RS: Constructor from VTrack was used instead of Constructor from AliExternalTrackParam
491 new(fITSout) AliExternalTrackParam(*op);
492 } else fITSout = new AliExternalTrackParam(*op);
493 } else {
494 if(fITSout) delete fITSout; fITSout = NULL;
495 }
b9058d72 496}
497
35983729 498//___________________________________________________
eb05d549 499void AliTRDtrackInfo::AliESDinfo::SetTPCoutParam(const AliExternalTrackParam *op)
35983729 500{
501 //
502 // Set TPCout track parameters
503 //
504
eb05d549 505 if(op){
506 if(fTPCout){
507 fTPCout->~AliExternalTrackParam();
508 // RS: Constructor from VTrack was used instead of Constructor from AliExternalTrackParam
509 new(fTPCout) AliExternalTrackParam(*op);
510 } else fTPCout = new AliExternalTrackParam(*op);
511 } else {
512 if(fTPCout) delete fTPCout; fTPCout = NULL;
513 }
35983729 514}
515
1ee39b3a 516//___________________________________________________
517Int_t AliTRDtrackInfo::GetNTracklets() const
518{
519 //
520 // Return the number of tracklets
521 //
522
e2927481 523 if(!fTRDtrack) return 0;
1ee39b3a 524 return fTRDtrack->GetNumberOfTracklets();
525}
526
527//___________________________________________________
528void AliTRDtrackInfo::SetSlices(Int_t n, Double32_t *s)
529{
530 //
531 // Set the slices
532 //
1ee39b3a 533 if(fESD.fTRDnSlices != n){
534 fESD.fTRDnSlices = 0;
535 delete [] fESD.fTRDslices;
f232df0d 536 fESD.fTRDslices = NULL;
1ee39b3a 537 }
538
539 if(!fESD.fTRDnSlices){
540 fESD.fTRDnSlices = n;
f232df0d 541 fESD.fTRDslices = new Double32_t[fESD.fTRDnSlices];
1ee39b3a 542 }
543
544 memcpy(fESD.fTRDslices, s, n*sizeof(Double32_t));
545}
546
547//___________________________________________________
0f2c4c4f 548Bool_t AliTRDtrackInfo::AliMCinfo::GetDirections(Float_t &x0, Float_t &y0, Float_t &z0, Float_t &dydx, Float_t &dzdx, Float_t &pt, Float_t &p, Float_t &eta, Float_t &phi, UChar_t &status) const
1ee39b3a 549{
550// Check for 2 track ref for the tracklet defined bythe radial position x0
551// The "status" is a bit map and gives a more informative output in case of failure:
552// - 0 : everything is OK
553// - BIT(0) : 0 track refs found
554// - BIT(1) : 1 track reference found
555// - BIT(2) : dx <= 0 between track references
556// - BIT(3) : dx > 0 && dx < 3.7 - tangent tracks
557
558 status = 0;
559 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
560 Int_t nFound = 0;
f232df0d 561 AliTrackReference *tr[2] = {NULL, NULL};
1ee39b3a 562 AliTrackReference * const* jtr = &fTrackRefs[0];
563 for(Int_t itr = 0; itr < fNTrackRefs; itr++, ++jtr){
564 if(!(*jtr)) break;
565/*
566 if(fDebugLevel>=5) printf("\t\tref[%2d] x[%6.3f]\n", itr, (*jtr)->LocalX());*/
567 if(TMath::Abs(x0 - (*jtr)->LocalX()) > cw) continue;
568 tr[nFound++] = (*jtr);
569 if(nFound == 2) break;
570 }
571 if(nFound < 2){
e02d9eb3 572 //AliDebug(1, Form("Missing track ref x0[%6.3f] nref[%d]", x0, nFound));
1ee39b3a 573 if(!nFound) SETBIT(status, 0);
574 else SETBIT(status, 1);
575 return kFALSE;
576 }
61f6b45e 577 pt=tr[1]->Pt();
0f2c4c4f 578 p =tr[1]->P();
61f6b45e 579 if(pt < 1.e-3) return kFALSE;
1ee39b3a 580
581 Double_t dx = tr[1]->LocalX() - tr[0]->LocalX();
582 if(dx <= 0.){
583 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::GetDirections()", Form("Track ref with wrong radial distances refX0[%6.3f] refX1[%6.3f]", tr[0]->LocalX(), tr[1]->LocalX()));
584 SETBIT(status, 2);
585 return kFALSE;
586 }
587 if(TMath::Abs(dx-AliTRDgeometry::CamHght()-AliTRDgeometry::CdrHght())>1.E-3) SETBIT(status, 3);
588
589 dydx = (tr[1]->LocalY() - tr[0]->LocalY()) / dx;
590 dzdx = (tr[1]->Z() - tr[0]->Z()) / dx;
591 //Float_t dx0 = tr[1]->LocalX() - x0;
592 y0 = tr[1]->LocalY()/* - dydx*dx0*/;
593 z0 = tr[1]->Z()/* - dzdx*dx0*/;
594 x0 = tr[1]->LocalX();
3ceb45ae 595 eta = -TMath::Log(TMath::Tan(0.5 * tr[1]->Theta()));
01ccc21a 596 phi = TMath::ATan2(tr[1]->Y(), tr[1]->X());
1ee39b3a 597 return kTRUE;
598}
599
600//___________________________________________________
3ceb45ae 601Bool_t AliTRDtrackInfo::AliMCinfo::PropagateKalman(
602 TVectorD *x, TVectorD *y, TVectorD *z,
603 TVectorD *dx, TVectorD *dy, TVectorD *dz,
604 TVectorD *pt, TVectorD *dpt, TVectorD *budget, TVectorD *c, Double_t mass) const
1ee39b3a 605{
606// Propagate Kalman from the first TRD track reference to
607// last one and save residuals in the y, z and pt.
608//
609// This is to calibrate the dEdx and MS corrections
610
3ceb45ae 611 if(!fNTrackRefs) return kFALSE;
1ee39b3a 612 for(Int_t itr=kNTrackRefs; itr--;){
3ceb45ae 613 (*x)[itr] = 0.;(*y)[itr] = 0.;(*z)[itr] = 0.;
4226db3e 614 (*dx)[itr] = -1.; (*dy)[itr] = 100.; (*dz)[itr] = 100.; (*dpt)[itr] = 100.;
1ee39b3a 615 }
1ee39b3a 616
617 // Initialize TRD track to the first track reference
4226db3e 618 AliTrackReference *tr(NULL);
619 Int_t itr(0); while(!(tr = fTrackRefs[itr])) itr++;
3ceb45ae 620 if(tr->Pt()<1.e-3) return kFALSE;
1ee39b3a 621
622 AliTRDtrackV1 tt;
623 Double_t xyz[3]={tr->X(),tr->Y(),tr->Z()};
624 Double_t pxyz[3]={tr->Px(),tr->Py(),tr->Pz()};
625 Double_t var[6] = {1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4};
626 Double_t cov[21]={
627 var[0], 0., 0., 0., 0., 0.,
628 var[1], 0., 0., 0., 0.,
629 var[2], 0., 0., 0.,
630 var[3], 0., 0.,
631 var[4], 0.,
632 var[5]
633 };
634 TDatabasePDG db;
635 const TParticlePDG *pdg=db.GetParticle(fPDG);
636 if(!pdg){
637 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::PropagateKalman()", Form("PDG entry missing for code %d. References for track %d", fPDG, fNTrackRefs));
3ceb45ae 638 return kFALSE;
1ee39b3a 639 }
640 tt.Set(xyz, pxyz, cov, Short_t(pdg->Charge()));
3ceb45ae 641 if(mass<0){ // mass 0 use PDG
642 tt.SetMass(pdg->Mass());
643 } else { // use rec value
644 tt.SetMass(mass);
645 }
646
647// Double_t bg(tr->P()/pdg->Mass());
648// printf("\n\nNEW track PDG[%d] bg[%f] x[%f]\n", fPDG, bg, TMath::Log(bg));
4226db3e 649 Double_t x0(tr->LocalX());
650 const Double_t *cc(NULL);
651 for(Int_t ip=0; itr<fNTrackRefs; itr++){
652 if(!(tr = fTrackRefs[itr])) continue;
3ceb45ae 653// printf("ip[%d] det[%d]\n", ip, tr->DetectorId());
5066aa9a 654 if(!AliTRDtrackerV1::PropagateToX(tt, tr->LocalX(), fgKalmanStep)) continue;
1ee39b3a 655
656 //if(update) ...
3ceb45ae 657 tt.GetXYZ(xyz);
658 (*x)[ip] = xyz[0];
659 (*y)[ip] = xyz[1];
660 (*z)[ip] = xyz[2];
4226db3e 661 (*dx)[ip] = tt.GetX() - x0;
662 (*dy)[ip] = tt.GetY() - tr->LocalY();
663 (*dz)[ip] = tt.GetZ() - tr->Z();
5066aa9a 664 (*pt)[ip] = tr->Pt();
4226db3e 665 (*dpt)[ip] = tt.Pt()- tr->Pt();
3ceb45ae 666// printf("pt : kalman[%e] MC[%e]\n", tt.Pt(), tr->Pt());
667 (*budget)[ip] = tt.GetBudget(0);
1ee39b3a 668 cc = tt.GetCovariance();
3ceb45ae 669// printf("dx[%5.2f] sy[%f]\n", (*dx)[ip], TMath::Sqrt(cc[0]));
670 for(Int_t ic(0), jp(ip*15); ic<15; ic++, jp++) (*c)[jp]=cc[ic];
1ee39b3a 671 ip++;
672 }
3ceb45ae 673 return kTRUE;
1ee39b3a 674}