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);
89 slidingFitResultList.push_back(slidingFitResult);
91 catch (StatusCodeException &statusCodeException)
93 if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
94 throw statusCodeException;
103 ClusterList clusterList;
104 for (
const auto &mapEntry : clustersToContract) 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;
148 for (
const auto &mapEntry : clustersToExpand) clusterList.push_back(mapEntry.first);
151 for (
const Cluster *
const pCluster : clusterList)
153 const CaloHitList &caloHitList(clustersToExpand.at(pCluster));
155 if (caloHitList.empty())
158 if (unavailableClusters.count(pCluster))
161 unavailableClusters.insert(pCluster);
163 for (
const CaloHit *
const pCaloHit : caloHitList)
165 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::AddToCluster(*
this, pCluster, pCaloHit));
169 return STATUS_CODE_SUCCESS;
176 if (clustersToRebuild.empty())
177 return STATUS_CODE_SUCCESS;
180 for (
const auto &mapEntry : clustersToRebuild)
182 if (!unavailableClusters.count(mapEntry.first))
183 sortedClusters.push_back(mapEntry.first);
188 for (
const Cluster *
const pCluster : sortedClusters)
190 const CaloHitList &caloHitList(clustersToRebuild.at(pCluster));
191 const Cluster *
const pClusterToDelete(pCluster);
193 if (caloHitList.empty())
196 std::string currentClusterListName;
197 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentListName<Cluster>(*
this, currentClusterListName));
198 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Delete<Cluster>(*
this, pClusterToDelete));
200 const ClusterList *pClusterList = NULL;
201 std::string newClusterListName;
203 pClusterList, newClusterListName));
205 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::SaveList<Cluster>(*
this, newClusterListName, currentClusterListName));
206 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Cluster>(*
this, currentClusterListName));
209 return STATUS_CODE_SUCCESS;
216 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithm(*
this, xmlHandle,
219 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
222 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
225 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
228 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.
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.
std::unordered_map< const pandora::Cluster *, pandora::CaloHitList > ClusterToHitMap
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
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
std::vector< art::Ptr< recob::Cluster > > ClusterVector
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.
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.