]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliAODVertex.cxx
Fixes for report #65711: changes in ITSVertexer and AliMultiplicity (Annalisa)
[u/mrichter/AliRoot.git] / STEER / AliAODVertex.cxx
CommitLineData
df9db588 1/**************************************************************************
2 * Copyright(c) 1998-2007, 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$ */
17
18//-------------------------------------------------------------------------
19// AOD track base class
20// Base class for Analysis Object Data
21// Generic version
22// Author: Markus Oldenburg, CERN
bdd011d6 23// Inheritance from AliVVertex: A. Dainese
df9db588 24//-------------------------------------------------------------------------
25
26#include "AliAODVertex.h"
0657f082 27#include "AliAODTrack.h"
28
df9db588 29ClassImp(AliAODVertex)
30
31//______________________________________________________________________________
32AliAODVertex::AliAODVertex() :
bdd011d6 33 AliVVertex(),
0657f082 34 fChi2perNDF(-999.),
02153d58 35 fID(-1),
9333290e 36 fType(kUndef),
bca58dd7 37 fNprong(0),
38 fIprong(0),
d999f2e6 39 fNContributors(0),
9f7c531f 40 fCovMatrix(NULL),
0f09edc3 41 fParent(),
bca58dd7 42 fDaughters(),
43 fProngs(NULL)
9333290e 44 {
df9db588 45 // default constructor
46
47 fPosition[0] = fPosition[1] = fPosition[2] = -999.;
48}
49
50//______________________________________________________________________________
51AliAODVertex::AliAODVertex(const Double_t position[3],
31fd97b2 52 const Double_t covMatrix[6],
0657f082 53 Double_t chi2perNDF,
df9db588 54 TObject *parent,
02153d58 55 Short_t id,
bca58dd7 56 Char_t vtype,
57 Int_t nprong) :
bdd011d6 58 AliVVertex(),
0657f082 59 fChi2perNDF(chi2perNDF),
02153d58 60 fID(id),
9333290e 61 fType(vtype),
bca58dd7 62 fNprong(nprong),
63 fIprong(0),
d999f2e6 64 fNContributors(0),
9f7c531f 65 fCovMatrix(NULL),
df9db588 66 fParent(parent),
bca58dd7 67 fDaughters(),
68 fProngs(0)
df9db588 69{
70 // constructor
71
72 SetPosition(position);
73 if (covMatrix) SetCovMatrix(covMatrix);
bca58dd7 74 MakeProngs();
df9db588 75}
76
77//______________________________________________________________________________
78AliAODVertex::AliAODVertex(const Float_t position[3],
79 const Float_t covMatrix[6],
0657f082 80 Double_t chi2perNDF,
df9db588 81 TObject *parent,
02153d58 82 Short_t id,
bca58dd7 83 Char_t vtype,
84 Int_t nprong) :
4d209fca 85
bdd011d6 86 AliVVertex(),
0657f082 87 fChi2perNDF(chi2perNDF),
02153d58 88 fID(id),
9333290e 89 fType(vtype),
bca58dd7 90 fNprong(nprong),
91 fIprong(0),
d999f2e6 92 fNContributors(0),
9f7c531f 93 fCovMatrix(NULL),
df9db588 94 fParent(parent),
bca58dd7 95 fDaughters(),
96 fProngs(0)
df9db588 97{
98 // constructor
99
100 SetPosition(position);
101 if (covMatrix) SetCovMatrix(covMatrix);
bca58dd7 102 MakeProngs();
df9db588 103}
104
105//______________________________________________________________________________
106AliAODVertex::AliAODVertex(const Double_t position[3],
0657f082 107 Double_t chi2perNDF,
bca58dd7 108 Char_t vtype,
109 Int_t nprong) :
bdd011d6 110 AliVVertex(),
0657f082 111 fChi2perNDF(chi2perNDF),
02153d58 112 fID(-1),
9333290e 113 fType(vtype),
bca58dd7 114 fNprong(nprong),
115 fIprong(0),
d999f2e6 116 fNContributors(0),
9f7c531f 117 fCovMatrix(NULL),
0f09edc3 118 fParent(),
bca58dd7 119 fDaughters(),
120 fProngs(0)
df9db588 121{
122 // constructor without covariance matrix
123
124 SetPosition(position);
bca58dd7 125 MakeProngs();
df9db588 126}
127
128//______________________________________________________________________________
129AliAODVertex::AliAODVertex(const Float_t position[3],
0657f082 130 Double_t chi2perNDF,
bca58dd7 131 Char_t vtype, Int_t nprong) :
bdd011d6 132 AliVVertex(),
0657f082 133 fChi2perNDF(chi2perNDF),
02153d58 134 fID(-1),
9333290e 135 fType(vtype),
bca58dd7 136 fNprong(nprong),
137 fIprong(0),
d999f2e6 138 fNContributors(0),
9f7c531f 139 fCovMatrix(NULL),
0f09edc3 140 fParent(),
bca58dd7 141 fDaughters(),
142 fProngs(0)
df9db588 143{
144 // constructor without covariance matrix
145
146 SetPosition(position);
bca58dd7 147 MakeProngs();
df9db588 148}
149
150//______________________________________________________________________________
151AliAODVertex::~AliAODVertex()
152{
153 // Destructor
154
155 delete fCovMatrix;
bca58dd7 156 if (fNprong > 0) delete[] fProngs;
df9db588 157}
158
159//______________________________________________________________________________
160AliAODVertex::AliAODVertex(const AliAODVertex& vtx) :
bdd011d6 161 AliVVertex(vtx),
0657f082 162 fChi2perNDF(vtx.fChi2perNDF),
02153d58 163 fID(vtx.fID),
9333290e 164 fType(vtx.fType),
bca58dd7 165 fNprong(vtx.fNprong),
166 fIprong(vtx.fIprong),
d999f2e6 167 fNContributors(vtx.fNContributors),
9f7c531f 168 fCovMatrix(NULL),
df9db588 169 fParent(vtx.fParent),
bca58dd7 170 fDaughters(vtx.fDaughters),
171 fProngs(0)
df9db588 172{
173 // Copy constructor.
174
175 for (int i = 0; i < 3; i++)
176 fPosition[i] = vtx.fPosition[i];
177
5d62ce04 178 if (vtx.fCovMatrix) fCovMatrix=new AliAODRedCov<3>(*vtx.fCovMatrix);
bca58dd7 179 MakeProngs();
180 for (int i = 0; i < fNprong; i++) {
181 fProngs[i] = vtx.fProngs[i];
182 }
df9db588 183}
184
185//______________________________________________________________________________
186AliAODVertex& AliAODVertex::operator=(const AliAODVertex& vtx)
187{
188 // Assignment operator
189 if (this != &vtx) {
190
191 // name and type
bdd011d6 192 AliVVertex::operator=(vtx);
df9db588 193
194 //momentum
195 for (int i = 0; i < 3; i++)
196 fPosition[i] = vtx.fPosition[i];
197
0657f082 198 fChi2perNDF = vtx.fChi2perNDF;
02153d58 199 fID = vtx.fID;
9333290e 200 fType = vtx.fType;
9f7c531f 201
df9db588 202 //covariance matrix
203 delete fCovMatrix;
9f7c531f 204 fCovMatrix = NULL;
5d62ce04 205 if (vtx.fCovMatrix) fCovMatrix=new AliAODRedCov<3>(*vtx.fCovMatrix);
df9db588 206
207 //other stuff
df9db588 208 fParent = vtx.fParent;
209 fDaughters = vtx.fDaughters;
bca58dd7 210 fNprong = vtx.fNprong;
211 fIprong = vtx.fIprong;
212
213 MakeProngs();
214 for (int i = 0; i < fNprong; i++) {
215 fProngs[i] = vtx.fProngs[i];
216 }
df9db588 217 }
218
219 return *this;
220}
221
cfa5b70c 222//______________________________________________________________________________
223void AliAODVertex::AddDaughter(TObject *daughter)
224{
225 // Add reference to daughter track
bca58dd7 226 if (!fProngs) {
227 if (fDaughters.GetEntries()==0) {
228 TRefArray* arr = &fDaughters;
229 new(arr)TRefArray(TProcessID::GetProcessWithUID(daughter));
230 }
231 fDaughters.Add(daughter);
232 } else {
233 if (fIprong < fNprong) {
234 fProngs[fIprong++] = daughter;
235 } else {
236 AliWarning("Number of daughters out of range !\n");
237 }
238 }
cfa5b70c 239 return;
240}
241
bca58dd7 242
df9db588 243//______________________________________________________________________________
244template <class T> void AliAODVertex::GetSigmaXYZ(T sigma[3]) const
245{
246 // Return errors on vertex position in thrust frame
247
248 if(fCovMatrix) {
249 sigma[0]=fCovMatrix[3]; //GetCovXZ
250 sigma[1]=fCovMatrix[4]; //GetCovYZ
251 sigma[2]=fCovMatrix[5]; //GetCovZZ
252 } else
253 sigma[0]=sigma[1]=sigma[2]=-999.;
254
255 /*
256 for (int i = 0, j = 6; i < 3; i++) {
257 j -= i+1;
258 sigma[2-i] = fCovMatrix ? TMath::Sqrt(fCovMatrix[j]) : -999.;
259 }
260 */
261}
262
0657f082 263//______________________________________________________________________________
264Int_t AliAODVertex::GetNContributors() const
265{
266 // Returns the number of tracks used to fit this vertex.
8b5318b9 267 Int_t cont = 0;
0657f082 268
19d55689 269 if (!strcmp(GetTitle(), "vertexer: 3D")) {
91bad62d 270 cont = fNContributors;
19d55689 271 } else {
272 for (Int_t iDaug = 0; iDaug < GetNDaughters(); iDaug++) {
8b5318b9 273 AliAODTrack* aodT = dynamic_cast<AliAODTrack*>(fDaughters.At(iDaug));
274 if (!aodT) continue;
275 if (aodT->GetUsedForPrimVtxFit()) cont++;
276 }
277 }
0657f082 278 return cont;
279}
280
df9db588 281//______________________________________________________________________________
282Bool_t AliAODVertex::HasDaughter(TObject *daughter) const
283{
284 // Checks if the given daughter (particle) is part of this vertex.
bca58dd7 285 if (!fProngs) {
286 TRefArrayIter iter(&fDaughters);
287 while (TObject *daugh = iter.Next()) {
288 if (daugh == daughter) return kTRUE;
289 }
290 return kFALSE;
291 } else {
292 Bool_t has = kFALSE;
5c2137c1 293 for (int i = 0; i < fNprong; i++) {
bca58dd7 294 if (fProngs[i].GetObject() == daughter) has = kTRUE;
295 }
296 return has;
297 }
df9db588 298}
299
300//______________________________________________________________________________
301Double_t AliAODVertex::RotatedCovMatrixXX(Double_t phi, Double_t theta) const
302{
303 // XX term of covariance matrix after rotation by phi around z-axis
304 // and, then, by theta around new y-axis
305
306 if (!fCovMatrix) {
307 //AliFatal("Covariance matrix not set");
308 return -999.;
309 }
310
311 Double_t covMatrix[6];
312
313 GetCovMatrix(covMatrix);
314
315 Double_t cp = TMath::Cos(phi);
316 Double_t sp = TMath::Sin(phi);
317 Double_t ct = TMath::Cos(theta);
318 Double_t st = TMath::Sin(theta);
319 return
320 covMatrix[0]*cp*cp*ct*ct // GetCovXX
321 +covMatrix[1]*2.*cp*sp*ct*ct // GetCovXY
322 +covMatrix[3]*2.*cp*ct*st // GetCovXZ
323 +covMatrix[2]*sp*sp*ct*ct // GetCovYY
324 +covMatrix[4]*2.*sp*ct*st // GetCovYZ
325 +covMatrix[5]*st*st; // GetCovZZ
326}
327
328//______________________________________________________________________________
329Double_t AliAODVertex::RotatedCovMatrixXY(Double_t phi, Double_t theta) const
330{
331 // XY term of covariance matrix after rotation by phi around z-axis
332 // and, then, by theta around new y-axis
333
334 if (!fCovMatrix) {
335 //AliFatal("Covariance matrix not set");
336 return -999.;
337 }
338
339 Double_t covMatrix[6];
340
341 GetCovMatrix(covMatrix);
342
343 Double_t cp = TMath::Cos(phi);
344 Double_t sp = TMath::Sin(phi);
345 Double_t ct = TMath::Cos(theta);
346 Double_t st = TMath::Sin(theta);
347 return
348 -covMatrix[0]*cp*sp*ct // GetCovXX
349 +covMatrix[1]*ct*(cp*cp-sp*sp) // GetCovXY
350 -covMatrix[3]*sp*st // GetCovXZ
351 +covMatrix[2]*cp*sp*ct // GetCovYY
352 +covMatrix[4]*cp*st; // GetCovYZ
353}
354
355//______________________________________________________________________________
356Double_t AliAODVertex::RotatedCovMatrixXZ(Double_t phi, Double_t theta) const
357{
358 // XZ term of covariance matrix after rotation by phi around z-axis
359 // and, then, by theta around new y-axis
360
361 if (!fCovMatrix) {
362 //AliFatal("Covariance matrix not set");
363 return -999.;
364 }
365
366 Double_t covMatrix[6];
367
368 GetCovMatrix(covMatrix);
369
370 Double_t cp = TMath::Cos(phi);
371 Double_t sp = TMath::Sin(phi);
372 Double_t ct = TMath::Cos(theta);
373 Double_t st = TMath::Sin(theta);
374 return
375 -covMatrix[0]*cp*cp*ct*st // GetCovXX
376 -covMatrix[1]*2.*cp*sp*ct*st // GetCovXY
377 +covMatrix[3]*cp*(ct*ct-st*st) // GetCovXZ
378 -covMatrix[2]*sp*sp*ct*st // GetCovYY
379 +covMatrix[4]*sp*(ct*ct-st*st) // GetCovYZ
380 +covMatrix[5]*ct*st; // GetCovZZ
381}
382
383//______________________________________________________________________________
384Double_t AliAODVertex::RotatedCovMatrixYY(Double_t phi) const
385{
386 // YY term of covariance matrix after rotation by phi around z-axis
387 // and, then, by theta around new y-axis
388
389 if (!fCovMatrix) {
390 //AliFatal("Covariance matrix not set");
391 return -999.;
392 }
393
394 Double_t covMatrix[6];
395
396 GetCovMatrix(covMatrix);
397
398 Double_t cp = TMath::Cos(phi);
399 Double_t sp = TMath::Sin(phi);
400 return
401 covMatrix[0]*sp*sp // GetCovXX
402 -covMatrix[1]*2.*cp*sp // GetCovXY
403 +covMatrix[2]*cp*cp; // GetCovYY
404}
405
406//______________________________________________________________________________
407Double_t AliAODVertex::RotatedCovMatrixYZ(Double_t phi, Double_t theta) const
408{
409 // YZ term of covariance matrix after rotation by phi around z-axis
410 // and, then, by theta around new y-axis
411
412 if (!fCovMatrix) {
413 //AliFatal("Covariance matrix not set");
414 return -999.;
415 }
416
417 Double_t covMatrix[6];
418
419 GetCovMatrix(covMatrix);
420
421 Double_t cp = TMath::Cos(phi);
422 Double_t sp = TMath::Sin(phi);
423 Double_t ct = TMath::Cos(theta);
424 Double_t st = TMath::Sin(theta);
425 return
426 covMatrix[0]*cp*sp*st // GetCovXX
427 +covMatrix[1]*st*(sp*sp-cp*cp) // GetCovXY
428 -covMatrix[3]*sp*ct // GetCovXZ
429 -covMatrix[2]*cp*sp*st // GetCovYY
430 +covMatrix[4]*cp*ct; // GetCovYZ
431}
432
433//______________________________________________________________________________
434Double_t AliAODVertex::RotatedCovMatrixZZ(Double_t phi, Double_t theta) const
435{
436 // ZZ term of covariance matrix after rotation by phi around z-axis
437 // and, then, by theta around new y-axis
438
439 if (!fCovMatrix) {
440 //AliFatal("Covariance matrix not set");
441 return -999.;
442 }
443
444 Double_t covMatrix[6];
445
446 GetCovMatrix(covMatrix);
447
448 Double_t cp = TMath::Cos(phi);
449 Double_t sp = TMath::Sin(phi);
450 Double_t ct = TMath::Cos(theta);
451 Double_t st = TMath::Sin(theta);
452 return
453 covMatrix[0]*cp*cp*st*st // GetCovXX
454 +covMatrix[1]*2.*cp*sp*st*st // GetCovXY
455 -covMatrix[3]*2.*cp*ct*st // GetCovXZ
456 +covMatrix[2]*sp*sp*st*st // GetCovYY
457 -covMatrix[4]*2.*sp*sp*ct*st // GetCovYZ
458 +covMatrix[5]*ct*ct; // GetCovZZ
459}
460
461//______________________________________________________________________________
462Double_t AliAODVertex::DistanceToVertex(AliAODVertex *vtx) const
463{
464 // distance in 3D to another AliAODVertex
465
466 Double_t dx = GetX()-vtx->GetX();
467 Double_t dy = GetY()-vtx->GetY();
468 Double_t dz = GetZ()-vtx->GetZ();
469
470 return TMath::Sqrt(dx*dx+dy*dy+dz*dz);
471}
472
473//______________________________________________________________________________
474Double_t AliAODVertex::DistanceXYToVertex(AliAODVertex *vtx) const
475{
476 // distance in XY to another AliAODVertex
477
478 Double_t dx = GetX()-vtx->GetX();
479 Double_t dy = GetY()-vtx->GetY();
480
481 return TMath::Sqrt(dx*dx+dy*dy);
482}
483
484//______________________________________________________________________________
485Double_t AliAODVertex::ErrorDistanceToVertex(AliAODVertex *vtx) const
486{
487 // error on the distance in 3D to another AliAODVertex
488
489 Double_t phi,theta;
490 PhiAndThetaToVertex(vtx,phi,theta);
491 // error2 due to this vertex
492 Double_t error2 = RotatedCovMatrixXX(phi,theta);
493 // error2 due to vtx vertex
494 Double_t error2vtx = vtx->RotatedCovMatrixXX(phi,theta);
495
496 return TMath::Sqrt(error2+error2vtx);
497}
498
499//______________________________________________________________________________
500Double_t AliAODVertex::ErrorDistanceXYToVertex(AliAODVertex *vtx) const
501{
502 // error on the distance in XY to another AliAODVertex
503
504 Double_t phi,theta;
505 PhiAndThetaToVertex(vtx,phi,theta);
506 // error2 due to this vertex
507 Double_t error2 = RotatedCovMatrixXX(phi);
508 // error2 due to vtx vertex
509 Double_t error2vtx = vtx->RotatedCovMatrixXX(phi);
510
511 return TMath::Sqrt(error2+error2vtx);
512}
513
514//______________________________________________________________________________
515template <class T, class P>
516void AliAODVertex::PhiAndThetaToVertex(AliAODVertex *vtx, P &phi, T &theta) const
517{
518 // rotation angles around z-axis (phi) and around new y-axis (theta)
519 // with which vtx is seen (used by RotatedCovMatrix... methods)
520
b1a9edc8 521 phi = TMath::Pi()+TMath::ATan2(-vtx->GetY()+GetY(),-vtx->GetX()+GetX());
df9db588 522 Double_t vtxxphi = vtx->GetX()*TMath::Cos(phi)+vtx->GetY()*TMath::Sin(phi);
523 Double_t xphi = GetX()*TMath::Cos(phi)+GetY()*TMath::Sin(phi);
524 theta = TMath::ATan2(vtx->GetZ()-GetZ(),vtxxphi-xphi);
525}
526
527//______________________________________________________________________________
528void AliAODVertex::PrintIndices() const
529{
530 // Print indices of particles originating form this vertex
531
532 TRefArrayIter iter(&fDaughters);
533 while (TObject *daugh = iter.Next()) {
f12d42ce 534 printf("Particle %p originates from this vertex.\n", static_cast<void*>(daugh));
df9db588 535 }
536}
537
538//______________________________________________________________________________
539void AliAODVertex::Print(Option_t* /*option*/) const
540{
541 // Print information of all data members
542
543 printf("Vertex position:\n");
544 printf(" x = %f\n", fPosition[0]);
545 printf(" y = %f\n", fPosition[1]);
546 printf(" z = %f\n", fPosition[2]);
f12d42ce 547 printf(" parent particle: %p\n", static_cast<void*>(fParent.GetObject()));
df9db588 548 printf(" origin of %d particles\n", fDaughters.GetEntriesFast());
549 printf(" vertex type %d\n", fType);
550
551 /*
552 if (fCovMatrix) {
553 printf("Covariance matrix:\n");
554 printf(" %12.10f %12.10f %12.10f\n %12.10f %12.10f %12.10f\n %12.10f %12.10f %12.10f\n",
555 fCovMatrix[0],
556 fCovMatrix[1],
557 fCovMatrix[3],
558 fCovMatrix[1],
559 fCovMatrix[2],
560 fCovMatrix[4],
561 fCovMatrix[3],
562 fCovMatrix[4],
563 fCovMatrix[5]);
564 } */
0657f082 565 printf(" Chi^2/NDF = %f\n", fChi2perNDF);
df9db588 566}
567