1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 //-------------------------------------------------------------------------
17 // Implementation of the Analysis Oriented Data (AOD) Xi vertex class
18 // Origin: A.Maire, IReS, antonin.maire@ires.in2p3.fr
19 // G.Van Buren, BNL, gene@bnl.gov (original STAR MuDsts)
21 // Purpose: Having physics observables available for Xis
22 //-------------------------------------------------------------------------
26 #include <TDatabasePDG.h>
28 #include "AliAODcascade.h"
29 #include "AliAODTrack.h"
31 ClassImp(AliAODcascade)
34 AliAODcascade::AliAODcascade() :
41 fDcaXiToPrimVertex(999),
42 fDcaBachToPrimVertex(999),
49 //--------------------------------------------------------------------
50 // Default constructor
51 //--------------------------------------------------------------------
57 AliAODcascade::AliAODcascade(const AliAODcascade& rSource) :
60 fDecayVertexXi( rSource.fDecayVertexXi ),
61 fChargeXi( rSource.fChargeXi ),
63 fDcaXiDaughters( rSource.fDcaXiDaughters ),
64 fDcaXiToPrimVertex( rSource.fDcaXiToPrimVertex ),
65 fDcaBachToPrimVertex( rSource.fDcaBachToPrimVertex ),
67 fMomBachX( rSource.fMomBachX ),
68 fMomBachY( rSource.fMomBachY ),
69 fMomBachZ( rSource.fMomBachZ )
72 //--------------------------------------------------------------------
74 //--------------------------------------------------------------------
80 AliAODcascade::AliAODcascade( AliAODVertex* rAODVertexXi,
82 Double_t rDcaXiDaughters,
83 Double_t rDcaXiToPrimVertex,
84 Double_t rDcaBachToPrimVertex,
85 const Double_t* rMomBach,
87 AliAODVertex* rAODVertexV0,
88 Double_t rDcaV0Daughters,
89 Double_t rDcaV0ToPrimVertex,
90 const Double_t *rMomPos,
91 const Double_t *rMomNeg,
92 Double_t *rDcaDaughterToPrimVertex
94 AliAODv0(rAODVertexV0, rDcaV0Daughters, rDcaV0ToPrimVertex, rMomPos, rMomNeg, rDcaDaughterToPrimVertex),
95 fDecayVertexXi( rAODVertexXi ),
96 fChargeXi( rChargeXi ),
97 fDcaXiDaughters( rDcaXiDaughters ),
98 fDcaXiToPrimVertex( rDcaXiToPrimVertex ),
99 fDcaBachToPrimVertex( rDcaBachToPrimVertex ),
100 fMomBachX( rMomBach[0] ),
101 fMomBachY( rMomBach[1] ),
102 fMomBachZ( rMomBach[2] )
104 //--------------------------------------------------------------------
105 // Constructor via setting each data member
106 //--------------------------------------------------------------------
113 AliAODcascade::AliAODcascade( AliAODVertex* rAODVertexXi,
115 Double_t rDcaXiDaughters,
116 Double_t rDcaXiToPrimVertex,
117 Double_t rDcaBachToPrimVertex,
118 const Double_t* rMomBach,
119 const AliAODv0& rAODv0 ) :
121 fDecayVertexXi(rAODVertexXi),
122 fChargeXi( rChargeXi ),
123 fDcaXiDaughters( rDcaXiDaughters ),
124 fDcaXiToPrimVertex( rDcaXiToPrimVertex ),
125 fDcaBachToPrimVertex( rDcaBachToPrimVertex ),
126 fMomBachX( rMomBach[0] ),
127 fMomBachY( rMomBach[1] ),
128 fMomBachZ( rMomBach[2] )
130 //--------------------------------------------------------------------
131 // Constructor via setting each Xi data member + setting AODv0
132 //--------------------------------------------------------------------
140 AliAODcascade& AliAODcascade::operator=(const AliAODcascade& rSource){
141 //--------------------------------------------------------------------
142 // Assignment overload
143 //--------------------------------------------------------------------
145 if (this == &rSource) return *this;
147 AliAODv0::operator=(rSource);
149 this->fDecayVertexXi = rSource.fDecayVertexXi;
150 this->fChargeXi = rSource.fChargeXi;
152 this->fDcaXiDaughters = rSource.fDcaXiDaughters;
153 this->fDcaXiToPrimVertex = rSource.fDcaXiToPrimVertex;
154 this->fDcaBachToPrimVertex = rSource.fDcaBachToPrimVertex;
156 this->fMomBachX = rSource.fMomBachX;
157 this->fMomBachY = rSource.fMomBachY;
158 this->fMomBachZ = rSource.fMomBachZ;
165 AliAODcascade::~AliAODcascade(){
166 //--------------------------------------------------------------------
168 //--------------------------------------------------------------------
171 void AliAODcascade::Fill(AliAODVertex* rAODVertexXi,
173 Double_t rDcaXiDaughters,
174 Double_t rDcaXiToPrimVertex,
175 Double_t rDcaBachToPrimVertex,
176 const Double_t* rMomBach,
178 AliAODVertex* rAODVertexV0,
179 Double_t rDcaV0Daughters,
180 Double_t rDcaV0ToPrimVertex,
181 const Double_t* rMomPos,
182 const Double_t* rMomNeg,
183 Double_t* rDcaDaughterToPrimVertex )
185 //--------------------------------------------------------------------
186 // Fill the AODcascade
187 //--------------------------------------------------------------------
189 AliAODv0::Fill(rAODVertexV0,rDcaV0Daughters,rDcaV0ToPrimVertex,rMomPos,rMomNeg,rDcaDaughterToPrimVertex);
190 fDecayVertexXi = rAODVertexXi;
191 fChargeXi = rChargeXi;
193 fDcaXiDaughters = rDcaXiDaughters;
194 fDcaXiToPrimVertex = rDcaXiToPrimVertex;
195 fDcaBachToPrimVertex = rDcaBachToPrimVertex;
197 fMomBachX = rMomBach[0];
198 fMomBachY = rMomBach[1];
199 fMomBachZ = rMomBach[2];
204 void AliAODcascade::ResetXi(){
205 //--------------------------------------------------------------------
206 // Reset the values of the AOD data members to the default ones
207 //--------------------------------------------------------------------
211 GetDecayVertexXi()->SetChi2perNDF(-999);
212 GetDecayVertexXi()->RemoveCovMatrix();
213 GetDecayVertexXi()->RemoveDaughters();
214 GetDecayVertexXi()->SetID(-1);
215 GetDecayVertexXi()->SetParent((TObject*) 0x0);
216 GetDecayVertexXi()->SetPosition(-999, -999, -999);
217 GetDecayVertexXi()->SetType( AliAODVertex::kUndef );
221 fDcaXiDaughters = 999;
222 fDcaXiToPrimVertex = 999;
223 fDcaBachToPrimVertex = 999;
232 void AliAODcascade::PrintXi(const Double_t& rPrimVtxX,
233 const Double_t& rPrimVtxY,
234 const Double_t& rPrimVtxZ) const
236 //--------------------------------------------------------------------
237 // Print the AOD data members
238 //--------------------------------------------------------------------
241 printf("AliAODcascade : posXiVtx (%.6f, %.6f, %.6f) \n", DecayVertexXiX(), DecayVertexXiY(), DecayVertexXiZ() );
242 printf("AliAODcascade : chargeXi = %d \n", ChargeXi() );
243 printf("AliAODcascade : dca (bachtpv %.6f, xid %.6f, xitpv-calc %.6f, xitpv-mb %.6f) \n",
244 DcaBachToPrimVertex(),
246 DcaXiToPrimVertex( rPrimVtxX, rPrimVtxY, rPrimVtxZ),
247 DcaXiToPrimVertex() );
248 printf("AliAODcascade : cos(PtgAngle Xi) = %.6f \n", CosPointingAngleXi(rPrimVtxX, rPrimVtxY, rPrimVtxZ) );
251 printf("AliAODcascade : posVtxXI (x %.6f, y %.6f, z %.6f) \n", DecayVertexXiX(),DecayVertexXiY(),DecayVertexXiZ() );
252 printf("AliAODcascade : decaylgth (V0 %.6f, Xi %.6f) \n", DecayLengthV0(),DecayLengthXi(rPrimVtxX, rPrimVtxY, rPrimVtxZ) );
253 printf("AliAODcascade : momBach (px %.6f, py %.6f, pz %.6f, ptot2 %.6f) \n",
258 printf("AliAODcascade : momXi (px %.6f, py %.6f, pz %.6f, ptot2 %.6f, pt2 %.6f) \n",
264 printf("AliAODcascade : momAlongXi (Bach %.6f, V0 %.6f) \n", MomBachAlongXi(), MomV0AlongXi() );
265 printf("AliAODcascade : cin (alphaXi %.6f, PtArmXi %.6f) \n", AlphaXi(), PtArmXi() );
266 printf("AliAODcascade : rap (Xi %.6f, Omega %.6f) \n", RapXi(),RapOmega() );
267 printf("AliAODcascade : nrg (BachPi %.6f, BachK- %.6f, Omega %.6f, Xi %.6f ) \n",
272 printf("AliAODcascade : inv mass (Xi %.6f, Omega %.6f) \n", MassXi(), MassOmega() );
274 // Methods Not printed = GetBachID(), Chi2Xi()
279 Double_t AliAODcascade::CosPointingAngleXi(const Double_t& rPrimVtxX,
280 const Double_t& rPrimVtxY,
281 const Double_t& rPrimVtxZ) const {
283 // Cosine of Xi pointing angle in 3D space, with respect to a point
286 TVector3 lMomXi( MomXiX(),MomXiY(),MomXiZ() );
287 TVector3 lVectPrimVtxToXi(DecayVertexXiX() - rPrimVtxX,
288 DecayVertexXiY() - rPrimVtxY,
289 DecayVertexXiZ() - rPrimVtxZ);
291 Double_t lPtgAngle = lMomXi.Angle(lVectPrimVtxToXi);
293 return TMath::Cos(lPtgAngle);
297 Double_t AliAODcascade::DcaXiToPrimVertex(const Double_t& rPrimVtxX,
298 const Double_t& rPrimVtxY,
299 const Double_t& rPrimVtxZ) const {
301 // Compute the DCA between this Xi and the primary vertex
303 Double_t rMomXiX = MomXiX();
304 Double_t rMomXiY = MomXiY();
305 Double_t rMomXiZ = MomXiZ();
306 Double_t dx = (rPrimVtxY- DecayVertexXiY() )*rMomXiZ - (rPrimVtxZ- DecayVertexXiZ() )*rMomXiY;
307 Double_t dy = (rPrimVtxZ- DecayVertexXiZ() )*rMomXiX - (rPrimVtxX- DecayVertexXiX() )*rMomXiZ;
308 Double_t dz = (rPrimVtxX- DecayVertexXiX() )*rMomXiY - (rPrimVtxY- DecayVertexXiY() )*rMomXiX;
309 return TMath::Sqrt((dx*dx+dy*dy+dz*dz)/ Ptot2Xi() );
312 Int_t AliAODcascade::GetBachID() const {
314 // Return the ID of the bachelor
317 if( GetDecayVertexXi() == 0) return -1;
319 AliAODTrack *rBachTrack = (AliAODTrack *) ( GetDecayVertexXi()->GetDaughter(0) );
320 // The fDecayVertexXi should just have one stored daughter. To be managed within the AliAnalysisTaskESDFilter
321 Short_t rBachId = rBachTrack->GetID();
325 Double_t AliAODcascade::EBachPion() const {
326 static Double_t lMassPi = TDatabasePDG::Instance()->GetParticle("pi-")->Mass();
327 return ::sqrt(Ptot2Bach() + lMassPi*lMassPi);
330 Double_t AliAODcascade::EBachKaon() const {
331 static Double_t lMassKaon = TDatabasePDG::Instance()->GetParticle("K-")->Mass();
332 return ::sqrt(Ptot2Bach() + lMassKaon*lMassKaon);
335 Double_t AliAODcascade::EXi() const {
336 static Double_t lMassXi = TDatabasePDG::Instance()->GetParticle("Xi-")->Mass();
337 return ::sqrt(Ptot2Xi() + lMassXi*lMassXi);
340 Double_t AliAODcascade::EOmega() const {
341 static Double_t lMassOmega = TDatabasePDG::Instance()->GetParticle("Omega-")->Mass();
342 return ::sqrt(Ptot2Xi() + lMassOmega*lMassOmega);