]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/ESD/AliTrackPointArray.cxx
Adding the possibility to get an oldest version, also via GetAll, by means
[u/mrichter/AliRoot.git] / STEER / ESD / AliTrackPointArray.cxx
CommitLineData
98937d93 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//////////////////////////////////////////////////////////////////////////////
17// Class AliTrackPointArray //
18// This class contains the ESD track space-points which are used during //
19// the alignment procedures. Each space-point consist of 3 coordinates //
20// (and their errors) and the index of the sub-detector which contains //
21// the space-point. //
22// cvetan.cheshkov@cern.ch 3/11/2005 //
23//////////////////////////////////////////////////////////////////////////////
24
46ae650f 25#include <TMath.h>
4dcdc747 26#include <TMatrixD.h>
46ae650f 27#include <TMatrixDSym.h>
082050e1 28#include <TGeoMatrix.h>
29#include <TMatrixDSymEigen.h>
ddfbc51a 30
98937d93 31#include "AliTrackPointArray.h"
32
33ClassImp(AliTrackPointArray)
34
35//______________________________________________________________________________
fe12e09c 36AliTrackPointArray::AliTrackPointArray() :
37 TObject(),
bead9796 38 fSorted(kFALSE),
fe12e09c 39 fNPoints(0),
40 fX(0),
41 fY(0),
42 fZ(0),
6d016ab4 43 fCharge(0),
cb0800cc 44 fDriftTime(0),
b7bcc8ed 45 fChargeRatio(0),
e3901fd8 46 fClusterType(0),
eb2d90b9 47 fIsExtra(0),
fe12e09c 48 fSize(0),
49 fCov(0),
50 fVolumeID(0)
98937d93 51{
98937d93 52}
53
54//______________________________________________________________________________
55AliTrackPointArray::AliTrackPointArray(Int_t npoints):
fe12e09c 56 TObject(),
bead9796 57 fSorted(kFALSE),
fe12e09c 58 fNPoints(npoints),
ddfbc51a 59 fX(new Float_t[npoints]),
60 fY(new Float_t[npoints]),
61 fZ(new Float_t[npoints]),
62 fCharge(new Float_t[npoints]),
63 fDriftTime(new Float_t[npoints]),
64 fChargeRatio(new Float_t[npoints]),
65 fClusterType(new Int_t[npoints]),
66 fIsExtra(new Bool_t[npoints]),
fe12e09c 67 fSize(6*npoints),
ddfbc51a 68 fCov(new Float_t[fSize]),
69 fVolumeID(new UShort_t[npoints])
98937d93 70{
71 // Constructor
ddfbc51a 72 //
73 for (Int_t ip=0; ip<npoints;ip++){
a090c665 74 fX[ip]=0;
75 fY[ip]=0;
76 fZ[ip]=0;
6d016ab4 77 fCharge[ip]=0;
cb0800cc 78 fDriftTime[ip]=0;
b7bcc8ed 79 fChargeRatio[ip]=0;
e3901fd8 80 fClusterType[ip]=0;
eb2d90b9 81 fIsExtra[ip]=kFALSE;
a090c665 82 fVolumeID[ip]=0;
ddfbc51a 83 for (Int_t icov=0;icov<6; icov++)
84 fCov[6*ip+icov]=0;
a090c665 85 }
98937d93 86}
87
88//______________________________________________________________________________
89AliTrackPointArray::AliTrackPointArray(const AliTrackPointArray &array):
fe12e09c 90 TObject(array),
bead9796 91 fSorted(array.fSorted),
fe12e09c 92 fNPoints(array.fNPoints),
ddfbc51a 93 fX(new Float_t[fNPoints]),
94 fY(new Float_t[fNPoints]),
95 fZ(new Float_t[fNPoints]),
96 fCharge(new Float_t[fNPoints]),
97 fDriftTime(new Float_t[fNPoints]),
98 fChargeRatio(new Float_t[fNPoints]),
99 fClusterType(new Int_t[fNPoints]),
100 fIsExtra(new Bool_t[fNPoints]),
101 fSize(array.fSize),
102 fCov(new Float_t[fSize]),
103 fVolumeID(new UShort_t[fNPoints])
98937d93 104{
105 // Copy constructor
106 //
98937d93 107 memcpy(fX,array.fX,fNPoints*sizeof(Float_t));
108 memcpy(fY,array.fY,fNPoints*sizeof(Float_t));
109 memcpy(fZ,array.fZ,fNPoints*sizeof(Float_t));
ddfbc51a 110 if (array.fCharge) {
111 memcpy(fCharge,array.fCharge,fNPoints*sizeof(Float_t));
112 } else {
113 memset(fCharge, 0, fNPoints*sizeof(Float_t));
114 }
115 if (array.fDriftTime) {
116 memcpy(fDriftTime,array.fDriftTime,fNPoints*sizeof(Float_t));
117 } else {
118 memset(fDriftTime, 0, fNPoints*sizeof(Float_t));
119 }
120 if (array.fChargeRatio) {
121 memcpy(fChargeRatio,array.fChargeRatio,fNPoints*sizeof(Float_t));
122 } else {
123 memset(fChargeRatio, 0, fNPoints*sizeof(Float_t));
124 }
125 if (array.fClusterType) {
126 memcpy(fClusterType,array.fClusterType,fNPoints*sizeof(Int_t));
127 } else {
128 memset(fClusterType, 0, fNPoints*sizeof(Int_t));
129 }
130 if (array.fIsExtra) {
131 memcpy(fIsExtra,array.fIsExtra,fNPoints*sizeof(Bool_t));
132 } else {
133 memset(fIsExtra, 0, fNPoints*sizeof(Bool_t));
134 }
98937d93 135 memcpy(fVolumeID,array.fVolumeID,fNPoints*sizeof(UShort_t));
136 memcpy(fCov,array.fCov,fSize*sizeof(Float_t));
137}
138
139//_____________________________________________________________________________
140AliTrackPointArray &AliTrackPointArray::operator =(const AliTrackPointArray& array)
141{
142 // assignment operator
143 //
144 if(this==&array) return *this;
145 ((TObject *)this)->operator=(array);
ddfbc51a 146
bead9796 147 fSorted = array.fSorted;
98937d93 148 fNPoints = array.fNPoints;
149 fSize = array.fSize;
ddfbc51a 150 delete [] fX;
151 fX = new Float_t[fNPoints];
152 delete [] fY;
153 fY = new Float_t[fNPoints];
154 delete [] fZ;
155 fZ = new Float_t[fNPoints];
156 delete [] fCharge;
157 fCharge = new Float_t[fNPoints];
158 delete [] fDriftTime;
159 fDriftTime = new Float_t[fNPoints];
160 delete [] fChargeRatio;
161 fChargeRatio = new Float_t[fNPoints];
162 delete [] fClusterType;
163 fClusterType = new Int_t[fNPoints];
164 delete [] fIsExtra;
165 fIsExtra = new Bool_t[fNPoints];
166 delete [] fVolumeID;
167 fVolumeID = new UShort_t[fNPoints];
168 delete [] fCov;
169 fCov = new Float_t[fSize];
98937d93 170 memcpy(fX,array.fX,fNPoints*sizeof(Float_t));
171 memcpy(fY,array.fY,fNPoints*sizeof(Float_t));
172 memcpy(fZ,array.fZ,fNPoints*sizeof(Float_t));
6d016ab4 173 memcpy(fCharge,array.fCharge,fNPoints*sizeof(Float_t));
cb0800cc 174 memcpy(fDriftTime,array.fDriftTime,fNPoints*sizeof(Float_t));
b7bcc8ed 175 memcpy(fChargeRatio,array.fChargeRatio,fNPoints*sizeof(Float_t));
e3901fd8 176 memcpy(fClusterType,array.fClusterType,fNPoints*sizeof(Int_t));
eb2d90b9 177 memcpy(fIsExtra,array.fIsExtra,fNPoints*sizeof(Bool_t));
98937d93 178 memcpy(fVolumeID,array.fVolumeID,fNPoints*sizeof(UShort_t));
179 memcpy(fCov,array.fCov,fSize*sizeof(Float_t));
180
181 return *this;
182}
183
184//______________________________________________________________________________
185AliTrackPointArray::~AliTrackPointArray()
186{
187 // Destructor
188 //
ddfbc51a 189 delete [] fX;
190 delete [] fY;
191 delete [] fZ;
192 delete [] fCharge;
193 delete [] fDriftTime;
194 delete [] fChargeRatio;
195 delete [] fClusterType;
196 delete [] fIsExtra;
197 delete [] fVolumeID;
198 delete [] fCov;
98937d93 199}
200
201
202//______________________________________________________________________________
203Bool_t AliTrackPointArray::AddPoint(Int_t i, const AliTrackPoint *p)
204{
205 // Add a point to the array at position i
206 //
207 if (i >= fNPoints) return kFALSE;
208 fX[i] = p->GetX();
209 fY[i] = p->GetY();
210 fZ[i] = p->GetZ();
6d016ab4 211 fCharge[i] = p->GetCharge();
cb0800cc 212 fDriftTime[i] = p->GetDriftTime();
b7bcc8ed 213 fChargeRatio[i]=p->GetChargeRatio();
e3901fd8 214 fClusterType[i]=p->GetClusterType();
eb2d90b9 215 fIsExtra[i] = p->IsExtra();
98937d93 216 fVolumeID[i] = p->GetVolumeID();
217 memcpy(&fCov[6*i],p->GetCov(),6*sizeof(Float_t));
218 return kTRUE;
219}
220
ec9e17f9 221
98937d93 222//______________________________________________________________________________
223Bool_t AliTrackPointArray::GetPoint(AliTrackPoint &p, Int_t i) const
224{
225 // Get the point at position i
226 //
227 if (i >= fNPoints) return kFALSE;
228 p.SetXYZ(fX[i],fY[i],fZ[i],&fCov[6*i]);
229 p.SetVolumeID(fVolumeID[i]);
d58b83a7 230 p.SetCharge(fCharge ? fCharge[i] : 0);
231 p.SetDriftTime(fDriftTime ? fDriftTime[i] : 0);
232 p.SetChargeRatio(fChargeRatio ? fChargeRatio[i] : 0);
e3901fd8 233 p.SetClusterType(fClusterType ? fClusterType[i] : 0);
f7a1cc68 234 p.SetExtra(fIsExtra ? fIsExtra[i] : kFALSE);
98937d93 235 return kTRUE;
236}
237
238//______________________________________________________________________________
239Bool_t AliTrackPointArray::HasVolumeID(UShort_t volid) const
240{
241 // This method checks if the array
242 // has at least one hit in the detector
243 // volume defined by volid
244 Bool_t check = kFALSE;
245 for (Int_t ipoint = 0; ipoint < fNPoints; ipoint++)
246 if (fVolumeID[ipoint] == volid) check = kTRUE;
247
248 return check;
249}
250
bead9796 251//______________________________________________________________________________
252void AliTrackPointArray::Sort(Bool_t down)
253{
254 // Sort the array by the values of Y-coordinate of the track points.
255 // The order is given by "down".
256 // Optimized more for maintenance rather than for speed.
ddfbc51a 257
bead9796 258 if (fSorted) return;
ddfbc51a 259
260 Int_t *index=new Int_t[fNPoints];
261 AliTrackPointArray a(*this);
262 TMath::Sort(fNPoints,a.GetY(),index,down);
bead9796 263
ddfbc51a 264 AliTrackPoint p;
bead9796 265 for (Int_t i = 0; i < fNPoints; i++) {
ddfbc51a 266 a.GetPoint(p,index[i]);
bead9796 267 AddPoint(i,&p);
268 }
ddfbc51a 269
270 delete[] index;
bead9796 271 fSorted=kTRUE;
272}
273
e9f1f2ee 274//_____________________________________________________________________________
275void AliTrackPointArray::Print(Option_t *) const
276{
277 // Print the space-point coordinates and modules info
278 for (int i=0;i<fNPoints;i++) {
279 printf("#%3d VID %5d XYZ:%+9.3f/%+9.3f/%+9.3f |q: %+7.2f |DT: %+8.1f| ChR: %+.2e |Cl: %d %s\n",
280 i,fVolumeID[i],fX[i],fY[i],fZ[i],fCharge[i],fDriftTime[i],
281 fChargeRatio[i],fClusterType[i],fIsExtra[i] ? "|E":"");
282 }
283}
284
285
98937d93 286ClassImp(AliTrackPoint)
287
288//______________________________________________________________________________
fe12e09c 289AliTrackPoint::AliTrackPoint() :
290 TObject(),
291 fX(0),
292 fY(0),
293 fZ(0),
6d016ab4 294 fCharge(0),
cb0800cc 295 fDriftTime(0),
b7bcc8ed 296 fChargeRatio(0),
e3901fd8 297 fClusterType(0),
eb2d90b9 298 fIsExtra(kFALSE),
fe12e09c 299 fVolumeID(0)
98937d93 300{
301 // Default constructor
302 //
98937d93 303 memset(fCov,0,6*sizeof(Float_t));
304}
305
306
307//______________________________________________________________________________
e3901fd8 308AliTrackPoint::AliTrackPoint(Float_t x, Float_t y, Float_t z, const Float_t *cov, UShort_t volid, Float_t charge, Float_t drifttime,Float_t chargeratio, Int_t clutyp) :
fe12e09c 309 TObject(),
310 fX(0),
311 fY(0),
312 fZ(0),
6d016ab4 313 fCharge(0),
cb0800cc 314 fDriftTime(0),
b7bcc8ed 315 fChargeRatio(0),
e3901fd8 316 fClusterType(0),
eb2d90b9 317 fIsExtra(kFALSE),
fe12e09c 318 fVolumeID(0)
98937d93 319{
320 // Constructor
321 //
322 SetXYZ(x,y,z,cov);
6d016ab4 323 SetCharge(charge);
cb0800cc 324 SetDriftTime(drifttime);
b7bcc8ed 325 SetChargeRatio(chargeratio);
e3901fd8 326 SetClusterType(clutyp);
98937d93 327 SetVolumeID(volid);
328}
329
330//______________________________________________________________________________
e3901fd8 331AliTrackPoint::AliTrackPoint(const Float_t *xyz, const Float_t *cov, UShort_t volid, Float_t charge, Float_t drifttime,Float_t chargeratio, Int_t clutyp) :
fe12e09c 332 TObject(),
333 fX(0),
334 fY(0),
335 fZ(0),
6d016ab4 336 fCharge(0),
cb0800cc 337 fDriftTime(0),
b7bcc8ed 338 fChargeRatio(0),
e3901fd8 339 fClusterType(0),
eb2d90b9 340 fIsExtra(kFALSE),
fe12e09c 341 fVolumeID(0)
98937d93 342{
343 // Constructor
344 //
345 SetXYZ(xyz[0],xyz[1],xyz[2],cov);
6d016ab4 346 SetCharge(charge);
cb0800cc 347 SetDriftTime(drifttime);
b7bcc8ed 348 SetChargeRatio(chargeratio);
98937d93 349 SetVolumeID(volid);
e3901fd8 350 SetClusterType(clutyp);
98937d93 351}
352
353//______________________________________________________________________________
354AliTrackPoint::AliTrackPoint(const AliTrackPoint &p):
fe12e09c 355 TObject(p),
356 fX(0),
357 fY(0),
358 fZ(0),
6d016ab4 359 fCharge(0),
cb0800cc 360 fDriftTime(0),
b7bcc8ed 361 fChargeRatio(0),
e3901fd8 362 fClusterType(0),
eb2d90b9 363 fIsExtra(kFALSE),
fe12e09c 364 fVolumeID(0)
98937d93 365{
366 // Copy constructor
367 //
368 SetXYZ(p.fX,p.fY,p.fZ,&(p.fCov[0]));
6d016ab4 369 SetCharge(p.fCharge);
cb0800cc 370 SetDriftTime(p.fDriftTime);
b7bcc8ed 371 SetChargeRatio(p.fChargeRatio);
e3901fd8 372 SetClusterType(p.fClusterType);
eb2d90b9 373 SetExtra(p.fIsExtra);
98937d93 374 SetVolumeID(p.fVolumeID);
375}
376
377//_____________________________________________________________________________
378AliTrackPoint &AliTrackPoint::operator =(const AliTrackPoint& p)
379{
380 // assignment operator
381 //
382 if(this==&p) return *this;
383 ((TObject *)this)->operator=(p);
384
385 SetXYZ(p.fX,p.fY,p.fZ,&(p.fCov[0]));
6d016ab4 386 SetCharge(p.fCharge);
cb0800cc 387 SetDriftTime(p.fDriftTime);
b7bcc8ed 388 SetChargeRatio(p.fChargeRatio);
e3901fd8 389 SetClusterType(p.fClusterType);
eb2d90b9 390 SetExtra(p.fIsExtra);
98937d93 391 SetVolumeID(p.fVolumeID);
392
393 return *this;
394}
395
396//______________________________________________________________________________
397void AliTrackPoint::SetXYZ(Float_t x, Float_t y, Float_t z, const Float_t *cov)
398{
399 // Set XYZ coordinates and their cov matrix
400 //
401 fX = x;
402 fY = y;
403 fZ = z;
404 if (cov)
405 memcpy(fCov,cov,6*sizeof(Float_t));
406}
407
408//______________________________________________________________________________
409void AliTrackPoint::SetXYZ(const Float_t *xyz, const Float_t *cov)
410{
411 // Set XYZ coordinates and their cov matrix
412 //
413 SetXYZ(xyz[0],xyz[1],xyz[2],cov);
414}
415
90a845c7 416//______________________________________________________________________________
417void AliTrackPoint::SetCov(const Float_t *cov)
418{
419 // Set XYZ cov matrix
420 //
421 if (cov)
422 memcpy(fCov,cov,6*sizeof(Float_t));
423}
424
98937d93 425//______________________________________________________________________________
426void AliTrackPoint::GetXYZ(Float_t *xyz, Float_t *cov) const
427{
428 xyz[0] = fX;
429 xyz[1] = fY;
430 xyz[2] = fZ;
431 if (cov)
432 memcpy(cov,fCov,6*sizeof(Float_t));
433}
46ae650f 434
435//______________________________________________________________________________
436Float_t AliTrackPoint::GetResidual(const AliTrackPoint &p, Bool_t weighted) const
437{
438 // This method calculates the track to space-point residuals. The track
439 // interpolation is also stored as AliTrackPoint. Using the option
440 // 'weighted' one can calculate the residual either with or without
441 // taking into account the covariance matrix of the space-point and
442 // track interpolation. The second case the residual becomes a pull.
443
444 Float_t res = 0;
445
446 if (!weighted) {
447 Float_t xyz[3],xyzp[3];
448 GetXYZ(xyz);
449 p.GetXYZ(xyzp);
450 res = (xyz[0]-xyzp[0])*(xyz[0]-xyzp[0])+
451 (xyz[1]-xyzp[1])*(xyz[1]-xyzp[1])+
452 (xyz[2]-xyzp[2])*(xyz[2]-xyzp[2]);
453 }
454 else {
455 Float_t xyz[3],xyzp[3];
456 Float_t cov[6],covp[6];
457 GetXYZ(xyz,cov);
458 TMatrixDSym mcov(3);
459 mcov(0,0) = cov[0]; mcov(0,1) = cov[1]; mcov(0,2) = cov[2];
460 mcov(1,0) = cov[1]; mcov(1,1) = cov[3]; mcov(1,2) = cov[4];
461 mcov(2,0) = cov[2]; mcov(2,1) = cov[4]; mcov(2,2) = cov[5];
462 p.GetXYZ(xyzp,covp);
463 TMatrixDSym mcovp(3);
464 mcovp(0,0) = covp[0]; mcovp(0,1) = covp[1]; mcovp(0,2) = covp[2];
465 mcovp(1,0) = covp[1]; mcovp(1,1) = covp[3]; mcovp(1,2) = covp[4];
466 mcovp(2,0) = covp[2]; mcovp(2,1) = covp[4]; mcovp(2,2) = covp[5];
467 TMatrixDSym msum = mcov + mcovp;
468 msum.Invert();
cc345ce3 469 // mcov.Print(); mcovp.Print(); msum.Print();
46ae650f 470 if (msum.IsValid()) {
471 for (Int_t i = 0; i < 3; i++)
472 for (Int_t j = 0; j < 3; j++)
473 res += (xyz[i]-xyzp[i])*(xyz[j]-xyzp[j])*msum(i,j);
474 }
475 }
476
477 return res;
478}
479
4dcdc747 480//_____________________________________________________________________________
481Bool_t AliTrackPoint::GetPCA(const AliTrackPoint &p, AliTrackPoint &out) const
482{
483 //
484 // Get the intersection point between this point and
485 // the point "p" belongs to.
486 // The result is stored as a point 'out'
487 // return kFALSE in case of failure.
488 out.SetXYZ(0,0,0);
489
490 TMatrixD t(3,1);
491 t(0,0)=GetX();
492 t(1,0)=GetY();
493 t(2,0)=GetZ();
494
495 TMatrixDSym tC(3);
496 {
497 const Float_t *cv=GetCov();
498 tC(0,0)=cv[0]; tC(0,1)=cv[1]; tC(0,2)=cv[2];
499 tC(1,0)=cv[1]; tC(1,1)=cv[3]; tC(1,2)=cv[4];
500 tC(2,0)=cv[2]; tC(2,1)=cv[4]; tC(2,2)=cv[5];
501 }
502
503 TMatrixD m(3,1);
504 m(0,0)=p.GetX();
505 m(1,0)=p.GetY();
506 m(2,0)=p.GetZ();
507
508 TMatrixDSym mC(3);
509 {
510 const Float_t *cv=p.GetCov();
511 mC(0,0)=cv[0]; mC(0,1)=cv[1]; mC(0,2)=cv[2];
512 mC(1,0)=cv[1]; mC(1,1)=cv[3]; mC(1,2)=cv[4];
513 mC(2,0)=cv[2]; mC(2,1)=cv[4]; mC(2,2)=cv[5];
514 }
515
516 TMatrixDSym tmW(tC);
517 tmW+=mC;
518 tmW.Invert();
519 if (!tmW.IsValid()) return kFALSE;
520
521 TMatrixD mW(tC,TMatrixD::kMult,tmW);
522 TMatrixD tW(mC,TMatrixD::kMult,tmW);
523
524 TMatrixD mi(mW,TMatrixD::kMult,m);
525 TMatrixD ti(tW,TMatrixD::kMult,t);
526 ti+=mi;
527
528 TMatrixD iC(tC,TMatrixD::kMult,tmW);
529 iC*=mC;
530
531 out.SetXYZ(ti(0,0),ti(1,0),ti(2,0));
532 UShort_t id=p.GetVolumeID();
533 out.SetVolumeID(id);
534
535 return kTRUE;
536}
537
46ae650f 538//______________________________________________________________________________
539Float_t AliTrackPoint::GetAngle() const
540{
541 // The method uses the covariance matrix of
542 // the space-point in order to extract the
543 // orientation of the detector plane.
544 // The rotation in XY plane only is calculated.
545
8e52c1a8 546 Float_t phi= TMath::ATan2(TMath::Sqrt(fCov[0]),TMath::Sqrt(fCov[3]));
547 if (fCov[1] > 0) {
548 phi = TMath::Pi() - phi;
549 if ((fY-fX) < 0) phi += TMath::Pi();
550 }
46ae650f 551 else {
8e52c1a8 552 if ((fX+fY) < 0) phi += TMath::Pi();
553 }
554
555 return phi;
556
46ae650f 557}
558
082050e1 559//______________________________________________________________________________
560Bool_t AliTrackPoint::GetRotMatrix(TGeoRotation& rot) const
561{
562 // Returns the orientation of the
563 // sensitive layer (using cluster
564 // covariance matrix).
565 // Assumes that cluster has errors only in the layer's plane.
566 // Return value is kTRUE in case of success.
567
568 TMatrixDSym mcov(3);
569 {
570 const Float_t *cov=GetCov();
571 mcov(0,0)=cov[0]; mcov(0,1)=cov[1]; mcov(0,2)=cov[2];
572 mcov(1,0)=cov[1]; mcov(1,1)=cov[3]; mcov(1,2)=cov[4];
573 mcov(2,0)=cov[2]; mcov(2,1)=cov[4]; mcov(2,2)=cov[5];
574 }
575
576 TMatrixDSymEigen eigen(mcov);
577 TMatrixD eigenMatrix = eigen.GetEigenVectors();
578
579 rot.SetMatrix(eigenMatrix.GetMatrixArray());
580
581 return kTRUE;
582}
583
584
46ae650f 585//_____________________________________________________________________________
586AliTrackPoint& AliTrackPoint::Rotate(Float_t alpha) const
587{
588 // Transform the space-point coordinates
589 // and covariance matrix from global to
590 // local (detector plane) coordinate system
591 // XY plane rotation only
592
593 static AliTrackPoint p;
594 p = *this;
595
596 Float_t xyz[3],cov[6];
597 GetXYZ(xyz,cov);
598
599 Float_t sin = TMath::Sin(alpha), cos = TMath::Cos(alpha);
600
601 Float_t newxyz[3],newcov[6];
602 newxyz[0] = cos*xyz[0] + sin*xyz[1];
603 newxyz[1] = cos*xyz[1] - sin*xyz[0];
604 newxyz[2] = xyz[2];
605
606 newcov[0] = cov[0]*cos*cos+
607 2*cov[1]*sin*cos+
608 cov[3]*sin*sin;
609 newcov[1] = cov[1]*(cos*cos-sin*sin)+
610 (cov[3]-cov[0])*sin*cos;
611 newcov[2] = cov[2]*cos+
612 cov[4]*sin;
613 newcov[3] = cov[0]*sin*sin-
614 2*cov[1]*sin*cos+
615 cov[3]*cos*cos;
616 newcov[4] = cov[4]*cos-
617 cov[2]*sin;
618 newcov[5] = cov[5];
619
620 p.SetXYZ(newxyz,newcov);
621 p.SetVolumeID(GetVolumeID());
622
623 return p;
624}
625
626//_____________________________________________________________________________
627AliTrackPoint& AliTrackPoint::MasterToLocal() const
628{
629 // Transform the space-point coordinates
630 // and the covariance matrix from the
631 // (master) to the local (tracking)
632 // coordinate system
633
634 Float_t alpha = GetAngle();
635 return Rotate(alpha);
636}
637
638//_____________________________________________________________________________
639void AliTrackPoint::Print(Option_t *) const
640{
641 // Print the space-point coordinates and
642 // covariance matrix
643
644 printf("VolumeID=%d\n", GetVolumeID());
645 printf("X = %12.6f Tx = %12.6f%12.6f%12.6f\n", fX, fCov[0], fCov[1], fCov[2]);
646 printf("Y = %12.6f Ty = %12.6f%12.6f%12.6f\n", fY, fCov[1], fCov[3], fCov[4]);
647 printf("Z = %12.6f Tz = %12.6f%12.6f%12.6f\n", fZ, fCov[2], fCov[4], fCov[5]);
6d016ab4 648 printf("Charge = %f\n", fCharge);
cb0800cc 649 printf("Drift Time = %f\n", fDriftTime);
b7bcc8ed 650 printf("Charge Ratio = %f\n", fChargeRatio);
e3901fd8 651 printf("Cluster Type = %d\n", fClusterType);
eb2d90b9 652 if(fIsExtra) printf("This is an extra point\n");
46ae650f 653
654}
ec9e17f9 655
656
657//________________________________
e04e816f 658void AliTrackPoint::SetAlignCovMatrix(const TMatrixDSym& alignparmtrx){
ec9e17f9 659 // Add the uncertainty on the cluster position due to alignment
660 // (using the 6x6 AliAlignObj Cov. Matrix alignparmtrx) to the already
661 // present Cov. Matrix
662
663 TMatrixDSym cov(3);
664 TMatrixD coval(3,3);
665 TMatrixD jacob(3,6);
666 Float_t newcov[6];
667
668 cov(0,0)=fCov[0];
669 cov(1,0)=cov(0,1)=fCov[1];
670 cov(2,0)=cov(0,2)=fCov[2];
671 cov(1,1)=fCov[3];
672 cov(2,1)=cov(1,2)=fCov[4];
673 cov(2,2)=fCov[5];
674
675 jacob(0,0) = 1; jacob(1,0) = 0; jacob(2,0) = 0;
676 jacob(0,1) = 0; jacob(1,1) = 1; jacob(2,1) = 0;
677 jacob(0,2) = 0; jacob(1,2) = 0; jacob(2,2) = 1;
678 jacob(0,3) = 0; jacob(1,3) =-fZ; jacob(2,3) = fY;
679 jacob(0,4) = fZ; jacob(1,4) = 0; jacob(2,4) =-fX;
347c4515 680 jacob(0,5) = -fY; jacob(1,5) = fX; jacob(2,5) = 0;
ec9e17f9 681
682 TMatrixD jacobT=jacob.T();jacob.T();
683
684 coval=jacob*alignparmtrx*jacobT+cov;
685
686
687 newcov[0]=coval(0,0);
688 newcov[1]=coval(1,0);
689 newcov[2]=coval(2,0);
690 newcov[3]=coval(1,1);
691 newcov[4]=coval(2,1);
692 newcov[5]=coval(2,2);
693
694 SetXYZ(fX,fY,fZ,newcov);
695
696}
bead9796 697
eb2d90b9 698