57int compare(
double v1,
double v2,
const char*
name,
double Scale = 1.0) {
61 double eps = Scale* 2.22044604925031308e-16;
63 double delta =
v2 -
v1;
65 if (delta < 0 ) delta = - delta;
66 if (
v1 == 0 ||
v2 == 0) {
77 if ( delta/
d > eps && delta > eps )
84 int pr = std::cout.precision (18);
91 std::cout <<
"\nDiscrepancy in " <<
name <<
"() : " <<
v1 <<
" != " <<
v2 <<
" discr = " <<
discr
92 <<
" (Allowed discrepancy is " << eps <<
")\n";
93 std::cout.precision (
pr);
100 std::cout <<
"\n************************************************************************\n "
102 <<
"\n************************************************************************\n";
106 std::cout <<
"Test Cartesian-Polar : " ;
111 ok+= compare(
v1.X(),
v2.X(),
"x");
112 ok+= compare(
v1.Y(),
v2.Y(),
"y");
113 ok+= compare(
v1.Z(),
v2.Z(),
"z");
114 ok+= compare(
v1.Phi(),
v2.Phi(),
"phi");
115 ok+= compare(
v1.Theta(),
v2.Theta(),
"theta");
116 ok+= compare(
v1.R(),
v2.R(),
"r");
117 ok+= compare(
v1.Eta(),
v2.Eta(),
"eta");
118 ok+= compare(
v1.Rho(),
v2.Rho(),
"rho");
120 if (ok == 0) std::cout <<
"\t OK " << std::endl;
122 std::cout <<
"Test Cartesian-CylindricalEta : ";
127 ok+= compare(
v1.X(),
v3.X(),
"x");
128 ok+= compare(
v1.Y(),
v3.Y(),
"y");
129 ok+= compare(
v1.Z(),
v3.Z(),
"z");
130 ok+= compare(
v1.Phi(),
v3.Phi(),
"phi");
131 ok+= compare(
v1.Theta(),
v3.Theta(),
"theta");
132 ok+= compare(
v1.R(),
v3.R(),
"r");
133 ok+= compare(
v1.Eta(),
v3.Eta(),
"eta");
134 ok+= compare(
v1.Rho(),
v3.Rho(),
"rho");
136 if (ok == 0) std::cout <<
"\t OK " << std::endl;
138 std::cout <<
"Test Cartesian-Cylindrical : ";
143 ok+= compare(
v1.X(),
v4.X(),
"x");
144 ok+= compare(
v1.Y(),
v4.Y(),
"y");
145 ok+= compare(
v1.Z(),
v4.Z(),
"z");
146 ok+= compare(
v1.Phi(),
v4.Phi(),
"phi");
147 ok+= compare(
v1.Theta(),
v4.Theta(),
"theta");
148 ok+= compare(
v1.R(),
v4.R(),
"r");
149 ok+= compare(
v1.Eta(),
v4.Eta(),
"eta");
150 ok+= compare(
v1.Rho(),
v4.Rho(),
"rho");
152 if (ok == 0) std::cout <<
"\t OK " << std::endl;
154 std::cout <<
"Test Operations : " ;
158 ok+= compare(
Dot,
v1.Mag2(),
"dot" );
160 ok+= compare(
vcross.R(), 0,
"cross" );
164 ok+= compare(
v1.R(),
vscale2.R(),
"scale");
167 ok+= compare(
v2.Phi(),
vu.Phi(),
"unit Phi");
168 ok+= compare(
v2.Theta(),
vu.Theta(),
"unit Theta");
169 ok+= compare(1.0,
vu.R(),
"unit ");
177 ok+= compare(
q4.X(),
q1.X(),
"op X" );
178 ok+= compare(
q4.Y(),
q1.Y(),
"op Y" );
179 ok+= compare(
q4.Z(),
q1.Z(),
"op Z" );
186 ok+= compare(
w1 ==
v1,
static_cast<double>(
true),
"== XYZ");
187 ok+= compare(
w2 ==
v2,
static_cast<double>(
true),
"== Polar");
188 ok+= compare(
w3 ==
v3,
static_cast<double>(
true),
"== RhoEtaPhi");
189 ok+= compare(
w4 ==
v4,
static_cast<double>(
true),
"== RhoZPhi");
191 if (ok == 0) std::cout <<
"\t OK " << std::endl;
194 std::cout <<
"Test Setters : " ;
198 ok+= compare(
q2.X(),
q1.X(),
"setXYZ X" );
199 ok+= compare(
q2.Y(),
q1.Y(),
"setXYZ Y" );
200 ok+= compare(
q2.Z(),
q1.Z(),
"setXYZ Z" );
202 q2.SetCoordinates( 2.0*
q1.Rho(),
q1.Eta(),
q1.Phi() );
204 ok+= compare(
q2.X(),
q1s.X(),
"set X" );
205 ok+= compare(
q2.Y(),
q1s.Y(),
"set Y" );
206 ok+= compare(
q2.Z(),
q1s.Z(),
"set Z" );
208 if (ok == 0) std::cout <<
"\t\t OK " << std::endl;
210 std::cout <<
"Test Linear Algebra conversion: " ;
215 vxyz1.Coordinates().GetCoordinates(
vla1.GetMatrixArray() );
228 if (ok == 0) std::cout <<
"\t\t OK " << std::endl;
234 std::cout <<
"\n************************************************************************\n "
236 <<
"\n************************************************************************\n";
240 std::cout <<
"Test Cartesian-Polar : ";
245 ok+= compare(
p1.x(),
p2.X(),
"x");
246 ok+= compare(
p1.y(),
p2.Y(),
"y");
247 ok+= compare(
p1.z(),
p2.Z(),
"z");
248 ok+= compare(
p1.phi(),
p2.Phi(),
"phi");
249 ok+= compare(
p1.theta(),
p2.Theta(),
"theta");
250 ok+= compare(
p1.r(),
p2.R(),
"r");
251 ok+= compare(
p1.eta(),
p2.Eta(),
"eta");
252 ok+= compare(
p1.rho(),
p2.Rho(),
"rho");
254 if (ok == 0) std::cout <<
"\t OK " << std::endl;
256 std::cout <<
"Test Polar-CylindricalEta : ";
261 ok+= compare(
p2.X(),
p3.X(),
"x");
262 ok+= compare(
p2.Y(),
p3.Y(),
"y");
263 ok+= compare(
p2.Z(),
p3.Z(),
"z",3);
264 ok+= compare(
p2.Phi(),
p3.Phi(),
"phi");
265 ok+= compare(
p2.Theta(),
p3.Theta(),
"theta");
266 ok+= compare(
p2.R(),
p3.R(),
"r");
267 ok+= compare(
p2.Eta(),
p3.Eta(),
"eta");
268 ok+= compare(
p2.Rho(),
p3.Rho(),
"rho");
270 if (ok == 0) std::cout <<
"\t OK " << std::endl;
272 std::cout <<
"Test operations : ";
277 ok+= compare(
Dot, 0.0,
"dot", 10 );
280 ok+= compare(
vcross.R(),
p1.R(),
"cross mag" );
281 ok+= compare(
vcross.Dot(
vperp), 0.0,
"cross dir" );
285 ok+= compare(
p1.R(),
pscale2.R(),
"scale");
288 ok+= compare(
p1 ==
pscale2,
static_cast<double>(
true),
"== Point");
292 q1.SetCoordinates(
p1.Rho(),2.0,
p1.Phi() );
296 if (ok == 0) std::cout <<
"\t OK " << std::endl;
302 std::cout <<
"\n************************************************************************\n "
303 <<
" Lorentz Vector Tests"
304 <<
"\n************************************************************************\n";
308 std::cout <<
"Test XYZT - PtEtaPhiE Vectors: ";
313 ok+= compare(
v1.Px(),
v2.X(),
"x");
314 ok+= compare(
v1.Py(),
v2.Y(),
"y");
315 ok+= compare(
v1.Pz(),
v2.Z(),
"z", 2);
316 ok+= compare(
v1.E(),
v2.T(),
"e");
317 ok+= compare(
v1.Phi(),
v2.Phi(),
"phi");
318 ok+= compare(
v1.Theta(),
v2.Theta(),
"theta");
319 ok+= compare(
v1.Pt(),
v2.Pt(),
"pt");
320 ok+= compare(
v1.M(),
v2.M(),
"mass", 5);
321 ok+= compare(
v1.Et(),
v2.Et(),
"et");
322 ok+= compare(
v1.Mt(),
v2.Mt(),
"mt", 3);
324 if (ok == 0) std::cout <<
"\t OK " << std::endl;
326 std::cout <<
"Test XYZT - PtEtaPhiM Vectors: ";
331 ok+= compare(
v1.Px(),
v3.X(),
"x");
332 ok+= compare(
v1.Py(),
v3.Y(),
"y");
333 ok+= compare(
v1.Pz(),
v3.Z(),
"z", 2);
334 ok+= compare(
v1.E(),
v3.T(),
"e");
335 ok+= compare(
v1.Phi(),
v3.Phi(),
"phi");
336 ok+= compare(
v1.Theta(),
v3.Theta(),
"theta");
337 ok+= compare(
v1.Pt(),
v3.Pt(),
"pt");
338 ok+= compare(
v1.M(),
v3.M(),
"mass", 5);
339 ok+= compare(
v1.Et(),
v3.Et(),
"et");
340 ok+= compare(
v1.Mt(),
v3.Mt(),
"mt", 3);
342 if (ok == 0) std::cout <<
"\t OK " << std::endl;
344 std::cout <<
"Test PtEtaPhiE - PxPyPzM Vect.: ";
349 ok+= compare(
v4.Px(),
v3.X(),
"x");
350 ok+= compare(
v4.Py(),
v3.Y(),
"y");
351 ok+= compare(
v4.Pz(),
v3.Z(),
"z",2);
352 ok+= compare(
v4.E(),
v3.T(),
"e");
353 ok+= compare(
v4.Phi(),
v3.Phi(),
"phi");
354 ok+= compare(
v4.Theta(),
v3.Theta(),
"theta");
355 ok+= compare(
v4.Pt(),
v3.Pt(),
"pt");
356 ok+= compare(
v4.M(),
v3.M(),
"mass",5);
357 ok+= compare(
v4.Et(),
v3.Et(),
"et");
358 ok+= compare(
v4.Mt(),
v3.Mt(),
"mt",3);
360 if (ok == 0) std::cout <<
"\t OK " << std::endl;
362 std::cout <<
"Test operations : ";
366 ok+= compare(
Dot,
v1.M2(),
"dot" , 10 );
370 ok+= compare(
v1.M(),
vscale2.M(),
"scale");
378 ok+= compare(
q4.x(),
q1.X(),
"op X" );
379 ok+= compare(
q4.y(),
q1.Y(),
"op Y" );
380 ok+= compare(
q4.z(),
q1.Z(),
"op Z" );
381 ok+= compare(
q4.t(),
q1.E(),
"op E" );
388 ok+= compare(
w1 ==
v1,
static_cast<double>(
true),
"== PxPyPzE");
389 ok+= compare(
w2 ==
v2,
static_cast<double>(
true),
"== PtEtaPhiE");
390 ok+= compare(
w3 ==
v3,
static_cast<double>(
true),
"== PtEtaPhiM");
391 ok+= compare(
w4 ==
v4,
static_cast<double>(
true),
"== PxPyPzM");
398 ok += compare(
b.R(), beta,
"beta" );
399 ok += compare( gamma, 1./sqrt( 1 - beta*beta ),
"gamma");
401 if (ok == 0) std::cout <<
"\t OK " << std::endl;
404 std::cout <<
"Test Setters : " ;
406 q2.SetXYZT(
q1.Px(),
q1.Py(),
q1.Pz(),
q1.E() );
408 ok+= compare(
q2.X(),
q1.X(),
"setXYZT X" );
409 ok+= compare(
q2.Y(),
q1.Y(),
"setXYZT Y" );
410 ok+= compare(
q2.Z(),
q1.Z(),
"setXYZT Z" ,2);
411 ok+= compare(
q2.T(),
q1.E(),
"setXYZT E" );
413 q2.SetCoordinates( 2.0*
q1.Rho(),
q1.Eta(),
q1.Phi(), 2.0*
q1.E() );
415 ok+= compare(
q2.X(),
q1s.X(),
"set X" );
416 ok+= compare(
q2.Y(),
q1s.Y(),
"set Y" );
417 ok+= compare(
q2.Z(),
q1s.Z(),
"set Z" ,2);
418 ok+= compare(
q2.T(),
q1s.T(),
"set E" );
420 if (ok == 0) std::cout <<
"\t OK " << std::endl;
426 std::cout <<
"\n************************************************************************\n "
427 <<
" Utility Function Tests"
428 <<
"\n************************************************************************\n";
430 std::cout <<
"Test Vector utility functions : ";
438 ok += compare( VectorUtil::DeltaPhi(
v1,
v2), 1.0,
"deltaPhi Vec");
443 ok += compare( VectorUtil::DeltaR(
v1,
v2), sqrt(2.0),
"DeltaR Vec");
446 ok += compare( VectorUtil::CosTheta(
v1,
vperp), 0.0,
"costheta Vec");
449 if (ok == 0) std::cout <<
"\t\t OK " << std::endl;
452 std::cout <<
"Test Point utility functions : ";
460 ok += compare( VectorUtil::DeltaPhi(
p1,
p2), 1.0,
"deltaPhi Point");
464 ok += compare( VectorUtil::DeltaR(
p1,
p2), sqrt(2.0),
"DeltaR Point");
467 ok += compare( VectorUtil::CosTheta(
p1,
pperp), 0.0,
"costheta Point");
470 if (ok == 0) std::cout <<
"\t\t OK " << std::endl;
472 std::cout <<
"LorentzVector utility funct.: ";
479 ok += compare( VectorUtil::DeltaPhi(
q1,
q2), 1.0,
"deltaPhi LVec");
480 ok += compare( VectorUtil::DeltaR(
q1,
q2), sqrt(2.0),
"DeltaR LVec");
483 ok += compare( VectorUtil::InvariantMass(
q1,
q2),
qsum.M(),
"InvMass");
485 if (ok == 0) std::cout <<
"\t\t OK " << std::endl;
491 std::cout <<
"\n************************************************************************\n "
492 <<
" Rotation and Transformation Tests"
493 <<
"\n************************************************************************\n";
495 std::cout <<
"Test Vector Rotations : ";
515 ok+= compare(
v1.X(),
v2.X(),
"x",2);
516 ok+= compare(
v1.Y(),
v2.Y(),
"y",2);
517 ok+= compare(
v1.Z(),
v2.Z(),
"z",2);
519 ok+= compare(
v1.X(),
v3.X(),
"x",2);
520 ok+= compare(
v1.Y(),
v3.Y(),
"y",2);
521 ok+= compare(
v1.Z(),
v3.Z(),
"z",2);
523 ok+= compare(
v1.X(),
v4.X(),
"x",5);
524 ok+= compare(
v1.Y(),
v4.Y(),
"y",5);
525 ok+= compare(
v1.Z(),
v4.Z(),
"z",5);
527 ok+= compare(
v1.X(), v5.X(),
"x",2);
528 ok+= compare(
v1.Y(), v5.Y(),
"y",2);
529 ok+= compare(
v1.Z(), v5.Z(),
"z",2);
541 v6.SetCoordinates(
q2.GetMatrixArray() );
543 ok+= compare(
v1.X(),
v6.X(),
"x");
544 ok+= compare(
v1.Y(),
v6.Y(),
"y");
545 ok+= compare(
v1.Z(),
v6.Z(),
"z");
547 if (ok == 0) std::cout <<
"\t OK " << std::endl;
548 else std::cout << std::endl;
550 std::cout <<
"Test Axial Rotations : ";
596 ok+= compare(
vinv1.X(),
v.X(),
"x",2);
597 ok+= compare(
vinv1.Y(),
v.Y(),
"y");
598 ok+= compare(
vinv1.Z(),
v.Z(),
"z");
600 if (ok == 0) std::cout <<
"\t OK " << std::endl;
601 else std::cout << std::endl;
604 std::cout <<
"Test Rotations by a PI angle : ";
607 double b[4] = { 6,8,10,3.14159265358979323 };
611 ok+= compare(
arPi.Axis().X(),
a1.Axis().X(),
"x");
612 ok+= compare(
arPi.Axis().Y(),
a1.Axis().Y(),
"y");
613 ok+= compare(
arPi.Axis().Z(),
a1.Axis().Z(),
"z");
614 ok+= compare(
arPi.Angle(),
a1.Angle(),
"angle");
618 ok+= compare(
ePi.Phi(),
e1.Phi(),
"phi");
619 ok+= compare(
ePi.Theta(),
e1.Theta(),
"theta");
620 ok+= compare(
ePi.Psi(),
e1.Psi(),
"ps1");
622 if (ok == 0) std::cout <<
"\t\t OK " << std::endl;
623 else std::cout << std::endl;
625 std::cout <<
"Test Inversions : ";
637 ok+= compare(
p.X(),
v.X(),
"x",10);
638 ok+= compare(
p.Y(),
v.Y(),
"y",10);
639 ok+= compare(
p.Z(),
v.Z(),
"z",10);
644 ok+= compare(
p.X(),
v.X(),
"x",10);
645 ok+= compare(
p.Y(),
v.Y(),
"y",10);
646 ok+= compare(
p.Z(),
v.Z(),
"z",10);
650 ok+= compare(
p.X(),
v.X(),
"x",1
E9);
651 ok+= compare(
p.Y(),
v.Y(),
"y",1
E9);
652 ok+= compare(
p.Z(),
v.Z(),
"z",1
E9);
656 ok+= compare(
p.X(),
v.X(),
"x",10);
657 ok+= compare(
p.Y(),
v.Y(),
"y",10);
658 ok+= compare(
p.Z(),
v.Z(),
"z",10);
666 ok+= compare(
p.X(),
v.X(),
"x",10);
667 ok+= compare(
p.Y(),
v.Y(),
"y",10);
668 ok+= compare(
p.Z(),
v.Z(),
"z",10);
670 if (ok == 0) std::cout <<
"\t OK " << std::endl;
671 else std::cout << std::endl;
674 std::cout <<
"Test rectify : ";
683 ok+= compare(
v.R(),
vrr.R(),
"R",1.E9);
685 if (ok == 0) std::cout <<
"\t\t OK " << std::endl;
686 else std::cout << std::endl;
688 std::cout <<
"Test Transform3D : ";
698 ok+= compare(
pd.X(),
vd.X(),
"x");
699 ok+= compare(
pd.Y(),
vd.Y(),
"y");
700 ok+= compare(
pd.Z(),
vd.Z(),
"z");
704 t.GetComponents(
tdata);
713 ok+= compare(
pd.X(),
qt(0),
"x");
714 ok+= compare(
pd.Y(),
qt(1),
"y");
715 ok+= compare(
pd.Z(),
qt(2),
"z");
723 ok+= compare(
p.X(),
v.X(),
"x",10);
724 ok+= compare(
p.Y(),
v.Y(),
"y",10);
725 ok+= compare(
p.Z(),
v.Z(),
"z",10);
732 ok+= compare(
p.X(),
v.X(),
"x",10);
733 ok+= compare(
p.Y(),
v.Y(),
"y",10);
734 ok+= compare(
p.Z(),
v.Z(),
"z",10);
742 ok+= compare(
tc ==
tb*
ta,
static_cast<double>(
true),
"== Rot*Tra");
743 ok+= compare(
td ==
ta*
tb,
static_cast<double>(
true),
"== Rot*Tra");
746 if (ok == 0) std::cout <<
"\t OK " << std::endl;
747 else std::cout << std::endl;
749 std::cout <<
"Test Plane3D : ";
761 ok+= compare(
n.Dot(
p2-
p1), 0.0,
"n.v12",10);
762 ok+= compare(
n.Dot(
p3-
p1), 0.0,
"n.v13",10);
763 ok+= compare(
n.Dot(
p3-
p2), 0.0,
"n.v23",10);
776 ok+= compare(
n1.X(),
n2.X(),
"a",10);
777 ok+= compare(
n1.Y(),
n2.Y(),
"b",10);
778 ok+= compare(
n1.Z(),
n2.Z(),
"c",10);
779 ok+= compare(
plane1.HesseDistance(),
plane2.HesseDistance(),
"d",10);
782 ok += compare(
plane1.Distance(
pt1), 0.0,
"distance",10);
784 if (ok == 0) std::cout <<
"\t OK " << std::endl;
785 else std::cout << std::endl;
787 std::cout <<
"Test LorentzRotation : ";
809 ok+= compare(
lv1==
lv2,
true,
"V0==V2");
810 ok+= compare(
lv1==
lv2,
true,
"V1==V2");
821 ok+= compare(
lv1.X(),
qlr(0),
"x");
822 ok+= compare(
lv1.Y(),
qlr(1),
"y");
823 ok+= compare(
lv1.Z(),
qlr(2),
"z");
824 ok+= compare(
lv1.E(),
qlr(3),
"t");
829 ok+= compare(
lv0.X(),
lv.X(),
"x");
830 ok+= compare(
lv0.Y(),
lv.Y(),
"y");
831 ok+= compare(
lv0.Z(),
lv.Z(),
"z");
832 ok+= compare(
lv0.E(),
lv.E(),
"t");
834 if (ok == 0) std::cout <<
"\t OK " << std::endl;
835 else std::cout << std::endl;
838 std::cout <<
"Test Boost : ";
850 ok+= compare(
lvb.X(),
lvb2.X(),
"x");
851 ok+= compare(
lvb.Y(),
lvb2.Y(),
"y");
852 ok+= compare(
lvb.Z(),
lvb2.Z(),
"z");
853 ok+= compare(
lvb.E(),
lvb2.E(),
"t");
854 ok+= compare(
lvb.M(),
lv.M(),
"m",50);
859 ok+= compare(
lv0.X(),
lv.X(),
"x",5);
860 ok+= compare(
lv0.Y(),
lv.Y(),
"y",5);
861 ok+= compare(
lv0.Z(),
lv.Z(),
"z",3);
862 ok+= compare(
lv0.E(),
lv.E(),
"t",3);
869 ok+= compare(
lvr.X(), 0.0,
"x",10);
870 ok+= compare(
lvr.Y(), 0.0,
"y",10);
871 ok+= compare(
lvr.Z(), 0.0,
"z",10);
872 ok+= compare(
lvr.M(),
lv.M(),
"m",10);
874 if (ok == 0) std::cout <<
"\t OK " << std::endl;
875 else std::cout << std::endl;
888 std::cout <<
"\n\nNumber of tests " <<
ntest <<
" failed = " <<
nfail << std::endl;
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Double_t Dot(const TGLVector3 &v1, const TGLVector3 &v2)
winID h TVirtualViewer3D TVirtualGLPainter p
AxisAngle class describing rotation represented with direction axis (3D Vector) and an angle of rotat...
Lorentz boost class with the (4D) transformation represented internally by a 4x4 orthosymplectic matr...
EulerAngles class describing rotation as three angles (Euler Angles).
Class describing a geometrical plane in 3 dimensions.
Lorentz transformation class with the (4D) transformation represented by a 4x4 orthosymplectic matrix...
Rotation class with the (3D) rotation represented by a unit quaternion (u, i, j, k).
Rotation class with the (3D) rotation represented by a 3x3 orthogonal matrix.
Rotation class representing a 3D rotation about the X axis by the angle of rotation.
Rotation class representing a 3D rotation about the Y axis by the angle of rotation.
Rotation class with the (3D) rotation represented by angles describing first a rotation of an angle p...
Rotation class representing a 3D rotation about the Z axis by the angle of rotation.
double beta(double x, double y)
Calculates the beta function.
constexpr Double_t PiOver2()