26 m_hitThresholdForSpine(7),
27 m_growingFitInitialLength(10.f),
28 m_initialFitDistanceToLine(0.5f),
29 m_minInitialHitsFound(7),
31 m_localSlidingFitWindow(10),
32 m_growingFitSegmentLength(5.f),
33 m_highResolutionSlidingFitWindow(5),
34 m_distanceToLine(0.75f),
35 m_hitConnectionDistance(0.75f)
46 this->
FindShowerSpine(pViewHitList, nuVertex2D, peakDirection, unavailableHitList, showerSpineHitList);
50 return STATUS_CODE_NOT_FOUND;
52 return STATUS_CODE_SUCCESS;
64 for (
const CaloHit *
const pCaloHit : *pViewHitList)
68 const float l(initialDirection.
GetDotProduct(displacementVector));
76 if (std::find(unavailableHitList.begin(), unavailableHitList.end(), pCaloHit) == unavailableHitList.end())
78 showerSpineHitList.push_back(pCaloHit);
81 runningFitPositionVector.push_back(hitPosition);
88 showerSpineHitList.clear();
93 unsigned int count(0);
94 bool hitsCollected(
true);
95 const bool isEndDownstream(initialDirection.
GetZ() > 0.f);
97 CartesianVector extrapolatedStartPosition(nuVertex2D), extrapolatedDirection(initialDirection);
98 CartesianVector extrapolatedEndPosition(extrapolatedStartPosition + (extrapolatedDirection * highestL));
100 while (hitsCollected)
106 const int excessHitsInFit(runningFitPositionVector.size() -
m_maxFittingHits);
108 if (excessHitsInFit > 0)
111 std::sort(runningFitPositionVector.begin(), runningFitPositionVector.end(),
114 for (
int i = 0; i < excessHitsInFit; ++i)
115 runningFitPositionVector.erase(std::prev(runningFitPositionVector.end()));
120 extrapolatedStartPosition =
121 count == 1 ? extrapolatedEndPosition
123 extrapolatedDirection =
127 hitsCollected = this->
CollectSubsectionHits(extrapolatedFit, extrapolatedStartPosition, extrapolatedEndPosition,
128 extrapolatedDirection, isEndDownstream, pViewHitList, runningFitPositionVector, unavailableHitList, showerSpineHitList);
135 extrapolatedStartPosition = count == 1 ? extrapolatedStartPosition
142 hitsCollected = this->
CollectSubsectionHits(microExtrapolatedFit, extrapolatedStartPosition, extrapolatedEndPosition,
143 extrapolatedDirection, isEndDownstream, pViewHitList, runningFitPositionVector, unavailableHitList, showerSpineHitList);
160 float extrapolatedStartL(0.f), extrapolatedStartT(0.f);
161 extrapolatedFit.
GetLocalPosition(extrapolatedStartPosition, extrapolatedStartL, extrapolatedStartT);
163 float extrapolatedEndL(0.f), extrapolatedEndT(0.f);
164 extrapolatedFit.
GetLocalPosition(extrapolatedEndPosition, extrapolatedEndL, extrapolatedEndT);
168 for (
const CaloHit *
const pCaloHit : *pViewHitList)
170 if (std::find(showerSpineHitList.begin(), showerSpineHitList.end(), pCaloHit) != showerSpineHitList.end())
173 if (std::find(unavailableHitList.begin(), unavailableHitList.end(), pCaloHit) != unavailableHitList.end())
178 float hitL(0.f), hitT(0.f);
182 if (isEndDownstream && ((hitL < extrapolatedStartL) || (hitL > extrapolatedEndL)))
185 if (!isEndDownstream && ((hitL > extrapolatedStartL) || (hitL < extrapolatedEndL)))
191 collectedHits.push_back(pCaloHit);
199 collectedHits.push_back(pCaloHit);
203 const int nInitialHits(showerSpineHitList.size());
206 this->
CollectConnectedHits(collectedHits, extrapolatedStartPosition, extrapolatedDirection, runningFitPositionVector, showerSpineHitList);
208 const int nFinalHits(showerSpineHitList.size());
210 return (nFinalHits != nInitialHits);
216 const CartesianVector &lineDirection,
const float distanceToLine)
const
220 if (transverseDistanceFromLine > distanceToLine)
237 for (
const CaloHit *
const pCaloHit : collectedHits)
239 if (std::find(showerSpineHitList.begin(), showerSpineHitList.end(), pCaloHit) != showerSpineHitList.end())
254 runningFitPositionVector.push_back(hitPosition);
255 showerSpineHitList.push_back(pCaloHit);
264 float closestDistanceSqaured(std::numeric_limits<float>::max());
268 const float separationSquared((testPosition - position).GetMagnitudeSquared());
270 if (separationSquared < closestDistanceSqaured)
271 closestDistanceSqaured = separationSquared;
274 return std::sqrt(closestDistanceSqaured);
309 return STATUS_CODE_SUCCESS;
Header file for the connection pathway helper class.
Header file for the geometry helper class.
Header file for the lar hit width helper class.
Header file for the lar two dimensional sliding fit result class.
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
SortByDistanceToPoint class.
static float GetWirePitch(const pandora::Pandora &pandora, const pandora::HitType view, 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 pandora::CartesianVector GetClosestPointToLine2D(const pandora::CartesianVector &lineStart, const pandora::CartesianVector &lineDirection, const pandora::CaloHit *const pCaloHit)
Consider the hit width to find the closest position of a calo hit to a specified line.
static float GetClosestDistance(const pandora::CaloHit *const pThisCaloHit, const pandora::CaloHitList &caloHitList)
Find the smallest separation between a hit and a list of hits, with the consideration of their hit wi...
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
unsigned int m_hitThresholdForSpine
The hit threshold for a significant spine.
float m_growingFitInitialLength
The first step distance.
unsigned int m_localSlidingFitWindow
The standard sliding fit window for spine fits.
unsigned int m_maxFittingHits
The number of hits to consider in the running fit.
float m_initialFitDistanceToLine
The max. proximity to the spine projection for collection in the first step.
bool CollectSubsectionHits(const TwoDSlidingFitResult &extrapolatedFit, const pandora::CartesianVector &extrapolatedStartPosition, const pandora::CartesianVector &extrapolatedEndPosition, const pandora::CartesianVector &extrapolatedDirection, const bool isEndDownstream, const pandora::CaloHitList *const pViewHitList, pandora::CartesianPointVector &runningFitPositionVector, pandora::CaloHitList &unavailableHitList, pandora::CaloHitList &showerSpineHitList) const
Perform a running fit step: collect hits which lie close to the shower spine projection.
bool IsCloseToLine(const pandora::CartesianVector &hitPosition, const pandora::CartesianVector &lineStart, const pandora::CartesianVector &lineDirection, const float distanceToLine) const
Determine whether a hit lies close to the shower spine projection.
void CollectConnectedHits(const pandora::CaloHitList &collectedHits, const pandora::CartesianVector &extrapolatedStartPosition, const pandora::CartesianVector &extrapolatedDirection, pandora::CartesianPointVector &runningFitPositionVector, pandora::CaloHitList &showerSpineHitList) const
Add to the shower spine the connecting hits.
float m_distanceToLine
The max. proximity to the spine projection for collection.
pandora::StatusCode Run(const pandora::CartesianVector &nuVertex3D, const pandora::CaloHitList *const pViewHitList, const pandora::HitType hitType, const pandora::CartesianVector &peakDirection, pandora::CaloHitList &unavailableHitList, pandora::CaloHitList &showerSpineHitList)
unsigned int m_minInitialHitsFound
The min. number of hits collected in the first step for continuation.
unsigned int m_highResolutionSlidingFitWindow
The high resolution sliding fit window for spine fits.
float m_growingFitSegmentLength
The standard step distance.
void FindShowerSpine(const pandora::CaloHitList *const pViewHitList, const pandora::CartesianVector &nuVertex2D, const pandora::CartesianVector &initialDirection, pandora::CaloHitList &unavailableHitList, pandora::CaloHitList &showerSpineHitList) const
Perform a running fit to collect the hits of the shower spine.
float GetClosestDistance(const pandora::CartesianVector &position, const pandora::CartesianPointVector &testPositions) const
Find the smallest distance between a position and a list of other positions.
float m_hitConnectionDistance
The max. separation between connected hits.
TwoDSlidingFitResult class.
pandora::CartesianVector GetGlobalMinLayerPosition() const
Get global position corresponding to the fit result in minimum fit layer.
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.
pandora::CartesianVector GetGlobalMinLayerDirection() const
Get global direction corresponding to the fit result in minimum fit layer.
pandora::CartesianVector GetGlobalMaxLayerPosition() const
Get global position corresponding to the fit result in maximum fit layer.
pandora::CartesianVector GetGlobalMaxLayerDirection() const
Get global direction corresponding to the fit result in maximum fit layer.
float GetZ() const
Get the cartesian z coordinate.
float GetDotProduct(const CartesianVector &rhs) const
Get the dot product of the cartesian vector with a second cartesian vector.
float GetMagnitude() const
Get the magnitude.
CartesianVector GetCrossProduct(const CartesianVector &rhs) const
Get the cross product of the cartesian vector with a second cartesian vector.
const Pandora & GetPandora() const
Get the associated pandora instance.
StatusCodeException class.
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
HitType
Calorimeter hit type enum.
std::vector< CartesianVector > CartesianPointVector
MANAGED_CONTAINER< const CaloHit * > CaloHitList
StatusCode
The StatusCode enum.