9 #include "Pandora/AlgorithmHeaders.h" 21 ThreeViewRemnantsAlgorithm::ThreeViewRemnantsAlgorithm() :
22 m_nMaxTensorToolRepeats(1000),
23 m_minClusterCaloHits(5),
24 m_xOverlapWindow(2.
f),
35 const Cluster *
const pCluster = *iter;
37 if (!pCluster->IsAvailable())
43 selectedClusterList.push_back(pCluster);
52 float xMinU(0.
f), xMinV(0.
f), xMinW(0.
f), xMaxU(0.
f), xMaxV(0.
f), xMaxW(0.
f);
53 pClusterU->GetClusterSpanX(xMinU, xMaxU);
54 pClusterV->GetClusterSpanX(xMinV, xMaxV);
55 pClusterW->GetClusterSpanX(xMinW, xMaxW);
57 const float xMin(std::max(xMinU, std::max(xMinV, xMinW)) -
m_xOverlapWindow);
58 const float xMax(std::min(xMaxU, std::min(xMaxV, xMaxW)) +
m_xOverlapWindow);
59 const float xOverlap(xMax - xMin);
61 if (xOverlap < std::numeric_limits<float>::epsilon())
65 float u(std::numeric_limits<float>::max()), v(std::numeric_limits<float>::max()),
w(std::numeric_limits<float>::max());
78 const float pseudoChi2(((u - vw2u) * (u - vw2u) + (v - wu2v) * (v - wu2v) + (w - uv2w) * (w - uv2w)) / 3.
f);
84 const float hackValue(
85 pseudoChi2 + pClusterU->GetElectromagneticEnergy() + pClusterV->GetElectromagneticEnergy() + pClusterW->GetElectromagneticEnergy());
93 unsigned int repeatCounter(0);
97 if ((*iter)->Run(
this, this->GetMatchingControl().GetOverlapTensor()))
115 AlgorithmToolVector algorithmToolVector;
116 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, XmlHelper::ProcessAlgorithmToolList(*
this, xmlHandle,
"TrackTools", algorithmToolVector));
120 RemnantTensorTool *
const pRemnantTensorTool(dynamic_cast<RemnantTensorTool *>(*iter));
122 if (!pRemnantTensorTool)
123 return STATUS_CODE_INVALID_PARAMETER;
128 PANDORA_RETURN_RESULT_IF_AND_IF(
129 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"NMaxTensorToolRepeats",
m_nMaxTensorToolRepeats));
131 PANDORA_RETURN_RESULT_IF_AND_IF(
132 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MinClusterCaloHits",
m_minClusterCaloHits));
134 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"OverlapWindow",
m_xOverlapWindow));
136 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"PseudoChi2Cut",
m_pseudoChi2Cut));
float m_pseudoChi2Cut
The selection cut on the matched chi2.
TensorType & GetOverlapTensor()
Get the overlap tensor.
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.
static pandora::StatusCode GetAverageZ(const pandora::Cluster *const pCluster, const float xmin, const float xmax, float &averageZ)
Get average Z positions of the calo hits in a cluster in range xmin to xmax.
RemnantTensorToolVector m_algorithmToolVector
The algorithm tool list.
MatchingType & GetMatchingControl()
Get the matching control.
Header file for the geometry helper class.
void SetOverlapResult(const pandora::Cluster *const pClusterU, const pandora::Cluster *const pClusterV, const pandora::Cluster *const pClusterW, const OverlapResult &overlapResult)
Set overlap result.
Header file for the cluster helper class.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
static float MergeTwoPositions(const pandora::Pandora &pandora, const pandora::HitType view1, const pandora::HitType view2, const float position1, const float position2)
Merge two views (U,V) to give a third view (Z).
void ExamineOverlapContainer()
Examine contents of overlap container, collect together best-matching 2D particles and modify cluster...
unsigned int m_minClusterCaloHits
The selection cut on the number of cluster calo hits.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
float m_xOverlapWindow
The sampling pitch in the x coordinate.
unsigned int m_nMaxTensorToolRepeats
The maximum number of repeat loops over tensor tools.
Header file for the three view remnants algorithm class.
void SelectInputClusters(const pandora::ClusterList *const pInputClusterList, pandora::ClusterList &selectedClusterList) const
Select a subset of input clusters for processing in this algorithm.