25 std::optional<std::vector<std::size_t>>
wrap3(std::size_t center) {
27 return std::optional<std::vector<std::size_t>>{};
31 return std::make_optional(std::vector<std::size_t>({62ul, 63ul, 0ul}));
35 return std::make_optional(std::vector<std::size_t>({63ul, 0ul, 1ul}));
38 return std::make_optional(std::vector<std::size_t>(
126 const std::vector<const CaloCell*>& cells,
159 auto cells_near_roi = std::vector<const CaloCell*>();
162 auto phi_ind = [](
const auto& c) {
163 constexpr double dphi = std::numbers::pi/32;
164 std::size_t iphi = 32 + int(std::floor(c->phi()/dphi));
166 std::optional<std::size_t>() : std::make_optional(iphi);
170 auto roi_phi_index = *phi_ind(roi);
173 auto roi_phi_indices = *
wrap3(roi_phi_index);
174 for (
const auto& i : roi_phi_indices) {
179 auto close = std::vector<std::vector<const CaloCell*>>(3);
180 for (
auto& v :close) {v.reserve(100);}
183 constexpr double half_deta_roi{0.05};
184 constexpr double half_deta_neigh{8.5*0.0031};
185 constexpr double half_deta_fid{half_deta_roi + half_deta_neigh};
188 double etalim_low = std::max(roi->
eta()-half_deta_fid, -1.4);
189 double etalim_high = std::min(roi->
eta()+half_deta_fid, 1.4);
193 for (
const auto& cell : cells) {
194 auto icell = *phi_ind(cell);
196 for(
const auto& iroi : roi_phi_indices) {
197 auto c_eta = cell->eta();
198 if (iroi == icell and c_eta >= etalim_low and c_eta < etalim_high) {
199 close[pos].push_back(cell);
207 for (
const auto& v : close) {
ATH_MSG_DEBUG(
"size close " << v.size());}
211 auto roi_cells = std::vector<const CaloCell*> ();
212 roi_cells.reserve(close[1].size());
213 std::copy_if(std::begin(close[1]),
215 std::back_inserter(roi_cells),
216 [&roi](
const auto& c) {
217 return std::abs(c->eta() - roi->
eta()) < half_deta_roi;
221 auto it = std::max_element(std::begin(roi_cells),
223 [](
const auto& l,
const auto&
r) {
224 return l->e() <
r->e();
227 if (it == std::end(roi_cells)) {
229 return StatusCode::FAILURE;
233 << std::distance(std::begin(roi_cells), it)
238 auto neigh_cells = std::vector<std::vector<const CaloCell*>>(3);
241 const auto max_cell_eta = max_cell->eta();
244 for (std::size_t iv{0ul}; iv != close.size(); ++iv) {
245 std::copy_if(std::begin(close[iv]),
247 std::back_inserter(neigh_cells[iv]),
248 [&max_cell_eta, &half_deta_neigh](
const auto& c){
249 return abs(c->eta()-max_cell_eta) < half_deta_neigh;
253 auto max_neigh_cell_it = std::find(std::begin(neigh_cells[1]),
254 std::end(neigh_cells[1]),
256 if (max_neigh_cell_it == std::end(neigh_cells[1])){
258 return StatusCode::FAILURE;
261 auto max_neigh_cell_pos{std::distance(std::begin(neigh_cells[1]),
264 auto toStripData = [](
const auto& fromCells){
265 auto stripdata = std::vector<StripData>();
266 stripdata.reserve(fromCells.size());
267 std::transform(std::begin(fromCells),
269 back_inserter(stripdata),
277 auto low = toStripData(neigh_cells[0]);
278 auto center = toStripData(neigh_cells[1]);
279 auto high = toStripData(neigh_cells[2]);
282 Coords cell_c{max_cell->eta(), max_cell->phi()};
286 neighborhoodTOBs.
push_back(std::make_unique<IOBitwise::eEmNbhoodTOB>(*roi, neighborhood));
288 return StatusCode::SUCCESS;