9 #include "Pandora/AlgorithmHeaders.h" 21 TwoDSlidingFitConsolidationAlgorithm::TwoDSlidingFitConsolidationAlgorithm() :
22 m_minTrackLength(7.5
f),
23 m_maxClusterLength(15.
f),
24 m_halfWindowLayers(25)
32 const ClusterList *pClusterList = NULL;
33 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*
this, pClusterList));
45 this->
GetReclusteredHits(slidingFitResultList, showerClusters, clustersToExpand, clustersToContract);
48 ClusterSet unavailableClusters;
49 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->
RemoveHitsFromClusters(clustersToContract, unavailableClusters));
50 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->
AddHitsToClusters(clustersToExpand, unavailableClusters));
51 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->
RebuildClusters(clustersToContract, unavailableClusters));
53 return STATUS_CODE_SUCCESS;
63 const Cluster *
const pCluster = *iter;
68 showerClusters.push_back(pCluster);
71 trackClusters.push_back(pCluster);
88 slidingFitResultList.push_back(slidingFitResult);
90 catch (StatusCodeException &statusCodeException)
92 if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
93 throw statusCodeException;
102 ClusterList clusterList;
103 for (
const auto &mapEntry : clustersToContract)
104 clusterList.push_back(mapEntry.first);
107 for (
const Cluster *
const pCluster : clusterList)
109 const CaloHitList &caloHitListToRemove(clustersToContract.at(pCluster));
111 if (caloHitListToRemove.empty())
114 if (unavailableClusters.count(pCluster))
117 CaloHitList caloHitList, caloHitListToKeep;
118 pCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
120 for (
const CaloHit *
const pCaloHit : caloHitList)
122 if (caloHitListToRemove.end() == std::find(caloHitListToRemove.begin(), caloHitListToRemove.end(), pCaloHit))
123 caloHitListToKeep.push_back(pCaloHit);
126 if (caloHitListToKeep.empty())
129 unavailableClusters.insert(pCluster);
130 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete<Cluster>(*
this, pCluster));
134 for (
const CaloHit *
const pCaloHit : caloHitListToRemove)
136 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::RemoveFromCluster(*
this, pCluster, pCaloHit));
140 return STATUS_CODE_SUCCESS;
147 ClusterList clusterList;
149 for (
const auto &mapEntry : clustersToExpand)
151 if (!unavailableClusters.count(mapEntry.first))
152 clusterList.push_back(mapEntry.first);
157 for (
const Cluster *
const pCluster : clusterList)
159 const CaloHitList &caloHitList(clustersToExpand.at(pCluster));
161 if (caloHitList.empty())
164 if (unavailableClusters.count(pCluster))
167 unavailableClusters.insert(pCluster);
169 for (
const CaloHit *
const pCaloHit : caloHitList)
171 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToCluster(*
this, pCluster, pCaloHit));
175 return STATUS_CODE_SUCCESS;
182 if (clustersToRebuild.empty())
183 return STATUS_CODE_SUCCESS;
186 for (
const auto &mapEntry : clustersToRebuild)
188 if (!unavailableClusters.count(mapEntry.first))
189 sortedClusters.push_back(mapEntry.first);
194 for (
const Cluster *
const pCluster : sortedClusters)
196 const CaloHitList &caloHitList(clustersToRebuild.at(pCluster));
197 const Cluster *
const pClusterToDelete(pCluster);
199 if (caloHitList.empty())
202 std::string currentClusterListName;
203 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentListName<Cluster>(*
this, currentClusterListName));
204 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete<Cluster>(*
this, pClusterToDelete));
206 const ClusterList *pClusterList = NULL;
207 std::string newClusterListName;
208 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=,
211 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Cluster>(*
this, newClusterListName, currentClusterListName));
212 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Cluster>(*
this, currentClusterListName));
215 return STATUS_CODE_SUCCESS;
222 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithm(*
this, xmlHandle,
"ClusterRebuilding",
m_reclusteringAlgorithmName));
224 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MinTrackLength",
m_minTrackLength));
226 PANDORA_RETURN_RESULT_IF_AND_IF(
227 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MaxClusterLength",
m_maxClusterLength));
229 PANDORA_RETURN_RESULT_IF_AND_IF(
230 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"SlidingFitHalfWindow",
m_halfWindowLayers));
232 return STATUS_CODE_SUCCESS;
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position, then pulse-height.
unsigned int m_halfWindowLayers
Size of layer window for sliding fit results.
std::unordered_map< const pandora::Cluster *, pandora::CaloHitList > ClusterToHitMap
float m_maxClusterLength
Maximum length of shower clusters to use in re-building.
float m_minTrackLength
Minimum length of track clusters to consolidate.
Header file for the 2D sliding fit consolidation algorithm class.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
Header file for the geometry helper class.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
void BuildSlidingLinearFits(const pandora::ClusterVector &trackClusters, TwoDSlidingFitResultList &slidingFitResultList) const
Apply sliding linear fits to track clusters.
Header file for the cluster helper class.
std::vector< TwoDSlidingFitResult > TwoDSlidingFitResultList
static float GetWirePitch(const pandora::Pandora &pandora, const pandora::HitType view, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
std::string m_reclusteringAlgorithmName
Name of daughter algorithm to use for cluster re-building.
pandora::StatusCode Run()
void SortInputClusters(const pandora::ClusterList *const pClusterList, pandora::ClusterVector &trackClusters, pandora::ClusterVector &showerClusters) const
Sort input cluster list into track-like clusters and shower-like clusters.
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.
virtual void GetReclusteredHits(const TwoDSlidingFitResultList &slidingFitResultList, const pandora::ClusterVector &showerClusters, ClusterToHitMap &caloHitsToAdd, ClusterToHitMap &caloHitsToRemove) const =0
Get the list of hits to be added or removed from clusters.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
pandora::StatusCode AddHitsToClusters(const ClusterToHitMap &clustersToRebuild, pandora::ClusterSet &unavailableClusters) const
Add hits to clusters.
TwoDSlidingFitResult class.
pandora::StatusCode RemoveHitsFromClusters(const ClusterToHitMap &clustersToRebuild, pandora::ClusterSet &unavailableClusters) const
Remove hits from clusters.
pandora::StatusCode RebuildClusters(const ClusterToHitMap &clustersAtStart, const pandora::ClusterSet &unavailableClusters) const
Re-build clusters.