Fixing bug reported by M.Lunardon (Javier)
[u/mrichter/AliRoot.git] / ANALYSIS / AliAODxi.h
1 #ifndef ALIAODXI_H
2 #define ALIAODXI_H
3
4 /* Copyright(c) 2004-2005, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               */
6
7 //-------------------------------------------------------------------------
8 //     Implementation of the Analysis Oriented Data (AOD) Xi vertex class
9 //     Origin: B.Hippolyte, IReS, hippolyt@in2p3.fr 
10 //             G.Van Buren, BNL,  gene@bnl.gov      (original STAR MuDsts)
11 //     Purpose: Having observables for physics available for Xis
12 //-------------------------------------------------------------------------
13
14 #include <TObject.h>
15 #include <TDatabasePDG.h>
16
17 #define MASS(PID)  TDatabasePDG::Instance()->GetParticle((PID))->Mass()
18 #define MASS2(PID) MASS((PID))*MASS((PID))
19
20 class AliESD;
21 class AliESDVertex;
22 class AliESDv0;
23 class AliESDcascade;
24 class AliESDtrack;
25
26 class AliAODxi : public AliAODv0 {
27
28 public:
29   AliAODxi();
30   AliAODxi(AliESDcascade *rXiVertex, AliESD *rEvent);
31   AliAODxi(const AliAODxi& rAliAODxi);
32   virtual ~AliAODxi();
33
34   AliAODxi& operator=(const AliAODxi& rAliAODxi);
35
36   void     Fill(AliESDcascade *rXiVertex, AliESD *rEvent);
37   void     ResetXi();
38
39
40   Int_t    Charge()                  const;
41   Double_t DecayVertexXiX()          const;
42   Double_t DecayVertexXiY()          const;
43   Double_t DecayVertexXiZ()          const;
44   virtual Double_t DecayLengthV0()   const;
45   Double_t DcaXiDaughters()          const;
46   Double_t DcaBachelorToPrimVertex() const;
47   Double_t DcaV0ToPrimVertex(Double_t&, Double_t&, Double_t&) const;
48   Double_t DcaXiToPrimVertex()       const;
49   Double_t CosPointAngle(Double_t&, Double_t&, Double_t&) const;
50
51   Double_t DecayLengthXi(Double_t*)  const;
52                      
53   Double_t MomBachelorX()       const;
54   Double_t MomBachelorY()       const;
55   Double_t MomBachelorZ()       const;
56   UInt_t   KeyBachelor()        const;
57   Double_t Chi2Xi()             const;
58   Double_t MomXiX()             const;
59   Double_t MomXiY()             const;
60   Double_t MomXiZ()             const;
61
62   Double_t Ptot2Bachelor()      const;
63   Double_t Ptot2Xi()            const;
64   Double_t Pt2Xi()              const;
65   Double_t MomBachelorAlongXi() const;
66   Double_t MomV0AlongXi()       const;
67   Double_t AlphaXi()            const;
68   Double_t PtArmXi()            const;
69   Double_t EBachelorPion()      const;
70   Double_t EBachelorKaon()      const;
71   Double_t EXi()                const;
72   Double_t EOmega()             const;
73   Double_t MassXi()             const;
74   Double_t MassOmega()          const;
75   Double_t RapXi()              const;
76   Double_t RapOmega()           const;
77
78
79 protected:
80
81   Int_t    fCharge;                  // charge of Xi
82   Double_t fDecayVertexXiX;          // decay vertex of Xi along X
83   Double_t fDecayVertexXiY;          // decay vertex of Xi along Y
84   Double_t fDecayVertexXiZ;          // decay vertex of Xi along Z
85   Double_t fDcaXiDaughters;          // dca between Xi daughters
86   Double_t fDcaXiToPrimVertex;       // dca of Xi to primary vertex 
87   Double_t fDcaBachelorToPrimVertex; // dca of bachelor to primary vertex 
88   Double_t fMomBachelorX;            // momemtum of bachelor along X
89   Double_t fMomBachelorY;            // momemtum of bachelor along Y
90   Double_t fMomBachelorZ;            // momemtum of bachelor along Z
91
92   UInt_t   fKeyBachelor;             // track key/index to bachelor 
93
94   Double_t fChi2Xi;                  // main quality variable of Xi
95
96   ClassDef(AliAODxi,1)
97 };
98
99 inline Int_t    AliAODxi::Charge() const {return fCharge;}
100
101 inline Double_t AliAODxi::DecayVertexXiX() const {return fDecayVertexXiX;}
102 inline Double_t AliAODxi::DecayVertexXiY() const {return fDecayVertexXiY;}
103 inline Double_t AliAODxi::DecayVertexXiZ() const {return fDecayVertexXiZ;}
104
105 inline Double_t AliAODxi::DecayLengthV0() const {
106     return ::sqrt(::pow(fDecayVertexV0X - fDecayVertexXiX,2) +
107                   ::pow(fDecayVertexV0Y - fDecayVertexXiY,2) +
108                   ::pow(fDecayVertexV0Z - fDecayVertexXiZ,2));
109 }
110
111 inline Double_t AliAODxi::DcaV0ToPrimVertex(Double_t& primVertexX, Double_t& primVertexY, Double_t& primVertexZ) const {
112   Double_t momV0X=MomV0X();
113   Double_t momV0Y=MomV0Y();
114   Double_t momV0Z=MomV0Z();
115   Double_t dx=(primVertexY-fDecayVertexV0Y)*momV0Z - (primVertexZ-fDecayVertexV0Z)*momV0Y; 
116   Double_t dy=(primVertexX-fDecayVertexV0X)*momV0Z - (primVertexZ-fDecayVertexV0Z)*momV0X;
117   Double_t dz=(primVertexX-fDecayVertexV0X)*momV0Y - (primVertexY-fDecayVertexV0Y)*momV0X;
118   return TMath::Sqrt((dx*dx+dy*dy+dz*dz)/(momV0X*momV0X+momV0Y*momV0Y+momV0Z*momV0Z));
119 }
120
121 inline Double_t AliAODxi::DcaXiDaughters() const {return fDcaXiDaughters;}
122 inline Double_t AliAODxi::DcaBachelorToPrimVertex() const {return fDcaBachelorToPrimVertex;}
123 inline Double_t AliAODxi::DcaXiToPrimVertex() const {return fDcaXiToPrimVertex;}
124
125 inline Double_t AliAODxi::CosPointAngle(Double_t& refPointX, Double_t& refPointY, Double_t& refPointZ) const {
126   
127   Double_t deltaPos[3]; //vector between the reference point and the cascade vertex
128   deltaPos[0] = fDecayVertexXiX - refPointX;
129   deltaPos[1] = fDecayVertexXiY - refPointY;
130   deltaPos[2] = fDecayVertexXiZ - refPointZ;
131
132   Double_t deltaPos2 = deltaPos[0]*deltaPos[0] + deltaPos[1]*deltaPos[1] + deltaPos[2]*deltaPos[2];
133   
134   Double_t cosinePointingAngle = (deltaPos[0]*MomXiX() +
135                                   deltaPos[1]*MomXiY() +
136                                   deltaPos[2]*MomXiZ() ) /
137     TMath::Sqrt(Ptot2Xi() * deltaPos2);
138   return cosinePointingAngle;
139 }
140
141 inline Double_t AliAODxi::DecayLengthXi(Double_t *tPrimaryVertexPosition) const {
142   return ::sqrt(::pow(fDecayVertexXiX - tPrimaryVertexPosition[0],2) +
143                 ::pow(fDecayVertexXiY - tPrimaryVertexPosition[1],2) +
144                 ::pow(fDecayVertexXiZ - tPrimaryVertexPosition[2],2));
145 }
146
147 inline Double_t AliAODxi::MomBachelorX() const {return fMomBachelorX;}
148 inline Double_t AliAODxi::MomBachelorY() const {return fMomBachelorY;}
149 inline Double_t AliAODxi::MomBachelorZ() const {return fMomBachelorZ;}
150 inline UInt_t   AliAODxi::KeyBachelor() const {return fKeyBachelor;}
151 inline Double_t AliAODxi::Chi2Xi() const {return fChi2Xi;}
152 inline Double_t AliAODxi::MomXiX() const {return MomV0X()+fMomBachelorX;}
153 inline Double_t AliAODxi::MomXiY() const {return MomV0Y()+fMomBachelorY;}
154 inline Double_t AliAODxi::MomXiZ() const {return MomV0Z()+fMomBachelorZ;}
155
156 inline Double_t AliAODxi::Ptot2Bachelor() const {
157   return (::pow(fMomBachelorX,2) + ::pow(fMomBachelorY,2) + ::pow(fMomBachelorZ,2) );
158 }
159 inline Double_t AliAODxi::Ptot2Xi() const {return ( Pt2Xi() + ::pow(MomXiZ(),2) );}
160 inline Double_t AliAODxi::Pt2Xi() const {
161   return (::pow(MomXiX(),2) + ::pow(MomXiY(),2) );
162 }
163
164 inline Double_t AliAODxi::MomBachelorAlongXi() const {
165   Double_t lPtot2Xi = Ptot2Xi();
166   if (lPtot2Xi)
167     return (MomBachelorX()*MomXiX() +
168             MomBachelorY()*MomXiY() +
169             MomBachelorZ()*MomXiZ()) / ::sqrt(lPtot2Xi);
170   return 0.;
171 }
172
173 inline Double_t AliAODxi::MomV0AlongXi() const {
174   Double_t lPtot2Xi = Ptot2Xi();
175   if (lPtot2Xi)
176     return (MomV0X()*MomXiX() +
177             MomV0Y()*MomXiY() +
178             MomV0Z()*MomXiZ()) / ::sqrt(lPtot2Xi);
179   return 0.;
180 }
181
182 inline Double_t AliAODxi::AlphaXi() const {
183   Double_t lMomV0AlongXi       = MomV0AlongXi();
184   Double_t lMomBachelorAlongXi = MomBachelorAlongXi();
185
186   return (((Float_t) Charge()) * (lMomBachelorAlongXi-lMomV0AlongXi)/
187                                  (lMomBachelorAlongXi+lMomV0AlongXi));
188 }
189
190 inline Double_t AliAODxi::PtArmXi() const {
191   return ::sqrt(Ptot2V0()-MomBachelorAlongXi()*MomBachelorAlongXi());
192 }
193
194 inline Double_t AliAODxi::EBachelorPion() const {
195   return ::sqrt(Ptot2Bachelor()+MASS2("pi-"));
196 }
197
198 inline Double_t AliAODxi::EBachelorKaon() const {
199   return ::sqrt(Ptot2Bachelor()+MASS2("K-"));
200 }
201
202 inline Double_t AliAODxi::EXi() const {
203   return ::sqrt(Ptot2Xi()+MASS2("Xi-"));
204 }
205
206 inline Double_t AliAODxi::EOmega() const {
207   return ::sqrt(Ptot2Xi()+MASS2("Omega-"));
208 }
209
210 inline Double_t AliAODxi::MassXi() const {
211   return ::sqrt(::pow(ELambda()+EBachelorPion(),2)-Ptot2Xi());
212 }
213
214 inline Double_t AliAODxi::MassOmega() const {
215   return ::sqrt(::pow(ELambda()+EBachelorKaon(),2)-Ptot2Xi());
216 }
217
218 inline Double_t AliAODxi::RapXi() const {
219   Double_t exi = EXi();
220   Double_t lMomXiZ = MomXiZ();
221   return 0.5*::log((exi+lMomXiZ)/(exi-lMomXiZ));
222 }
223
224 inline Double_t AliAODxi::RapOmega() const {
225   Double_t eom = EOmega();
226   Double_t lMomXiZ = MomXiZ();
227   return 0.5*::log((eom+lMomXiZ)/(eom-lMomXiZ));
228 }
229
230 #endif