936 std::string minuses(level / 2,
'-');
937 std::string indent(level / 2,
' ');
951 for (
const auto& hit3D : hitPairListPtr) {
952 Eigen::Vector3f pcaToHitVec(hit3D->getPosition()[0] - pcaCenter(0),
953 hit3D->getPosition()[1] - pcaCenter(1),
954 hit3D->getPosition()[2] - pcaCenter(2));
957 pointList.emplace_back(pcaToHit(1), pcaToHit(2), hit3D);
961 pointList.sort([](
const auto&
left,
const auto&
right) {
963 std::numeric_limits<float>::epsilon()) ?
969 std::vector<ConvexHull> convexHullVec;
970 std::vector<reco::ProjectedPointList> rejectedListVec;
971 bool increaseDepth(pointList.size() > 3);
972 float lastArea(std::numeric_limits<float>::max());
974 while (increaseDepth) {
979 const ConvexHull& convexHull = convexHullVec.back();
983 increaseDepth =
false;
985 if (convexHull.getConvexHullArea() > 0.) {
986 if (convexHullVec.size() < 2 || convexHull.getConvexHullArea() < 0.8 * lastArea) {
987 for (
auto& point : convexHullPoints) {
988 pointList.remove(point);
989 rejectedList.emplace_back(point);
991 lastArea = convexHull.getConvexHullArea();
998 while (!convexHullVec.empty() && convexHullVec.back().getConvexHullArea() < 0.5) {
999 convexHullVec.pop_back();
1000 rejectedListVec.pop_back();
1004 if (!convexHullVec.empty()) {
1005 size_t nRejectedTotal(0);
1008 for (
const auto& rejectedList : rejectedListVec) {
1009 nRejectedTotal += rejectedList.size();
1011 for (
const auto& rejectedPoint : rejectedList) {
1012 if (convexHullVec.back().findNearestDistance(rejectedPoint) > 0.5)
1013 locHitPairListPtr.remove(std::get<2>(rejectedPoint));
1024 for (
auto& curPoint : convexHullVec.back().getConvexHull()) {
1025 if (curPoint == lastPoint)
continue;
1030 float distBetweenPoints = (curPoint3D->getPosition()[0] - lastPoint3D->
getPosition()[0]) *
1031 (curPoint3D->getPosition()[0] - lastPoint3D->
getPosition()[0]) +
1032 (curPoint3D->getPosition()[1] - lastPoint3D->
getPosition()[1]) *
1033 (curPoint3D->getPosition()[1] - lastPoint3D->
getPosition()[1]) +
1034 (curPoint3D->getPosition()[2] - lastPoint3D->
getPosition()[2]) *
1035 (curPoint3D->getPosition()[2] - lastPoint3D->
getPosition()[2]);
1037 distBetweenPoints = std::sqrt(distBetweenPoints);
1041 convexHullPointList.push_back(curPoint);
1042 edgeMap[lastPoint3D].push_back(edge);
1043 edgeMap[curPoint3D].push_back(edge);
1044 edgeList.emplace_back(edge);
1046 lastPoint = curPoint;
1053 for (
const auto& point : extremePoints)
1054 extremePointList.push_back(point);
1060 for (
const auto& kink : kinkPoints)
1061 kinkPointList.push_back(kink);
const Eigen::Vector3f getPosition() const
std::list< ProjectedPoint > ProjectedPointList
std::list< Point > PointList
The list of the projected points.
float fConvexHullMinSep
Min hit separation to conisder in convex hull.
std::list< EdgeTuple > EdgeList
reco::PrincipalComponents & getFullPCA()
Define a container for working with the convex hull.
const Eigen::Vector3f & getAvePosition() const
std::list< ConvexHullKinkTuple > ConvexHullKinkTupleList
std::tuple< const reco::ClusterHit3D *, const reco::ClusterHit3D *, double > EdgeTuple
std::list< const reco::ClusterHit3D * > HitPairListPtr
float fConvexHullKinkAngle
Angle to declare a kink in convex hull calc.
reco::ConvexHull & getConvexHull()
std::unordered_map< const reco::ClusterHit3D *, reco::EdgeList > Hit3DToEdgeMap
reco::ProjectedPointList & getProjectedPointList()
std::tuple< float, float, const reco::ClusterHit3D * > ProjectedPoint
Projected coordinates and pointer to hit.
const EigenVectors & getEigenVectors() const