// Example macro testing available methods and operation of the GenVector classes. // The results are compared and check at the // numerical precision levels. // Some small discrepancy can appear when the macro // is executed on different architectures where it has been calibrated (Power PC G5) // The macro is divided in 4 parts: // - testVector3D : tests of the 3D Vector classes // - testPoint3D : tests of the 3D Point classes // - testLorentzVector : tests of the 4D LorentzVector classes // - testVectorUtil : tests of the utility functions of all the vector classes // // To execute the macro type in: // // root[0]: .x mathcoreGenVector.C //Author: Lorenzo Moneta #include "TMatrixD.h" #include "TVectorD.h" #include "TMath.h" #ifndef __CINT__ #include "Math/Point3D.h" #include "Math/Vector3D.h" #include "Math/Vector4D.h" #include "Math/Rotation3D.h" #include "Math/EulerAngles.h" #include "Math/AxisAngle.h" #include "Math/Quaternion.h" #include "Math/RotationX.h" #include "Math/RotationY.h" #include "Math/RotationZ.h" #include "Math/RotationZYX.h" #include "Math/LorentzRotation.h" #include "Math/Boost.h" #include "Math/BoostX.h" #include "Math/BoostY.h" #include "Math/BoostZ.h" #include "Math/Transform3D.h" #include "Math/Plane3D.h" #include "Math/VectorUtil.h" using namespace ROOT::Math; #endif int ntest = 0; int nfail = 0; int ok = 0; int compare( double v1, double v2, const char* name, double Scale = 1.0) { ntest = ntest + 1; // numerical double limit for epsilon double eps = Scale* 2.22044604925031308e-16; int iret = 0; double delta = v2 - v1; double d = 0; if (delta < 0 ) delta = - delta; if (v1 == 0 || v2 == 0) { if (delta > eps ) { iret = 1; } } // skip case v1 or v2 is infinity else { d = v1; if ( v1 < 0) d = -d; // add also case when delta is small by default if ( delta/d > eps && delta > eps ) iret = 1; } if (iret == 0) std::cout << "."; else { int pr = std::cout.precision (18); int discr; if (d != 0) discr = int(delta/d/eps); else discr = int(delta/eps); std::cout << "\nDiscrepancy in " << name << "() : " << v1 << " != " << v2 << " discr = " << discr << " (Allowed discrepancy is " << eps << ")\n"; std::cout.precision (pr); nfail = nfail + 1; } return iret; } int testVector3D() { std::cout << "\n************************************************************************\n " << " Vector 3D Test" << "\n************************************************************************\n"; //CINT cannot autoload classes known only via a typedef (here XYZVector) gSystem->Load("libGenVector"); XYZVector v1(0.01, 0.02, 16); //XYZVector v1(1.0, 2.0, 3.0); // XYZVector v1(1.0, 2.0, 30.0); // double R = sqrt (v1.X()*v1.X() + v1.Y()*v1.Y() + v1.Z()*v1.Z()); // // this formula in not precise enough // // double Theta = R>0 ? acos ( v1.Z()/r ) : 0; // double Rho = sqrt (v1.X()*v1.X() + v1.Y()*v1.Y()); // double Theta = v1.Z() == 0 || Rho == 0 ? 0 : atan2( Rho, v1.Z() ); // double Phi = Rho>0 ? atan2 (v1.Y(), v1.X()) : 0; std::cout << "Test Cartesian-Polar : " ; Polar3DVector v2(v1.R(), v1.Theta(), v1.Phi() ); ok = 0; ok+= compare(v1.X(), v2.X(), "x"); ok+= compare(v1.Y(), v2.Y(), "y"); ok+= compare(v1.Z(), v2.Z(), "z"); ok+= compare(v1.Phi(), v2.Phi(), "phi"); ok+= compare(v1.Theta(), v2.Theta(), "theta"); ok+= compare(v1.R(), v2.R(), "r"); ok+= compare(v1.Eta(), v2.Eta(), "eta"); ok+= compare(v1.Rho(), v2.Rho(), "rho"); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test Cartesian-CylindricalEta : "; RhoEtaPhiVector v3( v1.Rho(), v1.Eta(), v1.Phi() ); ok = 0; ok+= compare(v1.X(), v3.X(), "x"); ok+= compare(v1.Y(), v3.Y(), "y"); ok+= compare(v1.Z(), v3.Z(), "z"); ok+= compare(v1.Phi(), v3.Phi(), "phi"); ok+= compare(v1.Theta(), v3.Theta(), "theta"); ok+= compare(v1.R(), v3.R(), "r"); ok+= compare(v1.Eta(), v3.Eta(), "eta"); ok+= compare(v1.Rho(), v3.Rho(), "rho"); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test Cartesian-Cylindrical : "; RhoZPhiVector v4( v1.Rho(), v1.Z(), v1.Phi() ); ok = 0; ok+= compare(v1.X(), v4.X(), "x"); ok+= compare(v1.Y(), v4.Y(), "y"); ok+= compare(v1.Z(), v4.Z(), "z"); ok+= compare(v1.Phi(), v4.Phi(), "phi"); ok+= compare(v1.Theta(), v4.Theta(), "theta"); ok+= compare(v1.R(), v4.R(), "r"); ok+= compare(v1.Eta(), v4.Eta(), "eta"); ok+= compare(v1.Rho(), v4.Rho(), "rho"); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test Operations : " ; ok = 0; double Dot = v1.Dot(v2); ok+= compare( Dot, v1.Mag2(),"dot" ); XYZVector vcross = v1.Cross(v2); ok+= compare( vcross.R(), 0,"cross" ); //std::cout << "\nTest Unit & scaling : " ; XYZVector vscale1 = v1*10; XYZVector vscale2 = vscale1/10; ok+= compare( v1.R(), vscale2.R(), "scale"); XYZVector vu = v1.Unit(); ok+= compare(v2.Phi(),vu.Phi(),"unit Phi"); ok+= compare(v2.Theta(),vu.Theta(),"unit Theta"); ok+= compare(1.0,vu.R(),"unit "); XYZVector q1 = v1; // RhoEtaPhiVector q2 = v1; ! copy onstructor between different vector does not work yet) RhoEtaPhiVector q2(1.0,1.0,1.0); XYZVector q3 = q1 + q2; XYZVector q4 = q3 - q2; ok+= compare( q4.X(), q1.X(), "op X" ); ok+= compare( q4.Y(), q1.Y(), "op Y" ); ok+= compare( q4.Z(), q1.Z(), "op Z" ); // test operator == XYZVector w1 = v1; Polar3DVector w2 = v2; RhoEtaPhiVector w3 = v3; RhoZPhiVector w4 = v4; ok+= compare( w1 == v1, static_cast<double>(true), "== XYZ"); ok+= compare( w2 == v2, static_cast<double>(true), "== Polar"); ok+= compare( w3 == v3, static_cast<double>(true), "== RhoEtaPhi"); ok+= compare( w4 == v4, static_cast<double>(true), "== RhoZPhi"); if (ok == 0) std::cout << "\t OK " << std::endl; //test setters std::cout << "Test Setters : " ; q2.SetXYZ(q1.X(), q1.Y(), q1.Z() ); ok+= compare( q2.X(), q1.X(), "setXYZ X" ); ok+= compare( q2.Y(), q1.Y(), "setXYZ Y" ); ok+= compare( q2.Z(), q1.Z(), "setXYZ Z" ); q2.SetCoordinates( 2.0*q1.Rho(), q1.Eta(), q1.Phi() ); XYZVector q1s = 2.0*q1; ok+= compare( q2.X(), q1s.X(), "set X" ); ok+= compare( q2.Y(), q1s.Y(), "set Y" ); ok+= compare( q2.Z(), q1s.Z(), "set Z" ); if (ok == 0) std::cout << "\t\t OK " << std::endl; std::cout << "Test Linear Algebra conversion: " ; XYZVector vxyz1(1.,2.,3.); TVectorD vla1(3); vxyz1.Coordinates().GetCoordinates(vla1.GetMatrixArray() ); TVectorD vla2(3); vla2[0] = 1.; vla2[1] = -2.; vla2[2] = 1.; XYZVector vxyz2; vxyz2.SetCoordinates(&vla2[0]); ok = 0; double prod1 = vxyz1.Dot(vxyz2); double prod2 = vla1*vla2; ok+= compare( prod1, prod2, "la test" ); if (ok == 0) std::cout << "\t\t OK " << std::endl; return ok; } int testPoint3D() { std::cout << "\n************************************************************************\n " << " Point 3D Tests" << "\n************************************************************************\n"; //XYZPoint p1(0.00001, 0.00001, 30000000000.0); XYZPoint p1(1.0, 2.0, 3.0); std::cout << "Test Cartesian-Polar : "; Polar3DPoint p2(p1.R(), p1.Theta(), p1.Phi() ); ok = 0; ok+= compare(p1.x(), p2.X(), "x"); ok+= compare(p1.y(), p2.Y(), "y"); ok+= compare(p1.z(), p2.Z(), "z"); ok+= compare(p1.phi(), p2.Phi(), "phi"); ok+= compare(p1.theta(), p2.Theta(), "theta"); ok+= compare(p1.r(), p2.R(), "r"); ok+= compare(p1.eta(), p2.Eta(), "eta"); ok+= compare(p1.rho(), p2.Rho(), "rho"); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test Polar-CylindricalEta : "; RhoEtaPhiPoint p3( p2.Rho(), p2.Eta(), p2.Phi() ); ok = 0; ok+= compare(p2.X(), p3.X(), "x"); ok+= compare(p2.Y(), p3.Y(), "y"); ok+= compare(p2.Z(), p3.Z(), "z",3); ok+= compare(p2.Phi(), p3.Phi(), "phi"); ok+= compare(p2.Theta(), p3.Theta(), "theta"); ok+= compare(p2.R(), p3.R(), "r"); ok+= compare(p2.Eta(), p3.Eta(), "eta"); ok+= compare(p2.Rho(), p3.Rho(), "rho"); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test operations : "; //std::cout << "\nTest Dot and Cross products with Vectors : "; Polar3DVector vperp(1.,p1.Theta() + TMath::PiOver2(),p1.Phi() ); double Dot = p1.Dot(vperp); ok+= compare( Dot, 0.0,"dot", 10 ); XYZPoint vcross = p1.Cross(vperp); ok+= compare( vcross.R(), p1.R(),"cross mag" ); ok+= compare( vcross.Dot(vperp), 0.0,"cross dir" ); XYZPoint pscale1 = 10*p1; XYZPoint pscale2 = pscale1/10; ok+= compare( p1.R(), pscale2.R(), "scale"); // test operator == ok+= compare( p1 == pscale2, static_cast<double>(true), "== Point"); //RhoEtaPhiPoint q1 = p1; ! constructor yet not working in CINT RhoEtaPhiPoint q1; q1 = p1; q1.SetCoordinates(p1.Rho(),2.0, p1.Phi() ); Polar3DVector v2(p1.R(), p1.Theta(),p1.Phi()); //#ifdef WHEN_CINT_FIXED RhoEtaPhiPoint q3 = q1 + v2; // point -point in vector does not work yet RhoEtaPhiPoint q4 = q3 - v2; ok+= compare( q4.X(), q1.X(), "PV op X" ); ok+= compare( q4.Y(), q1.Y(), "PV op Y" ); ok+= compare( q4.Z(), q1.Z(), "PV op Z" ,2); //#endif if (ok == 0) std::cout << "\t OK " << std::endl; // RhoEtaPhiVector v4 = q3 - q1; // ok+= compare( v4.X(), v2.X(), "op X" ); // ok+= compare( v4.Y(), v2.Y(), "op Y" ); // ok+= compare( v4.Z(), v2.Z(), "op Z" ); return ok; } int testLorentzVector() { std::cout << "\n************************************************************************\n " << " Loorentz Vector Tests" << "\n************************************************************************\n"; //XYZTVector v1(0.00001, 0.00001, 30000000000.0); XYZTVector v1(1.0, 2.0, 3.0, 4.0); std::cout << "Test XYZT - PtEtaPhiE Vectors: "; PtEtaPhiEVector v2( v1.Rho(), v1.Eta(), v1.Phi(), v1.E() ); ok = 0; ok+= compare(v1.Px(), v2.X(), "x"); ok+= compare(v1.Py(), v2.Y(), "y"); ok+= compare(v1.Pz(), v2.Z(), "z", 2); ok+= compare(v1.E(), v2.T(), "e"); ok+= compare(v1.Phi(), v2.Phi(), "phi"); ok+= compare(v1.Theta(), v2.Theta(), "theta"); ok+= compare(v1.Pt(), v2.Pt(), "pt"); ok+= compare(v1.M(), v2.M(), "mass", 5); ok+= compare(v1.Et(), v2.Et(), "et"); ok+= compare(v1.Mt(), v2.Mt(), "mt", 3); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test XYZT - PtEtaPhiM Vectors: "; PtEtaPhiMVector v3( v1.Rho(), v1.Eta(), v1.Phi(), v1.M() ); ok = 0; ok+= compare(v1.Px(), v3.X(), "x"); ok+= compare(v1.Py(), v3.Y(), "y"); ok+= compare(v1.Pz(), v3.Z(), "z", 2); ok+= compare(v1.E(), v3.T(), "e"); ok+= compare(v1.Phi(), v3.Phi(), "phi"); ok+= compare(v1.Theta(), v3.Theta(), "theta"); ok+= compare(v1.Pt(), v3.Pt(), "pt"); ok+= compare(v1.M(), v3.M(), "mass", 5); ok+= compare(v1.Et(), v3.Et(), "et"); ok+= compare(v1.Mt(), v3.Mt(), "mt", 3); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test PtEtaPhiE - PxPyPzM Vect.: "; PxPyPzMVector v4( v3.X(), v3.Y(), v3.Z(), v3.M() ); ok = 0; ok+= compare(v4.Px(), v3.X(), "x"); ok+= compare(v4.Py(), v3.Y(), "y"); ok+= compare(v4.Pz(), v3.Z(), "z",2); ok+= compare(v4.E(), v3.T(), "e"); ok+= compare(v4.Phi(), v3.Phi(), "phi"); ok+= compare(v4.Theta(), v3.Theta(), "theta"); ok+= compare(v4.Pt(), v3.Pt(), "pt"); ok+= compare(v4.M(), v3.M(), "mass",5); ok+= compare(v4.Et(), v3.Et(), "et"); ok+= compare(v4.Mt(), v3.Mt(), "mt",3); if (ok == 0) std::cout << "\t OK " << std::endl; std::cout << "Test operations : "; //std::cout << "\nTest Dot product : " ; ok = 0; double Dot = v1.Dot(v2); ok+= compare( Dot, v1.M2(),"dot" , 10 ); //std::cout << "\nTest scaling : " ; XYZTVector vscale1 = v1*10; XYZTVector vscale2 = vscale1/10; ok+= compare( v1.M(), vscale2.M(), "scale"); XYZTVector q1 = v1; // RhoEtaPhiVector q2 = v1; ! copy onstructor between different vector does not work yet) PtEtaPhiEVector q2(1.0,1.0,1.0,5.0); XYZTVector q3 = q1 + q2; XYZTVector q4 = q3 - q2; ok+= compare( q4.x(), q1.X(), "op X" ); ok+= compare( q4.y(), q1.Y(), "op Y" ); ok+= compare( q4.z(), q1.Z(), "op Z" ); ok+= compare( q4.t(), q1.E(), "op E" ); // test operator == XYZTVector w1 = v1; PtEtaPhiEVector w2 = v2; PtEtaPhiMVector w3 = v3; PxPyPzMVector w4 = v4; ok+= compare( w1 == v1, static_cast<double>(true), "== PxPyPzE"); ok+= compare( w2 == v2, static_cast<double>(true), "== PtEtaPhiE"); ok+= compare( w3 == v3, static_cast<double>(true), "== PtEtaPhiM"); ok+= compare( w4 == v4, static_cast<double>(true), "== PxPyPzM"); // test gamma beta and boost XYZVector b = q1.BoostToCM(); double beta = q1.Beta(); double gamma = q1.Gamma(); ok += compare( b.R(), beta, "beta" ); ok += compare( gamma, 1./sqrt( 1 - beta*beta ), "gamma"); if (ok == 0) std::cout << "\t OK " << std::endl; //test setters std::cout << "Test Setters : " ; q2.SetXYZT(q1.Px(), q1.Py(), q1.Pz(), q1.E() ); ok+= compare( q2.X(), q1.X(), "setXYZT X" ); ok+= compare( q2.Y(), q1.Y(), "setXYZT Y" ); ok+= compare( q2.Z(), q1.Z(), "setXYZT Z" ,2); ok+= compare( q2.T(), q1.E(), "setXYZT E" ); q2.SetCoordinates( 2.0*q1.Rho(), q1.Eta(), q1.Phi(), 2.0*q1.E() ); XYZTVector q1s = q1*2.0; ok+= compare( q2.X(), q1s.X(), "set X" ); ok+= compare( q2.Y(), q1s.Y(), "set Y" ); ok+= compare( q2.Z(), q1s.Z(), "set Z" ,2); ok+= compare( q2.T(), q1s.T(), "set E" ); if (ok == 0) std::cout << "\t OK " << std::endl; return ok; } int testVectorUtil() { std::cout << "\n************************************************************************\n " << " Utility Function Tests" << "\n************************************************************************\n"; std::cout << "Test Vector utility functions : "; XYZVector v1(1.0, 2.0, 3.0); Polar3DVector v2pol(v1.R(), v1.Theta()+TMath::PiOver2(), v1.Phi() + 1.0); // mixedmethods not yet impl. XYZVector v2; v2 = v2pol; ok = 0; ok += compare( VectorUtil::DeltaPhi(v1,v2), 1.0, "deltaPhi Vec"); RhoEtaPhiVector v2cyl(v1.Rho(), v1.Eta() + 1.0, v1.Phi() + 1.0); v2 = v2cyl; ok += compare( VectorUtil::DeltaR(v1,v2), sqrt(2.0), "DeltaR Vec"); XYZVector vperp = v1.Cross(v2); ok += compare( VectorUtil::CosTheta(v1,vperp), 0.0, "costheta Vec"); ok += compare( VectorUtil::Angle(v1,vperp), TMath::PiOver2(), "angle Vec"); if (ok == 0) std::cout << "\t\t OK " << std::endl; std::cout << "Test Point utility functions : "; XYZPoint p1(1.0, 2.0, 3.0); Polar3DPoint p2pol(p1.R(), p1.Theta()+TMath::PiOver2(), p1.Phi() + 1.0); // mixedmethods not yet impl. XYZPoint p2; p2 = p2pol; ok = 0; ok += compare( VectorUtil::DeltaPhi(p1,p2), 1.0, "deltaPhi Point"); RhoEtaPhiPoint p2cyl(p1.Rho(), p1.Eta() + 1.0, p1.Phi() + 1.0); p2 = p2cyl; ok += compare( VectorUtil::DeltaR(p1,p2), sqrt(2.0), "DeltaR Point"); XYZPoint pperp(vperp.X(), vperp.Y(), vperp.Z()); ok += compare( VectorUtil::CosTheta(p1,pperp), 0.0, "costheta Point"); ok += compare( VectorUtil::Angle(p1,pperp), TMath::PiOver2(), "angle Point"); if (ok == 0) std::cout << "\t\t OK " << std::endl; std::cout << "LorentzVector utility funct.: "; XYZTVector q1(1.0, 2.0, 3.0,4.0); PtEtaPhiEVector q2cyl(q1.Pt(), q1.Eta()+1.0, q1.Phi() + 1.0, q1.E() ); // mixedmethods not yet impl. XYZTVector q2; q2 = q2cyl; ok = 0; ok += compare( VectorUtil::DeltaPhi(q1,q2), 1.0, "deltaPhi LVec"); ok += compare( VectorUtil::DeltaR(q1,q2), sqrt(2.0), "DeltaR LVec"); XYZTVector qsum = q1+q2; ok += compare( VectorUtil::InvariantMass(q1,q2), qsum.M(), "InvMass"); if (ok == 0) std::cout << "\t\t OK " << std::endl; return ok; } int testRotation() { std::cout << "\n************************************************************************\n " << " Rotation and Transformation Tests" << "\n************************************************************************\n"; std::cout << "Test Vector Rotations : "; ok = 0; XYZPoint v(1.,2,3.); double pi = TMath::Pi(); // initiate rotation with some non -trivial angles to test all matrix EulerAngles r1( pi/2.,pi/4., pi/3 ); Rotation3D r2(r1); // only operator= is in CINT for the other rotations Quaternion r3; r3 = r2; AxisAngle r4; r4 = r3; RotationZYX r5; r5 = r2; XYZPoint v1 = r1 * v; XYZPoint v2 = r2 * v; XYZPoint v3 = r3 * v; XYZPoint v4 = r4 * v; XYZPoint v5 = r5 * v; ok+= compare(v1.X(), v2.X(), "x",2); ok+= compare(v1.Y(), v2.Y(), "y",2); ok+= compare(v1.Z(), v2.Z(), "z",2); ok+= compare(v1.X(), v3.X(), "x",2); ok+= compare(v1.Y(), v3.Y(), "y",2); ok+= compare(v1.Z(), v3.Z(), "z",2); ok+= compare(v1.X(), v4.X(), "x",5); ok+= compare(v1.Y(), v4.Y(), "y",5); ok+= compare(v1.Z(), v4.Z(), "z",5); ok+= compare(v1.X(), v5.X(), "x",2); ok+= compare(v1.Y(), v5.Y(), "y",2); ok+= compare(v1.Z(), v5.Z(), "z",2); // test with matrix double rdata[9]; r2.GetComponents(rdata, rdata+9); TMatrixD m(3,3,rdata); double vdata[3]; v.GetCoordinates(vdata); TVectorD q(3,vdata); TVectorD q2 = m*q; XYZPoint v6; v6.SetCoordinates( q2.GetMatrixArray() ); ok+= compare(v1.X(), v6.X(), "x"); ok+= compare(v1.Y(), v6.Y(), "y"); ok+= compare(v1.Z(), v6.Z(), "z"); if (ok == 0) std::cout << "\t OK " << std::endl; else std::cout << std::endl; std::cout << "Test Axial Rotations : "; ok = 0; RotationX rx( pi/3); RotationY ry( pi/4); RotationZ rz( 4*pi/5); Rotation3D r3x(rx); Rotation3D r3y(ry); Rotation3D r3z(rz); Quaternion qx; qx = rx; Quaternion qy; qy = ry; Quaternion qz; qz = rz; RotationZYX rzyx( rz.Angle(), ry.Angle(), rx.Angle() ); XYZPoint vrot1 = rx * ry * rz * v; XYZPoint vrot2 = r3x * r3y * r3z * v; ok+= compare(vrot1.X(), vrot2.X(), "x"); ok+= compare(vrot1.Y(), vrot2.Y(), "y"); ok+= compare(vrot1.Z(), vrot2.Z(), "z"); vrot2 = qx * qy * qz * v; ok+= compare(vrot1.X(), vrot2.X(), "x",2); ok+= compare(vrot1.Y(), vrot2.Y(), "y",2); ok+= compare(vrot1.Z(), vrot2.Z(), "z",2); vrot2 = rzyx * v; ok+= compare(vrot1.X(), vrot2.X(), "x"); ok+= compare(vrot1.Y(), vrot2.Y(), "y"); ok+= compare(vrot1.Z(), vrot2.Z(), "z"); // now inverse (first x then y then z) vrot1 = rz * ry * rx * v; vrot2 = r3z * r3y * r3x * v; ok+= compare(vrot1.X(), vrot2.X(), "x"); ok+= compare(vrot1.Y(), vrot2.Y(), "y"); ok+= compare(vrot1.Z(), vrot2.Z(), "z"); XYZPoint vinv1 = rx.Inverse()*ry.Inverse()*rz.Inverse()*vrot1; ok+= compare(vinv1.X(), v.X(), "x",2); ok+= compare(vinv1.Y(), v.Y(), "y"); ok+= compare(vinv1.Z(), v.Z(), "z"); if (ok == 0) std::cout << "\t OK " << std::endl; else std::cout << std::endl; std::cout << "Test Rotations by a PI angle : "; ok = 0; double b[4] = { 6,8,10,3.14159265358979323 }; AxisAngle arPi(b,b+4 ); Rotation3D rPi(arPi); AxisAngle a1; a1 = rPi; ok+= compare(arPi.Axis().X(), a1.Axis().X(),"x"); ok+= compare(arPi.Axis().Y(), a1.Axis().Y(),"y"); ok+= compare(arPi.Axis().Z(), a1.Axis().Z(),"z"); ok+= compare(arPi.Angle(), a1.Angle(),"angle"); EulerAngles ePi; ePi=rPi; EulerAngles e1; e1=Rotation3D(a1); ok+= compare(ePi.Phi(), e1.Phi(),"phi"); ok+= compare(ePi.Theta(), e1.Theta(),"theta"); ok+= compare(ePi.Psi(), e1.Psi(),"ps1"); if (ok == 0) std::cout << "\t\t OK " << std::endl; else std::cout << std::endl; std::cout << "Test Inversions : "; ok = 0; EulerAngles s1 = r1.Inverse(); Rotation3D s2 = r2.Inverse(); Quaternion s3 = r3.Inverse(); AxisAngle s4 = r4.Inverse(); RotationZYX s5 = r5.Inverse(); // euler angles not yet impl. XYZPoint p = s2 * r2 * v; ok+= compare(p.X(), v.X(), "x",10); ok+= compare(p.Y(), v.Y(), "y",10); ok+= compare(p.Z(), v.Z(), "z",10); p = s3 * r3 * v; ok+= compare(p.X(), v.X(), "x",10); ok+= compare(p.Y(), v.Y(), "y",10); ok+= compare(p.Z(), v.Z(), "z",10); p = s4 * r4 * v; // axis angle inversion not very precise ok+= compare(p.X(), v.X(), "x",1E9); ok+= compare(p.Y(), v.Y(), "y",1E9); ok+= compare(p.Z(), v.Z(), "z",1E9); p = s5 * r5 * v; ok+= compare(p.X(), v.X(), "x",10); ok+= compare(p.Y(), v.Y(), "y",10); ok+= compare(p.Z(), v.Z(), "z",10); Rotation3D r6(r5); Rotation3D s6 = r6.Inverse(); p = s6 * r6 * v; ok+= compare(p.X(), v.X(), "x",10); ok+= compare(p.Y(), v.Y(), "y",10); ok+= compare(p.Z(), v.Z(), "z",10); if (ok == 0) std::cout << "\t OK " << std::endl; else std::cout << std::endl; // test Rectify std::cout << "Test rectify : "; ok = 0; XYZVector u1(0.999498,-0.00118212,-0.0316611); XYZVector u2(0,0.999304,-0.0373108); XYZVector u3(0.0316832,0.0372921,0.998802); Rotation3D rr(u1,u2,u3); // check orto-normality XYZPoint vrr = rr* v; ok+= compare(v.R(), vrr.R(), "R",1.E9); if (ok == 0) std::cout << "\t\t OK " << std::endl; else std::cout << std::endl; std::cout << "Test Transform3D : "; ok = 0; XYZVector d(1.,-2.,3.); Transform3D t(r2,d); XYZPoint pd = t * v; // apply directly rotation XYZPoint vd = r2 * v + d; ok+= compare(pd.X(), vd.X(), "x"); ok+= compare(pd.Y(), vd.Y(), "y"); ok+= compare(pd.Z(), vd.Z(), "z"); // test with matrix double tdata[12]; t.GetComponents(tdata); TMatrixD mt(3,4,tdata); double vData[4]; // needs a vector of dim 4 v.GetCoordinates(vData); vData[3] = 1; TVectorD q0(4,vData); TVectorD qt = mt*q0; ok+= compare(pd.X(), qt(0), "x"); ok+= compare(pd.Y(), qt(1), "y"); ok+= compare(pd.Z(), qt(2), "z"); // test inverse Transform3D tinv = t.Inverse(); p = tinv * t * v; ok+= compare(p.X(), v.X(), "x",10); ok+= compare(p.Y(), v.Y(), "y",10); ok+= compare(p.Z(), v.Z(), "z",10); // test costruct inverse from translation first //Transform3D tinv2( -d, r2.Inverse() ); //Transform3D tinv2 = r2.Inverse() * Translation3D(-d) ; Transform3D tinv2 ( r2.Inverse(), r2.Inverse() *( -d) ) ; p = tinv2 * t * v; ok+= compare(p.X(), v.X(), "x",10); ok+= compare(p.Y(), v.Y(), "y",10); ok+= compare(p.Z(), v.Z(), "z",10); // test from only rotation and only translation Transform3D ta( EulerAngles(1.,2.,3.) ); Transform3D tb( XYZVector(1,2,3) ); Transform3D tc( Rotation3D(EulerAngles(1.,2.,3.)) , XYZVector(1,2,3) ); Transform3D td( ta.Rotation(), ta.Rotation() * XYZVector(1,2,3) ) ; ok+= compare( tc == tb*ta, static_cast<double>(true), "== Rot*Tra"); ok+= compare( td == ta*tb, static_cast<double>(true), "== Rot*Tra"); if (ok == 0) std::cout << "\t OK " << std::endl; else std::cout << std::endl; std::cout << "Test Plane3D : "; ok = 0; // test transfrom a 3D plane XYZPoint p1(1,2,3); XYZPoint p2(-2,-1,4); XYZPoint p3(-1,3,2); Plane3D plane(p1,p2,p3); XYZVector n = plane.Normal(); // normal is perpendicular to vectors on the planes obtained from subracting the points ok+= compare(n.Dot(p2-p1), 0.0, "n.v12",10); ok+= compare(n.Dot(p3-p1), 0.0, "n.v13",10); ok+= compare(n.Dot(p3-p2), 0.0, "n.v23",10); Plane3D plane1 = t(plane); // transform the points XYZPoint pt1 = t(p1); XYZPoint pt2 = t(p2); XYZPoint pt3 = t(p3); Plane3D plane2(pt1,pt2,pt3); XYZVector n1 = plane1.Normal(); XYZVector n2 = plane2.Normal(); ok+= compare(n1.X(), n2.X(), "a",10); ok+= compare(n1.Y(), n2.Y(), "b",10); ok+= compare(n1.Z(), n2.Z(), "c",10); ok+= compare(plane1.HesseDistance(), plane2.HesseDistance(), "d",10); // check distances ok += compare(plane1.Distance(pt1), 0.0, "distance",10); if (ok == 0) std::cout << "\t OK " << std::endl; else std::cout << std::endl; std::cout << "Test LorentzRotation : "; ok = 0; XYZTVector lv(1.,2.,3.,4.); // test from rotx (using boosts and 3D rotations not yet impl.) // rx,ry and rz already defined Rotation3D r3d = rx*ry*rz; LorentzRotation rlx(rx); LorentzRotation rly(ry); LorentzRotation rlz(rz); LorentzRotation rl0 = rlx*rly*rlz; LorentzRotation rl1( r3d); // cout << rl << endl; // cout << rl0 << endl; // int eq = rl0 == rl; // cout << eq << endl; // double d1[16]; // double d2[16]; // rl.GetComponents(d1,d1+16); // rl0.GetComponents(d2,d2+16); // for (int i = 0; i < 16; ++i) // ok+= compare(d1[i], d2[i], "i",1); //ok+= compare( rl == rl2, static_cast<double>(true), " LorenzRot"); // cout << Rotation3D(rx) << endl; XYZTVector lv0 = rl0 * lv; XYZTVector lv1 = rl1 * lv; XYZTVector lv2 = r3d * lv; ok+= compare(lv1== lv2,true,"V0==V2"); ok+= compare(lv1== lv2,true,"V1==V2"); double rlData[16]; rl0.GetComponents(rlData); TMatrixD ml(4,4,rlData); // ml.Print(); double lvData[4]; lv.GetCoordinates(lvData); TVectorD ql(4,lvData); TVectorD qlr = ml*ql; ok+= compare(lv1.X(), qlr(0), "x"); ok+= compare(lv1.Y(), qlr(1), "y"); ok+= compare(lv1.Z(), qlr(2), "z"); ok+= compare(lv1.E(), qlr(3), "t"); // test inverse lv0 = rl0 * rl0.Inverse() * lv; ok+= compare(lv0.X(), lv.X(), "x"); ok+= compare(lv0.Y(), lv.Y(), "y"); ok+= compare(lv0.Z(), lv.Z(), "z"); ok+= compare(lv0.E(), lv.E(), "t"); if (ok == 0) std::cout << "\t OK " << std::endl; else std::cout << std::endl; // test Boosts std::cout << "Test Boost : "; ok = 0; Boost bst( 0.3,0.4,0.5); // boost (must be <= 1) XYZTVector lvb = bst ( lv ); LorentzRotation rl2 (bst); XYZTVector lvb2 = rl2 (lv); // test with lorentz rotation ok+= compare(lvb.X(), lvb2.X(), "x"); ok+= compare(lvb.Y(), lvb2.Y(), "y"); ok+= compare(lvb.Z(), lvb2.Z(), "z"); ok+= compare(lvb.E(), lvb2.E(), "t"); ok+= compare(lvb.M(), lv.M(), "m",50); // m must stay constant // test inverse lv0 = bst.Inverse() * lvb; ok+= compare(lv0.X(), lv.X(), "x",5); ok+= compare(lv0.Y(), lv.Y(), "y",5); ok+= compare(lv0.Z(), lv.Z(), "z",3); ok+= compare(lv0.E(), lv.E(), "t",3); XYZVector brest = lv.BoostToCM(); bst.SetComponents( brest.X(), brest.Y(), brest.Z() ); XYZTVector lvr = bst * lv; ok+= compare(lvr.X(), 0.0, "x",10); ok+= compare(lvr.Y(), 0.0, "y",10); ok+= compare(lvr.Z(), 0.0, "z",10); ok+= compare(lvr.M(), lv.M(), "m",10); if (ok == 0) std::cout << "\t OK " << std::endl; else std::cout << std::endl; return ok; } void mathcoreGenVector() { #ifdef __CINT__ gSystem->Load("libMathCore"); using namespace ROOT::Math; #endif testVector3D(); testPoint3D(); testLorentzVector(); testVectorUtil(); testRotation(); std::cout << "\n\nNumber of tests " << ntest << " failed = " << nfail << std::endl; } mathcoreGenVector.C:1 mathcoreGenVector.C:2 mathcoreGenVector.C:3 mathcoreGenVector.C:4 mathcoreGenVector.C:5 mathcoreGenVector.C:6 mathcoreGenVector.C:7 mathcoreGenVector.C:8 mathcoreGenVector.C:9 mathcoreGenVector.C:10 mathcoreGenVector.C:11 mathcoreGenVector.C:12 mathcoreGenVector.C:13 mathcoreGenVector.C:14 mathcoreGenVector.C:15 mathcoreGenVector.C:16 mathcoreGenVector.C:17 mathcoreGenVector.C:18 mathcoreGenVector.C:19 mathcoreGenVector.C:20 mathcoreGenVector.C:21 mathcoreGenVector.C:22 mathcoreGenVector.C:23 mathcoreGenVector.C:24 mathcoreGenVector.C:25 mathcoreGenVector.C:26 mathcoreGenVector.C:27 mathcoreGenVector.C:28 mathcoreGenVector.C:29 mathcoreGenVector.C:30 mathcoreGenVector.C:31 mathcoreGenVector.C:32 mathcoreGenVector.C:33 mathcoreGenVector.C:34 mathcoreGenVector.C:35 mathcoreGenVector.C:36 mathcoreGenVector.C:37 mathcoreGenVector.C:38 mathcoreGenVector.C:39 mathcoreGenVector.C:40 mathcoreGenVector.C:41 mathcoreGenVector.C:42 mathcoreGenVector.C:43 mathcoreGenVector.C:44 mathcoreGenVector.C:45 mathcoreGenVector.C:46 mathcoreGenVector.C:47 mathcoreGenVector.C:48 mathcoreGenVector.C:49 mathcoreGenVector.C:50 mathcoreGenVector.C:51 mathcoreGenVector.C:52 mathcoreGenVector.C:53 mathcoreGenVector.C:54 mathcoreGenVector.C:55 mathcoreGenVector.C:56 mathcoreGenVector.C:57 mathcoreGenVector.C:58 mathcoreGenVector.C:59 mathcoreGenVector.C:60 mathcoreGenVector.C:61 mathcoreGenVector.C:62 mathcoreGenVector.C:63 mathcoreGenVector.C:64 mathcoreGenVector.C:65 mathcoreGenVector.C:66 mathcoreGenVector.C:67 mathcoreGenVector.C:68 mathcoreGenVector.C:69 mathcoreGenVector.C:70 mathcoreGenVector.C:71 mathcoreGenVector.C:72 mathcoreGenVector.C:73 mathcoreGenVector.C:74 mathcoreGenVector.C:75 mathcoreGenVector.C:76 mathcoreGenVector.C:77 mathcoreGenVector.C:78 mathcoreGenVector.C:79 mathcoreGenVector.C:80 mathcoreGenVector.C:81 mathcoreGenVector.C:82 mathcoreGenVector.C:83 mathcoreGenVector.C:84 mathcoreGenVector.C:85 mathcoreGenVector.C:86 mathcoreGenVector.C:87 mathcoreGenVector.C:88 mathcoreGenVector.C:89 mathcoreGenVector.C:90 mathcoreGenVector.C:91 mathcoreGenVector.C:92 mathcoreGenVector.C:93 mathcoreGenVector.C:94 mathcoreGenVector.C:95 mathcoreGenVector.C:96 mathcoreGenVector.C:97 mathcoreGenVector.C:98 mathcoreGenVector.C:99 mathcoreGenVector.C:100 mathcoreGenVector.C:101 mathcoreGenVector.C:102 mathcoreGenVector.C:103 mathcoreGenVector.C:104 mathcoreGenVector.C:105 mathcoreGenVector.C:106 mathcoreGenVector.C:107 mathcoreGenVector.C:108 mathcoreGenVector.C:109 mathcoreGenVector.C:110 mathcoreGenVector.C:111 mathcoreGenVector.C:112 mathcoreGenVector.C:113 mathcoreGenVector.C:114 mathcoreGenVector.C:115 mathcoreGenVector.C:116 mathcoreGenVector.C:117 mathcoreGenVector.C:118 mathcoreGenVector.C:119 mathcoreGenVector.C:120 mathcoreGenVector.C:121 mathcoreGenVector.C:122 mathcoreGenVector.C:123 mathcoreGenVector.C:124 mathcoreGenVector.C:125 mathcoreGenVector.C:126 mathcoreGenVector.C:127 mathcoreGenVector.C:128 mathcoreGenVector.C:129 mathcoreGenVector.C:130 mathcoreGenVector.C:131 mathcoreGenVector.C:132 mathcoreGenVector.C:133 mathcoreGenVector.C:134 mathcoreGenVector.C:135 mathcoreGenVector.C:136 mathcoreGenVector.C:137 mathcoreGenVector.C:138 mathcoreGenVector.C:139 mathcoreGenVector.C:140 mathcoreGenVector.C:141 mathcoreGenVector.C:142 mathcoreGenVector.C:143 mathcoreGenVector.C:144 mathcoreGenVector.C:145 mathcoreGenVector.C:146 mathcoreGenVector.C:147 mathcoreGenVector.C:148 mathcoreGenVector.C:149 mathcoreGenVector.C:150 mathcoreGenVector.C:151 mathcoreGenVector.C:152 mathcoreGenVector.C:153 mathcoreGenVector.C:154 mathcoreGenVector.C:155 mathcoreGenVector.C:156 mathcoreGenVector.C:157 mathcoreGenVector.C:158 mathcoreGenVector.C:159 mathcoreGenVector.C:160 mathcoreGenVector.C:161 mathcoreGenVector.C:162 mathcoreGenVector.C:163 mathcoreGenVector.C:164 mathcoreGenVector.C:165 mathcoreGenVector.C:166 mathcoreGenVector.C:167 mathcoreGenVector.C:168 mathcoreGenVector.C:169 mathcoreGenVector.C:170 mathcoreGenVector.C:171 mathcoreGenVector.C:172 mathcoreGenVector.C:173 mathcoreGenVector.C:174 mathcoreGenVector.C:175 mathcoreGenVector.C:176 mathcoreGenVector.C:177 mathcoreGenVector.C:178 mathcoreGenVector.C:179 mathcoreGenVector.C:180 mathcoreGenVector.C:181 mathcoreGenVector.C:182 mathcoreGenVector.C:183 mathcoreGenVector.C:184 mathcoreGenVector.C:185 mathcoreGenVector.C:186 mathcoreGenVector.C:187 mathcoreGenVector.C:188 mathcoreGenVector.C:189 mathcoreGenVector.C:190 mathcoreGenVector.C:191 mathcoreGenVector.C:192 mathcoreGenVector.C:193 mathcoreGenVector.C:194 mathcoreGenVector.C:195 mathcoreGenVector.C:196 mathcoreGenVector.C:197 mathcoreGenVector.C:198 mathcoreGenVector.C:199 mathcoreGenVector.C:200 mathcoreGenVector.C:201 mathcoreGenVector.C:202 mathcoreGenVector.C:203 mathcoreGenVector.C:204 mathcoreGenVector.C:205 mathcoreGenVector.C:206 mathcoreGenVector.C:207 mathcoreGenVector.C:208 mathcoreGenVector.C:209 mathcoreGenVector.C:210 mathcoreGenVector.C:211 mathcoreGenVector.C:212 mathcoreGenVector.C:213 mathcoreGenVector.C:214 mathcoreGenVector.C:215 mathcoreGenVector.C:216 mathcoreGenVector.C:217 mathcoreGenVector.C:218 mathcoreGenVector.C:219 mathcoreGenVector.C:220 mathcoreGenVector.C:221 mathcoreGenVector.C:222 mathcoreGenVector.C:223 mathcoreGenVector.C:224 mathcoreGenVector.C:225 mathcoreGenVector.C:226 mathcoreGenVector.C:227 mathcoreGenVector.C:228 mathcoreGenVector.C:229 mathcoreGenVector.C:230 mathcoreGenVector.C:231 mathcoreGenVector.C:232 mathcoreGenVector.C:233 mathcoreGenVector.C:234 mathcoreGenVector.C:235 mathcoreGenVector.C:236 mathcoreGenVector.C:237 mathcoreGenVector.C:238 mathcoreGenVector.C:239 mathcoreGenVector.C:240 mathcoreGenVector.C:241 mathcoreGenVector.C:242 mathcoreGenVector.C:243 mathcoreGenVector.C:244 mathcoreGenVector.C:245 mathcoreGenVector.C:246 mathcoreGenVector.C:247 mathcoreGenVector.C:248 mathcoreGenVector.C:249 mathcoreGenVector.C:250 mathcoreGenVector.C:251 mathcoreGenVector.C:252 mathcoreGenVector.C:253 mathcoreGenVector.C:254 mathcoreGenVector.C:255 mathcoreGenVector.C:256 mathcoreGenVector.C:257 mathcoreGenVector.C:258 mathcoreGenVector.C:259 mathcoreGenVector.C:260 mathcoreGenVector.C:261 mathcoreGenVector.C:262 mathcoreGenVector.C:263 mathcoreGenVector.C:264 mathcoreGenVector.C:265 mathcoreGenVector.C:266 mathcoreGenVector.C:267 mathcoreGenVector.C:268 mathcoreGenVector.C:269 mathcoreGenVector.C:270 mathcoreGenVector.C:271 mathcoreGenVector.C:272 mathcoreGenVector.C:273 mathcoreGenVector.C:274 mathcoreGenVector.C:275 mathcoreGenVector.C:276 mathcoreGenVector.C:277 mathcoreGenVector.C:278 mathcoreGenVector.C:279 mathcoreGenVector.C:280 mathcoreGenVector.C:281 mathcoreGenVector.C:282 mathcoreGenVector.C:283 mathcoreGenVector.C:284 mathcoreGenVector.C:285 mathcoreGenVector.C:286 mathcoreGenVector.C:287 mathcoreGenVector.C:288 mathcoreGenVector.C:289 mathcoreGenVector.C:290 mathcoreGenVector.C:291 mathcoreGenVector.C:292 mathcoreGenVector.C:293 mathcoreGenVector.C:294 mathcoreGenVector.C:295 mathcoreGenVector.C:296 mathcoreGenVector.C:297 mathcoreGenVector.C:298 mathcoreGenVector.C:299 mathcoreGenVector.C:300 mathcoreGenVector.C:301 mathcoreGenVector.C:302 mathcoreGenVector.C:303 mathcoreGenVector.C:304 mathcoreGenVector.C:305 mathcoreGenVector.C:306 mathcoreGenVector.C:307 mathcoreGenVector.C:308 mathcoreGenVector.C:309 mathcoreGenVector.C:310 mathcoreGenVector.C:311 mathcoreGenVector.C:312 mathcoreGenVector.C:313 mathcoreGenVector.C:314 mathcoreGenVector.C:315 mathcoreGenVector.C:316 mathcoreGenVector.C:317 mathcoreGenVector.C:318 mathcoreGenVector.C:319 mathcoreGenVector.C:320 mathcoreGenVector.C:321 mathcoreGenVector.C:322 mathcoreGenVector.C:323 mathcoreGenVector.C:324 mathcoreGenVector.C:325 mathcoreGenVector.C:326 mathcoreGenVector.C:327 mathcoreGenVector.C:328 mathcoreGenVector.C:329 mathcoreGenVector.C:330 mathcoreGenVector.C:331 mathcoreGenVector.C:332 mathcoreGenVector.C:333 mathcoreGenVector.C:334 mathcoreGenVector.C:335 mathcoreGenVector.C:336 mathcoreGenVector.C:337 mathcoreGenVector.C:338 mathcoreGenVector.C:339 mathcoreGenVector.C:340 mathcoreGenVector.C:341 mathcoreGenVector.C:342 mathcoreGenVector.C:343 mathcoreGenVector.C:344 mathcoreGenVector.C:345 mathcoreGenVector.C:346 mathcoreGenVector.C:347 mathcoreGenVector.C:348 mathcoreGenVector.C:349 mathcoreGenVector.C:350 mathcoreGenVector.C:351 mathcoreGenVector.C:352 mathcoreGenVector.C:353 mathcoreGenVector.C:354 mathcoreGenVector.C:355 mathcoreGenVector.C:356 mathcoreGenVector.C:357 mathcoreGenVector.C:358 mathcoreGenVector.C:359 mathcoreGenVector.C:360 mathcoreGenVector.C:361 mathcoreGenVector.C:362 mathcoreGenVector.C:363 mathcoreGenVector.C:364 mathcoreGenVector.C:365 mathcoreGenVector.C:366 mathcoreGenVector.C:367 mathcoreGenVector.C:368 mathcoreGenVector.C:369 mathcoreGenVector.C:370 mathcoreGenVector.C:371 mathcoreGenVector.C:372 mathcoreGenVector.C:373 mathcoreGenVector.C:374 mathcoreGenVector.C:375 mathcoreGenVector.C:376 mathcoreGenVector.C:377 mathcoreGenVector.C:378 mathcoreGenVector.C:379 mathcoreGenVector.C:380 mathcoreGenVector.C:381 mathcoreGenVector.C:382 mathcoreGenVector.C:383 mathcoreGenVector.C:384 mathcoreGenVector.C:385 mathcoreGenVector.C:386 mathcoreGenVector.C:387 mathcoreGenVector.C:388 mathcoreGenVector.C:389 mathcoreGenVector.C:390 mathcoreGenVector.C:391 mathcoreGenVector.C:392 mathcoreGenVector.C:393 mathcoreGenVector.C:394 mathcoreGenVector.C:395 mathcoreGenVector.C:396 mathcoreGenVector.C:397 mathcoreGenVector.C:398 mathcoreGenVector.C:399 mathcoreGenVector.C:400 mathcoreGenVector.C:401 mathcoreGenVector.C:402 mathcoreGenVector.C:403 mathcoreGenVector.C:404 mathcoreGenVector.C:405 mathcoreGenVector.C:406 mathcoreGenVector.C:407 mathcoreGenVector.C:408 mathcoreGenVector.C:409 mathcoreGenVector.C:410 mathcoreGenVector.C:411 mathcoreGenVector.C:412 mathcoreGenVector.C:413 mathcoreGenVector.C:414 mathcoreGenVector.C:415 mathcoreGenVector.C:416 mathcoreGenVector.C:417 mathcoreGenVector.C:418 mathcoreGenVector.C:419 mathcoreGenVector.C:420 mathcoreGenVector.C:421 mathcoreGenVector.C:422 mathcoreGenVector.C:423 mathcoreGenVector.C:424 mathcoreGenVector.C:425 mathcoreGenVector.C:426 mathcoreGenVector.C:427 mathcoreGenVector.C:428 mathcoreGenVector.C:429 mathcoreGenVector.C:430 mathcoreGenVector.C:431 mathcoreGenVector.C:432 mathcoreGenVector.C:433 mathcoreGenVector.C:434 mathcoreGenVector.C:435 mathcoreGenVector.C:436 mathcoreGenVector.C:437 mathcoreGenVector.C:438 mathcoreGenVector.C:439 mathcoreGenVector.C:440 mathcoreGenVector.C:441 mathcoreGenVector.C:442 mathcoreGenVector.C:443 mathcoreGenVector.C:444 mathcoreGenVector.C:445 mathcoreGenVector.C:446 mathcoreGenVector.C:447 mathcoreGenVector.C:448 mathcoreGenVector.C:449 mathcoreGenVector.C:450 mathcoreGenVector.C:451 mathcoreGenVector.C:452 mathcoreGenVector.C:453 mathcoreGenVector.C:454 mathcoreGenVector.C:455 mathcoreGenVector.C:456 mathcoreGenVector.C:457 mathcoreGenVector.C:458 mathcoreGenVector.C:459 mathcoreGenVector.C:460 mathcoreGenVector.C:461 mathcoreGenVector.C:462 mathcoreGenVector.C:463 mathcoreGenVector.C:464 mathcoreGenVector.C:465 mathcoreGenVector.C:466 mathcoreGenVector.C:467 mathcoreGenVector.C:468 mathcoreGenVector.C:469 mathcoreGenVector.C:470 mathcoreGenVector.C:471 mathcoreGenVector.C:472 mathcoreGenVector.C:473 mathcoreGenVector.C:474 mathcoreGenVector.C:475 mathcoreGenVector.C:476 mathcoreGenVector.C:477 mathcoreGenVector.C:478 mathcoreGenVector.C:479 mathcoreGenVector.C:480 mathcoreGenVector.C:481 mathcoreGenVector.C:482 mathcoreGenVector.C:483 mathcoreGenVector.C:484 mathcoreGenVector.C:485 mathcoreGenVector.C:486 mathcoreGenVector.C:487 mathcoreGenVector.C:488 mathcoreGenVector.C:489 mathcoreGenVector.C:490 mathcoreGenVector.C:491 mathcoreGenVector.C:492 mathcoreGenVector.C:493 mathcoreGenVector.C:494 mathcoreGenVector.C:495 mathcoreGenVector.C:496 mathcoreGenVector.C:497 mathcoreGenVector.C:498 mathcoreGenVector.C:499 mathcoreGenVector.C:500 mathcoreGenVector.C:501 mathcoreGenVector.C:502 mathcoreGenVector.C:503 mathcoreGenVector.C:504 mathcoreGenVector.C:505 mathcoreGenVector.C:506 mathcoreGenVector.C:507 mathcoreGenVector.C:508 mathcoreGenVector.C:509 mathcoreGenVector.C:510 mathcoreGenVector.C:511 mathcoreGenVector.C:512 mathcoreGenVector.C:513 mathcoreGenVector.C:514 mathcoreGenVector.C:515 mathcoreGenVector.C:516 mathcoreGenVector.C:517 mathcoreGenVector.C:518 mathcoreGenVector.C:519 mathcoreGenVector.C:520 mathcoreGenVector.C:521 mathcoreGenVector.C:522 mathcoreGenVector.C:523 mathcoreGenVector.C:524 mathcoreGenVector.C:525 mathcoreGenVector.C:526 mathcoreGenVector.C:527 mathcoreGenVector.C:528 mathcoreGenVector.C:529 mathcoreGenVector.C:530 mathcoreGenVector.C:531 mathcoreGenVector.C:532 mathcoreGenVector.C:533 mathcoreGenVector.C:534 mathcoreGenVector.C:535 mathcoreGenVector.C:536 mathcoreGenVector.C:537 mathcoreGenVector.C:538 mathcoreGenVector.C:539 mathcoreGenVector.C:540 mathcoreGenVector.C:541 mathcoreGenVector.C:542 mathcoreGenVector.C:543 mathcoreGenVector.C:544 mathcoreGenVector.C:545 mathcoreGenVector.C:546 mathcoreGenVector.C:547 mathcoreGenVector.C:548 mathcoreGenVector.C:549 mathcoreGenVector.C:550 mathcoreGenVector.C:551 mathcoreGenVector.C:552 mathcoreGenVector.C:553 mathcoreGenVector.C:554 mathcoreGenVector.C:555 mathcoreGenVector.C:556 mathcoreGenVector.C:557 mathcoreGenVector.C:558 mathcoreGenVector.C:559 mathcoreGenVector.C:560 mathcoreGenVector.C:561 mathcoreGenVector.C:562 mathcoreGenVector.C:563 mathcoreGenVector.C:564 mathcoreGenVector.C:565 mathcoreGenVector.C:566 mathcoreGenVector.C:567 mathcoreGenVector.C:568 mathcoreGenVector.C:569 mathcoreGenVector.C:570 mathcoreGenVector.C:571 mathcoreGenVector.C:572 mathcoreGenVector.C:573 mathcoreGenVector.C:574 mathcoreGenVector.C:575 mathcoreGenVector.C:576 mathcoreGenVector.C:577 mathcoreGenVector.C:578 mathcoreGenVector.C:579 mathcoreGenVector.C:580 mathcoreGenVector.C:581 mathcoreGenVector.C:582 mathcoreGenVector.C:583 mathcoreGenVector.C:584 mathcoreGenVector.C:585 mathcoreGenVector.C:586 mathcoreGenVector.C:587 mathcoreGenVector.C:588 mathcoreGenVector.C:589 mathcoreGenVector.C:590 mathcoreGenVector.C:591 mathcoreGenVector.C:592 mathcoreGenVector.C:593 mathcoreGenVector.C:594 mathcoreGenVector.C:595 mathcoreGenVector.C:596 mathcoreGenVector.C:597 mathcoreGenVector.C:598 mathcoreGenVector.C:599 mathcoreGenVector.C:600 mathcoreGenVector.C:601 mathcoreGenVector.C:602 mathcoreGenVector.C:603 mathcoreGenVector.C:604 mathcoreGenVector.C:605 mathcoreGenVector.C:606 mathcoreGenVector.C:607 mathcoreGenVector.C:608 mathcoreGenVector.C:609 mathcoreGenVector.C:610 mathcoreGenVector.C:611 mathcoreGenVector.C:612 mathcoreGenVector.C:613 mathcoreGenVector.C:614 mathcoreGenVector.C:615 mathcoreGenVector.C:616 mathcoreGenVector.C:617 mathcoreGenVector.C:618 mathcoreGenVector.C:619 mathcoreGenVector.C:620 mathcoreGenVector.C:621 mathcoreGenVector.C:622 mathcoreGenVector.C:623 mathcoreGenVector.C:624 mathcoreGenVector.C:625 mathcoreGenVector.C:626 mathcoreGenVector.C:627 mathcoreGenVector.C:628 mathcoreGenVector.C:629 mathcoreGenVector.C:630 mathcoreGenVector.C:631 mathcoreGenVector.C:632 mathcoreGenVector.C:633 mathcoreGenVector.C:634 mathcoreGenVector.C:635 mathcoreGenVector.C:636 mathcoreGenVector.C:637 mathcoreGenVector.C:638 mathcoreGenVector.C:639 mathcoreGenVector.C:640 mathcoreGenVector.C:641 mathcoreGenVector.C:642 mathcoreGenVector.C:643 mathcoreGenVector.C:644 mathcoreGenVector.C:645 mathcoreGenVector.C:646 mathcoreGenVector.C:647 mathcoreGenVector.C:648 mathcoreGenVector.C:649 mathcoreGenVector.C:650 mathcoreGenVector.C:651 mathcoreGenVector.C:652 mathcoreGenVector.C:653 mathcoreGenVector.C:654 mathcoreGenVector.C:655 mathcoreGenVector.C:656 mathcoreGenVector.C:657 mathcoreGenVector.C:658 mathcoreGenVector.C:659 mathcoreGenVector.C:660 mathcoreGenVector.C:661 mathcoreGenVector.C:662 mathcoreGenVector.C:663 mathcoreGenVector.C:664 mathcoreGenVector.C:665 mathcoreGenVector.C:666 mathcoreGenVector.C:667 mathcoreGenVector.C:668 mathcoreGenVector.C:669 mathcoreGenVector.C:670 mathcoreGenVector.C:671 mathcoreGenVector.C:672 mathcoreGenVector.C:673 mathcoreGenVector.C:674 mathcoreGenVector.C:675 mathcoreGenVector.C:676 mathcoreGenVector.C:677 mathcoreGenVector.C:678 mathcoreGenVector.C:679 mathcoreGenVector.C:680 mathcoreGenVector.C:681 mathcoreGenVector.C:682 mathcoreGenVector.C:683 mathcoreGenVector.C:684 mathcoreGenVector.C:685 mathcoreGenVector.C:686 mathcoreGenVector.C:687 mathcoreGenVector.C:688 mathcoreGenVector.C:689 mathcoreGenVector.C:690 mathcoreGenVector.C:691 mathcoreGenVector.C:692 mathcoreGenVector.C:693 mathcoreGenVector.C:694 mathcoreGenVector.C:695 mathcoreGenVector.C:696 mathcoreGenVector.C:697 mathcoreGenVector.C:698 mathcoreGenVector.C:699 mathcoreGenVector.C:700 mathcoreGenVector.C:701 mathcoreGenVector.C:702 mathcoreGenVector.C:703 mathcoreGenVector.C:704 mathcoreGenVector.C:705 mathcoreGenVector.C:706 mathcoreGenVector.C:707 mathcoreGenVector.C:708 mathcoreGenVector.C:709 mathcoreGenVector.C:710 mathcoreGenVector.C:711 mathcoreGenVector.C:712 mathcoreGenVector.C:713 mathcoreGenVector.C:714 mathcoreGenVector.C:715 mathcoreGenVector.C:716 mathcoreGenVector.C:717 mathcoreGenVector.C:718 mathcoreGenVector.C:719 mathcoreGenVector.C:720 mathcoreGenVector.C:721 mathcoreGenVector.C:722 mathcoreGenVector.C:723 mathcoreGenVector.C:724 mathcoreGenVector.C:725 mathcoreGenVector.C:726 mathcoreGenVector.C:727 mathcoreGenVector.C:728 mathcoreGenVector.C:729 mathcoreGenVector.C:730 mathcoreGenVector.C:731 mathcoreGenVector.C:732 mathcoreGenVector.C:733 mathcoreGenVector.C:734 mathcoreGenVector.C:735 mathcoreGenVector.C:736 mathcoreGenVector.C:737 mathcoreGenVector.C:738 mathcoreGenVector.C:739 mathcoreGenVector.C:740 mathcoreGenVector.C:741 mathcoreGenVector.C:742 mathcoreGenVector.C:743 mathcoreGenVector.C:744 mathcoreGenVector.C:745 mathcoreGenVector.C:746 mathcoreGenVector.C:747 mathcoreGenVector.C:748 mathcoreGenVector.C:749 mathcoreGenVector.C:750 mathcoreGenVector.C:751 mathcoreGenVector.C:752 mathcoreGenVector.C:753 mathcoreGenVector.C:754 mathcoreGenVector.C:755 mathcoreGenVector.C:756 mathcoreGenVector.C:757 mathcoreGenVector.C:758 mathcoreGenVector.C:759 mathcoreGenVector.C:760 mathcoreGenVector.C:761 mathcoreGenVector.C:762 mathcoreGenVector.C:763 mathcoreGenVector.C:764 mathcoreGenVector.C:765 mathcoreGenVector.C:766 mathcoreGenVector.C:767 mathcoreGenVector.C:768 mathcoreGenVector.C:769 mathcoreGenVector.C:770 mathcoreGenVector.C:771 mathcoreGenVector.C:772 mathcoreGenVector.C:773 mathcoreGenVector.C:774 mathcoreGenVector.C:775 mathcoreGenVector.C:776 mathcoreGenVector.C:777 mathcoreGenVector.C:778 mathcoreGenVector.C:779 mathcoreGenVector.C:780 mathcoreGenVector.C:781 mathcoreGenVector.C:782 mathcoreGenVector.C:783 mathcoreGenVector.C:784 mathcoreGenVector.C:785 mathcoreGenVector.C:786 mathcoreGenVector.C:787 mathcoreGenVector.C:788 mathcoreGenVector.C:789 mathcoreGenVector.C:790 mathcoreGenVector.C:791 mathcoreGenVector.C:792 mathcoreGenVector.C:793 mathcoreGenVector.C:794 mathcoreGenVector.C:795 mathcoreGenVector.C:796 mathcoreGenVector.C:797 mathcoreGenVector.C:798 mathcoreGenVector.C:799 mathcoreGenVector.C:800 mathcoreGenVector.C:801 mathcoreGenVector.C:802 mathcoreGenVector.C:803 mathcoreGenVector.C:804 mathcoreGenVector.C:805 mathcoreGenVector.C:806 mathcoreGenVector.C:807 mathcoreGenVector.C:808 mathcoreGenVector.C:809 mathcoreGenVector.C:810 mathcoreGenVector.C:811 mathcoreGenVector.C:812 mathcoreGenVector.C:813 mathcoreGenVector.C:814 mathcoreGenVector.C:815 mathcoreGenVector.C:816 mathcoreGenVector.C:817 mathcoreGenVector.C:818 mathcoreGenVector.C:819 mathcoreGenVector.C:820 mathcoreGenVector.C:821 mathcoreGenVector.C:822 mathcoreGenVector.C:823 mathcoreGenVector.C:824 mathcoreGenVector.C:825 mathcoreGenVector.C:826 mathcoreGenVector.C:827 mathcoreGenVector.C:828 mathcoreGenVector.C:829 mathcoreGenVector.C:830 mathcoreGenVector.C:831 mathcoreGenVector.C:832 mathcoreGenVector.C:833 mathcoreGenVector.C:834 mathcoreGenVector.C:835 mathcoreGenVector.C:836 mathcoreGenVector.C:837 mathcoreGenVector.C:838 mathcoreGenVector.C:839 mathcoreGenVector.C:840 mathcoreGenVector.C:841 mathcoreGenVector.C:842 mathcoreGenVector.C:843 mathcoreGenVector.C:844 mathcoreGenVector.C:845 mathcoreGenVector.C:846 mathcoreGenVector.C:847 mathcoreGenVector.C:848 mathcoreGenVector.C:849 mathcoreGenVector.C:850 mathcoreGenVector.C:851 mathcoreGenVector.C:852 mathcoreGenVector.C:853 mathcoreGenVector.C:854 mathcoreGenVector.C:855 mathcoreGenVector.C:856 mathcoreGenVector.C:857 mathcoreGenVector.C:858 mathcoreGenVector.C:859 mathcoreGenVector.C:860 mathcoreGenVector.C:861 mathcoreGenVector.C:862 mathcoreGenVector.C:863 mathcoreGenVector.C:864 mathcoreGenVector.C:865 mathcoreGenVector.C:866 mathcoreGenVector.C:867 mathcoreGenVector.C:868 mathcoreGenVector.C:869 mathcoreGenVector.C:870 mathcoreGenVector.C:871 mathcoreGenVector.C:872 mathcoreGenVector.C:873 mathcoreGenVector.C:874 mathcoreGenVector.C:875 mathcoreGenVector.C:876 mathcoreGenVector.C:877 mathcoreGenVector.C:878 mathcoreGenVector.C:879 mathcoreGenVector.C:880 mathcoreGenVector.C:881 mathcoreGenVector.C:882 mathcoreGenVector.C:883 mathcoreGenVector.C:884 mathcoreGenVector.C:885 mathcoreGenVector.C:886 mathcoreGenVector.C:887 mathcoreGenVector.C:888 mathcoreGenVector.C:889 mathcoreGenVector.C:890 mathcoreGenVector.C:891 mathcoreGenVector.C:892 mathcoreGenVector.C:893 mathcoreGenVector.C:894 mathcoreGenVector.C:895 mathcoreGenVector.C:896 mathcoreGenVector.C:897 mathcoreGenVector.C:898 mathcoreGenVector.C:899 mathcoreGenVector.C:900 mathcoreGenVector.C:901 mathcoreGenVector.C:902 mathcoreGenVector.C:903 mathcoreGenVector.C:904 mathcoreGenVector.C:905 mathcoreGenVector.C:906 mathcoreGenVector.C:907 mathcoreGenVector.C:908 mathcoreGenVector.C:909 mathcoreGenVector.C:910 mathcoreGenVector.C:911 mathcoreGenVector.C:912 mathcoreGenVector.C:913 mathcoreGenVector.C:914 mathcoreGenVector.C:915 mathcoreGenVector.C:916 mathcoreGenVector.C:917 mathcoreGenVector.C:918 mathcoreGenVector.C:919 mathcoreGenVector.C:920 mathcoreGenVector.C:921 mathcoreGenVector.C:922 mathcoreGenVector.C:923 mathcoreGenVector.C:924 mathcoreGenVector.C:925 mathcoreGenVector.C:926 mathcoreGenVector.C:927 mathcoreGenVector.C:928 mathcoreGenVector.C:929 mathcoreGenVector.C:930 mathcoreGenVector.C:931 mathcoreGenVector.C:932 mathcoreGenVector.C:933 mathcoreGenVector.C:934 mathcoreGenVector.C:935 mathcoreGenVector.C:936 mathcoreGenVector.C:937 mathcoreGenVector.C:938 mathcoreGenVector.C:939 mathcoreGenVector.C:940 mathcoreGenVector.C:941 mathcoreGenVector.C:942 mathcoreGenVector.C:943 mathcoreGenVector.C:944 mathcoreGenVector.C:945 mathcoreGenVector.C:946 mathcoreGenVector.C:947 mathcoreGenVector.C:948 mathcoreGenVector.C:949 mathcoreGenVector.C:950 mathcoreGenVector.C:951 mathcoreGenVector.C:952 mathcoreGenVector.C:953 mathcoreGenVector.C:954 mathcoreGenVector.C:955 mathcoreGenVector.C:956 mathcoreGenVector.C:957 mathcoreGenVector.C:958 mathcoreGenVector.C:959 mathcoreGenVector.C:960 mathcoreGenVector.C:961 mathcoreGenVector.C:962 mathcoreGenVector.C:963 mathcoreGenVector.C:964 mathcoreGenVector.C:965 mathcoreGenVector.C:966 mathcoreGenVector.C:967 mathcoreGenVector.C:968 mathcoreGenVector.C:969 mathcoreGenVector.C:970 mathcoreGenVector.C:971 mathcoreGenVector.C:972 mathcoreGenVector.C:973 mathcoreGenVector.C:974 mathcoreGenVector.C:975 mathcoreGenVector.C:976 mathcoreGenVector.C:977 mathcoreGenVector.C:978 mathcoreGenVector.C:979 mathcoreGenVector.C:980 mathcoreGenVector.C:981 mathcoreGenVector.C:982 mathcoreGenVector.C:983 mathcoreGenVector.C:984 mathcoreGenVector.C:985 mathcoreGenVector.C:986 mathcoreGenVector.C:987 mathcoreGenVector.C:988 mathcoreGenVector.C:989 mathcoreGenVector.C:990 mathcoreGenVector.C:991 mathcoreGenVector.C:992 mathcoreGenVector.C:993 mathcoreGenVector.C:994 mathcoreGenVector.C:995 mathcoreGenVector.C:996 mathcoreGenVector.C:997 mathcoreGenVector.C:998 mathcoreGenVector.C:999 mathcoreGenVector.C:1000 mathcoreGenVector.C:1001 mathcoreGenVector.C:1002 mathcoreGenVector.C:1003 mathcoreGenVector.C:1004 mathcoreGenVector.C:1005 mathcoreGenVector.C:1006 mathcoreGenVector.C:1007 mathcoreGenVector.C:1008 |
|