ROOT logo
//---------------------------------------------------------------------------------
// The AliKFParticleBase class
// .
// @author  S.Gorbunov, I.Kisel, I.Kulakov, M.Zyzak
// @version 1.0
// @since   13.05.07
// 
// Class to reconstruct and store the decayed particle parameters.
// The method is described in CBM-SOFT note 2007-003, 
// ``Reconstruction of decayed particles based on the Kalman filter'', 
// http://www.gsi.de/documents/DOC-2007-May-14-1.pdf
//
// This class describes general mathematics which is used by AliKFParticle class
// 
//  -= Copyright &copy ALICE HLT Group =-
//_________________________________________________________________________________



#ifndef ALIKFPARTICLEBASE_H
#define ALIKFPARTICLEBASE_H

#include "TObject.h"

class AliKFParticleBase :public TObject {
  
 public:

  //*
  //* ABSTRACT METHODS HAVE TO BE DEFINED IN USER CLASS 
  //* 

  //* Virtual method to access the magnetic field

  virtual void GetFieldValue(const Double_t xyz[], Double_t B[]) const = 0;
  
  //* Virtual methods needed for particle transportation 
  //* One can use particular implementations for collider (only Bz component) 
  //* geometry and for fixed-target (CBM-like) geometry which are provided below 
  //* in TRANSPORT section
 
  //* Get dS to xyz[] space point 

  virtual Double_t GetDStoPoint( const Double_t xyz[] ) const = 0;

  //* Get dS to other particle p (dSp for particle p also returned) 

  virtual void GetDStoParticle( const AliKFParticleBase &p, 
				Double_t &DS, Double_t &DSp ) const = 0;
  
  //* Transport on dS value along trajectory, output to P,C

  virtual void Transport( Double_t dS, Double_t P[], Double_t C[] ) const = 0;



  //*
  //*  INITIALIZATION
  //*

  //* Constructor 

  AliKFParticleBase();

  //* Destructor 

  virtual ~AliKFParticleBase() { ; }

 //* Initialisation from "cartesian" coordinates ( X Y Z Px Py Pz )
 //* Parameters, covariance matrix, charge, and mass hypothesis should be provided 

  void Initialize( const Double_t Param[], const Double_t Cov[], Int_t Charge, Double_t Mass );

  //* Initialise covariance matrix and set current parameters to 0.0 

  void Initialize();

  //* Set decay vertex parameters for linearisation 

  void SetVtxGuess( Double_t x, Double_t y, Double_t z );

  //* Set consruction method

  void SetConstructMethod(Int_t m) {fConstructMethod = m;}

  //* Set and get mass hypothesis of the particle
  void SetMassHypo(Double_t m) { fMassHypo = m;}
  const Double_t& GetMassHypo() const { return fMassHypo; }

  //* Returns the sum of masses of the daughters
  const Double_t& GetSumDaughterMass() const {return SumDaughterMass;}

  //*
  //*  ACCESSORS
  //*

  //* Simple accessors 

  Double_t GetX    () const { return fP[0]; }
  Double_t GetY    () const { return fP[1]; }
  Double_t GetZ    () const { return fP[2]; }
  Double_t GetPx   () const { return fP[3]; }
  Double_t GetPy   () const { return fP[4]; }
  Double_t GetPz   () const { return fP[5]; }
  Double_t GetE    () const { return fP[6]; }
  Double_t GetS    () const { return fP[7]; }
  Int_t    GetQ    () const { return fQ;    }
  Double_t GetChi2 () const { return fChi2; }
  Int_t    GetNDF  () const { return fNDF;  }

  const Double_t& X    () const { return fP[0]; }
  const Double_t& Y    () const { return fP[1]; }
  const Double_t& Z    () const { return fP[2]; }
  const Double_t& Px   () const { return fP[3]; }
  const Double_t& Py   () const { return fP[4]; }
  const Double_t& Pz   () const { return fP[5]; }
  const Double_t& E    () const { return fP[6]; }
  const Double_t& S    () const { return fP[7]; }
  const Int_t   & Q    () const { return fQ;    }
  const Double_t& Chi2 () const { return fChi2; }
  const Int_t   & NDF  () const { return fNDF;  }

  
  Double_t GetParameter ( Int_t i )        const { return fP[i];       }
  Double_t GetCovariance( Int_t i )        const { return fC[i];       }
  Double_t GetCovariance( Int_t i, Int_t j ) const { return fC[IJ(i,j)]; }

  //* Accessors with calculations( &value, &estimated sigma )
  //* error flag returned (0 means no error during calculations) 

  Int_t GetMomentum    ( Double_t &P, Double_t &SigmaP ) const ;
  Int_t GetPt          ( Double_t &Pt, Double_t &SigmaPt ) const ;
  Int_t GetEta         ( Double_t &Eta, Double_t &SigmaEta ) const ;
  Int_t GetPhi         ( Double_t &Phi, Double_t &SigmaPhi ) const ;
  Int_t GetMass        ( Double_t &M, Double_t &SigmaM ) const ;
  Int_t GetDecayLength ( Double_t &L, Double_t &SigmaL ) const ;
  Int_t GetDecayLengthXY ( Double_t &L, Double_t &SigmaL ) const ;
  Int_t GetLifeTime    ( Double_t &T, Double_t &SigmaT ) const ;
  Int_t GetR           ( Double_t &R, Double_t &SigmaR ) const ;

  //*
  //*  MODIFIERS
  //*
  
  Double_t & X    () { return fP[0]; }
  Double_t & Y    () { return fP[1]; }
  Double_t & Z    () { return fP[2]; }
  Double_t & Px   () { return fP[3]; }
  Double_t & Py   () { return fP[4]; }
  Double_t & Pz   () { return fP[5]; }
  Double_t & E    () { return fP[6]; }
  Double_t & S    () { return fP[7]; }
  Int_t    & Q    () { return fQ;    }
  Double_t & Chi2 () { return fChi2; }
  Int_t    & NDF  () { return fNDF;  }

  

  Double_t & Parameter ( Int_t i )        { return fP[i];       }
  Double_t & Covariance( Int_t i )        { return fC[i];       }
  Double_t & Covariance( Int_t i, Int_t j ) { return fC[IJ(i,j)]; }


  //* 
  //* CONSTRUCTION OF THE PARTICLE BY ITS DAUGHTERS AND MOTHER
  //* USING THE KALMAN FILTER METHOD
  //*


  //* Simple way to add daughter ex. D0+= Pion; 

  void operator +=( const AliKFParticleBase &Daughter );  

  //* Add daughter track to the particle 

  void AddDaughter( const AliKFParticleBase &Daughter );

  void AddDaughterWithEnergyFit( const AliKFParticleBase &Daughter );
  void AddDaughterWithEnergyCalc( const AliKFParticleBase &Daughter );
  void AddDaughterWithEnergyFitMC( const AliKFParticleBase &Daughter ); //with mass constrained

  //* Set production vertex 

  void SetProductionVertex( const AliKFParticleBase &Vtx );

  //* Set mass constraint 

  void SetNonlinearMassConstraint( Double_t Mass );
  void SetMassConstraint( Double_t Mass, Double_t SigmaMass = 0 );
  
  //* Set no decay length for resonances

  void SetNoDecayLength();


  //* Everything in one go  

  void Construct( const AliKFParticleBase *vDaughters[], Int_t NDaughters, 
		  const AliKFParticleBase *ProdVtx=0,   Double_t Mass=-1, Bool_t IsConstrained=0  );


  //*
  //*                   TRANSPORT
  //* 
  //*  ( main transportation parameter is S = SignedPath/Momentum )
  //*  ( parameters of decay & production vertices are stored locally )
  //*


  //* Transport the particle to its decay vertex 

  void TransportToDecayVertex();

  //* Transport the particle to its production vertex 

  void TransportToProductionVertex();

  //* Transport the particle on dS parameter (SignedPath/Momentum) 

  void TransportToDS( Double_t dS );

  //* Particular extrapolators one can use 

  Double_t GetDStoPointBz( Double_t Bz, const Double_t xyz[] ) const;
  
  void GetDStoParticleBz( Double_t Bz, const AliKFParticleBase &p, 
			  Double_t &dS, Double_t &dS1       ) const ;
 
  // Double_t GetDStoPointCBM( const Double_t xyz[] ) const;
 
   void TransportBz( Double_t Bz, Double_t dS, Double_t P[], Double_t C[] ) const;
   void TransportCBM( Double_t dS, Double_t P[], Double_t C[] ) const;  


  //* 
  //* OTHER UTILITIES
  //*

  //* Calculate distance from another object [cm]

  Double_t GetDistanceFromVertex( const Double_t vtx[] ) const;
  Double_t GetDistanceFromVertex( const AliKFParticleBase &Vtx ) const;
  Double_t GetDistanceFromParticle( const AliKFParticleBase &p ) const;

  //* Calculate sqrt(Chi2/ndf) deviation from vertex
  //* v = [xyz], Cv=[Cxx,Cxy,Cyy,Cxz,Cyz,Czz]-covariance matrix

  Double_t GetDeviationFromVertex( const Double_t v[], 
				   const Double_t Cv[]=0 ) const;
  Double_t GetDeviationFromVertex( const AliKFParticleBase &Vtx ) const;
  Double_t GetDeviationFromParticle( const AliKFParticleBase &p ) const;  

  //* Subtract the particle from the vertex  

  void SubtractFromVertex( AliKFParticleBase &Vtx ) const;

  //* Special method for creating gammas

  void ConstructGammaBz( const AliKFParticleBase &daughter1,
			 const AliKFParticleBase &daughter2, double Bz  );

  //* return parameters for the Armenteros-Podolanski plot
  static void GetArmenterosPodolanski(AliKFParticleBase& positive, AliKFParticleBase& negative, Double_t QtAlfa[2] );

  //* Rotates the KFParticle object around OZ axis, OZ axis is set by the vertex position
  void RotateXY(Double_t angle, Double_t Vtx[3]);

 protected:

  static Int_t IJ( Int_t i, Int_t j ){ 
    return ( j<=i ) ? i*(i+1)/2+j :j*(j+1)/2+i;
  }

  Double_t & Cij( Int_t i, Int_t j ){ return fC[IJ(i,j)]; }

  void Convert( bool ToProduction );
  void TransportLine( Double_t S, Double_t P[], Double_t C[] ) const ;
  Double_t GetDStoPointLine( const Double_t xyz[] ) const;

  static Bool_t InvertSym3( const Double_t A[], Double_t Ainv[] );

  static void MultQSQt( const Double_t Q[], const Double_t S[], 
			Double_t SOut[] );

  static Double_t GetSCorrection( const Double_t Part[], const Double_t XYZ[] );

  void GetMeasurement( const Double_t XYZ[], Double_t m[], Double_t V[] ) const ;

  //* Mass constraint function. is needed for the nonlinear mass constraint and a fit with mass constraint
  void SetMassConstraint( Double_t *mP, Double_t *mC, Double_t mJ[7][7], Double_t mass );

  Double_t fP[8];  //* Main particle parameters {X,Y,Z,Px,Py,Pz,E,S[=DecayLength/P]}
  Double_t fC[36]; //* Low-triangle covariance matrix of fP
  Int_t    fQ;     //* Particle charge 
  Int_t    fNDF;   //* Number of degrees of freedom 
  Double_t fChi2;  //* Chi^2

  Double_t fSFromDecay; //* Distance from decay vertex to current position

  Bool_t fAtProductionVertex; //* Flag shows that the particle error along
                              //* its trajectory is taken from production vertex    

  Double_t fVtxGuess[3];  //* Guess for the position of the decay vertex 
                          //* ( used for linearisation of equations )

  Bool_t fIsLinearized;   //* Flag shows that the guess is present

  Int_t fConstructMethod; //* Determines the method for the particle construction. 
  //* 0 - Energy considered as an independent veriable, fitted independently from momentum, without any constraints on mass
  //* 1 - Energy considered as a dependent variable, calculated from the momentum and mass hypothesis
  //* 2 - Energy considered as an independent variable, fitted independently from momentum, with constraints on mass of daughter particle

  Double_t SumDaughterMass;  //* sum of the daughter particles masses
  Double_t fMassHypo;  //* sum of the daughter particles masses

  ClassDef( AliKFParticleBase, 2);
};

#endif 
 AliKFParticleBase.h:1
 AliKFParticleBase.h:2
 AliKFParticleBase.h:3
 AliKFParticleBase.h:4
 AliKFParticleBase.h:5
 AliKFParticleBase.h:6
 AliKFParticleBase.h:7
 AliKFParticleBase.h:8
 AliKFParticleBase.h:9
 AliKFParticleBase.h:10
 AliKFParticleBase.h:11
 AliKFParticleBase.h:12
 AliKFParticleBase.h:13
 AliKFParticleBase.h:14
 AliKFParticleBase.h:15
 AliKFParticleBase.h:16
 AliKFParticleBase.h:17
 AliKFParticleBase.h:18
 AliKFParticleBase.h:19
 AliKFParticleBase.h:20
 AliKFParticleBase.h:21
 AliKFParticleBase.h:22
 AliKFParticleBase.h:23
 AliKFParticleBase.h:24
 AliKFParticleBase.h:25
 AliKFParticleBase.h:26
 AliKFParticleBase.h:27
 AliKFParticleBase.h:28
 AliKFParticleBase.h:29
 AliKFParticleBase.h:30
 AliKFParticleBase.h:31
 AliKFParticleBase.h:32
 AliKFParticleBase.h:33
 AliKFParticleBase.h:34
 AliKFParticleBase.h:35
 AliKFParticleBase.h:36
 AliKFParticleBase.h:37
 AliKFParticleBase.h:38
 AliKFParticleBase.h:39
 AliKFParticleBase.h:40
 AliKFParticleBase.h:41
 AliKFParticleBase.h:42
 AliKFParticleBase.h:43
 AliKFParticleBase.h:44
 AliKFParticleBase.h:45
 AliKFParticleBase.h:46
 AliKFParticleBase.h:47
 AliKFParticleBase.h:48
 AliKFParticleBase.h:49
 AliKFParticleBase.h:50
 AliKFParticleBase.h:51
 AliKFParticleBase.h:52
 AliKFParticleBase.h:53
 AliKFParticleBase.h:54
 AliKFParticleBase.h:55
 AliKFParticleBase.h:56
 AliKFParticleBase.h:57
 AliKFParticleBase.h:58
 AliKFParticleBase.h:59
 AliKFParticleBase.h:60
 AliKFParticleBase.h:61
 AliKFParticleBase.h:62
 AliKFParticleBase.h:63
 AliKFParticleBase.h:64
 AliKFParticleBase.h:65
 AliKFParticleBase.h:66
 AliKFParticleBase.h:67
 AliKFParticleBase.h:68
 AliKFParticleBase.h:69
 AliKFParticleBase.h:70
 AliKFParticleBase.h:71
 AliKFParticleBase.h:72
 AliKFParticleBase.h:73
 AliKFParticleBase.h:74
 AliKFParticleBase.h:75
 AliKFParticleBase.h:76
 AliKFParticleBase.h:77
 AliKFParticleBase.h:78
 AliKFParticleBase.h:79
 AliKFParticleBase.h:80
 AliKFParticleBase.h:81
 AliKFParticleBase.h:82
 AliKFParticleBase.h:83
 AliKFParticleBase.h:84
 AliKFParticleBase.h:85
 AliKFParticleBase.h:86
 AliKFParticleBase.h:87
 AliKFParticleBase.h:88
 AliKFParticleBase.h:89
 AliKFParticleBase.h:90
 AliKFParticleBase.h:91
 AliKFParticleBase.h:92
 AliKFParticleBase.h:93
 AliKFParticleBase.h:94
 AliKFParticleBase.h:95
 AliKFParticleBase.h:96
 AliKFParticleBase.h:97
 AliKFParticleBase.h:98
 AliKFParticleBase.h:99
 AliKFParticleBase.h:100
 AliKFParticleBase.h:101
 AliKFParticleBase.h:102
 AliKFParticleBase.h:103
 AliKFParticleBase.h:104
 AliKFParticleBase.h:105
 AliKFParticleBase.h:106
 AliKFParticleBase.h:107
 AliKFParticleBase.h:108
 AliKFParticleBase.h:109
 AliKFParticleBase.h:110
 AliKFParticleBase.h:111
 AliKFParticleBase.h:112
 AliKFParticleBase.h:113
 AliKFParticleBase.h:114
 AliKFParticleBase.h:115
 AliKFParticleBase.h:116
 AliKFParticleBase.h:117
 AliKFParticleBase.h:118
 AliKFParticleBase.h:119
 AliKFParticleBase.h:120
 AliKFParticleBase.h:121
 AliKFParticleBase.h:122
 AliKFParticleBase.h:123
 AliKFParticleBase.h:124
 AliKFParticleBase.h:125
 AliKFParticleBase.h:126
 AliKFParticleBase.h:127
 AliKFParticleBase.h:128
 AliKFParticleBase.h:129
 AliKFParticleBase.h:130
 AliKFParticleBase.h:131
 AliKFParticleBase.h:132
 AliKFParticleBase.h:133
 AliKFParticleBase.h:134
 AliKFParticleBase.h:135
 AliKFParticleBase.h:136
 AliKFParticleBase.h:137
 AliKFParticleBase.h:138
 AliKFParticleBase.h:139
 AliKFParticleBase.h:140
 AliKFParticleBase.h:141
 AliKFParticleBase.h:142
 AliKFParticleBase.h:143
 AliKFParticleBase.h:144
 AliKFParticleBase.h:145
 AliKFParticleBase.h:146
 AliKFParticleBase.h:147
 AliKFParticleBase.h:148
 AliKFParticleBase.h:149
 AliKFParticleBase.h:150
 AliKFParticleBase.h:151
 AliKFParticleBase.h:152
 AliKFParticleBase.h:153
 AliKFParticleBase.h:154
 AliKFParticleBase.h:155
 AliKFParticleBase.h:156
 AliKFParticleBase.h:157
 AliKFParticleBase.h:158
 AliKFParticleBase.h:159
 AliKFParticleBase.h:160
 AliKFParticleBase.h:161
 AliKFParticleBase.h:162
 AliKFParticleBase.h:163
 AliKFParticleBase.h:164
 AliKFParticleBase.h:165
 AliKFParticleBase.h:166
 AliKFParticleBase.h:167
 AliKFParticleBase.h:168
 AliKFParticleBase.h:169
 AliKFParticleBase.h:170
 AliKFParticleBase.h:171
 AliKFParticleBase.h:172
 AliKFParticleBase.h:173
 AliKFParticleBase.h:174
 AliKFParticleBase.h:175
 AliKFParticleBase.h:176
 AliKFParticleBase.h:177
 AliKFParticleBase.h:178
 AliKFParticleBase.h:179
 AliKFParticleBase.h:180
 AliKFParticleBase.h:181
 AliKFParticleBase.h:182
 AliKFParticleBase.h:183
 AliKFParticleBase.h:184
 AliKFParticleBase.h:185
 AliKFParticleBase.h:186
 AliKFParticleBase.h:187
 AliKFParticleBase.h:188
 AliKFParticleBase.h:189
 AliKFParticleBase.h:190
 AliKFParticleBase.h:191
 AliKFParticleBase.h:192
 AliKFParticleBase.h:193
 AliKFParticleBase.h:194
 AliKFParticleBase.h:195
 AliKFParticleBase.h:196
 AliKFParticleBase.h:197
 AliKFParticleBase.h:198
 AliKFParticleBase.h:199
 AliKFParticleBase.h:200
 AliKFParticleBase.h:201
 AliKFParticleBase.h:202
 AliKFParticleBase.h:203
 AliKFParticleBase.h:204
 AliKFParticleBase.h:205
 AliKFParticleBase.h:206
 AliKFParticleBase.h:207
 AliKFParticleBase.h:208
 AliKFParticleBase.h:209
 AliKFParticleBase.h:210
 AliKFParticleBase.h:211
 AliKFParticleBase.h:212
 AliKFParticleBase.h:213
 AliKFParticleBase.h:214
 AliKFParticleBase.h:215
 AliKFParticleBase.h:216
 AliKFParticleBase.h:217
 AliKFParticleBase.h:218
 AliKFParticleBase.h:219
 AliKFParticleBase.h:220
 AliKFParticleBase.h:221
 AliKFParticleBase.h:222
 AliKFParticleBase.h:223
 AliKFParticleBase.h:224
 AliKFParticleBase.h:225
 AliKFParticleBase.h:226
 AliKFParticleBase.h:227
 AliKFParticleBase.h:228
 AliKFParticleBase.h:229
 AliKFParticleBase.h:230
 AliKFParticleBase.h:231
 AliKFParticleBase.h:232
 AliKFParticleBase.h:233
 AliKFParticleBase.h:234
 AliKFParticleBase.h:235
 AliKFParticleBase.h:236
 AliKFParticleBase.h:237
 AliKFParticleBase.h:238
 AliKFParticleBase.h:239
 AliKFParticleBase.h:240
 AliKFParticleBase.h:241
 AliKFParticleBase.h:242
 AliKFParticleBase.h:243
 AliKFParticleBase.h:244
 AliKFParticleBase.h:245
 AliKFParticleBase.h:246
 AliKFParticleBase.h:247
 AliKFParticleBase.h:248
 AliKFParticleBase.h:249
 AliKFParticleBase.h:250
 AliKFParticleBase.h:251
 AliKFParticleBase.h:252
 AliKFParticleBase.h:253
 AliKFParticleBase.h:254
 AliKFParticleBase.h:255
 AliKFParticleBase.h:256
 AliKFParticleBase.h:257
 AliKFParticleBase.h:258
 AliKFParticleBase.h:259
 AliKFParticleBase.h:260
 AliKFParticleBase.h:261
 AliKFParticleBase.h:262
 AliKFParticleBase.h:263
 AliKFParticleBase.h:264
 AliKFParticleBase.h:265
 AliKFParticleBase.h:266
 AliKFParticleBase.h:267
 AliKFParticleBase.h:268
 AliKFParticleBase.h:269
 AliKFParticleBase.h:270
 AliKFParticleBase.h:271
 AliKFParticleBase.h:272
 AliKFParticleBase.h:273
 AliKFParticleBase.h:274
 AliKFParticleBase.h:275
 AliKFParticleBase.h:276
 AliKFParticleBase.h:277
 AliKFParticleBase.h:278
 AliKFParticleBase.h:279
 AliKFParticleBase.h:280
 AliKFParticleBase.h:281
 AliKFParticleBase.h:282
 AliKFParticleBase.h:283
 AliKFParticleBase.h:284
 AliKFParticleBase.h:285
 AliKFParticleBase.h:286
 AliKFParticleBase.h:287
 AliKFParticleBase.h:288
 AliKFParticleBase.h:289
 AliKFParticleBase.h:290
 AliKFParticleBase.h:291
 AliKFParticleBase.h:292
 AliKFParticleBase.h:293
 AliKFParticleBase.h:294
 AliKFParticleBase.h:295
 AliKFParticleBase.h:296
 AliKFParticleBase.h:297
 AliKFParticleBase.h:298
 AliKFParticleBase.h:299
 AliKFParticleBase.h:300
 AliKFParticleBase.h:301
 AliKFParticleBase.h:302
 AliKFParticleBase.h:303
 AliKFParticleBase.h:304
 AliKFParticleBase.h:305
 AliKFParticleBase.h:306
 AliKFParticleBase.h:307
 AliKFParticleBase.h:308
 AliKFParticleBase.h:309
 AliKFParticleBase.h:310
 AliKFParticleBase.h:311
 AliKFParticleBase.h:312
 AliKFParticleBase.h:313
 AliKFParticleBase.h:314
 AliKFParticleBase.h:315
 AliKFParticleBase.h:316
 AliKFParticleBase.h:317
 AliKFParticleBase.h:318
 AliKFParticleBase.h:319