40 declareInterface<IeFEXSysSim>(
this);
71 return StatusCode::SUCCESS;
76 return ((64*eta) + phi +
mod);
82 if(!this_eTowerContainer.
isValid()){
84 return StatusCode::FAILURE;
88 std::map<int, std::vector<std::unique_ptr<eFEXegTOB>> > allEmTobObjects;
89 std::map<int, std::vector<std::unique_ptr<eFEXtauTOB>> > allTauHeuristicTobObjects;
90 std::map<int, std::vector<std::unique_ptr<eFEXtauTOB>> > allTauBDTTobObjects;
94 int tmp_eTowersIDs_subset_eFEX[10][18];
95 for (
int i_efex{ 0 }; i_efex < 24; i_efex++) {
100 allEmTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXegTOB>> >::
value_type(i_efex,
m_eFEXSimTool->getEmTOBs() ));
101 allTauHeuristicTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(i_efex,
m_eFEXSimTool->getTauHeuristicTOBs() ));
102 allTauBDTTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(i_efex,
m_eFEXSimTool->getTauBDTTOBs() ));
131 int emecEta = 24;
int emecPhi = 1;
int emecMod = 500000;
132 int initialEMEC =
calcTowerID(emecEta,emecPhi,emecMod);
133 int transEta = 14;
int transPhi = 1;
int transMod = 300000;
134 int initialTRANS =
calcTowerID(transEta,transPhi,transMod);
135 int embEta = 13;
int embPhi = 1;
int embMod = 100000;
136 int initialEMB =
calcTowerID(embEta,embPhi,embMod);
139 for (
int thisEFEX=eFEXa; thisEFEX<=21; thisEFEX+=3){
141 if(fexcounter > 0){ initialEMEC += 8; initialTRANS += 8; initialEMB += 8; }
144 std::map<int,eTower> tmp_eTowersColl_subset;
147 int tmp_eTowersIDs_subset [10][18];
149 int rows =
sizeof tmp_eTowersIDs_subset /
sizeof tmp_eTowersIDs_subset[0];
150 int cols =
sizeof tmp_eTowersIDs_subset[0] /
sizeof tmp_eTowersIDs_subset[0][0];
153 for(
int thisCol=0; thisCol<10; thisCol++){
154 for(
int thisRow=0; thisRow<
rows; thisRow++){
156 int towerid = initialEMEC - (thisCol * 64) + thisRow;
158 if( (thisEFEX == 21) && (thisRow >= 7)){ towerid -= 64; };
160 tmp_eTowersIDs_subset[thisRow][thisCol] = towerid;
161 tmp_eTowersColl_subset.insert( std::map<int, eTower>::value_type(towerid, *(this_eTowerContainer->
findTower(towerid))));
167 for(
int thisRow = 0; thisRow <
rows; thisRow++){
169 int towerid = initialTRANS + thisRow;
171 if( (thisEFEX == 21) && (thisRow >= 7)){ towerid -= 64; };
173 tmp_eTowersIDs_subset[thisRow][10] = towerid;
174 tmp_eTowersColl_subset.insert( std::map<int, eTower>::value_type(towerid, *(this_eTowerContainer->
findTower(towerid))));
179 for(
int thisCol = 11; thisCol <
cols; thisCol++){
180 for(
int thisRow=0; thisRow<
rows; thisRow++){
182 int towerid = initialEMB - ( (thisCol-11) * 64) + thisRow;
184 if( (thisEFEX == 21) && (thisRow >= 7)){ towerid -= 64; };
186 tmp_eTowersIDs_subset[thisRow][thisCol] = towerid;
187 tmp_eTowersColl_subset.insert( std::map<int, eTower>::value_type(towerid, *(this_eTowerContainer->
findTower(towerid))));
195 for (
int thisRow=
rows-1; thisRow>=0; thisRow--){
196 for (
int thisCol=0; thisCol<
cols; thisCol++){
197 int tmptowerid = tmp_eTowersIDs_subset[thisRow][thisCol];
198 const float tmptowereta = this_eTowerContainer->
findTower(tmptowerid)->
eta();
199 const float tmptowerphi = this_eTowerContainer->
findTower(tmptowerid)->
phi();
200 if(thisCol !=
cols-1){
ATH_MSG_DEBUG(
"| " << tmptowerid <<
"([" << tmptowerphi <<
"][" << tmptowereta <<
"]) "); }
201 else {
ATH_MSG_DEBUG(
"| " << tmptowerid <<
"([" << tmptowereta <<
"][" << tmptowerphi <<
"]) |"); }
209 allEmTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXegTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getEmTOBs() ) ));
210 allTauHeuristicTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getTauHeuristicTOBs() ) ));
211 allTauBDTTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getTauBDTTOBs() ) ));
220 int embnegEta = 8;
int embnegPhi = 1;
int embnegMod = 100000;
221 int initialEMB_neg =
calcTowerID(embnegEta,embnegPhi,embnegMod);
222 int embposEta = 0;
int embposPhi = 1;
int embposMod = 200000;
223 int initialEMB_pos =
calcTowerID(embposEta,embposPhi,embposMod);
226 for (
int thisEFEX=eFEXb; thisEFEX<=22; thisEFEX+=3){
228 if(fexcounter > 0){ initialEMB_neg += 8; initialEMB_pos += 8; }
231 std::map<int,eTower> tmp_eTowersColl_subset;
234 int tmp_eTowersIDs_subset [10][18];
236 int rows =
sizeof tmp_eTowersIDs_subset /
sizeof tmp_eTowersIDs_subset[0];
237 int cols =
sizeof tmp_eTowersIDs_subset[0] /
sizeof tmp_eTowersIDs_subset[0][0];
240 for(
int thisCol = 0; thisCol <
cols; thisCol++){
241 for(
int thisRow=0; thisRow<
rows; thisRow++){
244 int tmp_initEMB = initialEMB_neg;
247 towerid = tmp_initEMB - ( (thisCol) * 64) + thisRow;
250 tmp_initEMB = initialEMB_pos;
251 towerid = tmp_initEMB + ( (thisCol-9) * 64) + thisRow;
254 if( (thisEFEX == 22) && (thisRow >= 7)){ towerid -= 64; };
256 tmp_eTowersIDs_subset[thisRow][thisCol] = towerid;
258 tmp_eTowersColl_subset.insert( std::map<int, eTower>::value_type(towerid, *(this_eTowerContainer->
findTower(towerid))));
265 for (
int thisRow=
rows-1; thisRow>=0; thisRow--){
266 for (
int thisCol=0; thisCol<
cols; thisCol++){
267 int tmptowerid = tmp_eTowersIDs_subset[thisRow][thisCol];
268 const float tmptowereta = this_eTowerContainer->
findTower(tmptowerid)->
eta();
269 const float tmptowerphi = this_eTowerContainer->
findTower(tmptowerid)->
phi();
270 if(thisCol !=
cols-1){
ATH_MSG_DEBUG(
"| " << tmptowerid <<
"([" << tmptowereta <<
"][" << tmptowerphi <<
"]) "); }
271 else {
ATH_MSG_DEBUG(
"| " << tmptowerid <<
"([" << tmptowereta <<
"][" << tmptowerphi <<
"]) |"); }
279 allEmTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXegTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getEmTOBs() ) ));
280 allTauHeuristicTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getTauHeuristicTOBs() ) ));
281 allTauBDTTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getTauBDTTOBs() ) ));
291 emecEta = 15; emecPhi = 1; emecMod = 600000;
292 initialEMEC =
calcTowerID(emecEta,emecPhi,emecMod);
293 transEta = 14; transPhi = 1; transMod = 400000;
294 initialTRANS =
calcTowerID(transEta,transPhi,transMod);
295 embEta = 7; embPhi = 1; embMod = 200000;
299 for (
int thisEFEX=eFEXc; thisEFEX<=23; thisEFEX+=3){
301 if(fexcounter > 0){ initialEMEC += 8; initialTRANS += 8; initialEMB += 8; }
304 std::map<int,eTower> tmp_eTowersColl_subset;
307 int tmp_eTowersIDs_subset [10][18];
309 int rows =
sizeof tmp_eTowersIDs_subset /
sizeof tmp_eTowersIDs_subset[0];
310 int cols =
sizeof tmp_eTowersIDs_subset[0] /
sizeof tmp_eTowersIDs_subset[0][0];
313 for(
int thisCol = 0; thisCol < 7; thisCol++){
314 for(
int thisRow=0; thisRow<
rows; thisRow++){
315 int towerid = initialEMB + ( (thisCol) * 64) + thisRow;
317 if( (thisEFEX == 23) && (thisRow >= 7)){ towerid -= 64; };
319 tmp_eTowersIDs_subset[thisRow][thisCol] = towerid;
320 tmp_eTowersColl_subset.insert( std::map<int, eTower>::value_type(towerid, *(this_eTowerContainer->
findTower(towerid))));
324 for(
int thisRow = 0; thisRow <
rows; thisRow++){
325 int towerid = initialTRANS + thisRow;
327 if( (thisEFEX == 23) && (thisRow >= 7)){ towerid -= 64; };
329 tmp_eTowersIDs_subset[thisRow][7] = towerid;
330 tmp_eTowersColl_subset.insert( std::map<int, eTower>::value_type(towerid, *(this_eTowerContainer->
findTower(towerid))));
333 for(
int thisCol=8; thisCol<
cols; thisCol++){
334 for(
int thisRow=0; thisRow<
rows; thisRow++){
335 int towerid = initialEMEC + ( (thisCol-8) * 64) + thisRow;
337 if( (thisEFEX == 23) && (thisRow >= 7)){ towerid -= 64; };
339 tmp_eTowersIDs_subset[thisRow][thisCol] = towerid;
340 tmp_eTowersColl_subset.insert( std::map<int, eTower>::value_type(towerid, *(this_eTowerContainer->
findTower(towerid))));
347 for (
int thisRow=
rows-1; thisRow>=0; thisRow--){
348 for (
int thisCol=0; thisCol<
cols; thisCol++){
349 int tmptowerid = tmp_eTowersIDs_subset[thisRow][thisCol];
350 const float tmptowereta = this_eTowerContainer->
findTower(tmptowerid)->
eta();
351 const float tmptowerphi = this_eTowerContainer->
findTower(tmptowerid)->
phi();
352 if(thisCol !=
cols-1){
ATH_MSG_DEBUG(
"| " << tmptowerid <<
"([" << tmptowereta <<
"][" << tmptowerphi <<
"]) "); }
353 else {
ATH_MSG_DEBUG(
"| " << tmptowerid <<
"([" << tmptowereta <<
"][" << tmptowerphi <<
"]) |"); }
361 allEmTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXegTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getEmTOBs() ) ));
362 allTauHeuristicTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getTauHeuristicTOBs() ) ));
363 allTauBDTTobObjects.insert( std::map<
int, std::vector<std::unique_ptr<eFEXtauTOB>> >::
value_type(thisEFEX, (
m_eFEXSimTool->getTauBDTTOBs() ) ));
374 auto eContainer = std::make_unique<xAOD::eFexEMRoIContainer> ();
375 auto eAuxContainer = std::make_unique<xAOD::eFexEMRoIAuxContainer> ();
376 eContainer->setStore(eAuxContainer.get());
379 auto xeContainer = std::make_unique<xAOD::eFexEMRoIContainer> ();
380 auto xeAuxContainer = std::make_unique<xAOD::eFexEMRoIAuxContainer> ();
381 xeContainer->setStore(xeAuxContainer.get());
384 for(
auto const& [efex, tobObjects] : allEmTobObjects ){
385 for(
auto &tobObject : tobObjects){
393 std::vector<std::unique_ptr<eFEXegTOB>> emTOBs;
395 auto iter = allEmTobObjects.begin();
396 while (iter != allEmTobObjects.end()) {
397 std::vector<std::unique_ptr<eFEXegTOB>> tobsSort = std::move(iter->second);
399 std::sort (tobsSort.begin(), tobsSort.end(), std::bind(
TOBetSort<std::unique_ptr<eFEXegTOB>>, std::placeholders::_1, std::placeholders::_2,
false));
401 if (tobsSort.size() > 6) tobsSort.resize(6);
403 for (
unsigned int t = 0;
t < tobsSort.size(); ++
t) emTOBs.push_back(std::move(tobsSort[
t]));
409 for(
auto &tobObject : emTOBs){
410 int efex = tobObject->geteFEXID();
419 ATH_MSG_DEBUG(
" write: " << outputeFexEMxTOBHandle.
key() <<
" = " <<
"..." );
420 ATH_CHECK(outputeFexEMxTOBHandle.
record(std::move(xeContainer),std::move(xeAuxContainer)));
424 ATH_CHECK(outputeFexHandle.
record(std::move(eContainer),std::move(eAuxContainer)));
436 if (!omitAltTauContainer) {
441 if (!omitAltTauContainer) {
451 return StatusCode::SUCCESS;
459 std::unique_ptr< xAOD::eFexTauRoIContainer > tauContainer;
460 std::unique_ptr< xAOD::eFexTauRoIAuxContainer > tauAuxContainer;
461 std::unique_ptr< xAOD::eFexTauRoIContainer > xtauContainer;
462 std::unique_ptr< xAOD::eFexTauRoIAuxContainer > xtauAuxContainer;
464 tauContainer = std::make_unique<xAOD::eFexTauRoIContainer> ();
465 tauAuxContainer = std::make_unique<xAOD::eFexTauRoIAuxContainer> ();
466 tauContainer->setStore(tauAuxContainer.get());
468 xtauContainer = std::make_unique<xAOD::eFexTauRoIContainer> ();
469 xtauAuxContainer = std::make_unique<xAOD::eFexTauRoIAuxContainer> ();
470 xtauContainer->setStore(xtauAuxContainer.get());
473 for(
auto const& [efex, tobObjects] : allTauTobObjects ){
474 for(
auto &tobObject: tobObjects ){
482 std::vector<std::unique_ptr<eFEXtauTOB>> tauTOBs;
484 auto iterTau = allTauTobObjects.begin();
485 while (iterTau != allTauTobObjects.end()) {
486 std::vector<std::unique_ptr<eFEXtauTOB>> tobsSort = std::move(iterTau->second);
488 std::sort (tobsSort.begin(), tobsSort.end(), std::bind(
TOBetSort<std::unique_ptr<eFEXtauTOB>>, std::placeholders::_1, std::placeholders::_2,
true));
490 if (tobsSort.size() > 6) tobsSort.resize(6);
492 for (
unsigned int t = 0;
t < tobsSort.size(); ++
t) tauTOBs.push_back(std::move(tobsSort[
t]));
498 for(
auto &tobObject : tauTOBs){
499 int efex = tobObject->geteFEXID();
508 ATH_MSG_DEBUG(
" write: " << outputeFexTauxTOBHandle.
key() <<
" = " <<
"..." );
509 ATH_CHECK(outputeFexTauxTOBHandle.
record(std::move(xtauContainer), std::move(xtauAuxContainer)));
513 ATH_CHECK(outputeFexTauHandle.
record(std::move(tauContainer), std::move(tauAuxContainer)));
515 return StatusCode::SUCCESS;