CMS 3D CMS Logo

List of all members | Classes | Public Types | Public Member Functions | Static Public Member Functions | Private Types | Private Member Functions | Private Attributes
HGCalImagingAlgo Class Reference

#include <HGCalImagingAlgo.h>

Inheritance diagram for HGCalImagingAlgo:
HGCalClusteringAlgoBase

Classes

struct  Hexel
 

Public Types

typedef math::XYZPoint Point
 point in the space More...
 
- Public Types inherited from HGCalClusteringAlgoBase
enum  VerbosityLevel { pDEBUG = 0, pWARNING = 1, pINFO = 2, pERROR = 3 }
 

Public Member Functions

void computeThreshold ()
 
std::vector< reco::BasicClustergetClusters (bool) override
 
Density getDensity () override
 
 HGCalImagingAlgo (const edm::ParameterSet &ps)
 
void makeClusters () override
 
void populate (const HGCRecHitCollection &hits) override
 
void reset () override
 
 ~HGCalImagingAlgo () override
 
- Public Member Functions inherited from HGCalClusteringAlgoBase
void getEventSetup (const edm::EventSetup &es)
 
 HGCalClusteringAlgoBase (VerbosityLevel v, reco::CaloCluster::AlgoId algo)
 
void setAlgoId (reco::CaloCluster::AlgoId algo)
 
void setVerbosity (VerbosityLevel the_verbosity)
 
virtual ~HGCalClusteringAlgoBase ()
 

Static Public Member Functions

static void fillPSetDescription (edm::ParameterSetDescription &iDesc)
 

Private Types

typedef KDTreeNodeInfoT< Hexel, 2 > KDNode
 
typedef KDTreeLinkerAlgo< Hexel, 2 > KDTree
 

Private Member Functions

double calculateDistanceToHigher (std::vector< KDNode > &) const
 
double calculateEnergyWithFraction (const std::vector< KDNode > &, const std::vector< double > &)
 
double calculateLocalDensity (std::vector< KDNode > &, KDTree &, const unsigned int) const
 
math::XYZPoint calculatePosition (std::vector< KDNode > &) const
 
math::XYZPoint calculatePositionWithFraction (const std::vector< KDNode > &, const std::vector< double > &)
 
double distance (const Hexel &pt1, const Hexel &pt2) const
 
double distance2 (const Hexel &pt1, const Hexel &pt2) const
 
int findAndAssignClusters (std::vector< KDNode > &, KDTree &, double, KDTreeBox &, const unsigned int, std::vector< std::vector< KDNode > > &) const
 
std::vector< unsigned > findLocalMaximaInCluster (const std::vector< KDNode > &)
 
void setDensity (const std::vector< KDNode > &nd)
 
void shareEnergy (const std::vector< KDNode > &, const std::vector< unsigned > &, std::vector< std::vector< double > > &)
 
std::vector< size_t > sort_by_delta (const std::vector< KDNode > &v) const
 

Private Attributes

std::vector< reco::BasicClusterclusters_v_
 
std::vector< double > dEdXweights_
 
Density density_
 
bool dependSensor_
 
double ecut_
 
double fcPerEle_
 
std::vector< double > fcPerMip_
 
bool initialized_
 
double kappa_
 
std::vector< std::vector< std::vector< KDNode > > > layerClustersPerLayer_
 
std::vector< std::array< float, 2 > > maxpos_
 
std::vector< std::array< float, 2 > > minpos_
 
double noiseMip_
 
std::vector< double > nonAgedNoises_
 
std::vector< std::vector< KDNode > > points_
 
std::vector< double > positionDeltaRho_c_
 
double sigma2_
 
std::vector< std::vector< double > > sigmaNoise_
 
std::vector< double > thicknessCorrection_
 
std::vector< std::vector< double > > thresholds_
 
std::vector< double > thresholdW0_
 
std::vector< double > vecDeltas_
 

Additional Inherited Members

- Static Public Attributes inherited from HGCalClusteringAlgoBase
static const unsigned int lastLayerEE = 28
 
static const unsigned int lastLayerFH = 40
 
static const unsigned int maxlayer = 52
 
- Protected Attributes inherited from HGCalClusteringAlgoBase
reco::CaloCluster::AlgoId algoId_
 
std::vector< reco::BasicClusterclusters_v_
 
hgcal::RecHitTools rhtools_
 
VerbosityLevel verbosity_
 

Detailed Description

Definition at line 31 of file HGCalImagingAlgo.h.

Member Typedef Documentation

Definition at line 209 of file HGCalImagingAlgo.h.

Definition at line 208 of file HGCalImagingAlgo.h.

point in the space

Definition at line 122 of file HGCalImagingAlgo.h.

Constructor & Destructor Documentation

HGCalImagingAlgo::HGCalImagingAlgo ( const edm::ParameterSet ps)
inline

Definition at line 35 of file HGCalImagingAlgo.h.

References HGCalClusteringAlgoBase::maxlayer, and maxpos_.

37  (HGCalClusteringAlgoBase::VerbosityLevel)ps.getUntrackedParameter<unsigned int>("verbosity",3),
39  thresholdW0_(ps.getParameter<std::vector<double> >("thresholdW0")),
40  positionDeltaRho_c_(ps.getParameter<std::vector<double> >("positionDeltaRho_c")),
41  vecDeltas_(ps.getParameter<std::vector<double> >("deltac")),
42  kappa_(ps.getParameter<double>("kappa")),
43  ecut_(ps.getParameter<double>("ecut")),
44  sigma2_(1.0),
45  dependSensor_(ps.getParameter<bool>("dependSensor")),
46  dEdXweights_(ps.getParameter<std::vector<double> >("dEdXweights")),
47  thicknessCorrection_(ps.getParameter<std::vector<double> >("thicknessCorrection")),
48  fcPerMip_(ps.getParameter<std::vector<double> >("fcPerMip")),
49  fcPerEle_(ps.getParameter<double>("fcPerEle")),
50  nonAgedNoises_(ps.getParameter<edm::ParameterSet>("noises").getParameter<std::vector<double> >("values")),
51  noiseMip_(ps.getParameter<edm::ParameterSet>("noiseMip").getParameter<double>("value")),
52  initialized_(false),
53  points_(2*(maxlayer+1)),
54  minpos_(2*(maxlayer+1),{ {0.0f,0.0f} }),
55  maxpos_(2*(maxlayer+1),{ {0.0f,0.0f} }) {}
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< double > positionDeltaRho_c_
std::vector< double > thresholdW0_
HGCalClusteringAlgoBase(VerbosityLevel v, reco::CaloCluster::AlgoId algo)
std::vector< std::vector< KDNode > > points_
std::vector< double > vecDeltas_
std::vector< double > dEdXweights_
std::vector< std::array< float, 2 > > minpos_
std::vector< double > thicknessCorrection_
std::vector< double > fcPerMip_
std::vector< double > nonAgedNoises_
static const unsigned int maxlayer
std::vector< std::array< float, 2 > > maxpos_
HGCalImagingAlgo::~HGCalImagingAlgo ( )
inlineoverride

Definition at line 57 of file HGCalImagingAlgo.h.

References getClusters(), hfClusterShapes_cfi::hits, makeClusters(), and populate().

57 {}

Member Function Documentation

double HGCalImagingAlgo::calculateDistanceToHigher ( std::vector< KDNode > &  nd) const
private

Definition at line 299 of file HGCalImagingAlgo.cc.

References data, mps_fire::i, hgcal_clustering::sorted_indices(), mathSSE::sqrt(), and tmp.

Referenced by distance().

299  {
300 
301  // sort vector of Hexels by decreasing local density
302  std::vector<size_t> rs = sorted_indices(nd);
303 
304  double maxdensity = 0.0;
305  int nearestHigher = -1;
306 
307  if (!rs.empty())
308  maxdensity = nd[rs[0]].data.rho;
309  else
310  return maxdensity; // there are no hits
311  double dist2 = 0.;
312  // start by setting delta for the highest density hit to
313  // the most distant hit - this is a convention
314 
315  for (auto &j : nd) {
316  double tmp = distance2(nd[rs[0]].data, j.data);
317  if (tmp > dist2)
318  dist2 = tmp;
319  }
320  nd[rs[0]].data.delta = std::sqrt(dist2);
321  nd[rs[0]].data.nearestHigher = nearestHigher;
322 
323  // now we save the largest distance as a starting point
324  const double max_dist2 = dist2;
325  const unsigned int nd_size = nd.size();
326 
327  for (unsigned int oi = 1; oi < nd_size;
328  ++oi) { // start from second-highest density
329  dist2 = max_dist2;
330  unsigned int i = rs[oi];
331  // we only need to check up to oi since hits
332  // are ordered by decreasing density
333  // and all points coming BEFORE oi are guaranteed to have higher rho
334  // and the ones AFTER to have lower rho
335  for (unsigned int oj = 0; oj < oi; ++oj) {
336  unsigned int j = rs[oj];
337  // Limit the search box
338  if ((nd[i].data.x - nd[j].data.x)*(nd[i].data.x - nd[j].data.x) > dist2) continue;
339  if ((nd[i].data.y - nd[j].data.y)*(nd[i].data.y - nd[j].data.y) > dist2) continue;
340  double tmp = distance2(nd[i].data, nd[j].data);
341  if (tmp <= dist2) { // this "<=" instead of "<" addresses the (rare) case
342  // when there are only two hits
343  dist2 = tmp;
344  nearestHigher = j;
345  }
346  }
347  nd[i].data.delta = std::sqrt(dist2);
348  nd[i].data.nearestHigher =
349  nearestHigher; // this uses the original unsorted hitlist
350  }
351  return maxdensity;
352 }
double distance2(const Hexel &pt1, const Hexel &pt2) const
T sqrt(T t)
Definition: SSEVec.h:18
std::vector< size_t > sorted_indices(const std::vector< T > &v)
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
double HGCalImagingAlgo::calculateEnergyWithFraction ( const std::vector< KDNode > &  hits,
const std::vector< double > &  fractions 
)
private

Definition at line 541 of file HGCalImagingAlgo.cc.

References mps_fire::i, and mps_fire::result.

Referenced by distance().

542  {
543  double result = 0.0;
544  for (unsigned i = 0; i < hits.size(); ++i) {
545  result += fractions[i] * hits[i].data.weight;
546  }
547  return result;
548 }
double HGCalImagingAlgo::calculateLocalDensity ( std::vector< KDNode > &  nd,
KDTree lp,
const unsigned int  layer 
) const
private

Definition at line 266 of file HGCalImagingAlgo.cc.

References data, SoftLeptonByDistance_cfi::distance, runEdmFileComparison::found, mps_fire::i, SiStripPI::max, and KDTreeLinkerAlgo< DATA >::search().

Referenced by distance().

268  {
269 
270  double maxdensity = 0.;
271  float delta_c; // maximum search distance (critical distance) for local
272  // density calculation
273  if (layer <= lastLayerEE)
274  delta_c = vecDeltas_[0];
275  else if (layer <= lastLayerFH)
276  delta_c = vecDeltas_[1];
277  else
278  delta_c = vecDeltas_[2];
279 
280  // for each node calculate local density rho and store it
281  for (unsigned int i = 0; i < nd.size(); ++i) {
282  // speec up search by looking within +/- delta_c window only
283  KDTreeBox search_box(nd[i].dims[0] - delta_c, nd[i].dims[0] + delta_c,
284  nd[i].dims[1] - delta_c, nd[i].dims[1] + delta_c);
285  std::vector<KDNode> found;
286  lp.search(search_box, found);
287  const unsigned int found_size = found.size();
288  for (unsigned int j = 0; j < found_size; j++) {
289  if (distance(nd[i].data, found[j].data) < delta_c) {
290  nd[i].data.rho += found[j].data.weight;
291  maxdensity = std::max(maxdensity, nd[i].data.rho);
292  }
293  } // end loop found
294  } // end loop nodes
295  return maxdensity;
296 }
static const unsigned int lastLayerEE
static const unsigned int lastLayerFH
double distance(const Hexel &pt1, const Hexel &pt2) const
std::vector< double > vecDeltas_
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
math::XYZPoint HGCalImagingAlgo::calculatePosition ( std::vector< KDNode > &  v) const
private

Definition at line 198 of file HGCalImagingAlgo.cc.

References data, mps_fire::i, training_settings::idx, cmsBatch::log, and SiStripPI::max.

Referenced by distance().

198  {
199  float total_weight = 0.f;
200  float x = 0.f;
201  float y = 0.f;
202 
203  unsigned int v_size = v.size();
204  unsigned int maxEnergyIndex = 0;
205  float maxEnergyValue = 0;
206 
207  // loop over hits in cluster candidate
208  // determining the maximum energy hit
209  for (unsigned int i = 0; i < v_size; i++) {
210  if (v[i].data.weight > maxEnergyValue) {
211  maxEnergyValue = v[i].data.weight;
212  maxEnergyIndex = i;
213  }
214  }
215 
216  // Si cell or Scintillator. Used to set approach and parameters
217  int thick = rhtools_.getSiThickIndex(v[maxEnergyIndex].data.detid);
218 
219  // for hits within positionDeltaRho_c_ from maximum energy hit
220  // build up weight for energy-weighted position
221  // and save corresponding hits indices
222  std::vector<unsigned int> innerIndices;
223  for (unsigned int i = 0; i < v_size; i++) {
224  if (thick == -1 ||
225  distance2(v[i].data, v[maxEnergyIndex].data) < positionDeltaRho_c_[thick]){
226  innerIndices.push_back(i);
227 
228  float rhEnergy = v[i].data.weight;
229  total_weight += rhEnergy;
230  // just fill x, y for scintillator
231  // for Si it is overwritten later anyway
232  if(thick == -1){
233  x += v[i].data.x * rhEnergy;
234  y += v[i].data.y * rhEnergy;
235  }
236  }
237  }
238  // just loop on reduced vector of interesting indices
239  // to compute log weighting
240  if(thick != -1 && total_weight != 0.){ // Silicon case
241  float total_weight_log = 0.f;
242  float x_log = 0.f;
243  float y_log = 0.f;
244  for (auto idx : innerIndices) {
245  float rhEnergy = v[idx].data.weight;
246  if(rhEnergy == 0.) continue;
247  float Wi = std::max(thresholdW0_[thick] + log(rhEnergy/total_weight), 0.);
248  x_log += v[idx].data.x * Wi;
249  y_log += v[idx].data.y * Wi;
250  total_weight_log += Wi;
251  }
252  total_weight = total_weight_log;
253  x = x_log;
254  y = y_log;
255  }
256 
257  if (total_weight != 0.) {
258  auto inv_tot_weight = 1. / total_weight;
259  return math::XYZPoint(x * inv_tot_weight,
260  y * inv_tot_weight,
261  v[maxEnergyIndex].data.z);
262  }
263  return math::XYZPoint(0, 0, 0);
264 }
std::vector< double > positionDeltaRho_c_
double distance2(const Hexel &pt1, const Hexel &pt2) const
std::vector< double > thresholdW0_
int getSiThickIndex(const DetId &) const
Definition: RecHitTools.cc:168
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
math::XYZPoint HGCalImagingAlgo::calculatePositionWithFraction ( const std::vector< KDNode > &  hits,
const std::vector< double > &  fractions 
)
private

Definition at line 526 of file HGCalImagingAlgo.cc.

References mps_fire::i, mps_fire::result, and mps_merge::weight.

Referenced by distance().

527  {
528  double norm(0.0), x(0.0), y(0.0), z(0.0);
529  for (unsigned i = 0; i < hits.size(); ++i) {
530  const double weight = fractions[i] * hits[i].data.weight;
531  norm += weight;
532  x += weight * hits[i].data.x;
533  y += weight * hits[i].data.y;
534  z += weight * hits[i].data.z;
535  }
537  result /= norm;
538  return result;
539 }
Definition: weight.py:1
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
void HGCalImagingAlgo::computeThreshold ( )

Definition at line 650 of file HGCalImagingAlgo.cc.

Referenced by reset().

650  {
651  // To support the TDR geometry and also the post-TDR one (v9 onwards), we
652  // need to change the logic of the vectors containing signal to noise and
653  // thresholds. The first 3 indices will keep on addressing the different
654  // thicknesses of the Silicon detectors, while the last one, number 3 (the
655  // fourth) will address the Scintillators. This change will support both
656  // geometries at the same time.
657 
658  if (initialized_)
659  return; // only need to calculate thresholds once
660 
661  initialized_ = true;
662 
663  std::vector<double> dummy;
664  const unsigned maxNumberOfThickIndices = 3;
665  dummy.resize(maxNumberOfThickIndices + 1, 0); // +1 to accomodate for the Scintillators
666  thresholds_.resize(maxlayer, dummy);
667  sigmaNoise_.resize(maxlayer, dummy);
668 
669  for (unsigned ilayer = 1; ilayer <= maxlayer; ++ilayer) {
670  for (unsigned ithick = 0; ithick < maxNumberOfThickIndices; ++ithick) {
671  float sigmaNoise =
672  0.001f * fcPerEle_ * nonAgedNoises_[ithick] * dEdXweights_[ilayer] /
673  (fcPerMip_[ithick] * thicknessCorrection_[ithick]);
674  thresholds_[ilayer - 1][ithick] = sigmaNoise * ecut_;
675  sigmaNoise_[ilayer - 1][ithick] = sigmaNoise;
676  }
677  float scintillators_sigmaNoise = 0.001f * noiseMip_ * dEdXweights_[ilayer];
678  thresholds_[ilayer - 1][maxNumberOfThickIndices] = ecut_ * scintillators_sigmaNoise;
679  sigmaNoise_[ilayer -1][maxNumberOfThickIndices] = scintillators_sigmaNoise;
680  }
681 
682 }
std::vector< std::vector< double > > thresholds_
std::vector< double > dEdXweights_
std::vector< std::vector< double > > sigmaNoise_
std::vector< double > thicknessCorrection_
std::vector< double > fcPerMip_
std::vector< double > nonAgedNoises_
static const unsigned int maxlayer
double HGCalImagingAlgo::distance ( const Hexel pt1,
const Hexel pt2 
) const
inlineprivate
double HGCalImagingAlgo::distance2 ( const Hexel pt1,
const Hexel pt2 
) const
inlineprivate

Definition at line 232 of file HGCalImagingAlgo.h.

References PVValHelper::dx, PVValHelper::dy, HGCalImagingAlgo::Hexel::x, and HGCalImagingAlgo::Hexel::y.

Referenced by distance().

232  { //distance squared
233  const double dx = pt1.x - pt2.x;
234  const double dy = pt1.y - pt2.y;
235  return (dx*dx + dy*dy);
236 } //distance squaredq
static void HGCalImagingAlgo::fillPSetDescription ( edm::ParameterSetDescription iDesc)
inlinestatic

Definition at line 89 of file HGCalImagingAlgo.h.

References edm::ParameterSetDescription::add(), and edm::ParameterSetDescription::addUntracked().

89  {
90  iDesc.add<std::vector<double>>("thresholdW0", {
91  2.9,
92  2.9,
93  2.9
94  });
95  iDesc.add<std::vector<double>>("positionDeltaRho_c", {
96  1.3,
97  1.3,
98  1.3
99  });
100  iDesc.add<std::vector<double>>("deltac", {
101  2.0,
102  2.0,
103  5.0,
104  });
105  iDesc.add<bool>("dependSensor", true);
106  iDesc.add<double>("ecut", 3.0);
107  iDesc.add<double>("kappa", 9.0);
108  iDesc.addUntracked<unsigned int>("verbosity", 3);
109  iDesc.add<std::vector<double>>("dEdXweights",{});
110  iDesc.add<std::vector<double>>("thicknessCorrection",{});
111  iDesc.add<std::vector<double>>("fcPerMip",{});
112  iDesc.add<double>("fcPerEle",0.0);
113  edm::ParameterSetDescription descNestedNoises;
114  descNestedNoises.add<std::vector<double> >("values", {});
115  iDesc.add<edm::ParameterSetDescription>("noises", descNestedNoises);
116  edm::ParameterSetDescription descNestedNoiseMIP;
117  descNestedNoiseMIP.add<double>("value", 0 );
118  iDesc.add<edm::ParameterSetDescription>("noiseMip", descNestedNoiseMIP);
119 }
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
int HGCalImagingAlgo::findAndAssignClusters ( std::vector< KDNode > &  ,
KDTree ,
double  ,
KDTreeBox ,
const unsigned int  ,
std::vector< std::vector< KDNode > > &   
) const
private

Definition at line 353 of file HGCalImagingAlgo.cc.

References KDTreeLinkerAlgo< DATA >::build(), KDTreeLinkerAlgo< DATA >::clear(), gather_cfg::cout, data, SoftLeptonByDistance_cfi::distance, runEdmFileComparison::found, mps_fire::i, KDTreeLinkerAlgo< DATA >::search(), and hgcal_clustering::sorted_indices().

Referenced by distance().

356  {
357 
358  // this is called once per layer and endcap...
359  // so when filling the cluster temporary vector of Hexels we resize each time
360  // by the number of clusters found. This is always equal to the number of
361  // cluster centers...
362 
363  unsigned int nClustersOnLayer = 0;
364  float delta_c; // critical distance
365  if (layer <= lastLayerEE)
366  delta_c = vecDeltas_[0];
367  else if (layer <= lastLayerFH)
368  delta_c = vecDeltas_[1];
369  else
370  delta_c = vecDeltas_[2];
371 
372  std::vector<size_t> rs =
373  sorted_indices(nd); // indices sorted by decreasing rho
374  std::vector<size_t> ds =
375  sort_by_delta(nd); // sort in decreasing distance to higher
376 
377  const unsigned int nd_size = nd.size();
378  for (unsigned int i = 0; i < nd_size; ++i) {
379 
380  if (nd[ds[i]].data.delta < delta_c)
381  break; // no more cluster centers to be looked at
382  if (dependSensor_) {
383 
384  float rho_c = kappa_ * nd[ds[i]].data.sigmaNoise;
385  if (nd[ds[i]].data.rho < rho_c)
386  continue; // set equal to kappa times noise threshold
387 
388  } else if (nd[ds[i]].data.rho * kappa_ < maxdensity)
389  continue;
390 
391  nd[ds[i]].data.clusterIndex = nClustersOnLayer;
392  if (verbosity_ < pINFO) {
393  std::cout << "Adding new cluster with index " << nClustersOnLayer
394  << std::endl;
395  std::cout << "Cluster center is hit " << ds[i] << std::endl;
396  }
397  nClustersOnLayer++;
398  }
399 
400  // at this point nClustersOnLayer is equal to the number of cluster centers -
401  // if it is zero we are done
402  if (nClustersOnLayer == 0)
403  return nClustersOnLayer;
404 
405  // assign remaining points to clusters, using the nearestHigher set from
406  // previous step (always set except
407  // for top density hit that is skipped...)
408  for (unsigned int oi = 1; oi < nd_size; ++oi) {
409  unsigned int i = rs[oi];
410  int ci = nd[i].data.clusterIndex;
411  if (ci ==
412  -1) { // clusterIndex is initialised with -1 if not yet used in cluster
413  nd[i].data.clusterIndex = nd[nd[i].data.nearestHigher].data.clusterIndex;
414  }
415  }
416 
417  // make room in the temporary cluster vector for the additional clusterIndex
418  // clusters
419  // from this layer
420  if (verbosity_ < pINFO) {
421  std::cout << "resizing cluster vector by " << nClustersOnLayer << std::endl;
422  }
423  clustersOnLayer.resize(nClustersOnLayer);
424 
425  // assign points closer than dc to other clusters to border region
426  // and find critical border density
427  std::vector<double> rho_b(nClustersOnLayer, 0.);
428  lp.clear();
429  lp.build(nd, bounds);
430  // now loop on all hits again :( and check: if there are hits from another
431  // cluster within d_c -> flag as border hit
432  for (unsigned int i = 0; i < nd_size; ++i) {
433  int ci = nd[i].data.clusterIndex;
434  bool flag_isolated = true;
435  if (ci != -1) {
436  KDTreeBox search_box(nd[i].dims[0] - delta_c, nd[i].dims[0] + delta_c,
437  nd[i].dims[1] - delta_c, nd[i].dims[1] + delta_c);
438  std::vector<KDNode> found;
439  lp.search(search_box, found);
440 
441  const unsigned int found_size = found.size();
442  for (unsigned int j = 0; j < found_size;
443  j++) { // start from 0 here instead of 1
444  // check if the hit is not within d_c of another cluster
445  if (found[j].data.clusterIndex != -1) {
446  float dist = distance(found[j].data, nd[i].data);
447  if (dist < delta_c && found[j].data.clusterIndex != ci) {
448  // in which case we assign it to the border
449  nd[i].data.isBorder = true;
450  break;
451  }
452  // because we are using two different containers, we have to make sure
453  // that we don't unflag the
454  // hit when it finds *itself* closer than delta_c
455  if (dist < delta_c && dist != 0. &&
456  found[j].data.clusterIndex == ci) {
457  // in this case it is not an isolated hit
458  // the dist!=0 is because the hit being looked at is also inside the
459  // search box and at dist==0
460  flag_isolated = false;
461  }
462  }
463  }
464  if (flag_isolated)
465  nd[i].data.isBorder =
466  true; // the hit is more than delta_c from any of its brethren
467  }
468  // check if this border hit has density larger than the current rho_b and
469  // update
470  if (nd[i].data.isBorder && rho_b[ci] < nd[i].data.rho)
471  rho_b[ci] = nd[i].data.rho;
472  } // end loop all hits
473 
474  // flag points in cluster with density < rho_b as halo points, then fill the
475  // cluster vector
476  for (unsigned int i = 0; i < nd_size; ++i) {
477  int ci = nd[i].data.clusterIndex;
478  if (ci != -1) {
479  if (nd[i].data.rho <= rho_b[ci])
480  nd[i].data.isHalo = true;
481  clustersOnLayer[ci].push_back(nd[i]);
482  if (verbosity_ < pINFO) {
483  std::cout << "Pushing hit " << i << " into cluster with index " << ci
484  << std::endl;
485  }
486  }
487  }
488 
489  // prepare the offset for the next layer if there is one
490  if (verbosity_ < pINFO) {
491  std::cout << "moving cluster offset by " << nClustersOnLayer << std::endl;
492  }
493  return nClustersOnLayer;
494 }
static const unsigned int lastLayerEE
static const unsigned int lastLayerFH
double distance(const Hexel &pt1, const Hexel &pt2) const
std::vector< size_t > sorted_indices(const std::vector< T > &v)
std::vector< double > vecDeltas_
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
std::vector< size_t > sort_by_delta(const std::vector< KDNode > &v) const
std::vector< unsigned > HGCalImagingAlgo::findLocalMaximaInCluster ( const std::vector< KDNode > &  cluster)
private

Definition at line 498 of file HGCalImagingAlgo.cc.

References data, SoftLeptonByDistance_cfi::distance, MillePedeFileConverter_cfg::e, mps_fire::i, mps_fire::result, and SurveyInfoScenario_cff::seed.

Referenced by distance().

498  {
499  std::vector<unsigned> result;
500  std::vector<bool> seed(cluster.size(), true);
501  float delta_c = 2.;
502 
503  for (unsigned i = 0; i < cluster.size(); ++i) {
504  for (unsigned j = 0; j < cluster.size(); ++j) {
505  if (i != j and distance(cluster[i].data, cluster[j].data) < delta_c) {
506  if (cluster[i].data.weight < cluster[j].data.weight) {
507  seed[i] = false;
508  break;
509  }
510  }
511  }
512  }
513 
514  for (unsigned i = 0; i < cluster.size(); ++i) {
515  if (seed[i] && cluster[i].data.weight > 5e-4) {
516  // seed at i with energy cluster[i].weight
517  result.push_back(i);
518  }
519  }
520 
521  // Found result.size() sub-clusters in input cluster of length cluster.size()
522 
523  return result;
524 }
double distance(const Hexel &pt1, const Hexel &pt2) const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
std::vector< reco::BasicCluster > HGCalImagingAlgo::getClusters ( bool  doSharing)
overridevirtual

Implements HGCalClusteringAlgoBase.

Definition at line 114 of file HGCalImagingAlgo.cc.

References AlignmentPI::calculatePosition(), gather_cfg::cout, data, reco::CaloID::DET_HGCAL_ENDCAP, MillePedeFileConverter_cfg::e, dedxEstimators_cff::fraction, mps_fire::i, hgcal_clustering::max_index(), and position.

Referenced by ~HGCalImagingAlgo().

114  {
115 
117  std::vector<std::pair<DetId, float>> thisCluster;
118  for (auto &clsOnLayer : layerClustersPerLayer_) {
119  for (unsigned int i = 0; i < clsOnLayer.size(); ++i) {
120  double energy = 0;
121  Point position;
122 
123  //Will save the maximum density hit of the cluster
124  size_t rsmax = max_index(clsOnLayer[i]);
125 
126  if (doSharing) {
127 
128  std::vector<unsigned> seeds = findLocalMaximaInCluster(clsOnLayer[i]);
129  // sharing found seeds.size() sub-cluster seeds in cluster i
130 
131  std::vector<std::vector<double>> fractions;
132  // first pass can have noise it in
133  shareEnergy(clsOnLayer[i], seeds, fractions);
134 
135  // reset and run second pass after vetoing seeds
136  // that result in trivial clusters (less than 2 effective cells)
137 
138  for (unsigned isub = 0; isub < fractions.size(); ++isub) {
139  double effective_hits = 0.0;
140  double energy =
141  calculateEnergyWithFraction(clsOnLayer[i], fractions[isub]);
142  Point position =
143  calculatePositionWithFraction(clsOnLayer[i], fractions[isub]);
144 
145  for (unsigned ihit = 0; ihit < fractions[isub].size(); ++ihit) {
146  const double fraction = fractions[isub][ihit];
147  if (fraction > 1e-7) {
148  effective_hits += fraction;
149  thisCluster.emplace_back(clsOnLayer[i][ihit].data.detid,
150  fraction);
151  }
152  }
153 
154  if (verbosity_ < pINFO) {
155  std::cout << "\t******** NEW CLUSTER (SHARING) ********"
156  << std::endl;
157  std::cout << "\tEff. No. of cells = " << effective_hits
158  << std::endl;
159  std::cout << "\t Energy = " << energy << std::endl;
160  std::cout << "\t Phi = " << position.phi()
161  << std::endl;
162  std::cout << "\t Eta = " << position.eta()
163  << std::endl;
164  std::cout << "\t*****************************" << std::endl;
165  }
166  clusters_v_.emplace_back(energy, position, caloID, thisCluster,
167  algoId_);
168  if (!clusters_v_.empty()){ clusters_v_.back().setSeed( clsOnLayer[i][rsmax].data.detid); }
169  thisCluster.clear();
170  }
171  } else {
172  position = calculatePosition(clsOnLayer[i]); // energy-weighted position
173  // std::vector< KDNode >::iterator it;
174  for (auto &it : clsOnLayer[i]) {
175  energy += it.data.isHalo ? 0. : it.data.weight;
176  // use fraction to store whether this is a Halo hit or not
177  thisCluster.emplace_back(it.data.detid, (it.data.isHalo ? 0.f : 1.f));
178  }
179  if (verbosity_ < pINFO) {
180  std::cout << "******** NEW CLUSTER (HGCIA) ********" << std::endl;
181  std::cout << "Index " << i << std::endl;
182  std::cout << "No. of cells = " << clsOnLayer[i].size() << std::endl;
183  std::cout << " Energy = " << energy << std::endl;
184  std::cout << " Phi = " << position.phi() << std::endl;
185  std::cout << " Eta = " << position.eta() << std::endl;
186  std::cout << "*****************************" << std::endl;
187  }
188  clusters_v_.emplace_back(energy, position, caloID, thisCluster, algoId_);
189  if (!clusters_v_.empty()){ clusters_v_.back().setSeed( clsOnLayer[i][rsmax].data.detid); }
190  thisCluster.clear();
191  }
192  }
193  }
194  return clusters_v_;
195 }
double calculateEnergyWithFraction(const std::vector< KDNode > &, const std::vector< double > &)
math::XYZPoint calculatePositionWithFraction(const std::vector< KDNode > &, const std::vector< double > &)
void shareEnergy(const std::vector< KDNode > &, const std::vector< unsigned > &, std::vector< std::vector< double > > &)
std::vector< reco::BasicCluster > clusters_v_
reco::CaloCluster::AlgoId algoId_
std::vector< std::vector< std::vector< KDNode > > > layerClustersPerLayer_
std::vector< unsigned > findLocalMaximaInCluster(const std::vector< KDNode > &)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
Structure Point Contains parameters of Gaussian fits to DMRs.
Definition: DMRtrends.cc:55
static int position[264][3]
Definition: ReadPGInfo.cc:509
math::XYZPoint calculatePosition(std::vector< KDNode > &) const
size_t max_index(const std::vector< T > &v)
Density HGCalImagingAlgo::getDensity ( )
overridevirtual

Implements HGCalClusteringAlgoBase.

Definition at line 693 of file HGCalImagingAlgo.cc.

Referenced by reset().

693  {
694  return density_;
695 }
void HGCalImagingAlgo::makeClusters ( )
overridevirtual

Implements HGCalClusteringAlgoBase.

Definition at line 86 of file HGCalImagingAlgo.cc.

References KDTreeLinkerAlgo< DATA >::build(), mps_fire::i, and AlCaHLTBitMon_ParallelJobs::p.

Referenced by ~HGCalImagingAlgo().

86  {
87  layerClustersPerLayer_.resize(2 * maxlayer + 2);
88  // assign all hits in each layer to a cluster core or halo
89  tbb::this_task_arena::isolate([&] {
90  tbb::parallel_for(size_t(0), size_t(2 * maxlayer + 2), [&](size_t i) {
91  KDTreeBox bounds(minpos_[i][0], maxpos_[i][0], minpos_[i][1], maxpos_[i][1]);
92  KDTree hit_kdtree;
93  hit_kdtree.build(points_[i], bounds);
94 
95  unsigned int actualLayer =
96  i > maxlayer
97  ? (i - (maxlayer + 1))
98  : i; // maps back from index used for KD trees to actual layer
99 
100  double maxdensity = calculateLocalDensity(
101  points_[i], hit_kdtree, actualLayer); // also stores rho (energy
102  // density) for each point (node)
103  // calculate distance to nearest point with higher density storing
104  // distance (delta) and point's index
106  findAndAssignClusters(points_[i], hit_kdtree, maxdensity, bounds,
107  actualLayer, layerClustersPerLayer_[i]);
108  });
109  });
110  //Now that we have the density per point we can store it
111 for(auto const& p: points_) { setDensity(p); }
112 }
double calculateLocalDensity(std::vector< KDNode > &, KDTree &, const unsigned int) const
std::vector< std::vector< KDNode > > points_
std::vector< std::vector< std::vector< KDNode > > > layerClustersPerLayer_
void setDensity(const std::vector< KDNode > &nd)
std::vector< std::array< float, 2 > > minpos_
static const unsigned int maxlayer
KDTreeLinkerAlgo< Hexel, 2 > KDTree
double calculateDistanceToHigher(std::vector< KDNode > &) const
std::vector< std::array< float, 2 > > maxpos_
int findAndAssignClusters(std::vector< KDNode > &, KDTree &, double, KDTreeBox &, const unsigned int, std::vector< std::vector< KDNode > > &) const
void HGCalImagingAlgo::populate ( const HGCRecHitCollection hits)
overridevirtual

Implements HGCalClusteringAlgoBase.

Definition at line 17 of file HGCalImagingAlgo.cc.

References CaloRecHit::detid(), CaloRecHit::energy(), mps_fire::i, createfilelist::int, SiStripPI::max, min(), position, and edm::SortedCollection< T, SORT >::size().

Referenced by ~HGCalImagingAlgo().

17  {
18  // loop over all hits and create the Hexel structure, skip energies below ecut
19 
20  if (dependSensor_) {
21  // for each layer and wafer calculate the thresholds (sigmaNoise and energy)
22  // once
24  }
25 
26  std::vector<bool> firstHit(2 * (maxlayer + 1), true);
27  for (unsigned int i = 0; i < hits.size(); ++i) {
28 
29  const HGCRecHit &hgrh = hits[i];
30  DetId detid = hgrh.detid();
31  unsigned int layer = rhtools_.getLayerWithOffset(detid);
32  float thickness = 0.f;
33  // set sigmaNoise default value 1 to use kappa value directly in case of
34  // sensor-independent thresholds
35  float sigmaNoise = 1.f;
36  if (dependSensor_) {
37  thickness = rhtools_.getSiThickness(detid);
38  int thickness_index = rhtools_.getSiThickIndex(detid);
39  if (thickness_index == -1)
40  thickness_index = 3;
41  double storedThreshold = thresholds_[layer - 1][thickness_index];
42  sigmaNoise = sigmaNoise_[layer - 1][thickness_index];
43 
44  if (hgrh.energy() < storedThreshold)
45  continue; // this sets the ZS threshold at ecut times the sigma noise
46  // for the sensor
47  }
48  if (!dependSensor_ && hgrh.energy() < ecut_)
49  continue;
50 
51  // map layers from positive endcap (z) to layer + maxlayer+1 to prevent
52  // mixing up hits from different sides
53  layer += int(rhtools_.zside(detid) > 0) * (maxlayer + 1);
54 
55  // determine whether this is a half-hexagon
56  bool isHalf = rhtools_.isHalfCell(detid);
58 
59  // here's were the KDNode is passed its dims arguments - note that these are
60  // *copied* from the Hexel
61  points_[layer].emplace_back(
62  Hexel(hgrh, detid, isHalf, sigmaNoise, thickness, &rhtools_),
63  position.x(), position.y());
64 
65  // for each layer, store the minimum and maximum x and y coordinates for the
66  // KDTreeBox boundaries
67  if (firstHit[layer]) {
68  minpos_[layer][0] = position.x();
69  minpos_[layer][1] = position.y();
70  maxpos_[layer][0] = position.x();
71  maxpos_[layer][1] = position.y();
72  firstHit[layer] = false;
73  } else {
74  minpos_[layer][0] = std::min((float)position.x(), minpos_[layer][0]);
75  minpos_[layer][1] = std::min((float)position.y(), minpos_[layer][1]);
76  maxpos_[layer][0] = std::max((float)position.x(), maxpos_[layer][0]);
77  maxpos_[layer][1] = std::max((float)position.y(), maxpos_[layer][1]);
78  }
79 
80  } // end loop hits
81 }
constexpr float energy() const
Definition: CaloRecHit.h:31
bool isHalfCell(const DetId &) const
Definition: RecHitTools.cc:327
int zside(const DetId &id) const
Definition: RecHitTools.cc:131
std::vector< std::vector< double > > thresholds_
constexpr const DetId & detid() const
Definition: CaloRecHit.h:35
std::vector< std::vector< KDNode > > points_
std::vector< std::vector< double > > sigmaNoise_
T min(T a, T b)
Definition: MathUtil.h:58
std::vector< std::array< float, 2 > > minpos_
std::float_t getSiThickness(const DetId &) const
Definition: RecHitTools.cc:145
Definition: DetId.h:18
unsigned int getLayerWithOffset(const DetId &) const
Definition: RecHitTools.cc:283
int getSiThickIndex(const DetId &) const
Definition: RecHitTools.cc:168
GlobalPoint getPosition(const DetId &id) const
Definition: RecHitTools.cc:112
static const unsigned int maxlayer
size_type size() const
static int position[264][3]
Definition: ReadPGInfo.cc:509
std::vector< std::array< float, 2 > > maxpos_
void HGCalImagingAlgo::reset ( void  )
inlineoverridevirtual

Implements HGCalClusteringAlgoBase.

Definition at line 70 of file HGCalImagingAlgo.h.

References clusters_v_, computeThreshold(), getDensity(), mps_fire::i, layerClustersPerLayer_, maxpos_, minpos_, points_, and edm::swap().

70  {
71  clusters_v_.clear();
72  layerClustersPerLayer_.clear();
73  for( auto& it: points_)
74  {
75  it.clear();
76  std::vector<KDNode>().swap(it);
77  }
78  for(unsigned int i = 0; i < minpos_.size(); i++)
79  {
80  minpos_[i][0]=0.; minpos_[i][1]=0.;
81  maxpos_[i][0]=0.; maxpos_[i][1]=0.;
82  }
83 }
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:116
std::vector< reco::BasicCluster > clusters_v_
std::vector< std::vector< KDNode > > points_
std::vector< std::vector< std::vector< KDNode > > > layerClustersPerLayer_
std::vector< std::array< float, 2 > > minpos_
std::vector< std::array< float, 2 > > maxpos_
void HGCalImagingAlgo::setDensity ( const std::vector< KDNode > &  nd)
private

Definition at line 684 of file HGCalImagingAlgo.cc.

References mps_fire::i.

Referenced by distance().

684  {
685 
686  // for each node calculate local density rho and store it
687  for (auto &i : nd){
688  density_[ i.data.detid ] = i.data.rho ;
689  } // end loop nodes
690 }
void HGCalImagingAlgo::shareEnergy ( const std::vector< KDNode > &  ,
const std::vector< unsigned > &  ,
std::vector< std::vector< double > > &   
)
private

Definition at line 550 of file HGCalImagingAlgo.cc.

References data, diffTreeTool::diff, MillePedeFileConverter_cfg::e, JetChargeProducer_cfi::exp, cropTnPTrees::frac, dedxEstimators_cff::fraction, mps_fire::i, SiStripPI::max, particleFlowClusterECALUncorrected_cfi::minFracTot, eostools::move(), perp2(), funct::pow(), mathSSE::sqrt(), particleFlowClusterECALUncorrected_cfi::stoppingTolerance, HGCalImagingAlgo::Hexel::x, HGCalImagingAlgo::Hexel::y, and HGCalImagingAlgo::Hexel::z.

Referenced by distance().

552  {
553  std::vector<bool> isaseed(incluster.size(), false);
554  outclusters.clear();
555  outclusters.resize(seeds.size());
556  std::vector<Point> centroids(seeds.size());
557  std::vector<double> energies(seeds.size());
558 
559  if (seeds.size() == 1) { // short circuit the case of a lone cluster
560  outclusters[0].clear();
561  outclusters[0].resize(incluster.size(), 1.0);
562  return;
563  }
564 
565  // saving seeds
566 
567  // create quick seed lookup
568  for (unsigned i = 0; i < seeds.size(); ++i) {
569  isaseed[seeds[i]] = true;
570  }
571 
572  // initialize clusters to be shared
573  // centroids start off at seed positions
574  // seeds always have fraction 1.0, to stabilize fit
575  // initializing fit
576  for (unsigned i = 0; i < seeds.size(); ++i) {
577  outclusters[i].resize(incluster.size(), 0.0);
578  for (unsigned j = 0; j < incluster.size(); ++j) {
579  if (j == seeds[i]) {
580  outclusters[i][j] = 1.0;
581  centroids[i] = math::XYZPoint(incluster[j].data.x, incluster[j].data.y,
582  incluster[j].data.z);
583  energies[i] = incluster[j].data.weight;
584  }
585  }
586  }
587 
588  // run the fit while we are less than max iterations, and clusters are still
589  // moving
590  const double minFracTot = 1e-20;
591  unsigned iter = 0;
592  const unsigned iterMax = 50;
594  const double stoppingTolerance = 1e-8;
595  const auto numberOfSeeds = seeds.size();
596  auto toleranceScaling =
597  numberOfSeeds > 2 ? (numberOfSeeds - 1) * (numberOfSeeds - 1) : 1;
598  std::vector<Point> prevCentroids;
599  std::vector<double> frac(numberOfSeeds), dist2(numberOfSeeds);
600  while (iter++ < iterMax && diff > stoppingTolerance * toleranceScaling) {
601  for (unsigned i = 0; i < incluster.size(); ++i) {
602  const Hexel &ihit = incluster[i].data;
603  double fracTot(0.0);
604  for (unsigned j = 0; j < numberOfSeeds; ++j) {
605  double fraction = 0.0;
606  double d2 = (std::pow(ihit.x - centroids[j].x(), 2.0) +
607  std::pow(ihit.y - centroids[j].y(), 2.0) +
608  std::pow(ihit.z - centroids[j].z(), 2.0)) /
609  sigma2_;
610  dist2[j] = d2;
611  // now we set the fractions up based on hit type
612  if (i == seeds[j]) { // this cluster's seed
613  fraction = 1.0;
614  } else if (isaseed[i]) {
615  fraction = 0.0;
616  } else {
617  fraction = energies[j] * std::exp(-0.5 * d2);
618  }
619  fracTot += fraction;
620  frac[j] = fraction;
621  }
622  // now that we have calculated all fractions for all hits
623  // assign the new fractions
624  for (unsigned j = 0; j < numberOfSeeds; ++j) {
625  if (fracTot > minFracTot || (i == seeds[j] && fracTot > 0.0)) {
626  outclusters[j][i] = frac[j] / fracTot;
627  } else {
628  outclusters[j][i] = 0.0;
629  }
630  }
631  }
632 
633  // save previous centroids
634  prevCentroids = std::move(centroids);
635  // finally update the position of the centroids from the last iteration
636  centroids.resize(numberOfSeeds);
637  double diff2 = 0.0;
638  for (unsigned i = 0; i < numberOfSeeds; ++i) {
639  centroids[i] = calculatePositionWithFraction(incluster, outclusters[i]);
640  energies[i] = calculateEnergyWithFraction(incluster, outclusters[i]);
641  // calculate convergence parameters
642  const double delta2 = (prevCentroids[i] - centroids[i]).perp2();
643  diff2 = std::max(delta2, diff2);
644  }
645  // update convergance parameter outside loop
646  diff = std::sqrt(diff2);
647  }
648 }
double calculateEnergyWithFraction(const std::vector< KDNode > &, const std::vector< double > &)
math::XYZPoint calculatePositionWithFraction(const std::vector< KDNode > &, const std::vector< double > &)
T sqrt(T t)
Definition: SSEVec.h:18
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
T perp2() const
Squared magnitude of transverse component.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
def move(src, dest)
Definition: eostools.py:511
std::vector<size_t> HGCalImagingAlgo::sort_by_delta ( const std::vector< KDNode > &  v) const
inlineprivate

Definition at line 214 of file HGCalImagingAlgo.h.

References begin, end, training_settings::idx, and findQualityFiles::v.

214  {
215  std::vector<size_t> idx(v.size());
216  std::iota (std::begin(idx), std::end(idx), 0);
217  sort(idx.begin(), idx.end(),
218  [&v](size_t i1, size_t i2) {
219  return v[i1].data.delta > v[i2].data.delta;
220  });
221  return idx;
222 }
#define end
Definition: vmac.h:39
#define begin
Definition: vmac.h:32

Member Data Documentation

std::vector<reco::BasicCluster> HGCalImagingAlgo::clusters_v_
private

Definition at line 141 of file HGCalImagingAlgo.h.

Referenced by reset().

std::vector<double> HGCalImagingAlgo::dEdXweights_
private

Definition at line 148 of file HGCalImagingAlgo.h.

Density HGCalImagingAlgo::density_
private

Definition at line 144 of file HGCalImagingAlgo.h.

bool HGCalImagingAlgo::dependSensor_
private

Definition at line 147 of file HGCalImagingAlgo.h.

double HGCalImagingAlgo::ecut_
private

Definition at line 135 of file HGCalImagingAlgo.h.

double HGCalImagingAlgo::fcPerEle_
private

Definition at line 151 of file HGCalImagingAlgo.h.

std::vector<double> HGCalImagingAlgo::fcPerMip_
private

Definition at line 150 of file HGCalImagingAlgo.h.

bool HGCalImagingAlgo::initialized_
private

Definition at line 158 of file HGCalImagingAlgo.h.

double HGCalImagingAlgo::kappa_
private

Definition at line 132 of file HGCalImagingAlgo.h.

std::vector<std::vector<std::vector< KDNode> > > HGCalImagingAlgo::layerClustersPerLayer_
private

Definition at line 212 of file HGCalImagingAlgo.h.

Referenced by reset().

std::vector<std::array<float,2> > HGCalImagingAlgo::maxpos_
private

Definition at line 228 of file HGCalImagingAlgo.h.

Referenced by HGCalImagingAlgo(), and reset().

std::vector<std::array<float,2> > HGCalImagingAlgo::minpos_
private

Definition at line 227 of file HGCalImagingAlgo.h.

Referenced by reset().

double HGCalImagingAlgo::noiseMip_
private

Definition at line 153 of file HGCalImagingAlgo.h.

std::vector<double> HGCalImagingAlgo::nonAgedNoises_
private

Definition at line 152 of file HGCalImagingAlgo.h.

std::vector<std::vector<KDNode> > HGCalImagingAlgo::points_
private

Definition at line 224 of file HGCalImagingAlgo.h.

Referenced by reset().

std::vector<double> HGCalImagingAlgo::positionDeltaRho_c_
private

Definition at line 128 of file HGCalImagingAlgo.h.

double HGCalImagingAlgo::sigma2_
private

Definition at line 138 of file HGCalImagingAlgo.h.

std::vector<std::vector<double> > HGCalImagingAlgo::sigmaNoise_
private

Definition at line 155 of file HGCalImagingAlgo.h.

std::vector<double> HGCalImagingAlgo::thicknessCorrection_
private

Definition at line 149 of file HGCalImagingAlgo.h.

std::vector<std::vector<double> > HGCalImagingAlgo::thresholds_
private

Definition at line 154 of file HGCalImagingAlgo.h.

std::vector<double> HGCalImagingAlgo::thresholdW0_
private

Definition at line 127 of file HGCalImagingAlgo.h.

std::vector<double> HGCalImagingAlgo::vecDeltas_
private

Definition at line 131 of file HGCalImagingAlgo.h.