]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliKFParticle.h
43aa933bcf830ef1f4a60dbd7f6053b8cbae8503
[u/mrichter/AliRoot.git] / STEER / AliKFParticle.h
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
24 class AliExternalTrackParam;
25
26
27 class AliKFParticle :public AliKFParticleBase
28 {
29   
30  public:
31
32   //*
33   //*  INITIALIZATION
34   //*
35
36   //* Set magnetic field for all particles
37   
38   static void SetField( Double_t Bz );
39
40   //* Constructor (empty)
41
42   AliKFParticle():AliKFParticleBase(){} 
43
44   //* Destructor (empty)
45
46   ~AliKFParticle(){}             
47
48   //* Initialisation from ALICE track, PID hypothesis can be provided 
49
50   AliKFParticle( const AliExternalTrackParam &track, Int_t PID = 211 );
51
52   //* Initialisation from ESD vertex 
53
54   AliKFParticle( const AliESDVertex &vertex );
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  
221   static Double_t GetFieldAlice();
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
229  private:
230
231   static Double_t fgBz;  //* Bz compoment of the magnetic field
232
233   ClassDef( AliKFParticle, 3 );
234
235 };
236
237
238
239 //---------------------------------------------------------------------
240 //
241 //     Inline implementation of the AliKFParticle methods
242 //
243 //---------------------------------------------------------------------
244
245
246 inline void AliKFParticle::SetField( Double_t Bz )
247
248   fgBz = Bz;
249 }
250
251 inline void AliKFParticle::Initialize()
252
253   AliKFParticleBase::Initialize(); 
254 }
255
256 inline void AliKFParticle::SetVtxGuess( Double_t x, Double_t y, Double_t z )
257 {
258   AliKFParticleBase::SetVtxGuess(x,y,z);
259 }  
260
261 inline Double_t AliKFParticle::GetX    () const 
262
263   return AliKFParticleBase::GetX();    
264 }
265
266 inline Double_t AliKFParticle::GetY    () const 
267
268   return AliKFParticleBase::GetY();    
269 }
270
271 inline Double_t AliKFParticle::GetZ    () const 
272
273   return AliKFParticleBase::GetZ();    
274 }
275
276 inline Double_t AliKFParticle::GetPx   () const 
277
278   return AliKFParticleBase::GetPx();   
279 }
280
281 inline Double_t AliKFParticle::GetPy   () const 
282
283   return AliKFParticleBase::GetPy();   
284 }
285
286 inline Double_t AliKFParticle::GetPz   () const 
287
288   return AliKFParticleBase::GetPz();   
289 }
290
291 inline Double_t AliKFParticle::GetE    () const 
292
293   return AliKFParticleBase::GetE();    
294 }
295
296 inline Double_t AliKFParticle::GetS    () const 
297
298   return AliKFParticleBase::GetS();    
299 }
300
301 inline Int_t    AliKFParticle::GetQ    () const 
302
303   return AliKFParticleBase::GetQ();    
304 }
305
306 inline Double_t AliKFParticle::GetChi2 () const 
307
308   return AliKFParticleBase::GetChi2(); 
309 }
310
311 inline Int_t    AliKFParticle::GetNDF  () const 
312
313   return AliKFParticleBase::GetNDF();  
314 }
315
316 inline Double_t AliKFParticle::GetParameter ( int i ) const 
317
318   return AliKFParticleBase::GetParameter(i);  
319 }
320
321 inline Double_t AliKFParticle::GetCovariance( int i ) const 
322
323   return AliKFParticleBase::GetCovariance(i); 
324 }
325
326 inline Double_t AliKFParticle::GetCovariance( int i, int j ) const 
327
328   return AliKFParticleBase::GetCovariance(i,j);
329 }
330
331 inline int AliKFParticle::GetMomentum( Double_t &P, Double_t &SigmaP ) const 
332 {
333   return AliKFParticleBase::GetMomentum( P, SigmaP );
334 }
335
336 inline int AliKFParticle::GetMass( Double_t &M, Double_t &SigmaM ) const 
337 {
338   return AliKFParticleBase::GetMass( M, SigmaM );
339 }
340
341 inline int AliKFParticle::GetDecayLength( Double_t &L, Double_t &SigmaL ) const 
342 {
343   return AliKFParticleBase::GetDecayLength( L, SigmaL );
344 }
345
346 inline int AliKFParticle::GetLifeTime( Double_t &T, Double_t &SigmaT ) const 
347 {
348   return AliKFParticleBase::GetLifeTime( T, SigmaT );
349 }
350
351 inline Double_t & AliKFParticle::X() 
352
353   return AliKFParticleBase::X();    
354 }
355
356 inline Double_t & AliKFParticle::Y()
357
358   return AliKFParticleBase::Y();    
359 }
360
361 inline Double_t & AliKFParticle::Z() 
362
363   return AliKFParticleBase::Z();    
364 }
365
366 inline Double_t & AliKFParticle::Px() 
367
368   return AliKFParticleBase::Px();   
369 }
370
371 inline Double_t & AliKFParticle::Py() 
372
373   return AliKFParticleBase::Py();   
374 }
375
376 inline Double_t & AliKFParticle::Pz() 
377
378   return AliKFParticleBase::Pz();   
379 }
380
381 inline Double_t & AliKFParticle::E() 
382
383   return AliKFParticleBase::E();    
384 }
385
386 inline Double_t & AliKFParticle::S() 
387
388   return AliKFParticleBase::S();    
389 }
390
391 inline Int_t    & AliKFParticle::Q() 
392
393   return AliKFParticleBase::Q();    
394 }
395
396 inline Double_t & AliKFParticle::Chi2() 
397
398   return AliKFParticleBase::Chi2(); 
399 }
400
401 inline Int_t    & AliKFParticle::NDF() 
402
403   return AliKFParticleBase::NDF();  
404 }
405
406 inline Double_t & AliKFParticle::Parameter ( int i )        
407
408   return AliKFParticleBase::Parameter(i);
409 }
410
411 inline Double_t & AliKFParticle::Covariance( int i )        
412
413   return AliKFParticleBase::Covariance(i);
414 }
415
416 inline Double_t & AliKFParticle::Covariance( int i, int j ) 
417
418   return AliKFParticleBase::Covariance(i,j); 
419 }
420
421
422 inline void AliKFParticle::operator +=( const AliKFParticle &Daughter )
423 {
424   AliKFParticleBase::operator +=( Daughter );
425 }
426   
427 inline 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
435 inline void AliKFParticle::AddDaughter( const AliKFParticle &Daughter )
436 {
437   AliKFParticleBase::AddDaughter( Daughter );
438 }
439
440 inline void AliKFParticle::SetProductionVertex( const AliKFParticle &Vtx )
441 {
442   AliKFParticleBase::SetProductionVertex( Vtx );
443 }
444
445 inline void AliKFParticle::SetMassConstraint( Double_t Mass )
446 {
447   AliKFParticleBase::SetMassConstraint( Mass );
448 }
449   
450 inline 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
457 inline void AliKFParticle::TransportToDecayVertex()
458
459   AliKFParticleBase::TransportToDecayVertex(); 
460 }
461
462 inline void AliKFParticle::TransportToProductionVertex()
463 {
464   AliKFParticleBase::TransportToProductionVertex();
465 }
466
467 inline void AliKFParticle::TransportToPoint( const Double_t xyz[] )
468
469   TransportToDS( GetDStoPoint(xyz) );
470 }
471
472 inline void AliKFParticle::TransportToVertex( const AliESDVertex &v )
473 {       
474   TransportToPoint( AliKFParticle(v).fP );
475 }
476
477 inline void AliKFParticle::TransportToParticle( const AliKFParticle &p )
478
479   Double_t dS, dSp;
480   GetDStoParticle( p, dS, dSp );
481   TransportToDS( dS );
482 }
483
484 inline void AliKFParticle::TransportToDS( Double_t dS )
485 {
486   AliKFParticleBase::TransportToDS( dS );
487
488
489 inline Double_t AliKFParticle::GetDStoPoint( const Double_t xyz[] ) const 
490 {
491   return AliKFParticleBase::GetDStoPointBz( GetFieldAlice(), xyz );
492 }
493
494   
495 inline void AliKFParticle::GetDStoParticle( const AliKFParticle &p, 
496                                             Double_t &DS, Double_t &DSp ) const 
497 {
498   return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
499 }
500
501
502 inline Double_t AliKFParticle::GetDistanceFromVertex( const Double_t vtx[] ) const
503 {
504   return AliKFParticleBase::GetDistanceFromVertex( vtx );
505 }
506
507 inline Double_t AliKFParticle::GetDeviationFromVertex( const Double_t v[], 
508                                                        const Double_t Cv[] ) const
509 {
510   return AliKFParticleBase::GetDeviationFromVertex( v, Cv);
511 }
512
513 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliKFParticle &Vtx ) const
514 {
515   return AliKFParticleBase::GetDistanceFromVertex( Vtx );
516 }
517
518 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliKFParticle &Vtx ) const
519 {
520   return AliKFParticleBase::GetDeviationFromVertex( Vtx );
521 }
522
523 inline Double_t AliKFParticle::GetDistanceFromVertex( const AliESDVertex &Vtx ) const
524 {
525   return GetDistanceFromVertex( AliKFParticle(Vtx) );
526 }
527
528 inline Double_t AliKFParticle::GetDeviationFromVertex( const AliESDVertex &Vtx ) const
529 {
530   return GetDeviationFromVertex( AliKFParticle(Vtx) );
531 }
532   
533 inline Double_t AliKFParticle::GetDistanceFromParticle( const AliKFParticle &p ) const 
534 {
535   return AliKFParticleBase::GetDistanceFromParticleBz( GetFieldAlice(), p);
536 }
537
538 inline Double_t AliKFParticle::GetDeviationFromParticle( const AliKFParticle &p ) const 
539 {
540   return AliKFParticleBase::GetDeviationFromParticleBz( GetFieldAlice(),p);
541 }
542
543 inline void AliKFParticle::SubtractFromVertex( AliKFParticle &v ) const 
544 {
545   AliKFParticleBase::SubtractFromVertex( v.fP, v.fC, v.fChi2, v.fNDF);
546 }
547
548 inline void AliKFParticle::SubtractFromVertex( AliESDVertex &v ) const 
549 {
550   AliKFParticle vTmp(v);
551   SubtractFromVertex( vTmp );
552   v = AliESDVertex( vTmp.fP, vTmp.fC, vTmp.fChi2, (vTmp.fNDF +3)/2, v.GetName() );
553 }
554  
555 inline 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
561 inline Double_t AliKFParticle::GetFieldAlice()
562
563   return fgBz; 
564 }
565
566 inline void AliKFParticle::GetFieldValue( const Double_t * /*xyz*/, Double_t B[] ) const 
567 {    
568   B[0] = B[1] = 0;
569   B[2] = GetFieldAlice();
570 }
571
572 inline void AliKFParticle::GetDStoParticle( const AliKFParticleBase &p, 
573                                             Double_t &DS, Double_t &DSp )const
574 {
575   return AliKFParticleBase::GetDStoParticleBz( GetFieldAlice(), p, DS,DSp);
576 }
577
578 inline 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