11#ifndef FOURMOMUTILS_P4HELPERS_H
12#define FOURMOMUTILS_P4HELPERS_H
34inline double deltaPhi(
double phiA,
double phiB) {
39template <
class Iterator_t,
class Predicate_t>
40inline void sort(Iterator_t itr, Iterator_t itrEnd, Predicate_t p) {
44 return sort(itr, itrEnd, p);
48template <
class Container_t,
class Predicate_t>
71 const double mom1 = p1.p();
const double pz1 = p1.pz();
72 const double mom2 = p2.p();
const double pz2 = p2.pz();
73 if ( ( mom1 + pz1 ) * ( mom2 - pz2 ) > 0 )
74 dEta = -0.5 * std::log( ( mom1 - pz1 ) / ( mom1 + pz1 )
75 * ( mom2 + pz2 ) / ( mom2 - pz2 ) );
79 const double mom1 = p1.p();
const double pz1 = p1.pz();
81 dEta = -0.5 * std::log( ( mom1 - pz1 ) / ( mom1 + pz1 ) ) - p2.eta();
85 const double mom2 = p2.p();
const double pz2 = p2.pz();
87 dEta = p1.eta() - 0.5 * std::log( ( mom2 + pz2 ) / ( mom2 - pz2 ) );
91 dEta = p1.eta() - p2.eta();
103 const double mom1 = p1.p();
const double pz1 = p1.pz();
104 const double mom2 = p2.p();
const double pz2 = p2.pz();
105 if ( ( mom1 + pz1 ) * ( mom2 - pz2 ) > 0 )
107 dEtaSq = std::log( ( mom1 - pz1 ) / ( mom1 + pz1 )
108 * ( mom2 + pz2 ) / ( mom2 - pz2 ) );
109 dEtaSq = 0.25 * dEtaSq * dEtaSq;
114 const double mom1 = p1.p();
const double pz1 = p1.pz();
115 if ( mom1 + pz1 > 0 )
117 dEtaSq = - 0.5 * std::log( ( mom1 - pz1 ) / ( mom1 + pz1 ) ) - p2.eta();
118 dEtaSq = dEtaSq * dEtaSq;
123 const double mom2 = p2.p();
const double pz2 = p2.pz();
124 if ( mom2 - pz2 > 0 )
126 dEtaSq = p1.eta() - 0.5 * std::log( ( mom2 + pz2 ) / ( mom2 - pz2 ) );
127 dEtaSq = dEtaSq * dEtaSq;
132 dEtaSq = p1.eta() - p2.eta();
133 dEtaSq = dEtaSq * dEtaSq;
159 double xp = pA.
px() * pB.
px() ;
163 xyp1 = 1.0 + pA.
py() * pB.
py() / xp ;
166 dPhi = atan( ( pA.
py() / pA.
px() - pB.
py() / pB.
px() ) / xyp1 );
169 if ( pA.
py() / pA.
px() > 0 )
190 double cosPhi = ( pA.
px() * pB.
px() + pA.
py() * pB.
py() ) / pA.
pt() / pB.
pt();
191 double phi = acos(cosPhi);
197 dPhiSq = dPhiSq * dPhiSq;
212 const double dEta = p4.
eta() -
eta;
214 return sqrt( dEta*dEta + dPhi*dPhi );
224 return sqrt( dEtaSq + dPhiSq );
242 if ( dPhi > dR )
return false;
244 if ( dEta > dR )
return false;
245 const double deltaR2 = dEta*dEta + dPhi*dPhi;
246 if ( deltaR2 > dR*dR )
return false;
253 {
return (pA.
hlv()+pB.
hlv()).m(); }
258 {
return invMass( *pA, *pB ); }
270 {
return invMass( *pA, *pB, *pC, *pD ); }
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
I4Momentum is an abstract base class providing 4-momentum behavior.
virtual CLHEP::HepLorentzVector hlv() const =0
CLHEP HepLorentzVector.
virtual double phi() const =0
phi in [-pi,pi[
virtual double pt() const =0
transverse momentum
virtual double eta() const =0
pseudo rapidity
virtual double px() const =0
x component of momentum
virtual Kind kind() const =0
tells what kind of P4XYZT this is
virtual double py() const =0
y component of momentum
std::vector< std::string > remainder(const std::vector< std::string > &v1, const std::vector< std::string > &v2)
Workaround x86 precision issues for FP inequality comparisons.
P4Helpers provides static helper functions for kinematic calculation on objects deriving from I4Momen...
void sort(Iterator_t itr, Iterator_t itrEnd, Predicate_t p)
sort a container according to the given predicate
double deltaEtaSq(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
double invMass(const I4Momentum &pA, const I4Momentum &pB)
invariant mass from two I4momentum references
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
double deltaR(const I4Momentum &p4, double eta, double phi)
from 1 I4Momentum
bool isInDeltaR(const I4Momentum &p1, const I4Momentum &p2, double dR)
Check if 2 I4Momentum are in a cone.
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
double deltaPhiSq(const I4Momentum &pA, const I4Momentum &pB)
delta Phi squared in range ([-pi,pi[)^2 from two I4momentum references
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.