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 //* Set magnetic field for all particles
38 static void SetField( Double_t Bz );
40 //* Constructor (empty)
42 AliKFParticle():AliKFParticleBase(){}
44 //* Destructor (empty)
48 //* Construction of mother particle by its 2-3-4 daughters
50 AliKFParticle( const AliKFParticle &d1, const AliKFParticle &d2 );
52 AliKFParticle( const AliKFParticle &d1, const AliKFParticle &d2,
53 const AliKFParticle &d3 );
55 AliKFParticle( const AliKFParticle &d1, const AliKFParticle &d2,
56 const AliKFParticle &d3, const AliKFParticle &d4 );
58 //* Initialisation from ALICE track, PID hypothesis can be provided
60 AliKFParticle( const AliExternalTrackParam &track, Int_t PID );
62 //* Initialisation from ESD vertex
64 AliKFParticle( const AliESDVertex &vertex );
66 //* Copy vertex part to ESD vertex
68 void CopyToESDVertex( AliESDVertex &Vtx ) const ;
70 //* Initialise covariance matrix and set current parameters to 0.0
74 //* Set decay vertex parameters for linearisation
76 void SetVtxGuess( Double_t x, Double_t y, Double_t z );
84 Double_t GetX () const ; //* x of current position
85 Double_t GetY () const ; //* y of current position
86 Double_t GetZ () const ; //* z of current position
87 Double_t GetPx () const ; //* x-compoment of 3-momentum
88 Double_t GetPy () const ; //* y-compoment of 3-momentum
89 Double_t GetPz () const ; //* z-compoment of 3-momentum
90 Double_t GetE () const ; //* energy
91 Double_t GetS () const ; //* decay length / momentum
92 Int_t GetQ () const ; //* charge
93 Double_t GetChi2 () const ; //* chi^2
94 Int_t GetNDF () const ; //* Number of Degrees of Freedom
96 Double_t GetParameter ( int i ) const ;
97 Double_t GetCovariance( int i ) const ;
98 Double_t GetCovariance( int i, int j ) const ;
100 //* Accessors with calculations( &value, &estimated sigma )
101 //* error flag returned (0 means no error during calculations)
103 int GetMomentum ( Double_t &P, Double_t &SigmaP ) const ;
104 int GetMass ( Double_t &M, Double_t &SigmaM ) const ;
105 int GetDecayLength ( Double_t &L, Double_t &SigmaL ) const ;
106 int GetLifeTime ( Double_t &T, Double_t &SigmaT ) const ;
124 Double_t & Parameter ( int i ) ;
125 Double_t & Covariance( int i ) ;
126 Double_t & Covariance( int i, int j ) ;
129 //* CONSTRUCTION OF THE PARTICLE BY ITS DAUGHTERS AND MOTHER
130 //* USING THE KALMAN FILTER METHOD
134 //* Add daughter to the particle
136 void AddDaughter( const AliKFParticle &Daughter );
138 //* Add daughter via += operator: ex.{ D0; D0+=Pion; D0+= Kaon; }
140 void operator +=( const AliKFParticle &Daughter );
142 //* Set production vertex
144 void SetProductionVertex( const AliKFParticle &Vtx );
146 //* Set hard mass constraint
148 void SetMassConstraint( Double_t Mass );
150 //* Everything in one go
152 void Construct( const AliKFParticle *vDaughters[], int NDaughters,
153 const AliKFParticle *ProdVtx=0, Double_t Mass=-1 );
158 //* ( main transportation parameter is S = SignedPath/Momentum )
159 //* ( parameters of decay & production vertices are stored locally )
162 //* Transport the particle to its decay vertex
164 void TransportToDecayVertex();
166 //* Transport the particle to its production vertex
168 void TransportToProductionVertex();
170 //* Transport the particle close to xyz[] point
172 void TransportToPoint( const Double_t xyz[] );
174 //* Transport the particle close to ESD vertex
176 void TransportToVertex( const AliESDVertex &v );
178 //* Transport the particle close to another particle p
180 void TransportToParticle( const AliKFParticle &p );
182 //* Transport the particle on dS parameter (SignedPath/Momentum)
184 void TransportToDS( Double_t dS );
186 //* Get dS to a certain space point
188 Double_t GetDStoPoint( const Double_t xyz[] ) const ;
190 //* Get dS to other particle p (dSp for particle p also returned)
192 void GetDStoParticle( const AliKFParticle &p,
193 Double_t &DS, Double_t &DSp ) const ;
200 //* Calculate distance from another object [cm]
202 Double_t GetDistanceFromVertex( const Double_t vtx[] ) const ;
203 Double_t GetDistanceFromVertex( const AliKFParticle &Vtx ) const ;
204 Double_t GetDistanceFromVertex( const AliESDVertex &Vtx ) const ;
205 Double_t GetDistanceFromParticle( const AliKFParticle &p ) const ;
207 //* Calculate sqrt(Chi2/ndf) deviation from another object
208 //* ( v = [xyz]-vertex, Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix )
210 Double_t GetDeviationFromVertex( const Double_t v[], const Double_t Cv[]=0 ) const ;
211 Double_t GetDeviationFromVertex( const AliKFParticle &Vtx ) const ;
212 Double_t GetDeviationFromVertex( const AliESDVertex &Vtx ) const ;
213 Double_t GetDeviationFromParticle( const AliKFParticle &p ) const ;
215 //* Subtract the particle from the vertex
217 void SubtractFromVertex( AliKFParticle &v ) const ;
218 void SubtractFromVertex( AliESDVertex &v ) const ;
226 //* Method to access ALICE field
228 static Double_t GetFieldAlice();
230 //* Other methods required by the abstract AliKFParticleBase class
232 void GetFieldValue( const Double_t xyz[], Double_t B[] ) const ;
233 void GetDStoParticle( const AliKFParticleBase &p, Double_t &DS, Double_t &DSp )const ;
234 void Transport( Double_t dS, Double_t P[], Double_t C[] ) const ;
235 static void GetExternalTrackParam( const AliKFParticleBase &p, Double_t &X, Double_t &Alpha, Double_t P[5] ) ;
236 void GetDStoParticleALICE( const AliKFParticleBase &p, Double_t &DS, Double_t &DS1 ) const;
240 static Double_t fgBz; //* Bz compoment of the magnetic field
242 ClassDef( AliKFParticle, 1 );
248 //---------------------------------------------------------------------
250 // Inline implementation of the AliKFParticle methods
252 //---------------------------------------------------------------------
255 inline void AliKFParticle::SetField( Double_t Bz )
261 inline AliKFParticle::AliKFParticle( const AliKFParticle &d1,
262 const AliKFParticle &d2 )
264 AliKFParticle mother;
270 inline AliKFParticle::AliKFParticle( const AliKFParticle &d1,
271 const AliKFParticle &d2,
272 const AliKFParticle &d3 )
274 AliKFParticle mother;
281 inline AliKFParticle::AliKFParticle( const AliKFParticle &d1,
282 const AliKFParticle &d2,
283 const AliKFParticle &d3,
284 const AliKFParticle &d4 )
286 AliKFParticle mother;
295 inline void AliKFParticle::Initialize()
297 AliKFParticleBase::Initialize();
300 inline void AliKFParticle::SetVtxGuess( Double_t x, Double_t y, Double_t z )
302 AliKFParticleBase::SetVtxGuess(x,y,z);
305 inline Double_t AliKFParticle::GetX () const
307 return AliKFParticleBase::GetX();
310 inline Double_t AliKFParticle::GetY () const
312 return AliKFParticleBase::GetY();
315 inline Double_t AliKFParticle::GetZ () const
317 return AliKFParticleBase::GetZ();
320 inline Double_t AliKFParticle::GetPx () const
322 return AliKFParticleBase::GetPx();
325 inline Double_t AliKFParticle::GetPy () const
327 return AliKFParticleBase::GetPy();
330 inline Double_t AliKFParticle::GetPz () const
332 return AliKFParticleBase::GetPz();
335 inline Double_t AliKFParticle::GetE () const
337 return AliKFParticleBase::GetE();
340 inline Double_t AliKFParticle::GetS () const
342 return AliKFParticleBase::GetS();
345 inline Int_t AliKFParticle::GetQ () const
347 return AliKFParticleBase::GetQ();
350 inline Double_t AliKFParticle::GetChi2 () const
352 return AliKFParticleBase::GetChi2();
355 inline Int_t AliKFParticle::GetNDF () const
357 return AliKFParticleBase::GetNDF();
360 inline Double_t AliKFParticle::GetParameter ( int i ) const
362 return AliKFParticleBase::GetParameter(i);
365 inline Double_t AliKFParticle::GetCovariance( int i ) const
367 return AliKFParticleBase::GetCovariance(i);
370 inline Double_t AliKFParticle::GetCovariance( int i, int j ) const
372 return AliKFParticleBase::GetCovariance(i,j);
375 inline int AliKFParticle::GetMomentum( Double_t &P, Double_t &SigmaP ) const
377 return AliKFParticleBase::GetMomentum( P, SigmaP );
380 inline int AliKFParticle::GetMass( Double_t &M, Double_t &SigmaM ) const
382 return AliKFParticleBase::GetMass( M, SigmaM );
385 inline int AliKFParticle::GetDecayLength( Double_t &L, Double_t &SigmaL ) const
387 return AliKFParticleBase::GetDecayLength( L, SigmaL );
390 inline int AliKFParticle::GetLifeTime( Double_t &T, Double_t &SigmaT ) const
392 return AliKFParticleBase::GetLifeTime( T, SigmaT );
395 inline Double_t & AliKFParticle::X()
397 return AliKFParticleBase::X();
400 inline Double_t & AliKFParticle::Y()
402 return AliKFParticleBase::Y();
405 inline Double_t & AliKFParticle::Z()
407 return AliKFParticleBase::Z();
410 inline Double_t & AliKFParticle::Px()
412 return AliKFParticleBase::Px();
415 inline Double_t & AliKFParticle::Py()
417 return AliKFParticleBase::Py();
420 inline Double_t & AliKFParticle::Pz()
422 return AliKFParticleBase::Pz();
425 inline Double_t & AliKFParticle::E()
427 return AliKFParticleBase::E();
430 inline Double_t & AliKFParticle::S()
432 return AliKFParticleBase::S();
435 inline Int_t & AliKFParticle::Q()
437 return AliKFParticleBase::Q();
440 inline Double_t & AliKFParticle::Chi2()
442 return AliKFParticleBase::Chi2();
445 inline Int_t & AliKFParticle::NDF()
447 return AliKFParticleBase::NDF();
450 inline Double_t & AliKFParticle::Parameter ( int i )
452 return AliKFParticleBase::Parameter(i);
455 inline Double_t & AliKFParticle::Covariance( int i )
457 return AliKFParticleBase::Covariance(i);
460 inline Double_t & AliKFParticle::Covariance( int i, int j )
462 return AliKFParticleBase::Covariance(i,j);
466 inline void AliKFParticle::operator +=( const AliKFParticle &Daughter )
468 AliKFParticleBase::operator +=( Daughter );
471 //inline AliKFParticle AliKFParticle::operator +( const AliKFParticle &Daughter ) const
479 inline void AliKFParticle::AddDaughter( const AliKFParticle &Daughter )
481 AliKFParticleBase::AddDaughter( Daughter );
484 inline void AliKFParticle::SetProductionVertex( const AliKFParticle &Vtx )
486 AliKFParticleBase::SetProductionVertex( Vtx );
489 inline void AliKFParticle::SetMassConstraint( Double_t Mass )
491 AliKFParticleBase::SetMassConstraint( Mass );
494 inline void AliKFParticle::Construct( const AliKFParticle *vDaughters[], int NDaughters,
495 const AliKFParticle *ProdVtx, Double_t Mass )
497 AliKFParticleBase::Construct( ( const AliKFParticleBase**)vDaughters, NDaughters,
498 ( const AliKFParticleBase*)ProdVtx, Mass );
501 inline void AliKFParticle::TransportToDecayVertex()
503 AliKFParticleBase::TransportToDecayVertex();
506 inline void AliKFParticle::TransportToProductionVertex()
508 AliKFParticleBase::TransportToProductionVertex();
511 inline void AliKFParticle::TransportToPoint( const Double_t xyz[] )
513 TransportToDS( GetDStoPoint(xyz) );
516 inline void AliKFParticle::TransportToVertex( const AliESDVertex &v )
518 TransportToPoint( AliKFParticle(v).fP );
521 inline void AliKFParticle::TransportToParticle( const AliKFParticle &p )
524 GetDStoParticle( p, dS, dSp );
528 inline void AliKFParticle::TransportToDS( Double_t dS )
530 AliKFParticleBase::TransportToDS( dS );
533 inline Double_t AliKFParticle::GetDStoPoint( const Double_t xyz[] ) const
535 return AliKFParticleBase::GetDStoPointBz( GetFieldAlice(), xyz );
539 inline void AliKFParticle::GetDStoParticle( const AliKFParticle &p,
540 Double_t &DS, Double_t &DSp ) const
542 GetDStoParticleALICE( p, DS, DSp );
543 //AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
547 inline Double_t AliKFParticle::GetDistanceFromVertex( const Double_t vtx[] ) const
549 return AliKFParticleBase::GetDistanceFromVertex( vtx );
552 inline Double_t AliKFParticle::GetDeviationFromVertex( const Double_t v[],
553 const Double_t Cv[] ) const
555 return AliKFParticleBase::GetDeviationFromVertex( v, Cv);
558 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliKFParticle &Vtx ) const
560 return AliKFParticleBase::GetDistanceFromVertex( Vtx );
563 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliKFParticle &Vtx ) const
565 return AliKFParticleBase::GetDeviationFromVertex( Vtx );
568 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliESDVertex &Vtx ) const
570 return GetDistanceFromVertex( AliKFParticle(Vtx) );
573 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliESDVertex &Vtx ) const
575 return GetDeviationFromVertex( AliKFParticle(Vtx) );
578 inline Double_t AliKFParticle::GetDistanceFromParticle( const AliKFParticle &p ) const
580 return AliKFParticleBase::GetDistanceFromParticle( p );
583 inline Double_t AliKFParticle::GetDeviationFromParticle( const AliKFParticle &p ) const
585 return AliKFParticleBase::GetDeviationFromParticle( p );
588 inline void AliKFParticle::SubtractFromVertex( AliKFParticle &v ) const
590 AliKFParticleBase::SubtractFromVertex( v.fP, v.fC, v.fChi2, v.fNDF);
593 inline void AliKFParticle::SubtractFromVertex( AliESDVertex &v ) const
595 AliKFParticle vTmp(v);
596 SubtractFromVertex( vTmp );
597 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2, v.GetName() );
600 inline void AliKFParticle::CopyToESDVertex( AliESDVertex &v ) const
602 AliKFParticle vTmp=*this;
603 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2 );
606 inline Double_t AliKFParticle::GetFieldAlice()
611 inline void AliKFParticle::GetFieldValue( const Double_t * /*xyz*/, Double_t B[] ) const
614 B[2] = GetFieldAlice();
617 inline void AliKFParticle::GetDStoParticle( const AliKFParticleBase &p,
618 Double_t &DS, Double_t &DSp )const
620 GetDStoParticleALICE( p, DS, DSp );
621 //AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
624 inline void AliKFParticle::Transport( Double_t dS, Double_t P[], Double_t C[] ) const
626 AliKFParticleBase::TransportBz( GetFieldAlice(), dS, P, C );