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:
Processing /mnt/build/workspace/root-makedoc-v610/rootspi/rdoc/src/v6-10-00-patches/tutorials/math/mathcoreGenVector.C...
************************************************************************
Vector 3D Test
************************************************************************
Test Cartesian-Polar : ........ OK
Test Cartesian-CylindricalEta : ........ OK
Test Cartesian-Cylindrical : ........ OK
Test Operations : ............. OK
Test Setters : ...... OK
Test Linear Algebra conversion: . OK
************************************************************************
Point 3D Tests
************************************************************************
Test Cartesian-Polar : ........ OK
Test Polar-CylindricalEta : ........ OK
Test operations : ..... OK
************************************************************************
Lorentz Vector Tests
************************************************************************
Test XYZT - PtEtaPhiE Vectors: .......... OK
Test XYZT - PtEtaPhiM Vectors: .......... OK
Test PtEtaPhiE - PxPyPzM Vect.: .......... OK
Test operations : ............ OK
Test Setters : ........ OK
************************************************************************
Utility Function Tests
************************************************************************
Test Vector utility functions : .... OK
Test Point utility functions : .... OK
LorentzVector utility funct.: ... OK
************************************************************************
Rotation and Transformation Tests
************************************************************************
Test Vector Rotations : ............... OK
Test Axial Rotations : ............... OK
Test Rotations by a PI angle : ....... OK
Test Inversions : ............... OK
Test rectify : . OK
Test Transform3D : .............. OK
Test Plane3D : ........ OK
Test LorentzRotation : .......... OK
Test Boost : ............. OK
Number of tests 224 failed = 0
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;
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;
}
}
else {
d = v1;
if ( v1 < 0) d = -d;
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;
}
std::cout << "\n************************************************************************\n "
<< " Vector 3D Test"
<< "\n************************************************************************\n";
std::cout << "Test Cartesian-Polar : " ;
ok = 0;
ok+=
compare(v1.Phi(), v2.Phi(),
"phi");
ok+=
compare(v1.Theta(), v2.Theta(),
"theta");
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 : ";
ok = 0;
ok+=
compare(v1.Phi(), v3.Phi(),
"phi");
ok+=
compare(v1.Theta(), v3.Theta(),
"theta");
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 : ";
ok = 0;
ok+=
compare(v1.Phi(), v4.Phi(),
"phi");
ok+=
compare(v1.Theta(), v4.Theta(),
"theta");
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;
ok+=
compare( Dot, v1.Mag2(),
"dot" );
ok+=
compare( vcross.R(), 0,
"cross" );
ok+=
compare( v1.R(), vscale2.
R(),
"scale");
ok+=
compare(v2.Phi(),vu.Phi(),
"unit Phi");
ok+=
compare(v2.Theta(),vu.Theta(),
"unit Theta");
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;
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() );
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: " ;
vxyz1.Coordinates().GetCoordinates(vla1.GetMatrixArray() );
vla2[0] = 1.; vla2[1] = -2.; vla2[2] = 1.;
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;
}
std::cout << "\n************************************************************************\n "
<< " Point 3D Tests"
<< "\n************************************************************************\n";
std::cout << "Test Cartesian-Polar : ";
ok = 0;
ok+=
compare(p1.phi(), p2.Phi(),
"phi");
ok+=
compare(p1.theta(), p2.Theta(),
"theta");
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 : ";
ok = 0;
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.Eta(), p3.Eta(),
"eta");
ok+=
compare(p2.Rho(), p3.Rho(),
"rho");
if (ok == 0) std::cout << "\t OK " << std::endl;
std::cout << "Test operations : ";
double Dot = p1.Dot(vperp);
ok+=
compare( Dot, 0.0,
"dot", 10 );
ok+=
compare( vcross.
R(), p1.R(),
"cross mag" );
ok+=
compare( vcross.
Dot(vperp), 0.0,
"cross dir" );
ok+=
compare( p1.R(), pscale2.
R(),
"scale");
ok+=
compare( p1 == pscale2, static_cast<double>(
true),
"== Point");
if (ok == 0) std::cout << "\t OK " << std::endl;
return ok;
}
int testLorentzVector() {
std::cout << "\n************************************************************************\n "
<< " Lorentz Vector Tests"
<< "\n************************************************************************\n";
std::cout << "Test XYZT - PtEtaPhiE Vectors: ";
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.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: ";
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.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.: ";
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.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 : ";
ok = 0;
double Dot = v1.Dot(v2);
ok+=
compare( Dot, v1.M2(),
"dot" , 10 );
ok+=
compare( v1.M(), vscale2.
M(),
"scale");
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");
double gamma = q1.Gamma();
ok +=
compare( gamma, 1./
sqrt( 1 - beta*beta ),
"gamma");
if (ok == 0) std::cout << "\t OK " << std::endl;
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() );
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;
}
std::cout << "\n************************************************************************\n "
<< " Utility Function Tests"
<< "\n************************************************************************\n";
std::cout << "Test Vector utility functions : ";
ok = 0;
v2 = v2cyl;
if (ok == 0) std::cout << "\t\t OK " << std::endl;
std::cout << "Test Point utility functions : ";
ok = 0;
p2 = p2cyl;
if (ok == 0) std::cout << "\t\t OK " << std::endl;
std::cout << "LorentzVector utility funct.: ";
ok = 0;
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;
double rdata[9];
r2.GetComponents(rdata, rdata+9);
double vdata[3];
v.GetCoordinates(vdata);
if (ok == 0) std::cout << "\t OK " << std::endl;
else std::cout << std::endl;
std::cout << "Test Axial Rotations : ";
ok = 0;
RotationZYX rzyx( rz.Angle(), ry.Angle(), rx.Angle() );
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);
ok+=
compare(vrot1.X(), vrot2.X(),
"x");
ok+=
compare(vrot1.Y(), vrot2.Y(),
"y");
ok+=
compare(vrot1.Z(), vrot2.Z(),
"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 };
if (ok == 0) std::cout << "\t\t OK " << std::endl;
else std::cout << std::endl;
std::cout << "Test Inversions : ";
ok = 0;
ok+=
compare(p.X(), v.X(),
"x",10);
ok+=
compare(p.Y(), v.Y(),
"y",10);
ok+=
compare(p.Z(), v.Z(),
"z",10);
ok+=
compare(p.X(), v.X(),
"x",1E9);
ok+=
compare(p.Y(), v.Y(),
"y",1E9);
ok+=
compare(p.Z(), v.Z(),
"z",1E9);
ok+=
compare(p.X(), v.X(),
"x",10);
ok+=
compare(p.Y(), v.Y(),
"y",10);
ok+=
compare(p.Z(), v.Z(),
"z",10);
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;
std::cout << "Test rectify : ";
ok = 0;
XYZVector u1(0.999498,-0.00118212,-0.0316611);
if (ok == 0) std::cout << "\t\t OK " << std::endl;
else std::cout << std::endl;
std::cout << "Test Transform3D : ";
ok = 0;
double tdata[12];
t.GetComponents(tdata);
double vData[4];
v.GetCoordinates(vData);
vData[3] = 1;
ok+=
compare(p.X(), v.X(),
"x",10);
ok+=
compare(p.Y(), v.Y(),
"y",10);
ok+=
compare(p.Z(), v.Z(),
"z",10);
Transform3D tinv2 ( r2.Inverse(), r2.Inverse() *( -d) ) ;
ok+=
compare(p.X(), v.X(),
"x",10);
ok+=
compare(p.Y(), v.Y(),
"y",10);
ok+=
compare(p.Z(), v.Z(),
"z",10);
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;
ok+=
compare(plane1.HesseDistance(), plane2.HesseDistance(),
"d",10);
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;
ok+=
compare(lv1== lv2,
true,
"V0==V2");
ok+=
compare(lv1== lv2,
true,
"V1==V2");
double rlData[16];
double lvData[4];
lv.GetCoordinates(lvData);
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;
std::cout << "Test Boost : ";
ok = 0;
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);
bst.SetComponents( brest.X(), brest.Y(), brest.Z() );
if (ok == 0) std::cout << "\t OK " << std::endl;
else std::cout << std::endl;
return ok;
}
void mathcoreGenVector() {
testLorentzVector();
testRotation();
std::cout << "\n\nNumber of tests " << ntest << " failed = " << nfail << std::endl;
}