]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliKFParticle.h
A new version of the secondary vertex package (S.Gorbunov, I.Kisel)
[u/mrichter/AliRoot.git] / STEER / AliKFParticle.h
CommitLineData
f826d409 1//---------------------------------------------------------------------------------
2// The AliKFParticle class
3// .
4// @author S.Gorbunov, I.Kisel
5// @version 1.0
6// @since 13.05.07
7//
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
12//
13// This class is ALICE interface to general mathematics in AliKFParticleBase
14//
15// -= Copyright &copy ALICE HLT Group =-
16//_________________________________________________________________________________
17
18#ifndef ALIKFPARTICLE_H
19#define ALIKFPARTICLE_H
20
21#include "AliKFParticleBase.h"
22#include "AliESDVertex.h"
23
24class AliExternalTrackParam;
25
26
27class AliKFParticle :public AliKFParticleBase
28{
29
30 public:
31
32 //*
33 //* INITIALIZATION
34 //*
35
4bbc290d 36 //* Set magnetic field for all particles
37
38 static void SetField( Double_t Bz );
39
f826d409 40 //* Constructor (empty)
41
4bbc290d 42 AliKFParticle():AliKFParticleBase(){}
f826d409 43
44 //* Destructor (empty)
45
46 ~AliKFParticle(){}
47
48 //* Initialisation from ALICE track, PID hypothesis can be provided
49
4bbc290d 50 AliKFParticle( const AliExternalTrackParam &track, Int_t PID = 211 );
f826d409 51
52 //* Initialisation from ESD vertex
53
4bbc290d 54 AliKFParticle( const AliESDVertex &vertex );
f826d409 55
56 //* Copy vertex part to ESD vertex
57
58 void CopyToESDVertex( AliESDVertex &Vtx ) const ;
59
60 //* Initialise covariance matrix and set current parameters to 0.0
61
62 void Initialize();
63
64 //* Set decay vertex parameters for linearisation
65
66 void SetVtxGuess( Double_t x, Double_t y, Double_t z );
67
68 //*
69 //* ACCESSORS
70 //*
71
72 //* Simple accessors
73
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
85
86 Double_t GetParameter ( int i ) const ;
87 Double_t GetCovariance( int i ) const ;
88 Double_t GetCovariance( int i, int j ) const ;
89
90 //* Accessors with calculations( &value, &estimated sigma )
91 //* error flag returned (0 means no error during calculations)
92
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 ;
97
98 //*
99 //* MODIFIERS
100 //*
101
102 Double_t & X () ;
103 Double_t & Y () ;
104 Double_t & Z () ;
105 Double_t & Px () ;
106 Double_t & Py () ;
107 Double_t & Pz () ;
108 Double_t & E () ;
109 Double_t & S () ;
110 Int_t & Q () ;
111 Double_t & Chi2 () ;
112 Int_t & NDF () ;
113
114 Double_t & Parameter ( int i ) ;
115 Double_t & Covariance( int i ) ;
116 Double_t & Covariance( int i, int j ) ;
117
118 //*
119 //* CONSTRUCTION OF THE PARTICLE BY ITS DAUGHTERS AND MOTHER
120 //* USING THE KALMAN FILTER METHOD
121 //*
122
123
124 //* Simple way to construct particles ex. D0 = Pion + Kaon;
125
126 AliKFParticle operator +( const AliKFParticle &Daughter ) const;
127
128 void operator +=( const AliKFParticle &Daughter );
129
130 //* Add daughter track to the particle
131
132 void AddDaughter( const AliKFParticle &Daughter );
133
134 //* Set production vertex
135
136 void SetProductionVertex( const AliKFParticle &Vtx );
137
138 //* Set hard mass constraint
139
140 void SetMassConstraint( Double_t Mass );
141
142 //* Everything in one go
143
144 void Construct( const AliKFParticle *vDaughters[], int NDaughters,
145 const AliKFParticle *ProdVtx=0, Double_t Mass=-1 );
146
147 //*
148 //* TRANSPORT
149 //*
150 //* ( main transportation parameter is S = SignedPath/Momentum )
151 //* ( parameters of decay & production vertices are stored locally )
152 //*
153
154 //* Transport the particle to its decay vertex
155
156 void TransportToDecayVertex();
157
158 //* Transport the particle to its production vertex
159
160 void TransportToProductionVertex();
161
162 //* Transport the particle close to xyz[] point
163
164 void TransportToPoint( const Double_t xyz[] );
165
166 //* Transport the particle close to ESD vertex
167
168 void TransportToVertex( const AliESDVertex &v );
169
170 //* Transport the particle close to another particle p
171
172 void TransportToParticle( const AliKFParticle &p );
173
174 //* Transport the particle on dS parameter (SignedPath/Momentum)
175
176 void TransportToDS( Double_t dS );
177
178 //* Get dS to a certain space point
179
180 Double_t GetDStoPoint( const Double_t xyz[] ) const ;
181
182 //* Get dS to other particle p (dSp for particle p also returned)
183
184 void GetDStoParticle( const AliKFParticle &p,
185 Double_t &DS, Double_t &DSp ) const ;
186
187 //*
188 //* OTHER UTILITIES
189 //*
190
191
192 //* Calculate distance from another object [cm]
193
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 ;
198
199 //* Calculate sqrt(Chi2/ndf) deviation from another object
200 //* ( v = [xyz]-vertex, Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix )
201
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 ;
206
207 //* Subtract the particle from the vertex
208
209 void SubtractFromVertex( AliKFParticle &v ) const ;
210 void SubtractFromVertex( AliESDVertex &v ) const ;
211
212
213 protected:
214
215 //*
216 //* INTERNAL STUFF
217 //*
218
219 //* Method to access ALICE field
220
4bbc290d 221 static Double_t GetFieldAlice();
f826d409 222
223 //* Other methods required by the abstract AliKFParticleBase class
224
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 ;
228
4bbc290d 229 private:
230
231 static Double_t fgBz; //* Bz compoment of the magnetic field
f826d409 232
4bbc290d 233 ClassDef( AliKFParticle, 3 );
f826d409 234
235};
236
237
238
239//---------------------------------------------------------------------
240//
241// Inline implementation of the AliKFParticle methods
242//
243//---------------------------------------------------------------------
244
245
4bbc290d 246inline void AliKFParticle::SetField( Double_t Bz )
247{
248 fgBz = Bz;
249}
f826d409 250
251inline void AliKFParticle::Initialize()
252{
253 AliKFParticleBase::Initialize();
254}
255
256inline void AliKFParticle::SetVtxGuess( Double_t x, Double_t y, Double_t z )
257{
258 AliKFParticleBase::SetVtxGuess(x,y,z);
259}
260
261inline Double_t AliKFParticle::GetX () const
262{
263 return AliKFParticleBase::GetX();
264}
265
266inline Double_t AliKFParticle::GetY () const
267{
268 return AliKFParticleBase::GetY();
269}
270
271inline Double_t AliKFParticle::GetZ () const
272{
273 return AliKFParticleBase::GetZ();
274}
275
276inline Double_t AliKFParticle::GetPx () const
277{
278 return AliKFParticleBase::GetPx();
279}
280
281inline Double_t AliKFParticle::GetPy () const
282{
283 return AliKFParticleBase::GetPy();
284}
285
286inline Double_t AliKFParticle::GetPz () const
287{
288 return AliKFParticleBase::GetPz();
289}
290
291inline Double_t AliKFParticle::GetE () const
292{
293 return AliKFParticleBase::GetE();
294}
295
296inline Double_t AliKFParticle::GetS () const
297{
298 return AliKFParticleBase::GetS();
299}
300
301inline Int_t AliKFParticle::GetQ () const
302{
303 return AliKFParticleBase::GetQ();
304}
305
306inline Double_t AliKFParticle::GetChi2 () const
307{
308 return AliKFParticleBase::GetChi2();
309}
310
311inline Int_t AliKFParticle::GetNDF () const
312{
313 return AliKFParticleBase::GetNDF();
314}
315
316inline Double_t AliKFParticle::GetParameter ( int i ) const
317{
318 return AliKFParticleBase::GetParameter(i);
319}
320
321inline Double_t AliKFParticle::GetCovariance( int i ) const
322{
323 return AliKFParticleBase::GetCovariance(i);
324}
325
326inline Double_t AliKFParticle::GetCovariance( int i, int j ) const
327{
328 return AliKFParticleBase::GetCovariance(i,j);
329}
330
331inline int AliKFParticle::GetMomentum( Double_t &P, Double_t &SigmaP ) const
332{
333 return AliKFParticleBase::GetMomentum( P, SigmaP );
334}
335
336inline int AliKFParticle::GetMass( Double_t &M, Double_t &SigmaM ) const
337{
338 return AliKFParticleBase::GetMass( M, SigmaM );
339}
340
341inline int AliKFParticle::GetDecayLength( Double_t &L, Double_t &SigmaL ) const
342{
343 return AliKFParticleBase::GetDecayLength( L, SigmaL );
344}
345
346inline int AliKFParticle::GetLifeTime( Double_t &T, Double_t &SigmaT ) const
347{
348 return AliKFParticleBase::GetLifeTime( T, SigmaT );
349}
350
351inline Double_t & AliKFParticle::X()
352{
353 return AliKFParticleBase::X();
354}
355
356inline Double_t & AliKFParticle::Y()
357{
358 return AliKFParticleBase::Y();
359}
360
361inline Double_t & AliKFParticle::Z()
362{
363 return AliKFParticleBase::Z();
364}
365
366inline Double_t & AliKFParticle::Px()
367{
368 return AliKFParticleBase::Px();
369}
370
371inline Double_t & AliKFParticle::Py()
372{
373 return AliKFParticleBase::Py();
374}
375
376inline Double_t & AliKFParticle::Pz()
377{
378 return AliKFParticleBase::Pz();
379}
380
381inline Double_t & AliKFParticle::E()
382{
383 return AliKFParticleBase::E();
384}
385
386inline Double_t & AliKFParticle::S()
387{
388 return AliKFParticleBase::S();
389}
390
391inline Int_t & AliKFParticle::Q()
392{
393 return AliKFParticleBase::Q();
394}
395
396inline Double_t & AliKFParticle::Chi2()
397{
398 return AliKFParticleBase::Chi2();
399}
400
401inline Int_t & AliKFParticle::NDF()
402{
403 return AliKFParticleBase::NDF();
404}
405
406inline Double_t & AliKFParticle::Parameter ( int i )
407{
408 return AliKFParticleBase::Parameter(i);
409}
410
411inline Double_t & AliKFParticle::Covariance( int i )
412{
413 return AliKFParticleBase::Covariance(i);
414}
415
416inline Double_t & AliKFParticle::Covariance( int i, int j )
417{
418 return AliKFParticleBase::Covariance(i,j);
419}
420
421
422inline void AliKFParticle::operator +=( const AliKFParticle &Daughter )
423{
424 AliKFParticleBase::operator +=( Daughter );
425}
426
427inline AliKFParticle AliKFParticle::operator +( const AliKFParticle &Daughter ) const
428{
429 AliKFParticle tmp;
430 const AliKFParticle *v[2] = {this, &Daughter };
431 tmp.Construct( v,2);
432 return tmp;
433}
434
435inline void AliKFParticle::AddDaughter( const AliKFParticle &Daughter )
436{
437 AliKFParticleBase::AddDaughter( Daughter );
438}
439
440inline void AliKFParticle::SetProductionVertex( const AliKFParticle &Vtx )
441{
442 AliKFParticleBase::SetProductionVertex( Vtx );
443}
444
445inline void AliKFParticle::SetMassConstraint( Double_t Mass )
446{
447 AliKFParticleBase::SetMassConstraint( Mass );
448}
449
450inline void AliKFParticle::Construct( const AliKFParticle *vDaughters[], int NDaughters,
451 const AliKFParticle *ProdVtx, Double_t Mass )
452{
453 AliKFParticleBase::Construct( ( const AliKFParticleBase**)vDaughters, NDaughters,
454 ( const AliKFParticleBase*)ProdVtx, Mass );
455}
456
457inline void AliKFParticle::TransportToDecayVertex()
458{
459 AliKFParticleBase::TransportToDecayVertex();
460}
461
462inline void AliKFParticle::TransportToProductionVertex()
463{
464 AliKFParticleBase::TransportToProductionVertex();
465}
466
467inline void AliKFParticle::TransportToPoint( const Double_t xyz[] )
468{
469 TransportToDS( GetDStoPoint(xyz) );
470}
471
472inline void AliKFParticle::TransportToVertex( const AliESDVertex &v )
473{
4bbc290d 474 TransportToPoint( AliKFParticle(v).fP );
f826d409 475}
476
477inline void AliKFParticle::TransportToParticle( const AliKFParticle &p )
478{
479 Double_t dS, dSp;
480 GetDStoParticle( p, dS, dSp );
481 TransportToDS( dS );
482}
483
484inline void AliKFParticle::TransportToDS( Double_t dS )
485{
486 AliKFParticleBase::TransportToDS( dS );
487}
488
489inline Double_t AliKFParticle::GetDStoPoint( const Double_t xyz[] ) const
490{
491 return AliKFParticleBase::GetDStoPointBz( GetFieldAlice(), xyz );
492}
4bbc290d 493
f826d409 494
495inline void AliKFParticle::GetDStoParticle( const AliKFParticle &p,
4bbc290d 496 Double_t &DS, Double_t &DSp ) const
f826d409 497{
498 return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
499}
500
501
502inline Double_t AliKFParticle::GetDistanceFromVertex( const Double_t vtx[] ) const
503{
504 return AliKFParticleBase::GetDistanceFromVertex( vtx );
505}
506
507inline Double_t AliKFParticle::GetDeviationFromVertex( const Double_t v[],
508 const Double_t Cv[] ) const
509{
510 return AliKFParticleBase::GetDeviationFromVertex( v, Cv);
511}
512
513inline Double_t AliKFParticle::GetDistanceFromVertex( const AliKFParticle &Vtx ) const
514{
515 return AliKFParticleBase::GetDistanceFromVertex( Vtx );
516}
517
518inline Double_t AliKFParticle::GetDeviationFromVertex( const AliKFParticle &Vtx ) const
519{
520 return AliKFParticleBase::GetDeviationFromVertex( Vtx );
521}
522
523inline Double_t AliKFParticle::GetDistanceFromVertex( const AliESDVertex &Vtx ) const
524{
4bbc290d 525 return GetDistanceFromVertex( AliKFParticle(Vtx) );
f826d409 526}
527
528inline Double_t AliKFParticle::GetDeviationFromVertex( const AliESDVertex &Vtx ) const
529{
4bbc290d 530 return GetDeviationFromVertex( AliKFParticle(Vtx) );
f826d409 531}
532
533inline Double_t AliKFParticle::GetDistanceFromParticle( const AliKFParticle &p ) const
534{
535 return AliKFParticleBase::GetDistanceFromParticleBz( GetFieldAlice(), p);
536}
537
538inline Double_t AliKFParticle::GetDeviationFromParticle( const AliKFParticle &p ) const
539{
540 return AliKFParticleBase::GetDeviationFromParticleBz( GetFieldAlice(),p);
541}
542
543inline void AliKFParticle::SubtractFromVertex( AliKFParticle &v ) const
544{
545 AliKFParticleBase::SubtractFromVertex( v.fP, v.fC, v.fChi2, v.fNDF);
546}
547
548inline void AliKFParticle::SubtractFromVertex( AliESDVertex &v ) const
549{
4bbc290d 550 AliKFParticle vTmp(v);
f826d409 551 SubtractFromVertex( vTmp );
552 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2, v.GetName() );
553}
554
555inline void AliKFParticle::CopyToESDVertex( AliESDVertex &v ) const
556{
557 AliKFParticle vTmp=*this;
558 v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2 );
559}
560
4bbc290d 561inline Double_t AliKFParticle::GetFieldAlice()
f826d409 562{
4bbc290d 563 return fgBz;
f826d409 564}
565
566inline void AliKFParticle::GetFieldValue( const Double_t * /*xyz*/, Double_t B[] ) const
567{
568 B[0] = B[1] = 0;
569 B[2] = GetFieldAlice();
570}
571
572inline void AliKFParticle::GetDStoParticle( const AliKFParticleBase &p,
4bbc290d 573 Double_t &DS, Double_t &DSp )const
f826d409 574{
575 return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
576}
577
578inline void AliKFParticle::Transport( Double_t dS, Double_t P[], Double_t C[] ) const
579{
580 AliKFParticleBase::TransportBz( GetFieldAlice(), dS, P, C );
581}
582
583#endif