9#ifndef GEOPRIMITIVES_GEOPRIMITIVESHELPERS_H
10#define GEOPRIMITIVES_GEOPRIMITIVESHELPERS_H
42 const double dp = std::clamp(v1.dot(v2) / (v1.mag() * v2.mag()), -1. ,1.);
49 float dx = p2.x()-p1.x(), dy = p2.y()-p1.y(), dz = p2.z()-p1.z();
50 return dx*dx + dy*dy + dz*dz;
83 v[0] =
r * sct.
sn *
sc.cs;
84 v[1] =
r * sct.
sn *
sc.sn;
97 double scale =
perp / p;
107 double scale =
mag / p;
114 double dphi = v2.phi() - v1.phi();
117 }
else if (dphi <= -
M_PI) {
123 double a = v1.eta() - v2.eta();
125 return sqrt(
a*
a + b*b);
158 double vx = v.x(), vy = v.y(), vz = v.z();
160 tr(0,0)*vx + tr(0,1)*vy + tr(0,2)*vz + tr(0,3),
161 tr(1,0)*vx + tr(1,1)*vy + tr(1,2)*vz + tr(1,3),
162 tr(2,0)*vx + tr(2,1)*vy + tr(2,2)*vz + tr(2,3));
176 trans.translation() = transl_vec;
196 double xx = rotation(0,0);
197 double yy = rotation(1,1);
198 double zz = rotation(2,2);
200 double cosa = 0.5 * (xx + yy + zz - 1);
201 double cosa1 = 1 - cosa;
208 double x=0,
y=0,
z=0;
209 if (xx > cosa)
x = std::sqrt((xx-cosa)/cosa1);
210 if (yy > cosa)
y = std::sqrt((yy-cosa)/cosa1);
211 if (zz > cosa)
z = std::sqrt((zz-cosa)/cosa1);
212 if (rotation(2,1) < rotation(1,2))
x = -
x;
213 if (rotation(0,2) < rotation(2,0))
y = -
y;
214 if (rotation(1,0) < rotation(0,1))
z = -
z;
215 rotationAngle = (cosa < -1.) ? std::acos(-1.) : std::acos(cosa);
240 t = Eigen::AngleAxis<double>(
angle,axis);
313 const double dirDots = dirA.dot(dirB);
314 const double divisor = (1. - dirDots * dirDots);
315 const AmgVector(N) AminusB = posA - posB;
316 if (std::abs(divisor) < std::numeric_limits<double>::epsilon()) {
317 const AmgVector(N) d = AminusB - dirA.dot(AminusB)*dirA;
318 return std::sqrt(d.dot(d));
320 const AmgVector(N) lineTravel = AminusB.dot(dirA) * dirA -
321 AminusB.dot(dirB) * dirB;
322 return std::sqrt(std::max(0., AminusB.dot(AminusB) - lineTravel.dot(lineTravel) / divisor));
334 const double dirDots = dirA.dot(dirB);
336 if (std::abs(dirDots -1.) < std::numeric_limits<float>::epsilon()){
337 return (AminusB - dirA.dot(AminusB)*dirA).mag();
340 return AminusB.cross(dirB).dot(projDir);
359 const double dirDots = dirA.dot(dirB);
360 const double divisor = (1. - dirDots * dirDots);
362 if (std::abs(divisor) < std::numeric_limits<double>::epsilon())
return std::nullopt;
363 const AmgVector(N) AminusB = posA - posB;
364 return (AminusB.dot(dirB) - AminusB.dot(dirA) * dirDots) / divisor;
372 const double offset) {
376 const double normDot = planeNorm.dot(dir);
377 if (std::abs(normDot) < std::numeric_limits<double>::epsilon())
return std::nullopt;
378 return (offset - pos.dot(planeNorm)) / normDot;
384 for (
unsigned int d = 0; d < 3 ; ++d) {
385 const double defLength = Amg::Vector3D::Unit(d).dot(trans.linear() * Amg::Vector3D::Unit(d));
386 if (std::abs(defLength - 1.) > std::numeric_limits<float>::epsilon()) {
395 trans.translation().mag() < std::numeric_limits<float>::epsilon();
Scalar perp() const
perp method - perpendicular length
Scalar phi() const
phi method
Scalar theta() const
theta method
Scalar mag() const
mag method
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
Definition of ATLAS Math & Geometry primitives (Amg)
Amg::Transform3D getRotateX3D(double angle)
get a rotation transformation around X-axis
void setVector3DCartesian(Amg::Vector3D &v1, double x1, double y1, double z1)
Sets components in cartesian coordinate system.
std::set< Amg::Vector3D, Vector3DComparer > SetVector3D
double mag2Vector3D(const Amg::Vector3D &v1)
Gets magnitude squared of the vector.
Amg::Transform3D getTranslate3D(const double X, const double Y, const double Z)
: Returns a shift transformation along an arbitrary axis
std::optional< double > intersect(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
Calculates the point B' along the line B that's closest to a second line A.
double deltaPhi(const Amg::Vector3D &v1, const Amg::Vector3D &v2)
Eigen::AngleAxisd AngleAxis3D
void setRThetaPhi(Amg::Vector3D &v, double r, double theta, double phi)
sets radius, the theta and phi angle of a vector.
double lineDistance(const AmgVector(N)&posA, const AmgVector(N)&dirA, const AmgVector(N)&posB, const AmgVector(N)&dirB)
: Calculates the shortest distance between two lines
Amg::Vector3D getTranslationVectorFromTransform(const Amg::Transform3D &tr)
Get the Translation vector out of a Transformation.
Eigen::Quaternion< double > Rotation3D
double signedDistance(const Amg::Vector3D &posA, const Amg::Vector3D &dirA, const Amg::Vector3D &posB, const Amg::Vector3D &dirB)
Calculates the signed distance between two lines in 3D space.
double rVector3D(const Amg::Vector3D &v1)
Gets r-component in spherical coordinate system.
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
bool isIdentity(const Amg::Transform3D &trans)
Checks whether the transformation is the Identity transformation.
bool doesNotDeform(const Amg::Transform3D &trans)
Checks whether the linear part of the transformation rotates or stetches any of the basis vectors.
std::set< std::vector< Amg::Vector3D >, VectorVector3DComparer > SetVectorVector3D
Amg::Transform3D getTranslateZ3D(const double Z)
: Returns a shift transformation along the z-axis
Amg::RotationMatrix3D setPhi(Amg::RotationMatrix3D mat, double angle, int convention=0)
void getAngleAxisFromRotation(Amg::RotationMatrix3D &rotation, double &rotationAngle, Amg::Vector3D &rotationAxis)
void setMag(Amg::Vector3D &v, double mag)
scales the vector length without changing the angles
Amg::Vector3D dirFromAngles(const double phi, const double theta)
Constructs a direction vector from the azimuthal & polar angles.
Amg::Transform3D getTransformFromRotTransl(Amg::RotationMatrix3D rot, Amg::Vector3D transl_vec)
double angle(const Amg::Vector3D &v1, const Amg::Vector3D &v2)
calculates the opening angle between two vectors
float distance2(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the squared distance between two point in 3D space
void setPerp(Amg::Vector3D &v, double perp)
scales the vector in the xy plane without changing the z coordinate nor the angles
Amg::Transform3D getTranslateY3D(const double Y)
: Returns a shift transformation along the y-axis
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Eigen::Affine3d Transform3D
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Amg::Transform3D getTranslateX3D(const double X)
: Returns a shift transformation along the x-axis
Amg::Rotation3D getRotation3DfromAngleAxis(double angle, Amg::Vector3D &axis)
get a AngleAxis from an angle and an axis.
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Eigen::Matrix< double, 3, 1 > Vector3D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
double magVector3D(const Amg::Vector3D &v1)
Gets magnitude of the vector.
void setTheta(Amg::Vector3D &v, double theta)
sets the theta of a vector without changing phi nor the magnitude
void setThetaPhi(Amg::Vector3D &v, double theta, double phi)
sets the theta and phi angle of a vector without changing the magnitude
Eigen::Translation< double, 3 > Translation3D
double deltaR(const Amg::Vector3D &v1, const Amg::Vector3D &v2)
Helper to simultaneously calculate sin and cos of the same angle.
Helper to simultaneously calculate sin and cos of the same angle.