Function executing the algorithm.
87 {
88
89
90 SG::ReadHandle<CaloCellContainer> ScellContainer(
m_SCellKey, ctx);
91 if(!ScellContainer.isValid()) {
92 ATH_MSG_ERROR(
"Could not retrieve collection " << ScellContainer.key() );
93 return StatusCode::FAILURE;
94 }
95
96
97 SG::ReadHandle<xAOD::TriggerTowerContainer> triggerTowerContainer(
m_triggerTowerKey, ctx);
98 if(!triggerTowerContainer.isValid()) {
99 ATH_MSG_ERROR(
"Could not retrieve collection " << triggerTowerContainer.key() );
100 return StatusCode::FAILURE;
101 }
102
103
104 SG::ReadHandle<xAOD::jFexTowerContainer> jTowerContainer(
m_jTowersReadKey, ctx);
105 if(!jTowerContainer.isValid()) {
106 ATH_MSG_ERROR(
"Could not retrieve collection " << jTowerContainer.key() );
107 return StatusCode::FAILURE;
108 }
109
110 if(ScellContainer->empty() || triggerTowerContainer->empty() || jTowerContainer->empty() ){
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;
113 }
114
115
116 std::unordered_map< uint64_t, const CaloCell*> map_ScellID2ptr;
117
118 for(const CaloCell* scell : *ScellContainer){
119 const uint64_t ID = scell->ID().get_compact();
120 map_ScellID2ptr[
ID] = scell;
121 }
122
123
124 std::unordered_map< uint32_t, const xAOD::TriggerTower*> map_TileID2ptr;
125
127
128
129 if(std::abs(tower->eta())>1.5 || tower->sampling()!=1) continue;
130 map_TileID2ptr[tower->coolId()]=tower;
131 }
132
133
143
146 SG::WriteDecorHandle<xAOD::jFexTowerContainer, float > TileEtMeV (
m_TileEtMeVdecorKey , ctx);
147
148
150
151 uint32_t jFexID = jTower->jFEXtowerID();
153 int jFexEt = 0;
155
156 if(source >=7){
158 }
159
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;
165 float SCellEt = 0.0;
166 int TileEt = 0;
167 float TileEta = -99.0;
168 float TilePhi = -99.0;
169
170 if(source != 1){
171
172 const std::unordered_map< uint32_t, std::vector<uint64_t> > * ptr_TTower2Cells;
173
174
175 if(source == 3 or source > 4){
177 }
178 else{
180 }
181
182
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;
187 }
188
189 bool invalid=true;
190 for (auto const& SCellID : it_TTower2SCells->second ) {
191
192
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");
196
197 scEt.push_back(0);
198 scEta.push_back(-99);
199 scPhi.push_back(-99);
200
201 scID.push_back( SCellID >> 32 );
202 scMask.push_back(1);
203
204 }
205 else{
206 const CaloCell* myCell = it_ScellID2ptr->second;
207
208 int val = std::round(myCell->
energy()/(12.5*std::cosh(myCell->
eta())));
209 bool isMasked =
m_apply_masking ? ((myCell)->provenance()&0x80) : false;
210 bool isInvalid =
m_apply_masking ? ((myCell)->provenance()&0x40) : false;
211
212 invalid &= isInvalid;
213
214
215 if( isMasked || isInvalid ) {
217 }
218
219 scEt.push_back(val);
220 scEta.push_back(myCell->
eta());
221 scPhi.push_back(myCell->
phi());
222
223 scID.push_back( SCellID >> 32 );
224 scMask.push_back( isMasked );
225 }
226 }
227
228
229 float tmpSCellEt = 0;
230 for(const auto& tmpet : scEt){
231 tmpSCellEt += tmpet;
232 }
233
234
235 unsigned int count_scMask =0;
236 for(const bool masked : scMask){
237 if(masked) count_scMask++;
238 }
239
240 SCellEt = tmpSCellEt*12.5;
241
242 if(count_scMask==scMask.size()) {
243 jFexEtencoded = 0;
244 } else if(invalid) {
245 jFexEtencoded = 4095;
246 } else {
248 }
249
251 }
252 else if(source == 1){
253
254
257 ATH_MSG_ERROR(
"ID: "<<jFexID<<
" not found on map m_map_TTower2Tile");
258 return StatusCode::FAILURE;
259 }
260
261 uint32_t TileID = std::get<0>( it_TTower2Tile->second );
262
263
264 auto it_TileID2ptr = map_TileID2ptr.find(TileID);
265 if(it_TileID2ptr == map_TileID2ptr.end()) {
266 ATH_MSG_WARNING(
"Scell ID: 0x"<<std::hex<<TileID<<std::dec<<
" not found on map map_TileID2ptr");
267
268 jFexEtencoded = 0;
269 TileEt = 0;
270 TileEta = -99;
271 TilePhi = -99;
272 }
273 else{
274 jFexEtencoded = (it_TileID2ptr->second)->cpET();
275 TileEt = jFexEtencoded*500;
276 TileEta = (it_TileID2ptr->second)->
eta();
279
280 }
281
282 jFexEt = jTower->jTowerEt()*500;
283
284 }
285
286
287
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;
297 }
298
299 jTowerEtMeV (*jTower) = jFexEt;
300 SCellEtMeV (*jTower) = SCellEt;
301 TileEtMeV (*jTower) = TileEt;
302
304 (*jTowerEtencoded) (*jTower) = jFexEtencoded;
305 }
306
307
308 }
309
310
311 return StatusCode::SUCCESS;
312}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_WARNING(x)
std::vector< Identifier > ID
virtual double phi() const override final
get phi (through CaloDetDescrElement)
double energy() const
get energy (data member)
virtual double eta() const override final
get eta (through CaloDetDescrElement)
static int Expand(unsigned int code)
Uncompress data.
static unsigned int Compress(float floatEt, bool empty=false)
Compress data.
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_TileEtadecorKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_SCellEtdecorKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_SCellEtadecorKey
std::unordered_map< uint32_t, std::tuple< uint32_t, float, float > > m_map_TTower2Tile
Gaudi::Property< bool > m_save_extras
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_SCellEtMeVdecorKey
SG::ReadHandleKey< CaloCellContainer > m_SCellKey
std::unordered_map< uint32_t, std::vector< uint64_t > > m_map_TTower2SCellsHAD
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_jtowerEtMeVdecorKey
Gaudi::Property< bool > m_apply_masking
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_SCellPhidecorKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_TileEtMeVdecorKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_TilePhidecorKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_jTowerEtdecorKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_SCellMaskdecorKey
SG::ReadHandleKey< xAOD::TriggerTowerContainer > m_triggerTowerKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_SCellIDdecorKey
SG::WriteDecorHandleKey< xAOD::jFexTowerContainer > m_TileEtdecorKey
std::unordered_map< uint32_t, std::vector< uint64_t > > m_map_TTower2SCellsEM
SG::ReadHandleKey< xAOD::jFexTowerContainer > m_jTowersReadKey
TriggerTower_v2 TriggerTower
Define the latest version of the TriggerTower class.
jFexTower_v1 jFexTower
Define the latest version of the TriggerTower class.