23 {
24 auto castToCylinder = [](
const LayerPtrPair & pair)->
const Trk::CylinderSurface* {
25 if (pair.first) return (const CylinderSurface *) &pair.first->surfaceRepresentation();
26 else return nullptr;
27 };
28 auto castToDisc = [](
const LayerPtrPair & pair)->
const Trk::DiscSurface* {
29 if (pair.second) return (const DiscSurface *) &pair.second->surfaceRepresentation();
30 else return nullptr;
31 };
32 const CylinderSurface *cyl1 = castToCylinder(one);
33 const DiscSurface *disc1 = castToDisc(one);
34 const CylinderSurface *cyl2 = castToCylinder(two);
35 const DiscSurface *disc2 = castToDisc(two);
36
37 if (cyl1 and cyl2) {
38 if (std::abs(cyl1->center().z() - cyl2->center().z()) > 1.) {
39 return (std::abs(cyl1->center().z()) < std::abs(cyl2->center().z()));
40 }
41 return (cyl1->
bounds().
r() < cyl2->bounds().r());
42 }
43 if (disc1 and disc2) {
44 const DiscBounds *discbounds1 = (
const DiscBounds *) &disc1->
bounds();
45 const DiscBounds *discbounds2 = (const DiscBounds *) &disc2->bounds();
46 if (discbounds1->
rMax() < discbounds2->
rMin() + 1) {
47 return true;
48 }
49 if (discbounds1->
rMin() > discbounds2->
rMax() - 1) {
50 return false;
51 }
52 return (std::abs(disc1->center().z()) < std::abs(disc2->center().z()));
53 }
54
55 if ((cyl1 != nullptr) && (disc2 != nullptr)) {
56 const DiscBounds *discbounds = (const DiscBounds *) &disc2->bounds();
58 return false;
59 }
61 return true;
62 }
63 return (std::abs(cyl1->center().z()) < std::abs(disc2->center().z()));
64 }
65
66 if ((disc1 == nullptr) || (cyl2 == nullptr)) {
67 throw std::logic_error("Unhandled surface combination.");
68 }
69
70 const DiscBounds *discbounds = (
const DiscBounds *) &disc1->
bounds();
71
72 if (cyl2->bounds().r() > discbounds->
rMax() - 1) {
73 return true;
74 }
75
76 if (cyl2->bounds().r() < discbounds->
rMin() + 1) {
77 return false;
78 }
79
80 return (std::abs(cyl2->center().z()) > std::abs(disc1->center().z()));
81 }
virtual const CylinderBounds & bounds() const override final
This method returns the CylinderBounds by reference (NoBounds is not possible for cylinder)
double rMax() const
This method returns outer radius.
double rMin() const
This method returns inner radius.
const SurfaceBounds & bounds() const override final
This method returns the bounds by reference.
std::pair< const Trk::Layer *, const Trk::Layer * > LayerPtrPair
virtual double r() const override final
This method returns the radius.