ATLAS Offline Software
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 
10 #include "Egamma1_LArStrip_Fex.h"
11 #include "CaloEvent/CaloCell.h"
12 
13 #include "../IO/LArStripNeighborhoodDumper.h"
14 #include "../IO/eEmNbhoodTOB.h"
15 
17 
18 #include <fstream>
19 #include <vector>
20 #include <algorithm>
21 #include <optional>
22 
23 namespace 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());
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::IeEmNbhoodTOBContainer>();
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 
106  ATH_MSG_INFO(evtStore()->dump());
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::IeEmNbhoodTOBContainer& 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::IeEmNbhoodTOBContainer& 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 }
beamspotman.r
def r
Definition: beamspotman.py:672
GlobalSim::wrap3
std::optional< std::vector< std::size_t > > wrap3(std::size_t center)
Definition: Egamma1_LArStrip_Fex.cxx:25
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:281
GlobalSim::StripData
Definition: Global/GlobalSimulation/src/IO/StripData.h:16
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
WriteCellNoiseToCool.icell
icell
Definition: WriteCellNoiseToCool.py:339
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
GlobalSim::Egamma1_LArStrip_Fex::m_cellProducer
ToolHandle< ICaloCellsProducer > m_cellProducer
Definition: Egamma1_LArStrip_Fex.h:47
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
skel.it
it
Definition: skel.GENtoEVGEN.py:407
GlobalSim::Egamma1_LArStrip_Fex::initialize
virtual StatusCode initialize() override
Definition: Egamma1_LArStrip_Fex.cxx:49
CaloCell.h
GlobalSim::Coords
std::pair< double, double > Coords
Definition: LArStripNeighborhood.h:25
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:157
xAOD::eFexEMRoI_v1
Class describing a LVL1 eFEX EM region of interest.
Definition: eFexEMRoI_v1.h:33
pi
#define pi
Definition: TileMuonFitter.cxx:65
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:92
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
GlobalSim::Egamma1_LArStrip_Fex::findNeighborhood
StatusCode findNeighborhood(const xAOD::eFexEMRoI *, const std::vector< const CaloCell * > &, IOBitwise::IeEmNbhoodTOBContainer &) const
Definition: Egamma1_LArStrip_Fex.cxx:125
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
GlobalSim
AlgTool that to test whether expected the TIP values generated by data supplied by eEmMultTestBench c...
Definition: dump.h:8
GlobalSim::Egamma1_LArStrip_Fex::m_dump
Gaudi::Property< bool > m_dump
Definition: Egamma1_LArStrip_Fex.h:61
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
GlobalSim::Egamma1_LArStrip_Fex::m_eventInfoKey
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
Definition: Egamma1_LArStrip_Fex.h:39
GlobalSim::Egamma1_LArStrip_Fex::Egamma1_LArStrip_Fex
Egamma1_LArStrip_Fex(const std::string &name, ISvcLocator *pSvcLocator)
Definition: Egamma1_LArStrip_Fex.cxx:44
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
GlobalSim::Egamma1_LArStrip_Fex::findNeighborhoods
StatusCode findNeighborhoods(const std::vector< const xAOD::eFexEMRoI * > &, const std::vector< const CaloCell * > &, IOBitwise::IeEmNbhoodTOBContainer &) const
Definition: Egamma1_LArStrip_Fex.cxx:112
AnalysisUtils::copy_if
Out copy_if(In first, const In &last, Out res, const Pred &p)
Definition: IFilterUtils.h:30
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
detail::ul
unsigned long ul
Definition: PrimitiveHelpers.h:46
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector
Derived DataVector<T>.
Definition: DataVector.h:795
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Egamma1_LArStrip_Fex.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
xAOD::eFexEMRoI_v1::eta
float eta() const
setter for the above
GlobalSim::Egamma1_LArStrip_Fex::m_dumpTerse
Gaudi::Property< bool > m_dumpTerse
Definition: Egamma1_LArStrip_Fex.h:67
EventInfo.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:16
GlobalSim::dump
void dump(const std::string &fn, const T &t)
python.PyAthena.v
v
Definition: PyAthena.py:154
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
GlobalSim::LArStripNeighborhoodDumper
Definition: LArStripNeighborhoodDumper.h:14
TriggerTest.rois
rois
Definition: TriggerTest.py:23
xAOD::eFexEMRoI_v1::phi
float phi() const
Seed supercell index within central tower (0 -> 3)
GlobalSim::Egamma1_LArStrip_Fex::m_roiAlgTool
ToolHandle< eFexRoIAlgTool > m_roiAlgTool
Definition: Egamma1_LArStrip_Fex.h:56
GlobalSim::Egamma1_LArStrip_Fex::m_neighKey
SG::WriteHandleKey< IOBitwise::IeEmNbhoodTOBContainer > m_neighKey
Definition: Egamma1_LArStrip_Fex.h:74
GlobalSim::LArStripNeighborhood
Class to hold windows of LAr strip cells in a the neighbourhood of a eFexRoI.
Definition: LArStripNeighborhood.h:37
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
python.compressB64.c
def c
Definition: compressB64.py:93
GlobalSim::Egamma1_LArStrip_Fex::execute
virtual StatusCode execute(const EventContext &) const override
Definition: Egamma1_LArStrip_Fex.cxx:62