34 const float minLongitudinalDistance,
const float maxTransverseDistance)
36 float rL(0.f), rT(0.f);
39 if (std::fabs(rL) > std::fabs(minLongitudinalDistance) || rT > maxTransverseDistance)
48 const float minLongitudinalDistance,
const float maxLongitudinalDistance,
const float maxTransverseDistance,
const float angularAllowance)
50 float rL(0.f), rT(0.f);
53 if (std::fabs(rL) > std::fabs(minLongitudinalDistance) && (rL < 0 || rL > maxLongitudinalDistance))
56 const float tanSqTheta(std::pow(std::tan(M_PI * angularAllowance / 180.f), 2.0));
58 if (rT * rT > maxTransverseDistance * maxTransverseDistance + rL * rL * tanSqTheta)
69 const CaloHit *pClosestCaloHit(
nullptr);
70 float closestDistanceSquared(std::numeric_limits<float>::max());
71 const float minCosTheta(std::cos(M_PI * projectionAngularAllowance / 180.f));
75 for (
const CaloHit *
const pCaloHit : *layerEntry.second)
77 const CartesianVector hitProjection(pCaloHit->GetPositionVector() - vertexPosition);
80 if (distanceSquared > std::numeric_limits<float>::epsilon())
83 if (distanceSquared < closestDistanceSquared)
87 pClosestCaloHit = pCaloHit;
88 closestDistanceSquared = distanceSquared;
113 if (!useX && !useY && !useZ)
116 for (
unsigned int useInnerI = 0; useInnerI < 2; ++useInnerI)
121 for (
unsigned int useInnerJ = 0; useInnerJ < 2; ++useInnerJ)
126 const float vtxI_vtxJ_dx(useX ? (vtxI.GetPosition().GetX() - vtxJ.GetPosition().GetX()) : 0.f);
127 const float vtxI_vtxJ_dy(useY ? (vtxI.GetPosition().GetY() - vtxJ.GetPosition().GetY()) : 0.f);
128 const float vtxI_vtxJ_dz(useZ ? (vtxI.GetPosition().GetZ() - vtxJ.GetPosition().GetZ()) : 0.f);
129 const float vtxI_vtxJ(vtxI_vtxJ_dx * vtxI_vtxJ_dx + vtxI_vtxJ_dy * vtxI_vtxJ_dy + vtxI_vtxJ_dz * vtxI_vtxJ_dz);
131 const float vtxI_endJ_dx(useX ? (vtxI.GetPosition().GetX() - endJ.GetPosition().GetX()) : 0.f);
132 const float vtxI_endJ_dy(useY ? (vtxI.GetPosition().GetY() - endJ.GetPosition().GetY()) : 0.f);
133 const float vtxI_endJ_dz(useZ ? (vtxI.GetPosition().GetZ() - endJ.GetPosition().GetZ()) : 0.f);
134 const float vtxI_endJ(vtxI_endJ_dx * vtxI_endJ_dx + vtxI_endJ_dy * vtxI_endJ_dy + vtxI_endJ_dz * vtxI_endJ_dz);
136 const float endI_vtxJ_dx(useX ? (endI.GetPosition().GetX() - vtxJ.GetPosition().GetX()) : 0.f);
137 const float endI_vtxJ_dy(useY ? (endI.GetPosition().GetY() - vtxJ.GetPosition().GetY()) : 0.f);
138 const float endI_vtxJ_dz(useZ ? (endI.GetPosition().GetZ() - vtxJ.GetPosition().GetZ()) : 0.f);
139 const float endI_vtxJ(endI_vtxJ_dx * endI_vtxJ_dx + endI_vtxJ_dy * endI_vtxJ_dy + endI_vtxJ_dz * endI_vtxJ_dz);
141 const float endI_endJ_dx(useX ? (endI.GetPosition().GetX() - endJ.GetPosition().GetX()) : 0.f);
142 const float endI_endJ_dy(useY ? (endI.GetPosition().GetY() - endJ.GetPosition().GetY()) : 0.f);
143 const float endI_endJ_dz(useZ ? (endI.GetPosition().GetZ() - endJ.GetPosition().GetZ()) : 0.f);
144 const float endI_endJ(endI_endJ_dx * endI_endJ_dx + endI_endJ_dy * endI_endJ_dy + endI_endJ_dz * endI_endJ_dz);
146 if ((vtxI_vtxJ < std::min(vtxI_endJ, std::min(endI_vtxJ, endI_endJ))) && (endI_endJ > std::max(vtxI_endJ, std::max(endI_vtxJ, vtxI_vtxJ))))
148 closestVertexI = vtxI;
149 closestVertexJ = vtxJ;
187 if (std::fabs(initialVertex.
GetDirection().
GetX()) > 1.f - std::numeric_limits<float>::epsilon())
218 const CartesianVector &targetPosition,
float &longitudinal,
float &transverse)
223 longitudinal = -initialDirection.
GetDotProduct(targetPosition - initialPosition);
234 if (pFirstCluster == pSecondCluster)
240 if ((energy1 < std::numeric_limits<float>::epsilon()) || (energy2 < std::numeric_limits<float>::epsilon()))
254 if (pFirstCluster == pSecondCluster)
258 secondVertex.
GetDirection(), intersectPosition, firstDisplacement, secondDisplacement);
270 if (1.f - std::fabs(cosTheta) < std::numeric_limits<float>::epsilon())
274 const float P = ((a2 - b2 * cosTheta).GetDotProduct(b1 - a1)) / (1.f - cosTheta * cosTheta);
275 const float Q = ((a2 * cosTheta - b2).GetDotProduct(b1 - a1)) / (1.f - cosTheta * cosTheta);
278 intersectPosition = (a1 + a2 * P + b1 + b2 * Q) * 0.5f;
281 firstDisplacement = P;
282 secondDisplacement = Q;
288 CartesianVector &intersectPosition,
float &displacementL,
float &displacementT)
290 displacementT = +std::numeric_limits<float>::max();
291 displacementL = -std::numeric_limits<float>::max();
293 float rL(0.f), rT(0.f);
294 float figureOfMerit(std::numeric_limits<float>::max());
295 float foundIntersection(
false);
301 for (CaloHitList::const_iterator iter2 = iter1->second->begin(), iterEnd2 = iter1->second->end(); iter2 != iterEnd2; ++iter2)
307 if (rT < figureOfMerit)
313 intersectPosition = hitPosition;
314 foundIntersection =
true;
319 if (!foundIntersection)
326 const LArPointingClusterList &pointingClusterList,
const float minLongitudinalDistance,
const float maxLongitudinalDistance,
327 const float maxTransverseDistance,
const float angularAllowance)
329 float bestAssociatedEnergy(0.f);
330 LArPointingClusterVertexList::const_iterator bestVertexIter(vertexList.end());
332 for (LArPointingClusterVertexList::const_iterator iter = vertexList.begin(), iterEnd = vertexList.end(); iter != iterEnd; ++iter)
338 maxTransverseDistance, angularAllowance, associatedVertices);
342 if (associatedEnergy > bestAssociatedEnergy)
344 bestVertexIter = iter;
345 bestAssociatedEnergy = associatedEnergy;
349 if (vertexList.end() == bestVertexIter)
352 return (*bestVertexIter);
358 const float minLongitudinalDistance,
const float maxLongitudinalDistance,
const float maxTransverseDistance,
361 for (LArPointingClusterList::const_iterator iter = inputList.begin(), iterEnd = inputList.end(); iter != iterEnd; ++iter)
367 const float innerDistanceSquared = (innerVertex.
GetPosition() - vertex.
GetPosition()).GetMagnitudeSquared();
368 const float outerDistanceSquared = (outerVertex.
GetPosition() - vertex.
GetPosition()).GetMagnitudeSquared();
374 maxTransverseDistance, angularAllowance))
376 outputList.push_back(chosenVertex);
385 float associatedEnergy(0.f);
387 for (LArPointingClusterVertexList::const_iterator iter = associatedVertices.begin(), iterEnd = associatedVertices.end(); iter != iterEnd; ++iter)
396 if (deltaLength < std::numeric_limits<float>::epsilon())
398 associatedEnergy += clusterEnergy;
400 else if (deltaLength < clusterLength)
402 associatedEnergy += clusterEnergy * (1.f - (deltaLength / clusterLength));
406 return associatedEnergy;
Header file for the cluster helper class.
static float GetEnergyFromLength(const pandora::Cluster *const pCluster)
Get energy of cluster, based on length.
static float GetLength(const pandora::Cluster *const pCluster)
Get length of cluster.
const pandora::CartesianVector & GetDirection() const
Get the vertex direction.
const pandora::CartesianVector & GetPosition() const
Get the vertex position.
const pandora::Cluster * GetCluster() const
Get the address of the cluster.
static void CollectAssociatedClusters(const LArPointingCluster::Vertex &vertex, const LArPointingClusterList &inputList, const float minLongitudinalDistance, const float maxLongitudinalDistance, const float maxTransverseDistance, const float angularAllowance, LArPointingClusterVertexList &outputList)
Collect cluster vertices, from a provided input list, associated with a specified vertex.
static void GetClosestVertices(const bool useX, const bool useY, const bool useZ, const LArPointingCluster &pointingClusterI, const LArPointingCluster &pointingClusterJ, LArPointingCluster::Vertex &closestVertexI, LArPointingCluster::Vertex &closestVertexJ)
Given a pair of pointing clusters, receive the closest or farthest pair of vertices.
static float GetAssociatedEnergy(const LArPointingCluster::Vertex &vertex, const LArPointingClusterVertexList &clusterVertices)
Get an estimate of the energy associated with a specified vertex.
static void GetImpactParameters(const LArPointingCluster::Vertex &pointingVertex, const LArPointingCluster::Vertex &targetVertex, float &longitudinal, float &transverse)
Calculate impact parameters between a pair of pointing vertices.
static void GetClosestVerticesInYZ(const LArPointingCluster &pointingClusterI, const LArPointingCluster &pointingClusterJ, LArPointingCluster::Vertex &closestVertexI, LArPointingCluster::Vertex &closestVertexJ)
Given a pair of pointing clusters, find the pair of vertices with smallest yz-separation.
static float GetLength(const LArPointingCluster &pointingCluster)
Calculate distance squared between inner and outer vertices of pointing cluster.
static void GetImpactParametersInYZ(const LArPointingCluster::Vertex &pointingVertex, const LArPointingCluster::Vertex &targetVertex, float &longitudinal, float &transverse)
Calculate impact parameters between a pair of pointing vertices using yz-coordinates.
static float GetLengthSquared(const LArPointingCluster &pointingCluster)
Calculate distance squared between inner and outer vertices of pointing cluster.
static LArPointingCluster::Vertex GetBestVertexEstimate(const LArPointingClusterVertexList &vertexList, const LArPointingClusterList &pointingClusterList, const float minLongitudinalDistance, const float maxLongitudinalDistance, const float maxTransverseDistance, const float angularAllowance)
Simple and fast vertex selection, choosing best vertex from a specified list to represent a set of po...
static bool IsNode(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxTransverseDistance)
Whether pointing vertex is adjacent to a given position.
static bool IsEmission(const pandora::CartesianVector &parentVertex, const LArPointingCluster::Vertex &daughterVertex, const float minLongitudinalDistance, const float maxLongitudinalDistance, const float maxTransverseDistance, const float angularAllowance)
Whether pointing vertex is emitted from a given position.
static pandora::CartesianVector GetProjectedPosition(const pandora::CartesianVector &initialPosition, const pandora::CartesianVector &initialDirection, const pandora::Cluster *const pCluster, const float projectionAngularAllowance)
Get projected position on a cluster from a specified position and direction.
static void GetAverageDirection(const LArPointingCluster::Vertex &firstVertex, const LArPointingCluster::Vertex &secondVertex, pandora::CartesianVector &averageDirection)
Get average direction of two vertices.
static void GetClosestVerticesInX(const LArPointingCluster &pointingClusterI, const LArPointingCluster &pointingClusterJ, LArPointingCluster::Vertex &closestVertexI, LArPointingCluster::Vertex &closestVertexJ)
Given a pair of pointing clusters, find the pair of vertices with smallest x-separation.
static void GetIntersection(const LArPointingCluster::Vertex &firstVertex, const LArPointingCluster::Vertex &secondVertex, pandora::CartesianVector &intersectPosition, float &firstDisplacement, float &secondDisplacement)
Get intersection of two vertices.
LArPointingCluster class.
const Vertex & GetInnerVertex() const
Get the inner vertex.
const pandora::Cluster * GetCluster() const
Get the address of the cluster.
const Vertex & GetOuterVertex() const
Get the outer vertex.
const CartesianVector & GetPositionVector() const
Get the position vector of center of calorimeter cell, units mm.
float GetMagnitudeSquared() const
Get the magnitude squared.
float GetX() const
Get the cartesian x coordinate.
CartesianVector GetUnitVector() const
Get a unit vector in the direction of the cartesian vector.
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.
float GetY() const
Get the cartesian y coordinate.
float GetHadronicEnergy() const
Get the sum of hadronic energy measures of all constituent calo hits, units GeV.
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
TheList::value_type value_type
StatusCodeException class.
std::vector< LArPointingCluster::Vertex > LArPointingClusterVertexList
std::vector< LArPointingCluster > LArPointingClusterList