LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
MissingTrackTool.cc
Go to the documentation of this file.
1 
9 #include "Pandora/AlgorithmHeaders.h"
11 
12 using namespace pandora;
13 
14 namespace lar_content
15 {
16 
17 MissingTrackTool::MissingTrackTool() :
18  m_minMatchedSamplingPoints(15),
19  m_minMatchedFraction(0.95f),
20  m_maxReducedChiSquared(0.707f),
21  m_minXOverlapFraction(0.75f)
22 {
23 }
24 
25 //------------------------------------------------------------------------------------------------------------------------------------------
26 
27 bool MissingTrackTool::Run(ThreeDTransverseTracksAlgorithm *const pAlgorithm, TensorType &overlapTensor)
28 {
29  if (PandoraContentApi::GetSettings(*pAlgorithm)->ShouldDisplayAlgorithmInfo())
30  std::cout << "----> Running Algorithm Tool: " << this->GetInstanceName() << ", " << this->GetType() << std::endl;
31 
32  ProtoParticleVector protoParticleVector;
33  this->FindMissingTracks(overlapTensor, protoParticleVector);
34 
35  const bool particlesMade(pAlgorithm->CreateThreeDParticles(protoParticleVector));
36  return particlesMade;
37 }
38 
39 //------------------------------------------------------------------------------------------------------------------------------------------
40 
41 void MissingTrackTool::FindMissingTracks(const TensorType &overlapTensor, ProtoParticleVector &protoParticleVector) const
42 {
43  ClusterSet usedClusters;
44  ClusterVector sortedKeyClusters;
45  overlapTensor.GetSortedKeyClusters(sortedKeyClusters);
46 
47  for (const Cluster *const pKeyCluster : sortedKeyClusters)
48  {
49  unsigned int nU(0), nV(0), nW(0);
50  TensorType::ElementList elementList;
51  overlapTensor.GetConnectedElements(pKeyCluster, false, elementList, nU, nV, nW);
52 
53  for (TensorType::ElementList::const_iterator eIter = elementList.begin(); eIter != elementList.end(); ++eIter)
54  {
55  const bool includeU(eIter->GetClusterU()->IsAvailable() && !usedClusters.count(eIter->GetClusterU()));
56  const bool includeV(eIter->GetClusterV()->IsAvailable() && !usedClusters.count(eIter->GetClusterV()));
57  const bool includeW(eIter->GetClusterW()->IsAvailable() && !usedClusters.count(eIter->GetClusterW()));
58 
59  unsigned int nAvailable(0);
60  if (includeU) ++nAvailable;
61  if (includeV) ++nAvailable;
62  if (includeW) ++nAvailable;
63 
64  if (2 != nAvailable)
65  continue;
66 
67  const TransverseOverlapResult &overlapResult(eIter->GetOverlapResult());
68 
69  if (overlapResult.GetNMatchedSamplingPoints() < m_minMatchedSamplingPoints)
70  continue;
71 
72  if (overlapResult.GetMatchedFraction() < m_minMatchedFraction)
73  continue;
74 
75  if (overlapResult.GetReducedChi2() > m_maxReducedChiSquared)
76  continue;
77 
78  if ((overlapResult.GetXOverlap().GetXSpanU() < std::numeric_limits<float>::epsilon()) ||
79  (overlapResult.GetXOverlap().GetXSpanV() < std::numeric_limits<float>::epsilon()) ||
80  (overlapResult.GetXOverlap().GetXSpanW() < std::numeric_limits<float>::epsilon()))
81  {
82  continue;
83  }
84 
85  const float xOverlapSpan(overlapResult.GetXOverlap().GetXOverlapSpan());
86 
87  if (includeU && (xOverlapSpan / overlapResult.GetXOverlap().GetXSpanU() < m_minXOverlapFraction))
88  continue;
89 
90  if (includeV && (xOverlapSpan / overlapResult.GetXOverlap().GetXSpanV() < m_minXOverlapFraction))
91  continue;
92 
93  if (includeW && (xOverlapSpan / overlapResult.GetXOverlap().GetXSpanW() < m_minXOverlapFraction))
94  continue;
95 
96  ProtoParticle protoParticle;
97  if (includeU) protoParticle.m_clusterListU.push_back(eIter->GetClusterU());
98  if (includeV) protoParticle.m_clusterListV.push_back(eIter->GetClusterV());
99  if (includeW) protoParticle.m_clusterListW.push_back(eIter->GetClusterW());
100 
101  protoParticleVector.push_back(protoParticle);
102  usedClusters.insert(eIter->GetClusterU());
103  usedClusters.insert(eIter->GetClusterV());
104  usedClusters.insert(eIter->GetClusterW());
105  }
106  }
107 }
108 
109 //------------------------------------------------------------------------------------------------------------------------------------------
110 
111 StatusCode MissingTrackTool::ReadSettings(const TiXmlHandle xmlHandle)
112 {
113  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
114  "MinMatchedSamplingPoints", m_minMatchedSamplingPoints));
115 
116  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
117  "MinMatchedFraction", m_minMatchedFraction));
118 
119  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
120  "MaxReducedChiSquared", m_maxReducedChiSquared));
121 
122  PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle,
123  "MinXOverlapFraction", m_minXOverlapFraction));
124 
125  return STATUS_CODE_SUCCESS;
126 }
127 
128 } // namespace lar_content
std::vector< ProtoParticle > ProtoParticleVector
virtual bool CreateThreeDParticles(const ProtoParticleVector &protoParticleVector)
Create particles using findings from recent algorithm processing.
void GetConnectedElements(const pandora::Cluster *const pCluster, const bool ignoreUnavailable, ElementList &elementList) const
Get a list of elements connected to a specified cluster.
float m_maxReducedChiSquared
The max reduced chi squared value for the unavailable tensor element.
float m_minMatchedFraction
The min matched sampling point fraction for the unavailable tensor element.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
TFile f
Definition: plotHisto.C:6
pandora::ClusterList m_clusterListW
List of 2D W clusters in a 3D proto particle.
float m_minXOverlapFraction
The min x overlap fraction for the two available clusters in the tensor element.
pandora::ClusterList m_clusterListV
List of 2D V clusters in a 3D proto particle.
Header file for the missing track tool class.
pandora::ClusterList m_clusterListU
List of 2D U clusters in a 3D proto particle.
void GetSortedKeyClusters(pandora::ClusterVector &sortedKeyClusters) const
Get a sorted vector of key clusters (U clusters with current implementation)
TransverseOverlapResult class.
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void FindMissingTracks(const TensorType &overlapTensor, ProtoParticleVector &protoParticleVector) const
Find missing tracks, due to merging of multiple particle deposits into single hits during hit creatio...
unsigned int m_minMatchedSamplingPoints
The min number of matched sampling points for the unavailable tensor element.
bool Run(ThreeDTransverseTracksAlgorithm *const pAlgorithm, TensorType &overlapTensor)
Run the algorithm tool.