]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AOD/AliAODVertex.cxx
Update master to aliroot
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODVertex.cxx
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
23 //     Inheritance from AliVVertex: A. Dainese
24 //-------------------------------------------------------------------------
25
26 #include "AliAODVertex.h"
27 #include "AliAODTrack.h"
28
29 ClassImp(AliAODVertex)
30
31 //______________________________________________________________________________
32 AliAODVertex::AliAODVertex() : 
33   AliVVertex(),
34   fChi2perNDF(-999.),
35   fID(-1),
36   fBCID(AliVTrack::kTOFBCNA),
37   fType(kUndef),
38   fNprong(0),
39   fIprong(0),
40   fNContributors(0),
41   fCovMatrix(NULL),
42   fParent(),
43   fDaughters(),
44   fProngs(NULL)
45   {
46   // default constructor
47
48   fPosition[0] = fPosition[1] = fPosition[2] = -999.;
49 }
50
51 //______________________________________________________________________________
52 AliAODVertex::AliAODVertex(const Double_t position[3], 
53                            const Double_t covMatrix[6],
54                            Double_t  chi2perNDF,
55                            TObject  *parent,
56                            Short_t id,
57                            Char_t vtype, 
58                            Int_t  nprong) :
59   AliVVertex(),
60   fChi2perNDF(chi2perNDF),
61   fID(id),
62   fBCID(AliVTrack::kTOFBCNA),
63   fType(vtype),
64   fNprong(nprong),
65   fIprong(0),
66   fNContributors(0),
67   fCovMatrix(NULL),
68   fParent(parent),
69   fDaughters(),
70   fProngs(0)
71 {
72   // constructor
73
74   SetPosition(position);
75   if (covMatrix) SetCovMatrix(covMatrix);
76   MakeProngs();
77 }
78
79 //______________________________________________________________________________
80 AliAODVertex::AliAODVertex(const Float_t position[3], 
81                            const Float_t  covMatrix[6],
82                            Double_t  chi2perNDF,
83                            TObject  *parent,
84                            Short_t id,
85                            Char_t vtype,
86                            Int_t nprong) :
87
88   AliVVertex(),
89   fChi2perNDF(chi2perNDF),
90   fID(id),
91   fBCID(AliVTrack::kTOFBCNA),
92   fType(vtype),
93   fNprong(nprong),
94   fIprong(0),
95   fNContributors(0),
96   fCovMatrix(NULL),
97   fParent(parent),
98   fDaughters(),
99   fProngs(0)
100 {
101   // constructor
102
103   SetPosition(position);
104   if (covMatrix) SetCovMatrix(covMatrix);
105   MakeProngs();
106 }
107
108 //______________________________________________________________________________
109 AliAODVertex::AliAODVertex(const Double_t position[3], 
110                            Double_t  chi2perNDF,
111                            Char_t vtype, 
112                            Int_t nprong) :
113   AliVVertex(),
114   fChi2perNDF(chi2perNDF),
115   fID(-1),
116   fBCID(AliVTrack::kTOFBCNA),
117   fType(vtype),
118   fNprong(nprong),
119   fIprong(0),
120   fNContributors(0),
121   fCovMatrix(NULL),
122   fParent(),
123   fDaughters(),
124   fProngs(0)
125 {
126   // constructor without covariance matrix
127
128   SetPosition(position);  
129   MakeProngs();
130 }
131
132 //______________________________________________________________________________
133 AliAODVertex::AliAODVertex(const Float_t position[3], 
134                            Double_t  chi2perNDF,
135                            Char_t vtype, Int_t nprong) :
136   AliVVertex(),
137   fChi2perNDF(chi2perNDF),
138   fID(-1),
139   fBCID(AliVTrack::kTOFBCNA),
140   fType(vtype),
141   fNprong(nprong),
142   fIprong(0),
143   fNContributors(0),
144   fCovMatrix(NULL),
145   fParent(),
146   fDaughters(),
147   fProngs(0)
148 {
149   // constructor without covariance matrix
150
151   SetPosition(position);  
152   MakeProngs();
153 }
154
155 //______________________________________________________________________________
156 AliAODVertex::~AliAODVertex() 
157 {
158   // Destructor
159
160   delete fCovMatrix;
161   if (fNprong > 0) delete[] fProngs;
162 }
163
164 //______________________________________________________________________________
165 AliAODVertex::AliAODVertex(const AliAODVertex& vtx) :
166   AliVVertex(vtx),
167   fChi2perNDF(vtx.fChi2perNDF),
168   fID(vtx.fID),
169   fBCID(vtx.fBCID),
170   fType(vtx.fType),
171   fNprong(vtx.fNprong),
172   fIprong(vtx.fIprong),
173   fNContributors(vtx.fNContributors),
174   fCovMatrix(NULL),
175   fParent(vtx.fParent),
176   fDaughters(vtx.fDaughters),
177   fProngs(0)
178 {
179   // Copy constructor.
180   
181   for (int i = 0; i < 3; i++) 
182     fPosition[i] = vtx.fPosition[i];
183
184   if (vtx.fCovMatrix) fCovMatrix=new AliAODRedCov<3>(*vtx.fCovMatrix);
185   MakeProngs();
186   for (int i = 0; i < fNprong; i++) {
187       fProngs[i] = vtx.fProngs[i];
188   }
189 }
190
191 //______________________________________________________________________________
192 AliAODVertex* AliAODVertex::CloneWithoutRefs() const
193 {
194   // Special method to copy all but the refs 
195   
196   Double_t cov[6] = { 0.0 };
197       
198   if (fCovMatrix) fCovMatrix->GetCovMatrix(cov);
199   
200   AliAODVertex* v = new AliAODVertex(fPosition,
201                                      cov,
202                                      fChi2perNDF,
203                                      0x0,
204                                      fID,
205                                      fType,
206                                      0);
207   
208   v->SetName(GetName());
209   // NOTE title is not allowed to be set, as GetNContributors 
210   // relies on the title to use the references which are not copied here
211   
212   // to insure the main vertex retains the ncontributors information
213   // (which is otherwise computed dynamically from
214   // references to tracks, which is not kept in the returned object)
215   // we set it here
216   v->SetNContributors(fNContributors);  
217   
218   return v;
219 }
220
221 //______________________________________________________________________________
222 AliAODVertex& AliAODVertex::operator=(const AliAODVertex& vtx) 
223 {
224   // Assignment operator
225   if (this != &vtx) {
226
227     // name and type
228     AliVVertex::operator=(vtx);
229
230     //momentum
231     for (int i = 0; i < 3; i++) 
232         fPosition[i] = vtx.fPosition[i];
233     
234     fChi2perNDF = vtx.fChi2perNDF;
235     fID   = vtx.fID;
236     fType = vtx.fType;
237     fBCID = vtx.fBCID;
238     
239     //covariance matrix
240     delete fCovMatrix;
241     fCovMatrix = NULL;   
242     if (vtx.fCovMatrix) fCovMatrix = new AliAODRedCov<3>(*vtx.fCovMatrix);
243     
244     //other stuff
245     fNContributors = vtx.fNContributors;
246     fParent        = vtx.fParent;
247     fDaughters     = vtx.fDaughters;
248     fNprong        = vtx.fNprong;
249     fIprong        = vtx.fIprong;  
250     
251     MakeProngs();
252     for (int i = 0; i < fNprong; i++) {
253         fProngs[i] = vtx.fProngs[i];
254     }
255   }
256   
257   return *this;
258 }
259
260 //______________________________________________________________________________
261 void AliAODVertex::AddDaughter(TObject *daughter)
262 {
263   // Add reference to daughter track
264     if (!fProngs) {
265         if (fDaughters.GetEntries()==0) {
266             TRefArray* arr = &fDaughters;
267             new(arr)TRefArray(TProcessID::GetProcessWithUID(daughter));         
268         }
269         fDaughters.Add(daughter);       
270     } else {
271         if (fIprong < fNprong) {
272             fProngs[fIprong++] = daughter;
273         } else {
274             AliWarning("Number of daughters out of range !\n");
275         }
276     }
277   return;
278 }
279
280
281 //______________________________________________________________________________
282 template <class T> void AliAODVertex::GetSigmaXYZ(T sigma[3]) const
283 {
284   // Return errors on vertex position in thrust frame
285   
286   if(fCovMatrix) {
287     sigma[0]=fCovMatrix[3]; //GetCovXZ
288     sigma[1]=fCovMatrix[4]; //GetCovYZ
289     sigma[2]=fCovMatrix[5]; //GetCovZZ
290   } else 
291     sigma[0]=sigma[1]=sigma[2]=-999.;
292
293   /*
294   for (int i = 0, j = 6; i < 3; i++) {
295     j -= i+1;
296     sigma[2-i] = fCovMatrix ? TMath::Sqrt(fCovMatrix[j]) : -999.;
297   }
298   */
299 }
300
301 //______________________________________________________________________________
302 Int_t AliAODVertex::GetNContributors() const 
303 {
304   // Returns the number of tracks used to fit this vertex.
305   Int_t cont  = 0;
306
307   TString vtitle = GetTitle();
308   if (!vtitle.Contains("VertexerTracks") || vtitle.Contains("TracksNoConstraint") || fType==kPileupTracks
309       ) {
310     cont = fNContributors;
311   } else {
312     for (Int_t iDaug = 0; iDaug < GetNDaughters(); iDaug++) {
313         AliAODTrack* aodT = dynamic_cast<AliAODTrack*>(fDaughters.At(iDaug));
314         if (!aodT) continue;
315         if (aodT->GetUsedForPrimVtxFit()) cont++;
316     } 
317     // the constraint adds another DOF
318     if(vtitle.Contains("VertexerTracksWithConstraint"))cont++;
319   }
320   return cont;
321 }
322
323 //______________________________________________________________________________
324 Bool_t AliAODVertex::HasDaughter(TObject *daughter) const 
325 {
326   // Checks if the given daughter (particle) is part of this vertex.
327     if (!fProngs) {
328         TRefArrayIter iter(&fDaughters);
329         while (TObject *daugh = iter.Next()) {
330             if (daugh == daughter) return kTRUE;
331         }
332         return kFALSE;
333     } else {
334         Bool_t has = kFALSE;
335         for (int i = 0; i < fNprong; i++) {
336             if (fProngs[i].GetObject() == daughter) has = kTRUE;
337         }
338         return has;
339     }
340 }
341
342 //______________________________________________________________________________
343 Double_t AliAODVertex::RotatedCovMatrixXX(Double_t phi, Double_t theta) const
344 {
345   // XX term of covariance matrix after rotation by phi around z-axis
346   // and, then, by theta around new y-axis
347
348   if (!fCovMatrix) {
349     //AliFatal("Covariance matrix not set");
350     return -999.;
351   }
352
353   Double_t covMatrix[6];
354
355   GetCovMatrix(covMatrix);
356
357   Double_t cp = TMath::Cos(phi);
358   Double_t sp = TMath::Sin(phi);
359   Double_t ct = TMath::Cos(theta);
360   Double_t st = TMath::Sin(theta);
361   return
362      covMatrix[0]*cp*cp*ct*ct  // GetCovXX
363     +covMatrix[1]*2.*cp*sp*ct*ct  // GetCovXY
364     +covMatrix[3]*2.*cp*ct*st  // GetCovXZ
365     +covMatrix[2]*sp*sp*ct*ct  // GetCovYY
366     +covMatrix[4]*2.*sp*ct*st  // GetCovYZ
367     +covMatrix[5]*st*st;  // GetCovZZ
368 }
369
370 //______________________________________________________________________________
371 Double_t AliAODVertex::RotatedCovMatrixXY(Double_t phi, Double_t theta) const
372 {
373   // XY term of covariance matrix after rotation by phi around z-axis
374   // and, then, by theta around new y-axis
375
376   if (!fCovMatrix) {
377     //AliFatal("Covariance matrix not set");
378     return -999.;
379   }
380
381   Double_t covMatrix[6];
382
383   GetCovMatrix(covMatrix);
384
385   Double_t cp = TMath::Cos(phi);
386   Double_t sp = TMath::Sin(phi);
387   Double_t ct = TMath::Cos(theta);
388   Double_t st = TMath::Sin(theta);
389   return 
390     -covMatrix[0]*cp*sp*ct  // GetCovXX
391     +covMatrix[1]*ct*(cp*cp-sp*sp)  // GetCovXY
392     -covMatrix[3]*sp*st  // GetCovXZ
393     +covMatrix[2]*cp*sp*ct  // GetCovYY
394     +covMatrix[4]*cp*st;  // GetCovYZ
395 }
396
397 //______________________________________________________________________________
398 Double_t AliAODVertex::RotatedCovMatrixXZ(Double_t phi, Double_t theta) const
399 {
400   // XZ term of covariance matrix after rotation by phi around z-axis
401   // and, then, by theta around new y-axis
402
403   if (!fCovMatrix) {
404     //AliFatal("Covariance matrix not set");
405     return -999.;
406   }
407
408   Double_t covMatrix[6];
409
410   GetCovMatrix(covMatrix);
411
412   Double_t cp = TMath::Cos(phi);
413   Double_t sp = TMath::Sin(phi);
414   Double_t ct = TMath::Cos(theta);
415   Double_t st = TMath::Sin(theta);
416   return 
417     -covMatrix[0]*cp*cp*ct*st  // GetCovXX
418     -covMatrix[1]*2.*cp*sp*ct*st  // GetCovXY
419     +covMatrix[3]*cp*(ct*ct-st*st)  // GetCovXZ
420     -covMatrix[2]*sp*sp*ct*st  // GetCovYY
421     +covMatrix[4]*sp*(ct*ct-st*st)  // GetCovYZ
422     +covMatrix[5]*ct*st;  // GetCovZZ
423 }
424
425 //______________________________________________________________________________
426 Double_t AliAODVertex::RotatedCovMatrixYY(Double_t phi) const
427 {
428   // YY term of covariance matrix after rotation by phi around z-axis
429   // and, then, by theta around new y-axis
430
431   if (!fCovMatrix) {
432     //AliFatal("Covariance matrix not set");
433     return -999.;
434   }
435
436   Double_t covMatrix[6];
437
438   GetCovMatrix(covMatrix);
439
440   Double_t cp = TMath::Cos(phi);
441   Double_t sp = TMath::Sin(phi);
442   return
443      covMatrix[0]*sp*sp  // GetCovXX
444     -covMatrix[1]*2.*cp*sp  // GetCovXY
445     +covMatrix[2]*cp*cp;  // GetCovYY
446 }
447
448 //______________________________________________________________________________
449 Double_t AliAODVertex::RotatedCovMatrixYZ(Double_t phi, Double_t theta) const
450 {
451   // YZ term of covariance matrix after rotation by phi around z-axis
452   // and, then, by theta around new y-axis
453
454   if (!fCovMatrix) {
455     //AliFatal("Covariance matrix not set");
456     return -999.;
457   }
458
459   Double_t covMatrix[6];
460
461   GetCovMatrix(covMatrix);
462
463   Double_t cp = TMath::Cos(phi);
464   Double_t sp = TMath::Sin(phi);
465   Double_t ct = TMath::Cos(theta);
466   Double_t st = TMath::Sin(theta);
467   return 
468      covMatrix[0]*cp*sp*st  // GetCovXX
469     +covMatrix[1]*st*(sp*sp-cp*cp)  // GetCovXY
470     -covMatrix[3]*sp*ct  // GetCovXZ
471     -covMatrix[2]*cp*sp*st  // GetCovYY
472     +covMatrix[4]*cp*ct;  // GetCovYZ
473 }
474
475 //______________________________________________________________________________
476 Double_t AliAODVertex::RotatedCovMatrixZZ(Double_t phi, Double_t theta) const
477 {
478   // ZZ term of covariance matrix after rotation by phi around z-axis
479   // and, then, by theta around new y-axis
480
481   if (!fCovMatrix) {
482     //AliFatal("Covariance matrix not set");
483     return -999.;
484   }
485
486   Double_t covMatrix[6];
487
488   GetCovMatrix(covMatrix);
489
490   Double_t cp = TMath::Cos(phi);
491   Double_t sp = TMath::Sin(phi);
492   Double_t ct = TMath::Cos(theta);
493   Double_t st = TMath::Sin(theta);
494   return
495      covMatrix[0]*cp*cp*st*st  // GetCovXX
496     +covMatrix[1]*2.*cp*sp*st*st  // GetCovXY
497     -covMatrix[3]*2.*cp*ct*st  // GetCovXZ
498     +covMatrix[2]*sp*sp*st*st  // GetCovYY
499     -covMatrix[4]*2.*sp*sp*ct*st  // GetCovYZ
500     +covMatrix[5]*ct*ct;  // GetCovZZ
501 }
502
503 //______________________________________________________________________________
504 Double_t AliAODVertex::Distance2ToVertex(const AliAODVertex *vtx) const
505 {
506   // distance in 3D to another AliAODVertex
507
508   Double_t dx = GetX()-vtx->GetX();
509   Double_t dy = GetY()-vtx->GetY();
510   Double_t dz = GetZ()-vtx->GetZ();
511
512   return dx*dx+dy*dy+dz*dz;
513 }
514
515 //______________________________________________________________________________
516 Double_t AliAODVertex::DistanceXY2ToVertex(const AliAODVertex *vtx) const
517 {
518   // distance in XY to another AliAODVertex
519
520   Double_t dx = GetX()-vtx->GetX();
521   Double_t dy = GetY()-vtx->GetY();
522
523   return dx*dx+dy*dy;
524 }
525
526 //______________________________________________________________________________
527 Double_t AliAODVertex::Error2DistanceToVertex(AliAODVertex *vtx) const
528 {
529   // error on the distance in 3D to another AliAODVertex
530
531   Double_t phi,theta;
532   PhiAndThetaToVertex(vtx,phi,theta);
533   // error2 due to this vertex
534   Double_t error2 = RotatedCovMatrixXX(phi,theta);
535   // error2 due to vtx vertex
536   Double_t error2vtx = vtx->RotatedCovMatrixXX(phi,theta);
537
538   return error2+error2vtx;
539 }
540
541 //______________________________________________________________________________
542 Double_t AliAODVertex::Error2DistanceXYToVertex(AliAODVertex *vtx) const
543 {
544   // error on the distance in XY to another AliAODVertex
545
546   Double_t phi,theta;
547   PhiAndThetaToVertex(vtx,phi,theta);
548   // error2 due to this vertex
549   Double_t error2 = RotatedCovMatrixXX(phi);
550   // error2 due to vtx vertex
551   Double_t error2vtx = vtx->RotatedCovMatrixXX(phi);
552
553   return error2+error2vtx;
554 }
555
556 //______________________________________________________________________________
557 template <class T, class P> 
558 void AliAODVertex::PhiAndThetaToVertex(AliAODVertex *vtx, P &phi, T &theta) const
559 {
560   // rotation angles around z-axis (phi) and around new y-axis (theta)
561   // with which vtx is seen (used by RotatedCovMatrix... methods)
562
563   phi = TMath::Pi()+TMath::ATan2(-vtx->GetY()+GetY(),-vtx->GetX()+GetX());
564   Double_t vtxxphi = vtx->GetX()*TMath::Cos(phi)+vtx->GetY()*TMath::Sin(phi);
565   Double_t xphi = GetX()*TMath::Cos(phi)+GetY()*TMath::Sin(phi);
566   theta = TMath::ATan2(vtx->GetZ()-GetZ(),vtxxphi-xphi);
567 }
568
569 //______________________________________________________________________________
570 void AliAODVertex::PrintIndices() const 
571 {
572   // Print indices of particles originating form this vertex
573
574   TRefArrayIter iter(&fDaughters);
575   while (TObject *daugh = iter.Next()) {
576     printf("Particle %p originates from this vertex.\n", static_cast<void*>(daugh));
577   }
578 }
579
580 //______________________________________________________________________________
581 const char* AliAODVertex::AsString() const
582 {
583   // Make a string describing this object
584   
585   TString tmp(Form("%10s pos(%7.2f,%7.2f,%7.2f)",GetTypeName((AODVtx_t)GetType()),GetX(),GetY(),GetZ()));
586   
587   if (GetType()==kPrimary || GetType()==kMainSPD || GetType()==kPileupSPD )
588   {
589     tmp += Form(" ncontrib %d chi2/ndf %4.1f",GetNContributors(),GetChi2perNDF());
590
591   }
592   
593   if ( !fParent.GetObject() ) 
594   {
595     tmp += " no parent";
596   }
597   if ( fDaughters.GetEntriesFast() > 0 )
598   {
599     if ( fDaughters.GetEntriesFast() == 1 ) 
600     {
601       tmp += " origin of 1 particle";
602     }
603     else
604     {
605       tmp += Form(" origin of %2d particles",fDaughters.GetEntriesFast());
606     }
607   }
608   
609   return tmp.Data();
610 }
611
612 //______________________________________________________________________________
613 const char* AliAODVertex::GetTypeName(AODVtx_t type)
614 {
615   // Return an ASCII version of type
616   
617   switch (type)
618   {
619     case kPrimary:
620       return "primary";
621       break;
622     case kKink:
623       return "kink";
624       break;
625     case kV0:
626       return "v0";
627       break;
628     case kCascade:
629       return "cascade";
630       break;
631     case kMainSPD:
632       return "mainSPD";
633       break;
634     case kPileupSPD:
635       return "pileupSPD";
636       break;
637     case kPileupTracks:
638       return "pileupTRK";
639       break;
640     case kMainTPC:
641       return "mainTPC";
642       break;
643     default:
644       return "unknown";
645       break;
646   };
647 }
648
649 //______________________________________________________________________________
650 void AliAODVertex::Print(Option_t* /*option*/) const 
651 {
652   // Print information of all data members
653
654   printf("Vertex position:\n");
655   printf("     x = %f\n", fPosition[0]);
656   printf("     y = %f\n", fPosition[1]);
657   printf("     z = %f\n", fPosition[2]);
658   printf(" parent particle: %p\n", static_cast<void*>(fParent.GetObject()));
659   printf(" origin of %d particles\n", fDaughters.GetEntriesFast());
660   printf(" vertex type %d\n", fType);
661   
662   /*
663   if (fCovMatrix) {
664     printf("Covariance matrix:\n");
665     printf(" %12.10f  %12.10f  %12.10f\n %12.10f  %12.10f  %12.10f\n %12.10f  %12.10f  %12.10f\n", 
666            fCovMatrix[0],
667            fCovMatrix[1],
668            fCovMatrix[3],
669            fCovMatrix[1],
670            fCovMatrix[2],
671            fCovMatrix[4],
672            fCovMatrix[3],
673            fCovMatrix[4],
674            fCovMatrix[5]); 
675            } */
676   printf(" Chi^2/NDF = %f\n", fChi2perNDF);
677 }
678