CMS 3D CMS Logo

HGCalCLUEAlgo.cc
Go to the documentation of this file.
2 
3 // Geometry
8 
10 //
12 #include "oneapi/tbb/task_arena.h"
13 #include "oneapi/tbb.h"
14 #include <limits>
16 
17 using namespace hgcal_clustering;
18 
19 template <typename T, typename STRATEGY>
21  cells_.clear();
22  numberOfClustersPerLayer_.clear();
23  cells_.resize(2 * (maxlayer_ + 1));
24  numberOfClustersPerLayer_.resize(2 * (maxlayer_ + 1), 0);
25 }
26 
27 template <typename T, typename STRATEGY>
29  // loop over all hits and create the Hexel structure, skip energies below ecut
30  if (dependSensor_) {
31  // for each layer and wafer calculate the thresholds (sigmaNoise and energy)
32  // once
33  computeThreshold();
34  }
35 
36  for (unsigned int i = 0; i < hits.size(); ++i) {
37  const HGCRecHit& hgrh = hits[i];
38  DetId detid = hgrh.detid();
39  unsigned int layerOnSide = (rhtools_.getLayerWithOffset(detid) - 1);
40 
41  // set sigmaNoise default value 1 to use kappa value directly in case of
42  // sensor-independent thresholds
43  float sigmaNoise = 1.f;
44  if (dependSensor_) {
45  int thickness_index = rhtools_.getSiThickIndex(detid);
46  if (thickness_index == -1)
47  thickness_index = maxNumberOfThickIndices_;
48 
49  double storedThreshold = thresholds_[layerOnSide][thickness_index];
50  if (detid.det() == DetId::HGCalHSi || detid.subdetId() == HGCHEF) {
51  storedThreshold = thresholds_[layerOnSide][thickness_index + deltasi_index_regemfac_];
52  }
53  sigmaNoise = v_sigmaNoise_[layerOnSide][thickness_index];
54 
55  if (hgrh.energy() < storedThreshold)
56  continue; // this sets the ZS threshold at ecut times the sigma noise
57  // for the sensor
58  }
59  if (!dependSensor_ && hgrh.energy() < ecut_)
60  continue;
61  const GlobalPoint position(rhtools_.getPosition(detid));
62  int offset = ((rhtools_.zside(detid) + 1) >> 1) * maxlayer_;
63  int layer = layerOnSide + offset;
64  // setting the layer position only once per layer
65  if (cells_[layer].layerDim3 == std::numeric_limits<float>::infinity())
66  cells_[layer].layerDim3 = position.z();
67 
68  cells_[layer].detid.emplace_back(detid);
69  if constexpr (std::is_same_v<STRATEGY, HGCalScintillatorStrategy>) {
70  cells_[layer].dim1.emplace_back(position.eta());
71  cells_[layer].dim2.emplace_back(position.phi());
72  } // else, isSilicon == true and eta phi values will not be used
73  else {
74  cells_[layer].dim1.emplace_back(position.x());
75  cells_[layer].dim2.emplace_back(position.y());
76  }
77  cells_[layer].weight.emplace_back(hgrh.energy());
78  cells_[layer].sigmaNoise.emplace_back(sigmaNoise);
79  }
80 }
81 
82 template <typename T, typename STRATEGY>
84  auto cellsSize = cells_[l].detid.size();
85  cells_[l].rho.resize(cellsSize, 0.f);
86  cells_[l].delta.resize(cellsSize, 9999999);
87  cells_[l].nearestHigher.resize(cellsSize, -1);
88  cells_[l].clusterIndex.resize(cellsSize, -1);
89  cells_[l].followers.resize(cellsSize);
90  cells_[l].isSeed.resize(cellsSize, false);
91 }
92 
93 // Create a vector of Hexels associated to one cluster from a collection of
94 // HGCalRecHits - this can be used directly to make the final cluster list -
95 // this method can be invoked multiple times for the same event with different
96 // input (reset should be called between events)
97 template <typename T, typename STRATEGY>
99  // assign all hits in each layer to a cluster core
100  tbb::this_task_arena::isolate([&] {
101  tbb::parallel_for(size_t(0), size_t(2 * maxlayer_ + 2), [&](size_t i) {
102  prepareDataStructures(i);
103  T lt;
104  lt.clear();
105  lt.fill(cells_[i].dim1, cells_[i].dim2);
106 
107  float delta;
108  if constexpr (std::is_same_v<STRATEGY, HGCalSiliconStrategy>) {
109  // maximum search distance (critical distance) for local density calculation
110  float delta_c;
111  if (i % maxlayer_ < lastLayerEE_)
112  delta_c = vecDeltas_[0];
113  else if (i % maxlayer_ < (firstLayerBH_ - 1))
114  delta_c = vecDeltas_[1];
115  else
116  delta_c = vecDeltas_[2];
117  delta = delta_c;
118  } else {
119  float delta_r = vecDeltas_[3];
120  delta = delta_r;
121  }
122  LogDebug("HGCalCLUEAlgo") << "maxlayer: " << maxlayer_ << " lastLayerEE: " << lastLayerEE_
123  << " firstLayerBH: " << firstLayerBH_ << "\n";
124 
125  calculateLocalDensity(lt, i, delta);
126  calculateDistanceToHigher(lt, i, delta);
127  numberOfClustersPerLayer_[i] = findAndAssignClusters(i, delta);
128  });
129  });
130 }
131 
132 template <typename T, typename STRATEGY>
133 std::vector<reco::BasicCluster> HGCalCLUEAlgoT<T, STRATEGY>::getClusters(bool) {
134  std::vector<int> offsets(numberOfClustersPerLayer_.size(), 0);
135 
136  int maxClustersOnLayer = numberOfClustersPerLayer_[0];
137 
138  for (unsigned layerId = 1; layerId < offsets.size(); ++layerId) {
139  offsets[layerId] = offsets[layerId - 1] + numberOfClustersPerLayer_[layerId - 1];
140 
141  maxClustersOnLayer = std::max(maxClustersOnLayer, numberOfClustersPerLayer_[layerId]);
142  }
143 
144  auto totalNumberOfClusters = offsets.back() + numberOfClustersPerLayer_.back();
145  clusters_v_.resize(totalNumberOfClusters);
146  std::vector<std::vector<int>> cellsIdInCluster;
147  cellsIdInCluster.reserve(maxClustersOnLayer);
148 
149  for (unsigned int layerId = 0; layerId < 2 * maxlayer_ + 2; ++layerId) {
150  cellsIdInCluster.resize(numberOfClustersPerLayer_[layerId]);
151  auto& cellsOnLayer = cells_[layerId];
152  unsigned int numberOfCells = cellsOnLayer.detid.size();
153  auto firstClusterIdx = offsets[layerId];
154 
155  for (unsigned int i = 0; i < numberOfCells; ++i) {
156  auto clusterIndex = cellsOnLayer.clusterIndex[i];
157  if (clusterIndex != -1)
158  cellsIdInCluster[clusterIndex].push_back(i);
159  }
160 
161  std::vector<std::pair<DetId, float>> thisCluster;
162 
163  for (auto& cl : cellsIdInCluster) {
164  float maxEnergyValue = std::numeric_limits<float>::min();
165  int maxEnergyCellIndex = -1;
166  DetId maxEnergyDetId;
167  float energy = 0.f;
168  int seedDetId = -1;
169  float x = 0.f;
170  float y = 0.f;
171  float z = cellsOnLayer.layerDim3;
172  // TODO Felice: maybe use the seed for the position calculation
173  for (auto cellIdx : cl) {
174  energy += cellsOnLayer.weight[cellIdx];
175  if (cellsOnLayer.weight[cellIdx] > maxEnergyValue) {
176  maxEnergyValue = cellsOnLayer.weight[cellIdx];
177  maxEnergyCellIndex = cellIdx;
178  maxEnergyDetId = cellsOnLayer.detid[cellIdx];
179  }
180  thisCluster.emplace_back(cellsOnLayer.detid[cellIdx], 1.f);
181  if (cellsOnLayer.isSeed[cellIdx]) {
182  seedDetId = cellsOnLayer.detid[cellIdx];
183  }
184  }
185 
186  float total_weight_log = 0.f;
187  float total_weight = energy;
188 
189  if constexpr (std::is_same_v<STRATEGY, HGCalSiliconStrategy>) {
190  auto thick = rhtools_.getSiThickIndex(maxEnergyDetId);
191  for (auto cellIdx : cl) {
192  const float d1 = cellsOnLayer.dim1[cellIdx] - cellsOnLayer.dim1[maxEnergyCellIndex];
193  const float d2 = cellsOnLayer.dim2[cellIdx] - cellsOnLayer.dim2[maxEnergyCellIndex];
194  if ((d1 * d1 + d2 * d2) < positionDeltaRho2_) {
195  float Wi = std::max(thresholdW0_[thick] + std::log(cellsOnLayer.weight[cellIdx] / energy), 0.);
196  x += cellsOnLayer.dim1[cellIdx] * Wi;
197  y += cellsOnLayer.dim2[cellIdx] * Wi;
198  total_weight_log += Wi;
199  }
200  }
201  } else {
202  for (auto cellIdx : cl) {
203  auto position = rhtools_.getPosition(cellsOnLayer.detid[cellIdx]);
204  x += position.x() * cellsOnLayer.weight[cellIdx];
205  y += position.y() * cellsOnLayer.weight[cellIdx];
206  }
207  }
208 
209  if constexpr (std::is_same_v<STRATEGY, HGCalSiliconStrategy>) {
210  total_weight = total_weight_log;
211  }
212 
213  if (total_weight != 0.) {
214  float inv_tot_weight = 1.f / total_weight;
215  x *= inv_tot_weight;
216  y *= inv_tot_weight;
217  } else {
218  x = y = 0.f;
219  }
221 
222  auto globalClusterIndex = cellsOnLayer.clusterIndex[cl[0]] + firstClusterIdx;
223 
224  clusters_v_[globalClusterIndex] =
226  clusters_v_[globalClusterIndex].setSeed(seedDetId);
227  thisCluster.clear();
228  }
229 
230  cellsIdInCluster.clear();
231  }
232  return clusters_v_;
233 }
234 template <typename T, typename STRATEGY>
236  const unsigned int layerId,
237  float delta,
239  auto& cellsOnLayer = cells_[layerId];
240  unsigned int numberOfCells = cellsOnLayer.detid.size();
241  for (unsigned int i = 0; i < numberOfCells; i++) {
242  std::array<int, 4> search_box = lt.searchBox(cellsOnLayer.dim1[i] - delta,
243  cellsOnLayer.dim1[i] + delta,
244  cellsOnLayer.dim2[i] - delta,
245  cellsOnLayer.dim2[i] + delta);
246 
247  for (int xBin = search_box[0]; xBin < search_box[1] + 1; ++xBin) {
248  for (int yBin = search_box[2]; yBin < search_box[3] + 1; ++yBin) {
249  int binId = lt.getGlobalBinByBin(xBin, yBin);
250  size_t binSize = lt[binId].size();
251 
252  for (unsigned int j = 0; j < binSize; j++) {
253  unsigned int otherId = lt[binId][j];
254  if (distance(lt, i, otherId, layerId) < delta) {
255  cellsOnLayer.rho[i] += (i == otherId ? 1.f : 0.5f) * cellsOnLayer.weight[otherId];
256  }
257  }
258  }
259  }
260  LogDebug("HGCalCLUEAlgo") << "Debugging calculateLocalDensity: \n"
261  << " cell: " << i << " eta: " << cellsOnLayer.dim1[i] << " phi: " << cellsOnLayer.dim2[i]
262  << " energy: " << cellsOnLayer.weight[i] << " density: " << cellsOnLayer.rho[i] << "\n";
263  }
264 }
265 template <typename T, typename STRATEGY>
267  const unsigned int layerId,
268  float delta,
270  auto& cellsOnLayer = cells_[layerId];
271  unsigned int numberOfCells = cellsOnLayer.detid.size();
272  for (unsigned int i = 0; i < numberOfCells; i++) {
273  std::array<int, 4> search_box = lt.searchBox(cellsOnLayer.dim1[i] - delta,
274  cellsOnLayer.dim1[i] + delta,
275  cellsOnLayer.dim2[i] - delta,
276  cellsOnLayer.dim2[i] + delta);
277  cellsOnLayer.rho[i] += cellsOnLayer.weight[i];
278  float northeast(0), northwest(0), southeast(0), southwest(0), all(0);
279  for (int etaBin = search_box[0]; etaBin < search_box[1] + 1; ++etaBin) {
280  for (int phiBin = search_box[2]; phiBin < search_box[3] + 1; ++phiBin) {
281  int phi = (phiBin % T::type::nRows);
282  int binId = lt.getGlobalBinByBin(etaBin, phi);
283  size_t binSize = lt[binId].size();
284  for (unsigned int j = 0; j < binSize; j++) {
285  unsigned int otherId = lt[binId][j];
286  if (distance(lt, i, otherId, layerId) < delta) {
287  int iPhi = HGCScintillatorDetId(cellsOnLayer.detid[i]).iphi();
288  int otherIPhi = HGCScintillatorDetId(cellsOnLayer.detid[otherId]).iphi();
289  int iEta = HGCScintillatorDetId(cellsOnLayer.detid[i]).ieta();
290  int otherIEta = HGCScintillatorDetId(cellsOnLayer.detid[otherId]).ieta();
291  int dIPhi = otherIPhi - iPhi;
292  dIPhi += abs(dIPhi) < 2 ? 0
293  : dIPhi < 0 ? scintMaxIphi_
294  : -scintMaxIphi_; // cells with iPhi=288 and iPhi=1 should be neiboring cells
295  int dIEta = otherIEta - iEta;
296  LogDebug("HGCalCLUEAlgo") << " Debugging calculateLocalDensity for Scintillator: \n"
297  << " cell: " << otherId << " energy: " << cellsOnLayer.weight[otherId]
298  << " otherIPhi: " << otherIPhi << " iPhi: " << iPhi << " otherIEta: " << otherIEta
299  << " iEta: " << iEta << "\n";
300 
301  if (otherId != i) {
302  auto neighborCellContribution = 0.5f * cellsOnLayer.weight[otherId];
303  all += neighborCellContribution;
304  if (dIPhi >= 0 && dIEta >= 0)
305  northeast += neighborCellContribution;
306  if (dIPhi <= 0 && dIEta >= 0)
307  southeast += neighborCellContribution;
308  if (dIPhi >= 0 && dIEta <= 0)
309  northwest += neighborCellContribution;
310  if (dIPhi <= 0 && dIEta <= 0)
311  southwest += neighborCellContribution;
312  }
313  LogDebug("HGCalCLUEAlgo") << " Debugging calculateLocalDensity for Scintillator: \n"
314  << " northeast: " << northeast << " southeast: " << southeast
315  << " northwest: " << northwest << " southwest: " << southwest << "\n";
316  }
317  }
318  }
319  }
320  float neighborsval = (std::max(northeast, northwest) > std::max(southeast, southwest))
321  ? std::max(northeast, northwest)
322  : std::max(southeast, southwest);
323  if (use2x2_)
324  cellsOnLayer.rho[i] += neighborsval;
325  else
326  cellsOnLayer.rho[i] += all;
327  LogDebug("HGCalCLUEAlgo") << "Debugging calculateLocalDensity: \n"
328  << " cell: " << i << " eta: " << cellsOnLayer.dim1[i] << " phi: " << cellsOnLayer.dim2[i]
329  << " energy: " << cellsOnLayer.weight[i] << " density: " << cellsOnLayer.rho[i] << "\n";
330  }
331 }
332 template <typename T, typename STRATEGY>
333 void HGCalCLUEAlgoT<T, STRATEGY>::calculateLocalDensity(const T& lt, const unsigned int layerId, float delta) {
334  if constexpr (std::is_same_v<STRATEGY, HGCalSiliconStrategy>) {
335  calculateLocalDensity(lt, layerId, delta, HGCalSiliconStrategy());
336  } else {
337  calculateLocalDensity(lt, layerId, delta, HGCalScintillatorStrategy());
338  }
339 }
340 
341 template <typename T, typename STRATEGY>
342 void HGCalCLUEAlgoT<T, STRATEGY>::calculateDistanceToHigher(const T& lt, const unsigned int layerId, float delta) {
343  auto& cellsOnLayer = cells_[layerId];
344  unsigned int numberOfCells = cellsOnLayer.detid.size();
345 
346  for (unsigned int i = 0; i < numberOfCells; i++) {
347  // initialize delta and nearest higher for i
349  float i_delta = maxDelta;
350  int i_nearestHigher = -1;
351  auto range = outlierDeltaFactor_ * delta;
352  std::array<int, 4> search_box = lt.searchBox(cellsOnLayer.dim1[i] - range,
353  cellsOnLayer.dim1[i] + range,
354  cellsOnLayer.dim2[i] - range,
355  cellsOnLayer.dim2[i] + range);
356  // loop over all bins in the search box
357  for (int dim1Bin = search_box[0]; dim1Bin < search_box[1] + 1; ++dim1Bin) {
358  for (int dim2Bin = search_box[2]; dim2Bin < search_box[3] + 1; ++dim2Bin) {
359  // get the id of this bin
360  size_t binId = lt.getGlobalBinByBin(dim1Bin, dim2Bin);
361  if constexpr (std::is_same_v<STRATEGY, HGCalScintillatorStrategy>)
362  binId = lt.getGlobalBinByBin(dim1Bin, (dim2Bin % T::type::nRows));
363  // get the size of this bin
364  size_t binSize = lt[binId].size();
365 
366  // loop over all hits in this bin
367  for (unsigned int j = 0; j < binSize; j++) {
368  unsigned int otherId = lt[binId][j];
369  float dist = distance(lt, i, otherId, layerId);
370  bool foundHigher =
371  (cellsOnLayer.rho[otherId] > cellsOnLayer.rho[i]) ||
372  (cellsOnLayer.rho[otherId] == cellsOnLayer.rho[i] && cellsOnLayer.detid[otherId] > cellsOnLayer.detid[i]);
373  if (foundHigher && dist <= i_delta) {
374  // update i_delta
375  i_delta = dist;
376  // update i_nearestHigher
377  i_nearestHigher = otherId;
378  }
379  }
380  }
381  }
382  bool foundNearestHigherInSearchBox = (i_delta != maxDelta);
383  if (foundNearestHigherInSearchBox) {
384  cellsOnLayer.delta[i] = i_delta;
385  cellsOnLayer.nearestHigher[i] = i_nearestHigher;
386  } else {
387  // otherwise delta is guaranteed to be larger outlierDeltaFactor_*delta_c
388  // we can safely maximize delta to be maxDelta
389  cellsOnLayer.delta[i] = maxDelta;
390  cellsOnLayer.nearestHigher[i] = -1;
391  }
392 
393  LogDebug("HGCalCLUEAlgo") << "Debugging calculateDistanceToHigher: \n"
394  << " cell: " << i << " eta: " << cellsOnLayer.dim1[i] << " phi: " << cellsOnLayer.dim2[i]
395  << " energy: " << cellsOnLayer.weight[i] << " density: " << cellsOnLayer.rho[i]
396  << " nearest higher: " << cellsOnLayer.nearestHigher[i]
397  << " distance: " << cellsOnLayer.delta[i] << "\n";
398  }
399 }
400 
401 template <typename T, typename STRATEGY>
402 int HGCalCLUEAlgoT<T, STRATEGY>::findAndAssignClusters(const unsigned int layerId, float delta) {
403  // this is called once per layer and endcap...
404  // so when filling the cluster temporary vector of Hexels we resize each time
405  // by the number of clusters found. This is always equal to the number of
406  // cluster centers...
407  unsigned int nClustersOnLayer = 0;
408  auto& cellsOnLayer = cells_[layerId];
409  unsigned int numberOfCells = cellsOnLayer.detid.size();
410  std::vector<int> localStack;
411  // find cluster seeds and outlier
412  for (unsigned int i = 0; i < numberOfCells; i++) {
413  float rho_c = kappa_ * cellsOnLayer.sigmaNoise[i];
414  // initialize clusterIndex
415  cellsOnLayer.clusterIndex[i] = -1;
416  bool isSeed = (cellsOnLayer.delta[i] > delta) && (cellsOnLayer.rho[i] >= rho_c);
417  bool isOutlier = (cellsOnLayer.delta[i] > outlierDeltaFactor_ * delta) && (cellsOnLayer.rho[i] < rho_c);
418  if (isSeed) {
419  cellsOnLayer.clusterIndex[i] = nClustersOnLayer;
420  cellsOnLayer.isSeed[i] = true;
421  nClustersOnLayer++;
422  localStack.push_back(i);
423 
424  } else if (!isOutlier) {
425  cellsOnLayer.followers[cellsOnLayer.nearestHigher[i]].push_back(i);
426  }
427  }
428 
429  // need to pass clusterIndex to their followers
430  while (!localStack.empty()) {
431  int endStack = localStack.back();
432  auto& thisSeed = cellsOnLayer.followers[endStack];
433  localStack.pop_back();
434 
435  // loop over followers
436  for (int j : thisSeed) {
437  // pass id to a follower
438  cellsOnLayer.clusterIndex[j] = cellsOnLayer.clusterIndex[endStack];
439  // push this follower to localStack
440  localStack.push_back(j);
441  }
442  }
443  return nClustersOnLayer;
444 }
445 
446 template <typename T, typename STRATEGY>
448  // To support the TDR geometry and also the post-TDR one (v9 onwards), we
449  // need to change the logic of the vectors containing signal to noise and
450  // thresholds. The first 3 indices will keep on addressing the different
451  // thicknesses of the Silicon detectors in CE_E , the next 3 indices will address
452  // the thicknesses of the Silicon detectors in CE_H, while the last one, number 6 (the
453  // seventh) will address the Scintillators. This change will support both
454  // geometries at the same time.
455 
456  if (initialized_)
457  return; // only need to calculate thresholds once
458 
459  initialized_ = true;
460 
461  std::vector<double> dummy;
462 
463  dummy.resize(maxNumberOfThickIndices_ + !isNose_, 0); // +1 to accomodate for the Scintillators
464  thresholds_.resize(maxlayer_, dummy);
465  v_sigmaNoise_.resize(maxlayer_, dummy);
466 
467  for (unsigned ilayer = 1; ilayer <= maxlayer_; ++ilayer) {
468  for (unsigned ithick = 0; ithick < maxNumberOfThickIndices_; ++ithick) {
469  float sigmaNoise = 0.001f * fcPerEle_ * nonAgedNoises_[ithick] * dEdXweights_[ilayer] /
470  (fcPerMip_[ithick] * thicknessCorrection_[ithick]);
471  thresholds_[ilayer - 1][ithick] = sigmaNoise * ecut_;
472  v_sigmaNoise_[ilayer - 1][ithick] = sigmaNoise;
473  LogDebug("HGCalCLUEAlgo") << "ilayer: " << ilayer << " nonAgedNoises: " << nonAgedNoises_[ithick]
474  << " fcPerEle: " << fcPerEle_ << " fcPerMip: " << fcPerMip_[ithick]
475  << " noiseMip: " << fcPerEle_ * nonAgedNoises_[ithick] / fcPerMip_[ithick]
476  << " sigmaNoise: " << sigmaNoise << "\n";
477  }
478 
479  if (!isNose_) {
480  float scintillators_sigmaNoise = 0.001f * noiseMip_ * dEdXweights_[ilayer] / sciThicknessCorrection_;
481  thresholds_[ilayer - 1][maxNumberOfThickIndices_] = ecut_ * scintillators_sigmaNoise;
482  v_sigmaNoise_[ilayer - 1][maxNumberOfThickIndices_] = scintillators_sigmaNoise;
483  LogDebug("HGCalCLUEAlgo") << "ilayer: " << ilayer << " noiseMip: " << noiseMip_
484  << " scintillators_sigmaNoise: " << scintillators_sigmaNoise << "\n";
485  }
486  }
487 }
488 
489 // explicit template instantiation
constexpr int ieta() const
void computeThreshold()
constexpr int iphi() const
get the phi index
constexpr const DetId & detid() const
Definition: CaloRecHit.h:33
def all(container)
workaround iterator generators for ROOT classes
Definition: cmstools.py:25
CaloCluster BasicCluster
void calculateDistanceToHigher(const TILE &lt, const unsigned int layerId, float delta)
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46
void populate(const HGCRecHitCollection &hits) override
constexpr float energy() const
Definition: CaloRecHit.h:29
double delta_r(const Fourvec &a, const Fourvec &b)
Find the distance between two four-vectors in the two-dimensional space .
Definition: fourvec.cc:238
const double infinity
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void makeClusters() override
double f[11][100]
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
Definition: DetId.h:17
void getEventSetupPerAlgorithm(const edm::EventSetup &es) override
void calculateLocalDensity(const TILE &lt, const unsigned int layerId, float delta)
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
void prepareDataStructures(const unsigned int layerId)
static int position[264][3]
Definition: ReadPGInfo.cc:289
float x
static constexpr float d1
long double T
strategy
Definition: nnet_common.h:18
int findAndAssignClusters(const unsigned int layerId, float delta)
std::vector< reco::BasicCluster > getClusters(bool) override
#define LogDebug(id)