Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
LArVertexHelper.cc
Go to the documentation of this file.
1
9#include "Geometry/LArTPC.h"
11
16
17#include <algorithm>
18#include <limits>
19
20using namespace pandora;
21
22namespace lar_content
23{
24
26 const Pandora &pandora, const Vertex *const pVertex, const Cluster *const pCluster, const float tanAngle, const float apexShift)
27{
28 if ((VERTEX_3D != pVertex->GetVertexType()) || (tanAngle < std::numeric_limits<float>::epsilon()))
29 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
30
31 const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
32 const CartesianVector theVertex2D(LArGeometryHelper::ProjectPosition(pandora, pVertex->GetPosition(), hitType));
33
34 try
35 {
36 const LArPointingCluster pointingCluster(pCluster);
37 const float length((pointingCluster.GetInnerVertex().GetPosition() - pointingCluster.GetOuterVertex().GetPosition()).GetMagnitude());
38 const bool innerIsAtLowerZ(pointingCluster.GetInnerVertex().GetPosition().GetZ() < pointingCluster.GetOuterVertex().GetPosition().GetZ());
39
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);
44
45 const bool innerIsVertexAssociated(rLInner > (rTInner / tanAngle) - (length * apexShift));
46 const bool outerIsVertexAssociated(rLOuter > (rTInner / tanAngle) - (length * apexShift));
47
48 if (innerIsVertexAssociated == outerIsVertexAssociated)
49 return DIRECTION_UNKNOWN;
50
51 if ((innerIsVertexAssociated && innerIsAtLowerZ) || (outerIsVertexAssociated && !innerIsAtLowerZ))
53
54 if ((innerIsVertexAssociated && !innerIsAtLowerZ) || (outerIsVertexAssociated && innerIsAtLowerZ))
56 }
57 catch (StatusCodeException &)
58 {
59 return DIRECTION_UNKNOWN;
60 }
61
62 throw StatusCodeException(STATUS_CODE_FAILURE);
63}
64
65//-----------------------------------------------------------------------------------------------------------------------------------------
66
67bool LArVertexHelper::IsInFiducialVolume(const Pandora &pandora, const CartesianVector &vertex, const std::string &detector)
68{
69 const LArTPCMap &larTPCMap(pandora.GetGeometry()->GetLArTPCMap());
70
71 if (larTPCMap.empty())
72 {
73 std::cout << "LArVertexHelper::IsInFiducialVolume - LArTPC description not registered with Pandora as required " << std::endl;
74 throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
75 }
76
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()};
80
81 for (const auto &[volumeId, pLArTPC] : larTPCMap)
82 {
83 (void)volumeId;
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);
93 }
94
95 if (detector == "dune_fd_hd")
96 {
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);
102 }
103 else if (detector == "dune_nd")
104 {
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;
109 }
110 else
111 {
112 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
113 }
114}
115
116} // namespace lar_content
Header file for the geometry manager class.
Header file for the cluster helper class.
Header file for the geometry helper class.
Header file for the lar tpc class.
Header file for the vertex helper class.
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
static pandora::CartesianVector ProjectPosition(const pandora::Pandora &pandora, const pandora::CartesianVector &position3D, const pandora::HitType view)
Project 3D position into a given 2D view.
const pandora::CartesianVector & GetPosition() const
Get the vertex position.
static void GetImpactParameters(const LArPointingCluster::Vertex &pointingVertex, const LArPointingCluster::Vertex &targetVertex, float &longitudinal, float &transverse)
Calculate impact parameters between a pair of pointing vertices.
LArPointingCluster class.
const Vertex & GetInnerVertex() const
Get the inner vertex.
const Vertex & GetOuterVertex() const
Get the outer vertex.
static ClusterDirection GetClusterDirectionInZ(const pandora::Pandora &pandora, const pandora::Vertex *const pVertex, const pandora::Cluster *const pCluster, const float tanAngle, const float apexShift)
Get the direction of the cluster in z, using a projection of the provided vertex.
static bool IsInFiducialVolume(const pandora::Pandora &pandora, const pandora::CartesianVector &vertex, const std::string &detector)
Determine if a vertex is within a detector's fiducial volume. This throws a STATUS_CODE_INVALID_PARAM...
CartesianVector class.
float GetX() const
Get the cartesian x coordinate.
float GetZ() const
Get the cartesian z coordinate.
float GetY() const
Get the cartesian y coordinate.
Cluster class.
Definition Cluster.h:31
Pandora class.
Definition Pandora.h:40
StatusCodeException class.
Vertex class.
Definition Vertex.h:26
VertexType GetVertexType() const
Get the vertex type.
Definition Vertex.h:124
const CartesianVector & GetPosition() const
Get the vertex position.
Definition Vertex.h:103
HitType
Calorimeter hit type enum.
std::map< unsigned int, const LArTPC * > LArTPCMap