40     declareInterface<eFEXSysSim>(
this);
 
   71     return StatusCode::SUCCESS;
 
   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;