ATLAS Offline Software
Loading...
Searching...
No Matches
Egamma1_LArStrip_Fex.cxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4
5/*
6 This algorithm outputs Calorimeter strip data in the region of
7 eFex RoIs.
8*/
9
11#include "CaloEvent/CaloCell.h"
12
14#include "../IO/eEmNbhoodTOB.h"
15
17
18#include <fstream>
19#include <vector>
20#include <algorithm>
21#include <optional>
22
23namespace GlobalSim {
24
25 std::optional<std::vector<std::size_t>> wrap3(std::size_t center) {
26 if (center > 63) {
27 return std::optional<std::vector<std::size_t>>{};
28 }
29
30 if (center == 63) {
31 return std::make_optional(std::vector<std::size_t>({62ul, 63ul, 0ul}));
32 }
33
34 if (center == 0) {
35 return std::make_optional(std::vector<std::size_t>({63ul, 0ul, 1ul}));
36 }
37
38 return std::make_optional(std::vector<std::size_t>(
39 {center-1,
40 center,
41 center+1}));
42 }
43
44 Egamma1_LArStrip_Fex::Egamma1_LArStrip_Fex(const std::string& name, ISvcLocator* pSvcLocator ) :
45 AthReentrantAlgorithm(name, pSvcLocator){
46 }
47
48
50 ATH_MSG_INFO ("Initializing " << name());
51
52 CHECK(m_cellProducer.retrieve());
53 CHECK(m_roiAlgTool.retrieve());
54 CHECK(m_neighKey.initialize());
55 CHECK(m_eventInfoKey.initialize());
56
57
58 return StatusCode::SUCCESS;
59 }
60
61
62 StatusCode Egamma1_LArStrip_Fex::execute(const EventContext& ctx) const {
63 // Read in a CaloCell container. Ask producers to create
64 // vectors of CaloCells to be examined.
65
66 ATH_MSG_DEBUG ("Executing");
67
69 if(!eventInfo.isValid()) {
70 ATH_MSG_ERROR ("Error obtaining EventInfo object");
71 return StatusCode::FAILURE;
72 }
73
74 std::vector<const CaloCell*> cells;
75 CHECK(m_cellProducer->cells(cells, ctx));
76 ATH_MSG_DEBUG(cells.size() <<" cells read in");
77
78 std::vector<const xAOD::eFexEMRoI*> rois;
79 CHECK(m_roiAlgTool->RoIs(rois, ctx));
80 ATH_MSG_DEBUG(rois.size() << " RoI(s) read in");
81
82 // find cells in the neighborhood of RoIs.
83 // A neighborhood is a collection of CellData objects which
84 // contain cell eta, phi and Et.
85
86 auto neighborhoodTOBs = std::make_unique<IOBitwise::eEmNbhoodTOBContainer>();
87
88 CHECK(findNeighborhoods(rois, cells, *neighborhoodTOBs));
89
91
92 //BROKEN ATMa
94 if(m_dump || m_dumpTerse){
95 if (m_dump) {
96 CHECK(dumper.dump(name(), *eventInfo, *neighborhoodTOBs));
97 }
98
99 if (m_dumpTerse) {
100 CHECK(dumper.dumpTerse(name(), *eventInfo, *neighborhoodTOBs));
101 }
102 }
103
104 CHECK(h_neighborhoodTOBs.record(std::move(neighborhoodTOBs)));
105
107
108 return StatusCode::SUCCESS;
109 }
110
111 StatusCode
112 Egamma1_LArStrip_Fex::findNeighborhoods(const std::vector<const xAOD::eFexEMRoI*>& rois,
113 const std::vector<const CaloCell*>& cells,
114 IOBitwise::eEmNbhoodTOBContainer& neighborhoodTOBs) const{
115
116 for (const auto& roi : rois) {
117 CHECK(findNeighborhood(roi, cells, neighborhoodTOBs));
118 }
119
120 return StatusCode::SUCCESS;
121 }
122
123
124 StatusCode
126 const std::vector<const CaloCell*>& cells,
127 IOBitwise::eEmNbhoodTOBContainer& neighborhoodTOBs) const {
128
129 // this member function constructs an LArStripNeighborhood.
130 //
131 // A neighourhood is constructed from StripData objects constructed
132 // from CalCells (strips) in the vicinity of an EM RoI the following manner:
133 //
134 // - the cell in the vicinity of the RoI is identified. The neighboorhood
135 // strips are the strups centered on the maximum energy strip.
136 //
137 // In more detail:
138 // A rectangular eta-phi subset of all strips is made.
139 // This subset constains the cells needed for the maximum energy search
140 // and for any subsequent neigborhood strip selection.
141 //
142 // The eta window for the initial selection ismade with half-width of
143 // 0.05 + 8.5* DeltaEta where DeltaEta = 0.0031, the nominal strip width
144 // in eta. A cut-oof off eta = +-1.4 is applied in the selection.
145 //
146 // Phi selection consists of calculating a phi index for the the RoI,
147 // then requiring selected strips to be have a phi indix within +=1 of
148 // the RoI phi index.
149 //
150 // The strips used to identigy the max energy strip have the same phi index
151 // as the RoI, and eta that lies witun 0.1 in eta to the RoI.
152 //
153 // The strips selected for the Neighborhood have eta within +- 8.5 DeltaEta
154 // of the max energy strip, and +- 1 of the RoI strip phi Index.
155
156
157
158
159 auto cells_near_roi = std::vector<const CaloCell*>();
160
161 // lambda function to calculate the phi index of a eta-phi point
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));
165 return iphi > 63 ?
166 std::optional<std::size_t>() : std::make_optional(iphi);
167 };
168
169 // calculate roi phi index
170 auto roi_phi_index = *phi_ind(roi);
171
172 // obtain adjacent phi indices
173 auto roi_phi_indices = *wrap3(roi_phi_index);
174 for (const auto& i : roi_phi_indices) {
175 ATH_MSG_DEBUG("roi index " << i);
176 }
177
178 // container for strips close to RoI in eta
179 auto close = std::vector<std::vector<const CaloCell*>>(3);
180 for (auto& v :close) {v.reserve(100);}
181
182
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};
186
187
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);
190
191
192 // double loop. outer: all strips. inner: adjacent roi indices.
193 for (const auto& cell : cells) {
194 auto icell = *phi_ind(cell);
195 std::size_t pos{0};
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);
200 break;
201 }
202 ++pos;
203 }
204 }
205
206
207 for (const auto& v : close) {ATH_MSG_DEBUG("size close " << v.size());}
208
209 // select the cells within a a tower width of the RoI. Then find the
210 // cell in this selction with the highest energy
211 auto roi_cells = std::vector<const CaloCell*> ();
212 roi_cells.reserve(close[1].size());
213 std::copy_if(std::begin(close[1]),
214 std::end(close[1]),
215 std::back_inserter(roi_cells),
216 [&roi](const auto& c) {
217 return std::abs(c->eta() - roi->eta()) < half_deta_roi;
218 });
219
220
221 auto it = std::max_element(std::begin(roi_cells),
222 std::end(roi_cells),
223 [](const auto& l,const auto& r) {
224 return l->e() < r->e();
225 });
226
227 if (it == std::end(roi_cells)) {
228 ATH_MSG_ERROR("max_cell not found");
229 return StatusCode::FAILURE;
230 }
231
232 ATH_MSG_DEBUG("max cell pos "
233 << std::distance(std::begin(roi_cells), it)
234 << ' ' << **it);
235
236 // set up Cell containers for the neighborhood. One container
237 // per adjacent RoI phi indices.
238 auto neigh_cells = std::vector<std::vector<const CaloCell*>>(3);
239
240 const CaloCell* max_cell{*it};
241 const auto max_cell_eta = max_cell->eta();
242
243
244 for (std::size_t iv{0ul}; iv != close.size(); ++iv) {
245 std::copy_if(std::begin(close[iv]),
246 std::end(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;
250 });
251 }
252
253 auto max_neigh_cell_it = std::find(std::begin(neigh_cells[1]),
254 std::end(neigh_cells[1]),
255 max_cell);
256 if (max_neigh_cell_it == std::end(neigh_cells[1])){
257 ATH_MSG_ERROR("Lost the max cell");
258 return StatusCode::FAILURE;
259 }
260
261 auto max_neigh_cell_pos{std::distance(std::begin(neigh_cells[1]),
262 max_neigh_cell_it)};
263
264 auto toStripData = [](const auto& fromCells){
265 auto stripdata = std::vector<StripData>();
266 stripdata.reserve(fromCells.size());
267 std::transform(std::begin(fromCells),
268 std::end(fromCells),
269 back_inserter(stripdata),
270 [](const auto& c) {
271 return StripData(c->eta(),
272 c->phi(),
273 c->e());});
274 return stripdata;
275 };
276
277 auto low = toStripData(neigh_cells[0]);
278 auto center = toStripData(neigh_cells[1]);
279 auto high = toStripData(neigh_cells[2]);
280
281 Coords roi_c{roi->eta(), roi->phi()};
282 Coords cell_c{max_cell->eta(), max_cell->phi()};
283
284 LArStripNeighborhood neighborhood = LArStripNeighborhood(low, center, high, roi_c, cell_c, max_neigh_cell_pos);
285
286 neighborhoodTOBs.push_back(std::make_unique<IOBitwise::eEmNbhoodTOB>(*roi, neighborhood));
287
288 return StatusCode::SUCCESS;
289 }
290
291}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
An algorithm that can be simultaneously executed in multiple threads.
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
value_type push_back(value_type pElem)
Add an element to the end of the collection.
ToolHandle< eFexRoIAlgTool > m_roiAlgTool
ToolHandle< ICaloCellsProducer > m_cellProducer
virtual StatusCode execute(const EventContext &) const override
SG::WriteHandleKey< IOBitwise::eEmNbhoodTOBContainer > m_neighKey
StatusCode findNeighborhood(const xAOD::eFexEMRoI *, const std::vector< const CaloCell * > &, IOBitwise::eEmNbhoodTOBContainer &) const
StatusCode findNeighborhoods(const std::vector< const xAOD::eFexEMRoI * > &, const std::vector< const CaloCell * > &, IOBitwise::eEmNbhoodTOBContainer &) const
Egamma1_LArStrip_Fex(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
virtual StatusCode initialize() override
Gaudi::Property< bool > m_dumpTerse
Class to hold windows of LAr strip cells in a the neighbourhood of a eFexRoI.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
float eta() const
setter for the above
float phi() const
Seed supercell index within central tower (0 -> 3)
int r
Definition globals.cxx:22
DataVector< GlobalSim::IOBitwise::eEmNbhoodTOB > eEmNbhoodTOBContainer
Property: Defining the container object.
AlgTool that to test whether expected the TIP values generated by data supplied by eEmMultTestBench c...
std::optional< std::vector< std::size_t > > wrap3(std::size_t center)
std::pair< double, double > Coords
-event-from-file
eFexEMRoI_v1 eFexEMRoI
Define the latest version of the eFexEMRoI class.
Definition eFexEMRoI.h:17