9 #include "Pandora/AlgorithmHeaders.h"
18 TrackConsolidationAlgorithm::TrackConsolidationAlgorithm() :
19 m_maxTransverseDisplacement(1.f),
20 m_minAssociatedSpan(1.f),
21 m_minAssociatedFraction(0.5f)
28 const ClusterVector &showerClustersJ, ClusterToHitMap &caloHitsToAddI, ClusterToHitMap &caloHitsToRemoveJ)
const
32 const Cluster *
const pClusterI = slidingFitResultI.GetCluster();
35 for (
const Cluster *
const pClusterJ : showerClustersJ)
39 if (pClusterI == pClusterJ)
42 if (2.f * thisLengthSquaredJ > thisLengthSquaredI)
45 this->
GetReclusteredHits(slidingFitResultI, pClusterJ, caloHitsToAddI, caloHitsToRemoveJ);
53 ClusterToHitMap &caloHitsToAddI, ClusterToHitMap &caloHitsToRemoveJ)
const
55 const Cluster *
const pClusterI(slidingFitResultI.GetCluster());
57 CaloHitList associatedHits, caloHitListJ;
58 pClusterJ->GetOrderedCaloHitList().FillCaloHitList(caloHitListJ);
60 float minL(std::numeric_limits<float>::max());
61 float maxL(std::numeric_limits<float>::max());
77 for (CaloHitList::const_iterator iterJ = caloHitListJ.begin(), iterEndJ = caloHitListJ.end(); iterJ != iterEndJ; ++iterJ)
79 const CaloHit *
const pCaloHitJ = *iterJ;
81 const CartesianVector positionJ(pCaloHitJ->GetPositionVector());
84 float rL(0.f), rT(0.f);
85 CartesianVector positionK(0.f, 0.f, 0.f);
87 if (STATUS_CODE_SUCCESS != slidingFitResultI.GetGlobalFitProjection(positionJ, positionK))
90 slidingFitResultI.GetLocalPosition(positionK, rL, rT);
92 const float rsqIJ((positionI - positionJ).GetMagnitudeSquared());
93 const float rsqJK((positionJ - positionK).GetMagnitudeSquared());
94 const float rsqKI((positionK - positionI).GetMagnitudeSquared());
98 if (associatedHits.empty())
105 minL = std::min(minL, rL);
106 maxL = std::max(maxL, rL);
109 associatedHits.push_back(pCaloHitJ);
113 const float associatedSpan(maxL - minL);
114 const float associatedFraction(
115 associatedHits.empty() ? 0.f :
static_cast<float>(associatedHits.size()) / static_cast<float>(pClusterJ->GetNCaloHits()));
119 for (CaloHitList::const_iterator iterK = associatedHits.begin(), iterEndK = associatedHits.end(); iterK != iterEndK; ++iterK)
121 const CaloHit *
const pCaloHit = *iterK;
122 const CaloHitList &caloHitList(caloHitsToRemoveJ[pClusterJ]);
124 if (caloHitList.end() != std::find(caloHitList.begin(), caloHitList.end(), pCaloHit))
127 caloHitsToAddI[pClusterI].push_back(pCaloHit);
128 caloHitsToRemoveJ[pClusterJ].push_back(pCaloHit);
137 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
138 XmlHelper::ReadValue(xmlHandle,
"MaxTransverseDisplacement", m_maxTransverseDisplacement));
140 PANDORA_RETURN_RESULT_IF_AND_IF(
141 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MinAssociatedSpan",
m_minAssociatedSpan));
143 PANDORA_RETURN_RESULT_IF_AND_IF(
144 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MinAssociatedFraction",
m_minAssociatedFraction));
Header file for the track consolidation algorithm class.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
void GetReclusteredHits(const TwoDSlidingFitResultList &slidingFitResultList, const pandora::ClusterVector &showerClusters, ClusterToHitMap &caloHitsToAdd, ClusterToHitMap &caloHitsToRemove) const
Get the list of hits to be added to track clusters and removed from shower clusters.
std::vector< TwoDSlidingFitResult > TwoDSlidingFitResultList
float m_maxTransverseDisplacement
required by fuzzyCluster table::sbnd_g4_services gaushitTruthMatch pandora
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
float m_minAssociatedSpan
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
static pandora::CartesianVector GetClosestPosition(const pandora::CartesianVector &position, const pandora::ClusterList &clusterList)
Get closest position in a list of clusters to a specified input position vector.
float m_minAssociatedFraction
TwoDSlidingFitResult class.