ATLAS Offline Software
Loading...
Searching...
No Matches
AmgMatrixBasePlugin.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6// AmgMatrixBasePlugin.h, (c) ATLAS Detector software
8
9#ifndef EVENTPRIMITIVES_AMGMATRIXBASEPLUGIN_H
10#define EVENTPRIMITIVES_AMGMATRIXBASEPLUGIN_H
11
12#include <cmath>
13
14
17
18// ------- Methods for 3D vector type objects ---------------------- //
19
21inline const PlainObject unit() const {
22 return (*this).normalized();
23}
24
26inline Scalar mag() const {
27 return (*this).norm();
28}
29
31inline Scalar mag2() const {
32 return (*this).squaredNorm();
33}
34
36inline Scalar perp2() const {
37 constexpr int size = Eigen::MatrixBase<Derived>::SizeAtCompileTime;
38 constexpr int isVector = Eigen::MatrixBase<Derived>::IsVectorAtCompileTime;
39 static_assert(isVector && size>=2, "Method applicable for vectors of size >=2");
40 return ((*this)[0] * (*this)[0] + (*this)[1] * (*this)[1]);
41}
42
44inline Scalar perp() const {
45 constexpr int size = Eigen::MatrixBase<Derived>::SizeAtCompileTime;
46 constexpr int isVector = Eigen::MatrixBase<Derived>::IsVectorAtCompileTime;
47 static_assert(isVector && size>=2, "Method applicable for vectors of size >=2");
48 return std::sqrt(this->perp2());
49}
50
52inline Scalar perp2(const MatrixBase<Derived>& vec) {
53 Scalar tot = vec.mag2();
54 if (tot > 0) {
55 Scalar s = this->dot(vec);
56 return this->mag2() - s * s / tot;
57 }
58 return this->mag2();
59}
60
62inline Scalar perp(const MatrixBase<Derived>& vec) {
63 return std::sqrt(this->perp2(vec));
64}
65
67inline Scalar phi() const {
68 constexpr int size = Eigen::MatrixBase<Derived>::SizeAtCompileTime;
69 constexpr int isVector = Eigen::MatrixBase<Derived>::IsVectorAtCompileTime;
70 static_assert(isVector && size>=2, "Method applicable for vectors of size >=2");
71 return std::atan2((*this)[1], (*this)[0]);
72}
73
75inline Scalar theta() const {
76 constexpr int size = Eigen::MatrixBase<Derived>::SizeAtCompileTime;
77 constexpr int isVector = Eigen::MatrixBase<Derived>::IsVectorAtCompileTime;
78 static_assert(isVector && size>=3, "Method applicable for vectors of size >=3");
79 return std::atan2(this->perp(), (*this)[2]);
80}
81
83inline Scalar eta() const {
84 constexpr int size = Eigen::MatrixBase<Derived>::SizeAtCompileTime;
85 constexpr int isVector = Eigen::MatrixBase<Derived>::IsVectorAtCompileTime;
86 static_assert(isVector && size>=3, "Method applicable for vectors of size >=3");
87 const Scalar rho2 = (*this).x() * (*this).x() + (*this).y() * (*this).y();
88 const Scalar z = (*this).z();
89 const Scalar z2 = z * z;
90 constexpr Scalar epsilon = 2. * std::numeric_limits<Scalar>::epsilon();
91 // avoid magnitude being parallel to z
92 if (rho2 > z2 * epsilon) {
93 const double m = std::sqrt(rho2 + z2);
94 return 0.5 * std::log((m + z) / (m - z));
95 }
96 if (z == 0) {
97 return 0.0;
98 }
99 // Following math/genvector/inc/Math/GenVector/etaMax.h in ROOT 6.26
100 constexpr Scalar s_etaMax = static_cast<Scalar>(22756.0);
101 // Following math/genvector/inc/Math/GenVector/eta.h in ROOT 6.26
102 return (z > 0) ? z + s_etaMax : z - s_etaMax;
103}
104
105inline Scalar deltaR(const MatrixBase<Derived>& vec) const {
106 //we assert in eta/phi methods
107 double a = this->eta() - vec.eta();
108 double b = this->deltaPhi(vec);
109 return std::sqrt(a * a + b * b);
110}
111
112inline Scalar deltaPhi(const MatrixBase<Derived>& vec) const {
113 //we assert in eta/phi methods
114 double dphi = vec.phi() - this->phi();
115 if (dphi > M_PI) {
116 dphi -= M_PI * 2;
117 } else if (dphi <= -M_PI) {
118 dphi += M_PI * 2;
119 }
120 return dphi;
121}
122
124inline void fillSymmetric(size_t i, size_t j, Scalar value) {
125 (*this)(i, j) = value;
126 (*this)(j, i) = value;
127}
128
130template <typename OtherDerived>
131inline Matrix<Scalar, OtherDerived::RowsAtCompileTime,
132 OtherDerived::RowsAtCompileTime>
133similarity(const MatrixBase<OtherDerived>& m) const {
134 return m * (this->derived() * m.transpose());
135}
136
138template <typename OtherDerived>
139inline Matrix<Scalar, OtherDerived::RowsAtCompileTime,
140 OtherDerived::RowsAtCompileTime>
141similarityT(const MatrixBase<OtherDerived>& m) const {
142 return m.transpose() * (this->derived() * m);
143}
144
145#endif
#define M_PI
Scalar eta() const
pseudorapidity method
Matrix< Scalar, OtherDerived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime > similarityT(const MatrixBase< OtherDerived > &m) const
similarityT method : yields ms = m^T*s*m
Scalar perp2() const
perp2 method - perpendicular length squared
Scalar perp() const
perp method - perpendicular length
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
Scalar deltaR(const MatrixBase< Derived > &vec) const
Scalar phi() const
phi method
Scalar theta() const
theta method
Scalar mag() const
mag method
Scalar mag2() const
mag2 method - forward to squaredNorm()
Matrix< Scalar, OtherDerived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime > similarity(const MatrixBase< OtherDerived > &m) const
similarity method : yields ms = m*s*m^T
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
void fillSymmetric(size_t i, size_t j, Scalar value)
method to fill elements for a symmetric matrix
std::vector< size_t > vec
static Double_t a
#define z
Definition dot.py:1