87 return StatusCode::FAILURE;
92 if(!triggerTowerContainer.
isValid()) {
93 ATH_MSG_ERROR(
"Could not retrieve collection " << triggerTowerContainer.
key() );
94 return StatusCode::FAILURE;
101 if(!caloCellContainer.
isValid()) {
102 ATH_MSG_ERROR(
"Could not retrieve collection " << caloCellContainer.
key() );
103 return StatusCode::FAILURE;
105 caloCells = caloCellContainer.
cptr();
111 ATH_CHECK(jTowersContainer.
record(std::make_unique<xAOD::jFexTowerContainer>(), std::make_unique<xAOD::jFexTowerAuxContainer>()));
112 ATH_MSG_DEBUG(
"Recorded jFexEmulatedTower container with key " << jTowersContainer.
key());
114 if(ScellContainer->empty() || triggerTowerContainer->empty() ){
115 ATH_MSG_WARNING(
"Cannot fill jTowers here, at least one container is empty. ScellContainer.size="<<ScellContainer->size() <<
" or triggerTowerContainer.size=" << triggerTowerContainer->size() );
116 return StatusCode::SUCCESS;
119 std::optional<SG::ReadDecorHandle<xAOD::TriggerTowerContainer, std::vector<float>>> cellEtByLayer_handle;
123 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, float>> jTowerCaloCellSumEt;
127 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, int>> jTowerEtMeV;
131 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, int>> jTowerEtTimingMeV;
137 std::unordered_map< uint64_t, const CaloCell*> map_ScellID2ptr;
138 map_ScellID2ptr.reserve(ScellContainer->size());
140 for(
const CaloCell* scell : *ScellContainer){
141 const uint64_t ID = scell->ID().get_compact();
142 map_ScellID2ptr[ID] = scell;
146 std::unordered_map< uint32_t, const xAOD::TriggerTower*> map_TileID2ptr;
151 if(std::abs(tower->eta())>1.5 || tower->sampling()!=1)
continue;
153 map_TileID2ptr[tower->coolId()]=tower;
159 unsigned int jfex = (key >> 16) & 0xf;
160 unsigned int fpga = (key >> 12) & 0xf;
161 unsigned int channel = (key >> 4 ) & 0xff;
162 unsigned int tower = (key >> 0 ) & 0xf;
164 const auto [f_IDSimulation,
eta,
phi, f_source, f_iEta, f_iPhi] = element;
167 unsigned int IDSimulation =
static_cast<int>(f_IDSimulation);
168 unsigned int source =
static_cast<int>(f_source);
169 unsigned int iEta =
static_cast<int>(f_iEta);
170 unsigned int iPhi =
static_cast<int>(f_iPhi);
172 uint16_t Total_Et_encoded = 0;
173 uint16_t Total_Et_Timing_encoded = 0;
176 float caloCellSumET(0);
177 int Total_Et_decoded(0);
178 int Total_Et_Timing_decoded(0);
181 const std::unordered_map< uint32_t, std::vector<uint64_t> > * ptr_TTower2Cells;
184 if(source == 3 or source > 4){
192 auto it_TTower2SCells = (*ptr_TTower2Cells).find(IDSimulation);
193 if(it_TTower2SCells == (*ptr_TTower2Cells).end()) {
194 ATH_MSG_ERROR(
"jFEX ID: "<<IDSimulation<<
" not found on map m_map_TTower2SCellsEM/HAD");
195 return StatusCode::FAILURE;
199 int Total_Timing_Et = 0;
200 float Total_Et_float = 0;
203 for (
auto const& SCellID : it_TTower2SCells->second ) {
205 auto it_ScellID2ptr = map_ScellID2ptr.find(SCellID);
206 if(it_ScellID2ptr == map_ScellID2ptr.end()) {
207 if(
m_isDATA)
ATH_MSG_DEBUG(
"Scell ID: 0x"<<std::hex<< (SCellID >> 32) <<std::dec<<
" not found in the CaloCell Container, skipping");
212 const CaloCell* myCell = it_ScellID2ptr->second;
213 int val = std::round(myCell->
energy()/(12.5*std::cosh(myCell->
eta())));
217 bool passTiming = ( myCell->
provenance() & 0x200 );
219 invalid &= isInvalid;
222 jTower_sat |= isSaturated;
229 }
else if( isInvalid ) {
242 if(val!=0) Total_Et_float += myCell->
et();
245 Total_Timing_Et += (passTiming) ? val : 0;
249 const std::vector<Identifier> caloCellIds =
m_scellIdTool->superCellToOfflineID(myCell->
ID());
250 float caloCellEt(0.);
252 for(
auto& caloCellId : caloCellIds) {
255 caloCellEt += caloCell->
e()*caloCell->
sinTh();
257 caloCellSumET += caloCellEt;
264 Total_Et_encoded = 0;
265 Total_Et_Timing_encoded = 0;
267 Total_Et_encoded = 4095;
268 Total_Et_Timing_encoded = 4095;
286 ATH_MSG_ERROR(
"ID: "<<IDSimulation<<
" not found on map m_map_TTower2Tile");
287 return StatusCode::FAILURE;
290 uint32_t
TileID = std::get<0>( it_TTower2Tile->second );
293 auto it_TileID2ptr = map_TileID2ptr.find(
TileID);
294 if(it_TileID2ptr == map_TileID2ptr.end()) {
299 Total_Et_encoded = (it_TileID2ptr->second)->cpET();
301 Total_Et_decoded = Total_Et_encoded * 500;
302 Total_Et_Timing_decoded = Total_Et_encoded * 500;
306 if ( cellEtByLayer_handle->isAvailable() ) {
307 const std::vector<float>& cellEtByLayer = (*cellEtByLayer_handle)(*it_TileID2ptr->second);
309 caloCellSumET = 1000.0 * std::accumulate(cellEtByLayer.begin(), cellEtByLayer.end(), 0.0);
313 std::vector<uint16_t> vtower_ET;
314 vtower_ET.push_back(Total_Et_encoded);
316 std::vector<char> vtower_SAT;
319 vtower_SAT.push_back(jTower_sat);
321 jTowersContainer->push_back( std::make_unique<xAOD::jFexTower>() );
322 jTowersContainer->back()->initialize(
eta,
phi, iEta, iPhi, IDSimulation, source, vtower_ET, jfex, fpga, channel, tower, vtower_SAT );
324 if(
m_doThinning && !jTowersContainer->back()->isCore() ){
325 jTowersContainer->pop_back();
329 (*jTowerCaloCellSumEt) (*jTowersContainer->back()) = caloCellSumET;
333 (*jTowerEtMeV) (*jTowersContainer->back()) = Total_Et_decoded;
336 (*jTowerEtTimingMeV) (*jTowersContainer->back()) = Total_Et_Timing_decoded;
342 return StatusCode::SUCCESS;