37 for (ClusterList::const_iterator iter = inputClusters.begin(), iterEnd = inputClusters.end(); iter != iterEnd; ++iter)
42 clusterListU.push_back(*iter);
44 clusterListV.push_back(*iter);
46 clusterListW.push_back(*iter);
56 for (ClusterList::const_iterator iter = inputClusters.begin(), iterEnd = inputClusters.end(); iter != iterEnd; ++iter)
59 clusterList.push_back(*iter);
69 if (orderedCaloHitList.
empty())
73 float minX(std::numeric_limits<float>::max()), maxX(-std::numeric_limits<float>::max());
74 float minY(std::numeric_limits<float>::max()), maxY(-std::numeric_limits<float>::max());
75 float minZ(std::numeric_limits<float>::max()), maxZ(-std::numeric_limits<float>::max());
79 for (CaloHitList::const_iterator hitIter = iter->second->begin(), hitIterEnd = iter->second->end(); hitIter != hitIterEnd; ++hitIter)
82 minX = std::min(hitPosition.
GetX(), minX);
83 maxX = std::max(hitPosition.
GetX(), maxX);
84 minY = std::min(hitPosition.
GetY(), minY);
85 maxY = std::max(hitPosition.
GetY(), maxY);
86 minZ = std::min(hitPosition.
GetZ(), minZ);
87 maxZ = std::max(hitPosition.
GetZ(), maxZ);
91 const float deltaX(maxX - minX), deltaY(maxY - minY), deltaZ(maxZ - minZ);
92 return (deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
106 const float dEdX(0.002f);
125 return (
static_cast<float>(nOccupiedLayers) /
static_cast<float>(nLayers));
139 return (
static_cast<float>(nOccupiedLayers) /
static_cast<float>(nLayers));
148 if (clusterList1.empty() || clusterList2.empty())
151 float closestDistance(std::numeric_limits<float>::max());
153 for (ClusterList::const_iterator iter1 = clusterList1.begin(), iterEnd1 = clusterList1.end(); iter1 != iterEnd1; ++iter1)
155 const Cluster *
const pCluster1 = *iter1;
158 if (thisDistance < closestDistance)
159 closestDistance = thisDistance;
162 return closestDistance;
169 if (clusterList.empty())
172 float closestDistance(std::numeric_limits<float>::max());
174 for (ClusterList::const_iterator iter = clusterList.begin(), iterEnd = clusterList.end(); iter != iterEnd; ++iter)
176 const Cluster *
const pTestCluster = *iter;
179 if (thisDistance < closestDistance)
180 closestDistance = thisDistance;
183 return closestDistance;
195 return (closestPosition1 - closestPosition2).GetMagnitude();
223 bool distanceFound(
false);
224 float closestDistanceSquared(std::numeric_limits<float>::max());
227 for (ClusterList::const_iterator iter = clusterList.begin(), iterEnd = clusterList.end(); iter != iterEnd; ++iter)
229 const Cluster *
const pTestCluster = *iter;
231 const float thisDistanceSquared((position - thisPosition).GetMagnitudeSquared());
233 if (thisDistanceSquared < closestDistanceSquared)
235 distanceFound =
true;
236 closestDistanceSquared = thisDistanceSquared;
237 closestPosition = thisPosition;
242 return closestPosition;
258 const CaloHit *pClosestCaloHit(
nullptr);
259 float closestDistanceSquared(std::numeric_limits<float>::max());
261 for (
const auto &entry : caloHitList)
263 for (
const CaloHit *
const pCaloHit : *entry.second)
265 const float distanceSquared((pCaloHit->GetPositionVector() - position).GetMagnitudeSquared());
267 if (distanceSquared < closestDistanceSquared)
269 closestDistanceSquared = distanceSquared;
270 pClosestCaloHit = pCaloHit;
285 const CaloHit *pClosestCaloHit(
nullptr);
286 float closestDistanceSquared(std::numeric_limits<float>::max());
288 for (
const CaloHit *
const pCaloHit : caloHitList)
290 const float distanceSquared((pCaloHit->GetPositionVector() - position).GetMagnitudeSquared());
292 if (distanceSquared < closestDistanceSquared)
294 closestDistanceSquared = distanceSquared;
295 pClosestCaloHit = pCaloHit;
310 bool distanceFound(
false);
311 float minDistanceSquared(std::numeric_limits<float>::max());
322 for (CaloHitList::const_iterator hitIter1 = iter1->second->begin(), hitIter1End = iter1->second->end(); hitIter1 != hitIter1End; ++hitIter1)
324 const CartesianVector &positionVector1((*hitIter1)->GetPositionVector());
329 for (CaloHitList::const_iterator hitIter2 = iter2->second->begin(), hitIter2End = iter2->second->end(); hitIter2 != hitIter2End; ++hitIter2)
331 const CartesianVector &positionVector2((*hitIter2)->GetPositionVector());
333 const float distanceSquared((positionVector1 - positionVector2).GetMagnitudeSquared());
335 if (distanceSquared < minDistanceSquared)
337 minDistanceSquared = distanceSquared;
338 closestPosition1 = positionVector1;
339 closestPosition2 = positionVector2;
340 distanceFound =
true;
350 outputPosition1 = closestPosition1;
351 outputPosition2 = closestPosition2;
360 float xmin(std::numeric_limits<float>::max());
361 float ymin(std::numeric_limits<float>::max());
362 float zmin(std::numeric_limits<float>::max());
363 float xmax(-std::numeric_limits<float>::max());
364 float ymax(-std::numeric_limits<float>::max());
365 float zmax(-std::numeric_limits<float>::max());
369 for (CaloHitList::const_iterator hIter = ochIter->second->begin(), hIterEnd = ochIter->second->end(); hIter != hIterEnd; ++hIter)
371 const CaloHit *
const pCaloHit = *hIter;
373 xmin = std::min(hit.
GetX(), xmin);
374 xmax = std::max(hit.
GetX(), xmax);
375 ymin = std::min(hit.
GetY(), ymin);
376 ymax = std::max(hit.
GetY(), ymax);
377 zmin = std::min(hit.
GetZ(), zmin);
378 zmax = std::max(hit.
GetZ(), zmax);
382 minimumCoordinate.
SetValues(xmin, ymin, zmin);
383 maximumCoordinate.
SetValues(xmax, ymax, zmax);
390 averageZ = std::numeric_limits<float>::max();
393 return STATUS_CODE_INVALID_PARAMETER;
402 for (CaloHitList::const_iterator hIter = ochIter->second->begin(), hIterEnd = ochIter->second->end(); hIter != hIterEnd; ++hIter)
404 const CaloHit *
const pCaloHit = *hIter;
407 if (hit.
GetX() < xmin || hit.
GetX() > xmax)
416 return STATUS_CODE_NOT_FOUND;
418 averageZ = zsum /
static_cast<float>(count);
419 return STATUS_CODE_SUCCESS;
428 for (ClusterList::const_iterator cIter = clusterList.begin(), cIterEnd = clusterList.end(); cIter != cIterEnd; ++cIter)
430 const Cluster *
const pCluster = *cIter;
448 if (orderedCaloHitList.
empty())
455 for (CaloHitList::const_iterator hitIter = iter->second->begin(), hitIterEnd = iter->second->end(); hitIter != hitIterEnd; ++hitIter)
457 const CaloHit *
const pCaloHit = *hitIter;
470 if (coordinateVector.empty())
474 float xMin(+std::numeric_limits<float>::max());
475 float yMin(+std::numeric_limits<float>::max());
476 float zMin(+std::numeric_limits<float>::max());
477 float xMax(-std::numeric_limits<float>::max());
478 float yMax(-std::numeric_limits<float>::max());
479 float zMax(-std::numeric_limits<float>::max());
481 for (CartesianPointVector::const_iterator pIter = coordinateVector.begin(), pIterEnd = coordinateVector.end(); pIter != pIterEnd; ++pIter)
484 xMin = std::min(pos.
GetX(), xMin);
485 xMax = std::max(pos.
GetX(), xMax);
486 yMin = std::min(pos.
GetY(), yMin);
487 yMax = std::max(pos.
GetY(), yMax);
488 zMin = std::min(pos.
GetZ(), zMin);
489 zMax = std::max(pos.
GetZ(), zMax);
493 const float xAve(0.5f * (xMin + xMax));
494 const float yAve(0.5f * (yMin + yMax));
495 const float zAve(0.5f * (zMin + zMax));
497 const float xSpan(xMax - xMin);
498 const float ySpan(yMax - yMin);
499 const float zSpan(zMax - zMin);
501 const bool useX((xSpan > std::numeric_limits<float>::epsilon()) && (xSpan + std::numeric_limits<float>::epsilon() > std::max(ySpan, zSpan)));
502 const bool useY((ySpan > std::numeric_limits<float>::epsilon()) && (ySpan + std::numeric_limits<float>::epsilon() > std::max(zSpan, xSpan)));
503 const bool useZ((zSpan > std::numeric_limits<float>::epsilon()) && (zSpan + std::numeric_limits<float>::epsilon() > std::max(xSpan, ySpan)));
508 for (CartesianPointVector::const_iterator pIter = coordinateVector.begin(), pIterEnd = coordinateVector.end(); pIter != pIterEnd; ++pIter)
514 if (((pos.
GetX() - xMin) < std::numeric_limits<float>::epsilon()) || ((pos.
GetX() - xMax) > -std::numeric_limits<float>::epsilon()))
515 candidateVector.push_back(pos);
520 if (((pos.
GetY() - yMin) < std::numeric_limits<float>::epsilon()) || ((pos.
GetY() - yMax) > -std::numeric_limits<float>::epsilon()))
521 candidateVector.push_back(pos);
526 if (((pos.
GetZ() - zMin) < std::numeric_limits<float>::epsilon()) || ((pos.
GetZ() - zMax) > -std::numeric_limits<float>::epsilon()))
527 candidateVector.push_back(pos);
534 float maxDistanceSquared(+std::numeric_limits<float>::epsilon());
536 for (CartesianPointVector::const_iterator iterI = candidateVector.begin(), iterEndI = candidateVector.end(); iterI != iterEndI; ++iterI)
540 for (CartesianPointVector::const_iterator iterJ = iterI, iterEndJ = candidateVector.end(); iterJ != iterEndJ; ++iterJ)
544 const float distanceSquared((posI - posJ).GetMagnitudeSquared());
546 if (distanceSquared > maxDistanceSquared)
548 maxDistanceSquared = distanceSquared;
549 firstCoordinate = posI;
550 secondCoordinate = posJ;
556 const float deltaZ(secondCoordinate.
GetZ() - firstCoordinate.
GetZ());
557 const float deltaX(secondCoordinate.
GetX() - firstCoordinate.
GetX());
559 if ((deltaZ > 0.f) || ((std::fabs(deltaZ) < std::numeric_limits<float>::epsilon()) && (deltaX > 0.f)))
561 innerCoordinate = firstCoordinate;
562 outerCoordinate = secondCoordinate;
566 innerCoordinate = secondCoordinate;
567 outerCoordinate = firstCoordinate;
577 for (
const CaloHit *
const pCaloHit : *layerEntry.second)
578 coordinateVector.push_back(pCaloHit->GetPositionVector());
589 const bool useX(std::fabs(upperBound.
GetX() - lowerBound.
GetX()) > std::numeric_limits<float>::epsilon());
590 const bool useY(std::fabs(upperBound.
GetY() - lowerBound.
GetY()) > std::numeric_limits<float>::epsilon());
591 const bool useZ(std::fabs(upperBound.
GetZ() - lowerBound.
GetZ()) > std::numeric_limits<float>::epsilon());
592 if (!useX && !useY && !useZ)
595 const float minX(std::min(lowerBound.
GetX(), upperBound.
GetX()));
596 const float maxX(std::max(lowerBound.
GetX(), upperBound.
GetX()));
597 const float minY(std::min(lowerBound.
GetY(), upperBound.
GetY()));
598 const float maxY(std::max(lowerBound.
GetY(), upperBound.
GetY()));
599 const float minZ(std::min(lowerBound.
GetZ(), upperBound.
GetZ()));
600 const float maxZ(std::max(lowerBound.
GetZ(), upperBound.
GetZ()));
604 for (
const CaloHit *
const pCaloHit : *layerEntry.second)
607 if (useX && (hitPosition.
GetX() < minX - std::numeric_limits<float>::epsilon() ||
608 hitPosition.
GetX() > maxX + std::numeric_limits<float>::epsilon()))
610 else if (useY && (hitPosition.
GetY() < minY - std::numeric_limits<float>::epsilon() ||
611 hitPosition.
GetY() > maxY + std::numeric_limits<float>::epsilon()))
613 else if (useZ && (hitPosition.
GetZ() < minZ - std::numeric_limits<float>::epsilon() ||
614 hitPosition.
GetZ() > maxZ + std::numeric_limits<float>::epsilon()))
617 caloHitList.push_back(pCaloHit);
631 for (CaloHitList::const_iterator hIter = ochIter->second->begin(), hIterEnd = ochIter->second->end(); hIter != hIterEnd; ++hIter)
633 const CaloHit *
const pCaloHit(*hIter);
648 if (nOccupiedLayersLhs != nOccupiedLayersRhs)
649 return (nOccupiedLayersLhs > nOccupiedLayersRhs);
661 if (nHitsLhs != nHitsRhs)
662 return (nHitsLhs > nHitsRhs);
674 if (layerSpanLhs != layerSpanRhs)
675 return (layerSpanLhs > layerSpanRhs);
687 if (innerLayerLhs != innerLayerRhs)
688 return (innerLayerLhs < innerLayerRhs);
699 if (std::fabs(deltaPositionIL.
GetZ()) > std::numeric_limits<float>::epsilon())
700 return (deltaPositionIL.
GetZ() > std::numeric_limits<float>::epsilon());
702 if (std::fabs(deltaPositionIL.
GetX()) > std::numeric_limits<float>::epsilon())
703 return (deltaPositionIL.
GetX() > std::numeric_limits<float>::epsilon());
705 if (std::fabs(deltaPositionIL.
GetY()) > std::numeric_limits<float>::epsilon())
706 return (deltaPositionIL.
GetY() > std::numeric_limits<float>::epsilon());
710 if (std::fabs(deltaPositionOL.
GetZ()) > std::numeric_limits<float>::epsilon())
711 return (deltaPositionOL.
GetZ() > std::numeric_limits<float>::epsilon());
713 if (std::fabs(deltaPositionOL.
GetX()) > std::numeric_limits<float>::epsilon())
714 return (deltaPositionOL.
GetX() > std::numeric_limits<float>::epsilon());
716 if (std::fabs(deltaPositionOL.
GetY()) > std::numeric_limits<float>::epsilon())
717 return (deltaPositionOL.
GetY() > std::numeric_limits<float>::epsilon());
736 if (std::fabs(deltaPosition.
GetZ()) > std::numeric_limits<float>::epsilon())
737 return (deltaPosition.
GetZ() > std::numeric_limits<float>::epsilon());
739 if (std::fabs(deltaPosition.
GetX()) > std::numeric_limits<float>::epsilon())
740 return (deltaPosition.
GetX() > std::numeric_limits<float>::epsilon());
742 if (std::fabs(deltaPosition.
GetY()) > std::numeric_limits<float>::epsilon())
743 return (deltaPosition.
GetY() > std::numeric_limits<float>::epsilon());
755 if (std::fabs(deltaPosition.
GetX()) > std::numeric_limits<float>::epsilon())
756 return (deltaPosition.
GetX() > std::numeric_limits<float>::epsilon());
775 if (std::fabs(deltaPosition.
GetZ()) > std::numeric_limits<float>::epsilon())
776 return (deltaPosition.
GetZ() > std::numeric_limits<float>::epsilon());
778 if (std::fabs(deltaPosition.
GetX()) > std::numeric_limits<float>::epsilon())
779 return (deltaPosition.
GetX() > std::numeric_limits<float>::epsilon());
781 return (deltaPosition.
GetY() > std::numeric_limits<float>::epsilon());
Header file for the lar calo hit class.
Header file for the cluster helper class.
#define PANDORA_THROW_RESULT_IF(StatusCode1, Operator, Command)
unsigned int GetDaughterVolumeId() const
Get the daughter volume id.
std::set< unsigned int > UIntSet
static pandora::CartesianVector GetClosestPosition(const pandora::CartesianVector &position, const pandora::ClusterList &clusterList)
Get closest position in a list of clusters to a specified input position vector.
static void GetClustersByHitType(const pandora::ClusterList &inputClusters, const pandora::HitType hitType, pandora::ClusterList &clusterList)
Get the subset of clusters, from a provided list, that match the specified hit type.
static bool SortByInnerLayer(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by inner layer, then position, then pulse-height.
static bool SortHitsByPositionInX(const pandora::CaloHit *const pLhs, const pandora::CaloHit *const pRhs)
Sort calo hits by their position (use X, followed by Z, followed by Y)
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static void GetCoordinateVector(const pandora::Cluster *const pCluster, pandora::CartesianPointVector &coordinateVector)
Get vector of hit coordinates from an input cluster.
static bool SortByPulseHeight(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by pulse-height.
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.
static bool SortHitsByPulseHeight(const pandora::CaloHit *const pLhs, const pandora::CaloHit *const pRhs)
Sort calo hits by their pulse height.
static bool SortHitsByPosition(const pandora::CaloHit *const pLhs, const pandora::CaloHit *const pRhs)
Sort calo hits by their position (use Z, followed by X, followed by Y)
static float GetEnergyFromLength(const pandora::Cluster *const pCluster)
Get energy of cluster, based on length.
static bool SortCoordinatesByPosition(const pandora::CartesianVector &lhs, const pandora::CartesianVector &rhs)
Sort cartesian vectors by their position (use Z, followed by X, followed by Y)
static bool SortByNHits(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of hits, then layer span, then inner layer, then position,...
static void GetClosestPositions(const pandora::Cluster *const pCluster1, const pandora::Cluster *const pCluster2, pandora::CartesianVector &position1, pandora::CartesianVector &position2)
Get pair of closest positions for a pair of clusters.
static void GetExtremalCoordinates(const pandora::ClusterList &clusterList, pandora::CartesianVector &innerCoordinate, pandora::CartesianVector &outerCoordinate)
Get positions of the two most distant calo hits in a list of cluster (ordered by Z)
static bool SortByNOccupiedLayers(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by number of occupied layers, and by inner layer, then energy in event of a tie.
static unsigned int GetLayerSpan(const pandora::Cluster *const pCluster)
Get number of layers spanned by cluster (1+Last-First)
static void GetClustersUVW(const pandora::ClusterList &inputClusters, pandora::ClusterList &clusterListU, pandora::ClusterList &clusterListV, pandora::ClusterList &clusterListW)
Divide an input cluster list into separate u, v and w lists (exception raised if alternative hit type...
static bool SortByLayerSpan(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by layer span, then inner layer, then position, then pulse-height.
static bool SortByPosition(const pandora::Cluster *const pLhs, const pandora::Cluster *const pRhs)
Sort clusters by position, then pulse-height.
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.
static float GetLength(const pandora::Cluster *const pCluster)
Get length of cluster.
static void GetCaloHitListInBoundingBox(const pandora::Cluster *const pCluster, const pandora::CartesianVector &lowerBound, const pandora::CartesianVector &upperBound, pandora::CaloHitList &caloHitList)
Get list of Calo hits from an input cluster that are contained in a bounding box. The hits are sorted...
static float GetLayerOccupancy(const pandora::Cluster *const pCluster)
Fraction of occupied layers in cluster.
static float GetClosestDistance(const pandora::ClusterList &clusterList1, const pandora::ClusterList &clusterList2)
Get closest distance between clusters in a pair of cluster lists.
static void GetDaughterVolumeIDs(const pandora::Cluster *const pCluster, UIntSet &daughterVolumeIds)
Get the set of the daughter volumes that contains the cluster.
static void GetClusterBoundingBox(const pandora::Cluster *const pCluster, pandora::CartesianVector &minimumCoordinate, pandora::CartesianVector &maximumCoordinate)
Get minimum and maximum X, Y and Z positions of the calo hits in a cluster.
const CartesianVector & GetPositionVector() const
Get the position vector of center of calorimeter cell, units mm.
float GetHadronicEnergy() const
Get the calibrated hadronic energy measure.
void SetValues(float x, float y, float z)
Set the values of cartesian vector components.
float GetX() const
Get the cartesian x coordinate.
float GetZ() const
Get the cartesian z coordinate.
float GetY() const
Get the cartesian y coordinate.
unsigned int GetOuterPseudoLayer() const
Get the outermost pseudo layer in the cluster.
float GetHadronicEnergy() const
Get the sum of hadronic energy measures of all constituent calo hits, units GeV.
unsigned int GetNCaloHits() const
Get the number of calo hits in the cluster.
unsigned int GetInnerPseudoLayer() const
Get the innermost pseudo layer in the cluster.
const CartesianVector GetCentroid(const unsigned int pseudoLayer) const
Get unweighted centroid for cluster at a particular pseudo layer, calculated using cached values of h...
const OrderedCaloHitList & GetOrderedCaloHitList() const
Get the ordered calo hit list.
Calo hit lists arranged by pseudo layer.
const_iterator end() const
Returns a const iterator referring to the past-the-end element in the ordered calo hit list.
const_iterator begin() const
Returns a const iterator referring to the first element in the ordered calo hit list.
TheList::const_iterator const_iterator
StatusCode Add(const OrderedCaloHitList &rhs)
Add the hits from a second ordered calo hit list to this list.
unsigned int size() const
Returns the number of elements in the container.
bool empty() const
Returns whether the map container is empty (i.e. whether its size is 0)
TheList::value_type value_type
StatusCodeException class.
HitType
Calorimeter hit type enum.
MANAGED_CONTAINER< const Cluster * > ClusterList
std::vector< CartesianVector > CartesianPointVector
MANAGED_CONTAINER< const CaloHit * > CaloHitList
StatusCode
The StatusCode enum.