11 #include "art_root_io/TFileDirectory.h" 12 #include "cetlib/cpu_timer.h" 122 const Eigen::Vector3f&,
123 const Eigen::Vector3f&,
124 const Eigen::Vector3f&,
126 Eigen::Vector3f&)
const;
128 using MinMaxPoints = std::pair<reco::ProjectedPoint, reco::ProjectedPoint>;
134 std::tuple<int, reco::ConvexHullKinkTuple, HitOrderTupleList, HitOrderTupleList>;
139 const Eigen::Vector2f&,
188 std::unique_ptr<lar_cluster3d::IClusterAlg>
228 std::string dirName =
"ConvexHullPath";
230 art::TFileDirectory
dir = histDir.mkdir(dirName.c_str());
234 fTopNum3DHits = dir.make<TH1F>(
"TopNum3DHits",
"Number 3D Hits", 200, 0., 200.);
235 fTopNumEdges = dir.make<TH1F>(
"TopNumEdges",
"Number Edges", 200, 0., 200.);
236 fTopEigen21Ratio = dir.make<TH1F>(
"TopEigen21Rat",
"Eigen 2/1 Ratio", 100, 0., 1.);
237 fTopEigen20Ratio = dir.make<TH1F>(
"TopEigen20Rat",
"Eigen 2/0 Ratio", 100, 0., 1.);
238 fTopEigen10Ratio = dir.make<TH1F>(
"TopEigen10Rat",
"Eigen 1/0 Ratio", 100, 0., 1.);
239 fTopPrimaryLength = dir.make<TH1F>(
"TopPrimaryLen",
"Primary Length", 200, 0., 200.);
240 fTopExtremeSep = dir.make<TH1F>(
"TopExtremeSep",
"Extreme Dist", 200, 0., 200.);
242 fTopConvexEdgeLen = dir.make<TH1F>(
"TopConvexEdge",
"CH Edge Len", 200, 0., 50.);
244 fSubNum3DHits = dir.make<TH1F>(
"SubNum3DHits",
"Number 3D Hits", 200, 0., 200.);
245 fSubNumEdges = dir.make<TH1F>(
"SubNumEdges",
"Number Edges", 200, 0., 200.);
246 fSubEigen21Ratio = dir.make<TH1F>(
"SubEigen21Rat",
"Eigen 2/1 Ratio", 100, 0., 1.);
247 fSubEigen20Ratio = dir.make<TH1F>(
"SubEigen20Rat",
"Eigen 2/0 Ratio", 100, 0., 1.);
248 fSubEigen10Ratio = dir.make<TH1F>(
"SubEigen10Rat",
"Eigen 1/0 Ratio", 100, 0., 1.);
249 fSubPrimaryLength = dir.make<TH1F>(
"SubPrimaryLen",
"Primary Length", 200, 0., 200.);
250 fSubCosToPrevPCA = dir.make<TH1F>(
"SubCosToPrev",
"Cos(theta)", 101, 0., 1.01);
251 fSubCosExtToPCA = dir.make<TH1F>(
"SubCosExtPCA",
"Cos(theta)", 102, -1.01, 1.01);
253 fSubConvexEdgeLen = dir.make<TH1F>(
"SubConvexEdge",
"CH Edge Len", 200, 0., 50.);
254 fSubMaxDefect = dir.make<TH1F>(
"SubMaxDefect",
"Max Defect", 100, 0., 50.);
255 fSubUsedDefect = dir.make<TH1F>(
"SubUsedDefect",
"Used Defect", 100, 0., 50.);
271 cet::cpu_timer theClockBuildClusters;
281 while (clusterParametersListItr != clusterParametersList.end()) {
298 reclusteredParameters.push_back(clusterParameters);
301 if (!reclusteredParameters.empty()) {
303 for (
auto&
cluster : reclusteredParameters) {
319 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
322 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
323 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
324 double eigen2To0Ratio = eigenValVec[2] / eigenValVec[2];
325 int num3DHits =
cluster.getHitPairListPtr().size();
326 int numEdges =
cluster.getConvexHull().getConvexHullEdgeList().size();
342 clusterParametersListItr++;
346 theClockBuildClusters.stop();
351 mf::LogDebug(
"Cluster3D") <<
">>>>> Cluster Path finding done" << std::endl;
388 Eigen::Vector3f edgeVec(secondEdgeHit->getPosition()[0] - firstEdgeHit->
getPosition()[0],
389 secondEdgeHit->getPosition()[1] - firstEdgeHit->
getPosition()[1],
390 secondEdgeHit->getPosition()[2] - firstEdgeHit->
getPosition()[2]);
420 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
440 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
454 for (
auto& clusterParams : tempClusterParametersList) {
455 size_t curOutputClusterListSize = outputClusterList.size();
457 positionItr =
subDivideCluster(clusterParams, positionItr, outputClusterList, level + 4);
461 if (curOutputClusterListSize < outputClusterList.size())
continue;
467 std::set<const reco::ClusterHit2D*> hitSet;
470 for (
const auto& hit3D : clusterParams.getHitPairListPtr()) {
471 for (
const auto& hit2D : hit3D->getHits()) {
472 if (hit2D) hitSet.insert(hit2D);
477 for (
const auto& hit2D : hitSet) {
479 clusterParams.UpdateParameters(hit2D);
482 positionItr = outputClusterList.insert(positionItr, clusterParams);
486 std::vector<double> eigenValVec = {3. * std::sqrt(fullPCA.
getEigenValues()[0]),
494 Eigen::Vector3f lastPrimaryVec(newFullPCA.getEigenVectors().row(2));
496 int num3DHits = clusterParams.getHitPairListPtr().size();
497 int numEdges = clusterParams.getConvexHull().getConvexHullEdgeList().size();
498 float cosToLast = newPrimaryVec.dot(lastPrimaryVec);
499 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
500 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
501 double eigen2To0Ratio = eigenValVec[0] / eigenValVec[2];
527 std::string
indent(level / 2,
' ');
532 hitPairListPtr.resize(std::distance(firstHitItr, lastHitItr));
535 std::copy(firstHitItr, lastHitItr, hitPairListPtr.begin());
538 bool keepThisCluster(
false);
548 std::vector<double> eigenValVec = {3. * std::sqrt(newFullPCA.
getEigenValues()[0]),
551 double cosNewToLast =
std::abs(primaryPCA.dot(newPrimaryVec));
552 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
553 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
558 eigen2To1Ratio > 0.01 && eigen2To1Ratio < 0.99 && eigen1To0Ratio < 0.5) {
559 keepThisCluster =
true;
563 return keepThisCluster;
571 std::string
indent(level / 2,
' ');
576 for (
const auto& tupleVal : orderedList)
577 hitPairListPtr.emplace_back(std::get<2>(std::get<2>(tupleVal)));
580 bool keepThisCluster(
false);
590 std::vector<double> eigenValVec = {3. * std::sqrt(newFullPCA.
getEigenValues()[0]),
593 double cosNewToLast =
std::abs(primaryPCA.dot(newPrimaryVec));
594 double eigen2To1Ratio = eigenValVec[0] / eigenValVec[1];
595 double eigen1To0Ratio = eigenValVec[1] / eigenValVec[2];
600 eigen2To1Ratio > 0.01 && eigen2To1Ratio < 0.99 && eigen1To0Ratio < 0.5) {
601 keepThisCluster =
true;
605 return keepThisCluster;
619 bool keepThisCluster(
false);
627 if (primaryPCA.dot(newPrimaryVec) < 0.) {
628 for (
size_t vecIdx = 0; vecIdx < 3; vecIdx++)
638 keepThisCluster =
true;
641 return keepThisCluster;
649 using HitKinkTuple = std::tuple<int, reco::HitPairListPtr::iterator>;
650 using HitKinkTupleVec = std::vector<HitKinkTuple>;
656 HitKinkTupleVec kinkTupleVec;
661 for (
auto& kink : kinkPointList) {
666 if (kinkItr == hitList.end())
continue;
668 int numStartToKink = std::distance(hitList.begin(), kinkItr);
669 int numKinkToEnd = std::distance(kinkItr, hitList.end());
670 int minNumHits = std::min(numStartToKink, numKinkToEnd);
676 if (!kinkTupleVec.empty()) {
677 std::sort(kinkTupleVec.begin(), kinkTupleVec.end(), [](
const auto&
left,
const auto&
right) {
678 return std::get<0>(
left) > std::get<0>(
right);
690 Eigen::Vector3f fullPrimaryVec(fullPCA.getEigenVectors().row(2));
706 if (outputClusterList.size() != 2) outputClusterList.clear();
709 return !outputClusterList.empty();
724 for (
auto& kink : kinkPointList) {
728 KinkTuple& kinkTuple = kinkTupleVec.back();
730 std::get<1>(kinkTuple) = kink;
733 Eigen::Vector2f firstEdge = -std::get<1>(kink);
740 Eigen::Vector2f secondEdge = std::get<2>(kink);
745 std::get<0>(kinkTuple) = std::min(firstList.size(), secondList.size());
749 if (firstList.size() + secondList.size() > pointList.size()) {
750 if (firstList.size() > secondList.size())
755 std::get<0>(kinkTuple) = std::min(firstList.size(), secondList.size());
762 if (!kinkTupleVec.empty()) {
764 std::sort(kinkTupleVec.begin(), kinkTupleVec.end(), [](
const auto&
left,
const auto&
right) {
765 return std::get<0>(
left) > std::get<0>(
right);
769 KinkTuple& kinkTuple = kinkTupleVec.front();
777 Eigen::Vector3f fullPrimaryVec(fullPCA.getEigenVectors().row(2));
793 if (outputClusterList.size() != 2) outputClusterList.clear();
796 return !outputClusterList.empty();
801 const Eigen::Vector2f& edge,
805 Eigen::Vector2f kinkPos(std::get<0>(point), std::get<1>(point));
808 for (
const auto&
hit : hitList) {
811 Eigen::Vector2f hitPos(std::get<0>(
hit), std::get<1>(
hit));
814 Eigen::Vector2f hitToKinkVec = hitPos - kinkPos;
817 float arcLenToPoca = hitToKinkVec.dot(edge);
820 if (arcLenToPoca < 0.)
continue;
823 Eigen::Vector2f pocaPos = kinkPos + arcLenToPoca * edge;
826 Eigen::Vector2f pocaPosToHitPos = hitPos - pocaPos;
827 float pocaToAxis = pocaPosToHitPos.norm();
829 std::cout <<
"-- arcLenToPoca: " << arcLenToPoca <<
", doca: " << pocaToAxis << std::endl;
831 orderedList.emplace_back(arcLenToPoca, pocaToAxis,
hit);
836 [](
const auto&
left,
const auto&
right) {
return std::get<0>(
left) < std::get<0>(
right); });
847 while (shortItr != shortList.end()) {
853 std::find_if(longList.begin(), longList.end(), [&hit3D](
const auto& elem) {
854 return hit3D == std::get<2>(std::get<2>(elem));
857 if (longItr != longList.end()) {
858 if (std::get<1>(*longItr) < std::get<1>(*shortItr)) {
859 shortItr = shortList.erase(shortItr);
862 longItr = longList.erase(longItr);
878 using DistEdgeTuple = std::tuple<float, const reco::EdgeTuple*>;
879 using DistEdgeTupleVec = std::vector<DistEdgeTuple>;
881 DistEdgeTupleVec distEdgeTupleVec;
888 Eigen::Vector3f edgeVec(secondEdgeHit->getPosition()[0] - firstEdgeHit->
getPosition()[0],
889 secondEdgeHit->getPosition()[1] - firstEdgeHit->
getPosition()[1],
890 secondEdgeHit->getPosition()[2] - firstEdgeHit->
getPosition()[2]);
891 double edgeLen = edgeVec.norm();
906 float hitProjection = hitToEdgeVec.dot(edgeVec);
909 if (hitProjection > 0. && hitProjection < edgeLen) {
910 Eigen::Vector3f distToHitVec = hitToEdgeVec - hitProjection * edgeVec;
911 float distToHit = distToHitVec.norm();
913 distEdgeTupleVec.emplace_back(distToHit, &edge);
918 distEdgeTupleVec.begin(), distEdgeTupleVec.end(), [](
const auto&
left,
const auto&
right) {
919 return std::get<0>(
left) > std::get<0>(
right);
923 Eigen::Vector3f fullPrimaryVec(fullPCA.getEigenVectors().row(2));
933 hitList.sort([](
const auto&
left,
const auto&
right) {
934 return left->getArclenToPoca() <
right->getArclenToPoca();
938 float usedDefectDist(0.);
940 for (
const auto& distEdgeTuple : distEdgeTupleVec) {
944 usedDefectDist = std::get<0>(distEdgeTuple);
950 if (vertexItr == hitList.end() ||
966 fSubMaxDefect->Fill(std::get<0>(distEdgeTupleVec.front()), 1.);
974 outputClusterList.clear();
977 return !outputClusterList.empty();
985 Eigen::Vector3f fullPrimaryVec(fullPCA.getEigenVectors().row(2));
995 hitList.sort([](
const auto&
left,
const auto&
right) {
996 return left->getArclenToPoca() <
right->getArclenToPoca();
1001 std::advance(vertexItr, hitList.size() / 2);
1015 if (outputClusterList.size() != 2) outputClusterList.clear();
1017 return !outputClusterList.empty();
1036 hitList.sort([](
const auto&
left,
const auto&
right) {
1037 return left->getArclenToPoca() <
right->getArclenToPoca();
1042 float biggestGap = 0.;
1048 float currentGap =
std::abs((*hitItr)->getArclenToPoca() - (*lastHitItr)->getArclenToPoca());
1050 if (currentGap > biggestGap) {
1053 biggestGap = currentGap;
1056 lastHitItr = hitItr;
1066 Eigen::Vector3f fullPrimaryVec(fullPCA.getEigenVectors().row(2));
1069 fullPrimaryVec, clusterParams1, hitList.begin(), bigGapHitItr, level)) {
1077 if (outputClusterList.size() != 2) outputClusterList.clear();
1080 return !outputClusterList.empty();
1087 std::string minuses(level / 2,
'-');
1088 std::string
indent(level / 2,
' ');
1103 Eigen::Vector3f pcaToHitVec(hit3D->getPosition()[0] - pcaCenter(0),
1104 hit3D->getPosition()[1] - pcaCenter(1),
1105 hit3D->getPosition()[2] - pcaCenter(2));
1108 pointList.emplace_back(pcaToHit(1), pcaToHit(2), hit3D);
1112 pointList.sort([](
const auto&
left,
const auto&
right) {
1114 std::numeric_limits<float>::epsilon()) ?
1115 std::get<0>(
left) < std::get<0>(
right) :
1120 std::vector<ConvexHull> convexHullVec;
1121 std::vector<reco::ProjectedPointList> rejectedListVec;
1122 bool increaseDepth(pointList.size() > 3);
1123 float lastArea(std::numeric_limits<float>::max());
1125 while (increaseDepth) {
1130 const ConvexHull& convexHull = convexHullVec.back();
1134 increaseDepth =
false;
1137 if (convexHullVec.size() < 2 || convexHull.
getConvexHullArea() < 0.8 * lastArea) {
1138 for (
auto& point : convexHullPoints) {
1139 pointList.remove(point);
1140 rejectedList.emplace_back(point);
1149 while (!convexHullVec.empty() && convexHullVec.back().getConvexHullArea() < 0.5) {
1150 convexHullVec.pop_back();
1151 rejectedListVec.pop_back();
1155 if (!convexHullVec.empty()) {
1158 for (
const auto& rejectedList : rejectedListVec) {
1159 for (
const auto& rejectedPoint : rejectedList) {
1160 if (convexHullVec.back().findNearestDistance(rejectedPoint) > 0.5)
1161 hitPairListPtr.remove(std::get<2>(rejectedPoint));
1172 for (
auto& curPoint : convexHullVec.back().getConvexHull()) {
1173 if (curPoint == lastPoint)
continue;
1178 float distBetweenPoints = (curPoint3D->getPosition()[0] - lastPoint3D->
getPosition()[0]) *
1179 (curPoint3D->getPosition()[0] - lastPoint3D->
getPosition()[0]) +
1180 (curPoint3D->getPosition()[1] - lastPoint3D->
getPosition()[1]) *
1181 (curPoint3D->getPosition()[1] - lastPoint3D->
getPosition()[1]) +
1182 (curPoint3D->getPosition()[2] - lastPoint3D->
getPosition()[2]) *
1183 (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)
1202 extremePointList.push_back(point);
1208 for (
const auto& kink : kinkPoints)
1209 kinkPointList.push_back(kink);
1221 if (convexHullPoints.size() > 2) {
1225 std::advance(pointItr, convexHullPoints.size() - 2);
1230 pointItr = convexHullPoints.begin();
1233 Eigen::Vector2f lastEdge(std::get<0>(curPoint) - std::get<0>(lastPoint),
1234 std::get<1>(curPoint) - std::get<1>(lastPoint));
1236 lastEdge.normalize();
1238 while (pointItr != convexHullPoints.end()) {
1241 Eigen::Vector2f nextEdge(std::get<0>(nextPoint) - std::get<0>(curPoint),
1242 std::get<1>(nextPoint) - std::get<1>(curPoint));
1243 float nextEdgeLen = nextEdge.norm();
1245 nextEdge.normalize();
1247 float cosLastNextEdge = lastEdge.dot(nextEdge);
1260 curPoint = nextPoint;
1268 const Eigen::Vector3f& u0,
1269 const Eigen::Vector3f& P1,
1270 const Eigen::Vector3f& u1,
1271 Eigen::Vector3f& poca0,
1272 Eigen::Vector3f& poca1)
const 1275 Eigen::Vector3f w0 = P0 - P1;
1277 float b(u0.dot(u1));
1279 float d(u0.dot(w0));
1280 float e(u1.dot(w0));
1281 float den(a * c - b * b);
1283 float arcLen0 = (b *
e - c *
d) / den;
1284 float arcLen1 = (a *
e - b *
d) / den;
1286 poca0 = P0 + arcLen0 * u0;
1287 poca1 = P1 + arcLen1 * u1;
1289 return (poca0 - poca1).norm();
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.
constexpr auto const & right(const_AssnsIter< L, R, D, Dir > const &a, const_AssnsIter< L, R, D, Dir > const &b)
std::tuple< int, reco::ConvexHullKinkTuple, HitOrderTupleList, HitOrderTupleList > KinkTuple
void PCAAnalysis_3D(const reco::HitPairListPtr &hitPairList, reco::PrincipalComponents &pca, bool skeletonOnly=false) const
float getTimeToExecute() const override
If monitoring, recover the time to execute a particular function.
void flipAxis(size_t axis)
std::tuple< float, float, const reco::ClusterHit3D * > ProjectedPoint
Projected coordinates and pointer to hit.
bool breakClusterByMaxDefect(reco::ClusterParameters &, reco::ClusterParametersList &, int level) const
const Eigen::Vector3f getPosition() const
std::list< ProjectedPoint > ProjectedPointList
reco::PrincipalComponents & getSkeletonPCA()
std::tuple< float, float, reco::ProjectedPoint > HitOrderTuple
std::list< Point > PointList
The list of the projected points.
constexpr auto abs(T v)
Returns the absolute value of the argument.
reco::EdgeList & getBestEdgeList()
reco::HitPairListPtr & getHitPairListPtr()
bool fFillHistograms
Histogram definitions.
Cluster finding and building.
std::pair< MinMaxPoints, MinMaxPoints > MinMaxPointPair
reco::ClusterParametersList::iterator subDivideCluster(reco::ClusterParameters &cluster, reco::ClusterParametersList::iterator positionItr, reco::ClusterParametersList &outputClusterList, int level=0) const
Use PCA to try to find path in cluster.
void configure(fhicl::ParameterSet const &pset) override
IClusterModAlg interface class definiton.
PrincipalComponentsAlg fPCAAlg
ClusterParametersList & daughterList()
Implements a ConvexHull for use in clustering.
std::list< EdgeTuple > EdgeList
const EigenValues & getEigenValues() const
void fillConvexHullHists(reco::ClusterParameters &, bool) const
reco::PrincipalComponents & getFullPCA()
reco::Hit3DToEdgeMap & getConvexHullEdgeMap()
std::tuple< const reco::ClusterHit3D *, const reco::ClusterHit3D *, double > EdgeTuple
reco::ProjectedPointList & getConvexHullExtremePoints()
reco::ConvexHullKinkTupleList & getConvexHullKinkPoints()
Define a container for working with the convex hull.
T get(std::string const &key) const
std::string indent(std::size_t const i)
const Eigen::Vector3f & getAvePosition() const
void pruneHitOrderTupleLists(HitOrderTupleList &, HitOrderTupleList &) const
ConvexHullPathFinder(const fhicl::ParameterSet &)
Constructor.
std::list< ConvexHullKinkTuple > ConvexHullKinkTupleList
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
Detector simulation of raw signals on wires.
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
constexpr auto const & left(const_AssnsIter< L, R, D, Dir > const &a, const_AssnsIter< L, R, D, Dir > const &b)
reco::ConvexHull & getConvexHull()
decltype(auto) get(T &&obj)
ADL-aware version of std::to_string.
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.
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
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()
void ModifyClusters(reco::ClusterParametersList &) const override
Scan an input collection of clusters and modify those according to the specific implementing algorith...
reco::ProjectedPointList & getProjectedPointList()
reco::EdgeList & getConvexHullEdgeList()
bool fEnableMonitoring
FHICL parameters.
std::pair< reco::ProjectedPoint, reco::ProjectedPoint > MinMaxPoints
std::list< HitOrderTuple > HitOrderTupleList
float fMinGapSize
Minimum gap size to break at gaps.
std::list< ClusterParameters > ClusterParametersList
const EigenVectors & getEigenVectors() const
bool completeCandidateCluster(Eigen::Vector3f &, reco::ClusterParameters &, int) const