Line data Source code
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, kMainSPD, kPileupSPD, kPileupTracks,kMainTPC};
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 : virtual AliAODVertex* CloneWithoutRefs() const;
57 :
58 0 : void SetX(Double_t x) { fPosition[0] = x; }
59 0 : void SetY(Double_t y) { fPosition[1] = y; }
60 0 : void SetZ(Double_t z) { fPosition[2] = z; }
61 0 : void SetPosition(Double_t x, Double_t y, Double_t z) { fPosition[0] = x; fPosition[1] = y; fPosition[2] = z; }
62 : template <class T> void SetPosition(T *pos)
63 88 : { fPosition[0] = pos[0]; fPosition[1] = pos[1]; fPosition[2] = pos[2]; }
64 :
65 0 : void SetChi2perNDF(Double_t chi2perNDF) { fChi2perNDF = chi2perNDF; }
66 :
67 0 : void SetParent(TObject *parent) { fParent = parent; }
68 :
69 16 : Double_t GetX() const { return fPosition[0]; }
70 16 : Double_t GetY() const { return fPosition[1]; }
71 16 : Double_t GetZ() const { return fPosition[2]; }
72 : void GetXYZ(Double_t position[3]) const
73 0 : {position[0]=fPosition[0]; position[1]=fPosition[1]; position[2]=fPosition[2];}
74 : template <class T> void GetPosition(T *pos) const
75 0 : {pos[0]=fPosition[0]; pos[1]=fPosition[1]; pos[2]=fPosition[2];}
76 :
77 : template <class T> void SetCovMatrix(const T *covMatrix) {
78 160 : if(!fCovMatrix) fCovMatrix=new AliAODRedCov<3>();
79 40 : fCovMatrix->SetCovMatrix(covMatrix);}
80 :
81 : template <class T> Bool_t GetCovMatrix(T *covMatrix) const {
82 16 : if(!fCovMatrix) return kFALSE;
83 16 : fCovMatrix->GetCovMatrix(covMatrix); return kTRUE;}
84 :
85 : void GetCovarianceMatrix(Double_t covmatrix[6]) const
86 16 : {GetCovMatrix(covmatrix);}
87 0 : void RemoveCovMatrix() {delete fCovMatrix; fCovMatrix=NULL;}
88 :
89 : template <class T> void GetSigmaXYZ(T *sigma) const;
90 :
91 0 : Double_t GetChi2perNDF() const { return fChi2perNDF; }
92 0 : Double_t GetChi2() const { return fChi2perNDF*(Double_t)GetNDF(); }
93 0 : Int_t GetNDF() const { return 2*GetNContributors()-3; }
94 :
95 0 : Short_t GetID() const { return fID; }
96 0 : void SetID(Short_t id) { fID=id; }
97 :
98 264 : Char_t GetType() const { return fType; }
99 0 : void SetType(AODVtx_t vtype) { fType=vtype; }
100 :
101 0 : TObject* GetParent() const { return fParent.GetObject(); }
102 0 : Bool_t HasParent(TObject *parent) const { return (fParent.GetObject() == parent) ? kTRUE : kFALSE; }
103 :
104 : void AddDaughter(TObject *daughter);
105 0 : void RemoveDaughter(TObject *daughter) { fDaughters.Remove(daughter); }
106 0 : void RemoveDaughters() { fDaughters.Clear(); if(fProngs) {delete [] fProngs; fProngs=0; MakeProngs(); fIprong=0;} }
107 : TObject* GetDaughter(Int_t i);
108 : Bool_t HasDaughter(TObject *daughter) const;
109 : Int_t GetNDaughters() const;
110 : Int_t GetNContributors() const;
111 32 : void SetNContributors(Int_t nc) {fNContributors = nc;}
112 : // covariance matrix elements after rotation by phi around z-axis
113 : // and, then, by theta around new y-axis
114 : Double_t RotatedCovMatrixXX(Double_t phi = 0., Double_t theta = 0.) const;
115 : Double_t RotatedCovMatrixXY(Double_t phi = 0., Double_t theta = 0.) const;
116 : Double_t RotatedCovMatrixYY(Double_t phi = 0.) const;
117 : Double_t RotatedCovMatrixXZ(Double_t phi = 0., Double_t theta = 0.) const;
118 : Double_t RotatedCovMatrixYZ(Double_t phi = 0., Double_t theta = 0.) const;
119 : Double_t RotatedCovMatrixZZ(Double_t phi = 0., Double_t theta = 0.) const;
120 :
121 : template <class T, class P> void PhiAndThetaToVertex(AliAODVertex *vtx, P &phi, T &theta) const;
122 : Double_t Distance2ToVertex(const AliAODVertex *vtx) const;
123 : Double_t DistanceToVertex(AliAODVertex *vtx) const
124 0 : {return TMath::Sqrt(Distance2ToVertex(vtx));}
125 : Double_t DistanceXY2ToVertex(const AliAODVertex *vtx) const;
126 : Double_t DistanceXYToVertex(AliAODVertex *vtx) const
127 0 : {return TMath::Sqrt(DistanceXY2ToVertex(vtx));}
128 : Double_t Error2DistanceToVertex(AliAODVertex *vtx) const;
129 : Double_t ErrorDistanceToVertex(AliAODVertex *vtx) const
130 0 : {return TMath::Sqrt(Error2DistanceToVertex(vtx));}
131 : Double_t Error2DistanceXYToVertex(AliAODVertex *vtx) const;
132 : Double_t ErrorDistanceXYToVertex(AliAODVertex *vtx) const
133 0 : {return TMath::Sqrt(Error2DistanceXYToVertex(vtx));}
134 :
135 : void PrintIndices() const;
136 : void Print(Option_t* option = "") const;
137 :
138 : const char* AsString() const;
139 :
140 : static const char* GetTypeName(AODVtx_t type);
141 16 : void SetBC(Int_t bc) {fBCID = bc;}
142 0 : Int_t GetBC() const {return fBCID;}
143 : private:
144 132 : void MakeProngs() {if (fNprong > 0) {fProngs = new TRef[fNprong]; fIprong=0;}}
145 :
146 : private:
147 :
148 : Double32_t fPosition[3]; // vertex position
149 : Double32_t fChi2perNDF; // chi2/NDF of vertex fit
150 : Short_t fID; // vertex ID; corresponds to the array index of the appropriate ESD container
151 : Char_t fBCID; // BC ID assigned to vertex
152 : Char_t fType; // vertex type
153 : Int_t fNprong; // number of prongs
154 : Int_t fIprong; //!index of prong
155 : Int_t fNContributors; // Number of contributors for SPD vertex
156 : AliAODRedCov<3> *fCovMatrix; // vertex covariance matrix; values of and below the diagonal
157 : TRef fParent; // reference to the parent particle
158 : TRefArray fDaughters; // references to the daughter particles
159 : TRef *fProngs; //[fNprong] alternative daughters for n-prong vertex
160 :
161 516 : ClassDef(AliAODVertex, 8);
162 : };
163 :
164 : inline Int_t AliAODVertex::GetNDaughters() const
165 : {
166 0 : if (!fProngs) {
167 0 : return fDaughters.GetEntriesFast();
168 : } else {
169 0 : return fNprong;
170 : }
171 0 : }
172 :
173 : inline TObject* AliAODVertex::GetDaughter(Int_t i)
174 : {
175 0 : if (!fProngs) {
176 0 : return fDaughters.At(i);
177 : } else {
178 0 : if (i < fNprong) {
179 0 : return fProngs[i].GetObject();
180 : } else {
181 0 : AliWarning("Daughter index out of range !\n");
182 0 : return 0;
183 : }
184 : }
185 0 : }
186 :
187 : #endif
|