#ifndef HEP_HepParticle
#define HEP_HepParticle
#ifndef ROOT_TObject
#include <TObject.h>
#endif
#ifndef ROOT_TLorentzVector
#include <TLorentzVector.h>
#endif
#ifndef HEP_HepDatabasePDG
#include <HepDatabasePDG.h>
#endif
#ifndef ROOT_TMath
#include <TMath.h>
#endif
#ifndef ROOT_TMatrixD
#include <TMatrixD.h>
#endif
class HepJet;
class TSystem;
class HepParticle : public TObject {
protected:
Int_t fId;
TLorentzVector fP;
Int_t fPdgCode;
static HepDatabasePDG *fDbasePDG;
private:
Bool_t fCompute;
Float_t fPmag;
Float_t fPt;
Float_t fTheta;
Float_t fCosTheta;
Float_t fPhi;
Float_t fEta;
public:
HepParticle();
HepParticle(Int_t Id, Float_t Px, Float_t Py, Float_t Pz, Float_t E,
Int_t PdgCode);
virtual ~HepParticle();
virtual void Clear(Option_t *option = "");
virtual void Print(Option_t *option = "");
static void PrintHeader();
static void PrintFooter();
Double_t Mass(Option_t *option = "PDG") const;
virtual Int_t Compare(const TObject *obj) const;
const char* GetPdgName() const;
Bool_t HasInvalidPdgCode() const;
Float_t Charge() const;
Float_t DeltaPhi(HepParticle *prt) const;
Float_t DeltaPhi(HepJet *jet) const;
Float_t DeltaEta(HepParticle *prt);
Float_t DeltaEta(HepJet *jet);
Float_t DeltaR(HepParticle *prt);
Float_t DeltaR(HepJet *jet);
Float_t Mperp2() const;
Float_t DeltaPtFrac(HepParticle *prt);
Float_t DeltaPtFrac(HepJet *jet);
Float_t InvDeltaPtFrac(HepParticle *prt);
virtual void GetCovMatrixPtEtaPhi(TMatrixD& CovMatPtEtaPhi) const;
inline Int_t GetId() const { return fId; }
inline Int_t GetPdgCode() const { return fPdgCode; }
inline Bool_t IsPositive() const
{ return ( Charge() > 0. ) ? kTRUE : kFALSE; }
inline Bool_t IsNegative() const
{ return ( Charge() < 0. ) ? kTRUE : kFALSE; }
inline Bool_t IsNeutral() const
{ return ( Charge() == 0. ) ? kTRUE : kFALSE; }
inline virtual Bool_t IsSortable() const { return kTRUE; }
inline Bool_t IsChargedLepton() const {
return ( IsElectron() || IsMuon() || IsTau() ) ? kTRUE : kFALSE;
}
inline Bool_t IsNeutrino() const {
return ( fPdgCode == 12 || fPdgCode == -12 || fPdgCode == 14 || fPdgCode == -14 || fPdgCode == 16 || fPdgCode == -16) ? kTRUE : kFALSE;
return ( IsElectronNeutrino() || IsMuonNeutrino()
|| IsTauNeutrino() ) ? kTRUE : kFALSE;
}
inline Bool_t IsPhoton() const {
return ( fPdgCode == 22 ) ? kTRUE : kFALSE;
}
inline Bool_t IsElectron() const {
return ( fPdgCode == 11 || fPdgCode == -11 ) ? kTRUE : kFALSE;
}
inline Bool_t IsEMinus() const {
return ( fPdgCode == 11 ) ? kTRUE : kFALSE;
}
inline Bool_t IsEPlus() const {
return ( fPdgCode == -11 ) ? kTRUE : kFALSE;
}
inline Bool_t IsElectronNeutrino() const {
return ( fPdgCode == 12 || fPdgCode == -12 ) ? kTRUE : kFALSE;
}
inline Bool_t IsMuon() const {
return ( fPdgCode == 13 || fPdgCode == -13 ) ? kTRUE : kFALSE;
}
inline Bool_t IsMuPlus() const {
return ( fPdgCode == -13 ) ? kTRUE : kFALSE;
}
inline Bool_t IsMuMinus() const {
return ( fPdgCode == 13 ) ? kTRUE : kFALSE;
}
inline Bool_t IsMuonNeutrino() const {
return ( fPdgCode == 14 || fPdgCode == -14 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTau() const {
return ( fPdgCode == 15 || fPdgCode == -15 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTauMinus() const {
return ( fPdgCode == 15 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTauPlus() const {
return ( fPdgCode == - 15 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTauNeutrino() const {
return ( fPdgCode == 16 || fPdgCode == -16 ) ? kTRUE : kFALSE;
}
inline Bool_t IsPion() const {
return ( fPdgCode == 211 || fPdgCode == -211 ) ? kTRUE : kFALSE;
}
inline Bool_t IsPiMinus() const {
return ( fPdgCode == -211 ) ? kTRUE : kFALSE;
}
inline Bool_t IsPiPlus() const {
return ( fPdgCode == 211 ) ? kTRUE : kFALSE;
}
inline Bool_t IsKaon() const {
return ( fPdgCode == 321 || fPdgCode == -321 ) ? kTRUE : kFALSE;
}
inline Bool_t IsProton() const {
return ( fPdgCode == 2212 || fPdgCode == -2212 ) ? kTRUE : kFALSE;
}
inline Bool_t IsKMinus() const {
return ( fPdgCode == -321 ) ? kTRUE : kFALSE;
}
inline Bool_t IsKPlus() const {
return ( fPdgCode == 321 ) ? kTRUE : kFALSE;
}
inline Bool_t IsStringOrCluster() const {
return ( fPdgCode == 91 || fPdgCode == 92 ) ? kTRUE : kFALSE;
}
inline Bool_t IsCharmQuark() const {
return ( fPdgCode == 4 || fPdgCode == -4 ) ? kTRUE : kFALSE;
}
inline Bool_t IsCharm() const {
return ( fPdgCode == 4 ) ? kTRUE : kFALSE;
}
inline Bool_t IsCharmBar() const {
return ( fPdgCode == -4 ) ? kTRUE : kFALSE;
}
inline Bool_t IsBeautyQuark() const {
return ( fPdgCode == 5 || fPdgCode == -5 ) ? kTRUE : kFALSE;
}
inline Bool_t IsBeauty() const {
return ( fPdgCode == 5 ) ? kTRUE : kFALSE;
}
inline Bool_t IsBeautyBar() const {
return ( fPdgCode == -5 ) ? kTRUE : kFALSE;
}
inline Bool_t IsDown() const {
return ( fPdgCode == 1 ) ? kTRUE : kFALSE;
}
inline Bool_t IsDownBar() const {
return ( fPdgCode == -1 ) ? kTRUE : kFALSE;
}
inline Bool_t IsDownQuark() const {
return IsDown() || IsDownBar();
}
inline Bool_t IsUp() const {
return ( fPdgCode == 2 ) ? kTRUE : kFALSE;
}
inline Bool_t IsUpBar() const {
return ( fPdgCode == -2 ) ? kTRUE : kFALSE;
}
inline Bool_t IsUpQuark() const {
return IsUp() || IsUpBar();
}
inline Bool_t IsStrange() const {
return ( fPdgCode == 3 ) ? kTRUE : kFALSE;
}
inline Bool_t IsStrangeBar() const {
return ( fPdgCode == -3 ) ? kTRUE : kFALSE;
}
inline Bool_t IsStrangeQuark() const {
return IsStrange() || IsStrangeBar();
}
inline Bool_t IsTopQuark() const {
return ( fPdgCode == 6 || fPdgCode == -6 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTop() const {
return ( fPdgCode == 6 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTopBar() const {
return ( fPdgCode == -6 ) ? kTRUE : kFALSE;
}
inline Bool_t IsLightQuark() const {
return IsUpQuark() || IsDownQuark() || IsStrangeQuark();
}
inline Bool_t IsQuark() const {
return IsLightQuark() || IsCharmQuark() || IsBeautyQuark() || IsTopQuark();
}
inline Bool_t IsBeautyPrimeQuark() const {
return ( fPdgCode == 7 || fPdgCode == -7 ) ? kTRUE : kFALSE;
}
inline Bool_t IsBeautyPrime() const {
return ( fPdgCode == 7 ) ? kTRUE : kFALSE;
}
inline Bool_t IsBeautyPrimeBar() const {
return ( fPdgCode == -7 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTopPrimeQuark() const {
return ( fPdgCode == 8 || fPdgCode == -8 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTopPrime() const {
return ( fPdgCode == 8 ) ? kTRUE : kFALSE;
}
inline Bool_t IsTopPrimeBar() const {
return ( fPdgCode == -8 ) ? kTRUE : kFALSE;
}
inline Bool_t IsWBoson() const {
return ( fPdgCode == 24 || fPdgCode == -24 ) ? kTRUE : kFALSE;
}
inline Bool_t IsWPlus() const {
return ( fPdgCode == 24 ) ? kTRUE : kFALSE;
}
inline Bool_t IsWMinus() const {
return ( fPdgCode == -24 ) ? kTRUE : kFALSE;
}
inline Bool_t IsZ0Boson() const {
return ( fPdgCode == 23 ) ? kTRUE : kFALSE;
}
inline Double_t M(Option_t *option = "PDG") const {
return Mass(option);
}
inline Float_t Mt2() const {
return fP.Mt2();
}
inline Float_t Mt() const {
return fP.Mt();
}
inline Float_t Mperp() const {
Float_t mperp2 = Mperp2();
return ( mperp2 > 0 ) ? TMath::Sqrt(mperp2)
: -TMath::Sqrt(-mperp2);
}
inline const TLorentzVector& P() const {
return fP;
}
inline TVector3 P3() const {
return fP.Vect();
}
inline Float_t Pmag() {
if ( fCompute ) ComputeTransientVars();
return fPmag;
}
inline Float_t Pt() {
if ( fCompute ) ComputeTransientVars();
return fPt;
}
inline Float_t Px() const {
return fP.Px();
}
inline Float_t Py() const {
return fP.Py();
}
inline Float_t Pz() const {
return fP.Pz();
}
inline Float_t E() const {
return fP.E();
}
inline Float_t Et() const {
return fP.Et();
}
inline Float_t Eta() {
if ( fCompute ) ComputeTransientVars();
return fEta;
}
inline Float_t Phi() {
if ( fCompute ) ComputeTransientVars();
return fPhi;
}
inline Float_t Theta() {
if ( fCompute ) ComputeTransientVars();
return fTheta;
}
inline Float_t CosTheta() {
if ( fCompute ) ComputeTransientVars();
return fCosTheta;
}
inline void SetId(Int_t Id) { fId = Id; }
inline void SetPdgCode(Int_t pdg) { fPdgCode = pdg; }
inline void SetPxPyPzE(Float_t Px, Float_t Py, Float_t Pz,
Float_t E) {
fP.SetPxPyPzE(Px, Py, Pz, E);
ComputeTransientVars();
}
inline void SetPtEtaPhiE(Float_t Pt, Float_t Eta, Float_t Phi,
Float_t E) {
fP.SetPtEtaPhiE(Pt, Eta, Phi, E);
ComputeTransientVars();
}
inline void SetPtEtaPhiM(Float_t Pt, Float_t Eta, Float_t Phi,
Float_t M) {
fP.SetPtEtaPhiM(Pt, Eta, Phi, M);
ComputeTransientVars();
}
void SetP(TLorentzVector const & p) {
fP = p;
ComputeTransientVars();
}
Bool_t operator==(HepParticle Partner);
static void PrintLorentzVector(TLorentzVector vec);
private:
void ComputeTransientVars();
ClassDef(HepParticle,2)
};
#endif