1 //---------------------------------------------------------------------------------
2 // The AliKFParticle class
4 // @author S.Gorbunov, I.Kisel
8 // Class to reconstruct and store the decayed particle parameters.
9 // The method is described in CBM-SOFT note 2007-003,
10 // ``Reconstruction of decayed particles based on the Kalman filter'',
11 // http://www.gsi.de/documents/DOC-2007-May-14-1.pdf
13 // This class is ALICE interface to general mathematics in AliKFParticleBase
15 // -= Copyright © ALICE HLT Group =-
16 //_________________________________________________________________________________
18 #ifndef ALIKFPARTICLE_H
19 #define ALIKFPARTICLE_H
21 #include "AliKFParticleBase.h"
22 #include "AliESDVertex.h"
24 class AliExternalTrackParam;
27 class AliKFParticle :public AliKFParticleBase
36 //* Constructor (empty)
38 AliKFParticle():AliKFParticleBase(), fBz(0) {}
40 //* Destructor (empty)
44 //* Initialisation from ALICE track, PID hypothesis can be provided
46 AliKFParticle( const AliExternalTrackParam &track, Double_t bz, Int_t PID = 211 );
48 //* Initialisation from ESD vertex
50 AliKFParticle( const AliESDVertex &vertex, Double_t bz );
52 void SetBz(Double_t bz) {fBz=bz;}
53 Double_t GetBz() const {return fBz;}
55 //* Copy vertex part to ESD vertex
57 void CopyToESDVertex( AliESDVertex &Vtx ) const ;
59 //* Initialise covariance matrix and set current parameters to 0.0
63 //* Set decay vertex parameters for linearisation
65 void SetVtxGuess( Double_t x, Double_t y, Double_t z );
73 Double_t GetX () const ; //* x of current position
74 Double_t GetY () const ; //* y of current position
75 Double_t GetZ () const ; //* z of current position
76 Double_t GetPx () const ; //* x-compoment of 3-momentum
77 Double_t GetPy () const ; //* y-compoment of 3-momentum
78 Double_t GetPz () const ; //* z-compoment of 3-momentum
79 Double_t GetE () const ; //* energy
80 Double_t GetS () const ; //* decay length / momentum
81 Int_t GetQ () const ; //* charge
82 Double_t GetChi2 () const ; //* chi^2
83 Int_t GetNDF () const ; //* Number of Degrees of Freedom
85 Double_t GetParameter ( int i ) const ;
86 Double_t GetCovariance( int i ) const ;
87 Double_t GetCovariance( int i, int j ) const ;
89 //* Accessors with calculations( &value, &estimated sigma )
90 //* error flag returned (0 means no error during calculations)
92 int GetMomentum ( Double_t &P, Double_t &SigmaP ) const ;
93 int GetMass ( Double_t &M, Double_t &SigmaM ) const ;
94 int GetDecayLength ( Double_t &L, Double_t &SigmaL ) const ;
95 int GetLifeTime ( Double_t &T, Double_t &SigmaT ) const ;
113 Double_t & Parameter ( int i ) ;
114 Double_t & Covariance( int i ) ;
115 Double_t & Covariance( int i, int j ) ;
118 //* CONSTRUCTION OF THE PARTICLE BY ITS DAUGHTERS AND MOTHER
119 //* USING THE KALMAN FILTER METHOD
123 //* Simple way to construct particles ex. D0 = Pion + Kaon;
125 AliKFParticle operator +( const AliKFParticle &Daughter ) const;
127 void operator +=( const AliKFParticle &Daughter );
129 //* Add daughter track to the particle
131 void AddDaughter( const AliKFParticle &Daughter );
133 //* Set production vertex
135 void SetProductionVertex( const AliKFParticle &Vtx );
137 //* Set hard mass constraint
139 void SetMassConstraint( Double_t Mass );
141 //* Everything in one go
143 void Construct( const AliKFParticle *vDaughters[], int NDaughters,
144 const AliKFParticle *ProdVtx=0, Double_t Mass=-1 );
149 //* ( main transportation parameter is S = SignedPath/Momentum )
150 //* ( parameters of decay & production vertices are stored locally )
153 //* Transport the particle to its decay vertex
155 void TransportToDecayVertex();
157 //* Transport the particle to its production vertex
159 void TransportToProductionVertex();
161 //* Transport the particle close to xyz[] point
163 void TransportToPoint( const Double_t xyz[] );
165 //* Transport the particle close to ESD vertex
167 void TransportToVertex( const AliESDVertex &v );
169 //* Transport the particle close to another particle p
171 void TransportToParticle( const AliKFParticle &p );
173 //* Transport the particle on dS parameter (SignedPath/Momentum)
175 void TransportToDS( Double_t dS );
177 //* Get dS to a certain space point
179 Double_t GetDStoPoint( const Double_t xyz[] ) const ;
181 //* Get dS to other particle p (dSp for particle p also returned)
183 void GetDStoParticle( const AliKFParticle &p,
184 Double_t &DS, Double_t &DSp ) const ;
191 //* Calculate distance from another object [cm]
193 Double_t GetDistanceFromVertex( const Double_t vtx[] ) const ;
194 Double_t GetDistanceFromVertex( const AliKFParticle &Vtx ) const ;
195 Double_t GetDistanceFromVertex( const AliESDVertex &Vtx ) const ;
196 Double_t GetDistanceFromParticle( const AliKFParticle &p ) const ;
198 //* Calculate sqrt(Chi2/ndf) deviation from another object
199 //* ( v = [xyz]-vertex, Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix )
201 Double_t GetDeviationFromVertex( const Double_t v[], const Double_t Cv[]=0 ) const ;
202 Double_t GetDeviationFromVertex( const AliKFParticle &Vtx ) const ;
203 Double_t GetDeviationFromVertex( const AliESDVertex &Vtx ) const ;
204 Double_t GetDeviationFromParticle( const AliKFParticle &p ) const ;
206 //* Subtract the particle from the vertex
208 void SubtractFromVertex( AliKFParticle &v ) const ;
209 void SubtractFromVertex( AliESDVertex &v ) const ;
218 //* Method to access ALICE field
220 Double_t GetFieldAlice() const ;
222 //* Other methods required by the abstract AliKFParticleBase class
224 void GetFieldValue( const Double_t xyz[], Double_t B[] ) const ;
225 void GetDStoParticle( const AliKFParticleBase &p, Double_t &DS, Double_t &DSp )const ;
226 void Transport( Double_t dS, Double_t P[], Double_t C[] ) const ;
229 Double_t fBz; // Bz compoment of the magnetic field
231 ClassDef( AliKFParticle, 2 );
237 //---------------------------------------------------------------------
239 // Inline implementation of the AliKFParticle methods
241 //---------------------------------------------------------------------
245 inline void AliKFParticle::Initialize()
247 AliKFParticleBase::Initialize();
250 inline void AliKFParticle::SetVtxGuess( Double_t x, Double_t y, Double_t z )
252 AliKFParticleBase::SetVtxGuess(x,y,z);
255 inline Double_t AliKFParticle::GetX () const
257 return AliKFParticleBase::GetX();
260 inline Double_t AliKFParticle::GetY () const
262 return AliKFParticleBase::GetY();
265 inline Double_t AliKFParticle::GetZ () const
267 return AliKFParticleBase::GetZ();
270 inline Double_t AliKFParticle::GetPx () const
272 return AliKFParticleBase::GetPx();
275 inline Double_t AliKFParticle::GetPy () const
277 return AliKFParticleBase::GetPy();
280 inline Double_t AliKFParticle::GetPz () const
282 return AliKFParticleBase::GetPz();
285 inline Double_t AliKFParticle::GetE () const
287 return AliKFParticleBase::GetE();
290 inline Double_t AliKFParticle::GetS () const
292 return AliKFParticleBase::GetS();
295 inline Int_t AliKFParticle::GetQ () const
297 return AliKFParticleBase::GetQ();
300 inline Double_t AliKFParticle::GetChi2 () const
302 return AliKFParticleBase::GetChi2();
305 inline Int_t AliKFParticle::GetNDF () const
307 return AliKFParticleBase::GetNDF();
310 inline Double_t AliKFParticle::GetParameter ( int i ) const
312 return AliKFParticleBase::GetParameter(i);
315 inline Double_t AliKFParticle::GetCovariance( int i ) const
317 return AliKFParticleBase::GetCovariance(i);
320 inline Double_t AliKFParticle::GetCovariance( int i, int j ) const
322 return AliKFParticleBase::GetCovariance(i,j);
325 inline int AliKFParticle::GetMomentum( Double_t &P, Double_t &SigmaP ) const
327 return AliKFParticleBase::GetMomentum( P, SigmaP );
330 inline int AliKFParticle::GetMass( Double_t &M, Double_t &SigmaM ) const
332 return AliKFParticleBase::GetMass( M, SigmaM );
335 inline int AliKFParticle::GetDecayLength( Double_t &L, Double_t &SigmaL ) const
337 return AliKFParticleBase::GetDecayLength( L, SigmaL );
340 inline int AliKFParticle::GetLifeTime( Double_t &T, Double_t &SigmaT ) const
342 return AliKFParticleBase::GetLifeTime( T, SigmaT );
345 inline Double_t & AliKFParticle::X()
347 return AliKFParticleBase::X();
350 inline Double_t & AliKFParticle::Y()
352 return AliKFParticleBase::Y();
355 inline Double_t & AliKFParticle::Z()
357 return AliKFParticleBase::Z();
360 inline Double_t & AliKFParticle::Px()
362 return AliKFParticleBase::Px();
365 inline Double_t & AliKFParticle::Py()
367 return AliKFParticleBase::Py();
370 inline Double_t & AliKFParticle::Pz()
372 return AliKFParticleBase::Pz();
375 inline Double_t & AliKFParticle::E()
377 return AliKFParticleBase::E();
380 inline Double_t & AliKFParticle::S()
382 return AliKFParticleBase::S();
385 inline Int_t & AliKFParticle::Q()
387 return AliKFParticleBase::Q();
390 inline Double_t & AliKFParticle::Chi2()
392 return AliKFParticleBase::Chi2();
395 inline Int_t & AliKFParticle::NDF()
397 return AliKFParticleBase::NDF();
400 inline Double_t & AliKFParticle::Parameter ( int i )
402 return AliKFParticleBase::Parameter(i);
405 inline Double_t & AliKFParticle::Covariance( int i )
407 return AliKFParticleBase::Covariance(i);
410 inline Double_t & AliKFParticle::Covariance( int i, int j )
412 return AliKFParticleBase::Covariance(i,j);
416 inline void AliKFParticle::operator +=( const AliKFParticle &Daughter )
418 AliKFParticleBase::operator +=( Daughter );
421 inline AliKFParticle AliKFParticle::operator +( const AliKFParticle &Daughter ) const
424 const AliKFParticle *v[2] = {this, &Daughter };
429 inline void AliKFParticle::AddDaughter( const AliKFParticle &Daughter )
431 AliKFParticleBase::AddDaughter( Daughter );
434 inline void AliKFParticle::SetProductionVertex( const AliKFParticle &Vtx )
436 AliKFParticleBase::SetProductionVertex( Vtx );
439 inline void AliKFParticle::SetMassConstraint( Double_t Mass )
441 AliKFParticleBase::SetMassConstraint( Mass );
444 inline void AliKFParticle::Construct( const AliKFParticle *vDaughters[], int NDaughters,
445 const AliKFParticle *ProdVtx, Double_t Mass )
447 AliKFParticleBase::Construct( ( const AliKFParticleBase**)vDaughters, NDaughters,
448 ( const AliKFParticleBase*)ProdVtx, Mass );
451 inline void AliKFParticle::TransportToDecayVertex()
453 AliKFParticleBase::TransportToDecayVertex();
456 inline void AliKFParticle::TransportToProductionVertex()
458 AliKFParticleBase::TransportToProductionVertex();
461 inline void AliKFParticle::TransportToPoint( const Double_t xyz[] )
463 TransportToDS( GetDStoPoint(xyz) );
466 inline void AliKFParticle::TransportToVertex( const AliESDVertex &v )
468 TransportToPoint( AliKFParticle(v,fBz).fP );
471 inline void AliKFParticle::TransportToParticle( const AliKFParticle &p )
474 GetDStoParticle( p, dS, dSp );
478 inline void AliKFParticle::TransportToDS( Double_t dS )
480 AliKFParticleBase::TransportToDS( dS );
483 inline Double_t AliKFParticle::GetDStoPoint( const Double_t xyz[] ) const
485 return AliKFParticleBase::GetDStoPointBz( GetFieldAlice(), xyz );
488 inline void AliKFParticle::GetDStoParticle( const AliKFParticle &p,
489 Double_t &DS, Double_t &DSp ) const
491 return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
495 inline Double_t AliKFParticle::GetDistanceFromVertex( const Double_t vtx[] ) const
497 return AliKFParticleBase::GetDistanceFromVertex( vtx );
500 inline Double_t AliKFParticle::GetDeviationFromVertex( const Double_t v[],
501 const Double_t Cv[] ) const
503 return AliKFParticleBase::GetDeviationFromVertex( v, Cv);
506 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliKFParticle &Vtx ) const
508 return AliKFParticleBase::GetDistanceFromVertex( Vtx );
511 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliKFParticle &Vtx ) const
513 return AliKFParticleBase::GetDeviationFromVertex( Vtx );
516 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliESDVertex &Vtx ) const
518 return GetDistanceFromVertex( AliKFParticle(Vtx,fBz) );
521 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliESDVertex &Vtx ) const
523 return GetDeviationFromVertex( AliKFParticle(Vtx,fBz) );
526 inline Double_t AliKFParticle::GetDistanceFromParticle( const AliKFParticle &p ) const
528 return AliKFParticleBase::GetDistanceFromParticleBz( GetFieldAlice(), p);
531 inline Double_t AliKFParticle::GetDeviationFromParticle( const AliKFParticle &p ) const
533 return AliKFParticleBase::GetDeviationFromParticleBz( GetFieldAlice(),p);
536 inline void AliKFParticle::SubtractFromVertex( AliKFParticle &v ) const
538 AliKFParticleBase::SubtractFromVertex( v.fP, v.fC, v.fChi2, v.fNDF);
541 inline void AliKFParticle::SubtractFromVertex( AliESDVertex &v ) const
543 AliKFParticle vTmp(v,fBz);
544 SubtractFromVertex( vTmp );
545 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2, v.GetName() );
548 inline void AliKFParticle::CopyToESDVertex( AliESDVertex &v ) const
550 AliKFParticle vTmp=*this;
551 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2 );
554 inline Double_t AliKFParticle::GetFieldAlice() const
559 inline void AliKFParticle::GetFieldValue( const Double_t * /*xyz*/, Double_t B[] ) const
562 B[2] = GetFieldAlice();
565 inline void AliKFParticle::GetDStoParticle( const AliKFParticleBase &p,
566 Double_t &DS, Double_t &DSp )const
568 return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
571 inline void AliKFParticle::Transport( Double_t dS, Double_t P[], Double_t C[] ) const
573 AliKFParticleBase::TransportBz( GetFieldAlice(), dS, P, C );