Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
KDTreeLinkerToolsT.h
Go to the documentation of this file.
1
8#ifndef LAR_KD_TREE_LINKER_TOOLS_TEMPLATED_H
9#define LAR_KD_TREE_LINKER_TOOLS_TEMPLATED_H 1
10
12
13#include "Objects/CaloHit.h"
15
17
18#include <array>
19#include <vector>
20
21namespace pandora
22{
23class Algorithm;
24}
25
26//------------------------------------------------------------------------------------------------------------------------------------------
27
28namespace lar_content
29{
30
35template <unsigned DIM>
37{
38public:
42 KDTreeBoxT();
43
49 template <typename... Ts>
50 KDTreeBoxT(Ts... dimargs);
51
52 std::array<float, DIM> dimmin;
53 std::array<float, DIM> dimmax;
54};
55
58
59//------------------------------------------------------------------------------------------------------------------------------------------
60
65template <typename DATA, unsigned DIM>
67{
68public:
73
80 template <typename... Ts>
81 KDTreeNodeInfoT(const DATA &d, Ts... dimargs);
82
83 DATA data;
84 std::array<float, DIM> dims;
85};
86
87//------------------------------------------------------------------------------------------------------------------------------------------
88
92template <typename DATA, unsigned DIM>
94{
95public:
100
107 void setAttributs(const KDTreeBoxT<DIM> &regionBox, const KDTreeNodeInfoT<DATA, DIM> &infoToStore);
108
114 void setAttributs(const KDTreeBoxT<DIM> &regionBox);
115
120};
121
122//------------------------------------------------------------------------------------------------------------------------------------------
123
127template <typename T>
129{
130public:
138 static const pandora::CartesianVector &position(const T *const t);
139};
140
141//------------------------------------------------------------------------------------------------------------------------------------------
142
151std::pair<float, float> minmax(const float a, const float b);
152
161template <typename T>
162KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER<const T *> &points, std::vector<KDTreeNodeInfoT<const T *, 2>> &nodes);
163
172template <typename T>
173KDTreeCube fill_and_bound_3d_kd_tree(const MANAGED_CONTAINER<const T *> &points, std::vector<KDTreeNodeInfoT<const T *, 3>> &nodes);
174
184KDTreeBox build_2d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float z_span);
185
195KDTreeBox build_2d_kd_search_region(const pandora::CartesianVector &pos, const float x_span, const float z_span);
196
207KDTreeCube build_3d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float y_span, const float z_span);
208
219KDTreeCube build_3d_kd_search_region(const pandora::CartesianVector &pos, const float x_span, const float y_span, const float z_span);
220
221//------------------------------------------------------------------------------------------------------------------------------------------
222//------------------------------------------------------------------------------------------------------------------------------------------
223
224template <unsigned DIM>
228
229//------------------------------------------------------------------------------------------------------------------------------------------
230
231template <unsigned DIM>
232template <typename... Ts>
233inline KDTreeBoxT<DIM>::KDTreeBoxT(Ts... dimargs)
234{
235 static_assert(sizeof...(dimargs) == 2 * DIM, "Constructor requires 2*DIM args");
236 std::vector<float> dims = {dimargs...};
237
238 for (unsigned i = 0; i < DIM; ++i)
239 {
240 dimmin[i] = dims[2 * i];
241 dimmax[i] = dims[2 * i + 1];
242 }
243}
244
245//------------------------------------------------------------------------------------------------------------------------------------------
246//------------------------------------------------------------------------------------------------------------------------------------------
247
248template <typename DATA, unsigned DIM>
252
253//------------------------------------------------------------------------------------------------------------------------------------------
254
255template <typename DATA, unsigned DIM>
256template <typename... Ts>
257inline KDTreeNodeInfoT<DATA, DIM>::KDTreeNodeInfoT(const DATA &d, Ts... dimargs) : data(d), dims{{dimargs...}}
258{
259}
260
261//------------------------------------------------------------------------------------------------------------------------------------------
262//------------------------------------------------------------------------------------------------------------------------------------------
263
264template <typename DATA, unsigned DIM>
265inline KDTreeNodeT<DATA, DIM>::KDTreeNodeT() : left(nullptr), right(nullptr)
266{
267}
268
269//------------------------------------------------------------------------------------------------------------------------------------------
270
271template <typename DATA, unsigned DIM>
273{
274 info = infoToStore;
275 region = regionBox;
276}
277
278//------------------------------------------------------------------------------------------------------------------------------------------
279
280template <typename DATA, unsigned DIM>
282{
283 region = regionBox;
284}
285
286//------------------------------------------------------------------------------------------------------------------------------------------
287
288template <typename T>
290{
291 return t->GetPosition();
292}
293
294template <>
299
300template <>
305
306//------------------------------------------------------------------------------------------------------------------------------------------
307
308template <typename T>
309KDTreeBox fill_and_bound_2d_kd_tree(const MANAGED_CONTAINER<const T *> &points, std::vector<KDTreeNodeInfoT<const T *, 2>> &nodes)
310{
311 std::array<float, 2> minpos{{0.f, 0.f}}, maxpos{{0.f, 0.f}};
312
313 unsigned i = 0;
314
315 for (const T *const point : points)
316 {
318 nodes.emplace_back(point, pos.GetX(), pos.GetZ());
319
320 if (0 == i)
321 {
322 minpos[0] = pos.GetX();
323 minpos[1] = pos.GetZ();
324 maxpos[0] = pos.GetX();
325 maxpos[1] = pos.GetZ();
326 }
327 else
328 {
329 minpos[0] = std::min(pos.GetX(), minpos[0]);
330 minpos[1] = std::min(pos.GetZ(), minpos[1]);
331 maxpos[0] = std::max(pos.GetX(), maxpos[0]);
332 maxpos[1] = std::max(pos.GetZ(), maxpos[1]);
333 }
334
335 ++i;
336 }
337
338 return KDTreeBox(minpos[0], maxpos[0], minpos[1], maxpos[1]);
339}
340
341//------------------------------------------------------------------------------------------------------------------------------------------
342
343template <typename T>
344KDTreeCube fill_and_bound_3d_kd_tree(const MANAGED_CONTAINER<const T *> &points, std::vector<KDTreeNodeInfoT<const T *, 3>> &nodes)
345{
346 std::array<float, 3> minpos{{0.f, 0.f, 0.f}}, maxpos{{0.f, 0.f, 0.f}};
347
348 unsigned i = 0;
349
350 for (const T *const point : points)
351 {
353 nodes.emplace_back(point, pos.GetX(), pos.GetY(), pos.GetZ());
354
355 if (0 == i)
356 {
357 minpos[0] = pos.GetX();
358 minpos[1] = pos.GetY();
359 minpos[2] = pos.GetZ();
360 maxpos[0] = pos.GetX();
361 maxpos[1] = pos.GetY();
362 maxpos[2] = pos.GetZ();
363 }
364 else
365 {
366 minpos[0] = std::min(pos.GetX(), minpos[0]);
367 minpos[1] = std::min(pos.GetY(), minpos[1]);
368 minpos[2] = std::min(pos.GetZ(), minpos[2]);
369 maxpos[0] = std::max(pos.GetX(), maxpos[0]);
370 maxpos[1] = std::max(pos.GetY(), maxpos[1]);
371 maxpos[2] = std::max(pos.GetZ(), maxpos[2]);
372 }
373
374 ++i;
375 }
376
377 return KDTreeCube(minpos[0], maxpos[0], minpos[1], maxpos[1], minpos[2], maxpos[2]);
378}
379
380} // namespace lar_content
381
382#endif // LAR_KD_TREE_LINKER_TOOLS_TEMPLATED_H
Header file for the calo hit class.
Header file for the cartesian vector class.
Header file for the pandora content api class.
Header file defining relevant internal typedefs, sort and string conversion functions.
Box structure used to define 2D field. It's used in KDTree building step to divide the detector space...
std::array< float, DIM > dimmax
KDTreeBoxT()
Default constructor.
std::array< float, DIM > dimmin
Data stored in each KDTree node. The dim1/dim2 fields are usually the duplication of some PFRecHit va...
std::array< float, DIM > dims
KDTreeNodeInfoT(const DATA &d, Ts... dimargs)
Constructor.
KDTreeNodeInfoT()
Default constructor.
KDTreeNodeT()
Default constructor.
KDTreeBoxT< DIM > region
Region bounding box.
KDTreeNodeT< DATA, DIM > * left
Left son.
void setAttributs(const KDTreeBoxT< DIM > &regionBox)
setAttributs
void setAttributs(const KDTreeBoxT< DIM > &regionBox, const KDTreeNodeInfoT< DATA, DIM > &infoToStore)
setAttributs
KDTreeNodeInfoT< DATA, DIM > info
Data.
KDTreeNodeT< DATA, DIM > * right
Right son.
static const pandora::CartesianVector & position(const T *const t)
position
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.
float GetX() const
Get the cartesian x coordinate.
float GetZ() const
Get the cartesian z coordinate.
float GetY() const
Get the cartesian y coordinate.
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
KDTreeBoxT< 2 > KDTreeBox
KDTreeBoxT< 3 > KDTreeCube
std::pair< float, float > minmax(const float a, const float b)
minmax
KDTreeCube fill_and_bound_3d_kd_tree(const MANAGED_CONTAINER< const T * > &points, std::vector< KDTreeNodeInfoT< const T *, 3 > > &nodes)
fill_and_bound_3d_kd_tree
KDTreeBox build_2d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float z_span)
build_2d_kd_search_region
KDTreeCube build_3d_kd_search_region(const pandora::CaloHit *const point, const float x_span, const float y_span, const float z_span)
build_3d_kd_search_region