31 const auto& inputClusters = *h_input;
33 ATH_MSG_DEBUG(
"Read in " << inputClusters.size() <<
" input clusters/towers");
40 int neta = std::max(
static_cast<int>((maxEta - minEta) /
m_gridEtaSize + 0.5), 1);
41 double deta = (maxEta - minEta) / neta;
44 double dphi =
twopi / nphi;
46 std::vector<double> eta_bins(neta + 1);
47 const double minPhi = -
M_PI;
48 std::vector<double> phi_bins(nphi + 1);
50 for (
int i = 0; i <= neta; ++i) {
51 eta_bins[i] = minEta + i * deta;
53 for (
int i = 0; i <= nphi; ++i) {
54 phi_bins[i] = minPhi + i * dphi;
58 std::vector<std::vector<std::vector<const xAOD::CaloCluster*>>>
59 grid(neta, std::vector<std::vector<const xAOD::CaloCluster*>>(nphi));
61 for (
const auto* cluster : inputClusters) {
62 double eta = cluster->eta();
63 double phi = cluster->phi();
65 int eta_bin =
static_cast<int>(
66 std::distance(eta_bins.begin(),
67 std::upper_bound(eta_bins.begin(), eta_bins.end(),
eta))) - 1;
68 int phi_bin =
static_cast<int>(
69 std::distance(phi_bins.begin(),
70 std::upper_bound(phi_bins.begin(), phi_bins.end(),
phi))) - 1;
72 if (eta_bin >= 0 && eta_bin < neta && phi_bin >= 0 && phi_bin < nphi) {
73 grid[eta_bin][phi_bin].push_back(cluster);
80 int nBands = (neta + bandWidth - 1) / bandWidth;
81 std::vector<double> medianPerBand(nBands, 0.0);
83 for (
int band = 0; band < nBands; ++band) {
84 std::vector<double> maxPtValues;
85 int etaStart = band * bandWidth;
86 int etaEnd = std::min(etaStart + bandWidth, neta);
88 for (
int j = 0; j < nphi; ++j) {
89 for (
int i = etaStart; i < etaEnd; ++i) {
90 const auto& cell = grid[i][j];
92 double maxPt = (*std::max_element(
93 cell.begin(), cell.end(),
96 return a->pt() < b->pt();
98 maxPtValues.push_back(maxPt);
100 maxPtValues.push_back(0.0);
105 if (!maxPtValues.empty()) {
106 std::sort(maxPtValues.begin(), maxPtValues.end());
107 size_t mid = maxPtValues.size() / 2;
108 if (maxPtValues.size() % 2 == 0) {
109 medianPerBand[band] =
110 (maxPtValues[mid - 1] + maxPtValues[mid]) / 2.0;
112 medianPerBand[band] = maxPtValues[mid];
117 <<
" [" << eta_bins[etaStart] <<
", "
118 << eta_bins[etaEnd] <<
")"
119 <<
": median pT threshold = " << medianPerBand[band]);
126 std::make_unique<xAOD::CaloClusterContainer>(),
127 std::make_unique<xAOD::CaloClusterAuxContainer>()));
131 for (
int i = 0; i < neta; ++i) {
132 int band = i / bandWidth;
135 for (
int j = 0; j < nphi; ++j) {
136 for (
const auto* cluster : grid[i][j]) {
137 double weight = (cluster->pt() >
threshold) ? 1.0 : 0.0;
139 auto* out = h_output->push_back(
140 std::make_unique<xAOD::CaloCluster>());
141 out->setE(cluster->e() * weight);
142 out->setEta(cluster->eta());
143 out->setPhi(cluster->phi());
144 out->setM(cluster->m());
150 <<
" clusters after EtaSoftKiller");
152 return StatusCode::SUCCESS;