31 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, T> >
33 const EventContext& ctx,
36 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, T> >
h;
51 ATH_MSG_INFO(
"Initializing L1CaloFEXTools/jFexTower2SCellDecorator algorithm with name: "<<
name());
84 return StatusCode::SUCCESS;
93 return StatusCode::FAILURE;
98 if(!triggerTowerContainer.
isValid()) {
99 ATH_MSG_ERROR(
"Could not retrieve collection " << triggerTowerContainer.
key() );
100 return StatusCode::FAILURE;
107 return StatusCode::FAILURE;
111 ATH_MSG_DEBUG(
"Nothing to decorate here, at least one container is empty. ScellContainer.size="<<ScellContainer->
size() <<
" or jTowerContainer.size=" <<
jTowerContainer->
size() <<
" or triggerTowerContainer.size=" << triggerTowerContainer->
size() );
112 return StatusCode::SUCCESS;
116 std::unordered_map< uint64_t, const CaloCell*> map_ScellID2ptr;
118 for(
const CaloCell* scell : *ScellContainer){
119 const uint64_t ID = scell->ID().get_compact();
120 map_ScellID2ptr[
ID] = scell;
124 std::unordered_map< uint32_t, const xAOD::TriggerTower*> map_TileID2ptr;
129 if(std::abs(tower->eta())>1.5 || tower->sampling()!=1)
continue;
130 map_TileID2ptr[tower->coolId()]=tower;
160 std::vector<float> scEt;
161 std::vector<float> scEta;
162 std::vector<float> scPhi;
163 std::vector<int> scID;
164 std::vector<bool> scMask;
167 float TileEta = -99.0;
168 float TilePhi = -99.0;
172 const std::unordered_map< uint32_t, std::vector<uint64_t> > * ptr_TTower2Cells;
183 auto it_TTower2SCells = (*ptr_TTower2Cells).find(jFexID);
184 if(it_TTower2SCells == (*ptr_TTower2Cells).end()) {
185 ATH_MSG_ERROR(
"ID: "<<jFexID<<
" not found on map m_map_TTower2SCellsEM/HAD");
186 return StatusCode::FAILURE;
190 for (
auto const& SCellID : it_TTower2SCells->second ) {
193 auto it_ScellID2ptr = map_ScellID2ptr.find(SCellID);
194 if(it_ScellID2ptr == map_ScellID2ptr.end()) {
195 ATH_MSG_DEBUG(
"Scell ID: 0x"<<std::hex<<(SCellID >> 32)<<std::dec<<
" not found on map map_ScellID2ptr");
198 scEta.push_back(-99);
199 scPhi.push_back(-99);
201 scID.push_back( SCellID >> 32 );
206 const CaloCell* myCell = it_ScellID2ptr->second;
209 bool isMasked =
m_apply_masking ? ((myCell)->provenance()&0x80) :
false;
210 bool isInvalid =
m_apply_masking ? ((myCell)->provenance()&0x40) :
false;
212 invalid &= isInvalid;
215 if( isMasked || isInvalid ) {
220 scEta.push_back(myCell->
eta());
221 scPhi.push_back(myCell->
phi());
223 scID.push_back( SCellID >> 32 );
224 scMask.push_back( isMasked );
229 float tmpSCellEt = 0;
230 for(
const auto& tmpet : scEt){
235 unsigned int count_scMask =0;
236 for(
const bool masked : scMask){
237 if(masked) count_scMask++;
240 SCellEt = tmpSCellEt*12.5;
242 if(count_scMask==scMask.size()) {
245 jFexEtencoded = 4095;
257 ATH_MSG_ERROR(
"ID: "<<jFexID<<
" not found on map m_map_TTower2Tile");
258 return StatusCode::FAILURE;
264 auto it_TileID2ptr = map_TileID2ptr.find(
TileID);
265 if(it_TileID2ptr == map_TileID2ptr.end()) {
274 jFexEtencoded = (it_TileID2ptr->second)->cpET();
275 TileEt = jFexEtencoded*500;
276 TileEta = (it_TileID2ptr->second)->eta();
277 float phi = (it_TileID2ptr->second)->phi() <
M_PI ? (it_TileID2ptr->second)->phi() : (it_TileID2ptr->second)->phi()-2*
M_PI;
282 jFexEt =
jTower->jTowerEt()*500;
289 (*jTowerSCellEt) (*jTower) = std::move(scEt);
290 (*jTowerSCellEta) (*jTower) = std::move(scEta);
291 (*jTowerSCellPhi) (*jTower) = std::move(scPhi);
292 (*jTowerSCellID) (*jTower) = std::move(scID);
293 (*jTowerSCellMask) (*jTower) = std::move(scMask);
294 (*jTowerTileEt) (*jTower) =
static_cast<int>( TileEt );
295 (*jTowerTileEta) (*jTower) = TileEta;
296 (*jTowerTilePhi) (*jTower) = TilePhi;
299 jTowerEtMeV (*
jTower) = jFexEt;
300 SCellEtMeV (*
jTower) = SCellEt;
301 TileEtMeV (*
jTower) = TileEt;
304 (*jTowerEtencoded) (*jTower) = jFexEtencoded;
311 return StatusCode::SUCCESS;
322 if ( !myfile.is_open() ){
324 return StatusCode::FAILURE;
328 while ( std::getline (myfile, myline) ) {
329 std::vector<uint64_t> SCellvectorEM;
330 SCellvectorEM.clear();
331 std::vector<uint64_t> SCellvectorHAD;
332 SCellvectorHAD.clear();
335 if(myline[0] ==
'#')
continue;
338 std::stringstream oneSCellID(myline);
341 std::string substr =
"";
345 while(std::getline(oneSCellID, substr,
' '))
349 TTID = std::stoi(substr);
354 return StatusCode::FAILURE;
358 uint64_t scid_uint64 = std::strtoull(substr.c_str(),
nullptr, 0);
361 if(scid_uint64 == 0xffffffffffffffff)
continue;
364 if(elem<14) SCellvectorEM.push_back(scid_uint64);
365 else SCellvectorHAD.push_back(scid_uint64);
375 return StatusCode::SUCCESS;
381 if (
ID.find(
"0x") == std::string::npos) {
382 ATH_MSG_ERROR(
"Invalid SuperCell ID " <<
ID <<
". Expecting hexadecimal number on the mapping file");
398 if ( !myfile.is_open() ){
400 return StatusCode::FAILURE;
404 while ( std::getline (myfile, myline) ) {
407 if(myline[0] ==
'#')
continue;
410 std::stringstream oneLine(myline);
412 std::vector<std::string> elements;
413 std::string element =
"";
415 while(std::getline(oneLine, element,
' ')){
416 elements.push_back(element);
419 if(elements.size() != 4){
420 ATH_MSG_ERROR(
"Invalid number of element in " << myline <<
". Expecting 4 elements {jFexID, TileID, eta, phi}");
421 return StatusCode::FAILURE;
424 uint32_t jFexID = std::stoi( elements.at(0) );
426 float eta = std::stof( elements.at(2) );
427 float phi = std::stof( elements.at(3) );
434 return StatusCode::SUCCESS;