Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
TrackConsolidationAlgorithm.cc
Go to the documentation of this file.
1
10
12
13using namespace pandora;
14
15namespace lar_content
16{
17
19 m_maxTransverseDisplacement(1.f),
20 m_minAssociatedSpan(1.f),
21 m_minAssociatedFraction(0.5f)
22{
23}
24
25//------------------------------------------------------------------------------------------------------------------------------------------
26
28 const ClusterVector &showerClustersJ, ClusterToHitMap &caloHitsToAddI, ClusterToHitMap &caloHitsToRemoveJ) const
29{
30 for (const TwoDSlidingFitResult &slidingFitResultI : slidingFitResultListI)
31 {
32 const Cluster *const pClusterI = slidingFitResultI.GetCluster();
33 const float thisLengthSquaredI(LArClusterHelper::GetLengthSquared(pClusterI));
34
35 for (const Cluster *const pClusterJ : showerClustersJ)
36 {
37 const float thisLengthSquaredJ(LArClusterHelper::GetLengthSquared(pClusterJ));
38
39 if (pClusterI == pClusterJ)
40 continue;
41
42 if (2.f * thisLengthSquaredJ > thisLengthSquaredI)
43 continue;
44
45 this->GetReclusteredHits(slidingFitResultI, pClusterJ, caloHitsToAddI, caloHitsToRemoveJ);
46 }
47 }
48}
49
50//------------------------------------------------------------------------------------------------------------------------------------------
51
52void TrackConsolidationAlgorithm::GetReclusteredHits(const TwoDSlidingFitResult &slidingFitResultI, const Cluster *const pClusterJ,
53 ClusterToHitMap &caloHitsToAddI, ClusterToHitMap &caloHitsToRemoveJ) const
54{
55 const Cluster *const pClusterI(slidingFitResultI.GetCluster());
56
57 CaloHitList associatedHits, caloHitListJ;
58 pClusterJ->GetOrderedCaloHitList().FillCaloHitList(caloHitListJ);
59
60 float minL(std::numeric_limits<float>::max());
61 float maxL(std::numeric_limits<float>::max());
62
63 // Loop over hits from shower clusters, and make associations with track clusters
64 // (Determine if hits from shower clusters can be used to fill gaps in track cluster)
65 //
66 // Apply the following selection:
67 // rJ = candidate hit from shower cluster
68 // rI = nearest hit on track cluster
69 // rK = projection of shower hit onto track cluster
70 //
71 // o rJ
72 // o o o o o o - - x - - - - o o o o o o o
73 // rI rK
74 //
75 // Require: rJK < std::min(rCut, rIJ, rKI)
76
77 for (CaloHitList::const_iterator iterJ = caloHitListJ.begin(), iterEndJ = caloHitListJ.end(); iterJ != iterEndJ; ++iterJ)
78 {
79 const CaloHit *const pCaloHitJ = *iterJ;
80
81 const CartesianVector positionJ(pCaloHitJ->GetPositionVector());
82 const CartesianVector positionI(LArClusterHelper::GetClosestPosition(positionJ, pClusterI));
83
84 float rL(0.f), rT(0.f);
85 CartesianVector positionK(0.f, 0.f, 0.f);
86
87 if (STATUS_CODE_SUCCESS != slidingFitResultI.GetGlobalFitProjection(positionJ, positionK))
88 continue;
89
90 slidingFitResultI.GetLocalPosition(positionK, rL, rT);
91
92 const float rsqIJ((positionI - positionJ).GetMagnitudeSquared());
93 const float rsqJK((positionJ - positionK).GetMagnitudeSquared());
94 const float rsqKI((positionK - positionI).GetMagnitudeSquared());
95
96 if (rsqJK < std::min(m_maxTransverseDisplacement * m_maxTransverseDisplacement, std::min(rsqIJ, rsqKI)))
97 {
98 if (associatedHits.empty())
99 {
100 minL = rL;
101 maxL = rL;
102 }
103 else
104 {
105 minL = std::min(minL, rL);
106 maxL = std::max(maxL, rL);
107 }
108
109 associatedHits.push_back(pCaloHitJ);
110 }
111 }
112
113 const float associatedSpan(maxL - minL);
114 const float associatedFraction(
115 associatedHits.empty() ? 0.f : static_cast<float>(associatedHits.size()) / static_cast<float>(pClusterJ->GetNCaloHits()));
116
117 if (associatedSpan > m_minAssociatedSpan || associatedFraction > m_minAssociatedFraction)
118 {
119 for (CaloHitList::const_iterator iterK = associatedHits.begin(), iterEndK = associatedHits.end(); iterK != iterEndK; ++iterK)
120 {
121 const CaloHit *const pCaloHit = *iterK;
122 const CaloHitList &caloHitList(caloHitsToRemoveJ[pClusterJ]);
123
124 if (caloHitList.end() != std::find(caloHitList.begin(), caloHitList.end(), pCaloHit))
125 continue;
126
127 caloHitsToAddI[pClusterI].push_back(pCaloHit);
128 caloHitsToRemoveJ[pClusterJ].push_back(pCaloHit);
129 }
130 }
131}
132
133//------------------------------------------------------------------------------------------------------------------------------------------
134
136{
137 PANDORA_RETURN_RESULT_IF_AND_IF(STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=,
138 XmlHelper::ReadValue(xmlHandle, "MaxTransverseDisplacement", m_maxTransverseDisplacement));
139
141 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinAssociatedSpan", m_minAssociatedSpan));
142
144 STATUS_CODE_SUCCESS, STATUS_CODE_NOT_FOUND, !=, XmlHelper::ReadValue(xmlHandle, "MinAssociatedFraction", m_minAssociatedFraction));
145
147}
148
149} // namespace lar_content
Grouping of header files for many classes of use in particle flow algorithms.
#define PANDORA_RETURN_RESULT_IF_AND_IF(StatusCode1, StatusCode2, Operator, Command)
Definition StatusCodes.h:31
Header file for the track consolidation algorithm class.
static pandora::CartesianVector GetClosestPosition(const pandora::CartesianVector &position, const pandora::ClusterList &clusterList)
Get closest position in a list of clusters to a specified input position vector.
static float GetLengthSquared(const pandora::Cluster *const pCluster)
Get length squared of cluster.
void GetReclusteredHits(const TwoDSlidingFitResultList &slidingFitResultList, const pandora::ClusterVector &showerClusters, ClusterToHitMap &caloHitsToAdd, ClusterToHitMap &caloHitsToRemove) const
Get the list of hits to be added to track clusters and removed from shower clusters.
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
std::unordered_map< const pandora::Cluster *, pandora::CaloHitList > ClusterToHitMap
pandora::StatusCode ReadSettings(const pandora::TiXmlHandle xmlHandle)
Read the algorithm settings.
void GetLocalPosition(const pandora::CartesianVector &position, float &rL, float &rT) const
Get local sliding fit coordinates for a given global position.
const pandora::Cluster * GetCluster() const
Get the address of the cluster, if originally provided.
pandora::StatusCode GetGlobalFitProjection(const pandora::CartesianVector &inputPosition, pandora::CartesianVector &projectedPosition) const
Get projected position on global fit for a given position vector.
CaloHit class.
Definition CaloHit.h:26
const CartesianVector & GetPositionVector() const
Get the position vector of center of calorimeter cell, units mm.
Definition CaloHit.h:350
CartesianVector class.
Cluster class.
Definition Cluster.h:31
unsigned int GetNCaloHits() const
Get the number of calo hits in the cluster.
Definition Cluster.h:484
const OrderedCaloHitList & GetOrderedCaloHitList() const
Get the ordered calo hit list.
Definition Cluster.h:470
void FillCaloHitList(CaloHitList &caloHitList) const
Fill a provided calo hit list with all the calo hits in the ordered calo hit list.
static StatusCode ReadValue(const TiXmlHandle &xmlHandle, const std::string &xmlElementName, T &t)
Read a value from an xml element.
Definition XmlHelper.h:136
std::vector< TwoDSlidingFitResult > TwoDSlidingFitResultList
std::vector< const Cluster * > ClusterVector
MANAGED_CONTAINER< const CaloHit * > CaloHitList
StatusCode
The StatusCode enum.