Corrected protection.
[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
222//______________________________________________________________________________
cfa5b70c 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
cfa5b70c 243//______________________________________________________________________________
df9db588 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
263//______________________________________________________________________________
0657f082 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
1c1c7167 269 TString vtitle = GetTitle();
270 if (!vtitle.Contains("VertexerTracks")) {
91bad62d 271 cont = fNContributors;
19d55689 272 } else {
273 for (Int_t iDaug = 0; iDaug < GetNDaughters(); iDaug++) {
8b5318b9 274 AliAODTrack* aodT = dynamic_cast<AliAODTrack*>(fDaughters.At(iDaug));
275 if (!aodT) continue;
276 if (aodT->GetUsedForPrimVtxFit()) cont++;
277 }
bee8cd19 278 // the constraint adds another DOF
279 if(vtitle.Contains("VertexerTracksWithConstraint"))cont++;
280 }
0657f082 281 return cont;
282}
283
284//______________________________________________________________________________
df9db588 285Bool_t AliAODVertex::HasDaughter(TObject *daughter) const
286{
287 // Checks if the given daughter (particle) is part of this vertex.
bca58dd7 288 if (!fProngs) {
289 TRefArrayIter iter(&fDaughters);
290 while (TObject *daugh = iter.Next()) {
291 if (daugh == daughter) return kTRUE;
292 }
293 return kFALSE;
294 } else {
295 Bool_t has = kFALSE;
5c2137c1 296 for (int i = 0; i < fNprong; i++) {
bca58dd7 297 if (fProngs[i].GetObject() == daughter) has = kTRUE;
298 }
299 return has;
300 }
df9db588 301}
302
303//______________________________________________________________________________
304Double_t AliAODVertex::RotatedCovMatrixXX(Double_t phi, Double_t theta) const
305{
306 // XX term of covariance matrix after rotation by phi around z-axis
307 // and, then, by theta around new y-axis
308
309 if (!fCovMatrix) {
310 //AliFatal("Covariance matrix not set");
311 return -999.;
312 }
313
314 Double_t covMatrix[6];
315
316 GetCovMatrix(covMatrix);
317
318 Double_t cp = TMath::Cos(phi);
319 Double_t sp = TMath::Sin(phi);
320 Double_t ct = TMath::Cos(theta);
321 Double_t st = TMath::Sin(theta);
322 return
323 covMatrix[0]*cp*cp*ct*ct // GetCovXX
324 +covMatrix[1]*2.*cp*sp*ct*ct // GetCovXY
325 +covMatrix[3]*2.*cp*ct*st // GetCovXZ
326 +covMatrix[2]*sp*sp*ct*ct // GetCovYY
327 +covMatrix[4]*2.*sp*ct*st // GetCovYZ
328 +covMatrix[5]*st*st; // GetCovZZ
329}
330
331//______________________________________________________________________________
332Double_t AliAODVertex::RotatedCovMatrixXY(Double_t phi, Double_t theta) const
333{
334 // XY term of covariance matrix after rotation by phi around z-axis
335 // and, then, by theta around new y-axis
336
337 if (!fCovMatrix) {
338 //AliFatal("Covariance matrix not set");
339 return -999.;
340 }
341
342 Double_t covMatrix[6];
343
344 GetCovMatrix(covMatrix);
345
346 Double_t cp = TMath::Cos(phi);
347 Double_t sp = TMath::Sin(phi);
348 Double_t ct = TMath::Cos(theta);
349 Double_t st = TMath::Sin(theta);
350 return
351 -covMatrix[0]*cp*sp*ct // GetCovXX
352 +covMatrix[1]*ct*(cp*cp-sp*sp) // GetCovXY
353 -covMatrix[3]*sp*st // GetCovXZ
354 +covMatrix[2]*cp*sp*ct // GetCovYY
355 +covMatrix[4]*cp*st; // GetCovYZ
356}
357
358//______________________________________________________________________________
359Double_t AliAODVertex::RotatedCovMatrixXZ(Double_t phi, Double_t theta) const
360{
361 // XZ term of covariance matrix after rotation by phi around z-axis
362 // and, then, by theta around new y-axis
363
364 if (!fCovMatrix) {
365 //AliFatal("Covariance matrix not set");
366 return -999.;
367 }
368
369 Double_t covMatrix[6];
370
371 GetCovMatrix(covMatrix);
372
373 Double_t cp = TMath::Cos(phi);
374 Double_t sp = TMath::Sin(phi);
375 Double_t ct = TMath::Cos(theta);
376 Double_t st = TMath::Sin(theta);
377 return
378 -covMatrix[0]*cp*cp*ct*st // GetCovXX
379 -covMatrix[1]*2.*cp*sp*ct*st // GetCovXY
380 +covMatrix[3]*cp*(ct*ct-st*st) // GetCovXZ
381 -covMatrix[2]*sp*sp*ct*st // GetCovYY
382 +covMatrix[4]*sp*(ct*ct-st*st) // GetCovYZ
383 +covMatrix[5]*ct*st; // GetCovZZ
384}
385
386//______________________________________________________________________________
387Double_t AliAODVertex::RotatedCovMatrixYY(Double_t phi) const
388{
389 // YY term of covariance matrix after rotation by phi around z-axis
390 // and, then, by theta around new y-axis
391
392 if (!fCovMatrix) {
393 //AliFatal("Covariance matrix not set");
394 return -999.;
395 }
396
397 Double_t covMatrix[6];
398
399 GetCovMatrix(covMatrix);
400
401 Double_t cp = TMath::Cos(phi);
402 Double_t sp = TMath::Sin(phi);
403 return
404 covMatrix[0]*sp*sp // GetCovXX
405 -covMatrix[1]*2.*cp*sp // GetCovXY
406 +covMatrix[2]*cp*cp; // GetCovYY
407}
408
409//______________________________________________________________________________
410Double_t AliAODVertex::RotatedCovMatrixYZ(Double_t phi, Double_t theta) const
411{
412 // YZ term of covariance matrix after rotation by phi around z-axis
413 // and, then, by theta around new y-axis
414
415 if (!fCovMatrix) {
416 //AliFatal("Covariance matrix not set");
417 return -999.;
418 }
419
420 Double_t covMatrix[6];
421
422 GetCovMatrix(covMatrix);
423
424 Double_t cp = TMath::Cos(phi);
425 Double_t sp = TMath::Sin(phi);
426 Double_t ct = TMath::Cos(theta);
427 Double_t st = TMath::Sin(theta);
428 return
429 covMatrix[0]*cp*sp*st // GetCovXX
430 +covMatrix[1]*st*(sp*sp-cp*cp) // GetCovXY
431 -covMatrix[3]*sp*ct // GetCovXZ
432 -covMatrix[2]*cp*sp*st // GetCovYY
433 +covMatrix[4]*cp*ct; // GetCovYZ
434}
435
436//______________________________________________________________________________
437Double_t AliAODVertex::RotatedCovMatrixZZ(Double_t phi, Double_t theta) const
438{
439 // ZZ term of covariance matrix after rotation by phi around z-axis
440 // and, then, by theta around new y-axis
441
442 if (!fCovMatrix) {
443 //AliFatal("Covariance matrix not set");
444 return -999.;
445 }
446
447 Double_t covMatrix[6];
448
449 GetCovMatrix(covMatrix);
450
451 Double_t cp = TMath::Cos(phi);
452 Double_t sp = TMath::Sin(phi);
453 Double_t ct = TMath::Cos(theta);
454 Double_t st = TMath::Sin(theta);
455 return
456 covMatrix[0]*cp*cp*st*st // GetCovXX
457 +covMatrix[1]*2.*cp*sp*st*st // GetCovXY
458 -covMatrix[3]*2.*cp*ct*st // GetCovXZ
459 +covMatrix[2]*sp*sp*st*st // GetCovYY
460 -covMatrix[4]*2.*sp*sp*ct*st // GetCovYZ
461 +covMatrix[5]*ct*ct; // GetCovZZ
462}
463
464//______________________________________________________________________________
465Double_t AliAODVertex::DistanceToVertex(AliAODVertex *vtx) const
466{
467 // distance in 3D to another AliAODVertex
468
469 Double_t dx = GetX()-vtx->GetX();
470 Double_t dy = GetY()-vtx->GetY();
471 Double_t dz = GetZ()-vtx->GetZ();
472
473 return TMath::Sqrt(dx*dx+dy*dy+dz*dz);
474}
475
476//______________________________________________________________________________
477Double_t AliAODVertex::DistanceXYToVertex(AliAODVertex *vtx) const
478{
479 // distance in XY to another AliAODVertex
480
481 Double_t dx = GetX()-vtx->GetX();
482 Double_t dy = GetY()-vtx->GetY();
483
484 return TMath::Sqrt(dx*dx+dy*dy);
485}
486
487//______________________________________________________________________________
488Double_t AliAODVertex::ErrorDistanceToVertex(AliAODVertex *vtx) const
489{
490 // error on the distance in 3D to another AliAODVertex
491
492 Double_t phi,theta;
493 PhiAndThetaToVertex(vtx,phi,theta);
494 // error2 due to this vertex
495 Double_t error2 = RotatedCovMatrixXX(phi,theta);
496 // error2 due to vtx vertex
497 Double_t error2vtx = vtx->RotatedCovMatrixXX(phi,theta);
498
499 return TMath::Sqrt(error2+error2vtx);
500}
501
502//______________________________________________________________________________
503Double_t AliAODVertex::ErrorDistanceXYToVertex(AliAODVertex *vtx) const
504{
505 // error on the distance in XY to another AliAODVertex
506
507 Double_t phi,theta;
508 PhiAndThetaToVertex(vtx,phi,theta);
509 // error2 due to this vertex
510 Double_t error2 = RotatedCovMatrixXX(phi);
511 // error2 due to vtx vertex
512 Double_t error2vtx = vtx->RotatedCovMatrixXX(phi);
513
514 return TMath::Sqrt(error2+error2vtx);
515}
516
517//______________________________________________________________________________
518template <class T, class P>
519void AliAODVertex::PhiAndThetaToVertex(AliAODVertex *vtx, P &phi, T &theta) const
520{
521 // rotation angles around z-axis (phi) and around new y-axis (theta)
522 // with which vtx is seen (used by RotatedCovMatrix... methods)
523
b1a9edc8 524 phi = TMath::Pi()+TMath::ATan2(-vtx->GetY()+GetY(),-vtx->GetX()+GetX());
df9db588 525 Double_t vtxxphi = vtx->GetX()*TMath::Cos(phi)+vtx->GetY()*TMath::Sin(phi);
526 Double_t xphi = GetX()*TMath::Cos(phi)+GetY()*TMath::Sin(phi);
527 theta = TMath::ATan2(vtx->GetZ()-GetZ(),vtxxphi-xphi);
528}
529
530//______________________________________________________________________________
531void AliAODVertex::PrintIndices() const
532{
533 // Print indices of particles originating form this vertex
534
535 TRefArrayIter iter(&fDaughters);
536 while (TObject *daugh = iter.Next()) {
f12d42ce 537 printf("Particle %p originates from this vertex.\n", static_cast<void*>(daugh));
df9db588 538 }
539}
540
541//______________________________________________________________________________
542void AliAODVertex::Print(Option_t* /*option*/) const
543{
544 // Print information of all data members
545
546 printf("Vertex position:\n");
547 printf(" x = %f\n", fPosition[0]);
548 printf(" y = %f\n", fPosition[1]);
549 printf(" z = %f\n", fPosition[2]);
f12d42ce 550 printf(" parent particle: %p\n", static_cast<void*>(fParent.GetObject()));
df9db588 551 printf(" origin of %d particles\n", fDaughters.GetEntriesFast());
552 printf(" vertex type %d\n", fType);
553
554 /*
555 if (fCovMatrix) {
556 printf("Covariance matrix:\n");
557 printf(" %12.10f %12.10f %12.10f\n %12.10f %12.10f %12.10f\n %12.10f %12.10f %12.10f\n",
558 fCovMatrix[0],
559 fCovMatrix[1],
560 fCovMatrix[3],
561 fCovMatrix[1],
562 fCovMatrix[2],
563 fCovMatrix[4],
564 fCovMatrix[3],
565 fCovMatrix[4],
566 fCovMatrix[5]);
567 } */
0657f082 568 printf(" Chi^2/NDF = %f\n", fChi2perNDF);
df9db588 569}
570