From 269b2f8470734a5ca69ce1812a5153b3bf240e36 Mon Sep 17 00:00:00 2001
From: christos <christos@cern.ch>
Date: Mon, 5 Apr 2021 19:46:23 +0200
Subject: [PATCH] xAODTrackingCnv add ATLAS_CHECK_THREAD_SAFETY and tidy up the
 TrackParticleCnvAlg

---
 .../src/TrackParticleCnvAlg.cxx               | 609 ++++++++++--------
 .../xAODTrackingCnv/ATLAS_CHECK_THREAD_SAFETY |   1 +
 2 files changed, 338 insertions(+), 272 deletions(-)
 create mode 100644 Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/ATLAS_CHECK_THREAD_SAFETY

diff --git a/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx b/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx
index 2abe876d6f5..a4f3de9a720 100644
--- a/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx
+++ b/Event/xAOD/xAODTrackingCnv/src/TrackParticleCnvAlg.cxx
@@ -12,318 +12,383 @@
 #include "ParticleTruth/TrackParticleTruth.h"
 #include "ParticleTruth/TrackParticleTruthKey.h"
 
-#include "EventPrimitives/EventPrimitivesToStringConverter.h"
 #include "EventPrimitives/EventPrimitivesHelpers.h"
+#include "EventPrimitives/EventPrimitivesToStringConverter.h"
 #include "TrkToolInterfaces/ITrackParticleCreatorTool.h"
 
 // Local include(s):
 #include "TrackParticleCnvAlg.h"
-#include "xAODTrackingCnv/ITrackCollectionCnvTool.h"
 #include "xAODTrackingCnv/IRecTrackParticleContainerCnvTool.h"
+#include "xAODTrackingCnv/ITrackCollectionCnvTool.h"
 
 namespace xAODMaker {
-  TrackParticleCnvAlg::TrackParticleCnvAlg( const std::string& name,
-					    ISvcLocator* svcLoc )
-    : AthReentrantAlgorithm( name, svcLoc ),
-      m_particleCreator("Trk::TrackParticleCreatorTool/TrackParticleCreatorTool"),
-      m_truthClassifier("MCTruthClassifier/MCTruthClassifier"),
-      m_TrackCollectionCnvTool( "xAODMaker::TrackCollectionCnvTool/TrackCollectionCnvTool", this ),
-      m_RecTrackParticleContainerCnvTool( "xAODMaker::RecTrackParticleContainerCnvTool/RecTrackParticleContainerCnvTool", this ),
-      m_aod("TrackParticleCandidate"),
-      m_tracks("Tracks"),
-      m_xaodout("InDetTrackParticles"),
-      m_xaodTrackParticlesout("ConvertedTrackParticleCandidate"),
-      m_truthParticleLinkVec("xAODTruthLinks"),
-      m_aodTruth(""),
-      m_trackTruth("")
-  {
-    declareProperty( "MCTruthClassifier",       m_truthClassifier);
-    declareProperty( "AODContainerName",        m_aod );
-    declareProperty( "xAODContainerName",       m_xaodTrackParticlesout );
-    declareProperty( "TrackParticleCreator",    m_particleCreator );
-    declareProperty( "AddTruthLink",            m_addTruthLink = false );
-    declareProperty( "AODTruthContainerName",   m_aodTruth );
-    declareProperty( "TrackTruthContainerName", m_trackTruth );
-    declareProperty( "xAODTruthLinkVector",     m_truthParticleLinkVec);
-    declareProperty( "TrackContainerName",      m_tracks );
-    declareProperty( "xAODTrackParticlesFromTracksContainerName",   m_xaodout);   
-    declareProperty( "ConvertTrackParticles",   m_convertAODTrackParticles = true );   
-    declareProperty( "ConvertTracks",           m_convertTracks = false ); 
-    declareProperty( "TrackCollectionCnvTool",                 m_TrackCollectionCnvTool );
-    declareProperty( "RecTrackParticleContainerCnvTool",       m_RecTrackParticleContainerCnvTool );
-    declareProperty( "DoMonitoring",      m_doMonitoring = false  );
-    declareProperty( "TrackMonTool",      m_trackMonitoringTool  );
-
+TrackParticleCnvAlg::TrackParticleCnvAlg(const std::string& name,
+                                         ISvcLocator* svcLoc)
+  : AthReentrantAlgorithm(name, svcLoc)
+  , m_particleCreator("Trk::TrackParticleCreatorTool/TrackParticleCreatorTool")
+  , m_truthClassifier("MCTruthClassifier/MCTruthClassifier")
+  , m_TrackCollectionCnvTool(
+      "xAODMaker::TrackCollectionCnvTool/TrackCollectionCnvTool",
+      this)
+  , m_RecTrackParticleContainerCnvTool(
+      "xAODMaker::RecTrackParticleContainerCnvTool/"
+      "RecTrackParticleContainerCnvTool",
+      this)
+  , m_aod("TrackParticleCandidate")
+  , m_tracks("Tracks")
+  , m_xaodout("InDetTrackParticles")
+  , m_xaodTrackParticlesout("ConvertedTrackParticleCandidate")
+  , m_truthParticleLinkVec("xAODTruthLinks")
+  , m_aodTruth("")
+  , m_trackTruth("")
+{
+  declareProperty("MCTruthClassifier", m_truthClassifier);
+  declareProperty("AODContainerName", m_aod);
+  declareProperty("xAODContainerName", m_xaodTrackParticlesout);
+  declareProperty("TrackParticleCreator", m_particleCreator);
+  declareProperty("AddTruthLink", m_addTruthLink = false);
+  declareProperty("AODTruthContainerName", m_aodTruth);
+  declareProperty("TrackTruthContainerName", m_trackTruth);
+  declareProperty("xAODTruthLinkVector", m_truthParticleLinkVec);
+  declareProperty("TrackContainerName", m_tracks);
+  declareProperty("xAODTrackParticlesFromTracksContainerName", m_xaodout);
+  declareProperty("ConvertTrackParticles", m_convertAODTrackParticles = true);
+  declareProperty("ConvertTracks", m_convertTracks = false);
+  declareProperty("TrackCollectionCnvTool", m_TrackCollectionCnvTool);
+  declareProperty("RecTrackParticleContainerCnvTool",
+                  m_RecTrackParticleContainerCnvTool);
+  declareProperty("DoMonitoring", m_doMonitoring = false);
+  declareProperty("TrackMonTool", m_trackMonitoringTool);
+}
+
+StatusCode
+TrackParticleCnvAlg::initialize()
+{
+
+  ATH_MSG_DEBUG("Initializing TrackParticleCnvAlg");
+  ATH_MSG_DEBUG("AODContainerName  = " << m_aod.key());
+  ATH_MSG_DEBUG("xAODContainerName = " << m_xaodTrackParticlesout.key());
+  ATH_CHECK(m_particleCreator.retrieve());
+  if (m_addTruthLink)
+    ATH_CHECK(m_truthClassifier.retrieve());
+  else
+    m_truthClassifier.disable();
+  ATH_CHECK(m_TrackCollectionCnvTool.retrieve(DisableTool{ !m_convertTracks }));
+  ATH_CHECK(m_RecTrackParticleContainerCnvTool.retrieve(
+    DisableTool{ !m_convertAODTrackParticles }));
+  // to preserve the inisialised parameters of the ParticleCreatorTool:
+  ATH_MSG_DEBUG("Overriding particle creator tool settings.");
+  if (m_convertTracks)
+    ATH_CHECK(
+      m_TrackCollectionCnvTool->setParticleCreatorTool(&m_particleCreator));
+  if (m_convertAODTrackParticles)
+    ATH_CHECK(m_RecTrackParticleContainerCnvTool->setParticleCreatorTool(
+      &m_particleCreator));
+
+  ATH_CHECK(m_xaodout.initialize(m_convertTracks));
+  ATH_CHECK(m_xaodTrackParticlesout.initialize(m_convertAODTrackParticles));
+  ATH_CHECK(m_aod.initialize(m_convertAODTrackParticles));
+  ATH_CHECK(m_tracks.initialize(m_convertTracks));
+  ATH_CHECK(m_truthParticleLinkVec.initialize(m_addTruthLink));
+  ATH_CHECK(
+    m_aodTruth.initialize(m_addTruthLink && m_convertAODTrackParticles));
+  ATH_CHECK(m_trackTruth.initialize(m_addTruthLink && m_convertTracks));
+
+  // Retrieve monitoring tool if provided
+  ATH_CHECK(m_trackMonitoringTool.retrieve(DisableTool{ !m_doMonitoring }));
+
+  // Return gracefully:
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+TrackParticleCnvAlg::execute(const EventContext& ctx) const
+{
+
+  const Rec::TrackParticleContainer* aod = nullptr;
+  const TrackCollection* tracks = nullptr;
+  const xAODTruthParticleLinkVector* truthLinks = nullptr;
+  const TrackParticleTruthCollection* aodTruth = nullptr;
+  const TrackTruthCollection* trackTruth = nullptr;
+
+  // Retrieve the AOD particles:
+  if (m_convertAODTrackParticles) {
+    SG::ReadHandle<Rec::TrackParticleContainer> rh_aod(m_aod, ctx);
+    if (!rh_aod.isValid()) {
+      ATH_MSG_ERROR(m_aod.key() << " not found");
+      return StatusCode::FAILURE;
+    } else {
+      aod = rh_aod.cptr();
+      ATH_MSG_VERBOSE("Got TrackParticleContainer with key " << m_aod.key()
+                                                             << " found.");
+    }
   }
-
-  StatusCode TrackParticleCnvAlg::initialize() {
-
-    ATH_MSG_DEBUG( "Initializing TrackParticleCnvAlg" );
-    ATH_MSG_DEBUG( "AODContainerName  = " << m_aod.key() );
-    ATH_MSG_DEBUG( "xAODContainerName = " << m_xaodTrackParticlesout.key() );
-    ATH_CHECK(m_particleCreator.retrieve());
-    if(m_addTruthLink) ATH_CHECK(m_truthClassifier.retrieve());
-    else m_truthClassifier.disable();
-    ATH_CHECK( m_TrackCollectionCnvTool.retrieve(  DisableTool{ !m_convertTracks } ) );
-    ATH_CHECK( m_RecTrackParticleContainerCnvTool.retrieve(DisableTool{!m_convertAODTrackParticles}) );
-    // to preserve the inisialised parameters of the ParticleCreatorTool:
-    ATH_MSG_DEBUG( "Overriding particle creator tool settings." );
-    if(m_convertTracks) ATH_CHECK( m_TrackCollectionCnvTool->setParticleCreatorTool( &m_particleCreator ) );
-    if(m_convertAODTrackParticles) ATH_CHECK( m_RecTrackParticleContainerCnvTool->setParticleCreatorTool( &m_particleCreator ) );
-
-    ATH_CHECK(m_xaodout.initialize(m_convertTracks));
-    ATH_CHECK(m_xaodTrackParticlesout.initialize(m_convertAODTrackParticles));
-    ATH_CHECK(m_aod.initialize(m_convertAODTrackParticles));
-    ATH_CHECK(m_tracks.initialize(m_convertTracks));
-    ATH_CHECK(m_truthParticleLinkVec.initialize(m_addTruthLink));
-    ATH_CHECK(m_aodTruth.initialize(m_addTruthLink && m_convertAODTrackParticles));
-    ATH_CHECK(m_trackTruth.initialize(m_addTruthLink && m_convertTracks));
-
-    //Retrieve monitoring tool if provided
-    ATH_CHECK( m_trackMonitoringTool.retrieve(DisableTool{!m_doMonitoring}) );
-
-
-    // Return gracefully:
-    return StatusCode::SUCCESS;
+  // Retrieve the Tracks:
+  if (m_convertTracks) {
+    SG::ReadHandle<TrackCollection> rh_tracks(m_tracks, ctx);
+    if (!rh_tracks.isValid()) {
+      ATH_MSG_ERROR(m_tracks.key() << " not found");
+      return StatusCode::SUCCESS;
+    } else {
+      tracks = rh_tracks.cptr();
+      ATH_MSG_VERBOSE("Got TrackCollection with key " << m_tracks.key()
+                                                      << " found.");
+    }
   }
-
-  StatusCode TrackParticleCnvAlg::execute(const EventContext& ctx) const {
-
-    const Rec::TrackParticleContainer* aod = nullptr;
-    const TrackCollection* tracks = nullptr;
-    const xAODTruthParticleLinkVector* truthLinks = nullptr;
-    const TrackParticleTruthCollection* aodTruth = nullptr;
-    const TrackTruthCollection* trackTruth = nullptr;
-
-    // Retrieve the AOD particles:
+  if (m_addTruthLink) {
     if (m_convertAODTrackParticles) {
-      SG::ReadHandle<Rec::TrackParticleContainer> rh_aod(m_aod, ctx);
-      if (!rh_aod.isValid()) {
-        ATH_MSG_ERROR( m_aod.key() << " not found");
-        return StatusCode::FAILURE;
-      }
-      else {
-        aod = rh_aod.cptr();
-        ATH_MSG_VERBOSE("Got TrackParticleContainer with key " << m_aod.key() << " found.");
-      }
+      SG::ReadHandle<TrackParticleTruthCollection> rh_aodTruth(m_aodTruth, ctx);
+      if (!rh_aodTruth.isValid()) {
+        ATH_MSG_WARNING("No TrackParticleTruthCollection with key "
+                        << m_aodTruth.key() << " found. Do nothing.");
+        return StatusCode::SUCCESS;
+      } else
+        aodTruth = rh_aodTruth.cptr();
     }
-    // Retrieve the Tracks:
     if (m_convertTracks) {
-      SG::ReadHandle<TrackCollection> rh_tracks(m_tracks, ctx);
-      if (!rh_tracks.isValid()) {
-        ATH_MSG_ERROR( m_tracks.key() << " not found");
+      SG::ReadHandle<TrackTruthCollection> rh_trackTruth(m_trackTruth, ctx);
+      if (!rh_trackTruth.isValid()) {
+        ATH_MSG_WARNING("No DetailedTrackTruthCollection with key "
+                        << m_trackTruth.key() << " found. Do nothing.");
         return StatusCode::SUCCESS;
-      }
-      else {
-        tracks = rh_tracks.cptr();
-        ATH_MSG_VERBOSE("Got TrackCollection with key " << m_tracks.key() << " found.");
-      }
+      } else
+        trackTruth = rh_trackTruth.cptr();
     }
-    if (m_addTruthLink) {
-      if (m_convertAODTrackParticles) {
-        SG::ReadHandle<TrackParticleTruthCollection> rh_aodTruth(m_aodTruth, ctx);
-        if (!rh_aodTruth.isValid()) {
-          ATH_MSG_WARNING("No TrackParticleTruthCollection with key " << m_aodTruth.key() << " found. Do nothing.");
-          return StatusCode::SUCCESS;
-        }
-        else aodTruth = rh_aodTruth.cptr();
-      }
-      if (m_convertTracks) {
-        SG::ReadHandle<TrackTruthCollection> rh_trackTruth(m_trackTruth, ctx);
-        if (!rh_trackTruth.isValid()) {
-          ATH_MSG_WARNING("No DetailedTrackTruthCollection with key " << m_trackTruth.key() << " found. Do nothing.");
-          return StatusCode::SUCCESS;
-        }
-        else trackTruth = rh_trackTruth.cptr();
-      }
 
-      SG::ReadHandle<xAODTruthParticleLinkVector> rh_truthParticleLinkVec(m_truthParticleLinkVec, ctx);
-      if (!rh_truthParticleLinkVec.isValid()) {
-        ATH_MSG_WARNING("No xAODTruthParticleLinkVector with key " << m_truthParticleLinkVec.key() << " found. Do nothing.");
-        return StatusCode::SUCCESS;
-      }
-      else truthLinks = rh_truthParticleLinkVec.cptr();
-    }
-    if (m_convertTracks) {
-      SG::WriteHandle<xAOD::TrackParticleContainer> wh_xaodout(m_xaodout, ctx);
-      ATH_CHECK(wh_xaodout.record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
-      convert((*tracks), trackTruth, m_TrackCollectionCnvTool, wh_xaodout, truthLinks);
+    SG::ReadHandle<xAODTruthParticleLinkVector> rh_truthParticleLinkVec(
+      m_truthParticleLinkVec, ctx);
+    if (!rh_truthParticleLinkVec.isValid()) {
+      ATH_MSG_WARNING("No xAODTruthParticleLinkVector with key "
+                      << m_truthParticleLinkVec.key() << " found. Do nothing.");
+      return StatusCode::SUCCESS;
+    } else
+      truthLinks = rh_truthParticleLinkVec.cptr();
+  }
+  if (m_convertTracks) {
+    SG::WriteHandle<xAOD::TrackParticleContainer> wh_xaodout(m_xaodout, ctx);
+    ATH_CHECK(
+      wh_xaodout.record(std::make_unique<xAOD::TrackParticleContainer>(),
+                        std::make_unique<xAOD::TrackParticleAuxContainer>()));
+    convert(
+      (*tracks), trackTruth, m_TrackCollectionCnvTool, wh_xaodout, truthLinks);
+
+    // Monitor track parameters
+    if (m_doMonitoring)
+      m_trackMonitoringTool->monitor_tracks("Track", "Pass", *wh_xaodout);
+  }
+  if (m_convertAODTrackParticles) {
+    SG::WriteHandle<xAOD::TrackParticleContainer> wh_xaodTrackParticlesout(
+      m_xaodTrackParticlesout, ctx);
+    ATH_CHECK(wh_xaodTrackParticlesout.record(
+      std::make_unique<xAOD::TrackParticleContainer>(),
+      std::make_unique<xAOD::TrackParticleAuxContainer>()));
+    convert((*aod),
+            aodTruth,
+            m_RecTrackParticleContainerCnvTool,
+            wh_xaodTrackParticlesout,
+            truthLinks);
+  }
 
-      //Monitor track parameters
-      if (m_doMonitoring) m_trackMonitoringTool->monitor_tracks("Track", "Pass", *wh_xaodout);
+  return StatusCode::SUCCESS;
+}
 
+template<typename CONT>
+class AssociationHelper;
+
+template<>
+class AssociationHelper<TrackCollection>
+{
+public:
+  AssociationHelper(const TrackCollection&, xAOD::TrackParticleContainer*) {}
+  const Trk::Track* operator()(xAOD::TrackParticle* track_particle,
+                               unsigned int) const
+  {
+    return track_particle->track();
+  }
+};
+
+template<>
+class AssociationHelper<Rec::TrackParticleContainer>
+{
+public:
+  AssociationHelper(const Rec::TrackParticleContainer& cont_src,
+                    xAOD::TrackParticleContainer* cont_dest)
+    : m_contSrc(&cont_src)
+  {
+    if (cont_src.size() != cont_dest->size()) {
+      std::stringstream message;
+      message << __FILE__ << ":" << __LINE__
+              << " Expected one-to-one conversion from AOD to xAOD "
+                 "TrackParticles but sizes differ: "
+              << cont_src.size() << " != " << cont_dest->size();
+      throw std::runtime_error(message.str());
     }
-    if (m_convertAODTrackParticles) {
-      SG::WriteHandle<xAOD::TrackParticleContainer> wh_xaodTrackParticlesout(m_xaodTrackParticlesout, ctx);
-      ATH_CHECK(wh_xaodTrackParticlesout.record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
-      convert((*aod), aodTruth, m_RecTrackParticleContainerCnvTool, wh_xaodTrackParticlesout, truthLinks);
-    }
+  }
 
-    return StatusCode::SUCCESS;
+  const Rec::TrackParticle* operator()(xAOD::TrackParticle*,
+                                       unsigned int idx) const
+  {
+    return m_contSrc->at(idx);
+  }
 
+private:
+  const Rec::TrackParticleContainer* m_contSrc;
+};
+
+template<typename CONT, typename TRUTHCONT, typename CONVTOOL>
+int
+TrackParticleCnvAlg::convert(
+  const CONT& container,
+  const TRUTHCONT& truth,
+  CONVTOOL& conv_tool,
+  SG::WriteHandle<xAOD::TrackParticleContainer>& xaod,
+  const xAODTruthParticleLinkVector* truthLinkVec) const
+{
+  // Create the xAOD container and its auxiliary store:
+
+  // convert the track containers separately with the converting tools that are
+  // also used by TrigHLTtoxAODTool
+  ATH_MSG_DEBUG("calling the converting tool for " << xaod.name());
+  if (conv_tool->convert(&container, xaod.ptr()).isFailure()) {
+    ATH_MSG_ERROR("Couldn't convert aod to xaod ("
+                  << xaod.name() << ") with the converting tool");
+    return -1;
   }
 
-  template <typename CONT> 
-  class AssociationHelper;
+  // Create the xAOD objects:
+  xAOD::TrackParticleContainer::iterator itr_xaod = xaod->begin();
+  xAOD::TrackParticleContainer::iterator end_xaod = xaod->end();
 
-  template<>
-  class AssociationHelper<TrackCollection> {
-  public:
-    AssociationHelper(const TrackCollection &, xAOD::TrackParticleContainer *) {}
-    const Trk::Track *operator()(xAOD::TrackParticle *track_particle, unsigned int) const {
-      return track_particle->track();
-    }
-  };
-
-  template<>
-  class AssociationHelper<Rec::TrackParticleContainer> {
-  public:
-    AssociationHelper(const Rec::TrackParticleContainer &cont_src, xAOD::TrackParticleContainer *cont_dest)
-      : m_contSrc(&cont_src)
-    {
-      if (cont_src.size() != cont_dest->size()) {
-        std::stringstream message;
-        message << __FILE__ << ":" << __LINE__
-                << " Expected one-to-one conversion from AOD to xAOD TrackParticles but sizes differ: "
-                << cont_src.size() << " != " << cont_dest->size();
-        throw std::runtime_error(  message.str() );
-      }
-    }
+  AssociationHelper<CONT> association_to_src(container, xaod.ptr());
+  // loop over AOD and converted xAOD for summary info and truth links
+  for (; itr_xaod != end_xaod; ++itr_xaod) {
+    // protect if something went wrong and there is no converted xaod equivalent
 
-    const Rec::TrackParticle *operator()(xAOD::TrackParticle *, unsigned int idx) const {
-      return m_contSrc->at(idx);
-    }
-  private:
-    const Rec::TrackParticleContainer *m_contSrc;
-  };
-
-  template<typename CONT, typename TRUTHCONT, typename CONVTOOL>
-  int TrackParticleCnvAlg::convert(const CONT& container, const TRUTHCONT& truth, CONVTOOL& conv_tool, SG::WriteHandle<xAOD::TrackParticleContainer> &xaod, const xAODTruthParticleLinkVector *truthLinkVec) const{    
-    // Create the xAOD container and its auxiliary store:
-   
-
-    // convert the track containers separately with the converting tools that are also used by TrigHLTtoxAODTool
-    ATH_MSG_DEBUG( "calling the converting tool for " << xaod.name() );
-    if( conv_tool->convert( &container, xaod.ptr() ).isFailure() ) {
-      ATH_MSG_ERROR("Couldn't convert aod to xaod (" << xaod.name() << ") with the converting tool");
-      return -1;
+    if (!(*itr_xaod)) {
+      ATH_MSG_WARNING("WTaF? Empty element in xAOD container!");
+      continue;
     }
 
-    // Create the xAOD objects:
-    xAOD::TrackParticleContainer::iterator itr_xaod = xaod->begin();
-    xAOD::TrackParticleContainer::iterator end_xaod = xaod->end();
-
-    AssociationHelper<CONT> association_to_src(container,xaod.ptr());
-    // loop over AOD and converted xAOD for summary info and truth links
-    for( ;itr_xaod!=end_xaod;++itr_xaod ) {
-      //protect if something went wrong and there is no converted xaod equivalent
-
-      if (!(*itr_xaod)) {
-	ATH_MSG_WARNING("WTaF? Empty element in xAOD container!");
-	continue;
-      }
+    xAOD::TrackParticle* particle = *itr_xaod;
 
-      xAOD::TrackParticle* particle =  *itr_xaod;
+    if (!particle) {
+      ATH_MSG_WARNING("Failed to get an xAOD::TrackParticle");
+      continue;
+    }
 
-      if(!particle){
-	ATH_MSG_WARNING("Failed to get an xAOD::TrackParticle");
-	continue;
-      }
+    //
+    // --------- statistics
+    //
 
-      //
-      // --------- statistics
-      //
-
-      if( m_addTruthLink ){
-        MCTruthPartClassifier::ParticleType type = MCTruthPartClassifier::Unknown;
-        MCTruthPartClassifier::ParticleOrigin origin = MCTruthPartClassifier::NonDefined;
-        float probability = -1.0;
-        ElementLink<xAOD::TruthParticleContainer> link;
-
-        ElementLink<CONT> tpLink(association_to_src(*itr_xaod,itr_xaod-xaod->begin()), container);
-        if( !tpLink.isValid() ){
-          ATH_MSG_WARNING("Failed to create ElementLink to Track/TrackParticle");
-        }else{
-          auto result = truth->find(tpLink);
-          if( result == truth->end() ){
-            ATH_MSG_WARNING("Failed find truth associated with Track/TrackParticle");
-          }else{
-	    // setTruthLink(link,result->second, type, origin);
-            ATH_MSG_VERBOSE("Found track Truth: barcode  " << result->second.particleLink().barcode() 
-			    << " evt " << result->second.particleLink().eventIndex());
-            probability = result->second.probability();
-            link = truthLinkVec->find(result->second.particleLink());
-            if( link.isValid() ){
-              ATH_MSG_DEBUG("Found matching xAOD Truth: barcode " << (*link)->barcode() << " pt " << (*link)->pt() 
-			    << " eta " << (*link)->eta() << " phi " << (*link)->phi());
-	      // if configured also get truth classification
-              if( result->second.particleLink().cptr() && !m_truthClassifier.empty() ){
+    if (m_addTruthLink) {
+      MCTruthPartClassifier::ParticleType type = MCTruthPartClassifier::Unknown;
+      MCTruthPartClassifier::ParticleOrigin origin =
+        MCTruthPartClassifier::NonDefined;
+      float probability = -1.0;
+      ElementLink<xAOD::TruthParticleContainer> link;
+
+      ElementLink<CONT> tpLink(
+        association_to_src(*itr_xaod, itr_xaod - xaod->begin()), container);
+      if (!tpLink.isValid()) {
+        ATH_MSG_WARNING("Failed to create ElementLink to Track/TrackParticle");
+      } else {
+        auto result = truth->find(tpLink);
+        if (result == truth->end()) {
+          ATH_MSG_WARNING(
+            "Failed find truth associated with Track/TrackParticle");
+        } else {
+          // setTruthLink(link,result->second, type, origin);
+          ATH_MSG_VERBOSE("Found track Truth: barcode  "
+                          << result->second.particleLink().barcode() << " evt "
+                          << result->second.particleLink().eventIndex());
+          probability = result->second.probability();
+          link = truthLinkVec->find(result->second.particleLink());
+          if (link.isValid()) {
+            ATH_MSG_DEBUG("Found matching xAOD Truth: barcode "
+                          << (*link)->barcode() << " pt " << (*link)->pt()
+                          << " eta " << (*link)->eta() << " phi "
+                          << (*link)->phi());
+            // if configured also get truth classification
+            if (result->second.particleLink().cptr() &&
+                !m_truthClassifier.empty()) {
 #ifdef HEPMC3
-                auto truthClass = m_truthClassifier->particleTruthClassifier(result->second.particleLink().scptr());
+              auto truthClass = m_truthClassifier->particleTruthClassifier(
+                result->second.particleLink().scptr());
 #else
-                auto truthClass = m_truthClassifier->particleTruthClassifier(result->second.particleLink().cptr());
+              auto truthClass = m_truthClassifier->particleTruthClassifier(
+                result->second.particleLink().cptr());
 #endif
-                type = truthClass.first;
-                origin = truthClass.second;
-                ATH_MSG_VERBOSE("Got truth type  " << static_cast<int>(type) << "  origin " << static_cast<int>(origin));
-              }
+              type = truthClass.first;
+              origin = truthClass.second;
+              ATH_MSG_VERBOSE("Got truth type  " << static_cast<int>(type)
+                                                 << "  origin "
+                                                 << static_cast<int>(origin));
             }
-            else {
-               if (result->second.particleLink().barcode()>0) {
-                  ATH_MSG_WARNING( "No associated xAOD truth for valid truth link " << result->second.particleLink());
-               }
+          } else {
+            if (result->second.particleLink().barcode() > 0) {
+              ATH_MSG_WARNING("No associated xAOD truth for valid truth link "
+                              << result->second.particleLink());
             }
           }
         }
-
-        ElementLink<xAOD::TruthParticleContainer>& theLink = particle->auxdata<ElementLink<xAOD::TruthParticleContainer> >("truthParticleLink" );
-	// set element link 
-        theLink = link;
-        float& theProbability =   (particle)->auxdata<float>("truthMatchProbability");
-        theProbability = probability;
-        if( !m_truthClassifier.empty() ){
-          int& theType   =  (particle)->auxdata<int>("truthType");
-          int& theOrigin =  (particle)->auxdata<int>("truthOrigin");
-          theType = static_cast<int>(type);
-          theOrigin = static_cast<int>(origin);
-        }
       }
-    }// loop over aod tracks
-
-    ATH_MSG_DEBUG( "Converted [" << container.size() << " -> " << xaod->size() << "] TrackParticles and stored in " << xaod.name() );
-    if(container.size() != xaod->size()) {
-      ATH_MSG_WARNING( "number of items in the AOD container: " 
-                       << container.size() 
-                       << " is not equal to the number of items in its converted xAOD equivalent: " 
-                       << xaod->size() );
+      static const SG::AuxElement::Accessor<
+        ElementLink<xAOD::TruthParticleContainer>>
+        theLink("truthParticleLink");
+      static const SG::AuxElement::Accessor<float> theProbability(
+        "truthMatchProbability");
+      theLink(*particle) = link;
+      theProbability(*particle) = probability;
+      if (!m_truthClassifier.empty()) {
+        static const SG::AuxElement::Accessor<int> theType("truthType");
+        static const SG::AuxElement::Accessor<int> theOrigin("truthOrigin");
+        theType(*particle) = static_cast<int>(type);
+        theOrigin(*particle) = static_cast<int>(origin);
+      }
     }
-    
-    return 1; 
-  }
-
-  xAOD::TrackParticle* TrackParticleCnvAlg::createParticle( xAOD::TrackParticleContainer& xaod, 
-							    const Rec::TrackParticleContainer& /**container*/, 
-							    const Rec::TrackParticle& tp)
-  {
-    // create the xAOD::TrackParticle, the pointer is added to the container in the function
-    xAOD::TrackParticle* xp = m_particleCreator->createParticle(tp,&xaod);
-    return xp;
-  } // createParticleAndTruth
-
-  xAOD::TrackParticle* TrackParticleCnvAlg::createParticle( xAOD::TrackParticleContainer& xaod, 
-							    const TrackCollection& container, 
-							    const Trk::Track& tp)
-  {
-    // create the xAOD::TrackParticle, the pointer is added to the container in the function
-    ElementLink<TrackCollection> trackLink(&tp,container);
-    return m_particleCreator->createParticle(trackLink,&xaod);
+  } // loop over aod tracks
+
+  ATH_MSG_DEBUG("Converted [" << container.size() << " -> " << xaod->size()
+                              << "] TrackParticles and stored in "
+                              << xaod.name());
+  if (container.size() != xaod->size()) {
+    ATH_MSG_WARNING("number of items in the AOD container: "
+                    << container.size()
+                    << " is not equal to the number of items in its converted "
+                       "xAOD equivalent: "
+                    << xaod->size());
   }
 
-  StatusCode TrackParticleCnvAlg::finalize() {
-    return StatusCode::SUCCESS;  
-  }
-
-
-
+  return 1;
+}
+
+xAOD::TrackParticle*
+TrackParticleCnvAlg::createParticle(
+  xAOD::TrackParticleContainer& xaod,
+  const Rec::TrackParticleContainer& /**container*/,
+  const Rec::TrackParticle& tp)
+{
+  // create the xAOD::TrackParticle, the pointer is added to the container in
+  // the function
+  xAOD::TrackParticle* xp = m_particleCreator->createParticle(tp, &xaod);
+  return xp;
+} // createParticleAndTruth
+
+xAOD::TrackParticle*
+TrackParticleCnvAlg::createParticle(xAOD::TrackParticleContainer& xaod,
+                                    const TrackCollection& container,
+                                    const Trk::Track& tp)
+{
+  // create the xAOD::TrackParticle, the pointer is added to the container in
+  // the function
+  ElementLink<TrackCollection> trackLink(&tp, container);
+  return m_particleCreator->createParticle(trackLink, &xaod);
+}
+
+StatusCode
+TrackParticleCnvAlg::finalize()
+{
+  return StatusCode::SUCCESS;
+}
 
 } // namespace xAODMaker
diff --git a/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/ATLAS_CHECK_THREAD_SAFETY b/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/ATLAS_CHECK_THREAD_SAFETY
new file mode 100644
index 00000000000..7e4c4181143
--- /dev/null
+++ b/Event/xAOD/xAODTrackingCnv/xAODTrackingCnv/ATLAS_CHECK_THREAD_SAFETY
@@ -0,0 +1 @@
+Event/xAOD/xAODTrackingCnv
-- 
GitLab