9 #include "art/Utilities/ToolMacros.h"
10 #include "art/Utilities/make_tool.h"
11 #include "art_root_io/TFileDirectory.h"
12 #include "cetlib/cpu_timer.h"
13 #include "fhiclcpp/ParameterSet.h"
14 #include "messagefacility/MessageLogger/MessageLogger.h"
37 namespace lar_cluster3d {
54 void configure(fhicl::ParameterSet
const &pset)
override;
87 reco::ClusterParametersList::iterator positionItr,
96 reco::HitPairListPtr::iterator,
97 reco::HitPairListPtr::iterator,
114 const Eigen::Vector3f&,
115 const Eigen::Vector3f&,
116 const Eigen::Vector3f&,
118 Eigen::Vector3f&)
const;
120 using MinMaxPoints = std::pair<reco::ProjectedPoint,reco::ProjectedPoint>;
127 using KinkTuple = std::tuple<int, reco::ConvexHullKinkTuple, HitOrderTupleList, HitOrderTupleList>;
183 fPCAAlg(pset.
get<fhicl::ParameterSet>(
"PrincipalComponentsAlg"))
200 fMinGapSize = pset.get<
float >(
"MinClusterGapSize", 2.0 );
204 fClusterAlg = art::make_tool<lar_cluster3d::IClusterAlg>(pset.get<fhicl::ParameterSet>(
"ClusterAlg"));
218 std::string dirName =
"ConvexHullPath";
220 art::TFileDirectory
dir = histDir.mkdir(dirName.c_str());
224 fTopNum3DHits = dir.make<TH1F>(
"TopNum3DHits",
"Number 3D Hits", 200, 0., 200.);
225 fTopNumEdges = dir.make<TH1F>(
"TopNumEdges",
"Number Edges", 200, 0., 200.);
226 fTopEigen21Ratio = dir.make<TH1F>(
"TopEigen21Rat",
"Eigen 2/1 Ratio", 100, 0., 1.);
227 fTopEigen20Ratio = dir.make<TH1F>(
"TopEigen20Rat",
"Eigen 2/0 Ratio", 100, 0., 1.);
228 fTopEigen10Ratio = dir.make<TH1F>(
"TopEigen10Rat",
"Eigen 1/0 Ratio", 100, 0., 1.);
229 fTopPrimaryLength = dir.make<TH1F>(
"TopPrimaryLen",
"Primary Length", 200, 0., 200.);
230 fTopExtremeSep = dir.make<TH1F>(
"TopExtremeSep",
"Extreme Dist", 200, 0., 200.);
232 fTopConvexEdgeLen = dir.make<TH1F>(
"TopConvexEdge",
"CH Edge Len", 200, 0., 50.);
234 fSubNum3DHits = dir.make<TH1F>(
"SubNum3DHits",
"Number 3D Hits", 200, 0., 200.);
235 fSubNumEdges = dir.make<TH1F>(
"SubNumEdges",
"Number Edges", 200, 0., 200.);
236 fSubEigen21Ratio = dir.make<TH1F>(
"SubEigen21Rat",
"Eigen 2/1 Ratio", 100, 0., 1.);
237 fSubEigen20Ratio = dir.make<TH1F>(
"SubEigen20Rat",
"Eigen 2/0 Ratio", 100, 0., 1.);
238 fSubEigen10Ratio = dir.make<TH1F>(
"SubEigen10Rat",
"Eigen 1/0 Ratio", 100, 0., 1.);
239 fSubPrimaryLength = dir.make<TH1F>(
"SubPrimaryLen",
"Primary Length", 200, 0., 200.);
240 fSubCosToPrevPCA = dir.make<TH1F>(
"SubCosToPrev",
"Cos(theta)", 101, 0., 1.01);
241 fSubCosExtToPCA = dir.make<TH1F>(
"SubCosExtPCA",
"Cos(theta)", 102, -1.01, 1.01);
243 fSubConvexEdgeLen = dir.make<TH1F>(
"SubConvexEdge",
"CH Edge Len", 200, 0., 50.);
244 fSubMaxDefect = dir.make<TH1F>(
"SubMaxDefect",
"Max Defect", 100, 0., 50.);
245 fSubUsedDefect = dir.make<TH1F>(
"SubUsedDefect",
"Used Defect", 100, 0., 50.);
260 cet::cpu_timer theClockBuildClusters;
268 reco::ClusterParametersList::iterator clusterParametersListItr = clusterParametersList.begin();
270 while(clusterParametersListItr != clusterParametersList.end())
289 reclusteredParameters.push_back(clusterParameters);
292 if (!reclusteredParameters.empty())
295 for (
auto&
cluster : reclusteredParameters)
312 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
315 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
316 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
317 double eigen2To0Ratio = eigenValVec[2] / eigenValVec[2];
318 int num3DHits =
cluster.getHitPairListPtr().size();
319 int numEdges =
cluster.getConvexHull().getConvexHullEdgeList().size();
335 clusterParametersListItr++;
340 theClockBuildClusters.stop();
345 mf::LogDebug(
"Cluster3D") <<
">>>>> Cluster Path finding done" << std::endl;
352 reco::ClusterParametersList::iterator positionItr,
382 Eigen::Vector3f edgeVec(secondEdgeHit->getPosition()[0] - firstEdgeHit->
getPosition()[0],
383 secondEdgeHit->getPosition()[1] - firstEdgeHit->
getPosition()[1],
384 secondEdgeHit->getPosition()[2] - firstEdgeHit->
getPosition()[2]);
418 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
442 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
456 for(
auto& clusterParams : tempClusterParametersList)
458 size_t curOutputClusterListSize = outputClusterList.size();
460 positionItr =
subDivideCluster(clusterParams, fullPCA, positionItr, outputClusterList, level+4);
464 if (curOutputClusterListSize < outputClusterList.size())
continue;
470 std::set<const reco::ClusterHit2D*> hitSet;
473 for(
const auto& hit3D : clusterParams.getHitPairListPtr())
475 for(
const auto& hit2D : hit3D->getHits())
477 if (hit2D) hitSet.insert(hit2D);
482 for(
const auto& hit2D : hitSet)
485 clusterParams.UpdateParameters(hit2D);
488 positionItr = outputClusterList.insert(positionItr,clusterParams);
493 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
501 Eigen::Vector3f lastPrimaryVec(newFullPCA.getEigenVectors().row(2));
503 int num3DHits = clusterParams.getHitPairListPtr().size();
504 int numEdges = clusterParams.getConvexHull().getConvexHullEdgeList().size();
505 float cosToLast = newPrimaryVec.dot(lastPrimaryVec);
506 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
507 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
508 double eigen2To0Ratio = eigenValVec[0] / eigenValVec[2];
530 reco::HitPairListPtr::iterator firstHitItr,
531 reco::HitPairListPtr::iterator lastHitItr,
534 std::string indent(level/2,
' ');
539 hitPairListPtr.resize(
std::distance(firstHitItr,lastHitItr));
542 std::copy(firstHitItr,lastHitItr,hitPairListPtr.begin());
545 bool keepThisCluster(
false);
556 std::vector<double> eigenValVec = {3. * std::sqrt(newFullPCA.
getEigenValues()[0]),
559 double cosNewToLast =
std::abs(primaryPCA.dot(newPrimaryVec));
560 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
561 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
567 keepThisCluster =
true;
571 return keepThisCluster;
579 std::string indent(level/2,
' ');
584 for(
const auto& tupleVal : orderedList) hitPairListPtr.emplace_back(std::get<2>(std::get<2>(tupleVal)));
587 bool keepThisCluster(
false);
598 std::vector<double> eigenValVec = {3. * std::sqrt(newFullPCA.
getEigenValues()[0]),
601 double cosNewToLast =
std::abs(primaryPCA.dot(newPrimaryVec));
602 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
603 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
607 if (candCluster.
getBestEdgeList().size() > 4 && cosNewToLast > 0.25 && eigen2To1Ratio > 0.01 && eigen2To1Ratio < 0.99 && eigen1To0Ratio < 0.5)
609 keepThisCluster =
true;
613 return keepThisCluster;
625 bool keepThisCluster(
false);
634 if (primaryPCA.dot(newPrimaryVec) < 0.)
636 for(
size_t vecIdx = 0; vecIdx < 3; vecIdx++) newFullPCA.
flipAxis(vecIdx);
645 keepThisCluster =
true;
648 return keepThisCluster;
654 using HitKinkTuple = std::tuple<int, reco::HitPairListPtr::iterator>;
655 using HitKinkTupleVec = std::vector<HitKinkTuple>;
661 HitKinkTupleVec kinkTupleVec;
666 for(
auto& kink : kinkPointList)
670 reco::HitPairListPtr::iterator kinkItr = std::find(hitList.begin(),hitList.end(),hit3D);
672 if (kinkItr == hitList.end())
continue;
676 int minNumHits = std::min(numStartToKink,numKinkToEnd);
682 if (!kinkTupleVec.empty())
684 std::sort(kinkTupleVec.begin(),kinkTupleVec.end(),[](
const auto&
left,
const auto&
right){
return std::get<0>(
left) > std::get<0>(
right);});
687 reco::HitPairListPtr::iterator kinkItr = std::get<1>(kinkTupleVec.front());
713 if (outputClusterList.size() != 2) outputClusterList.clear();
716 return !outputClusterList.empty();
728 for(
auto& kink : kinkPointList)
733 KinkTuple& kinkTuple = kinkTupleVec.back();
735 std::get<1>(kinkTuple) = kink;
738 Eigen::Vector2f firstEdge = -std::get<1>(kink);
746 Eigen::Vector2f secondEdge = std::get<2>(kink);
751 std::get<0>(kinkTuple) = std::min(firstList.size(),secondList.size());
755 if (firstList.size() + secondList.size() > pointList.size())
760 std::get<0>(kinkTuple) = std::min(firstList.size(),secondList.size());
767 if (!kinkTupleVec.empty())
770 std::sort(kinkTupleVec.begin(),kinkTupleVec.end(),[](
const auto&
left,
const auto&
right){
return std::get<0>(
left) > std::get<0>(
right);});
773 KinkTuple& kinkTuple = kinkTupleVec.front();
799 if (outputClusterList.size() != 2) outputClusterList.clear();
802 return !outputClusterList.empty();
807 const Eigen::Vector2f& edge,
811 Eigen::Vector2f kinkPos(std::get<0>(point),std::get<1>(point));
814 for (
const auto&
hit : hitList)
818 Eigen::Vector2f hitPos(std::get<0>(
hit),std::get<1>(
hit));
821 Eigen::Vector2f hitToKinkVec = hitPos - kinkPos;
824 float arcLenToPoca = hitToKinkVec.dot(edge);
827 if (arcLenToPoca < 0.)
continue;
830 Eigen::Vector2f pocaPos = kinkPos + arcLenToPoca * edge;
833 Eigen::Vector2f pocaPosToHitPos = hitPos - pocaPos;
834 float pocaToAxis = pocaPosToHitPos.norm();
836 std::cout <<
"-- arcLenToPoca: " << arcLenToPoca <<
", doca: " << pocaToAxis << std::endl;
838 orderedList.emplace_back(arcLenToPoca,pocaToAxis,
hit);
842 orderedList.sort([](
const auto&
left,
const auto&
right){
return std::get<0>(
left) < std::get<0>(
right);});
850 HitOrderTupleList::iterator shortItr = shortList.begin();
852 while(shortItr != shortList.end())
858 HitOrderTupleList::iterator longItr = std::find_if(longList.begin(),longList.end(),[&hit3D](
const auto& elem){
return hit3D == std::get<2>(std::get<2>(elem));});
860 if (longItr != longList.end())
862 if (std::get<1>(*longItr) < std::get<1>(*shortItr))
864 shortItr = shortList.erase(shortItr);
868 longItr = longList.erase(longItr);
882 using DistEdgeTuple = std::tuple<float, const reco::EdgeTuple*>;
883 using DistEdgeTupleVec = std::vector<DistEdgeTuple>;
885 DistEdgeTupleVec distEdgeTupleVec;
891 Eigen::Vector3f edgeVec(secondEdgeHit->getPosition()[0] - firstEdgeHit->
getPosition()[0],
892 secondEdgeHit->getPosition()[1] - firstEdgeHit->
getPosition()[1],
893 secondEdgeHit->getPosition()[2] - firstEdgeHit->
getPosition()[2]);
894 double edgeLen = edgeVec.norm();
910 float hitProjection = hitToEdgeVec.dot(edgeVec);
913 if (hitProjection > 0. && hitProjection < edgeLen)
915 Eigen::Vector3f distToHitVec = hitToEdgeVec - hitProjection * edgeVec;
916 float distToHit = distToHitVec.norm();
918 distEdgeTupleVec.emplace_back(distToHit,&edge);
922 std::sort(distEdgeTupleVec.begin(),distEdgeTupleVec.end(),[](
const auto&
left,
const auto&
right){
return std::get<0>(
left) > std::get<0>(
right);});
935 hitList.sort([](
const auto&
left,
const auto&
right){
return left->getArclenToPoca() <
right->getArclenToPoca();});
938 float usedDefectDist(0.);
940 for(
const auto& distEdgeTuple : distEdgeTupleVec)
945 usedDefectDist = std::get<0>(distEdgeTuple);
948 reco::HitPairListPtr::iterator vertexItr = std::find(hitList.begin(),hitList.end(),edgeHit);
967 fSubMaxDefect->Fill(std::get<0>(distEdgeTupleVec.front()), 1.);
975 outputClusterList.clear();
978 return !outputClusterList.empty();
994 hitList.sort([](
const auto&
left,
const auto&
right){
return left->getArclenToPoca() <
right->getArclenToPoca();});
996 reco::HitPairListPtr::iterator vertexItr = hitList.begin();
998 std::advance(vertexItr, hitList.size()/2);
1013 if (outputClusterList.size() != 2) outputClusterList.clear();
1015 return !outputClusterList.empty();
1032 hitList.sort([](
const auto&
left,
const auto&
right){
return left->getArclenToPoca() <
right->getArclenToPoca();});
1035 reco::HitPairListPtr::iterator bigGapHitItr = hitList.begin();
1036 float biggestGap = 0.;
1038 reco::HitPairListPtr::iterator lastHitItr = hitList.begin();
1040 for(reco::HitPairListPtr::iterator hitItr = hitList.begin(); hitItr != hitList.end(); hitItr++)
1042 float currentGap =
std::abs((*hitItr)->getArclenToPoca() - (*lastHitItr)->getArclenToPoca());
1044 if (currentGap > biggestGap)
1046 bigGapHitItr = hitItr;
1047 biggestGap = currentGap;
1050 lastHitItr = hitItr;
1063 if (
makeCandidateCluster(fullPrimaryVec, clusterParams1, hitList.begin(), bigGapHitItr, level))
1072 if (outputClusterList.size() != 2) outputClusterList.clear();
1075 return !outputClusterList.empty();
1082 std::string minuses(level/2,
'-');
1083 std::string indent(level/2,
' ');
1099 Eigen::Vector3f pcaToHitVec(hit3D->getPosition()[0] - pcaCenter(0),
1100 hit3D->getPosition()[1] - pcaCenter(1),
1101 hit3D->getPosition()[2] - pcaCenter(2));
1104 pointList.emplace_back(pcaToHit(1),pcaToHit(2),hit3D);
1108 pointList.sort([](
const auto&
left,
const auto&
right){
return (
std::abs(std::get<0>(
left) - std::get<0>(
right)) > std::numeric_limits<float>::epsilon()) ? std::get<0>(
left) < std::get<0>(
right) : std::get<1>(
left) < std::get<1>(
right);});
1111 std::vector<ConvexHull> convexHullVec;
1112 std::vector<reco::ProjectedPointList> rejectedListVec;
1113 bool increaseDepth(pointList.size() > 3);
1114 float lastArea(std::numeric_limits<float>::max());
1116 while(increaseDepth)
1122 const ConvexHull& convexHull = convexHullVec.back();
1126 increaseDepth =
false;
1130 if (convexHullVec.size() < 2 || convexHull.
getConvexHullArea() < 0.8 * lastArea)
1132 for(
auto& point : convexHullPoints)
1134 pointList.remove(point);
1135 rejectedList.emplace_back(point);
1144 while(!convexHullVec.empty() && convexHullVec.back().getConvexHullArea() < 0.5)
1146 convexHullVec.pop_back();
1147 rejectedListVec.pop_back();
1151 if (!convexHullVec.empty())
1153 size_t nRejectedTotal(0);
1156 for(
const auto& rejectedList : rejectedListVec)
1158 nRejectedTotal += rejectedList.size();
1160 for(
const auto& rejectedPoint : rejectedList)
1162 if (convexHullVec.back().findNearestDistance(rejectedPoint) > 0.5)
1163 hitPairListPtr.remove(std::get<2>(rejectedPoint));
1174 for(
auto& curPoint : convexHullVec.back().getConvexHull())
1176 if (curPoint == lastPoint)
continue;
1181 float distBetweenPoints = (curPoint3D->getPosition()[0] - lastPoint3D->
getPosition()[0]) * (curPoint3D->getPosition()[0] - lastPoint3D->
getPosition()[0])
1182 + (curPoint3D->getPosition()[1] - lastPoint3D->
getPosition()[1]) * (curPoint3D->getPosition()[1] - lastPoint3D->
getPosition()[1])
1183 + (curPoint3D->getPosition()[2] - lastPoint3D->
getPosition()[2]) * (curPoint3D->getPosition()[2] - lastPoint3D->
getPosition()[2]);
1185 distBetweenPoints = std::sqrt(distBetweenPoints);
1189 convexHullPointList.push_back(curPoint);
1190 edgeMap[lastPoint3D].push_back(edge);
1191 edgeMap[curPoint3D].push_back(edge);
1192 edgeList.emplace_back(edge);
1194 lastPoint = curPoint;
1201 for(
const auto& point : extremePoints) extremePointList.push_back(point);
1207 for(
const auto& kink : kinkPoints) kinkPointList.push_back(kink);
1217 if (convexHullPoints.size() > 2)
1219 reco::ProjectedPointList::iterator pointItr = convexHullPoints.begin();
1222 std::advance(pointItr, convexHullPoints.size() - 2);
1227 pointItr = convexHullPoints.begin();
1230 Eigen::Vector2f lastEdge(std::get<0>(curPoint) - std::get<0>(lastPoint), std::get<1>(curPoint) - std::get<1>(lastPoint));
1232 lastEdge.normalize();
1234 while(pointItr != convexHullPoints.end())
1238 Eigen::Vector2f nextEdge(std::get<0>(nextPoint) - std::get<0>(curPoint), std::get<1>(nextPoint) - std::get<1>(curPoint));
1239 float nextEdgeLen = nextEdge.norm();
1241 nextEdge.normalize();
1243 float cosLastNextEdge = lastEdge.dot(nextEdge);
1258 curPoint = nextPoint;
1266 const Eigen::Vector3f& u0,
1267 const Eigen::Vector3f& P1,
1268 const Eigen::Vector3f& u1,
1269 Eigen::Vector3f& poca0,
1270 Eigen::Vector3f& poca1)
const
1273 Eigen::Vector3f w0 = P0 - P1;
1275 float b(u0.dot(u1));
1277 float d(u0.dot(w0));
1278 float e(u1.dot(w0));
1279 float den(a * c - b * b);
1281 float arcLen0 = (b *
e - c * d) / den;
1282 float arcLen1 = (a *
e - b * d) / den;
1284 poca0 = P0 + arcLen0 * u0;
1285 poca1 = P1 + arcLen1 * u1;
1287 return (poca0 - poca1).norm();
1292 float largestDistance(0.);
1297 reco::EdgeList::const_iterator firstEdgeItr = convexHull.begin();
1299 while(firstEdgeItr != convexHull.end())
1301 reco::EdgeList::const_iterator nextEdgeItr = firstEdgeItr;
1307 while(++nextEdgeItr != convexHull.end())
1313 return largestDistance;
size_t fMinTinyClusterSize
Minimum size for a "tiny" cluster.
float fConvexHullMinSep
Min hit separation to conisder in convex hull.
void PCAAnalysis_calc3DDocas(const reco::HitPairListPtr &hitPairVector, const reco::PrincipalComponents &pca) const
~ConvexHullPathFinder()
Destructor.
std::tuple< int, reco::ConvexHullKinkTuple, HitOrderTupleList, HitOrderTupleList > KinkTuple
void PCAAnalysis_3D(const reco::HitPairListPtr &hitPairList, reco::PrincipalComponents &pca, bool skeletonOnly=false) const
void flipAxis(size_t axis)
bool breakClusterByMaxDefect(reco::ClusterParameters &, reco::ClusterParametersList &, int level) const
const Eigen::Vector3f getPosition() const
std::tuple< float, float, reco::ProjectedPoint > HitOrderTuple
std::list< ProjectedPoint > ProjectedPointList
reco::PrincipalComponents & getSkeletonPCA()
std::list< Point > PointList
The list of the projected points.
reco::ClusterParametersList::iterator subDivideCluster(reco::ClusterParameters &cluster, reco::PrincipalComponents &lastPCA, reco::ClusterParametersList::iterator positionItr, reco::ClusterParametersList &outputClusterList, int level=0) const
Use PCA to try to find path in cluster.
reco::EdgeList & getBestEdgeList()
reco::HitPairListPtr & getHitPairListPtr()
bool fFillHistograms
Histogram definitions.
void configure(fhicl::ParameterSet const &pset) override
Interface for configuring the particular algorithm tool.
IClusterModAlg interface class definiton.
PrincipalComponentsAlg fPCAAlg
void ModifyClusters(reco::ClusterParametersList &) const override
Scan an input collection of clusters and modify those according to the specific implementing algorith...
ClusterParametersList & daughterList()
Implements a ConvexHull for use in clustering.
std::list< EdgeTuple > EdgeList
const EigenValues & getEigenValues() const
double distance(geo::Point_t const &point, CathodeDesc_t const &cathode)
Returns the distance of a point from the cathode.
void fillConvexHullHists(reco::ClusterParameters &, bool) const
reco::PrincipalComponents & getFullPCA()
reco::Hit3DToEdgeMap & getConvexHullEdgeMap()
reco::ProjectedPointList & getConvexHullExtremePoints()
reco::ConvexHullKinkTupleList & getConvexHullKinkPoints()
Define a container for working with the convex hull.
const Eigen::Vector3f & getAvePosition() const
void pruneHitOrderTupleLists(HitOrderTupleList &, HitOrderTupleList &) const
ConvexHullPathFinder(const fhicl::ParameterSet &)
Constructor.
std::list< ConvexHullKinkTuple > ConvexHullKinkTupleList
std::tuple< const reco::ClusterHit3D *, const reco::ClusterHit3D *, double > EdgeTuple
std::list< const reco::ClusterHit3D * > HitPairListPtr
float getConvexHullArea() const
recover the area of the convex hull
This provides an art tool interface definition for 3D Cluster algorithms.
const PointList & getConvexHull() const
recover the list of convex hull vertices
ConvexHull class definiton.
This header file defines the interface to a principal components analysis designed to be used within ...
void buildConvexHull(reco::ClusterParameters &clusterParameters, int level=0) const
std::vector< KinkTuple > KinkTupleVec
std::unique_ptr< lar_cluster3d::IClusterAlg > fClusterAlg
Tools.
bool breakClusterByKinksTrial(reco::ClusterParameters &, reco::ClusterParametersList &, int level) const
bool makeCandidateCluster(Eigen::Vector3f &, reco::ClusterParameters &, reco::HitPairListPtr::iterator, reco::HitPairListPtr::iterator, int) const
reco::ConvexHull & getConvexHull()
void initializeHistograms(art::TFileDirectory &) override
Interface for initializing histograms if they are desired Note that the idea is to put hisgtograms in...
bool breakClusterByKinks(reco::ClusterParameters &, reco::ClusterParametersList &, int level) const
float fMinEigen0To1Ratio
Minimum ratio of eigen 0 to 1 to continue breaking.
float closestApproach(const Eigen::Vector3f &, const Eigen::Vector3f &, const Eigen::Vector3f &, const Eigen::Vector3f &, Eigen::Vector3f &, Eigen::Vector3f &) const
void orderHitsAlongEdge(const reco::ProjectedPointList &, const reco::ProjectedPoint &, const Eigen::Vector2f &, HitOrderTupleList &) const
float fConvexHullKinkAngle
Angle to declare a kink in convex hull calc.
This provides an art tool interface definition for 3D Cluster algorithms.
bool breakClusterAtBigGap(reco::ClusterParameters &, reco::ClusterParametersList &, int level) const
bool breakClusterInHalf(reco::ClusterParameters &, reco::ClusterParametersList &, int level) const
std::unordered_map< const reco::ClusterHit3D *, reco::EdgeList > Hit3DToEdgeMap
reco::ProjectedPointList & getConvexHullPointList()
process_name physics producers generator hPHist_pi physics producers generator P0
reco::ProjectedPointList & getProjectedPointList()
std::pair< MinMaxPoints, MinMaxPoints > MinMaxPointPair
reco::EdgeList & getConvexHullEdgeList()
bool fEnableMonitoring
FHICL parameters.
float findConvexHullEndPoints(const reco::EdgeList &, const reco::ClusterHit3D *, const reco::ClusterHit3D *) const
std::tuple< float, float, const reco::ClusterHit3D * > ProjectedPoint
Projected coordinates and pointer to hit.
std::list< HitOrderTuple > HitOrderTupleList
BEGIN_PROLOG don t mess with this pandoraTrackGausCryoW true
float fMinGapSize
Minimum gap size to break at gaps.
BEGIN_PROLOG could also be cout
float getTimeToExecute() const override
If monitoring, recover the time to execute a particular function.
std::list< ClusterParameters > ClusterParametersList
const EigenVectors & getEigenVectors() const
std::pair< reco::ProjectedPoint, reco::ProjectedPoint > MinMaxPoints
bool completeCandidateCluster(Eigen::Vector3f &, reco::ClusterParameters &, int) const