26 m_maxIterations(1000),
27 m_maxHitsToConsider3DTrack(100),
28 m_minHitsToConsider3DShower(20),
29 m_maxHitsToConsider2DCluster(50),
30 m_halfWindowLayers(20),
33 m_coneLengthMultiplier(3.f),
34 m_maxConeLength(126.f),
35 m_coneTanHalfAngle(0.2f),
36 m_coneBoundedFraction(0.5f)
44 const Vertex *pVertex(
nullptr);
50 std::cout <<
"SlidingConeClusterMopUpAlgorithm - interaction vertex not available for use." << std::endl;
51 return STATUS_CODE_SUCCESS;
66 return STATUS_CODE_SUCCESS;
80 ((pVertexList && (pVertexList->size() == 1) && (
VERTEX_3D == (*(pVertexList->begin()))->GetVertexType())) ? *(pVertexList->begin()) :
nullptr);
89 const PfoList *pPfoList(
nullptr);
94 for (
const Pfo *
const pPfo : *pPfoList)
99 for (
const Cluster *
const pCluster3D : pfoClusters3D)
107 if (!clusterToPfoMap.insert(ClusterToPfoMap::value_type(pCluster3D, pPfo)).second)
110 clusters3D.push_back(pCluster3D);
129 for (
const Cluster *
const pCluster : *pClusterList)
137 availableClusters2D.push_back(pCluster);
151 for (
const Cluster *
const pShowerCluster : clusters3D)
153 float coneLength3D(0.f);
164 const float vertexToMinLayer(!pVertex ? 0.f : (pVertex->
GetPosition() - minLayerPosition).GetMagnitude());
165 const float vertexToMaxLayer(!pVertex ? 0.f : (pVertex->
GetPosition() - maxLayerPosition).GetMagnitude());
176 for (
const Cluster *
const pNearbyCluster2D : availableClusters2D)
181 for (
const SimpleCone &simpleCone3D : simpleConeList3D)
183 const CartesianVector coneBaseCentre3D(simpleCone3D.GetConeApex() + simpleCone3D.GetConeDirection() * coneLength3D);
192 if (clusterMerge < bestClusterMerge)
193 bestClusterMerge = clusterMerge;
197 clusterMergeMap[pNearbyCluster2D].push_back(bestClusterMerge);
201 for (ClusterMergeMap::value_type &mapEntry : clusterMergeMap)
202 std::sort(mapEntry.second.begin(), mapEntry.second.end());
210 for (
const ClusterMergeMap::value_type &mapEntry : clusterMergeMap)
211 daughterClusters.push_back(mapEntry.first);
214 for (ClusterVector::const_reverse_iterator rIter = daughterClusters.rbegin(), rIterEnd = daughterClusters.rend(); rIter != rIterEnd; ++rIter)
216 const Cluster *
const pDaughterCluster(*rIter);
218 const Cluster *
const pParentCluster3D(clusterMergeMap.at(pDaughterCluster).at(0).GetParentCluster());
220 const Pfo *
const pParentPfo(clusterToPfoMap.at(pParentCluster3D));
227 *
this, pParentCluster, pDaughterCluster, this->
GetListName(pParentCluster), this->
GetListName(pDaughterCluster)));
253 if (std::fabs(this->
GetMeanRT() - rhs.
GetMeanRT()) > std::numeric_limits<float>::epsilon())
Header file for the cluster helper class.
Header file for the geometry helper class.
Header file for the pfo helper class.
Header file for the lar three dimensional sliding cone fit result class.
Header file for the sliding cone cluster mop up algorithm class.
#define PANDORA_THROW_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
static bool IsAvailable(const pandora::Algorithm &algorithm, const T *const pT)
Is object, or a list of objects, available as a building block.
static pandora::StatusCode AddToPfo(const pandora::Algorithm &algorithm, const pandora::ParticleFlowObject *const pPfo, const T *const pT)
Add a cluster to a particle flow object.
static pandora::StatusCode GetCurrentList(const pandora::Algorithm &algorithm, const T *&pT)
Get the current list.
static pandora::StatusCode MergeAndDeleteClusters(const pandora::Algorithm &algorithm, const pandora::Cluster *const pClusterToEnlarge, const pandora::Cluster *const pClusterToDelete)
Merge two clusters in the current list, enlarging one cluster and deleting the second.
static pandora::StatusCode GetList(const pandora::Algorithm &algorithm, const std::string &listName, const T *&pT)
Get a named list.
static const pandora::PandoraSettings * GetSettings(const pandora::Algorithm &algorithm)
Get the pandora settings instance.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
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,...
static float GetWireZPitch(const pandora::Pandora &pandora, const float maxWirePitchDiscrepancy=0.01)
Return the wire pitch.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
static void GetThreeDClusterList(const pandora::ParticleFlowObject *const pPfo, pandora::ClusterList &clusterList)
Get the list of 3D clusters from an input pfo.
static bool IsTrack(const pandora::ParticleFlowObject *const pPfo)
Return track flag based on Pfo Particle ID.
static bool IsShower(const pandora::ParticleFlowObject *const pPfo)
Return shower flag based on Pfo Particle ID.
const std::string GetListName(const T *const pT) const
Find the name of the list hosting a specific object.
pandora::StringVector m_daughterListNames
The list of potential daughter object list names.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
static const pandora::Cluster * GetParentCluster(const pandora::ClusterList &clusterList, const pandora::HitType hitType)
Select the parent cluster (same hit type and most hits) using a provided cluster list and hit type.
float GetBoundedHitFraction(const pandora::Cluster *const pCluster) const
Get the fraction of hits in a provided cluster that are bounded within the cone, using fitted cone an...
float GetMeanRT(const pandora::Cluster *const pCluster) const
Get the mean transverse distance to all hits in a cluster (whether contained or not)
float GetMeanRT() const
Get the mean transverse distance of all hits (whether contained or not)
bool operator<(const ClusterMerge &rhs) const
operator <
float GetBoundedFraction() const
Get the bounded fraction for algorithm-specified cone angle.
const pandora::Cluster * GetParentCluster() const
Get the address of the candidate parent (shower) cluster.
void GetThreeDClusters(pandora::ClusterVector &clusters3D, ClusterToPfoMap &clusterToPfoMap) const
Get all 3d clusters contained in the input pfo lists and a mapping from clusters to pfos.
unsigned int m_halfWindowLayers
The number of layers to use for half-window of sliding fit.
void GetAvailableTwoDClusters(pandora::ClusterVector &availableClusters2D) const
Get all available 2d clusters contained in the input cluster lists.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
float m_coneBoundedFraction
The minimum cluster bounded fraction for association.
float m_coneLengthMultiplier
The cone length multiplier to use when calculating bounded cluster fractions.
void GetInteractionVertex(const pandora::Vertex *&pVertex) const
Get the neutrino interaction vertex if it is available and if the algorithm is configured to do so.
bool m_useVertex
Whether to use the interaction vertex to select useful cone directions.
float m_maxConeLength
The maximum allowed cone length to use when calculating bounded cluster fractions.
pandora::StatusCode Run()
Run the algorithm.
unsigned int m_maxHitsToConsider2DCluster
The maximum number of hits in a 2d cluster to allow pick-up via sliding cone fits.
SlidingConeClusterMopUpAlgorithm()
Default constructor.
pandora::StringVector m_inputPfoListNames
The input pfo list names.
unsigned int m_maxIterations
The maximum allowed number of algorithm iterations.
std::unordered_map< const pandora::Cluster *, const pandora::ParticleFlowObject * > ClusterToPfoMap
unsigned int m_nConeFits
The number of cone fits to perform, spread roughly uniformly along the shower length.
float m_coneTanHalfAngle
The cone tan half angle to use when calculating bounded cluster fractions.
unsigned int m_minHitsToConsider3DShower
The minimum number of hits in a 3d shower cluster to attempt cone fits.
std::unordered_map< const pandora::Cluster *, ClusterMergeList > ClusterMergeMap
void GetClusterMergeMap(const pandora::Vertex *const pVertex, const pandora::ClusterVector &clusters3D, const pandora::ClusterVector &availableClusters2D, ClusterMergeMap &clusterMergeMap) const
Get the cluster merge map describing all potential 3d cluster merges.
unsigned int m_maxHitsToConsider3DTrack
The maximum number of hits in a 3d track cluster to warrant inclusion in algorithm.
unsigned int m_nConeFitLayers
The number of layers over which to sum fitted direction to obtain cone fit.
void MakeClusterMerges(const ClusterToPfoMap &clusterToPfoMap, const ClusterMergeMap &clusterMergeMap) const
Make cluster merges based on the provided cluster merge map.
ThreeDSlidingConeFitResult class.
const ThreeDSlidingFitResult & GetSlidingFitResult() const
Get the sliding fit result for the full cluster.
void GetSimpleConeList(const unsigned int nLayersForConeFit, const unsigned int nCones, const ConeSelection coneSelection, SimpleConeList &simpleConeList) const
Get the list of simple cones fitted to the three dimensional cluster.
const pandora::CartesianVector & GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
const pandora::CartesianVector & GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
CartesianVector GetUnitVector() const
Get a unit vector in the direction of the cartesian vector.
float GetMagnitude() const
Get the magnitude.
bool ShouldDisplayAlgorithmInfo() const
Whether to display algorithm information during processing.
ParticleFlowObject class.
const ClusterList & GetClusterList() const
Get the cluster list.
const Pandora & GetPandora() const
Get the associated pandora instance.
StatusCodeException class.
const CartesianVector & GetPosition() const
Get the vertex position.
static StatusCode ReadVectorOfValues(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, std::vector< T > &vector)
Read a vector of values from a (space separated) list in an xml element.
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
ConeSelection
ConeSelection enum.
std::vector< SimpleCone > SimpleConeList
HitType
Calorimeter hit type enum.
std::vector< const Cluster * > ClusterVector
MANAGED_CONTAINER< const Cluster * > ClusterList
MANAGED_CONTAINER< const Vertex * > VertexList
StatusCode
The StatusCode enum.
MANAGED_CONTAINER< const ParticleFlowObject * > PfoList