From a3fbb128686987d9b5a9c2242cd548eeef74be2c Mon Sep 17 00:00:00 2001
From: Marcin Nowak <Marcin.Nowak@cern.ch>
Date: Thu, 24 Jan 2019 17:52:50 +0100
Subject: [PATCH] Fix getPileUpEventInfo so it sets SG pointers only for new
 objects

---
 Control/PileUpComps/src/PileUpEventLoopMgr.cxx | 18 +++---------------
 Control/PileUpTools/src/PileUpMergeSvc.cxx     | 16 ++++++++++------
 2 files changed, 13 insertions(+), 21 deletions(-)

diff --git a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
index 3bae7b7e13ef..99fc5327f15e 100644
--- a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
+++ b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
@@ -304,7 +304,7 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
       }
     }
 
-  const xAOD::EventInfo*  pEvent(0), *pEventSignal(0);
+  const xAOD::EventInfo*  pEvent(nullptr), *pEventSignal(nullptr);
   
   // loop over events if the maxevt (received as input) is different from -1.
   // if evtmax is -1 it means infinite loop (till time limit that is)
@@ -344,23 +344,11 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
       pOverEvent->setStore( pOverEventAux );
 
       ATH_MSG_INFO("MN:  #subevents in orig =" << pEvent->subEvents().size());
-      if( pEvent->subEvents().size() > 1 ) {
-         ATH_MSG_INFO("     orig subev[1] link=" << pEvent->subEvents()[1].link() );
-      }
 
       // Copy the eventInfo data from origStream event
       *pOverEvent = *pEvent;
       pOverEvent->clearSubEvents();  // start clean without any subevents
 
-      ATH_MSG_INFO("MN:  #subevents in copy =" << pOverEvent->subEvents().size());
-      if( pOverEvent->subEvents().size() > 1 ) {
-         ATH_MSG_INFO("     copy subev[1] link=" << pOverEvent->subEvents()[1].link() );
-      }
-      ATH_MSG_INFO("MN:  #subevents in orig =" << pEvent->subEvents().size());
-      if( pEvent->subEvents().size() > 1 ) {
-         ATH_MSG_INFO("     orig subev[1] link=" << pEvent->subEvents()[1].link() );
-      }
-      
       // Record the xAOD object(s):
       CHECK( m_evtStore->record( pOverEventAux, "McEventInfoAux." ) );
       CHECK( m_evtStore->record( pOverEvent, "McEventInfo" ) );
@@ -437,7 +425,8 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
 
          // link to the fresh EI added to the container:
          ElementLink< xAOD::EventInfoContainer > eilink( puei_sg_key, puei->size()-1,  &*m_evtStore );
-         xAOD::EventInfo::SubEvent  subev( 0, pOverEvent->subEvents().size(), xAOD::EventInfo::Signal, eilink );
+         xAOD::EventInfo::SubEvent  subev( 0, pOverEvent->subEvents().size(),
+                                           xAOD::EventInfo::Signal, eilink );
          pOverEvent->addSubEvent( subev );
          // pOverEvent->addSubEvt(0, PileUpTimeEventIndex::Signal, pEventSignal, &m_signalStream.store());
       }
@@ -465,7 +454,6 @@ StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
       }
       
       if( addpEvent ) {
-         ATH_MSG_INFO ( "MN: addpEvent" );
          xAOD::EventInfo* ei = new xAOD::EventInfo( *pEvent );
          ei->clearSubEvents();  // MN: FIX - verify that subevents should be cleared!
          puei->push_back( ei );
diff --git a/Control/PileUpTools/src/PileUpMergeSvc.cxx b/Control/PileUpTools/src/PileUpMergeSvc.cxx
index dba31e2f383e..0fc54483e0db 100755
--- a/Control/PileUpTools/src/PileUpMergeSvc.cxx
+++ b/Control/PileUpTools/src/PileUpMergeSvc.cxx
@@ -135,11 +135,15 @@ const xAOD::EventInfo* PileUpMergeSvc::getPileUpEvent( StoreGateSvc* sg, const s
       : sg->tryConstRetrieve<xAOD::EventInfo>( einame );
    if( xAODEventInfo ) {
       ATH_MSG_INFO("Found xAOD::EventInfo");
-      ATH_MSG_INFO(" EventInfo has" <<   xAODEventInfo->subEvents().size() << " subevents" );
-      // the loop below serves 2 purposes: to recreate subevent links cache
-      // and set SG pointer in subevents
-      for( auto& subev : xAODEventInfo->subEvents() ) {
-         const_cast<xAOD::EventInfo*>(subev.ptr())->setEvtStore( sg );
+      ATH_MSG_INFO(" EventInfo has " <<   xAODEventInfo->subEvents().size() << " subevents" );
+      if( xAODEventInfo->evtStore() == nullptr ) {
+         // SG is 0 only when the xAODEventInfo is first read
+         xAODEventInfo->setEvtStore( sg );
+         // the loop below serves 2 purposes: to recreate subevent links cache
+         // and set SG pointer in subevents 
+         for( auto& subev : xAODEventInfo->subEvents() ) {
+            subev.ptr()->setEvtStore( sg );
+         }
       }
    } else {
       // Try reading old EventInfo
@@ -154,6 +158,7 @@ const xAOD::EventInfo* PileUpMergeSvc::getPileUpEvent( StoreGateSvc* sg, const s
          std::unique_ptr< xAOD::EventInfo >  pxAODEventInfo( new xAOD::EventInfo() );
          std::unique_ptr< xAOD::EventAuxInfo > pxAODEventAuxInfo(new xAOD::EventAuxInfo());
          pxAODEventInfo->setStore( pxAODEventAuxInfo.get() );
+         pxAODEventInfo->setEvtStore( sg );
          if( !m_xAODCnvTool->convert( pEvent, pxAODEventInfo.get(), false, false ).isSuccess() ) {
             ATH_MSG_ERROR("Failed to convert  xAOD::EventInfo in SG");
             return nullptr;
@@ -253,7 +258,6 @@ const xAOD::EventInfo* PileUpMergeSvc::getPileUpEvent( StoreGateSvc* sg, const s
    }
 
    if( xAODEventInfo ) {
-      const_cast<xAOD::EventInfo*>(xAODEventInfo)->setEvtStore( sg );
       ATH_MSG_INFO("Dumping xAOD::EventInfo");
       xAOD::dump( *xAODEventInfo );
    } else {
-- 
GitLab