21 void LArClusterHelper::GetAllHits(
const Cluster *
const pCluster, CaloHitList &caloHitList)
23 pCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
24 const CaloHitList &isolatedHitList{pCluster->GetIsolatedCaloHitList()};
25 caloHitList.insert(caloHitList.end(), isolatedHitList.begin(), isolatedHitList.end());
30 HitType LArClusterHelper::GetClusterHitType(
const Cluster *
const pCluster)
32 if (0 == pCluster->GetNCaloHits())
33 throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
39 return (*(pCluster->GetOrderedCaloHitList().begin()->second->begin()))->GetHitType();
44 void LArClusterHelper::GetClustersUVW(
const ClusterList &inputClusters, ClusterList &clusterListU, ClusterList &clusterListV, ClusterList &clusterListW)
48 const HitType hitType(LArClusterHelper::GetClusterHitType(*iter));
50 if (TPC_VIEW_U == hitType)
51 clusterListU.push_back(*iter);
52 else if (TPC_VIEW_V == hitType)
53 clusterListV.push_back(*iter);
54 else if (TPC_VIEW_W == hitType)
55 clusterListW.push_back(*iter);
57 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
63 void LArClusterHelper::GetClustersByHitType(
const ClusterList &inputClusters,
const HitType hitType, ClusterList &clusterList)
67 if (hitType == LArClusterHelper::GetClusterHitType(*iter))
68 clusterList.push_back(*iter);
74 float LArClusterHelper::GetLengthSquared(
const Cluster *
const pCluster)
76 const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
78 if (orderedCaloHitList.empty())
79 throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
82 float minX(std::numeric_limits<float>::max()), maxX(-std::numeric_limits<float>::max());
83 float minY(std::numeric_limits<float>::max()),
maxY(-std::numeric_limits<float>::max());
84 float minZ(std::numeric_limits<float>::max()), maxZ(-std::numeric_limits<float>::max());
88 for (
CaloHitList::const_iterator hitIter = iter->second->begin(), hitIterEnd = iter->second->end(); hitIter != hitIterEnd; ++hitIter)
90 const CartesianVector &hitPosition((*hitIter)->GetPositionVector());
91 minX = std::min(hitPosition.GetX(), minX);
92 maxX = std::max(hitPosition.GetX(), maxX);
93 minY = std::min(hitPosition.GetY(),
minY);
94 maxY = std::max(hitPosition.GetY(),
maxY);
95 minZ = std::min(hitPosition.GetZ(), minZ);
96 maxZ = std::max(hitPosition.GetZ(), maxZ);
100 const float deltaX(maxX - minX), deltaY(maxY -
minY), deltaZ(maxZ - minZ);
101 return (deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
106 float LArClusterHelper::GetLength(
const Cluster *
const pCluster)
108 return std::sqrt(LArClusterHelper::GetLengthSquared(pCluster));
113 float LArClusterHelper::GetEnergyFromLength(
const Cluster *
const pCluster)
115 const float dEdX(0.002
f);
116 return (dEdX * LArClusterHelper::GetLength(pCluster));
121 unsigned int LArClusterHelper::GetLayerSpan(
const Cluster *
const pCluster)
123 return (1 + pCluster->GetOuterPseudoLayer() - pCluster->GetInnerPseudoLayer());
128 float LArClusterHelper::GetLayerOccupancy(
const Cluster *
const pCluster)
130 const unsigned int nOccupiedLayers(pCluster->GetOrderedCaloHitList().size());
131 const unsigned int nLayers(1 + pCluster->GetOuterPseudoLayer() - pCluster->GetInnerPseudoLayer());
134 return (static_cast<float>(nOccupiedLayers) /
static_cast<float>(nLayers));
141 float LArClusterHelper::GetLayerOccupancy(
const Cluster *
const pCluster1,
const Cluster *
const pCluster2)
143 const unsigned int nOccupiedLayers(pCluster1->GetOrderedCaloHitList().size() + pCluster2->GetOrderedCaloHitList().size());
144 const unsigned int nLayers(1 + std::max(pCluster1->GetOuterPseudoLayer(), pCluster2->GetOuterPseudoLayer()) -
145 std::min(pCluster1->GetInnerPseudoLayer(), pCluster2->GetInnerPseudoLayer()));
148 return (static_cast<float>(nOccupiedLayers) / static_cast<float>(nLayers));
155 float LArClusterHelper::GetClosestDistance(
const ClusterList &clusterList1,
const ClusterList &clusterList2)
157 if (clusterList1.empty() || clusterList2.empty())
158 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
160 float closestDistance(std::numeric_limits<float>::max());
164 const Cluster *
const pCluster1 = *iter1;
165 const float thisDistance(LArClusterHelper::GetClosestDistance(pCluster1, clusterList2));
167 if (thisDistance < closestDistance)
168 closestDistance = thisDistance;
171 return closestDistance;
176 float LArClusterHelper::GetClosestDistance(
const Cluster *
const pCluster,
const ClusterList &clusterList)
178 if (clusterList.empty())
179 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
181 float closestDistance(std::numeric_limits<float>::max());
185 const Cluster *
const pTestCluster = *iter;
186 const float thisDistance(LArClusterHelper::GetClosestDistance(pCluster, pTestCluster));
188 if (thisDistance < closestDistance)
189 closestDistance = thisDistance;
192 return closestDistance;
197 float LArClusterHelper::GetClosestDistance(
const Cluster *
const pCluster1,
const Cluster *
const pCluster2)
199 CartesianVector closestPosition1(0.
f, 0.
f, 0.
f);
200 CartesianVector closestPosition2(0.
f, 0.
f, 0.
f);
202 LArClusterHelper::GetClosestPositions(pCluster1, pCluster2, closestPosition1, closestPosition2);
204 return (closestPosition1 - closestPosition2).GetMagnitude();
209 float LArClusterHelper::GetClosestDistance(
const CartesianVector &position,
const ClusterList &clusterList)
211 return (position - LArClusterHelper::GetClosestPosition(position, clusterList)).GetMagnitude();
216 float LArClusterHelper::GetClosestDistance(
const CartesianVector &position,
const Cluster *
const pCluster)
218 return (position - LArClusterHelper::GetClosestPosition(position, pCluster)).GetMagnitude();
223 float LArClusterHelper::GetClosestDistance(
const CartesianVector &position,
const CaloHitList &caloHitList)
225 return (position - LArClusterHelper::GetClosestPosition(position, caloHitList)).GetMagnitude();
230 CartesianVector LArClusterHelper::GetClosestPosition(
const CartesianVector &position,
const ClusterList &clusterList)
232 bool distanceFound(
false);
233 float closestDistanceSquared(std::numeric_limits<float>::max());
234 CartesianVector closestPosition(0.
f, 0.
f, 0.
f);
238 const Cluster *
const pTestCluster = *iter;
239 const CartesianVector thisPosition(LArClusterHelper::GetClosestPosition(position, pTestCluster));
240 const float thisDistanceSquared((position - thisPosition).GetMagnitudeSquared());
242 if (thisDistanceSquared < closestDistanceSquared)
244 distanceFound =
true;
245 closestDistanceSquared = thisDistanceSquared;
246 closestPosition = thisPosition;
251 return closestPosition;
253 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
258 CartesianVector LArClusterHelper::GetClosestPosition(
const CartesianVector &position,
const Cluster *
const pCluster)
260 return LArClusterHelper::GetClosestPosition(position, pCluster->GetOrderedCaloHitList());
265 CartesianVector LArClusterHelper::GetClosestPosition(
const CartesianVector &position,
const OrderedCaloHitList &caloHitList)
267 const CaloHit *pClosestCaloHit(
nullptr);
268 float closestDistanceSquared(std::numeric_limits<float>::max());
270 for (
const auto &entry : caloHitList)
272 for (
const CaloHit *
const pCaloHit : *entry.second)
274 const float distanceSquared((pCaloHit->GetPositionVector() - position).GetMagnitudeSquared());
276 if (distanceSquared < closestDistanceSquared)
278 closestDistanceSquared = distanceSquared;
279 pClosestCaloHit = pCaloHit;
285 return pClosestCaloHit->GetPositionVector();
287 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
292 CartesianVector LArClusterHelper::GetClosestPosition(
const CartesianVector &position,
const CaloHitList &caloHitList)
294 const CaloHit *pClosestCaloHit(
nullptr);
295 float closestDistanceSquared(std::numeric_limits<float>::max());
297 for (
const CaloHit *
const pCaloHit : caloHitList)
299 const float distanceSquared((pCaloHit->GetPositionVector() - position).GetMagnitudeSquared());
301 if (distanceSquared < closestDistanceSquared)
303 closestDistanceSquared = distanceSquared;
304 pClosestCaloHit = pCaloHit;
309 return pClosestCaloHit->GetPositionVector();
311 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
316 void LArClusterHelper::GetClosestPositions(
317 const Cluster *
const pCluster1,
const Cluster *
const pCluster2, CartesianVector &outputPosition1, CartesianVector &outputPosition2)
319 bool distanceFound(
false);
320 float minDistanceSquared(std::numeric_limits<float>::max());
322 CartesianVector closestPosition1(0.
f, 0.
f, 0.
f);
323 CartesianVector closestPosition2(0.
f, 0.
f, 0.
f);
325 const OrderedCaloHitList &orderedCaloHitList1(pCluster1->GetOrderedCaloHitList());
326 const OrderedCaloHitList &orderedCaloHitList2(pCluster2->GetOrderedCaloHitList());
331 for (
CaloHitList::const_iterator hitIter1 = iter1->second->begin(), hitIter1End = iter1->second->end(); hitIter1 != hitIter1End; ++hitIter1)
333 const CartesianVector &positionVector1((*hitIter1)->GetPositionVector());
338 for (
CaloHitList::const_iterator hitIter2 = iter2->second->begin(), hitIter2End = iter2->second->end(); hitIter2 != hitIter2End; ++hitIter2)
340 const CartesianVector &positionVector2((*hitIter2)->GetPositionVector());
342 const float distanceSquared((positionVector1 - positionVector2).GetMagnitudeSquared());
344 if (distanceSquared < minDistanceSquared)
346 minDistanceSquared = distanceSquared;
347 closestPosition1 = positionVector1;
348 closestPosition2 = positionVector2;
349 distanceFound =
true;
357 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
359 outputPosition1 = closestPosition1;
360 outputPosition2 = closestPosition2;
365 void LArClusterHelper::GetClusterBoundingBox(
const Cluster *
const pCluster, CartesianVector &minimumCoordinate, CartesianVector &maximumCoordinate)
367 const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
369 float xmin(std::numeric_limits<float>::max());
370 float ymin(std::numeric_limits<float>::max());
371 float zmin(std::numeric_limits<float>::max());
372 float xmax(-std::numeric_limits<float>::max());
373 float ymax(-std::numeric_limits<float>::max());
374 float zmax(-std::numeric_limits<float>::max());
380 const CaloHit *
const pCaloHit = *hIter;
381 const CartesianVector &
hit(pCaloHit->GetPositionVector());
382 xmin = std::min(
hit.GetX(), xmin);
383 xmax = std::max(
hit.GetX(), xmax);
384 ymin = std::min(
hit.GetY(), ymin);
385 ymax = std::max(
hit.GetY(), ymax);
386 zmin = std::min(
hit.GetZ(), zmin);
387 zmax = std::max(
hit.GetZ(), zmax);
391 minimumCoordinate.SetValues(xmin, ymin, zmin);
392 maximumCoordinate.SetValues(xmax, ymax, zmax);
397 StatusCode LArClusterHelper::GetAverageZ(
const Cluster *
const pCluster,
const float xmin,
const float xmax,
float &averageZ)
399 averageZ = std::numeric_limits<float>::max();
402 return STATUS_CODE_INVALID_PARAMETER;
404 const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
413 const CaloHit *
const pCaloHit = *hIter;
414 const CartesianVector &
hit(pCaloHit->GetPositionVector());
416 if (
hit.GetX() < xmin ||
hit.GetX() > xmax)
425 return STATUS_CODE_NOT_FOUND;
427 averageZ = zsum /
static_cast<float>(count);
428 return STATUS_CODE_SUCCESS;
433 void LArClusterHelper::GetExtremalCoordinates(
const ClusterList &clusterList, CartesianVector &innerCoordinate, CartesianVector &outerCoordinate)
435 OrderedCaloHitList orderedCaloHitList;
439 const Cluster *
const pCluster = *cIter;
440 PANDORA_THROW_RESULT_IF(STATUS_CODE_SUCCESS, !=, orderedCaloHitList.Add(pCluster->GetOrderedCaloHitList()));
443 return LArClusterHelper::GetExtremalCoordinates(orderedCaloHitList, innerCoordinate, outerCoordinate);
448 void LArClusterHelper::GetExtremalCoordinates(
const Cluster *
const pCluster, CartesianVector &innerCoordinate, CartesianVector &outerCoordinate)
450 return LArClusterHelper::GetExtremalCoordinates(pCluster->GetOrderedCaloHitList(), innerCoordinate, outerCoordinate);
455 void LArClusterHelper::GetExtremalCoordinates(
const OrderedCaloHitList &orderedCaloHitList, CartesianVector &innerCoordinate, CartesianVector &outerCoordinate)
457 if (orderedCaloHitList.empty())
458 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
460 CartesianPointVector coordinateVector;
464 for (
CaloHitList::const_iterator hitIter = iter->second->begin(), hitIterEnd = iter->second->end(); hitIter != hitIterEnd; ++hitIter)
466 const CaloHit *
const pCaloHit = *hitIter;
467 coordinateVector.push_back(pCaloHit->GetPositionVector());
471 std::sort(coordinateVector.begin(), coordinateVector.end(), LArClusterHelper::SortCoordinatesByPosition);
472 return LArClusterHelper::GetExtremalCoordinates(coordinateVector, innerCoordinate, outerCoordinate);
477 void LArClusterHelper::GetExtremalCoordinates(
const CartesianPointVector &coordinateVector, CartesianVector &innerCoordinate, CartesianVector &outerCoordinate)
479 if (coordinateVector.empty())
480 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
483 float xMin(+std::numeric_limits<float>::max());
484 float yMin(+std::numeric_limits<float>::max());
485 float zMin(+std::numeric_limits<float>::max());
486 float xMax(-std::numeric_limits<float>::max());
487 float yMax(-std::numeric_limits<float>::max());
488 float zMax(-std::numeric_limits<float>::max());
492 const CartesianVector &pos = *pIter;
493 xMin = std::min(pos.GetX(), xMin);
494 xMax = std::max(pos.GetX(), xMax);
495 yMin = std::min(pos.GetY(), yMin);
496 yMax = std::max(pos.GetY(), yMax);
497 zMin = std::min(pos.GetZ(), zMin);
498 zMax = std::max(pos.GetZ(), zMax);
502 const float xAve(0.5
f * (xMin + xMax));
503 const float yAve(0.5
f * (yMin + yMax));
504 const float zAve(0.5
f * (zMin + zMax));
506 const float xSpan(xMax - xMin);
507 const float ySpan(yMax - yMin);
508 const float zSpan(zMax - zMin);
510 const bool useX((xSpan > std::numeric_limits<float>::epsilon()) && (xSpan + std::numeric_limits<float>::epsilon() > std::max(ySpan, zSpan)));
511 const bool useY((ySpan > std::numeric_limits<float>::epsilon()) && (ySpan + std::numeric_limits<float>::epsilon() > std::max(zSpan, xSpan)));
512 const bool useZ((zSpan > std::numeric_limits<float>::epsilon()) && (zSpan + std::numeric_limits<float>::epsilon() > std::max(xSpan, ySpan)));
515 CartesianPointVector candidateVector;
519 const CartesianVector &pos = *pIter;
523 if (((pos.GetX() - xMin) < std::numeric_limits<float>::epsilon()) || ((pos.GetX() - xMax) > -std::numeric_limits<float>::epsilon()))
524 candidateVector.push_back(pos);
529 if (((pos.GetY() - yMin) < std::numeric_limits<float>::epsilon()) || ((pos.GetY() - yMax) > -std::numeric_limits<float>::epsilon()))
530 candidateVector.push_back(pos);
535 if (((pos.GetZ() - zMin) < std::numeric_limits<float>::epsilon()) || ((pos.GetZ() - zMax) > -std::numeric_limits<float>::epsilon()))
536 candidateVector.push_back(pos);
541 CartesianVector firstCoordinate(xAve, yAve, zAve);
542 CartesianVector secondCoordinate(xAve, yAve, zAve);
543 float maxDistanceSquared(+std::numeric_limits<float>::epsilon());
547 const CartesianVector &posI = *iterI;
551 const CartesianVector &posJ = *iterJ;
553 const float distanceSquared((posI - posJ).GetMagnitudeSquared());
555 if (distanceSquared > maxDistanceSquared)
557 maxDistanceSquared = distanceSquared;
558 firstCoordinate = posI;
559 secondCoordinate = posJ;
565 const float deltaZ(secondCoordinate.GetZ() - firstCoordinate.GetZ());
566 const float deltaX(secondCoordinate.GetX() - firstCoordinate.GetX());
568 if ((deltaZ > 0.
f) || ((std::fabs(deltaZ) < std::numeric_limits<float>::epsilon()) && (deltaX > 0.
f)))
570 innerCoordinate = firstCoordinate;
571 outerCoordinate = secondCoordinate;
575 innerCoordinate = secondCoordinate;
576 outerCoordinate = firstCoordinate;
582 void LArClusterHelper::GetCoordinateVector(
const Cluster *
const pCluster, CartesianPointVector &coordinateVector)
584 for (
const OrderedCaloHitList::value_type &layerEntry : pCluster->GetOrderedCaloHitList())
586 for (
const CaloHit *
const pCaloHit : *layerEntry.second)
587 coordinateVector.push_back(pCaloHit->GetPositionVector());
590 std::sort(coordinateVector.begin(), coordinateVector.end(), LArClusterHelper::SortCoordinatesByPosition);
595 void LArClusterHelper::GetCaloHitListInBoundingBox(
const pandora::Cluster *
const pCluster,
const pandora::CartesianVector &lowerBound,
596 const pandora::CartesianVector &upperBound, pandora::CaloHitList &caloHitList)
598 const bool useX(std::fabs(upperBound.GetX() - lowerBound.GetX()) > std::numeric_limits<float>::epsilon());
599 const bool useY(std::fabs(upperBound.GetY() - lowerBound.GetY()) > std::numeric_limits<float>::epsilon());
600 const bool useZ(std::fabs(upperBound.GetZ() - lowerBound.GetZ()) > std::numeric_limits<float>::epsilon());
601 if (!useX && !useY && !useZ)
602 throw StatusCodeException(STATUS_CODE_NOT_FOUND);
604 const float minX(std::min(lowerBound.GetX(), upperBound.GetX()));
605 const float maxX(std::max(lowerBound.GetX(), upperBound.GetX()));
606 const float minY(std::min(lowerBound.GetY(), upperBound.GetY()));
607 const float maxY(std::max(lowerBound.GetY(), upperBound.GetY()));
608 const float minZ(std::min(lowerBound.GetZ(), upperBound.GetZ()));
609 const float maxZ(std::max(lowerBound.GetZ(), upperBound.GetZ()));
611 for (
const OrderedCaloHitList::value_type &layerEntry : pCluster->GetOrderedCaloHitList())
613 for (
const CaloHit *
const pCaloHit : *layerEntry.second)
615 const CartesianVector &hitPosition = pCaloHit->GetPositionVector();
617 (hitPosition.GetX() < minX - std::numeric_limits<float>::epsilon() || hitPosition.GetX() > maxX + std::numeric_limits<float>::epsilon()))
620 (hitPosition.GetY() < minY - std::numeric_limits<float>::epsilon() || hitPosition.GetY() > maxY + std::numeric_limits<float>::epsilon()))
623 (hitPosition.GetZ() < minZ - std::numeric_limits<float>::epsilon() || hitPosition.GetZ() > maxZ + std::numeric_limits<float>::epsilon()))
626 caloHitList.push_back(pCaloHit);
629 caloHitList.sort(LArClusterHelper::SortHitsByPosition);
634 void LArClusterHelper::GetDaughterVolumeIDs(
const Cluster *
const pCluster,
UIntSet &daughterVolumeIds)
636 const OrderedCaloHitList &orderedCaloHitList(pCluster->GetOrderedCaloHitList());
642 const CaloHit *
const pCaloHit(*hIter);
643 const LArCaloHit *
const pLArCaloHit(dynamic_cast<const LArCaloHit *>(pCaloHit));
652 bool LArClusterHelper::SortByNOccupiedLayers(
const Cluster *
const pLhs,
const Cluster *
const pRhs)
654 const unsigned int nOccupiedLayersLhs(pLhs->GetOrderedCaloHitList().size());
655 const unsigned int nOccupiedLayersRhs(pRhs->GetOrderedCaloHitList().size());
657 if (nOccupiedLayersLhs != nOccupiedLayersRhs)
658 return (nOccupiedLayersLhs > nOccupiedLayersRhs);
660 return SortByNHits(pLhs, pRhs);
665 bool LArClusterHelper::SortByNHits(
const Cluster *
const pLhs,
const Cluster *
const pRhs)
667 const unsigned int nHitsLhs(pLhs->GetNCaloHits());
668 const unsigned int nHitsRhs(pRhs->GetNCaloHits());
670 if (nHitsLhs != nHitsRhs)
671 return (nHitsLhs > nHitsRhs);
673 return SortByLayerSpan(pLhs, pRhs);
678 bool LArClusterHelper::SortByLayerSpan(
const Cluster *
const pLhs,
const Cluster *
const pRhs)
680 const unsigned int layerSpanLhs(pLhs->GetOuterPseudoLayer() - pLhs->GetInnerPseudoLayer());
681 const unsigned int layerSpanRhs(pRhs->GetOuterPseudoLayer() - pRhs->GetInnerPseudoLayer());
683 if (layerSpanLhs != layerSpanRhs)
684 return (layerSpanLhs > layerSpanRhs);
686 return SortByInnerLayer(pLhs, pRhs);
691 bool LArClusterHelper::SortByInnerLayer(
const Cluster *
const pLhs,
const Cluster *
const pRhs)
693 const unsigned int innerLayerLhs(pLhs->GetInnerPseudoLayer());
694 const unsigned int innerLayerRhs(pRhs->GetInnerPseudoLayer());
696 if (innerLayerLhs != innerLayerRhs)
697 return (innerLayerLhs < innerLayerRhs);
699 return SortByPosition(pLhs, pRhs);
704 bool LArClusterHelper::SortByPosition(
const Cluster *
const pLhs,
const Cluster *
const pRhs)
706 const CartesianVector deltaPositionIL(pRhs->GetCentroid(pRhs->GetInnerPseudoLayer()) - pLhs->GetCentroid(pLhs->GetInnerPseudoLayer()));
708 if (std::fabs(deltaPositionIL.GetZ()) > std::numeric_limits<float>::epsilon())
709 return (deltaPositionIL.GetZ() > std::numeric_limits<float>::epsilon());
711 if (std::fabs(deltaPositionIL.GetX()) > std::numeric_limits<float>::epsilon())
712 return (deltaPositionIL.GetX() > std::numeric_limits<float>::epsilon());
714 if (std::fabs(deltaPositionIL.GetY()) > std::numeric_limits<float>::epsilon())
715 return (deltaPositionIL.GetY() > std::numeric_limits<float>::epsilon());
717 const CartesianVector deltaPositionOL(pRhs->GetCentroid(pRhs->GetOuterPseudoLayer()) - pLhs->GetCentroid(pLhs->GetOuterPseudoLayer()));
719 if (std::fabs(deltaPositionOL.GetZ()) > std::numeric_limits<float>::epsilon())
720 return (deltaPositionOL.GetZ() > std::numeric_limits<float>::epsilon());
722 if (std::fabs(deltaPositionOL.GetX()) > std::numeric_limits<float>::epsilon())
723 return (deltaPositionOL.GetX() > std::numeric_limits<float>::epsilon());
725 if (std::fabs(deltaPositionOL.GetY()) > std::numeric_limits<float>::epsilon())
726 return (deltaPositionOL.GetY() > std::numeric_limits<float>::epsilon());
729 return SortByPulseHeight(pLhs, pRhs);
734 bool LArClusterHelper::SortByPulseHeight(
const Cluster *
const pLhs,
const Cluster *
const pRhs)
736 return (pLhs->GetHadronicEnergy() > pRhs->GetHadronicEnergy());
741 bool LArClusterHelper::SortHitsByPosition(
const CaloHit *
const pLhs,
const CaloHit *
const pRhs)
743 const CartesianVector deltaPosition(pRhs->GetPositionVector() - pLhs->GetPositionVector());
745 if (std::fabs(deltaPosition.GetZ()) > std::numeric_limits<float>::epsilon())
746 return (deltaPosition.GetZ() > std::numeric_limits<float>::epsilon());
748 if (std::fabs(deltaPosition.GetX()) > std::numeric_limits<float>::epsilon())
749 return (deltaPosition.GetX() > std::numeric_limits<float>::epsilon());
751 if (std::fabs(deltaPosition.GetY()) > std::numeric_limits<float>::epsilon())
752 return (deltaPosition.GetY() > std::numeric_limits<float>::epsilon());
755 return SortHitsByPulseHeight(pLhs, pRhs);
760 bool LArClusterHelper::SortHitsByPositionInX(
const pandora::CaloHit *
const pLhs,
const pandora::CaloHit *
const pRhs)
762 const CartesianVector deltaPosition(pRhs->GetPositionVector() - pLhs->GetPositionVector());
764 if (std::fabs(deltaPosition.GetX()) > std::numeric_limits<float>::epsilon())
765 return (deltaPosition.GetX() > std::numeric_limits<float>::epsilon());
767 return SortHitsByPosition(pLhs, pRhs);
772 bool LArClusterHelper::SortHitsByPulseHeight(
const CaloHit *
const pLhs,
const CaloHit *
const pRhs)
775 return (pLhs->GetHadronicEnergy() > pRhs->GetHadronicEnergy());
780 bool LArClusterHelper::SortCoordinatesByPosition(
const CartesianVector &lhs,
const CartesianVector &rhs)
782 const CartesianVector deltaPosition(rhs - lhs);
784 if (std::fabs(deltaPosition.GetZ()) > std::numeric_limits<float>::epsilon())
785 return (deltaPosition.GetZ() > std::numeric_limits<float>::epsilon());
787 if (std::fabs(deltaPosition.GetX()) > std::numeric_limits<float>::epsilon())
788 return (deltaPosition.GetX() > std::numeric_limits<float>::epsilon());
790 return (deltaPosition.GetY() > std::numeric_limits<float>::epsilon());
Header file for the lar calo hit class.
Header file for the cluster helper class.
std::set< unsigned int > UIntSet
Detector simulation of raw signals on wires.
unsigned int GetDaughterVolumeId() const
Get the daughter volume id.