133 const std::vector<const CaloCell*>& cells,
164 auto cells_near_roi = std::vector<const CaloCell*>();
169 auto phi_ind = [](
const auto& c) {
170 constexpr double dphi = std::numbers::pi/32;
171 std::size_t iphi = 32 + int(std::floor(c->phi()/dphi));
173 std::optional<std::size_t>() : std::make_optional(iphi);
176 const std::optional<std::size_t> roi_phi_index_opt = phi_ind(roi);
177 if (not roi_phi_index_opt.has_value()) {
178 return StatusCode::FAILURE;
180 const std::size_t roi_phi_index = *roi_phi_index_opt;
183 auto roi_phi_indices = *
wrap5(roi_phi_index);
186 auto close = std::deque<std::vector<const CaloCell*>>(5);
187 for (
auto& v :close) {v.reserve(100);}
190 constexpr double half_deta_roi{0.05};
192 constexpr double half_deta_neigh{8.5*0.003125};
194 constexpr double half_deta_fid{half_deta_roi + half_deta_neigh};
197 double etalim_low = std::max(roi->
eta()-half_deta_fid, -1.4);
198 double etalim_high = std::min(roi->
eta()+half_deta_fid, 1.4);
202 for (
const auto& cell : cells) {
203 auto icell = *phi_ind(cell);
205 for(
const auto& iroi : roi_phi_indices) {
206 auto c_eta = cell->eta();
207 if (iroi == icell and c_eta >= etalim_low and c_eta < etalim_high) {
208 float totalNoise = noise.getNoise(cell->ID(), cell->gain());
209 if(totalNoise <= 0.0) totalNoise = 0.001;
210 float sigma = cell->energy() / totalNoise;
212 close[pos].push_back(cell);
214 close[pos].push_back(
new CaloCell(cell->caloDDE(), 0.0, cell->time(), cell->quality(), cell->provenance(), cell->gain()));
224 auto roi_cells = std::deque<std::vector<const CaloCell*>>(5);
225 auto roi_max_it = std::vector<std::vector<const CaloCell*>::iterator>();
227 for (std::size_t i{0ul}; i != close.size(); ++i) {
228 roi_cells[i].reserve(close[i].size());
229 std::copy_if(std::begin(close[i]),
231 std::back_inserter(roi_cells[i]),
232 [&roi](
const auto& c) {
233 return std::abs(c->eta() - roi->
eta()) < half_deta_roi;
237 auto it = std::max_element(std::begin(roi_cells[i]),
238 std::end(roi_cells[i]),
239 [](
const auto& l,
const auto&
r) {
240 return l->e() <
r->e();
244 << std::distance(std::begin(roi_cells[i]), it)
246 roi_max_it.push_back(it);
250 auto max_row = std::max_element(std::begin(roi_max_it),
251 std::end(roi_max_it),
252 [](
const auto& l,
const auto&
r) {
253 return (*l)->e() < (*r)->e();
256 int max_row_pos = std::distance( roi_max_it.begin(), max_row );
259 <<
' ' << std::distance( roi_max_it.begin(), max_row )+1);
288 auto neigh_cells = std::vector<std::vector<const CaloCell*>>(3);
290 const CaloCell* max_cell{*(*max_row)};
291 const auto max_cell_eta = max_cell->eta();
295 for (std::size_t iv{0ul}; iv != close.size(); ++iv) {
296 std::copy_if(std::begin(close[iv]),
298 std::back_inserter(neigh_cells[iv]),
299 [&max_cell_eta, &half_deta_neigh](
const auto& c){
300 return abs(c->eta()-max_cell_eta) < half_deta_neigh;
306 auto max_neigh_cell_it = std::find(std::begin(neigh_cells[1]),
307 std::end(neigh_cells[1]),
309 if (max_neigh_cell_it == std::end(neigh_cells[1])){
311 return StatusCode::FAILURE;
314 auto max_neigh_cell_pos{std::distance(std::begin(neigh_cells[1]),
319 auto toStripData = [](
const auto& fromCells){
320 auto stripdata = std::vector<StripData>();
321 stripdata.reserve(fromCells.size());
322 std::transform(std::begin(fromCells),
324 back_inserter(stripdata),
332 auto low = toStripData(neigh_cells[0]);
333 auto center = toStripData(neigh_cells[1]);
334 auto high = toStripData(neigh_cells[2]);
337 Coords cell_c{max_cell->eta(), max_cell->phi()};
343 neighborhoodTOBs.
push_back(std::make_unique<IOBitwise::eEmNbhoodTOB>(*roi, neighborhood));
345 return StatusCode::SUCCESS;