LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
LArVertexHelper.cc
Go to the documentation of this file.
1 
9 #include "Geometry/LArTPC.h"
10 #include "Managers/GeometryManager.h"
11 
16 
17 #include <algorithm>
18 #include <limits>
19 
20 using namespace pandora;
21 
22 namespace lar_content
23 {
24 
25 LArVertexHelper::ClusterDirection LArVertexHelper::GetClusterDirectionInZ(
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))
52  return DIRECTION_FORWARD_IN_Z;
53 
54  if ((innerIsVertexAssociated && !innerIsAtLowerZ) || (outerIsVertexAssociated && innerIsAtLowerZ))
55  return DIRECTION_BACKWARD_IN_Z;
56  }
57  catch (StatusCodeException &)
58  {
59  return DIRECTION_UNKNOWN;
60  }
61 
62  throw StatusCodeException(STATUS_CODE_FAILURE);
63 }
64 
65 //-----------------------------------------------------------------------------------------------------------------------------------------
66 
67 bool 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
Float_t x
Definition: compare.C:6
Float_t y
Definition: compare.C:6
Double_t z
Definition: plot.C:276
LArPointingCluster class.
TFile f
Definition: plotHisto.C:6
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.
HitType
Definition: HitType.h:12
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
const pandora::CartesianVector & GetPosition() const
Get the vertex position.
vertex reconstruction