Getting orthogonal vector using XYZVector

I have seen that TVector3 is now obsolete and we should migrate to XYZVector. While doing that in our code I do not find an equivalent for the TVector3::Orthogonal :confused:

I’m sure @moneta has a solution

Also I am having issues finding a replacement for TVector3::Rotate( Double_t angle, TVector3 axis ) which rotates a given vector by a given angle around a given axis.

I was having a look at the following post that didn’t clarify much

As I said, I think @moneta can help

1 Like

For rotate a vector along an axis and an angle you can use the AxisAngle class.
Here is an examples:

using namespace ROOT::Math;
XYZVector     axis(ax,ay,az);
AxisAngle     rot(axis,angle);
XYZVector originalVector(x,y,z);
XYZVector rotatedVector = rot(originalVector);

For Vector::Orthogonal we don’t have a replacement, I am actually not sure what it is returned, since given a 3D vector, there is an infinite number of orthogonal vectors belonging to the orthogonal plance.


1 Like

Yes, there are infinite ones, it sounds weird but I just need one of them, no matter which one. Just making sure that it is contained in the plane is enough.

The implementation at TVector3.

inline TVector3 TVector3::Orthogonal() const {
   Double_t xx = fX < 0.0 ? -fX : fX;
   Double_t yy = fY < 0.0 ? -fY : fY;
   Double_t zz = fZ < 0.0 ? -fZ : fZ;
   if (xx < yy) {
      return xx < zz ? TVector3(0,fZ,-fY) : TVector3(fY,-fX,0);
   } else {
      return yy < zz ? TVector3(-fZ,0,fX) : TVector3(fY,-fX,0);

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.