9 #include "Geometry/LArTPC.h" 10 #include "Managers/GeometryManager.h" 26 const Pandora &
pandora,
const Vertex *
const pVertex,
const Cluster *
const pCluster,
const float tanAngle,
const float apexShift)
28 if ((VERTEX_3D != pVertex->GetVertexType()) || (tanAngle < std::numeric_limits<float>::epsilon()))
29 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
31 const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
32 const CartesianVector theVertex2D(LArGeometryHelper::ProjectPosition(pandora, pVertex->GetPosition(), hitType));
40 float rLInner(std::numeric_limits<float>::max()), rTInner(std::numeric_limits<float>::max());
41 float rLOuter(std::numeric_limits<float>::max()), rTOuter(std::numeric_limits<float>::max());
42 LArPointingClusterHelper::GetImpactParameters(pointingCluster.
GetInnerVertex(), theVertex2D, rLInner, rTInner);
43 LArPointingClusterHelper::GetImpactParameters(pointingCluster.
GetOuterVertex(), theVertex2D, rLOuter, rTOuter);
45 const bool innerIsVertexAssociated(rLInner > (rTInner / tanAngle) - (length * apexShift));
46 const bool outerIsVertexAssociated(rLOuter > (rTInner / tanAngle) - (length * apexShift));
48 if (innerIsVertexAssociated == outerIsVertexAssociated)
49 return DIRECTION_UNKNOWN;
51 if ((innerIsVertexAssociated && innerIsAtLowerZ) || (outerIsVertexAssociated && !innerIsAtLowerZ))
52 return DIRECTION_FORWARD_IN_Z;
54 if ((innerIsVertexAssociated && !innerIsAtLowerZ) || (outerIsVertexAssociated && innerIsAtLowerZ))
55 return DIRECTION_BACKWARD_IN_Z;
57 catch (StatusCodeException &)
59 return DIRECTION_UNKNOWN;
62 throw StatusCodeException(STATUS_CODE_FAILURE);
67 bool LArVertexHelper::IsInFiducialVolume(
const Pandora &
pandora,
const CartesianVector &
vertex,
const std::string &detector)
69 const LArTPCMap &larTPCMap(pandora.GetGeometry()->GetLArTPCMap());
71 if (larTPCMap.empty())
73 std::cout <<
"LArVertexHelper::IsInFiducialVolume - LArTPC description not registered with Pandora as required " << std::endl;
74 throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
77 float tpcMinX{std::numeric_limits<float>::max()}, tpcMaxX{-std::numeric_limits<float>::max()};
78 float tpcMinY{std::numeric_limits<float>::max()}, tpcMaxY{-std::numeric_limits<float>::max()};
79 float tpcMinZ{std::numeric_limits<float>::max()}, tpcMaxZ{-std::numeric_limits<float>::max()};
81 for (
const auto &[volumeId, pLArTPC] : larTPCMap)
84 const float centreX{pLArTPC->GetCenterX()}, halfWidthX{0.5f * pLArTPC->GetWidthX()};
85 const float centreY{pLArTPC->GetCenterY()}, halfWidthY{0.5f * pLArTPC->GetWidthY()};
86 const float centreZ{pLArTPC->GetCenterZ()}, halfWidthZ{0.5f * pLArTPC->GetWidthZ()};
87 tpcMinX = std::min(tpcMinX, centreX - halfWidthX);
88 tpcMaxX = std::max(tpcMaxX, centreX + halfWidthX);
89 tpcMinY = std::min(tpcMinY, centreY - halfWidthY);
90 tpcMaxY = std::max(tpcMaxY, centreY + halfWidthY);
91 tpcMinZ = std::min(tpcMinZ, centreZ - halfWidthZ);
92 tpcMaxZ = std::max(tpcMaxZ, centreZ + halfWidthZ);
95 if (detector ==
"dune_fd_hd")
97 const float x{vertex.GetX()};
98 const float y{vertex.GetY()};
99 const float z{vertex.GetZ()};
100 return (tpcMinX + 50.
f) <
x &&
x < (tpcMaxX - 50.f) && (tpcMinY + 50.
f) <
y &&
y < (tpcMaxY - 50.f) && (tpcMinZ + 50.
f) <
z &&
101 z < (tpcMaxZ - 150.f);
103 else if (detector ==
"dune_nd")
105 const float x{vertex.GetX()};
106 const float y{vertex.GetY()};
107 const float z{vertex.GetZ()};
108 return tpcMinX <
x &&
x < tpcMaxX && tpcMinY <
y &&
y < tpcMaxY && tpcMinZ <
z &&
z < tpcMaxZ;
112 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
LArPointingCluster class.
Header file for the geometry helper class.
Header file for the cluster helper class.
const Vertex & GetOuterVertex() const
Get the outer vertex.
const Vertex & GetInnerVertex() const
Get the inner vertex.
Header file for the vertex helper class.
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
const pandora::CartesianVector & GetPosition() const
Get the vertex position.