]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliAODVertex.h
Bug #56211: Storing the reco event specie in the ESD.
[u/mrichter/AliRoot.git] / STEER / AliAODVertex.h
1 #ifndef AliAODVertex_H
2 #define AliAODVertex_H
3 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 //-------------------------------------------------------------------------
9 //     AOD vertex base class
10 //     Author: Markus Oldenburg, CERN
11 //     Inheritance from AliVVertex: A. Dainese
12 //-------------------------------------------------------------------------
13
14 #include <TRef.h>
15 #include <TRefArray.h>
16 #include <TMath.h>
17
18 #include "AliVVertex.h"
19 #include "AliAODRedCov.h"
20 #include "AliLog.h"
21
22 class AliAODVertex : public AliVVertex {
23
24  public :
25
26   enum AODVtx_t {kUndef=-1, kPrimary, kKink, kV0, kCascade, kMulti};
27
28   AliAODVertex();
29   AliAODVertex(const Double_t *position, 
30                const Double_t *covMatrix=0x0,
31                Double_t chi2perNDF = -999.,
32                TObject *parent = 0x0,
33                Short_t id=-1,
34                Char_t vtype=kUndef,
35                Int_t nprong = 0);
36   AliAODVertex(const Float_t *position, 
37                const Float_t *covMatrix=0x0,
38                Double_t chi2perNDF = -999.,
39                TObject *parent = 0x0,
40                Short_t id=-1,
41                Char_t vtype=kUndef,
42                Int_t nprong = 0);
43     AliAODVertex(const Double_t *position, 
44                  Double_t chi2perNDF,
45                  Char_t vtype=kUndef,
46                  Int_t nprong = 0);
47     AliAODVertex(const Float_t *position, 
48                  Double_t chi2perNDF,
49                  Char_t vtype=kUndef,
50                  Int_t nprong = 0);
51
52   virtual ~AliAODVertex();
53   AliAODVertex(const AliAODVertex& vtx); 
54   AliAODVertex& operator=(const AliAODVertex& vtx);
55
56   void     SetX(Double_t x) { fPosition[0] = x; }
57   void     SetY(Double_t y) { fPosition[1] = y; }
58   void     SetZ(Double_t z) { fPosition[2] = z; }
59   void     SetPosition(Double_t x, Double_t y, Double_t z) { fPosition[0] = x; fPosition[1] = y; fPosition[2] = z; }
60   template <class T> void SetPosition(T *pos)
61     { fPosition[0] = pos[0]; fPosition[1] = pos[1]; fPosition[2] = pos[2]; }
62
63   void     SetChi2perNDF(Double_t chi2perNDF) { fChi2perNDF = chi2perNDF; }
64
65   void     SetParent(TObject *parent) { fParent = parent; }
66
67   Double_t GetX() const { return fPosition[0]; }
68   Double_t GetY() const { return fPosition[1]; }
69   Double_t GetZ() const { return fPosition[2]; }
70   void     GetXYZ(Double_t position[3]) const 
71     {position[0]=fPosition[0]; position[1]=fPosition[1]; position[2]=fPosition[2];}
72   template <class T> void GetPosition(T *pos) const
73     {pos[0]=fPosition[0]; pos[1]=fPosition[1]; pos[2]=fPosition[2];}
74
75   template <class T> void SetCovMatrix(const T *covMatrix) {
76     if(!fCovMatrix) fCovMatrix=new AliAODRedCov<3>();
77     fCovMatrix->SetCovMatrix(covMatrix);}
78
79   template <class T> Bool_t GetCovMatrix(T *covMatrix) const {
80     if(!fCovMatrix) return kFALSE;
81     fCovMatrix->GetCovMatrix(covMatrix); return kTRUE;}
82
83   void GetCovarianceMatrix(Double_t covmatrix[6]) const 
84                     {GetCovMatrix(covmatrix);}
85   void RemoveCovMatrix() {delete fCovMatrix; fCovMatrix=NULL;}
86
87   template <class T> void     GetSigmaXYZ(T *sigma) const;
88
89   Double_t GetChi2perNDF() const { return fChi2perNDF; }
90   Double_t GetChi2() const { return fChi2perNDF*(Double_t)GetNDF(); }
91   Int_t    GetNDF() const { return 2*GetNContributors()-3; }
92
93   Short_t  GetID() const { return fID; }
94   void     SetID(Short_t id) { fID=id; }
95
96   Char_t   GetType() const { return fType; }
97   void     SetType(AODVtx_t vtype) { fType=vtype; }
98
99   TObject* GetParent() const   { return fParent.GetObject(); }
100   Bool_t   HasParent(TObject *parent) const { return (fParent.GetObject() == parent) ? kTRUE : kFALSE; }
101
102   void     AddDaughter(TObject *daughter);
103   void     RemoveDaughter(TObject *daughter) { fDaughters.Remove(daughter); }
104   void     RemoveDaughters() { fDaughters.Clear(); if(fProngs) {delete [] fProngs; fProngs=0; MakeProngs(); fIprong=0;} }
105   TObject* GetDaughter(Int_t i); 
106   Bool_t   HasDaughter(TObject *daughter) const;
107   Int_t    GetNDaughters() const;
108   Int_t    GetNContributors() const;
109   void     SetNProngs(Int_t nprong) {
110       fNprong = nprong;
111       MakeProngs();
112   }
113   // covariance matrix elements after rotation by phi around z-axis 
114   // and, then, by theta around new y-axis
115   Double_t  RotatedCovMatrixXX(Double_t phi = 0., Double_t theta = 0.) const;
116   Double_t  RotatedCovMatrixXY(Double_t phi = 0., Double_t theta = 0.) const;
117   Double_t  RotatedCovMatrixYY(Double_t phi = 0.) const;
118   Double_t  RotatedCovMatrixXZ(Double_t phi = 0., Double_t theta = 0.) const;
119   Double_t  RotatedCovMatrixYZ(Double_t phi = 0., Double_t theta = 0.) const;
120   Double_t  RotatedCovMatrixZZ(Double_t phi = 0., Double_t theta = 0.) const;
121
122   template <class T, class P> void     PhiAndThetaToVertex(AliAODVertex *vtx, P &phi, T &theta) const;
123   Double_t  DistanceToVertex(AliAODVertex *vtx) const;
124   Double_t  ErrorDistanceToVertex(AliAODVertex *vtx) const;
125   Double_t  DistanceXYToVertex(AliAODVertex *vtx) const;
126   Double_t  ErrorDistanceXYToVertex(AliAODVertex *vtx) const;
127   
128   void     PrintIndices() const;
129   void     Print(Option_t* option = "") const;
130   private:
131   void     MakeProngs() {if (fNprong > 0) {fProngs = new TRef[fNprong]; fIprong=0;}}
132           
133  private:
134
135   Double32_t      fPosition[3]; // vertex position
136   Double32_t      fChi2perNDF;  // chi2/NDF of vertex fit
137   Short_t         fID;          // vertex ID; corresponds to the array index of the appropriate ESD container
138   Char_t          fType;        // vertex type
139   Int_t           fNprong;      // number of prongs
140   Int_t           fIprong;      //!index  of prong
141   AliAODRedCov<3> *fCovMatrix;  // vertex covariance matrix; values of and below the diagonal
142   TRef            fParent;      // reference to the parent particle
143   TRefArray       fDaughters;   // references to the daughter particles
144   TRef            *fProngs;     //[fNprong] alternative daughters for n-prong vertex
145   
146   ClassDef(AliAODVertex, 5);
147 };
148
149 inline  Int_t AliAODVertex::GetNDaughters() const
150 {
151     if (!fProngs) {
152         return fDaughters.GetEntriesFast();
153     } else {
154         return fNprong;
155     }
156 }
157
158 inline TObject* AliAODVertex::GetDaughter(Int_t i)
159 {
160     if (!fProngs) {
161         return fDaughters.At(i);
162     } else {
163         if (i < fNprong) {
164             return fProngs[i].GetObject();
165         } else {
166             AliWarning("Daughter index out of range !\n");
167             return 0;
168         }
169     }
170 }
171
172 #endif