CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Classes | Public Types | Public Member Functions | Private Types | Private Member Functions | Private Attributes
HGCal3DClustering Class Reference

#include <HGCal3DClustering.h>

Classes

struct  ClusterRef
 

Public Types

typedef std::vector
< reco::BasicCluster
ClusterCollection
 

Public Member Functions

 clusterTools (nullptr)
 
void getEvent (const edm::Event &ev)
 
void getEventSetup (const edm::EventSetup &es)
 
 HGCal3DClustering ()
 
 HGCal3DClustering (const edm::ParameterSet &conf, edm::ConsumesCollector &sumes, const std::vector< double > &radii_in, uint32_t min_clusters)
 
 HGCal3DClustering (const edm::ParameterSet &conf, edm::ConsumesCollector &sumes)
 
std::vector
< reco::HGCalMultiCluster
makeClusters (const reco::HGCalMultiCluster::ClusterCollection &)
 
 minClusters (0)
 

Private Types

typedef KDTreeNodeInfo
< ClusterRef
KDNode
 
typedef KDTreeLinkerAlgo
< ClusterRef
KDTree
 

Private Member Functions

void layerIntersection (std::array< double, 3 > &to, const std::array< double, 3 > &from) const
 
void organizeByLayer (const reco::HGCalMultiCluster::ClusterCollection &)
 
void reset ()
 

Private Attributes

edm::ESGetToken< CaloGeometry,
CaloGeometryRecord
caloGeomToken_
 
std::unique_ptr
< hgcal::ClusterTools
clusterTools
 
std::vector< size_t > es
 
unsigned int maxlayer
 
std::vector< std::array< float, 2 > > maxpos
 
uint32_t minClusters
 
std::vector< std::array< float, 2 > > minpos
 
std::vector< std::vector
< KDNode > > 
points
 
std::vector< double > radii
 
hgcal::RecHitTools rhtools_
 
std::vector< float > zees
 

Detailed Description

Definition at line 16 of file HGCal3DClustering.h.

Member Typedef Documentation

Definition at line 52 of file HGCal3DClustering.h.

Definition at line 86 of file HGCal3DClustering.h.

Definition at line 85 of file HGCal3DClustering.h.

Constructor & Destructor Documentation

HGCal3DClustering::HGCal3DClustering ( )
inline

Definition at line 18 of file HGCal3DClustering.h.

18 : radii({0., 0., 0.}), minClusters(0), clusterTools(nullptr) {}
std::vector< double > radii
std::unique_ptr< hgcal::ClusterTools > clusterTools
HGCal3DClustering::HGCal3DClustering ( const edm::ParameterSet conf,
edm::ConsumesCollector sumes,
const std::vector< double > &  radii_in,
uint32_t  min_clusters 
)
inline

Definition at line 20 of file HGCal3DClustering.h.

24  : radii(radii_in),
25  minClusters(min_clusters),
26  es(0),
27  clusterTools(std::make_unique<hgcal::ClusterTools>(conf, sumes)),
std::vector< double > radii
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
std::unique_ptr< hgcal::ClusterTools > clusterTools
std::vector< size_t > es
HGCal3DClustering::HGCal3DClustering ( const edm::ParameterSet conf,
edm::ConsumesCollector sumes 
)
inline

Definition at line 30 of file HGCal3DClustering.h.

31  : HGCal3DClustering(conf,
32  sumes,
33  conf.getParameter<std::vector<double>>("multiclusterRadii"),
34  conf.getParameter<unsigned>("minClusters")) {}
T getParameter(std::string const &) const
Definition: ParameterSet.h:303

Member Function Documentation

HGCal3DClustering::clusterTools ( nullptr  )
inline

Definition at line 18 of file HGCal3DClustering.h.

18 : radii({0., 0., 0.}), minClusters(0), clusterTools(nullptr) {}
std::vector< double > radii
std::unique_ptr< hgcal::ClusterTools > clusterTools
void HGCal3DClustering::getEvent ( const edm::Event ev)
inline

Definition at line 36 of file HGCal3DClustering.h.

References clusterTools.

36 { clusterTools->getEvent(ev); }
std::unique_ptr< hgcal::ClusterTools > clusterTools
void HGCal3DClustering::getEventSetup ( const edm::EventSetup es)
inline

Definition at line 37 of file HGCal3DClustering.h.

References caloGeomToken_, clusterTools, relativeConstraints::geom, edm::EventSetup::getData(), hgcal::RecHitTools::lastLayerBH(), maxlayer, maxpos, minpos, points, rhtools_, hgcal::RecHitTools::setGeometry(), and zees.

37  {
38  clusterTools->getEventSetup(es);
40  rhtools_.setGeometry(geom);
42  points.clear();
43  minpos.clear();
44  maxpos.clear();
45  zees.clear();
46  points.resize(2 * (maxlayer + 1));
47  minpos.resize(2 * (maxlayer + 1), {{0.0f, 0.0f}});
48  maxpos.resize(2 * (maxlayer + 1), {{0.0f, 0.0f}});
49  zees.resize(2 * (maxlayer + 1), 0.);
50  }
std::vector< std::vector< KDNode > > points
unsigned int lastLayerBH() const
Definition: RecHitTools.h:78
std::vector< float > zees
bool getData(T &iHolder) const
Definition: EventSetup.h:122
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
std::vector< std::array< float, 2 > > maxpos
std::vector< std::array< float, 2 > > minpos
void setGeometry(CaloGeometry const &)
Definition: RecHitTools.cc:68
std::unique_ptr< hgcal::ClusterTools > clusterTools
hgcal::RecHitTools rhtools_
unsigned int maxlayer
void HGCal3DClustering::layerIntersection ( std::array< double, 3 > &  to,
const std::array< double, 3 > &  from 
) const
private

Definition at line 119 of file HGCal3DClustering.cc.

Referenced by makeClusters().

119  {
120  if (from[2] != 0) {
121  to[0] = from[0] / from[2] * to[2];
122  to[1] = from[1] / from[2] * to[2];
123  } else {
124  to[0] = 0;
125  to[1] = 0;
126  }
127 }
std::vector< reco::HGCalMultiCluster > HGCal3DClustering::makeClusters ( const reco::HGCalMultiCluster::ClusterCollection thecls)

Definition at line 48 of file HGCal3DClustering.cc.

References funct::abs(), clusterTools, es, hgcal::RecHitTools::firstLayerBH(), newFWLiteAna::found, mps_fire::i, dqmiolumiharvest::j, isotrackApplyRegressor::k, hgcal::RecHitTools::lastLayerEE(), phase1PixelTopology::layer, layerIntersection(), maxlayer, maxpos, minClusters, minpos, organizeByLayer(), points, position, reco::HGCalMultiCluster::push_back(), radii, CosmicsPD_Skims::radius, reset(), rhtools_, reco::HGCalMultiCluster::size(), groupFilesInBlocks::temp, z, and zees.

49  {
50  reset();
51  organizeByLayer(thecls);
52  std::vector<reco::HGCalMultiCluster> thePreClusters;
53 
54  std::vector<KDTree> hit_kdtree(2 * (maxlayer + 1));
55  for (unsigned int i = 0; i <= 2 * maxlayer + 1; ++i) {
56  KDTreeBox bounds(minpos[i][0], maxpos[i][0], minpos[i][1], maxpos[i][1]);
57  hit_kdtree[i].build(points[i], bounds);
58  }
59  std::vector<int> vused(es.size(), 0);
60  unsigned int used = 0;
61 
62  unsigned int es_size = es.size();
63  for (unsigned int i = 0; i < es_size; ++i) {
64  if (vused[i] == 0) {
66  temp.push_back(thecls[es[i]]);
67  vused[i] = (thecls[es[i]]->z() > 0) ? 1 : -1;
68  ++used;
69  // Starting from cluster es[i] at from[0] - from[1] - from[2]
70  std::array<double, 3> from{{thecls[es[i]]->x(), thecls[es[i]]->y(), thecls[es[i]]->z()}};
71  unsigned int firstlayer = int(thecls[es[i]]->z() > 0) * (maxlayer + 1);
72  unsigned int lastlayer = firstlayer + maxlayer + 1;
73  for (unsigned int j = firstlayer; j < lastlayer; ++j) {
74  if (zees[j] == 0.) {
75  // layer j not yet ever reached?
76  continue;
77  }
78  std::array<double, 3> to{{0., 0., zees[j]}};
79  layerIntersection(to, from);
80  unsigned int layer =
81  j > maxlayer ? (j - (maxlayer + 1)) : j; //maps back from index used for KD trees to actual layer
82  float radius = radii[2];
83  if (layer <= rhtools_.lastLayerEE())
84  radius = radii[0];
85  else if (layer < rhtools_.firstLayerBH())
86  radius = radii[1];
87  float radius2 = radius * radius;
88  KDTreeBox search_box(
89  float(to[0]) - radius, float(to[0]) + radius, float(to[1]) - radius, float(to[1]) + radius);
90  std::vector<ClusterRef> found;
91  // at layer j in box float(to[0])+/-radius - float(to[1])+/-radius
92  hit_kdtree[j].search(search_box, found);
93  // found found.size() clusters within box
94  for (unsigned int k = 0; k < found.size(); k++) {
95  if (vused[found[k].ind] == 0 && distReal2(thecls[es[found[k].ind]], to) < radius2) {
96  temp.push_back(thecls[es[found[k].ind]]);
97  vused[found[k].ind] = vused[i];
98  ++used;
99  }
100  }
101  }
102  if (temp.size() > minClusters) {
103  math::XYZPoint position = clusterTools->getMultiClusterPosition(temp);
104  if (std::abs(position.z()) <= 0.)
105  continue;
106  // only store multiclusters that pass the energy threshold in getMultiClusterPosition
107  // giving them a position inside the HGCal
108  thePreClusters.push_back(temp);
109  auto &back = thePreClusters.back();
110  back.setPosition(position);
111  back.setEnergy(clusterTools->getMultiClusterEnergy(back));
112  }
113  }
114  }
115 
116  return thePreClusters;
117 }
std::vector< std::vector< KDNode > > points
std::vector< double > radii
void organizeByLayer(const reco::HGCalMultiCluster::ClusterCollection &)
constexpr std::array< uint8_t, layerIndexSize > layer
std::vector< float > zees
unsigned int size() const
void layerIntersection(std::array< double, 3 > &to, const std::array< double, 3 > &from) const
void push_back(const edm::Ptr< reco::BasicCluster > &b)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< std::array< float, 2 > > maxpos
std::vector< std::array< float, 2 > > minpos
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::unique_ptr< hgcal::ClusterTools > clusterTools
hgcal::RecHitTools rhtools_
unsigned int maxlayer
unsigned int firstLayerBH() const
Definition: RecHitTools.h:77
static int position[264][3]
Definition: ReadPGInfo.cc:289
unsigned int lastLayerEE(bool nose=false) const
Definition: RecHitTools.h:75
std::vector< size_t > es
HGCal3DClustering::minClusters ( )
void HGCal3DClustering::organizeByLayer ( const reco::HGCalMultiCluster::ClusterCollection thecls)
private

Definition at line 21 of file HGCal3DClustering.cc.

References relativeConstraints::empty, es, first, hgcal::RecHitTools::getLayerWithOffset(), mps_fire::i, phase1PixelTopology::layer, SiStripPI::max, maxlayer, maxpos, SiStripPI::min, minpos, points, rhtools_, hgcal_clustering::sorted_indices(), x, y, z, and zees.

Referenced by makeClusters().

21  {
22  es = sorted_indices(thecls);
23  unsigned int es_size = es.size();
24  for (unsigned int i = 0; i < es_size; ++i) {
25  int layer = rhtools_.getLayerWithOffset(thecls[es[i]]->hitsAndFractions()[0].first);
26  layer += int(thecls[es[i]]->z() > 0) * (maxlayer + 1);
27  float x = thecls[es[i]]->x();
28  float y = thecls[es[i]]->y();
29  float z = thecls[es[i]]->z();
30  points[layer].emplace_back(ClusterRef(i, z), x, y);
31  if (zees[layer] == 0.) {
32  // At least one cluster for layer at z
33  zees[layer] = z;
34  }
35  if (points[layer].empty()) {
36  minpos[layer][0] = x;
37  minpos[layer][1] = y;
38  maxpos[layer][0] = x;
39  maxpos[layer][1] = y;
40  } else {
41  minpos[layer][0] = std::min(x, minpos[layer][0]);
42  minpos[layer][1] = std::min(y, minpos[layer][1]);
43  maxpos[layer][0] = std::max(x, maxpos[layer][0]);
44  maxpos[layer][1] = std::max(y, maxpos[layer][1]);
45  }
46  }
47 }
std::vector< std::vector< KDNode > > points
constexpr std::array< uint8_t, layerIndexSize > layer
std::vector< float > zees
std::vector< size_t > sorted_indices(const std::vector< T > &v)
std::vector< std::array< float, 2 > > maxpos
std::vector< std::array< float, 2 > > minpos
unsigned int getLayerWithOffset(const DetId &) const
Definition: RecHitTools.cc:365
hgcal::RecHitTools rhtools_
unsigned int maxlayer
std::vector< size_t > es
void HGCal3DClustering::reset ( void  )
inlineprivate

Definition at line 58 of file HGCal3DClustering.h.

References PVValHelper::fill(), mps_fire::i, maxpos, minpos, points, edm::swap(), and zees.

Referenced by makeClusters().

58  {
59  for (auto& it : points) {
60  it.clear();
61  std::vector<KDNode>().swap(it);
62  }
63  std::fill(zees.begin(), zees.end(), 0.);
64  for (unsigned int i = 0; i < minpos.size(); i++) {
65  minpos[i][0] = 0.;
66  minpos[i][1] = 0.;
67  maxpos[i][0] = 0.;
68  maxpos[i][1] = 0.;
69  }
70  }
std::vector< std::vector< KDNode > > points
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:117
std::vector< float > zees
std::vector< std::array< float, 2 > > maxpos
std::vector< std::array< float, 2 > > minpos
void fill(std::map< std::string, TH1 * > &h, const std::string &s, double x)

Member Data Documentation

edm::ESGetToken<CaloGeometry, CaloGeometryRecord> HGCal3DClustering::caloGeomToken_
private

Definition at line 94 of file HGCal3DClustering.h.

Referenced by getEventSetup().

std::unique_ptr<hgcal::ClusterTools> HGCal3DClustering::clusterTools
private

instance of tools to simplify cluster access.

Definition at line 92 of file HGCal3DClustering.h.

Referenced by getEvent(), getEventSetup(), and makeClusters().

std::vector<size_t> HGCal3DClustering::es
private

vector to contain sorted indices of all clusters.

Definition at line 90 of file HGCal3DClustering.h.

Referenced by makeClusters(), and organizeByLayer().

unsigned int HGCal3DClustering::maxlayer
private

Definition at line 74 of file HGCal3DClustering.h.

Referenced by getEventSetup(), makeClusters(), and organizeByLayer().

std::vector<std::array<float, 2> > HGCal3DClustering::maxpos
private

Definition at line 89 of file HGCal3DClustering.h.

Referenced by getEventSetup(), makeClusters(), organizeByLayer(), and reset().

uint32_t HGCal3DClustering::minClusters
private

Definition at line 77 of file HGCal3DClustering.h.

Referenced by makeClusters().

std::vector<std::array<float, 2> > HGCal3DClustering::minpos
private

Definition at line 88 of file HGCal3DClustering.h.

Referenced by getEventSetup(), makeClusters(), organizeByLayer(), and reset().

std::vector<std::vector<KDNode> > HGCal3DClustering::points
private

Definition at line 87 of file HGCal3DClustering.h.

Referenced by getEventSetup(), makeClusters(), organizeByLayer(), and reset().

std::vector<double> HGCal3DClustering::radii
private

Definition at line 76 of file HGCal3DClustering.h.

Referenced by makeClusters().

hgcal::RecHitTools HGCal3DClustering::rhtools_
private

instance of tools to access RecHit information.

Definition at line 93 of file HGCal3DClustering.h.

Referenced by getEventSetup(), makeClusters(), and organizeByLayer().

std::vector<float> HGCal3DClustering::zees
private

vector to contain z position of each layer.

Definition at line 91 of file HGCal3DClustering.h.

Referenced by getEventSetup(), makeClusters(), organizeByLayer(), and reset().