9 #include "Pandora/AlgorithmHeaders.h" 18 ThreeViewDeltaRayMatchingAlgorithm::ThreeViewDeltaRayMatchingAlgorithm() : m_minClusterCaloHits(5), m_nMaxTensorToolRepeats(10)
34 PANDORA_THROW_RESULT_IF_AND_IF(
35 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, this->
CalculateOverlapResult(pClusterU, pClusterV, pClusterW, overlapResult));
46 float chiSquaredSum(0.
f);
47 unsigned int nSamplingPoints(0), nMatchedSamplingPoints(0);
50 StatusCode statusCode(
51 this->
PerformThreeViewMatching(pClusterU, pClusterV, pClusterW, chiSquaredSum, nSamplingPoints, nMatchedSamplingPoints, xOverlapObject));
53 if (statusCode != STATUS_CODE_SUCCESS)
56 PfoList commonMuonPfoList;
59 if (commonMuonPfoList.empty())
60 return STATUS_CODE_NOT_FOUND;
62 overlapResult =
DeltaRayOverlapResult(nMatchedSamplingPoints, nSamplingPoints, chiSquaredSum, xOverlapObject, commonMuonPfoList);
64 return STATUS_CODE_SUCCESS;
70 const Cluster *
const pClusterU,
const Cluster *
const pClusterV,
const Cluster *
const pClusterW, PfoList &commonMuonPfoList)
const 72 ClusterList consideredClustersU, consideredClustersV, consideredClustersW;
73 PfoList nearbyMuonPfosU, nearbyMuonPfosV, nearbyMuonPfosW;
77 if (nearbyMuonPfosU.empty())
82 if (nearbyMuonPfosV.empty())
87 if (nearbyMuonPfosW.empty())
90 for (
const ParticleFlowObject *
const pNearbyMuonU : nearbyMuonPfosU)
92 for (
const ParticleFlowObject *
const pNearbyMuonV : nearbyMuonPfosV)
94 if (pNearbyMuonV != pNearbyMuonU)
97 for (
const ParticleFlowObject *
const pNearbyMuonW : nearbyMuonPfosW)
99 if (pNearbyMuonW == pNearbyMuonV)
100 commonMuonPfoList.emplace_back(pNearbyMuonU);
111 unsigned int repeatCounter(0);
116 const bool repeatTools(pTool->
Run(
this, this->GetMatchingControl().GetOverlapTensor()));
119 repeatCounter = repeatTools ? repeatCounter + 1 : repeatCounter;
130 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ReadValue(xmlHandle,
"MuonPfoListName",
m_muonPfoListName));
132 AlgorithmToolVector algorithmToolVector;
133 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithmToolList(*
this, xmlHandle,
"DeltaRayTools", algorithmToolVector));
135 for (
auto algorithmTool : algorithmToolVector)
137 DeltaRayTensorTool *
const pDeltaRayTensorTool(dynamic_cast<DeltaRayTensorTool *>(algorithmTool));
139 if (!pDeltaRayTensorTool)
140 return STATUS_CODE_INVALID_PARAMETER;
145 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithm(*
this, xmlHandle,
"ClusterRebuilding",
m_reclusteringAlgorithmName));
147 PANDORA_RETURN_RESULT_IF_AND_IF(
148 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MinClusterCaloHits",
m_minClusterCaloHits));
150 PANDORA_RETURN_RESULT_IF_AND_IF(
151 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.