9 #include "Pandora/AlgorithmHeaders.h" 20 RemovalBaseTool::RemovalBaseTool() :
22 m_distanceToLine(0.5
f)
30 const Cluster *pMuonCluster(
nullptr), *
const pDeltaRayCluster(element.GetCluster(hitType));
44 for (
const HitType hitType : {TPC_VIEW_U, TPC_VIEW_V, TPC_VIEW_W})
46 if (ignoreHitType && (hitType == hitTypeToIgnore))
49 const Cluster *pMuonCluster(
nullptr), *
const pDeltaRayCluster(element.GetCluster(hitType));
54 float xMinDR(-std::numeric_limits<float>::max()), xMaxDR(+std::numeric_limits<float>::max());
55 pDeltaRayCluster->GetClusterSpanX(xMinDR, xMaxDR);
57 float xMinCR(-std::numeric_limits<float>::max()), xMaxCR(+std::numeric_limits<float>::max());
58 pMuonCluster->GetClusterSpanX(xMinCR, xMaxCR);
60 if ((xMinDR < xMinCR) || (xMaxDR > xMaxCR))
63 float zMinDR(-std::numeric_limits<float>::max()), zMaxDR(+std::numeric_limits<float>::max());
64 pDeltaRayCluster->GetClusterSpanZ(xMinDR, xMaxDR, zMinDR, zMaxDR);
66 float zMinCR(-std::numeric_limits<float>::max()), zMaxCR(+std::numeric_limits<float>::max());
67 pMuonCluster->GetClusterSpanZ(xMinCR, xMaxCR, zMinCR, zMaxCR);
69 if ((zMinDR < zMinCR) || (zMaxDR > zMaxCR))
79 const ClusterSet &modifiedClusters)
const 81 const float chiSquared(element.GetOverlapResult().GetReducedChi2());
82 const unsigned int hitSum(element.GetClusterU()->GetNCaloHits() + element.GetClusterV()->GetNCaloHits() + element.GetClusterW()->GetNCaloHits());
84 for (
const TensorType::Element &testElement : elementList)
86 if (modifiedClusters.count(testElement.GetClusterU()) || modifiedClusters.count(testElement.GetClusterV()) ||
87 modifiedClusters.count(testElement.GetClusterW()))
90 if (testElement.GetCluster(hitType) != element.GetCluster(hitType))
93 if ((testElement.GetClusterU() == element.GetClusterU()) && (testElement.GetClusterV() == element.GetClusterV()) &&
94 (testElement.GetClusterW() == element.GetClusterW()))
97 const unsigned int testHitSum(
98 testElement.GetClusterU()->GetNCaloHits() + testElement.GetClusterV()->GetNCaloHits() + testElement.GetClusterW()->GetNCaloHits());
99 const float testChiSquared(testElement.GetOverlapResult().GetReducedChi2());
101 if ((testHitSum < hitSum) || ((testHitSum == hitSum) && (testChiSquared > chiSquared)))
114 const CartesianVector &hitPosition,
const CartesianVector &lineStart,
const CartesianVector &lineEnd,
const float distanceToLine)
const 116 CartesianVector lineDirection(lineStart - lineEnd);
117 lineDirection = lineDirection.GetUnitVector();
119 const float transverseDistanceFromLine(lineDirection.GetCrossProduct(hitPosition - lineStart).GetMagnitude());
121 if (transverseDistanceFromLine > distanceToLine)
131 const float segmentBoundaryGradient = (-1.f) * (upperBoundary.GetX() - lowerBoundary.GetX()) / (upperBoundary.GetZ() - lowerBoundary.GetZ());
132 const float xPointOnUpperLine((point.GetZ() - upperBoundary.GetZ()) / segmentBoundaryGradient + upperBoundary.GetX());
133 const float xPointOnLowerLine((point.GetZ() - lowerBoundary.GetZ()) / segmentBoundaryGradient + lowerBoundary.GetX());
135 if (std::fabs(xPointOnUpperLine - point.GetX()) < std::numeric_limits<float>::epsilon())
138 if (std::fabs(xPointOnLowerLine - point.GetX()) < std::numeric_limits<float>::epsilon())
141 if ((point.GetX() > xPointOnUpperLine) && (point.GetX() > xPointOnLowerLine))
144 if ((point.GetX() < xPointOnUpperLine) && (point.GetX() < xPointOnLowerLine))
153 const CartesianVector &upperBoundary, CaloHitList &collectedHits)
const 155 CaloHitList caloHitList;
156 pCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
158 for (
const CaloHit *
const pCaloHit : caloHitList)
160 if (!this->
IsInLineSegment(lowerBoundary, upperBoundary, pCaloHit->GetPositionVector()))
166 collectedHits.push_back(pCaloHit);
174 HitTypeVector hitTypes({TPC_VIEW_U, TPC_VIEW_V, TPC_VIEW_W});
176 hitTypes.erase(std::find(hitTypes.begin(), hitTypes.end(), hitType));
178 const Cluster *
const pCluster1(element.GetCluster(hitTypes[0]));
179 const Cluster *
const pCluster2(element.GetCluster(hitTypes[1]));
188 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"MinSeparation",
m_minSeparation));
190 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
"DistanceToLine",
m_distanceToLine));
192 return STATUS_CODE_SUCCESS;
float m_minSeparation
The minimum delta ray - parent muon cluster separation required to investigate a delta/cosmic ray clu...
pandora::StatusCode GetProjectedPositions(const pandora::Cluster *const pCluster1, const pandora::Cluster *const pCluster2, pandora::CartesianPointVector &projectedPositions) const
Use two clusters from different views to calculate projected positions in the remaining third view...
float m_distanceToLine
The maximum perpendicular distance of a position to a line for it to be considered close...
ThreeViewDeltaRayMatchingAlgorithm * m_pParentAlgorithm
Address of the parent matching algorithm.
std::vector< Element > ElementList
bool IsBestElement(const TensorType::Element &element, const pandora::HitType hitType, const TensorType::ElementList &elementList, const pandora::ClusterSet &modifiedClusters) const
Determine whether the input element is the best to use to modify the contaminated cluster (best is de...
bool IsInLineSegment(const pandora::CartesianVector &lowerBoundary, const pandora::CartesianVector &upperBoundary, const pandora::CartesianVector &point) const
Whether the projection of a given position lies on a defined line.
Header file for the cluster helper class.
virtual bool PassElementChecks(const TensorType::Element &element, const pandora::HitType hitType) const =0
Determine whether element satifies simple checks.
void FindExtrapolatedHits(const pandora::Cluster *const pCluster, const pandora::CartesianVector &lowerBoundary, const pandora::CartesianVector &upperBoundary, pandora::CaloHitList &collectedHits) const
Collect the hits that are closest to and can be projected onto a defined line.
bool IsCloseToLine(const pandora::CartesianVector &hitPosition, const pandora::CartesianVector &lineStart, const pandora::CartesianVector &lineEnd, const float distanceToLine) const
Whether a given position is close to a defined line.
pandora::StatusCode ProjectDeltaRayPositions(const TensorType::Element &element, const pandora::HitType hitType, pandora::CartesianPointVector &projectedPositions) const
Use two views of a delta ray pfo to calculate projected positions in a given third view...
std::vector< pandora::HitType > HitTypeVector
bool IsMuonEndpoint(const TensorType::Element &element, const bool ignoreHitType, const pandora::HitType hitTypeToIgnore=pandora::TPC_VIEW_U) const
Determine whether the matched clusters suggest that the delta ray is at the endpoint of the cosmic ra...
pandora::StatusCode GetMuonCluster(const pandora::PfoList &commonMuonPfoList, const pandora::HitType hitType, const pandora::Cluster *&pMuonCluster) const
Return the cluster of the common cosmic ray pfo in a given view (function demands there to be only on...
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
virtual pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)=0