80 return StatusCode::FAILURE;
85 if(!triggerTowerContainer.
isValid()) {
86 ATH_MSG_ERROR(
"Could not retrieve collection " << triggerTowerContainer.
key() );
87 return StatusCode::FAILURE;
94 if(!caloCellContainer.
isValid()) {
96 return StatusCode::FAILURE;
98 caloCells = caloCellContainer.
cptr();
104 ATH_CHECK(jTowersContainer.
record(std::make_unique<xAOD::jFexTowerContainer>(), std::make_unique<xAOD::jFexTowerAuxContainer>()));
105 ATH_MSG_DEBUG(
"Recorded jFexEmulatedTower container with key " << jTowersContainer.
key());
107 if(ScellContainer->empty() || triggerTowerContainer->empty() ){
108 ATH_MSG_WARNING(
"Cannot fill jTowers here, at least one container is empty. ScellContainer.size="<<ScellContainer->size() <<
" or triggerTowerContainer.size=" << triggerTowerContainer->size() );
109 return StatusCode::SUCCESS;
112 std::optional<SG::ReadDecorHandle<xAOD::TriggerTowerContainer, std::vector<float>>> cellEtByLayer_handle;
116 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, float>> jTowerCaloCellSumEt;
120 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, int>> jTowerEtMeV;
124 std::optional<SG::WriteDecorHandle<xAOD::jFexTowerContainer, int>> jTowerEtTimingMeV;
130 std::unordered_map< uint64_t, const CaloCell*> map_ScellID2ptr;
131 map_ScellID2ptr.reserve(ScellContainer->size());
133 for(
const CaloCell* scell : *ScellContainer){
134 const uint64_t
ID = scell->ID().get_compact();
135 map_ScellID2ptr[
ID] = scell;
139 std::unordered_map< uint32_t, const xAOD::TriggerTower*> map_TileID2ptr;
144 if(std::abs(tower->eta())>1.5 || tower->sampling()!=1)
continue;
146 map_TileID2ptr[tower->coolId()]=tower;
152 unsigned int jfex = (key >> 16) & 0xf;
153 unsigned int fpga = (key >> 12) & 0xf;
154 unsigned int channel = (key >> 4 ) & 0xff;
155 unsigned int tower = (key >> 0 ) & 0xf;
157 const auto [f_IDSimulation,
eta,
phi, f_source, f_iEta, f_iPhi] = element;
160 unsigned int IDSimulation =
static_cast<int>(f_IDSimulation);
161 unsigned int source =
static_cast<int>(f_source);
162 unsigned int iEta =
static_cast<int>(f_iEta);
163 unsigned int iPhi =
static_cast<int>(f_iPhi);
165 uint16_t Total_Et_encoded = 0;
166 uint16_t Total_Et_Timing_encoded = 0;
169 float caloCellSumET(0);
170 int Total_Et_decoded(0);
171 int Total_Et_Timing_decoded(0);
174 const std::unordered_map< uint32_t, std::vector<uint64_t> > * ptr_TTower2Cells;
177 if(source == 3 or source > 4){
185 auto it_TTower2SCells = (*ptr_TTower2Cells).find(IDSimulation);
186 if(it_TTower2SCells == (*ptr_TTower2Cells).end()) {
187 ATH_MSG_ERROR(
"jFEX ID: "<<IDSimulation<<
" not found on map m_map_TTower2SCellsEM/HAD");
188 return StatusCode::FAILURE;
192 int Total_Timing_Et = 0;
193 float Total_Et_float = 0;
196 for (
auto const& SCellID : it_TTower2SCells->second ) {
198 auto it_ScellID2ptr = map_ScellID2ptr.find(SCellID);
199 if(it_ScellID2ptr == map_ScellID2ptr.end()) {
200 if(
m_isDATA)
ATH_MSG_DEBUG(
"Scell ID: 0x"<<std::hex<< (SCellID >> 32) <<std::dec<<
" not found in the CaloCell Container, skipping");
205 const CaloCell* myCell = it_ScellID2ptr->second;
206 int val = std::round(myCell->
energy()/(12.5*std::cosh(myCell->
eta())));
210 bool passTiming = ( myCell->
provenance() & 0x200 );
212 invalid &= isInvalid;
215 jTower_sat |= isSaturated;
222 }
else if( isInvalid ) {
227 if(val!=0) Total_Et_float += myCell->
et();
230 Total_Timing_Et += (passTiming) ? val : 0;
234 const std::vector<Identifier> caloCellIds =
m_scellIdTool->superCellToOfflineID(myCell->
ID());
235 float caloCellEt(0.);
237 for(
auto& caloCellId : caloCellIds) {
240 caloCellEt += caloCell->
e()*caloCell->
sinTh();
242 caloCellSumET += caloCellEt;
249 Total_Et_encoded = 0;
250 Total_Et_Timing_encoded = 0;
252 Total_Et_encoded = 4095;
253 Total_Et_Timing_encoded = 4095;
271 ATH_MSG_ERROR(
"ID: "<<IDSimulation<<
" not found on map m_map_TTower2Tile");
272 return StatusCode::FAILURE;
275 uint32_t
TileID = std::get<0>( it_TTower2Tile->second );
278 auto it_TileID2ptr = map_TileID2ptr.find(
TileID);
279 if(it_TileID2ptr == map_TileID2ptr.end()) {
284 Total_Et_encoded = (it_TileID2ptr->second)->cpET();
286 Total_Et_decoded = Total_Et_encoded * 500;
287 Total_Et_Timing_decoded = Total_Et_encoded * 500;
291 if ( cellEtByLayer_handle->isAvailable() ) {
292 const std::vector<float>& cellEtByLayer = (*cellEtByLayer_handle)(*it_TileID2ptr->second);
294 caloCellSumET = 1000.0 * std::accumulate(cellEtByLayer.begin(), cellEtByLayer.end(), 0.0);
298 std::vector<uint16_t> vtower_ET;
299 vtower_ET.push_back(Total_Et_encoded);
301 std::vector<char> vtower_SAT;
304 vtower_SAT.push_back(jTower_sat);
306 jTowersContainer->push_back( std::make_unique<xAOD::jFexTower>() );
307 jTowersContainer->back()->initialize(
eta,
phi, iEta, iPhi, IDSimulation, source, vtower_ET, jfex, fpga, channel, tower, vtower_SAT );
309 if(
m_doThinning && !jTowersContainer->back()->isCore() ){
310 jTowersContainer->pop_back();
314 (*jTowerCaloCellSumEt) (*jTowersContainer->back()) = caloCellSumET;
318 (*jTowerEtMeV) (*jTowersContainer->back()) = Total_Et_decoded;
321 (*jTowerEtTimingMeV) (*jTowersContainer->back()) = Total_Et_Timing_decoded;
327 return StatusCode::SUCCESS;