LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
DeltaRayMatchingContainers.cc
Go to the documentation of this file.
1 
9 #include "Pandora/PandoraEnumeratedTypes.h"
10 
11 #include "Objects/Cluster.h"
12 
15 
17 
18 using namespace pandora;
19 
20 namespace lar_content
21 {
22 
23 DeltaRayMatchingContainers::DeltaRayMatchingContainers() :
24  m_searchRegion1D(3.f)
25 {
26 }
27 
28 //------------------------------------------------------------------------------------------------------------------------------------------
29 
30 void DeltaRayMatchingContainers::FillContainers(const PfoList &inputPfoList, const ClusterList &inputClusterList1,
31  const ClusterList &inputClusterList2, const ClusterList &inputClusterList3)
32 {
33  this->FillHitToClusterMap(inputClusterList1);
34  this->FillHitToClusterMap(inputClusterList2);
35  this->FillHitToClusterMap(inputClusterList3);
36 
37  this->FillClusterProximityMap(inputClusterList1);
38  this->FillClusterProximityMap(inputClusterList2);
39  this->FillClusterProximityMap(inputClusterList3);
40 
41  this->FillClusterToPfoMaps(inputPfoList);
42 }
43 
44 //------------------------------------------------------------------------------------------------------------------------------------------
45 
46 void DeltaRayMatchingContainers::FillHitToClusterMap(const ClusterList &inputClusterList)
47 {
48  for (const Cluster *const pCluster : inputClusterList)
49  this->AddToClusterMap(pCluster);
50 }
51 
52 //------------------------------------------------------------------------------------------------------------------------------------------
53 
54 void DeltaRayMatchingContainers::AddToClusterMap(const Cluster *const pCluster)
55 {
56  const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
57  HitToClusterMap &hitToClusterMap((hitType == TPC_VIEW_U) ? m_hitToClusterMapU
58  : (hitType == TPC_VIEW_V) ? m_hitToClusterMapV
60 
61  CaloHitList caloHitList;
62  pCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
63 
64  for (const CaloHit *const pCaloHit : caloHitList)
65  hitToClusterMap[pCaloHit] = pCluster;
66 }
67 
68 //------------------------------------------------------------------------------------------------------------------------------------------
69 
70 void DeltaRayMatchingContainers::FillClusterProximityMap(const ClusterList &inputClusterList)
71 {
72  if (inputClusterList.empty())
73  return;
74 
75  const HitType hitType(LArClusterHelper::GetClusterHitType(inputClusterList.front()));
76 
77  this->BuildKDTree(hitType);
78 
79  for (const Cluster *const pCluster : inputClusterList)
80  this->AddToClusterProximityMap(pCluster);
81 }
82 
83 //------------------------------------------------------------------------------------------------------------------------------------------
84 
86 {
87  const HitToClusterMap &hitToClusterMap((hitType == TPC_VIEW_U) ? m_hitToClusterMapU
88  : (hitType == TPC_VIEW_V) ? m_hitToClusterMapV
90  HitKDTree2D &kdTree((hitType == TPC_VIEW_U) ? m_kdTreeU : (hitType == TPC_VIEW_V) ? m_kdTreeV : m_kdTreeW);
91 
92  CaloHitList allCaloHits;
93 
94  for (auto &entry : hitToClusterMap)
95  allCaloHits.push_back(entry.first);
96 
97  HitKDNode2DList hitKDNode2DList;
98  KDTreeBox hitsBoundingRegion2D(fill_and_bound_2d_kd_tree(allCaloHits, hitKDNode2DList));
99 
100  kdTree.build(hitKDNode2DList, hitsBoundingRegion2D);
101 }
102 
103 //------------------------------------------------------------------------------------------------------------------------------------------
104 
105 void DeltaRayMatchingContainers::AddToClusterProximityMap(const Cluster *const pCluster)
106 {
107  const HitType hitType(LArClusterHelper::GetClusterHitType(pCluster));
108  const HitToClusterMap &hitToClusterMap((hitType == TPC_VIEW_U) ? m_hitToClusterMapU
109  : (hitType == TPC_VIEW_V) ? m_hitToClusterMapV
111  HitKDTree2D &kdTree((hitType == TPC_VIEW_U) ? m_kdTreeU : (hitType == TPC_VIEW_V) ? m_kdTreeV : m_kdTreeW);
112  ClusterProximityMap &clusterProximityMap((hitType == TPC_VIEW_U) ? m_clusterProximityMapU
113  : (hitType == TPC_VIEW_V) ? m_clusterProximityMapV
115 
116  CaloHitList caloHitList;
117  pCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
118 
119  for (const CaloHit *const pCaloHit : caloHitList)
120  {
121  HitKDNode2DList found;
123 
124  kdTree.search(searchRegionHits, found);
125 
126  for (const auto &hit : found)
127  {
128  const Cluster *const pNearbyCluster(hitToClusterMap.at(hit.data));
129 
130  if (pNearbyCluster == pCluster)
131  continue;
132 
133  ClusterList &nearbyClusterList(clusterProximityMap[pCluster]);
134 
135  if (std::find(nearbyClusterList.begin(), nearbyClusterList.end(), pNearbyCluster) == nearbyClusterList.end())
136  nearbyClusterList.push_back(pNearbyCluster);
137 
138  ClusterList &invertedNearbyClusterList(clusterProximityMap[pNearbyCluster]);
139 
140  if (std::find(invertedNearbyClusterList.begin(), invertedNearbyClusterList.end(), pCluster) == invertedNearbyClusterList.end())
141  invertedNearbyClusterList.push_back(pCluster);
142  }
143  }
144 }
145 
146 //------------------------------------------------------------------------------------------------------------------------------------------
147 
148 void DeltaRayMatchingContainers::FillClusterToPfoMaps(const PfoList &inputPfoList)
149 {
150  for (const ParticleFlowObject *const pPfo : inputPfoList)
151  this->AddClustersToPfoMaps(pPfo);
152 }
153 
154 //------------------------------------------------------------------------------------------------------------------------------------------
155 
156 void DeltaRayMatchingContainers::AddClustersToPfoMaps(const ParticleFlowObject *const pPfo)
157 {
158  for (const HitType hitType : {TPC_VIEW_U, TPC_VIEW_V, TPC_VIEW_W})
159  {
160  ClusterList pfoClusters;
161  LArPfoHelper::GetClusters(pPfo, hitType, pfoClusters);
162 
163  ClusterToPfoMap &clusterToPfoMap((hitType == TPC_VIEW_U) ? m_clusterToPfoMapU
164  : (hitType == TPC_VIEW_V) ? m_clusterToPfoMapV
166 
167  for (const Cluster *const pCluster : pfoClusters)
168  {
169  if (clusterToPfoMap.find(pCluster) != clusterToPfoMap.end())
170  continue;
171 
172  clusterToPfoMap[pCluster] = pPfo;
173  }
174  }
175 }
176 
177 //------------------------------------------------------------------------------------------------------------------------------------------
178 
179 void DeltaRayMatchingContainers::AddClustersToContainers(const ClusterVector &newClusterVector, const PfoVector &pfoVector)
180 {
181  for (const Cluster *const pNewCluster : newClusterVector)
182  this->AddToClusterMap(pNewCluster);
183 
184  for (unsigned int i = 0; i < newClusterVector.size(); i++)
185  {
186  const Cluster *const pNewCluster(newClusterVector.at(i));
187  const ParticleFlowObject *const pMuonPfo(pfoVector.at(i));
188 
189  this->AddToClusterProximityMap(pNewCluster);
190 
191  if (pMuonPfo)
192  this->AddClustersToPfoMaps(pMuonPfo);
193  }
194 }
195 
196 //------------------------------------------------------------------------------------------------------------------------------------------
197 
198 void DeltaRayMatchingContainers::RemoveClusterFromContainers(const Cluster *const pDeletedCluster)
199 {
200  const HitType hitType(LArClusterHelper::GetClusterHitType(pDeletedCluster));
201  HitToClusterMap &hitToClusterMap((hitType == TPC_VIEW_U) ? m_hitToClusterMapU
202  : (hitType == TPC_VIEW_V) ? m_hitToClusterMapV
204  ClusterProximityMap &clusterProximityMap((hitType == TPC_VIEW_U) ? m_clusterProximityMapU
205  : (hitType == TPC_VIEW_V) ? m_clusterProximityMapV
207  ClusterToPfoMap &clusterToPfoMap((hitType == TPC_VIEW_U) ? m_clusterToPfoMapU
208  : (hitType == TPC_VIEW_V) ? m_clusterToPfoMapV
210 
211  CaloHitList caloHitList;
212  pDeletedCluster->GetOrderedCaloHitList().FillCaloHitList(caloHitList);
213 
214  for (const CaloHit *const pCaloHit : caloHitList)
215  {
216  const HitToClusterMap::const_iterator iter(hitToClusterMap.find(pCaloHit));
217 
218  if (iter == hitToClusterMap.end())
219  throw StatusCodeException(STATUS_CODE_FAILURE);
220 
221  hitToClusterMap.erase(iter);
222  }
223 
224  const ClusterProximityMap::const_iterator clusterProximityIter(clusterProximityMap.find(pDeletedCluster));
225 
226  if (clusterProximityIter != clusterProximityMap.end())
227  {
228  const ClusterList &nearbyClusterList(clusterProximityIter->second);
229 
230  for (const Cluster *const pNearbyCluster : nearbyClusterList)
231  {
232  const ClusterProximityMap::iterator iter(clusterProximityMap.find(pNearbyCluster));
233 
234  if (iter == clusterProximityMap.end())
235  continue;
236 
237  ClusterList &invertedCloseClusters(iter->second);
238 
239  ClusterList::iterator invertedIter(std::find(invertedCloseClusters.begin(), invertedCloseClusters.end(), pDeletedCluster));
240  invertedCloseClusters.erase(invertedIter);
241  }
242 
243  clusterProximityMap.erase(clusterProximityIter);
244  }
245 
246  const DeltaRayMatchingContainers::ClusterToPfoMap::const_iterator clusterToPfoIter(clusterToPfoMap.find(pDeletedCluster));
247 
248  if (clusterToPfoIter != clusterToPfoMap.end())
249  clusterToPfoMap.erase(clusterToPfoIter);
250 }
251 
252 //------------------------------------------------------------------------------------------------------------------------------------------
253 
255 {
256  m_hitToClusterMapU.clear();
257  m_hitToClusterMapV.clear();
258  m_hitToClusterMapW.clear();
259 
260  m_kdTreeU.clear();
261  m_kdTreeV.clear();
262  m_kdTreeW.clear();
263 
264  m_clusterProximityMapU.clear();
265  m_clusterProximityMapV.clear();
266  m_clusterProximityMapW.clear();
267 
268  m_clusterToPfoMapU.clear();
269  m_clusterToPfoMapV.clear();
270  m_clusterToPfoMapW.clear();
271 }
272 
273 } // namespace lar_content
intermediate_table::iterator iterator
std::map< const pandora::CaloHit *, const pandora::Cluster * > HitToClusterMap
HitKDTree2D m_kdTreeW
The KD tree (in the W view)
void FillHitToClusterMap(const pandora::ClusterList &inputClusterList)
Populate the hit to cluster map from a list of clusters.
std::map< const pandora::Cluster *, const pandora::ParticleFlowObject * > ClusterToPfoMap
Header file for the pfo helper class.
HitKDTree2D m_kdTreeV
The KD tree (in the V view)
static void GetClusters(const pandora::PfoList &pfoList, const pandora::HitType &hitType, pandora::ClusterList &clusterList)
Get a list of clusters of a particular hit type from a list of pfos.
HitToClusterMap m_hitToClusterMapW
The mapping of hits to the clusters to which they belong (in the W view)
Box structure used to define 2D field. It&#39;s used in KDTree building step to divide the detector space...
void AddClustersToPfoMaps(const pandora::ParticleFlowObject *const pPfo)
Add the clusters of a cosmic ray/delta ray pfo to the cluster to pfo maps.
Header file for the delta ray matching containers class.
void clear()
Clear all allocated structures.
intermediate_table::const_iterator const_iterator
HitToClusterMap m_hitToClusterMapU
The mapping of hits to the clusters to which they belong (in the U view)
static pandora::HitType GetClusterHitType(const pandora::Cluster *const pCluster)
Get the hit type associated with a two dimensional cluster.
void FillContainers(const pandora::PfoList &inputPfoList, const pandora::ClusterList &inputClusterList1, const pandora::ClusterList &inputClusterList2=pandora::ClusterList(), const pandora::ClusterList &inputClusterList3=pandora::ClusterList())
Fill the HitToClusterMap, the ClusterProximityMap and the ClusterToPfoMap in all input views...
ClusterProximityMap m_clusterProximityMapU
The mapping of clusters to their neighbouring clusters (in the U view)
TFile f
Definition: plotHisto.C:6
void FillClusterProximityMap(const pandora::ClusterList &inputClusterList)
Populate the cluster proximity map from a list of clusters.
Header file for the cluster helper class.
ClusterProximityMap m_clusterProximityMapV
The mapping of clusters to their neighbouring clusters (in the V view)
void AddClustersToContainers(const pandora::ClusterVector &newClusterVector, const pandora::PfoVector &pfoVector)
Add a list of clusters to the hit to cluster and cluster proximity maps and, if appropriate, to the cluster to pfo map.
ClusterToPfoMap m_clusterToPfoMapU
The mapping of cosmic ray U clusters to the cosmic ray pfos to which they belong. ...
void build(std::vector< KDTreeNodeInfoT< DATA, DIM >> &eltList, const KDTreeBoxT< DIM > &region)
Build the KD tree from the "eltList" in the space define by "region".
void FillClusterToPfoMaps(const pandora::PfoList &pfoList)
Populate all cluster to pfo maps from a list of particle flow objects.
void AddToClusterMap(const pandora::Cluster *const pCluster)
Add the hits of a given cluster to the hit to cluster map.
void AddToClusterProximityMap(const pandora::Cluster *const pCluster)
Add a cluster to the cluster proximity map.
Detector simulation of raw signals on wires.
void BuildKDTree(const pandora::HitType hitType)
Build the KD tree.
ClusterToPfoMap m_clusterToPfoMapW
The mapping of cosmic ray W clusters to the cosmic ray pfos to which they belong. ...
HitKDTree2D m_kdTreeU
The KD tree (in the U view)
std::map< const pandora::Cluster *, pandora::ClusterList > ClusterProximityMap
HitType
Definition: HitType.h:12
HitToClusterMap m_hitToClusterMapV
The mapping of hits to the clusters to which they belong (in the V view)
ClusterProximityMap m_clusterProximityMapW
The mapping of clusters to their neighbouring clusters (in the W view)
KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER< const T * > &points, std::vector< KDTreeNodeInfoT< const T *, 2 >> &nodes)
fill_and_bound_2d_kd_tree
std::vector< art::Ptr< recob::Cluster > > ClusterVector
void ClearContainers()
Empty all algorithm containers.
KDTreeBox build_2d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float z_span)
build_2d_kd_search_region
void search(const KDTreeBoxT< DIM > &searchBox, std::vector< KDTreeNodeInfoT< DATA, DIM >> &resRecHitList)
Search in the KDTree for all points that would be contained in the given searchbox The founded points...
void RemoveClusterFromContainers(const pandora::Cluster *const pDeletedCluster)
Remove an input cluster&#39;s hits from the hit to cluster and cluster proximity maps and...
float m_searchRegion1D
Search region, applied to each dimension, for look-up from kd-tree.
ClusterToPfoMap m_clusterToPfoMapV
The mapping of cosmic ray V clusters to the cosmic ray pfos to which they belong. ...