18 #include "MathUtils.h"
24 #include "ExHEPUtils/Vectors3.h"
50 double _x, _y, _z, _t;
61 : _x(0), _y(0), _z(0), _t(0) { }
64 P4(
double px,
double py,
double pz,
double E) {
70 : _x(v._x), _y(v._y), _z(v._z), _t(v._t) { }
102 return P4().setPM(
px,
py,
pz, mass);
107 return P4().setEtaPhiME(
eta,
phi, mass, E);
112 return P4().setEtaPhiMPt(
eta,
phi, mass, pt);
117 return P4().setRapPhiME(y,
phi, mass, E);
122 return P4().setRapPhiMPt(y,
phi, mass, pt);
127 return P4().setThetaPhiME(
theta,
phi, mass, E);
132 return P4().setThetaPhiMPt(
theta,
phi, mass, pt);
137 return P4().setPtPhiME(pt,
phi, mass, E);
176 throw std::invalid_argument(
"Negative mass given as argument");
185 throw std::invalid_argument(
"Negative mass given as argument");
199 P4& SetVectM(
const HEP::P3& vec,
double mass)
206 P4& translate_zt(
double dz,
double dt)
238 P4& SetPxPyPzE(
double px,
double py,
double pz,
double mass) {
248 throw std::invalid_argument(
"Negative mass given as argument");
250 throw std::invalid_argument(
"Negative energy given as argument");
251 const double theta = 2 * atan(exp(-
eta));
252 if (theta < 0 || theta > M_PI)
253 throw std::domain_error(
"Polar angle outside 0..pi in calculation");
264 throw std::invalid_argument(
"Negative mass given as argument");
266 throw std::invalid_argument(
"Negative transverse momentum given as argument");
267 const double theta = 2 * atan(exp(-
eta));
268 if (theta < 0 || theta > M_PI)
269 throw std::domain_error(
"Polar angle outside 0..pi in calculation");
270 const double p = pt / sin(
theta);
271 const double E = sqrt(
sqr(
p) +
sqr(mass) );
286 throw std::invalid_argument(
"Negative mass given as argument");
288 throw std::invalid_argument(
"Negative energy given as argument");
289 const double sqrt_pt2_m2 = E / cosh(y);
290 const double pt = sqrt(
sqr(sqrt_pt2_m2) -
sqr(mass) );
292 throw std::domain_error(
"Negative transverse momentum in calculation");
293 const double pz = sqrt_pt2_m2 * sinh(y);
294 const double px = pt * cos(
phi);
295 const double py = pt * sin(
phi);
307 throw std::invalid_argument(
"Negative mass given as argument");
309 throw std::invalid_argument(
"Negative transverse mass given as argument");
310 const double E = sqrt(
sqr(pt) +
sqr(mass) ) * cosh(y);
312 throw std::domain_error(
"Negative energy in calculation");
323 if (theta < 0 || theta > M_PI)
324 throw std::invalid_argument(
"Polar angle outside 0..pi given as argument");
326 throw std::invalid_argument(
"Negative mass given as argument");
328 throw std::invalid_argument(
"Negative energy given as argument");
329 const double p = sqrt(
sqr(E) -
sqr(mass) );
331 const double pt =
p * sin(
theta);
333 throw std::invalid_argument(
"Negative transverse momentum in calculation");
334 const double px = pt * cos(
phi);
335 const double py = pt * sin(
phi);
347 if (theta < 0 || theta > M_PI)
348 throw std::invalid_argument(
"Polar angle outside 0..pi given as argument");
350 throw std::invalid_argument(
"Negative mass given as argument");
352 throw std::invalid_argument(
"Negative transverse momentum given as argument");
353 const double p = pt / sin(
theta);
354 const double px = pt * cos(
phi);
355 const double py = pt * sin(
phi);
367 throw std::invalid_argument(
"Negative transverse momentum given as argument");
369 throw std::invalid_argument(
"Negative mass given as argument");
371 throw std::invalid_argument(
"Negative energy given as argument");
372 const double px = pt * cos(
phi);
373 const double py = pt * sin(
phi);
374 const double pz = sqrt(
sqr(E) -
sqr(mass) -
sqr(pt));
393 double px()
const {
return _x; }
397 double py()
const {
return _y; }
401 double pz()
const {
return _z; }
409 double hm2=
sqr(_t) -
p2();
416 if(hm2 < 0.0)
return 0.0;
421 double M()
const {
return m();}
422 double M2()
const {
return m2();}
423 double X()
const {
return _x; }
425 double Y()
const {
return _y; }
427 double Z()
const {
return _z; }
431 double E()
const {
return _t;}
432 double E2()
const {
return (_t*_t);}
434 double T()
const {
return _t;}
435 double T2()
const {
return E2();}
443 double p()
const {
return sqrt(
p2()); }
445 double P()
const {
return sqrt(
p2()); }
456 double mT2()
const {
return (
sqr(_t) -
sqr(_z));}
458 double mT()
const {
return sqrt(mT2());}
461 double phi()
const {
if (
rho2() == 0)
return 0;
else return atan2(
py(),
px()); }
463 double theta()
const {
if (
p2() == 0)
return 0;
else if (
pz() == 0)
return M_PI;
else return atan2(
rho(),
pz()); }
465 double eta()
const {
return -log(tan( 0.5 *
theta() )); }
469 double rap()
const {
return 0.5 * (E() +
pz()) / (E() -
pz()); }
482 double dot(
const P4& v)
const {
return E()*v.E() -
dot3(v); }
513 P4 operator - ()
const {
P4 rtn;
return rtn.setPE(-_x, -_y, -_z, -_t); }
514 P4& operator += (
const P4& v) { _x += v.px(); _y += v.py(); _z += v.pz(); _t+=v.T() ;
return *
this; }
515 P4& operator -= (
const P4& v) { _x -= v.px(); _y -= v.py(); _z -= v.pz(); _t-=v.T() ;
return *
this; }
516 P4& operator *= (
double a) { _x *= a; _y *= a; _z *= a; _t *= a;
return *
this; }
517 P4& operator /= (
double a) { _x /= a; _y /= a; _z /= a; _t /= a;
return *
this; }
521 P4& Boost(
double bx,
double by,
double bz)
524 double b2 = bx*bx + by*by + bz*bz;
525 double gamma = 1.0 / sqrt(1.0 - b2);
526 double bp = bx*X() + by*
Y() + bz*
Z();
527 double gamma2 = b2 > 0 ? (gamma - 1.0)/b2 : 0.0;
529 setPx(X() + gamma2*bp*bx + gamma*bx*T());
530 setPy(
Y() + gamma2*bp*by + gamma*by*T());
531 setPz(
Z() + gamma2*bp*bz + gamma*bz*T());
532 setE(gamma*(T() + bp));
539 return Boost(b.
px(),b.
py(),b.
pz());
547 P3 Vect()
const {
return P3(
px(),
py(),
pz());}
549 P3 BoostVector()
const {
double t=T();
if (t==0.0)
return P3(0.0,0.0,0.0);
else return P3(
px()/t,
py()/t,
pz()/t); }
551 P4& Rotate(
const double &
angle,
const P3& axis)
554 newmom.Rotate(
angle,axis);
566 std::stringstream ss;
567 ss <<
"(" << p4.
px() <<
", " << p4.
py() <<
", " << p4.
pz() <<
"; " << p4.E() <<
")";
637 inline P4 operator + (
const P4& a,
const P4& b) { P4 rtn = a;
return rtn += b; }
638 inline P4 operator - (
const P4& a,
const P4& b) { P4 rtn = a;
return rtn -= b; }
639 inline P4 operator * (
const P4& a,
double f) { P4 rtn = a;
return rtn *= f; }
640 inline P4 operator * (
double f,
const P4& a) { P4 rtn = a;
return rtn *= f; }
641 inline P4 operator / (
const P4& a,
double f) { P4 rtn = a;
return rtn /= f; }
Definition: Vectors3.h:34
double pz() const
Get pz.
Definition: Vectors3.h:246
double px() const
Get px.
Definition: Vectors3.h:238
double py() const
Get py.
Definition: Vectors3.h:242
A 4-momentum class for vectors.
Definition: Vectors.h:45
static P4 mkThetaPhiMPt(double theta, double phi, double mass, double pt)
Make a vector from (theta,phi,pT) coordinates and the mass.
Definition: Vectors.h:131
double deltaR2_eta(const P4 &v) const
Difference in pseudorapidity-based R^2 between two vectors.
Definition: Vectors.h:492
P4 & setThetaPhiME(double theta, double phi, double mass, double E)
Definition: Vectors.h:322
P4 & setRapPhiMPt(double y, double phi, double mass, double pt)
Definition: Vectors.h:305
double px() const
Get px.
Definition: Vectors.h:393
static P4 mkXYZM(double px, double py, double pz, double mass)
Make a vector from (px,py,pz) coordinates and the mass.
Definition: Vectors.h:101
double p2() const
Get E^2.
Definition: Vectors.h:441
static P4 mkRapPhiME(double y, double phi, double mass, double E)
Make a vector from (y,phi,energy) coordinates and the mass.
Definition: Vectors.h:116
P4 & operator=(const P4 &v)
Copy assignment operator.
Definition: Vectors.h:73
P4 & setPx(double px)
Set the px coordinate.
Definition: Vectors.h:147
double eta() const
Get the spatial vector pseudorapidity.
Definition: Vectors.h:465
double py2() const
Get py^2.
Definition: Vectors.h:395
double m2() const
Get m^2.
Definition: Vectors.h:408
P4 & setPM(double px, double py, double pz, double mass)
Set the p coordinates and mass simultaneously.
Definition: Vectors.h:183
double absrap() const
Get the 4-momentum absolute rapidity.
Definition: Vectors.h:471
static P4 mkEtaPhiME(double eta, double phi, double mass, double E)
Make a vector from (eta,phi,energy) coordinates and the mass.
Definition: Vectors.h:106
double Y() const
Get py^2.
Definition: Vectors.h:425
double theta() const
Get the spatial theta.
Definition: Vectors.h:463
P4 & setPtPhiME(double pt, double phi, double mass, double E)
Definition: Vectors.h:365
static P4 mkRapPhiMPt(double y, double phi, double mass, double pt)
Make a vector from (y,phi,pT) coordinates and the mass.
Definition: Vectors.h:121
static P4 mkXYZE(double px, double py, double pz, double E)
Make a vector from (px,py,pz,E) coordinates.
Definition: Vectors.h:96
P4 & setEtaPhiME(double eta, double phi, double mass, double E)
Definition: Vectors.h:246
P4 & setPz(double pz)
Set the pz coordinate.
Definition: Vectors.h:159
double px2() const
Get px^2.
Definition: Vectors.h:391
double deltaEta(const P4 &v) const
Difference in pseudorapidity between two vectors.
Definition: Vectors.h:488
double pT() const
Get the transverse momentum (same as rho)
Definition: Vectors.h:453
double phi() const
Get the spatial phi.
Definition: Vectors.h:461
double deltaR_eta(const P4 &v) const
Difference in pseudorapidity-based R between two vectors.
Definition: Vectors.h:494
double m() const
Get m.
Definition: Vectors.h:414
static P4 mkPtPhiME(double pt, double phi, double mass, double E)
Make a vector from (pT,phi,energy) coordinates and the mass.
Definition: Vectors.h:136
double rho() const
Get the spatial 3-vector sqrt|px^2 + py^2|.
Definition: Vectors.h:449
P4 & setPE(double px, double py, double pz, double E)
Definition: Vectors.h:224
double pT2() const
Get the transverse momentum squared (same as rho2)
Definition: Vectors.h:451
double pz2() const
Get pz^2.
Definition: Vectors.h:399
double rho2() const
Get the spatial 3-vector |px^2 + py^2|.
Definition: Vectors.h:447
double abseta() const
Get the spatial vector absolute pseudorapidity.
Definition: Vectors.h:467
P4(const P4 &v)
Copy constructor.
Definition: Vectors.h:69
double pz() const
Get pz.
Definition: Vectors.h:401
double Z() const
Get pz^2.
Definition: Vectors.h:427
double dot(const P4 &v) const
Lorentz dot product with the positive metric term on E.
Definition: Vectors.h:482
double dot3(const P4 &v) const
Spatial dot product.
Definition: Vectors.h:480
static P4 mkEtaPhiMPt(double eta, double phi, double mass, double pt)
Make a vector from (eta,phi,pT) coordinates and the mass.
Definition: Vectors.h:111
P4()
Default constructor of a null vector.
Definition: Vectors.h:60
static P4 mkThetaPhiME(double theta, double phi, double mass, double E)
Make a vector from (theta,phi,energy) coordinates and the mass.
Definition: Vectors.h:126
double deltaR2_rap(const P4 &v) const
Difference in rapidity-based R^2 between two vectors.
Definition: Vectors.h:496
P4 & setM(double mass)
Set the mass // Mark: preserve momentum, update energy.
Definition: Vectors.h:174
double deltaRap(const P4 &v) const
Difference in rapidity between two vectors.
Definition: Vectors.h:490
double py() const
Get py.
Definition: Vectors.h:397
P4 & setXYZM(double px, double py, double pz, double mass)
Alias for setPM.
Definition: Vectors.h:191
P4 & setXYZE(double px, double py, double pz, double E)
Alias for setPE.
Definition: Vectors.h:234
double deltaR_rap(const P4 &v) const
Difference in rapidity-based R between two vectors.
Definition: Vectors.h:498
void clear()
Set the components to zero.
Definition: Vectors.h:82
P4(double px, double py, double pz, double E)
Constructor from Cartesian/Minkowski coordinates.
Definition: Vectors.h:64
P4 & setEtaPhiMPt(double eta, double phi, double mass, double pt)
Definition: Vectors.h:262
double deltaPhi(const P4 &v) const
Difference in phi between two vectors.
Definition: Vectors.h:486
P4 & setPy(double py)
Set the py coordinate.
Definition: Vectors.h:153
P4 & setRapPhiME(double y, double phi, double mass, double E)
Definition: Vectors.h:284
double angleTo(const P4 &v) const
Spatial angle to another P4 vector.
Definition: Vectors.h:484
double rap() const
Get the 4-momentum rapidity.
Definition: Vectors.h:469
double p() const
Get the spatial 3-vector |p|.
Definition: Vectors.h:443
double P() const
Get the spatial 3-vector |p|.
Definition: Vectors.h:445
P4 & setThetaPhiMPt(double theta, double phi, double mass, double pt)
Definition: Vectors.h:346
Modified by Mark Goodsell goodsell@lpthe.jussieu.fr
Definition: ATLAS_SUSY_2018_16.cc:27
std::string to_str(const P4 &p4)
Make a string representation of the vector.
Definition: Vectors.h:565
double dot(const P4 &a, const P4 &b)
Convenience "external" functions.
Definition: Vectors.h:584
double deltaR2_eta(const P4 &a, const P4 &b)
Difference in pseudorapidity-based R^2 between two vectors.
Definition: Vectors.h:614
double deltaR_rap(const P4 &a, const P4 &b)
Difference in rapidity-based R between two vectors.
Definition: Vectors.h:628
double deltaR2_rap(const P4 &a, const P4 &b)
Difference in rapidity-based R^2 between two vectors.
Definition: Vectors.h:624
double deltaR_eta(const P4 &a, const P4 &b)
Difference in pseudorapidity-based R between two vectors.
Definition: Vectors.h:618
std::ostream & operator<<(std::ostream &ostr, const P4 &p4)
Write a string representation of the vector to the provided stream.
Definition: Vectors.h:572
double deltaEta(const P4 &a, const P4 &b)
Difference in pseudorapidity between two vectors.
Definition: Vectors.h:602
double deltaPhi(const P4 &a, const P4 &b)
Difference in phi between two vectors.
Definition: Vectors.h:596
double deltaRap(const P4 &a, const P4 &b)
Difference in rapidity between two vectors.
Definition: Vectors.h:608
constexpr std::enable_if< std::is_arithmetic< N1 >::value, N1 >::type sqr(const N1 val)
Convenience function for squaring (better than repeating long expressions/calcs or using intermediate...
Definition: MathUtils.h:45
double angle(const P4 &a, const P4 &b)
Angle between two vectors.
Definition: Vectors.h:590