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;
26 class AliKFParticle :public AliKFParticleBase
35 //* Set magnetic field for all particles
37 static void SetField( Double_t Bz );
39 //* Constructor (empty)
41 AliKFParticle():AliKFParticleBase(){ ; }
43 //* Destructor (empty)
47 //* Construction of mother particle by its 2-3-4 daughters
49 AliKFParticle( const AliKFParticle &d1, const AliKFParticle &d2 );
51 AliKFParticle( const AliKFParticle &d1, const AliKFParticle &d2,
52 const AliKFParticle &d3 );
54 AliKFParticle( const AliKFParticle &d1, const AliKFParticle &d2,
55 const AliKFParticle &d3, const AliKFParticle &d4 );
57 //* Initialisation from "cartesian" coordinates ( X Y Z Px Py Pz )
58 //* Parameters, covariance matrix, charge and PID hypothesis should be provided
60 void Create( const Double_t Param[], const Double_t Cov[], Int_t Charge, Int_t PID );
62 //* Initialisation from ALICE track, PID hypothesis shoould be provided
64 AliKFParticle( const AliExternalTrackParam &track, Int_t PID );
66 //* Initialisation from ESD vertex
68 AliKFParticle( const AliESDVertex &vertex );
70 //* Copy position part to ESD vertex
72 void CopyToESDVertex( AliESDVertex &Vtx ) const ;
74 //* Initialise covariance matrix and set current parameters to 0.0
78 //* Set decay vertex parameters for linearisation
80 void SetVtxGuess( Double_t x, Double_t y, Double_t z );
88 Double_t GetX () const ; //* x of current position
89 Double_t GetY () const ; //* y of current position
90 Double_t GetZ () const ; //* z of current position
91 Double_t GetPx () const ; //* x-compoment of 3-momentum
92 Double_t GetPy () const ; //* y-compoment of 3-momentum
93 Double_t GetPz () const ; //* z-compoment of 3-momentum
94 Double_t GetE () const ; //* energy
95 Double_t GetS () const ; //* decay length / momentum
96 Int_t GetQ () const ; //* charge
97 Double_t GetChi2 () const ; //* chi^2
98 Int_t GetNDF () const ; //* Number of Degrees of Freedom
100 Double_t GetParameter ( int i ) const ;
101 Double_t GetCovariance( int i ) const ;
102 Double_t GetCovariance( int i, int j ) const ;
104 //* Accessors with calculations, value returned w/o error flag
106 Double_t GetMomentum () const;
107 Double_t GetMass () const;
108 Double_t GetDecayLength () const;
109 Double_t GetLifeTime () const;
111 //* Accessors to estimated errors
113 Double_t GetErrX () const ; //* x of current position
114 Double_t GetErrY () const ; //* y of current position
115 Double_t GetErrZ () const ; //* z of current position
116 Double_t GetErrPx () const ; //* x-compoment of 3-momentum
117 Double_t GetErrPy () const ; //* y-compoment of 3-momentum
118 Double_t GetErrPz () const ; //* z-compoment of 3-momentum
119 Double_t GetErrE () const ; //* energy
120 Double_t GetErrS () const ; //* decay length / momentum
121 Double_t GetErrMomentum () const;
122 Double_t GetErrMass () const;
123 Double_t GetErrDecayLength () const;
124 Double_t GetErrLifeTime () const;
126 //* Accessors with calculations( &value, &estimated sigma )
127 //* error flag returned (0 means no error during calculations)
129 int GetMomentum ( Double_t &P, Double_t &SigmaP ) const ;
130 int GetMass ( Double_t &M, Double_t &SigmaM ) const ;
131 int GetDecayLength ( Double_t &L, Double_t &SigmaL ) const ;
132 int GetLifeTime ( Double_t &T, Double_t &SigmaT ) const ;
151 Double_t & Parameter ( int i ) ;
152 Double_t & Covariance( int i ) ;
153 Double_t & Covariance( int i, int j ) ;
156 //* CONSTRUCTION OF THE PARTICLE BY ITS DAUGHTERS AND MOTHER
157 //* USING THE KALMAN FILTER METHOD
161 //* Add daughter to the particle
163 void AddDaughter( const AliKFParticle &Daughter );
165 //* Add daughter via += operator: ex.{ D0; D0+=Pion; D0+= Kaon; }
167 void operator +=( const AliKFParticle &Daughter );
169 //* Set production vertex
171 void SetProductionVertex( const AliKFParticle &Vtx );
173 //* Set mass constraint
175 void SetMassConstraint( Double_t Mass, Double_t SigmaMass = 0 );
177 //* Set no decay length for resonances
179 void SetNoDecayLength();
181 //* Everything in one go
183 void Construct( const AliKFParticle *vDaughters[], int NDaughters,
184 const AliKFParticle *ProdVtx=0, Double_t Mass=-1 );
189 //* ( main transportation parameter is S = SignedPath/Momentum )
190 //* ( parameters of decay & production vertices are stored locally )
193 //* Transport the particle to its decay vertex
195 void TransportToDecayVertex();
197 //* Transport the particle to its production vertex
199 void TransportToProductionVertex();
201 //* Transport the particle close to xyz[] point
203 void TransportToPoint( const Double_t xyz[] );
205 //* Transport the particle close to ESD vertex
207 void TransportToVertex( const AliESDVertex &v );
209 //* Transport the particle close to another particle p
211 void TransportToParticle( const AliKFParticle &p );
213 //* Transport the particle on dS parameter (SignedPath/Momentum)
215 void TransportToDS( Double_t dS );
217 //* Get dS to a certain space point
219 Double_t GetDStoPoint( const Double_t xyz[] ) const ;
221 //* Get dS to other particle p (dSp for particle p also returned)
223 void GetDStoParticle( const AliKFParticle &p,
224 Double_t &DS, Double_t &DSp ) const ;
226 //* Get dS to other particle p in XY-plane
228 void GetDStoParticleXY( const AliKFParticleBase &p,
229 Double_t &DS, Double_t &DSp ) const ;
236 //* Calculate distance from another object [cm]
238 Double_t GetDistanceFromVertex( const Double_t vtx[] ) const ;
239 Double_t GetDistanceFromVertex( const AliKFParticle &Vtx ) const ;
240 Double_t GetDistanceFromVertex( const AliESDVertex &Vtx ) const ;
241 Double_t GetDistanceFromParticle( const AliKFParticle &p ) const ;
243 //* Calculate sqrt(Chi2/ndf) deviation from another object
244 //* ( v = [xyz]-vertex, Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix )
246 Double_t GetDeviationFromVertex( const Double_t v[], const Double_t Cv[]=0 ) const ;
247 Double_t GetDeviationFromVertex( const AliKFParticle &Vtx ) const ;
248 Double_t GetDeviationFromVertex( const AliESDVertex &Vtx ) const ;
249 Double_t GetDeviationFromParticle( const AliKFParticle &p ) const ;
251 //* Calculate distance from another object [cm] in XY-plane
253 Double_t GetDistanceFromVertexXY( const Double_t vtx[] ) const ;
254 Double_t GetDistanceFromVertexXY( const AliKFParticle &Vtx ) const ;
255 Double_t GetDistanceFromVertexXY( const AliESDVertex &Vtx ) const ;
256 Double_t GetDistanceFromParticleXY( const AliKFParticle &p ) const ;
258 //* Calculate sqrt(Chi2/ndf) deviation from another object in XY plane
259 //* ( v = [xyz]-vertex, Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix )
261 Double_t GetDeviationFromVertexXY( const Double_t v[], const Double_t Cv[]=0 ) const ;
262 Double_t GetDeviationFromVertexXY( const AliKFParticle &Vtx ) const ;
263 Double_t GetDeviationFromVertexXY( const AliESDVertex &Vtx ) const ;
264 Double_t GetDeviationFromParticleXY( const AliKFParticle &p ) const ;
266 //* Calculate opennig angle between two particles
268 Double_t GetAngle ( const AliKFParticle &p ) const ;
269 Double_t GetAngleXY( const AliKFParticle &p ) const ;
270 Double_t GetAngleRZ( const AliKFParticle &p ) const ;
272 //* Subtract the particle from the vertex
274 void SubtractFromVertex( AliKFParticle &v ) const ;
275 void SubtractFromVertex( AliESDVertex &v ) const ;
283 //* Method to access ALICE field
285 static Double_t GetFieldAlice();
287 //* Other methods required by the abstract AliKFParticleBase class
289 void GetFieldValue( const Double_t xyz[], Double_t B[] ) const ;
290 void GetDStoParticle( const AliKFParticleBase &p, Double_t &DS, Double_t &DSp )const ;
291 void Transport( Double_t dS, Double_t P[], Double_t C[] ) const ;
292 static void GetExternalTrackParam( const AliKFParticleBase &p, Double_t &X, Double_t &Alpha, Double_t P[5] ) ;
296 static Double_t fgBz; //* Bz compoment of the magnetic field
298 ClassDef( AliKFParticle, 1 );
304 //---------------------------------------------------------------------
306 // Inline implementation of the AliKFParticle methods
308 //---------------------------------------------------------------------
311 inline void AliKFParticle::SetField( Double_t Bz )
317 inline AliKFParticle::AliKFParticle( const AliKFParticle &d1,
318 const AliKFParticle &d2 )
320 AliKFParticle mother;
326 inline AliKFParticle::AliKFParticle( const AliKFParticle &d1,
327 const AliKFParticle &d2,
328 const AliKFParticle &d3 )
330 AliKFParticle mother;
337 inline AliKFParticle::AliKFParticle( const AliKFParticle &d1,
338 const AliKFParticle &d2,
339 const AliKFParticle &d3,
340 const AliKFParticle &d4 )
342 AliKFParticle mother;
351 inline void AliKFParticle::Initialize()
353 AliKFParticleBase::Initialize();
356 inline void AliKFParticle::SetVtxGuess( Double_t x, Double_t y, Double_t z )
358 AliKFParticleBase::SetVtxGuess(x,y,z);
361 inline Double_t AliKFParticle::GetX () const
363 return AliKFParticleBase::GetX();
366 inline Double_t AliKFParticle::GetY () const
368 return AliKFParticleBase::GetY();
371 inline Double_t AliKFParticle::GetZ () const
373 return AliKFParticleBase::GetZ();
376 inline Double_t AliKFParticle::GetPx () const
378 return AliKFParticleBase::GetPx();
381 inline Double_t AliKFParticle::GetPy () const
383 return AliKFParticleBase::GetPy();
386 inline Double_t AliKFParticle::GetPz () const
388 return AliKFParticleBase::GetPz();
391 inline Double_t AliKFParticle::GetE () const
393 return AliKFParticleBase::GetE();
396 inline Double_t AliKFParticle::GetS () const
398 return AliKFParticleBase::GetS();
401 inline Int_t AliKFParticle::GetQ () const
403 return AliKFParticleBase::GetQ();
406 inline Double_t AliKFParticle::GetChi2 () const
408 return AliKFParticleBase::GetChi2();
411 inline Int_t AliKFParticle::GetNDF () const
413 return AliKFParticleBase::GetNDF();
416 inline Double_t AliKFParticle::GetParameter ( int i ) const
418 return AliKFParticleBase::GetParameter(i);
421 inline Double_t AliKFParticle::GetCovariance( int i ) const
423 return AliKFParticleBase::GetCovariance(i);
426 inline Double_t AliKFParticle::GetCovariance( int i, int j ) const
428 return AliKFParticleBase::GetCovariance(i,j);
432 inline Double_t AliKFParticle::GetMomentum () const
435 if( AliKFParticleBase::GetMomentum( par, err ) ) return 0;
439 inline Double_t AliKFParticle::GetMass () const
442 if( AliKFParticleBase::GetMass( par, err ) ) return 0;
446 inline Double_t AliKFParticle::GetDecayLength () const
449 if( AliKFParticleBase::GetDecayLength( par, err ) ) return 0;
453 inline Double_t AliKFParticle::GetLifeTime () const
456 if( AliKFParticleBase::GetLifeTime( par, err ) ) return 0;
460 inline Double_t AliKFParticle::GetErrX () const
462 return TMath::Sqrt(TMath::Abs( GetCovariance(0,0) ));
465 inline Double_t AliKFParticle::GetErrY () const
467 return TMath::Sqrt(TMath::Abs( GetCovariance(1,1) ));
470 inline Double_t AliKFParticle::GetErrZ () const
472 return TMath::Sqrt(TMath::Abs( GetCovariance(2,2) ));
475 inline Double_t AliKFParticle::GetErrPx () const
477 return TMath::Sqrt(TMath::Abs( GetCovariance(3,3) ));
480 inline Double_t AliKFParticle::GetErrPy () const
482 return TMath::Sqrt(TMath::Abs( GetCovariance(4,4) ));
485 inline Double_t AliKFParticle::GetErrPz () const
487 return TMath::Sqrt(TMath::Abs( GetCovariance(5,5) ));
490 inline Double_t AliKFParticle::GetErrE () const
492 return TMath::Sqrt(TMath::Abs( GetCovariance(6,6) ));
495 inline Double_t AliKFParticle::GetErrS () const
497 return TMath::Sqrt(TMath::Abs( GetCovariance(7,7) ));
500 inline Double_t AliKFParticle::GetErrMomentum () const
503 if( AliKFParticleBase::GetMomentum( par, err ) ) return 1.e10;
507 inline Double_t AliKFParticle::GetErrMass () const
510 if( AliKFParticleBase::GetMass( par, err ) ) return 1.e10;
514 inline Double_t AliKFParticle::GetErrDecayLength () const
517 if( AliKFParticleBase::GetDecayLength( par, err ) ) return 1.e10;
521 inline Double_t AliKFParticle::GetErrLifeTime () const
524 if( AliKFParticleBase::GetLifeTime( par, err ) ) return 1.e10;
529 inline int AliKFParticle::GetMomentum( Double_t &P, Double_t &SigmaP ) const
531 return AliKFParticleBase::GetMomentum( P, SigmaP );
534 inline int AliKFParticle::GetMass( Double_t &M, Double_t &SigmaM ) const
536 return AliKFParticleBase::GetMass( M, SigmaM );
539 inline int AliKFParticle::GetDecayLength( Double_t &L, Double_t &SigmaL ) const
541 return AliKFParticleBase::GetDecayLength( L, SigmaL );
544 inline int AliKFParticle::GetLifeTime( Double_t &T, Double_t &SigmaT ) const
546 return AliKFParticleBase::GetLifeTime( T, SigmaT );
549 inline Double_t & AliKFParticle::X()
551 return AliKFParticleBase::X();
554 inline Double_t & AliKFParticle::Y()
556 return AliKFParticleBase::Y();
559 inline Double_t & AliKFParticle::Z()
561 return AliKFParticleBase::Z();
564 inline Double_t & AliKFParticle::Px()
566 return AliKFParticleBase::Px();
569 inline Double_t & AliKFParticle::Py()
571 return AliKFParticleBase::Py();
574 inline Double_t & AliKFParticle::Pz()
576 return AliKFParticleBase::Pz();
579 inline Double_t & AliKFParticle::E()
581 return AliKFParticleBase::E();
584 inline Double_t & AliKFParticle::S()
586 return AliKFParticleBase::S();
589 inline Int_t & AliKFParticle::Q()
591 return AliKFParticleBase::Q();
594 inline Double_t & AliKFParticle::Chi2()
596 return AliKFParticleBase::Chi2();
599 inline Int_t & AliKFParticle::NDF()
601 return AliKFParticleBase::NDF();
604 inline Double_t & AliKFParticle::Parameter ( int i )
606 return AliKFParticleBase::Parameter(i);
609 inline Double_t & AliKFParticle::Covariance( int i )
611 return AliKFParticleBase::Covariance(i);
614 inline Double_t & AliKFParticle::Covariance( int i, int j )
616 return AliKFParticleBase::Covariance(i,j);
620 inline void AliKFParticle::operator +=( const AliKFParticle &Daughter )
622 AliKFParticleBase::operator +=( Daughter );
626 inline void AliKFParticle::AddDaughter( const AliKFParticle &Daughter )
628 AliKFParticleBase::AddDaughter( Daughter );
631 inline void AliKFParticle::SetProductionVertex( const AliKFParticle &Vtx )
633 AliKFParticleBase::SetProductionVertex( Vtx );
636 inline void AliKFParticle::SetMassConstraint( Double_t Mass, Double_t SigmaMass )
638 AliKFParticleBase::SetMassConstraint( Mass, SigmaMass );
641 inline void AliKFParticle::SetNoDecayLength()
643 AliKFParticleBase::SetNoDecayLength();
646 inline void AliKFParticle::Construct( const AliKFParticle *vDaughters[], int NDaughters,
647 const AliKFParticle *ProdVtx, Double_t Mass )
649 AliKFParticleBase::Construct( ( const AliKFParticleBase**)vDaughters, NDaughters,
650 ( const AliKFParticleBase*)ProdVtx, Mass );
653 inline void AliKFParticle::TransportToDecayVertex()
655 AliKFParticleBase::TransportToDecayVertex();
658 inline void AliKFParticle::TransportToProductionVertex()
660 AliKFParticleBase::TransportToProductionVertex();
663 inline void AliKFParticle::TransportToPoint( const Double_t xyz[] )
665 TransportToDS( GetDStoPoint(xyz) );
668 inline void AliKFParticle::TransportToVertex( const AliESDVertex &v )
670 TransportToPoint( AliKFParticle(v).fP );
673 inline void AliKFParticle::TransportToParticle( const AliKFParticle &p )
676 GetDStoParticle( p, dS, dSp );
680 inline void AliKFParticle::TransportToDS( Double_t dS )
682 AliKFParticleBase::TransportToDS( dS );
685 inline Double_t AliKFParticle::GetDStoPoint( const Double_t xyz[] ) const
687 return AliKFParticleBase::GetDStoPointBz( GetFieldAlice(), xyz );
691 inline void AliKFParticle::GetDStoParticle( const AliKFParticle &p,
692 Double_t &DS, Double_t &DSp ) const
694 GetDStoParticleXY( p, DS, DSp );
698 inline Double_t AliKFParticle::GetDistanceFromVertex( const Double_t vtx[] ) const
700 return AliKFParticleBase::GetDistanceFromVertex( vtx );
703 inline Double_t AliKFParticle::GetDeviationFromVertex( const Double_t v[],
704 const Double_t Cv[] ) const
706 return AliKFParticleBase::GetDeviationFromVertex( v, Cv);
709 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliKFParticle &Vtx ) const
711 return AliKFParticleBase::GetDistanceFromVertex( Vtx );
714 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliKFParticle &Vtx ) const
716 return AliKFParticleBase::GetDeviationFromVertex( Vtx );
719 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliESDVertex &Vtx ) const
721 return GetDistanceFromVertex( AliKFParticle(Vtx) );
724 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliESDVertex &Vtx ) const
726 return GetDeviationFromVertex( AliKFParticle(Vtx) );
729 inline Double_t AliKFParticle::GetDistanceFromParticle( const AliKFParticle &p ) const
731 return AliKFParticleBase::GetDistanceFromParticle( p );
734 inline Double_t AliKFParticle::GetDeviationFromParticle( const AliKFParticle &p ) const
736 return AliKFParticleBase::GetDeviationFromParticle( p );
739 inline void AliKFParticle::SubtractFromVertex( AliKFParticle &v ) const
741 AliKFParticleBase::SubtractFromVertex( v.fP, v.fC, v.fChi2, v.fNDF);
744 inline void AliKFParticle::SubtractFromVertex( AliESDVertex &v ) const
746 AliKFParticle vTmp(v);
747 SubtractFromVertex( vTmp );
748 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2, v.GetName() );
751 inline void AliKFParticle::CopyToESDVertex( AliESDVertex &v ) const
753 AliKFParticle vTmp=*this;
754 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2 );
757 inline Double_t AliKFParticle::GetFieldAlice()
762 inline void AliKFParticle::GetFieldValue( const Double_t * /*xyz*/, Double_t B[] ) const
765 B[2] = GetFieldAlice();
768 inline void AliKFParticle::GetDStoParticle( const AliKFParticleBase &p,
769 Double_t &DS, Double_t &DSp )const
771 GetDStoParticleXY( p, DS, DSp );
774 inline void AliKFParticle::GetDStoParticleXY( const AliKFParticleBase &p,
775 Double_t &DS, Double_t &DSp ) const
777 AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS, DSp ) ;
780 inline void AliKFParticle::Transport( Double_t dS, Double_t P[], Double_t C[] ) const
782 AliKFParticleBase::TransportBz( GetFieldAlice(), dS, P, C );