7 #include "tbb/task_arena.h"
23 template <
typename TILES>
29 criticalDensity_(conf.getParameter<double>(
"criticalDensity")),
30 densitySiblingLayers_(conf.getParameter<
int>(
"densitySiblingLayers")),
31 densityEtaPhiDistanceSqr_(conf.getParameter<double>(
"densityEtaPhiDistanceSqr")),
32 densityOnSameLayer_(conf.getParameter<
bool>(
"densityOnSameLayer")),
33 criticalEtaPhiDistance_(conf.getParameter<double>(
"criticalEtaPhiDistance")),
34 outlierMultiplier_(conf.getParameter<double>(
"outlierMultiplier")),
35 minNumLayerCluster_(conf.getParameter<
int>(
"minNumLayerCluster")),
36 eidInputName_(conf.getParameter<
std::
string>(
"eid_input_name")),
37 eidOutputNameEnergy_(conf.getParameter<
std::
string>(
"eid_output_name_energy")),
38 eidOutputNameId_(conf.getParameter<
std::
string>(
"eid_output_name_id")),
39 eidMinClusterEnergy_(conf.getParameter<double>(
"eid_min_cluster_energy")),
40 eidNLayers_(conf.getParameter<
int>(
"eid_n_layers")),
41 eidNClusters_(conf.getParameter<
int>(
"eid_n_clusters")),
42 eidSession_(nullptr) {
45 if (trackstersCache ==
nullptr || trackstersCache->
eidGraphDef ==
nullptr) {
47 <<
"PatternRecognitionbyCLUE3D received an empty graph definition from the global cache";
52 template <
typename TILES>
54 int type = tiles[0].typeT();
57 auto lastLayerPerSide = (
unsigned int)(rhtools_.lastLayer(
false));
58 unsigned int maxLayer = 2 * lastLayerPerSide - 1;
62 for (
int phi = 0; phi < nPhiBin; phi++) {
63 int iphi = ((phi % nPhiBin + nPhiBin) % nPhiBin);
65 if (this->algo_verbosity_ > this->Advanced) {
75 template <
typename TILES>
77 const int eventNumber,
78 const std::vector<Trackster> &tracksters)
const {
81 <<
"[evt, tracksterId, cells, prob_photon, prob_ele, prob_chad, prob_nhad, layer_i, x_i, y_i, eta_i, phi_i, "
82 "energy_i, radius_i, rho_i, delta_i, isSeed_i";
87 for (
auto const &
t : tracksters) {
88 for (
auto v :
t.vertices()) {
89 auto [lyrIdx, soaIdx] = layerIdx2layerandSoa[
v];
90 auto const &thisLayer = clusters_[lyrIdx];
93 <<
"TracksterInfo: " << eventNumber << sep <<
num << sep <<
t.vertices().size() << sep
98 << thisLayer.x[soaIdx] << sep << thisLayer.y[soaIdx] << sep << thisLayer.eta[soaIdx] << sep
99 << thisLayer.phi[soaIdx] << sep << thisLayer.energy[soaIdx] << sep << thisLayer.radius[soaIdx] << sep
100 << thisLayer.rho[soaIdx] << sep << thisLayer.delta[soaIdx] << sep << thisLayer.isSeed[soaIdx] <<
'\n';
107 template <
typename TILES>
109 const int eventNumber)
const {
111 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"[evt, layer, x, y, eta, phi, cells, energy, radius, rho, delta, "
112 "isSeed, clusterIdx, layerClusterOriginalIdx";
119 auto const &thisLayer = clusters_[
layer];
121 for (
auto v : thisLayer.x) {
124 <<
"ClusterInfo: " << eventNumber <<
", " <<
layer <<
", " <<
v <<
", " << thisLayer.y[
num] <<
", "
125 << thisLayer.eta[
num] <<
", " << thisLayer.phi[
num] <<
", " << thisLayer.cells[
num] <<
", "
126 << thisLayer.energy[
num] <<
", " << thisLayer.radius[
num] <<
", " << thisLayer.rho[
num] <<
", "
127 << thisLayer.delta[
num] <<
", " << thisLayer.isSeed[
num] <<
", " << thisLayer.clusterIndex[
num] <<
", "
128 << thisLayer.layerClusterOriginalIdx[
num];
133 for (
unsigned int lcIdx = 0; lcIdx < layerIdx2layerandSoa.size(); lcIdx++) {
134 auto const &layerandSoa = layerIdx2layerandSoa[lcIdx];
136 if ((layerandSoa.first == -1) && (layerandSoa.second == -1))
140 <<
"lcIdx: " << lcIdx <<
" on Layer: " << layerandSoa.first <<
" SOA: " << layerandSoa.second;
145 template <
typename TILES>
148 std::vector<Trackster> &
result,
149 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation) {
151 if (
input.regions.empty())
154 const int eventNumber =
input.ev.eventAuxiliary().event();
161 rhtools_.setGeometry(
geom);
164 clusters_.resize(2 * rhtools_.lastLayer(
false));
165 std::vector<std::pair<int, int>> layerIdx2layerandSoa;
167 layerIdx2layerandSoa.reserve(
input.layerClusters.size());
168 unsigned int layerIdx = 0;
169 for (
auto const &lc :
input.layerClusters) {
170 if (
input.mask[layerIdx] == 0.) {
172 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"Skipping masked clustrer: " << layerIdx;
174 layerIdx2layerandSoa.emplace_back(-1, -1);
178 const auto firstHitDetId = lc.hitsAndFractions()[0].first;
179 int layer = rhtools_.getLayerWithOffset(firstHitDetId) - 1 +
180 rhtools_.lastLayer(
false) * ((rhtools_.zside(firstHitDetId) + 1) >> 1);
183 layerIdx2layerandSoa.emplace_back(
layer, clusters_[
layer].x.size());
186 float sum_sqr_x = 0.;
187 float sum_sqr_y = 0.;
188 float ref_x = lc.x();
189 float ref_y = lc.y();
190 float invClsize = 1. / lc.hitsAndFractions().size();
191 for (
auto const &hitsAndFractions : lc.hitsAndFractions()) {
192 auto const &
point = rhtools_.getPosition(hitsAndFractions.first);
194 sum_sqr_x += (
point.x() - ref_x) * (
point.x() - ref_x);
196 sum_sqr_y += (
point.y() - ref_y) * (
point.y() - ref_y);
203 float radius_x =
sqrt((sum_sqr_x - (
sum_x *
sum_x) * invClsize) * invClsize);
204 float radius_y =
sqrt((sum_sqr_y - (
sum_y *
sum_y) * invClsize) * invClsize);
205 clusters_[
layer].x.emplace_back(lc.x());
206 clusters_[
layer].y.emplace_back(lc.y());
207 clusters_[
layer].radius.emplace_back(radius_x + radius_y);
208 clusters_[
layer].eta.emplace_back(lc.eta());
209 clusters_[
layer].phi.emplace_back(lc.phi());
210 clusters_[
layer].cells.push_back(lc.hitsAndFractions().size());
211 clusters_[
layer].energy.emplace_back(lc.energy());
212 clusters_[
layer].isSeed.push_back(
false);
213 clusters_[
layer].clusterIndex.emplace_back(-1);
214 clusters_[
layer].layerClusterOriginalIdx.emplace_back(layerIdx++);
215 clusters_[
layer].nearestHigher.emplace_back(-1, -1);
216 clusters_[
layer].rho.emplace_back(0.
f);
220 clusters_[
layer].followers.resize(clusters_[
layer].x.size());
223 auto lastLayerPerSide = (
unsigned int)(rhtools_.lastLayer(
false));
224 unsigned int maxLayer = 2 * lastLayerPerSide - 1;
225 std::vector<int> numberOfClustersPerLayer(maxLayer, 0);
226 for (
unsigned int i = 0;
i <= maxLayer;
i++) {
227 calculateLocalDensity(
input.tiles,
i, layerIdx2layerandSoa);
229 for (
unsigned int i = 0;
i <= maxLayer;
i++) {
230 calculateDistanceToHigher(
input.tiles,
i, layerIdx2layerandSoa);
233 auto nTracksters = findAndAssignTracksters(
input.tiles, layerIdx2layerandSoa);
235 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"Reconstructed " << nTracksters <<
" tracksters" << std::endl;
236 dumpClusters(layerIdx2layerandSoa, eventNumber);
240 result.resize(nTracksters);
243 const auto &thisLayer = clusters_[
layer];
247 for (
unsigned int lc = 0; lc < thisLayer.x.size(); ++lc) {
249 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"Trackster " << thisLayer.clusterIndex[lc];
251 if (thisLayer.clusterIndex[lc] >= 0) {
253 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
" adding lcIdx: " << thisLayer.layerClusterOriginalIdx[lc];
255 result[thisLayer.clusterIndex[lc]].vertices().push_back(thisLayer.layerClusterOriginalIdx[lc]);
256 result[thisLayer.clusterIndex[lc]].vertex_multiplicity().push_back(1);
258 for (
auto [follower_lyrIdx, follower_soaIdx] : thisLayer.followers[lc]) {
259 std::array<unsigned int, 2> edge = {
260 {(
unsigned int)thisLayer.layerClusterOriginalIdx[lc],
261 (
unsigned int)clusters_[follower_lyrIdx].layerClusterOriginalIdx[follower_soaIdx]}};
262 result[thisLayer.clusterIndex[lc]].edges().push_back(edge);
269 std::remove_if(std::begin(
result),
271 [&](
auto const &
v) {
return static_cast<int>(
v.vertices().size()) < minNumLayerCluster_; }),
277 input.layerClustersTime,
278 rhtools_.getPositionLayer(rhtools_.lastLayerEE(
false),
false).z());
281 energyRegressionAndID(
input.layerClusters,
result);
284 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"Barycenter: " <<
t.barycenter();
287 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"Regressed: " <<
t.regressed_energy();
293 dumpTracksters(layerIdx2layerandSoa, eventNumber,
result);
303 template <
typename TILES>
305 std::vector<Trackster> &tracksters) {
329 std::vector<int> tracksterIndices;
330 for (
int i = 0; i < static_cast<int>(tracksters.size());
i++) {
334 float sumClusterEnergy = 0.;
338 if (sumClusterEnergy >= eidMinClusterEnergy_) {
340 tracksters[
i].setRegressedEnergy(0.
f);
341 tracksters[
i].zeroProbabilities();
342 tracksterIndices.push_back(
i);
349 int batchSize = static_cast<int>(tracksterIndices.size());
350 if (batchSize == 0) {
355 tensorflow::TensorShape shape({batchSize, eidNLayers_, eidNClusters_, eidNFeatures_});
356 tensorflow::Tensor
input(tensorflow::DT_FLOAT, shape);
359 std::vector<tensorflow::Tensor>
outputs;
361 if (!eidOutputNameEnergy_.empty()) {
364 if (!eidOutputNameId_.empty()) {
369 for (
int i = 0;
i < batchSize;
i++) {
370 const Trackster &trackster = tracksters[tracksterIndices[
i]];
375 std::vector<int> clusterIndices(trackster.
vertices().size());
377 clusterIndices[
k] =
k;
379 sort(clusterIndices.begin(), clusterIndices.end(), [&
layerClusters, &trackster](
const int &
a,
const int &
b) {
384 std::vector<int> seenClusters(eidNLayers_);
387 for (
const int &
k : clusterIndices) {
391 if (
j < eidNLayers_ && seenClusters[
j] < eidNClusters_) {
406 for (
int j = 0;
j < eidNLayers_;
j++) {
407 for (
int k = seenClusters[
j];
k < eidNClusters_;
k++) {
409 for (
int l = 0;
l < eidNFeatures_;
l++) {
420 if (!eidOutputNameEnergy_.empty()) {
424 for (
const int &
i : tracksterIndices) {
425 tracksters[
i].setRegressedEnergy(*(
energy++));
430 if (!eidOutputNameId_.empty()) {
432 int probsIdx = eidOutputNameEnergy_.empty() ? 0 : 1;
433 float *probs =
outputs[probsIdx].flat<
float>().
data();
435 for (
const int &
i : tracksterIndices) {
436 tracksters[
i].setProbabilities(probs);
437 probs += tracksters[
i].id_probabilities().size();
442 template <
typename TILES>
444 const TILES &tiles,
const unsigned int layerId,
const std::vector<std::pair<int, int>> &layerIdx2layerandSoa) {
445 int type = tiles[0].typeT();
448 auto &clustersOnLayer = clusters_[layerId];
449 unsigned int numberOfClusters = clustersOnLayer.x.size();
451 auto isReachable = [&](
float x1,
float x2,
float y1,
float y2,
float delta_sqr) ->
bool {
454 << ((
x1 -
x2) * (
x1 -
x2) + (
y1 -
y2) * (
y1 -
y2)) <<
" vs " << delta_sqr <<
"["
460 for (
unsigned int i = 0;
i < numberOfClusters;
i++) {
462 auto lastLayerPerSide = static_cast<unsigned int>(rhtools_.lastLayer(
false)) - 1;
464 unsigned int maxLayer = 2 * lastLayerPerSide - 1;
465 if (layerId < lastLayerPerSide) {
467 maxLayer =
std::min(layerId + densitySiblingLayers_, lastLayerPerSide - 1);
470 maxLayer =
std::min(layerId + densitySiblingLayers_, maxLayer);
472 for (
unsigned int currentLayer =
minLayer; currentLayer <= maxLayer; currentLayer++) {
474 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"RefLayer: " << layerId <<
" SoaIDX: " <<
i;
475 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"NextLayer: " << currentLayer;
477 const auto &tileOnLayer = tiles[currentLayer];
478 bool onSameLayer = (currentLayer == layerId);
480 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"onSameLayer: " << onSameLayer;
482 int etaWindow = onSameLayer ? 2 : 1;
484 int etaBinMin =
std::max(tileOnLayer.etaBin(clustersOnLayer.eta[
i]) - etaWindow, 0);
485 int etaBinMax =
std::min(tileOnLayer.etaBin(clustersOnLayer.eta[
i]) + etaWindow, nEtaBin);
486 int phiBinMin = tileOnLayer.phiBin(clustersOnLayer.phi[
i]) -
phiWindow;
487 int phiBinMax = tileOnLayer.phiBin(clustersOnLayer.phi[
i]) +
phiWindow;
489 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"eta: " << clustersOnLayer.eta[
i];
490 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"phi: " << clustersOnLayer.phi[
i];
491 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"etaBinMin: " << etaBinMin <<
", etaBinMax: " << etaBinMax;
492 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"phiBinMin: " << phiBinMin <<
", phiBinMax: " << phiBinMax;
499 for (
int iphi_it = phiBinMin; iphi_it <= phiBinMax; ++iphi_it) {
500 int iphi = ((iphi_it % nPhiBin + nPhiBin) % nPhiBin);
504 <<
"Entries in tileBin: " << tileOnLayer[
offset +
iphi].size();
506 for (
auto otherClusterIdx : tileOnLayer[
offset +
iphi]) {
507 auto const &layerandSoa = layerIdx2layerandSoa[otherClusterIdx];
509 if ((layerandSoa.first == -1) && (layerandSoa.second == -1)) {
511 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"Skipping masked layerIdx " << otherClusterIdx;
515 auto const &clustersLayer = clusters_[layerandSoa.first];
518 <<
"OtherLayer: " << layerandSoa.first <<
" SoaIDX: " << layerandSoa.second;
519 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"OtherEta: " << clustersLayer.eta[layerandSoa.second];
520 edm::LogVerbatim(
"PatternRecogntionbyCLUE3D") <<
"OtherPhi: " << clustersLayer.phi[layerandSoa.second];
523 float delta = clustersOnLayer.radius[
i] + clustersLayer.radius[layerandSoa.second] + 2.6f;
524 if (densityOnSameLayer_ && onSameLayer) {
525 if (isReachable(clustersOnLayer.x[
i],
526 clustersLayer.x[layerandSoa.second],
527 clustersOnLayer.y[
i],
528 clustersLayer.y[layerandSoa.second],
530 clustersOnLayer.rho[
i] += (clustersOnLayer.layerClusterOriginalIdx[
i] == otherClusterIdx ? 1.f : 0.2f) *
531 clustersLayer.energy[layerandSoa.second];
537 clustersOnLayer.phi[
i],
538 clustersLayer.eta[layerandSoa.second],
539 clustersLayer.phi[layerandSoa.second]);
542 clustersOnLayer.phi[
i],
543 clustersLayer.eta[layerandSoa.second],
544 clustersLayer.phi[layerandSoa.second]) < densityEtaPhiDistanceSqr_) {
545 auto energyToAdd = (clustersOnLayer.layerClusterOriginalIdx[
i] == otherClusterIdx ? 1.f : 0.5f) *
546 clustersLayer.energy[layerandSoa.second];
547 clustersOnLayer.rho[
i] += energyToAdd;
549 <<
"Adding " << energyToAdd <<
" partial " << clustersOnLayer.rho[
i];
562 template <
typename TILES>
564 const TILES &tiles,
const unsigned int layerId,
const std::vector<std::pair<int, int>> &layerIdx2layerandSoa) {
565 int type = tiles[0].typeT();
568 auto &clustersOnLayer = clusters_[layerId];
569 unsigned int numberOfClusters = clustersOnLayer.x.size();
571 for (
unsigned int i = 0;
i < numberOfClusters;
i++) {
574 <<
"Starting searching nearestHigher on " << layerId <<
" with rho: " << clustersOnLayer.rho[
i]
575 <<
" at eta, phi: " << tiles[layerId].etaBin(clustersOnLayer.eta[
i]) <<
", "
576 << tiles[layerId].etaBin(clustersOnLayer.phi[
i]);
579 auto lastLayerPerSide = static_cast<unsigned int>(rhtools_.lastLayer(
false));
581 unsigned int maxLayer = 2 * lastLayerPerSide - 1;
582 if (layerId < lastLayerPerSide) {
584 maxLayer =
std::min(layerId + densitySiblingLayers_, lastLayerPerSide - 1);
587 maxLayer =
std::min(layerId + densitySiblingLayers_, maxLayer);
591 std::pair<int, int> i_nearestHigher(-1, -1);
592 for (
unsigned int currentLayer =
minLayer; currentLayer <= maxLayer; currentLayer++) {
593 const auto &tileOnLayer = tiles[currentLayer];
596 int etaBinMin =
std::max(tileOnLayer.etaBin(clustersOnLayer.eta[
i]) - etaWindow, 0);
597 int etaBinMax =
std::min(tileOnLayer.etaBin(clustersOnLayer.eta[
i]) + etaWindow, nEtaBin);
598 int phiBinMin = tileOnLayer.phiBin(clustersOnLayer.phi[
i]) -
phiWindow;
599 int phiBinMax = tileOnLayer.phiBin(clustersOnLayer.phi[
i]) +
phiWindow;
602 for (
int iphi_it = phiBinMin; iphi_it <= phiBinMax; ++iphi_it) {
603 int iphi = ((iphi_it % nPhiBin + nPhiBin) % nPhiBin);
606 <<
"Searching nearestHigher on " << currentLayer <<
" eta, phi: " <<
ieta <<
", " << iphi_it;
608 for (
auto otherClusterIdx : tileOnLayer[
offset +
iphi]) {
609 auto const &layerandSoa = layerIdx2layerandSoa[otherClusterIdx];
611 if ((layerandSoa.first == -1) && (layerandSoa.second == -1))
613 auto const &clustersOnOtherLayer = clusters_[layerandSoa.first];
615 clustersOnLayer.phi[
i],
616 clustersOnOtherLayer.eta[layerandSoa.second],
617 clustersOnOtherLayer.phi[layerandSoa.second]);
618 bool foundHigher = (clustersOnOtherLayer.rho[layerandSoa.second] > clustersOnLayer.rho[
i]) ||
619 (clustersOnOtherLayer.rho[layerandSoa.second] == clustersOnLayer.rho[
i] &&
620 clustersOnOtherLayer.layerClusterOriginalIdx[layerandSoa.second] >
621 clustersOnLayer.layerClusterOriginalIdx[
i]);
624 <<
"Searching nearestHigher on " << currentLayer
625 <<
" with rho: " << clustersOnOtherLayer.rho[layerandSoa.second]
626 <<
" on layerIdxInSOA: " << layerandSoa.first <<
", " << layerandSoa.second
627 <<
" with distance: " <<
sqrt(dist) <<
" foundHigher: " << foundHigher;
629 if (foundHigher && dist <= i_delta) {
633 i_nearestHigher = layerandSoa;
640 bool foundNearestHigherInEtaPhiCylinder = (i_delta !=
maxDelta);
643 <<
"i_delta: " <<
sqrt(i_delta) <<
" passed: " << foundNearestHigherInEtaPhiCylinder <<
" "
644 << i_nearestHigher.first <<
" " << i_nearestHigher.second;
646 if (foundNearestHigherInEtaPhiCylinder) {
647 clustersOnLayer.delta[
i] =
sqrt(i_delta);
648 clustersOnLayer.nearestHigher[
i] = i_nearestHigher;
653 clustersOnLayer.nearestHigher[
i] = {-1, -1};
658 template <
typename TILES>
660 const TILES &tiles,
const std::vector<std::pair<int, int>> &layerIdx2layerandSoa) {
661 unsigned int nTracksters = 0;
663 std::vector<std::pair<int, int>> localStack;
665 for (
unsigned int layer = 0;
layer < 2 * rhtools_.lastLayer();
layer++) {
666 auto &clustersOnLayer = clusters_[
layer];
667 unsigned int numberOfClusters = clustersOnLayer.x.size();
668 for (
unsigned int i = 0;
i < numberOfClusters;
i++) {
670 clustersOnLayer.clusterIndex[
i] = -1;
672 (clustersOnLayer.delta[
i] > criticalEtaPhiDistance_) && (clustersOnLayer.rho[
i] >= criticalDensity_);
673 bool isOutlier = (clustersOnLayer.delta[
i] > outlierMultiplier_ * criticalEtaPhiDistance_) &&
674 (clustersOnLayer.rho[
i] < criticalDensity_);
678 <<
"Found seed on Layer " <<
layer <<
" SOAidx: " <<
i <<
" assigned ClusterIdx: " << nTracksters;
680 clustersOnLayer.clusterIndex[
i] = nTracksters++;
681 clustersOnLayer.isSeed[
i] =
true;
682 localStack.emplace_back(
layer,
i);
683 }
else if (!isOutlier) {
684 auto [lyrIdx, soaIdx] = clustersOnLayer.nearestHigher[
i];
687 <<
"Found follower on Layer " <<
layer <<
" SOAidx: " <<
i <<
" attached to cluster on layer: " << lyrIdx
688 <<
" SOAidx: " << soaIdx;
690 clusters_[lyrIdx].followers[soaIdx].emplace_back(
layer,
i);
694 <<
"Found Outlier on Layer " <<
layer <<
" SOAidx: " <<
i <<
" with rho: " << clustersOnLayer.rho[
i]
695 <<
" and delta: " << clustersOnLayer.delta[
i];
702 while (!localStack.empty()) {
703 auto [lyrIdx, soaIdx] = localStack.back();
704 auto &thisSeed = clusters_[lyrIdx].followers[soaIdx];
705 localStack.pop_back();
708 for (
auto [follower_lyrIdx, follower_soaIdx] : thisSeed) {
710 clusters_[follower_lyrIdx].clusterIndex[follower_soaIdx] = clusters_[lyrIdx].clusterIndex[soaIdx];
712 localStack.emplace_back(follower_lyrIdx, follower_soaIdx);
718 template <
typename TILES>
720 iDesc.
add<
int>(
"algo_verbosity", 0);
721 iDesc.
add<
double>(
"criticalDensity", 4)->setComment(
"in GeV");
722 iDesc.
add<
int>(
"densitySiblingLayers", 3);
723 iDesc.
add<
double>(
"densityEtaPhiDistanceSqr", 0.0008);
724 iDesc.
add<
bool>(
"densityOnSameLayer",
false);
725 iDesc.
add<
double>(
"criticalEtaPhiDistance", 0.035);
726 iDesc.
add<
double>(
"outlierMultiplier", 2);
727 iDesc.
add<
int>(
"minNumLayerCluster", 5)->setComment(
"Not Inclusive");
729 iDesc.
add<
std::string>(
"eid_output_name_energy",
"output/regressed_energy");
730 iDesc.
add<
std::string>(
"eid_output_name_id",
"output/id_probabilities");
731 iDesc.
add<
double>(
"eid_min_cluster_energy", 1.);
732 iDesc.
add<
int>(
"eid_n_layers", 50);
733 iDesc.
add<
int>(
"eid_n_clusters", 10);