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 //* Initialisation from ALICE track, PID hypothesis can be provided
50 AliKFParticle( const AliExternalTrackParam &track, Int_t PID = 211 );
52 //* Initialisation from ESD vertex
54 AliKFParticle( const AliESDVertex &vertex );
56 //* Copy vertex part to ESD vertex
58 void CopyToESDVertex( AliESDVertex &Vtx ) const ;
60 //* Initialise covariance matrix and set current parameters to 0.0
64 //* Set decay vertex parameters for linearisation
66 void SetVtxGuess( Double_t x, Double_t y, Double_t z );
74 Double_t GetX () const ; //* x of current position
75 Double_t GetY () const ; //* y of current position
76 Double_t GetZ () const ; //* z of current position
77 Double_t GetPx () const ; //* x-compoment of 3-momentum
78 Double_t GetPy () const ; //* y-compoment of 3-momentum
79 Double_t GetPz () const ; //* z-compoment of 3-momentum
80 Double_t GetE () const ; //* energy
81 Double_t GetS () const ; //* decay length / momentum
82 Int_t GetQ () const ; //* charge
83 Double_t GetChi2 () const ; //* chi^2
84 Int_t GetNDF () const ; //* Number of Degrees of Freedom
86 Double_t GetParameter ( int i ) const ;
87 Double_t GetCovariance( int i ) const ;
88 Double_t GetCovariance( int i, int j ) const ;
90 //* Accessors with calculations( &value, &estimated sigma )
91 //* error flag returned (0 means no error during calculations)
93 int GetMomentum ( Double_t &P, Double_t &SigmaP ) const ;
94 int GetMass ( Double_t &M, Double_t &SigmaM ) const ;
95 int GetDecayLength ( Double_t &L, Double_t &SigmaL ) const ;
96 int GetLifeTime ( Double_t &T, Double_t &SigmaT ) const ;
114 Double_t & Parameter ( int i ) ;
115 Double_t & Covariance( int i ) ;
116 Double_t & Covariance( int i, int j ) ;
119 //* CONSTRUCTION OF THE PARTICLE BY ITS DAUGHTERS AND MOTHER
120 //* USING THE KALMAN FILTER METHOD
124 //* Simple way to construct particles ex. D0 = Pion + Kaon;
126 AliKFParticle operator +( const AliKFParticle &Daughter ) const;
128 void operator +=( const AliKFParticle &Daughter );
130 //* Add daughter track to the particle
132 void AddDaughter( const AliKFParticle &Daughter );
134 //* Set production vertex
136 void SetProductionVertex( const AliKFParticle &Vtx );
138 //* Set hard mass constraint
140 void SetMassConstraint( Double_t Mass );
142 //* Everything in one go
144 void Construct( const AliKFParticle *vDaughters[], int NDaughters,
145 const AliKFParticle *ProdVtx=0, Double_t Mass=-1 );
150 //* ( main transportation parameter is S = SignedPath/Momentum )
151 //* ( parameters of decay & production vertices are stored locally )
154 //* Transport the particle to its decay vertex
156 void TransportToDecayVertex();
158 //* Transport the particle to its production vertex
160 void TransportToProductionVertex();
162 //* Transport the particle close to xyz[] point
164 void TransportToPoint( const Double_t xyz[] );
166 //* Transport the particle close to ESD vertex
168 void TransportToVertex( const AliESDVertex &v );
170 //* Transport the particle close to another particle p
172 void TransportToParticle( const AliKFParticle &p );
174 //* Transport the particle on dS parameter (SignedPath/Momentum)
176 void TransportToDS( Double_t dS );
178 //* Get dS to a certain space point
180 Double_t GetDStoPoint( const Double_t xyz[] ) const ;
182 //* Get dS to other particle p (dSp for particle p also returned)
184 void GetDStoParticle( const AliKFParticle &p,
185 Double_t &DS, Double_t &DSp ) const ;
192 //* Calculate distance from another object [cm]
194 Double_t GetDistanceFromVertex( const Double_t vtx[] ) const ;
195 Double_t GetDistanceFromVertex( const AliKFParticle &Vtx ) const ;
196 Double_t GetDistanceFromVertex( const AliESDVertex &Vtx ) const ;
197 Double_t GetDistanceFromParticle( const AliKFParticle &p ) const ;
199 //* Calculate sqrt(Chi2/ndf) deviation from another object
200 //* ( v = [xyz]-vertex, Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix )
202 Double_t GetDeviationFromVertex( const Double_t v[], const Double_t Cv[]=0 ) const ;
203 Double_t GetDeviationFromVertex( const AliKFParticle &Vtx ) const ;
204 Double_t GetDeviationFromVertex( const AliESDVertex &Vtx ) const ;
205 Double_t GetDeviationFromParticle( const AliKFParticle &p ) const ;
207 //* Subtract the particle from the vertex
209 void SubtractFromVertex( AliKFParticle &v ) const ;
210 void SubtractFromVertex( AliESDVertex &v ) const ;
219 //* Method to access ALICE field
221 static Double_t GetFieldAlice();
223 //* Other methods required by the abstract AliKFParticleBase class
225 void GetFieldValue( const Double_t xyz[], Double_t B[] ) const ;
226 void GetDStoParticle( const AliKFParticleBase &p, Double_t &DS, Double_t &DSp )const ;
227 void Transport( Double_t dS, Double_t P[], Double_t C[] ) const ;
231 static Double_t fgBz; //* Bz compoment of the magnetic field
233 ClassDef( AliKFParticle, 3 );
239 //---------------------------------------------------------------------
241 // Inline implementation of the AliKFParticle methods
243 //---------------------------------------------------------------------
246 inline void AliKFParticle::SetField( Double_t Bz )
251 inline void AliKFParticle::Initialize()
253 AliKFParticleBase::Initialize();
256 inline void AliKFParticle::SetVtxGuess( Double_t x, Double_t y, Double_t z )
258 AliKFParticleBase::SetVtxGuess(x,y,z);
261 inline Double_t AliKFParticle::GetX () const
263 return AliKFParticleBase::GetX();
266 inline Double_t AliKFParticle::GetY () const
268 return AliKFParticleBase::GetY();
271 inline Double_t AliKFParticle::GetZ () const
273 return AliKFParticleBase::GetZ();
276 inline Double_t AliKFParticle::GetPx () const
278 return AliKFParticleBase::GetPx();
281 inline Double_t AliKFParticle::GetPy () const
283 return AliKFParticleBase::GetPy();
286 inline Double_t AliKFParticle::GetPz () const
288 return AliKFParticleBase::GetPz();
291 inline Double_t AliKFParticle::GetE () const
293 return AliKFParticleBase::GetE();
296 inline Double_t AliKFParticle::GetS () const
298 return AliKFParticleBase::GetS();
301 inline Int_t AliKFParticle::GetQ () const
303 return AliKFParticleBase::GetQ();
306 inline Double_t AliKFParticle::GetChi2 () const
308 return AliKFParticleBase::GetChi2();
311 inline Int_t AliKFParticle::GetNDF () const
313 return AliKFParticleBase::GetNDF();
316 inline Double_t AliKFParticle::GetParameter ( int i ) const
318 return AliKFParticleBase::GetParameter(i);
321 inline Double_t AliKFParticle::GetCovariance( int i ) const
323 return AliKFParticleBase::GetCovariance(i);
326 inline Double_t AliKFParticle::GetCovariance( int i, int j ) const
328 return AliKFParticleBase::GetCovariance(i,j);
331 inline int AliKFParticle::GetMomentum( Double_t &P, Double_t &SigmaP ) const
333 return AliKFParticleBase::GetMomentum( P, SigmaP );
336 inline int AliKFParticle::GetMass( Double_t &M, Double_t &SigmaM ) const
338 return AliKFParticleBase::GetMass( M, SigmaM );
341 inline int AliKFParticle::GetDecayLength( Double_t &L, Double_t &SigmaL ) const
343 return AliKFParticleBase::GetDecayLength( L, SigmaL );
346 inline int AliKFParticle::GetLifeTime( Double_t &T, Double_t &SigmaT ) const
348 return AliKFParticleBase::GetLifeTime( T, SigmaT );
351 inline Double_t & AliKFParticle::X()
353 return AliKFParticleBase::X();
356 inline Double_t & AliKFParticle::Y()
358 return AliKFParticleBase::Y();
361 inline Double_t & AliKFParticle::Z()
363 return AliKFParticleBase::Z();
366 inline Double_t & AliKFParticle::Px()
368 return AliKFParticleBase::Px();
371 inline Double_t & AliKFParticle::Py()
373 return AliKFParticleBase::Py();
376 inline Double_t & AliKFParticle::Pz()
378 return AliKFParticleBase::Pz();
381 inline Double_t & AliKFParticle::E()
383 return AliKFParticleBase::E();
386 inline Double_t & AliKFParticle::S()
388 return AliKFParticleBase::S();
391 inline Int_t & AliKFParticle::Q()
393 return AliKFParticleBase::Q();
396 inline Double_t & AliKFParticle::Chi2()
398 return AliKFParticleBase::Chi2();
401 inline Int_t & AliKFParticle::NDF()
403 return AliKFParticleBase::NDF();
406 inline Double_t & AliKFParticle::Parameter ( int i )
408 return AliKFParticleBase::Parameter(i);
411 inline Double_t & AliKFParticle::Covariance( int i )
413 return AliKFParticleBase::Covariance(i);
416 inline Double_t & AliKFParticle::Covariance( int i, int j )
418 return AliKFParticleBase::Covariance(i,j);
422 inline void AliKFParticle::operator +=( const AliKFParticle &Daughter )
424 AliKFParticleBase::operator +=( Daughter );
427 inline AliKFParticle AliKFParticle::operator +( const AliKFParticle &Daughter ) const
430 const AliKFParticle *v[2] = {this, &Daughter };
435 inline void AliKFParticle::AddDaughter( const AliKFParticle &Daughter )
437 AliKFParticleBase::AddDaughter( Daughter );
440 inline void AliKFParticle::SetProductionVertex( const AliKFParticle &Vtx )
442 AliKFParticleBase::SetProductionVertex( Vtx );
445 inline void AliKFParticle::SetMassConstraint( Double_t Mass )
447 AliKFParticleBase::SetMassConstraint( Mass );
450 inline void AliKFParticle::Construct( const AliKFParticle *vDaughters[], int NDaughters,
451 const AliKFParticle *ProdVtx, Double_t Mass )
453 AliKFParticleBase::Construct( ( const AliKFParticleBase**)vDaughters, NDaughters,
454 ( const AliKFParticleBase*)ProdVtx, Mass );
457 inline void AliKFParticle::TransportToDecayVertex()
459 AliKFParticleBase::TransportToDecayVertex();
462 inline void AliKFParticle::TransportToProductionVertex()
464 AliKFParticleBase::TransportToProductionVertex();
467 inline void AliKFParticle::TransportToPoint( const Double_t xyz[] )
469 TransportToDS( GetDStoPoint(xyz) );
472 inline void AliKFParticle::TransportToVertex( const AliESDVertex &v )
474 TransportToPoint( AliKFParticle(v).fP );
477 inline void AliKFParticle::TransportToParticle( const AliKFParticle &p )
480 GetDStoParticle( p, dS, dSp );
484 inline void AliKFParticle::TransportToDS( Double_t dS )
486 AliKFParticleBase::TransportToDS( dS );
489 inline Double_t AliKFParticle::GetDStoPoint( const Double_t xyz[] ) const
491 return AliKFParticleBase::GetDStoPointBz( GetFieldAlice(), xyz );
495 inline void AliKFParticle::GetDStoParticle( const AliKFParticle &p,
496 Double_t &DS, Double_t &DSp ) const
498 return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
502 inline Double_t AliKFParticle::GetDistanceFromVertex( const Double_t vtx[] ) const
504 return AliKFParticleBase::GetDistanceFromVertex( vtx );
507 inline Double_t AliKFParticle::GetDeviationFromVertex( const Double_t v[],
508 const Double_t Cv[] ) const
510 return AliKFParticleBase::GetDeviationFromVertex( v, Cv);
513 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliKFParticle &Vtx ) const
515 return AliKFParticleBase::GetDistanceFromVertex( Vtx );
518 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliKFParticle &Vtx ) const
520 return AliKFParticleBase::GetDeviationFromVertex( Vtx );
523 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliESDVertex &Vtx ) const
525 return GetDistanceFromVertex( AliKFParticle(Vtx) );
528 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliESDVertex &Vtx ) const
530 return GetDeviationFromVertex( AliKFParticle(Vtx) );
533 inline Double_t AliKFParticle::GetDistanceFromParticle( const AliKFParticle &p ) const
535 return AliKFParticleBase::GetDistanceFromParticleBz( GetFieldAlice(), p);
538 inline Double_t AliKFParticle::GetDeviationFromParticle( const AliKFParticle &p ) const
540 return AliKFParticleBase::GetDeviationFromParticleBz( GetFieldAlice(),p);
543 inline void AliKFParticle::SubtractFromVertex( AliKFParticle &v ) const
545 AliKFParticleBase::SubtractFromVertex( v.fP, v.fC, v.fChi2, v.fNDF);
548 inline void AliKFParticle::SubtractFromVertex( AliESDVertex &v ) const
550 AliKFParticle vTmp(v);
551 SubtractFromVertex( vTmp );
552 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2, v.GetName() );
555 inline void AliKFParticle::CopyToESDVertex( AliESDVertex &v ) const
557 AliKFParticle vTmp=*this;
558 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2 );
561 inline Double_t AliKFParticle::GetFieldAlice()
566 inline void AliKFParticle::GetFieldValue( const Double_t * /*xyz*/, Double_t B[] ) const
569 B[2] = GetFieldAlice();
572 inline void AliKFParticle::GetDStoParticle( const AliKFParticleBase &p,
573 Double_t &DS, Double_t &DSp )const
575 return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
578 inline void AliKFParticle::Transport( Double_t dS, Double_t P[], Double_t C[] ) const
580 AliKFParticleBase::TransportBz( GetFieldAlice(), dS, P, C );