9 #include "Pandora/AlgorithmHeaders.h" 21 TwoDSlidingFitMultiSplitAlgorithm::TwoDSlidingFitMultiSplitAlgorithm() :
22 m_slidingFitHalfWindow(15),
23 m_inputClusterList(
"")
31 std::string originalListName;
32 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentListName<Cluster>(*
this, originalListName));
36 const StatusCode statusCode(PandoraContentApi::ReplaceCurrentList<Cluster>(*
this,
m_inputClusterList));
38 if (STATUS_CODE_NOT_FOUND == statusCode)
40 std::cout <<
"TwoDSlidingFitMultiSplitAlgorithm: cluster list not found " <<
m_inputClusterList << std::endl;
41 return STATUS_CODE_SUCCESS;
44 if (STATUS_CODE_SUCCESS != statusCode)
48 const ClusterList *pClusterList = NULL;
49 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::GetCurrentList(*
this, pClusterList));
64 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->
SplitClusters(slidingFitResultMap, clusterSplittingMap));
67 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::ReplaceCurrentList<Cluster>(*
this, originalListName));
69 return STATUS_CODE_SUCCESS;
81 if (slidingFitResultMap.end() == slidingFitResultMap.find(*iter))
87 if (!slidingFitResultMap.insert(TwoDSlidingFitResultMap::value_type(*iter, slidingFitResult)).second)
88 throw StatusCodeException(STATUS_CODE_FAILURE);
90 catch (StatusCodeException &statusCodeException)
92 if (STATUS_CODE_FAILURE == statusCodeException.GetStatusCode())
93 throw statusCodeException;
104 ClusterList clusterList;
105 for (
const auto &mapEntry : clusterSplittingMap) clusterList.push_back(mapEntry.first);
108 for (
const Cluster *
const pCluster : clusterList)
110 const CartesianPointVector &splitPositionVector(clusterSplittingMap.at(pCluster));
112 if (splitPositionVector.empty())
116 if (slidingFitResultMap.end() == sIter)
117 throw StatusCodeException(STATUS_CODE_FAILURE);
121 StatusCode statusCode(this->
SplitCluster(slidingFitResult, splitPositionVector));
123 if (STATUS_CODE_SUCCESS != statusCode)
127 return STATUS_CODE_SUCCESS;
133 const CartesianPointVector &splitPositionVector)
const 135 const Cluster *
const pCluster = slidingFitResult.
GetCluster();
138 FloatVector displacementVector;
141 pIter != pIterEnd; ++pIter)
143 const CartesianVector &splitPosition = *pIter;
145 float rL(0.
f), rT(0.
f);
147 displacementVector.push_back(rL);
150 const float bigL(2.
f * slidingFitResult.
GetL(slidingFitResult.
GetMaxLayer()));
151 displacementVector.push_back(-bigL);
152 displacementVector.push_back(+bigL);
154 std::sort(displacementVector.begin(), displacementVector.end());
157 const ClusterList clusterList(1, pCluster);
158 std::string clusterListToSave, clusterListToDelete;
160 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::InitializeFragmentation(*
this, clusterList,
161 clusterListToDelete, clusterListToSave));
163 CaloHitList oldCaloHitList;
164 pCluster->GetOrderedCaloHitList().FillCaloHitList(oldCaloHitList);
166 bool foundPreviousL(
false);
169 for (
FloatVector::const_iterator fIter = displacementVector.begin(), fIterEnd = displacementVector.end(); fIter != fIterEnd; ++fIter)
171 const float nextL(*fIter);
176 CaloHitList newCaloHitList;
180 const CaloHit *
const pCaloHit = *hIter;
182 float rL(0.
f), rT(0.
f);
185 if (rL >= prevL && rL < nextL)
186 newCaloHitList.push_back(pCaloHit);
189 if (newCaloHitList.empty())
193 PandoraContentApi::Cluster::Parameters newParameters;
194 newParameters.m_caloHitList = newCaloHitList;
196 const Cluster *pNewCluster(NULL);
197 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::Cluster::Create(*
this, newParameters, pNewCluster));
201 foundPreviousL =
true;
205 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, PandoraContentApi::EndFragmentation(*
this, clusterListToSave, clusterListToDelete));
207 return STATUS_CODE_SUCCESS;
214 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
217 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
220 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_slidingFitHalfWindow
virtual void FindBestSplitPositions(const TwoDSlidingFitResultMap &slidingFitResultMap, ClusterPositionMap &clusterSplittingMap) const =0
Determine best split positions based on sliding fit result.
pandora::StatusCode Run()
std::string m_inputClusterList
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
std::unordered_map< const pandora::Cluster *, TwoDSlidingFitResult > TwoDSlidingFitResultMap
pandora::StatusCode SplitClusters(const TwoDSlidingFitResultMap &slidingFitResultMap, const ClusterPositionMap &clusterSplittingMap) const
Split clusters.
Header file for the geometry helper class.
void BuildSlidingFitResultMap(const pandora::ClusterVector &clusterVector, const unsigned int halfWindowLayers, TwoDSlidingFitResultMap &slidingFitResultMap) const
Build the map of sliding fit results.
int GetMaxLayer() const
Get the maximum occupied layer in the sliding fit.
virtual void GetListOfCleanClusters(const pandora::ClusterList *const pClusterList, pandora::ClusterVector &clusterVector) const =0
Populate cluster vector with subset of cluster list, containing clusters judged to be clean...
Header file for the cluster helper class.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
std::vector< art::Ptr< recob::Cluster > > ClusterVector
const pandora::Cluster * GetCluster() const
Get the address of the cluster, if originally provided.
Header file for the 2D sliding fit multi-split algorithm class.
float GetL(const int layer) const
Get longitudinal coordinate for a given sliding linear fit layer number.
pandora::StatusCode SplitCluster(const TwoDSlidingFitResult &slidingFitResult, const pandora::CartesianPointVector &splitPositionList) const
Split cluster.
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.
TwoDSlidingFitResult class.
std::unordered_map< const pandora::Cluster *, pandora::CartesianPointVector > ClusterPositionMap