#ifndef ALIKFPARTICLEBASE_H
#define ALIKFPARTICLEBASE_H
#include "TObject.h"
class AliKFParticleBase :public TObject {
public:
virtual void GetFieldValue(const Double_t xyz[], Double_t B[]) const = 0;
virtual Double_t GetDStoPoint( const Double_t xyz[] ) const = 0;
virtual void GetDStoParticle( const AliKFParticleBase &p,
Double_t &DS, Double_t &DSp ) const = 0;
virtual void Transport( Double_t dS, Double_t P[], Double_t C[] ) const = 0;
AliKFParticleBase();
virtual ~AliKFParticleBase() { ; }
void Initialize( const Double_t Param[], const Double_t Cov[], Int_t Charge, Double_t Mass );
void Initialize();
void SetVtxGuess( Double_t x, Double_t y, Double_t z );
void SetConstructMethod(Int_t m) {fConstructMethod = m;}
void SetMassHypo(Double_t m) { fMassHypo = m;}
const Double_t& GetMassHypo() const { return fMassHypo; }
const Double_t& GetSumDaughterMass() const {return SumDaughterMass;}
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)]; }
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 ;
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)]; }
void operator +=( const AliKFParticleBase &Daughter );
void AddDaughter( const AliKFParticleBase &Daughter );
void AddDaughterWithEnergyFit( const AliKFParticleBase &Daughter );
void AddDaughterWithEnergyCalc( const AliKFParticleBase &Daughter );
void AddDaughterWithEnergyFitMC( const AliKFParticleBase &Daughter );
void SetProductionVertex( const AliKFParticleBase &Vtx );
void SetNonlinearMassConstraint( Double_t Mass );
void SetMassConstraint( Double_t Mass, Double_t SigmaMass = 0 );
void SetNoDecayLength();
void Construct( const AliKFParticleBase *vDaughters[], Int_t NDaughters,
const AliKFParticleBase *ProdVtx=0, Double_t Mass=-1, Bool_t IsConstrained=0 );
void TransportToDecayVertex();
void TransportToProductionVertex();
void TransportToDS( Double_t dS );
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 ;
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;
Double_t GetDistanceFromVertex( const Double_t vtx[] ) const;
Double_t GetDistanceFromVertex( const AliKFParticleBase &Vtx ) const;
Double_t GetDistanceFromParticle( const AliKFParticleBase &p ) const;
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;
void SubtractFromVertex( AliKFParticleBase &Vtx ) const;
void ConstructGammaBz( const AliKFParticleBase &daughter1,
const AliKFParticleBase &daughter2, double Bz );
static void GetArmenterosPodolanski(AliKFParticleBase& positive, AliKFParticleBase& negative, Double_t QtAlfa[2] );
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 ;
void SetMassConstraint( Double_t *mP, Double_t *mC, Double_t mJ[7][7], Double_t mass );
Double_t fP[8];
Double_t fC[36];
Int_t fQ;
Int_t fNDF;
Double_t fChi2;
Double_t fSFromDecay;
Bool_t fAtProductionVertex;
Double_t fVtxGuess[3];
Bool_t fIsLinearized;
Int_t fConstructMethod;
Double_t SumDaughterMass;
Double_t fMassHypo;
ClassDef( AliKFParticleBase, 2);
};
#endif