ATLAS Offline Software
gFexTower2SCellDecorator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 //***************************************************************************
6 // gFexTower2SCellDecorator - description
7 // -------------------
8 // This reentrant algorithm is meant to decorate the gFEX Towers (input data and simulation) with the corresponding matching set of SuperCell from LAr
9 // Information about SCellContainer objetcs are in:
10 // - https://gitlab.cern.ch/atlas/athena/-/blob/22.0/Calorimeter/CaloEvent/CaloEvent/CaloCell.h
11 //
12 // begin : 27 01 2023
13 // email : cecilia.tosciri@cern.ch
14 //***************************************************************************/
15 
16 
19 
20 #include <iostream>
21 #include <fstream>
22 #include <sstream>
23 #include <algorithm>
24 #include <string>
25 #include <stdio.h>
26 
27 namespace LVL1 {
28 
30 
32  ATH_MSG_INFO( "L1CaloFEXTools/gFexTower2SCellDecorator::initialize()");
34  ATH_CHECK( m_triggerTowerKey.initialize() );
35  ATH_CHECK( m_gTowersReadKey.initialize() );
36  ATH_CHECK( m_gSCellEtdecorKey.initialize() );
37  ATH_CHECK( m_gSCellEtadecorKey.initialize() );
38  ATH_CHECK( m_gSCellPhidecorKey.initialize() );
39  ATH_CHECK( m_gSCellIDdecorKey.initialize() );
40  ATH_CHECK( m_gSCellSampledecorKey.initialize() );
41  ATH_CHECK( m_gtowerEtMeVdecorKey.initialize() );
42  ATH_CHECK( m_gTowerEtdecorKey.initialize() );
43  ATH_CHECK( m_gTileEtMeVdecorKey.initialize() );
44  ATH_CHECK( m_gTileEtadecorKey.initialize() );
45  ATH_CHECK( m_gTilePhidecorKey.initialize() );
46  ATH_CHECK( m_gTileIDdecorKey.initialize() );
47 
48 
49  //Reading from CVMFS Trigger Tower and their corresponding SCell ID
52 
53  return StatusCode::SUCCESS;
54 }
55 
56 StatusCode gFexTower2SCellDecorator::execute(const EventContext& ctx) const {
57 
58  //Reading the Scell container
59  SG::ReadHandle<CaloCellContainer> ScellContainer(m_SCellKey, ctx);
60  if(!ScellContainer.isValid()) {
61  ATH_MSG_FATAL("Could not retrieve collection " << ScellContainer.key() );
62  return StatusCode::FAILURE;
63  }
64 
65  // Reading the TriggerTower container
67  if(!triggerTowerContainer.isValid()) {
68  ATH_MSG_FATAL("Could not retrieve collection " << triggerTowerContainer.key() );
69  return StatusCode::FAILURE;
70  }
71 
72  //Reading the gTower container
74  if(!gTowerContainer.isValid()) {
75  ATH_MSG_FATAL("Could not retrieve collection " << gTowerContainer.key() );
76  return StatusCode::FAILURE;
77  }
78 
79  if(ScellContainer->empty() || triggerTowerContainer->empty() || gTowerContainer->empty() ){
80  ATH_MSG_WARNING("Nothing to decorate here, at least one container is empty. ScellContainer.size="<<ScellContainer->size() << " or gTowerContainer.size=" << gTowerContainer->size() << " or triggerTowerContainer.size=" << triggerTowerContainer->size() );
81  return StatusCode::SUCCESS;
82  }
83 
84  // building Scell ID pointers
85  std::unordered_map< uint64_t, const CaloCell*> map_ScellID2ptr;
86 
87  for(const CaloCell* scell : *ScellContainer){
88  const uint64_t ID = scell->ID().get_compact();
89  map_ScellID2ptr[ID] = scell;
90  }
91 
92  // building Tile ID pointers
93  std::unordered_map< uint32_t, const xAOD::TriggerTower*> map_TileID2ptr;
94 
95  for(const xAOD::TriggerTower* tower : *triggerTowerContainer){
96 
97  // keeping just
98  if(std::abs(tower->eta())>1.5 || tower->sampling()!=1) continue;
99  map_TileID2ptr[tower->coolId()]=tower;
100  }
101 
102  //Setup Decorator Handlers
114 
115  //looping over the gTowers to decorate them
116  for(const xAOD::gFexTower* gTower : *gTowerContainer){
117 
118  uint32_t gFexID = gTower->gFEXtowerID();
119  uint16_t gFexEt = gTower->towerEt();
120  uint16_t scSumEtEncoded = 0;
121 
122  std::vector<float> scEt;
123  std::vector<float> scEta;
124  std::vector<float> scPhi;
125  std::vector<int> scID;
126  std::vector<int> scSample;
127 
128  std::vector<int> TileEt;
129  std::vector<float> TileEta;
130  std::vector<float> TilePhi;
131  std::vector<int> TileID;
132 
133  //check that the gFEX Tower ID exists in the map
134  auto it_TTower2SCells = (m_map_TTower2SCells).find(gFexID);
135  if(it_TTower2SCells == (m_map_TTower2SCells).end()) {
136  ATH_MSG_ERROR("ID: "<<gFexID<< " not found on map m_map_TTower2SCells");
137  return StatusCode::FAILURE;
138  }
139 
140  for (auto const& SCellID : it_TTower2SCells->second ) {
141 
142  //check that the SCell Identifier exists in the map
143  auto it_ScellID2ptr = map_ScellID2ptr.find(SCellID);
144  if(it_ScellID2ptr == map_ScellID2ptr.end()) {
145  ATH_MSG_WARNING("Scell ID: 0x"<<std::hex<<(SCellID >> 32)<<std::dec<< " not found on map map_ScellID2ptr");
146 
147  scEt.push_back(-9999);
148  scEta.push_back(-99);
149  scPhi.push_back(-99);
150  // bit shifting to get only a 32 bit number
151  scID.push_back( SCellID >> 32 );
152  scSample.push_back(-99);
153 
154  }
155 
156  else{
157 
158  const CaloCell* myCell = it_ScellID2ptr->second;
159  float et = myCell->et();
160  const CaloSampling::CaloSample sample = (myCell)->caloDDE()->getSampling();
161 
162 
163  // The following is to check if any SuperCells from data are permanently masked, and if so the masking is applied
164  int prov = (myCell)->provenance();
165  int SCprov = prov&0xFFF;
166  bool isMasked = (SCprov&0x80)==0x80;//prov looks like 0000 0000 1000 0000 if the cell is masked
167  if (isMasked) et=0;
168 
169  scEt.push_back(et);
170  scEta.push_back(myCell->eta());
171  scPhi.push_back(myCell->phi());
172  // bit shifting to get only a 32 bit number
173  scID.push_back( SCellID >> 32 );
174  scSample.push_back(sample);
175 
176  }
177  }
178 
179  //emulated encoded Et
180  float tmpSCellEt = 0;
181  for(const auto& tmpet : scEt){
182  tmpSCellEt += tmpet;
183  }
184 
185  scSumEtEncoded = gFEXCompression::compress( tmpSCellEt );
186 
187  // Decorating the tower with the corresponding information
188  gTowerSCellEt (*gTower) = scEt;
189  gTowerSCellEta (*gTower) = scEta;
190  gTowerSCellPhi (*gTower) = scPhi;
191  gTowerSCellID (*gTower) = scID;
192  gTowerSCellSample (*gTower) = scSample;
193  gTowerEtMeV (*gTower) = gFexEt * 200;
194  gTowerSCEtEncoded (*gTower) = scSumEtEncoded;
195 
196 
197  auto it_TTower2Tile = (m_map_TTower2Tile).find(gFexID);
198  //check that the gFEX Tower ID exists in the map
199  if(it_TTower2Tile == (m_map_TTower2Tile).end()) {
200  continue;
201  }
202 
203  for (auto const& TileTowerID : it_TTower2Tile->second ) {
204 
205  //check that the Tile Identifier exists in the map
206  auto it_TileID2ptr = map_TileID2ptr.find(TileTowerID);
207  if(it_TileID2ptr == map_TileID2ptr.end()) {
208 
209  ATH_MSG_WARNING("Tile ID: "<<TileID<<std::dec<< " not found on map map_TileID2ptr");
210 
211  TileEt.push_back(-9999);
212  TileEta.push_back(-99);
213  TilePhi.push_back(-99);
214  TileID.push_back(-99);
215  }
216  else{
217 
218  const xAOD::TriggerTower* tileTower = it_TileID2ptr->second;
219  TileEt.push_back(tileTower->jepET()*1000); //1000 is the Tile energy resolution
220  TileEta.push_back(tileTower->eta());
221  float phi = tileTower->phi() < M_PI ? tileTower->phi() : tileTower->phi()-2*M_PI;
222  TilePhi.push_back(phi);
223  TileID.push_back(TileTowerID);
224 
225  }
226 
227 
228  }
229 
230 
231  // Decorating the tower with the corresponding information
232  gTowerTileEt (*gTower) = TileEt;
233  gTowerTileID (*gTower) = TileID;
234  gTowerTileEta (*gTower) = TileEta;
235  gTowerTilePhi (*gTower) = TilePhi;
236  }
237 
238  // Return gracefully
239  return StatusCode::SUCCESS;
240 }
241 
242 
244 
245  std::string myline;
246  //open file with ifstream
247  std::ifstream myfile(fileName);
248 
249  if ( !myfile.is_open() ){
250  ATH_MSG_FATAL("Could not open file:" << fileName);
251  return StatusCode::FAILURE;
252  }
253 
254  //loading the mapping information into an unordered_map <Fex Tower ID, vector of SCell IDs>
255  while ( std::getline (myfile, myline) ) {
256  std::vector<uint64_t> SCellvector;
257  SCellvector.clear();
258 
259  //removing the header of the file (it is just information!)
260  myline.erase(myline.begin(), std::find_if(myline.begin(), myline.end(), [](int ch) {
261  return !std::isspace(ch);
262  }));
263  if(myline[0] == '#') continue;
264 
265  //Splitting myline in different substrings
266  std::stringstream oneSCellID(myline);
267 
268  //reading elements
269  std::string substr = "";
270  int TTID = 0;
271  int elem = 0;
272 
273  while(std::getline(oneSCellID, substr, ' '))
274  {
275  ++elem;
276  if(elem == 1){
277  TTID = std::stoi(substr);
278  }
279  else{
280  //Check if it looks like a SCell Identifier
281  if(isBadSCellID(substr)){
282  return StatusCode::FAILURE;
283  }
284 
285  // converts hex number to unsigned long long int
286  uint64_t scid_uint64 = std::strtoull(substr.c_str(), nullptr, 0);
287 
288  //empty slots are filled with 0xffffffffffffffff
289  if(scid_uint64 == 0xffffffffffffffff) continue;
290 
291  SCellvector.push_back(scid_uint64);
292  }
293  }
294 
295  m_map_TTower2SCells[TTID] = SCellvector;
296 
297  }
298  myfile.close();
299 
300  return StatusCode::SUCCESS;
301 }
302 
303 bool gFexTower2SCellDecorator::isBadSCellID(const std::string& ID) const{
304 
305  // does it start with "0x"?, if so then is a GOOD SCell ID!
306  if (ID.find("0x") == std::string::npos) {
307  ATH_MSG_ERROR("Invalid SuperCell ID " << ID << ". Expecting hexadecimal number on the mapping file");
308  return true;
309  }
310  return false;
311 }
312 
313 
315 
316  std::string myline;
317 
318  //openning file with ifstream
319  std::ifstream myfile(fileName);
320 
321  if ( !myfile.is_open() ){
322  ATH_MSG_FATAL("Could not open file:" << fileName);
323  return StatusCode::FAILURE;
324  }
325 
326  //loading the mapping information into an unordered_map <Fex Tower ID, vector of SCell IDs>
327  while ( std::getline (myfile, myline) ) {
328 
329  std::vector<uint32_t> Tilevector;
330  Tilevector.clear();
331  //removing the header of the file
332  myline.erase(myline.begin(), std::find_if(myline.begin(), myline.end(), [](int ch) {
333  return !std::isspace(ch);
334  }));
335  if(myline[0] == '#') continue;
336 
337  //Splitting myline in different substrings
338  std::stringstream oneTileID(myline);
339 
340  //reading elements
341  std::string substr = "";
342  int gTowerID = 0;
343  int elem = 0;
344 
345  while(std::getline(oneTileID, substr, ' ')){
346  ++elem;
347  if(elem == 1){
348  gTowerID = std::stoi(substr);
349  }
350  else{
351  uint32_t tileid_uint32 = std::strtoul(substr.c_str(), nullptr, 0);
352  Tilevector.push_back(tileid_uint32);
353  }
354  }
355 
356  m_map_TTower2Tile[gTowerID] = Tilevector;
357 
358  }
359  myfile.close();
360 
361  return StatusCode::SUCCESS;
362 }
363 
364 
365 
366 
367 
368 }
PathResolver::find_calib_file
static std::string find_calib_file(const std::string &logical_file_name)
Definition: PathResolver.cxx:384
LVL1::gFexTower2SCellDecorator::ReadSCfromFile
StatusCode ReadSCfromFile(const std::string &)
Definition: gFexTower2SCellDecorator.cxx:243
et
Extra patterns decribing particle interation process.
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
sendEI_SPB.ch
ch
Definition: sendEI_SPB.py:35
CaloCell::phi
virtual double phi() const override final
get phi (through CaloDetDescrElement)
Definition: CaloCell.h:359
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ID
std::vector< Identifier > ID
Definition: CalibHitIDCheck.h:24
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
xAOD::TriggerTower_v2::phi
virtual double phi() const final
The azimuthal angle ( ) of the particle.
Definition: TriggerTower_v2.cxx:222
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
LVL1::gFEXCompression::compress
static unsigned int compress(float Energy)
Compress data.
Definition: gFEXCompression.cxx:20
LVL1::gFexTower2SCellDecorator::m_gSCellIDdecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gSCellIDdecorKey
Definition: gFexTower2SCellDecorator.h:50
LVL1::gFexTower2SCellDecorator::m_gFEX2Tilemapping
Gaudi::Property< std::string > m_gFEX2Tilemapping
Definition: gFexTower2SCellDecorator.h:62
LVL1::gTower
The gTower class is an interface object for gFEX trigger algorithms The purposes are twofold:
Definition: gTower.h:38
M_PI
#define M_PI
Definition: ActiveFraction.h:11
LVL1::gFexTower2SCellDecorator::m_gTileIDdecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gTileIDdecorKey
Definition: gFexTower2SCellDecorator.h:57
gFexTower2SCellDecorator.h
LVL1::gFexTower2SCellDecorator::m_gSCellEtdecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gSCellEtdecorKey
Definition: gFexTower2SCellDecorator.h:47
LVL1::gFexTower2SCellDecorator::m_gTowersReadKey
SG::ReadHandleKey< xAOD::gFexTowerContainer > m_gTowersReadKey
Definition: gFexTower2SCellDecorator.h:44
LVL1
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition: ICMMCPHitsCnvTool.h:18
LVL1::gFexTower2SCellDecorator::initialize
virtual StatusCode initialize() override
Function initialising the algorithm.
Definition: gFexTower2SCellDecorator.cxx:31
gFEXCompression.h
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
LVL1::gFexTower2SCellDecorator::m_gSCellPhidecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gSCellPhidecorKey
Definition: gFexTower2SCellDecorator.h:49
LVL1::gFexTower2SCellDecorator::m_gtowerEtMeVdecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gtowerEtMeVdecorKey
Definition: gFexTower2SCellDecorator.h:52
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
FullCPAlgorithmsTest_eljob.sample
sample
Definition: FullCPAlgorithmsTest_eljob.py:100
LVL1::gFexTower2SCellDecorator::m_gTileEtMeVdecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gTileEtMeVdecorKey
Definition: gFexTower2SCellDecorator.h:54
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
TileID
Helper class for TileCal offline identifiers.
Definition: TileID.h:68
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:99
LVL1::gFexTower2SCellDecorator::m_gTowerEtdecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gTowerEtdecorKey
Definition: gFexTower2SCellDecorator.h:53
xAOD::TriggerTower_v2
Description of TriggerTower_v2.
Definition: TriggerTower_v2.h:49
xAOD::TriggerTower_v2::eta
virtual double eta() const final
The pseudorapidity ( ) of the particle.
Definition: TriggerTower_v2.cxx:210
CaloCell::et
virtual double et() const override final
get et
Definition: CaloCell.h:407
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::gFexTower_v1
Class describing input data of a LVL1 eFEX.
Definition: gFexTower_v1.h:22
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
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
LVL1::gFexTower2SCellDecorator::m_gTileEtadecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gTileEtadecorKey
Definition: gFexTower2SCellDecorator.h:55
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
LVL1::gTowerContainer
Definition: gTowerContainer.h:25
TrigConf::name
Definition: HLTChainList.h:35
LVL1::gFexTower2SCellDecorator::isBadSCellID
bool isBadSCellID(const std::string &) const
Definition: gFexTower2SCellDecorator.cxx:303
SG::VarHandleBase::key
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:64
LVL1::gFexTower2SCellDecorator::m_gSCellSampledecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gSCellSampledecorKey
Definition: gFexTower2SCellDecorator.h:51
LVL1::gFexTower2SCellDecorator::execute
virtual StatusCode execute(const EventContext &) const override
Function executing the algorithm.
Definition: gFexTower2SCellDecorator.cxx:56
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LVL1::gFexTower2SCellDecorator::m_map_TTower2Tile
std::unordered_map< uint32_t, std::vector< uint32_t > > m_map_TTower2Tile
Definition: gFexTower2SCellDecorator.h:69
LVL1::gFexTower2SCellDecorator::m_gSCellEtadecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gSCellEtadecorKey
Definition: gFexTower2SCellDecorator.h:48
LVL1::gFexTower2SCellDecorator::ReadTilefromFile
StatusCode ReadTilefromFile(const std::string &)
Definition: gFexTower2SCellDecorator.cxx:314
LVL1::gFexTower2SCellDecorator::m_triggerTowerKey
SG::ReadHandleKey< xAOD::TriggerTowerContainer > m_triggerTowerKey
Definition: gFexTower2SCellDecorator.h:39
LVL1::gFexTower2SCellDecorator::m_map_TTower2SCells
std::unordered_map< uint32_t, std::vector< uint64_t > > m_map_TTower2SCells
Definition: gFexTower2SCellDecorator.h:68
LVL1::gFexTower2SCellDecorator::m_gTilePhidecorKey
SG::WriteDecorHandleKey< xAOD::gFexTowerContainer > m_gTilePhidecorKey
Definition: gFexTower2SCellDecorator.h:56
LVL1::gFexTower2SCellDecorator::m_gFEX2Scellmapping
Gaudi::Property< std::string > m_gFEX2Scellmapping
Definition: gFexTower2SCellDecorator.h:61
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAOD::TriggerTower_v2::jepET
uint8_t jepET() const
get jepET from peak of lut_jep
Definition: TriggerTower_v2.cxx:186
LVL1::gFexTower2SCellDecorator::m_SCellKey
SG::ReadHandleKey< CaloCellContainer > m_SCellKey
Definition: gFexTower2SCellDecorator.h:36
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
CaloCell::eta
virtual double eta() const override final
get eta (through CaloDetDescrElement)
Definition: CaloCell.h:366
LVL1::gFexTower2SCellDecorator::gFexTower2SCellDecorator
gFexTower2SCellDecorator(const std::string &name, ISvcLocator *svc)
Definition: gFexTower2SCellDecorator.cxx:29