9 #include "Pandora/AlgorithmHeaders.h" 18 ThreeViewDeltaRayMatchingAlgorithm::ThreeViewDeltaRayMatchingAlgorithm() :
19 m_minClusterCaloHits(5),
20 m_nMaxTensorToolRepeats(10)
36 PANDORA_THROW_RESULT_IF_AND_IF(
37 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, this->
CalculateOverlapResult(pClusterU, pClusterV, pClusterW, overlapResult));
48 float chiSquaredSum(0.
f);
49 unsigned int nSamplingPoints(0), nMatchedSamplingPoints(0);
52 StatusCode statusCode(
53 this->
PerformThreeViewMatching(pClusterU, pClusterV, pClusterW, chiSquaredSum, nSamplingPoints, nMatchedSamplingPoints, xOverlapObject));
55 if (statusCode != STATUS_CODE_SUCCESS)
58 PfoList commonMuonPfoList;
61 if (commonMuonPfoList.empty())
62 return STATUS_CODE_NOT_FOUND;
64 overlapResult =
DeltaRayOverlapResult(nMatchedSamplingPoints, nSamplingPoints, chiSquaredSum, xOverlapObject, commonMuonPfoList);
66 return STATUS_CODE_SUCCESS;
72 const Cluster *
const pClusterU,
const Cluster *
const pClusterV,
const Cluster *
const pClusterW, PfoList &commonMuonPfoList)
const 74 ClusterList consideredClustersU, consideredClustersV, consideredClustersW;
75 PfoList nearbyMuonPfosU, nearbyMuonPfosV, nearbyMuonPfosW;
79 if (nearbyMuonPfosU.empty())
84 if (nearbyMuonPfosV.empty())
89 if (nearbyMuonPfosW.empty())
92 for (
const ParticleFlowObject *
const pNearbyMuonU : nearbyMuonPfosU)
94 for (
const ParticleFlowObject *
const pNearbyMuonV : nearbyMuonPfosV)
96 if (pNearbyMuonV != pNearbyMuonU)
99 for (
const ParticleFlowObject *
const pNearbyMuonW : nearbyMuonPfosW)
101 if (pNearbyMuonW == pNearbyMuonV)
102 commonMuonPfoList.emplace_back(pNearbyMuonU);
113 unsigned int repeatCounter(0);
118 const bool repeatTools(pTool->
Run(
this, this->GetMatchingControl().GetOverlapTensor()));
121 repeatCounter = repeatTools ? repeatCounter + 1 : repeatCounter;
132 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"MuonPfoListName",
m_muonPfoListName));
134 AlgorithmToolVector algorithmToolVector;
135 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithmToolList(*
this, xmlHandle,
"DeltaRayTools", algorithmToolVector));
137 for (
auto algorithmTool : algorithmToolVector)
139 DeltaRayTensorTool *
const pDeltaRayTensorTool(dynamic_cast<DeltaRayTensorTool *>(algorithmTool));
141 if (!pDeltaRayTensorTool)
142 return STATUS_CODE_INVALID_PARAMETER;
147 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithm(*
this, xmlHandle,
"ClusterRebuilding",
m_reclusteringAlgorithmName));
149 PANDORA_RETURN_RESULT_IF_AND_IF(
150 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MinClusterCaloHits",
m_minClusterCaloHits));
152 PANDORA_RETURN_RESULT_IF_AND_IF(
153 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"NMaxTensorToolRepeats",
m_nMaxTensorToolRepeats));
DeltaRayTensorTool class.
TensorType & GetOverlapTensor()
Get the overlap tensor.
bool IsInitialized() const
Whether the track overlap result has been initialized.
void ExamineOverlapContainer()
Examine contents of overlap container, collect together best-matching 2D particles and modify cluster...
unsigned int m_nMaxTensorToolRepeats
The maximum number of repeat loops over tensor tools.
std::string m_reclusteringAlgorithmName
The name of the clustering algorithm to be used to recluster created delta ray remnants.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
MatchingType & GetMatchingControl()
Get the matching control.
TensorToolVector m_algorithmToolVector
The algorithm tool vector.
pandora::StatusCode PerformThreeViewMatching(const pandora::Cluster *const pCluster1, const pandora::Cluster *const pCluster2, const pandora::Cluster *const pCluster3, float &reducedChiSquared) const
To determine how well three clusters (one in each view) map onto one another expressing this in terms...
void SetOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
Set overlap result.
virtual bool DoesClusterPassTensorThreshold(const pandora::Cluster *const pCluster) const
To check whether a given cluster meets the requirements to be added into the matching container (tens...
std::string m_muonPfoListName
The list of reconstructed cosmic ray pfos.
void FindCommonMuonParents(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, pandora::PfoList &commonMuonPfoList) const
Find the cosmic ray pfos that, in each view, lie close to the clusters of the tensor element...
unsigned int m_minClusterCaloHits
The threshold number of hits for a cluster to be considered.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
virtual bool Run(ThreeViewDeltaRayMatchingAlgorithm *const pAlgorithm, TensorType &overlapTensor)=0
Run the algorithm tool.
DeltaRayOverlapResult class.
void GetNearbyMuonPfos(const pandora::Cluster *const pCluster, pandora::ClusterList &consideredClusters, pandora::PfoList &nearbyMuonPfos) const
Use the cluster proximity map to travel along paths of nearby clusters finding the cosmic ray cluster...
void CalculateOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW)
Calculate cluster overlap result and store in container.