9 #include "Pandora/PdgTable.h" 27 void LArPfoHelper::GetCoordinateVector(
const ParticleFlowObject *
const pPfo,
const HitType &hitType, CartesianPointVector &coordinateVector)
29 ClusterList clusterList;
30 LArPfoHelper::GetClusters(pPfo, hitType, clusterList);
32 for (
const Cluster *
const pCluster : clusterList)
33 LArClusterHelper::GetCoordinateVector(pCluster, coordinateVector);
38 void LArPfoHelper::GetCaloHits(
const PfoList &pfoList,
const HitType &hitType, CaloHitList &caloHitList)
40 for (
const ParticleFlowObject *
const pPfo : pfoList)
41 LArPfoHelper::GetCaloHits(pPfo, hitType, caloHitList);
46 void LArPfoHelper::GetCaloHits(
const ParticleFlowObject *
const pPfo,
const HitType &hitType, CaloHitList &caloHitList)
48 ClusterList clusterList;
49 LArPfoHelper::GetClusters(pPfo, hitType, clusterList);
51 for (
const Cluster *
const pCluster : clusterList)
52 pCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
57 void LArPfoHelper::GetIsolatedCaloHits(
const PfoList &pfoList,
const HitType &hitType, CaloHitList &caloHitList)
59 for (
const ParticleFlowObject *
const pPfo : pfoList)
60 LArPfoHelper::GetIsolatedCaloHits(pPfo, hitType, caloHitList);
65 void LArPfoHelper::GetIsolatedCaloHits(
const ParticleFlowObject *
const pPfo,
const HitType &hitType, CaloHitList &caloHitList)
67 ClusterList clusterList;
68 LArPfoHelper::GetClusters(pPfo, hitType, clusterList);
70 for (
const Cluster *
const pCluster : clusterList)
71 caloHitList.insert(caloHitList.end(), pCluster->GetIsolatedCaloHitList().begin(), pCluster->GetIsolatedCaloHitList().end());
76 void LArPfoHelper::GetAllCaloHits(
const ParticleFlowObject *
const pPfo, CaloHitList &caloHitList)
78 LArPfoHelper::GetCaloHits(pPfo, TPC_VIEW_U, caloHitList);
79 LArPfoHelper::GetCaloHits(pPfo, TPC_VIEW_V, caloHitList);
80 LArPfoHelper::GetCaloHits(pPfo, TPC_VIEW_W, caloHitList);
81 LArPfoHelper::GetIsolatedCaloHits(pPfo, TPC_VIEW_U, caloHitList);
82 LArPfoHelper::GetIsolatedCaloHits(pPfo, TPC_VIEW_V, caloHitList);
83 LArPfoHelper::GetIsolatedCaloHits(pPfo, TPC_VIEW_W, caloHitList);
88 void LArPfoHelper::GetClusters(
const PfoList &pfoList,
const HitType &hitType, ClusterList &clusterList)
90 for (
const ParticleFlowObject *
const pPfo : pfoList)
91 LArPfoHelper::GetClusters(pPfo, hitType, clusterList);
96 void LArPfoHelper::GetClusters(
const ParticleFlowObject *
const pPfo,
const HitType &hitType, ClusterList &clusterList)
98 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
100 if (hitType != LArClusterHelper::GetClusterHitType(pCluster))
103 clusterList.push_back(pCluster);
109 unsigned int LArPfoHelper::GetNumberOfTwoDHits(
const ParticleFlowObject *
const pPfo)
111 unsigned int totalHits(0);
113 ClusterList clusterList;
114 LArPfoHelper::GetTwoDClusterList(pPfo, clusterList);
115 for (
const Cluster *
const pCluster : clusterList)
116 totalHits += pCluster->GetNCaloHits();
123 unsigned int LArPfoHelper::GetNumberOfThreeDHits(
const ParticleFlowObject *
const pPfo)
125 ClusterList clusterList3D;
126 LArPfoHelper::GetThreeDClusterList(pPfo, clusterList3D);
130 for (
const Cluster *
const pCluster3D : clusterList3D)
131 total3DHits += pCluster3D->GetNCaloHits();
138 void LArPfoHelper::GetTwoDClusterList(
const ParticleFlowObject *
const pPfo, ClusterList &clusterList)
140 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
142 if (TPC_3D == LArClusterHelper::GetClusterHitType(pCluster))
145 clusterList.push_back(pCluster);
151 void LArPfoHelper::GetThreeDClusterList(
const ParticleFlowObject *
const pPfo, ClusterList &clusterList)
153 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
155 if (TPC_3D != LArClusterHelper::GetClusterHitType(pCluster))
158 clusterList.push_back(pCluster);
164 void LArPfoHelper::GetAllConnectedPfos(
const PfoList &inputPfoList, PfoList &outputPfoList)
166 for (
const ParticleFlowObject *
const pPfo : inputPfoList)
167 LArPfoHelper::GetAllConnectedPfos(pPfo, outputPfoList);
172 void LArPfoHelper::GetAllConnectedPfos(
const ParticleFlowObject *
const pPfo, PfoList &outputPfoList)
174 if (outputPfoList.end() != std::find(outputPfoList.begin(), outputPfoList.end(), pPfo))
177 outputPfoList.push_back(pPfo);
178 LArPfoHelper::GetAllConnectedPfos(pPfo->GetParentPfoList(), outputPfoList);
179 LArPfoHelper::GetAllConnectedPfos(pPfo->GetDaughterPfoList(), outputPfoList);
184 void LArPfoHelper::GetAllDownstreamPfos(
const PfoList &inputPfoList, PfoList &outputPfoList)
186 for (
const ParticleFlowObject *
const pPfo : inputPfoList)
187 LArPfoHelper::GetAllDownstreamPfos(pPfo, outputPfoList);
192 void LArPfoHelper::GetAllDownstreamPfos(
const ParticleFlowObject *
const pPfo, PfoList &outputPfoList)
194 if (outputPfoList.end() != std::find(outputPfoList.begin(), outputPfoList.end(), pPfo))
197 outputPfoList.push_back(pPfo);
198 LArPfoHelper::GetAllDownstreamPfos(pPfo->GetDaughterPfoList(), outputPfoList);
203 void LArPfoHelper::GetAllDownstreamPfos(
204 const pandora::ParticleFlowObject *
const pPfo, pandora::PfoList &outputTrackPfoList, pandora::PfoList &outputLeadingShowerPfoList)
206 if (LArPfoHelper::IsTrack(pPfo))
208 outputTrackPfoList.emplace_back(pPfo);
209 for (
const ParticleFlowObject *pChild : pPfo->GetDaughterPfoList())
211 if (std::find(outputTrackPfoList.begin(), outputTrackPfoList.end(), pChild) == outputTrackPfoList.end())
213 const int pdg{
std::abs(pChild->GetParticleId())};
216 outputLeadingShowerPfoList.emplace_back(pChild);
220 outputTrackPfoList.emplace_back(pChild);
221 LArPfoHelper::GetAllDownstreamPfos(pChild, outputTrackPfoList, outputLeadingShowerPfoList);
228 outputLeadingShowerPfoList.emplace_back(pPfo);
234 int LArPfoHelper::GetHierarchyTier(
const ParticleFlowObject *
const pPfo)
236 const ParticleFlowObject *pParentPfo = pPfo;
239 while (pParentPfo->GetParentPfoList().empty() ==
false)
241 if (1 != pParentPfo->GetParentPfoList().size())
242 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
244 pParentPfo = *(pParentPfo->GetParentPfoList().begin());
253 float LArPfoHelper::GetTwoDLengthSquared(
const ParticleFlowObject *
const pPfo)
255 if (!LArPfoHelper::IsTwoD(pPfo))
256 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
258 float lengthSquared(0.
f);
260 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
262 if (TPC_3D == LArClusterHelper::GetClusterHitType(pCluster))
265 lengthSquared += LArClusterHelper::GetLengthSquared(pCluster);
268 return lengthSquared;
273 float LArPfoHelper::GetThreeDLengthSquared(
const ParticleFlowObject *
const pPfo)
275 if (!LArPfoHelper::IsThreeD(pPfo))
276 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
278 float lengthSquared(0.
f);
280 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
282 if (TPC_3D != LArClusterHelper::GetClusterHitType(pCluster))
285 lengthSquared += LArClusterHelper::GetLengthSquared(pCluster);
288 return lengthSquared;
293 float LArPfoHelper::GetClosestDistance(
const ParticleFlowObject *
const pPfo,
const Cluster *
const pCluster)
295 const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
297 ClusterList clusterList;
298 LArPfoHelper::GetClusters(pPfo, hitType, clusterList);
300 if (clusterList.empty())
301 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
303 float bestDistance(std::numeric_limits<float>::max());
305 for (
const Cluster *
const pPfoCluster : clusterList)
307 const float thisDistance(LArClusterHelper::GetClosestDistance(pCluster, pPfoCluster));
309 if (thisDistance < bestDistance)
310 bestDistance = thisDistance;
318 float LArPfoHelper::GetThreeDSeparation(
const ParticleFlowObject *
const pPfo1,
const ParticleFlowObject *
const pPfo2)
320 ClusterList clusterList1, clusterList2;
322 LArPfoHelper::GetClusters(pPfo1, TPC_3D, clusterList1);
323 LArPfoHelper::GetClusters(pPfo2, TPC_3D, clusterList2);
325 if (clusterList1.empty() || clusterList2.empty())
326 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
328 return LArClusterHelper::GetClosestDistance(clusterList1, clusterList2);
333 bool LArPfoHelper::IsTwoD(
const ParticleFlowObject *
const pPfo)
335 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
337 if (TPC_3D != LArClusterHelper::GetClusterHitType(pCluster))
346 bool LArPfoHelper::IsThreeD(
const ParticleFlowObject *
const pPfo)
348 for (
const Cluster *
const pCluster : pPfo->GetClusterList())
350 if (TPC_3D == LArClusterHelper::GetClusterHitType(pCluster))
359 bool LArPfoHelper::IsTrack(
const ParticleFlowObject *
const pPfo)
361 const int pdg(pPfo->GetParticleId());
369 bool LArPfoHelper::IsShower(
const ParticleFlowObject *
const pPfo)
371 const int pdg(pPfo->GetParticleId());
379 float LArPfoHelper::GetTrackScore(
const ParticleFlowObject *
const pPfo)
381 float trackScore(-999.
f);
383 const PropertiesMap &metadata(pPfo->GetPropertiesMap());
385 if (metadata.find(
"TrackScore") != metadata.end())
386 trackScore = metadata.at(
"TrackScore");
393 int LArPfoHelper::GetPrimaryNeutrino(
const ParticleFlowObject *
const pPfo)
397 const ParticleFlowObject *
const pParentPfo = LArPfoHelper::GetParentNeutrino(pPfo);
398 return pParentPfo->GetParticleId();
400 catch (
const StatusCodeException &)
408 bool LArPfoHelper::IsFinalState(
const ParticleFlowObject *
const pPfo)
410 if (pPfo->GetParentPfoList().empty() && !LArPfoHelper::IsNeutrino(pPfo))
413 if (LArPfoHelper::IsNeutrinoFinalState(pPfo))
421 bool LArPfoHelper::IsNeutrinoFinalState(
const ParticleFlowObject *
const pPfo)
423 return ((pPfo->GetParentPfoList().size() == 1) && (LArPfoHelper::IsNeutrino(*(pPfo->GetParentPfoList().begin()))));
428 bool LArPfoHelper::IsNeutrino(
const ParticleFlowObject *
const pPfo)
430 const int absoluteParticleId(
std::abs(pPfo->GetParticleId()));
432 if ((NU_E == absoluteParticleId) || (NU_MU == absoluteParticleId) || (NU_TAU == absoluteParticleId))
440 bool LArPfoHelper::IsTestBeamFinalState(
const ParticleFlowObject *
const pPfo)
442 return LArPfoHelper::IsTestBeam(LArPfoHelper::GetParentPfo(pPfo));
447 bool LArPfoHelper::IsTestBeam(
const ParticleFlowObject *
const pPfo)
449 const PropertiesMap &properties(pPfo->GetPropertiesMap());
452 if (iter != properties.end())
453 return ((iter->second > 0.f) ?
true :
false);
460 void LArPfoHelper::GetRecoNeutrinos(
const PfoList *
const pPfoList, PfoList &recoNeutrinos)
465 for (
const ParticleFlowObject *
const pPfo : *pPfoList)
467 if (LArPfoHelper::IsNeutrino(pPfo))
468 recoNeutrinos.push_back(pPfo);
474 const ParticleFlowObject *LArPfoHelper::GetParentPfo(
const ParticleFlowObject *
const pPfo)
476 const ParticleFlowObject *pParentPfo = pPfo;
478 while (pParentPfo->GetParentPfoList().empty() ==
false)
480 pParentPfo = *(pParentPfo->GetParentPfoList().begin());
488 const ParticleFlowObject *LArPfoHelper::GetParentNeutrino(
const ParticleFlowObject *
const pPfo)
490 const ParticleFlowObject *
const pParentPfo = LArPfoHelper::GetParentPfo(pPfo);
492 if (!LArPfoHelper::IsNeutrino(pParentPfo))
493 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
500 const Vertex *LArPfoHelper::GetVertex(
const ParticleFlowObject *
const pPfo)
502 if (pPfo->GetVertexList().empty())
503 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
505 const Vertex *pVertex(
nullptr);
508 if (LArPfoHelper::IsTestBeam(pPfo) && pPfo->GetParentPfoList().empty())
510 pVertex = LArPfoHelper::GetVertexWithLabel(pPfo->GetVertexList(), VERTEX_START);
514 if (pPfo->GetVertexList().size() != 1)
515 throw StatusCodeException(STATUS_CODE_FAILURE);
517 pVertex = *(pPfo->GetVertexList().begin());
520 if (VERTEX_3D != pVertex->GetVertexType())
521 throw StatusCodeException(STATUS_CODE_FAILURE);
528 const Vertex *LArPfoHelper::GetTestBeamInteractionVertex(
const ParticleFlowObject *
const pPfo)
530 if (pPfo->GetVertexList().empty() || !pPfo->GetParentPfoList().empty() || !LArPfoHelper::IsTestBeam(pPfo))
531 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
533 const Vertex *pInteractionVertex(LArPfoHelper::GetVertexWithLabel(pPfo->GetVertexList(), VERTEX_INTERACTION));
535 if (VERTEX_3D != pInteractionVertex->GetVertexType())
536 throw StatusCodeException(STATUS_CODE_FAILURE);
538 return pInteractionVertex;
543 const Vertex *LArPfoHelper::GetVertexWithLabel(
const VertexList &vertexList,
const VertexLabel vertexLabel)
545 const Vertex *pTargetVertex(
nullptr);
547 for (
const Vertex *pCandidateVertex : vertexList)
549 if (pCandidateVertex->GetVertexLabel() == vertexLabel)
553 pTargetVertex = pCandidateVertex;
557 throw StatusCodeException(STATUS_CODE_FAILURE);
563 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
565 return pTargetVertex;
570 void LArPfoHelper::GetSlidingFitTrajectory(
const CartesianPointVector &pointVector,
const CartesianVector &vertexPosition,
573 LArPfoHelper::SlidingFitTrajectoryImpl(&pointVector, vertexPosition, layerWindow, layerPitch, trackStateVector, pIndexVector);
578 void LArPfoHelper::GetSlidingFitTrajectory(
const ParticleFlowObject *
const pPfo,
const Vertex *
const pVertex,
579 const unsigned int layerWindow,
const float layerPitch,
LArTrackStateVector &trackStateVector)
581 CaloHitList caloHitList;
582 LArPfoHelper::GetCaloHits(pPfo, TPC_3D, caloHitList);
583 LArPfoHelper::SlidingFitTrajectoryImpl(&caloHitList, pVertex->GetPosition(), layerWindow, layerPitch, trackStateVector);
588 LArShowerPCA LArPfoHelper::GetPrincipalComponents(
const CartesianPointVector &pointVector,
const CartesianVector &vertexPosition)
591 CartesianVector centroid(0.
f, 0.
f, 0.
f);
594 LArPcaHelper::RunPca(pointVector, centroid, eigenValues, eigenVecs);
597 if (eigenValues.GetX() < std::numeric_limits<float>::epsilon())
598 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
601 const float testProjection(eigenVecs.at(0).GetDotProduct(vertexPosition - centroid));
602 const float directionScaleFactor((testProjection > std::numeric_limits<float>::epsilon()) ? -1.
f : 1.
f);
604 const CartesianVector primaryAxis(eigenVecs.at(0) * directionScaleFactor);
605 const CartesianVector secondaryAxis(eigenVecs.at(1) * directionScaleFactor);
606 const CartesianVector tertiaryAxis(eigenVecs.at(2) * directionScaleFactor);
608 return LArShowerPCA(centroid, primaryAxis, secondaryAxis, tertiaryAxis, eigenValues);
613 LArShowerPCA LArPfoHelper::GetPrincipalComponents(
const ParticleFlowObject *
const pPfo,
const Vertex *
const pVertex)
615 CartesianPointVector pointVector;
616 LArPfoHelper::GetCoordinateVector(pPfo, TPC_3D, pointVector);
617 return LArPfoHelper::GetPrincipalComponents(pointVector, pVertex->GetPosition());
624 if (lhs.first != rhs.first)
625 return (lhs.first < rhs.first);
631 const float dx(lhs.second.GetPosition().GetX() - rhs.second.GetPosition().GetX());
632 const float dy(lhs.second.GetPosition().GetY() - rhs.second.GetPosition().GetY());
633 const float dz(lhs.second.GetPosition().GetZ() - rhs.second.GetPosition().GetZ());
634 return (dx + dy + dz > 0.
f);
639 bool LArPfoHelper::SortByNHits(
const ParticleFlowObject *
const pLhs,
const ParticleFlowObject *
const pRhs)
641 unsigned int nTwoDHitsLhs(0), nThreeDHitsLhs(0);
642 float energyLhs(0.
f);
643 for (
ClusterList::const_iterator iter = pLhs->GetClusterList().begin(), iterEnd = pLhs->GetClusterList().end(); iter != iterEnd; ++iter)
645 const Cluster *
const pClusterLhs = *iter;
647 if (TPC_3D != LArClusterHelper::GetClusterHitType(pClusterLhs))
648 nTwoDHitsLhs += pClusterLhs->GetNCaloHits();
650 nThreeDHitsLhs += pClusterLhs->GetNCaloHits();
652 energyLhs += pClusterLhs->GetHadronicEnergy();
655 unsigned int nTwoDHitsRhs(0), nThreeDHitsRhs(0);
656 float energyRhs(0.
f);
657 for (
ClusterList::const_iterator iter = pRhs->GetClusterList().begin(), iterEnd = pRhs->GetClusterList().end(); iter != iterEnd; ++iter)
659 const Cluster *
const pClusterRhs = *iter;
661 if (TPC_3D != LArClusterHelper::GetClusterHitType(pClusterRhs))
662 nTwoDHitsRhs += pClusterRhs->GetNCaloHits();
664 nThreeDHitsRhs += pClusterRhs->GetNCaloHits();
666 energyRhs += pClusterRhs->GetHadronicEnergy();
669 if (nTwoDHitsLhs != nTwoDHitsRhs)
670 return (nTwoDHitsLhs > nTwoDHitsRhs);
672 if (nThreeDHitsLhs != nThreeDHitsRhs)
673 return (nThreeDHitsLhs > nThreeDHitsRhs);
676 return (energyLhs > energyRhs);
681 void LArPfoHelper::GetBreadthFirstHierarchyRepresentation(
const pandora::ParticleFlowObject *
const pPfo, pandora::PfoList &pfoList)
683 const ParticleFlowObject *pRoot{pPfo};
684 PfoList parents{pRoot->GetParentPfoList()};
685 while (!parents.empty())
687 if (parents.size() > 1)
688 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
689 pRoot = parents.front();
690 parents = pRoot->GetParentPfoList();
693 pfoList.emplace_back(pRoot);
694 queue.emplace_back(pRoot);
696 while (!queue.empty())
698 const PfoList &daughters{queue.front()->GetDaughterPfoList()};
700 for (
const ParticleFlowObject *pDaughter : daughters)
702 pfoList.emplace_back(pDaughter);
703 queue.emplace_back(pDaughter);
710 template <
typename T>
711 void LArPfoHelper::SlidingFitTrajectoryImpl(
const T *
const pT,
const CartesianVector &vertexPosition,
const unsigned int layerWindow,
714 CartesianPointVector pointVector;
716 for (
const auto &nextPoint : *pT)
717 pointVector.push_back(LArObjectHelper::TypeAdaptor::GetPosition(nextPoint));
719 if (pointVector.empty())
720 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
722 std::sort(pointVector.begin(), pointVector.end(), LArClusterHelper::SortCoordinatesByPosition);
727 pIndexVector->clear();
735 if ((maxPosition - minPosition).GetMagnitudeSquared() < std::numeric_limits<float>::epsilon())
736 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
738 const CartesianVector seedPosition((maxPosition + minPosition) * 0.5
f);
739 const CartesianVector seedDirection((maxPosition - minPosition).GetUnitVector());
741 const float scaleFactor((seedDirection.GetDotProduct(seedPosition - vertexPosition) > 0.f) ? +1.f : -1.f);
744 for (
const auto &nextPoint : *pT)
752 CartesianVector position(0.f, 0.f, 0.f);
755 if (positionStatusCode != STATUS_CODE_SUCCESS)
756 throw StatusCodeException(positionStatusCode);
758 CartesianVector direction(0.f, 0.f, 0.f);
761 if (directionStatusCode != STATUS_CODE_SUCCESS)
762 throw StatusCodeException(directionStatusCode);
764 const float projection(seedDirection.GetDotProduct(position - seedPosition));
767 LArTrackState(position, direction * scaleFactor, LArObjectHelper::TypeAdaptor::GetCaloHit(nextPoint)), index));
769 catch (
const StatusCodeException &statusCodeException1)
771 indicesWithoutSpacePoints.push_back(index);
773 if (STATUS_CODE_FAILURE == statusCodeException1.GetStatusCode())
774 throw statusCodeException1;
778 catch (
const StatusCodeException &statusCodeException2)
780 if (STATUS_CODE_FAILURE == statusCodeException2.GetStatusCode())
781 throw statusCodeException2;
785 std::sort(trackTrajectory.begin(), trackTrajectory.end(), LArPfoHelper::SortByHitProjection);
789 trackStateVector.push_back(larTrackTrajectoryPoint.second);
791 pIndexVector->push_back(larTrackTrajectoryPoint.GetIndex());
797 for (
const int index : indicesWithoutSpacePoints)
798 pIndexVector->push_back(index);
804 template void LArPfoHelper::SlidingFitTrajectoryImpl(
806 template void LArPfoHelper::SlidingFitTrajectoryImpl(
Header file for the pfo helper class.
pandora::CartesianVector EigenValues
constexpr auto abs(T v)
Returns the absolute value of the argument.
Header file for the principal curve analysis helper class.
std::vector< int > IntVector
float GetLongitudinalDisplacement(const pandora::CartesianVector &position) const
Get longitudinal projection onto primary axis.
std::vector< LArTrackTrajectoryPoint > LArTrackTrajectory
Header file for the object helper class.
Header file for the cluster helper class.
pandora::StatusCode GetGlobalFitDirection(const float rL, pandora::CartesianVector &direction) const
Get global fit direction for a given longitudinal coordinate.
const pandora::CartesianVector & GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
Header file for the lar three dimensional sliding fit result class.
std::vector< pandora::CartesianVector > EigenVectors
ThreeDSlidingFitResult class.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
std::vector< LArTrackState > LArTrackStateVector
LArTrackTrajectoryPoint class.
pandora::StatusCode GetGlobalFitPosition(const float rL, pandora::CartesianVector &position) const
Get global fit position for a given longitudinal coordinate.
std::list< Vertex > VertexList
const pandora::CartesianVector & GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.