From ed92ac2829e09175380727a7ce6afaea55f3c414 Mon Sep 17 00:00:00 2001
From: Stewart Martin-Haugh <smh@cern.ch>
Date: Fri, 14 Aug 2020 17:38:37 +0200
Subject: [PATCH] Make T2VertexBeamSpot reentrant

---
 .../TrigT2BeamSpot/T2VertexBeamSpot.h         |   9 +-
 .../TrigT2BeamSpot/T2VertexBeamSpotTool.h     |  33 +++--
 .../TrigT2BeamSpot/src/T2VertexBeamSpot.cxx   |  61 ++-------
 .../src/T2VertexBeamSpotTool.cxx              | 127 ++++++------------
 4 files changed, 72 insertions(+), 158 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h
index 66b394a62de..dbcc132a655 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h
@@ -29,7 +29,7 @@
 /// trigger EDM
 #include "TrigInterfaces/AllTEAlgo.h"
 //Interface for the beam spot tool
-#include "IT2VertexBeamSpotTool.h"
+#include "T2VertexBeamSpotTool.h"
 
 namespace HLT {
   class TriggerElement;
@@ -86,6 +86,11 @@ namespace PESA {
       /** Function which attaches splitted vertex collections to the trigger element output */
       HLT::ErrorCode attachFeatureSplitVertex(DataVector< TrigVertexCollection > &mySplitVertexCollections,  HLT::TEVec &allTEs, unsigned int type_out );
 
+      //Until HLT::Algo inherits from AthReentrantAlgorithm or we can drop Run-2 setup
+      virtual bool isClonable() const override { return true; }
+      virtual unsigned int cardinality() const override { return 0; }//Mark as re-entrant
+
+
       //Only for Run2 settings
       bool m_activateTE; /*If true to be added */
       bool m_activateAllTE;/*If true to be added */
@@ -116,7 +121,7 @@ namespace PESA {
       SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey  { this, "EventInfo", "EventInfo", "" };
 
       //Tools
-      ToolHandle<IT2VertexBeamSpotTool> m_beamSpotTool {this, "BeamSpotTool", "PESA::T2VertexBeamSpotTool/T2VertexBeamSpotTool" };
+      ToolHandle<T2VertexBeamSpotTool> m_beamSpotTool {this, "BeamSpotTool", "PESA::T2VertexBeamSpotTool/T2VertexBeamSpotTool" };
       ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
 
 
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h
index af8af7b0e92..795429cd4fc 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h
@@ -27,6 +27,7 @@
 #include <memory>
 // Local tools
 #include "../src/T2TrackManager.h"
+#include "../src/T2Track.h"
 #include "../src/T2BeamSpot.h"
 #include "../src/T2SplitVertex.h"
 //Athena tools
@@ -37,8 +38,6 @@
 //Tracking
 #include "TrkTrack/TrackCollection.h"
 #include "TrigInDetToolInterfaces/ITrigPrimaryVertexFitter.h"
-//BeamSpotTool interface
-#include "IT2VertexBeamSpotTool.h"
 //Data handles
 #include "StoreGate/ReadCondHandleKey.h"
 //Beam data
@@ -68,7 +67,7 @@ namespace PESA {
     *   @author David W. Miller     <David.W.Miller@cern.ch>
     *   
     */
-   class T2VertexBeamSpotTool :  public AthAlgTool, virtual public IT2VertexBeamSpotTool{
+   class T2VertexBeamSpotTool :  public AthAlgTool {
       public:
 
          T2VertexBeamSpotTool( const std::string& type, const std::string& name, const IInterface* parent );
@@ -100,20 +99,14 @@ namespace PESA {
 
 
          void selectTracks( const TrackCollection* trackCollection,
-               ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter   );
-
-         void reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
-               TrigVertexCollection& myVertexCollection,
-               DataVector< TrigVertexCollection >& mySplitVertexCollections );
+               ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) const;
 
+         unsigned int reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
+                      TrigVertexCollection& myVertexCollection,
+                      DataVector< TrigVertexCollection >& mySplitVertexCollections, const EventContext& ) const;
 
          void reconstructSplitVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
-               DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer );
-
-
-         bool eventStage( Statistics stage );
-
-         void resetMonitoredVariables();
+               DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer, const EventContext& ) const;
 
          bool m_passNpvTrigCuts;
 
@@ -170,20 +163,24 @@ namespace PESA {
          unsigned int m_maxNpvTrigger;
 
          /* Monitor track parameters */
-         void monitor_tracks(std::string prefix, std::string suffix, std::vector<const T2Track*> tracks );
+         void monitor_tracks(const std::string& prefix, const std::string& suffix, const std::vector<T2Track>& tracks ) const;
 
          /* Monitor cluster parameters */
-         void monitor_cluster( const T2TrackClusterer& clusterer  );
+         void monitor_cluster( const T2TrackClusterer& clusterer  ) const;
 
          /* Monitor  parameters of tracks inside the cluster */
-         void monitor_cluster_tracks(T2TrackClusterer& clusterer, const Trk::Track & track  );
+         void monitor_cluster_tracks(T2TrackClusterer& clusterer, const Trk::Track & track  ) const;
 
          /* Monitor  vertex parameters  */
-         void monitor_vertex(std::string prefix, std::string suffix, const T2Vertex &vertex );
+         void monitor_vertex(const std::string& prefix, const std::string& suffix, const T2Vertex &vertex ) const;
+
+         std::string m_vertexCollName;
 
       private:
          ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
 
+         
+
 
    };
 
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx
index b64d686df28..0ed455d0a96 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx
@@ -104,19 +104,14 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
   // Start the overall timer
   auto tTotal = Monitored::Timer("TIME_TotalTime");
 
-  //Reset monitored variables from previous event 
-  m_beamSpotTool->resetMonitoredVariables();
-  // Initialize booleans for event stats
-  m_beamSpotTool->m_eventStageFlag = std::vector<bool>( numStatistics, false );
-  m_beamSpotTool->eventStage( allInput );
-
   // Initialize vertex collections
   TrigVertexCollection myVertexCollection;
   DataVector< TrigVertexCollection > mySplitVertexCollections;
 
   // Be optimistic
   HLT::ErrorCode errorCode = HLT::OK;
-
+  unsigned int nPassVtx = 0;
+  const EventContext& ctx = Algorithm::getContext();
   // Process event - break to do cleanup before returning
   do 
     {
@@ -128,8 +123,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
       }
       else ATH_MSG_DEBUG( "Number of input TEs = " << tes_in.size() );
   
-      m_beamSpotTool->eventStage( hasTE );
-      
       //-----------------
       // Track selection
 
@@ -225,20 +218,16 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
 
 
 
-      m_beamSpotTool->eventStage( hasSeedTrack );
-
       // Check for the total number of available tracks
       if( m_beamSpotTool->notEnoughTracks( nSelectedTracks ) ){
          ATH_MSG_DEBUG( " Not enough total passed tracks to vertex");
          break;
       }
 
-      m_beamSpotTool->eventStage( enoughTracks );
-
       //-----------------------
       // Vertex reconstruction
       // Cluster tracks in z around seed track and reconstruct vertices
-      m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, myVertexCollection, mySplitVertexCollections );
+      nPassVtx = m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, myVertexCollection, mySplitVertexCollections, ctx );
 
     } while (false);
 
@@ -258,9 +247,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
    HLT::TEVec allTEs =  getAllTEs(tes_in);
    ATH_MSG_DEBUG( "n of all TEs: " << allTEs.size() );
 
-   //Check how many vertices passed the selection
-   unsigned int nPassedVtx = m_beamSpotTool->m_NvtxPass;
-
    //Save all events, or only those events which pass the Npv cuts (if activated)!
    if ( m_activateAllTE ) {
       ATH_MSG_DEBUG( "Activate all TEs" );
@@ -270,10 +256,10 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
    }
 
 
-   if ( ! m_activateAllTE && m_activateTE && nPassedVtx > 0 ) {
-      ATH_MSG_DEBUG( "Activate TE with "<< nPassedVtx << " vertices" );
+   if ( ! m_activateAllTE && m_activateTE && nPassVtx > 0 ) {
+      ATH_MSG_DEBUG( "Activate TE with "<< nPassVtx << " vertices" );
       // FIXME: Why do we need one TE per vertex?
-      for ( unsigned i=0; i < nPassedVtx; ++i ) {
+      for ( unsigned i=0; i < nPassVtx; ++i ) {
          // Create an output TE seeded by the inputs
          HLT::TriggerElement* outputTE = config()->getNavigation()->addNode(allTEs, type_out);
          outputTE->setActiveState(true);
@@ -299,10 +285,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
 
 
 
-   //Monitoring eventStatistics
-   auto eventStatistics = Monitored::Collection("EventStatistics", m_beamSpotTool->m_eventStage );
-   auto mon = Monitored::Group(m_monTool,  eventStatistics, timeToCreateOutput );
-
   // Return cause you're done!
   return errorCode;
 }
@@ -418,25 +400,10 @@ StatusCode T2VertexBeamSpot::execute(){
 
    ATH_MSG_DEBUG( "Beam spot algorithm execute method" );
 
-
-
-   //Reset monitored variables from previous event
-   m_beamSpotTool->resetMonitoredVariables();
-   // Initialize booleans for event stats
-   m_beamSpotTool->m_eventStageFlag = std::vector<bool>( numStatistics, false );
-   m_beamSpotTool->eventStage( allInput );
-
    const EventContext& ctx = Algorithm::getContext();
-   ATH_MSG_DEBUG( "Run: " << ctx.eventID().run_number() <<
-         " Event Number: " << ctx.eventID().event_number() <<
-         " Lumi Block: " << ctx.eventID().lumi_block() <<
-         " Bunch Crossing ID " << ctx.eventID().bunch_crossing_id() );
-
-   //Pass event ID for vertex splitting alg, TODO: need to revisit 
-   m_beamSpotTool->m_EventID = ctx.eventID().event_number() ;
 
    //// Initialize vertex collections
-   SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey);
+   SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey, ctx);
    myVertexCollection = std::make_unique<TrigVertexCollection>();
 
    //Need to convert to the write handles
@@ -452,7 +419,6 @@ StatusCode T2VertexBeamSpot::execute(){
    unsigned nHighPtTracks = 0;
 
    ATH_MSG_DEBUG( "Selecting tracks" );
-   //Loop over trackCollections
    {
       //Monitor how long does it take to loop over all collections
       auto tSelectingTracks = Monitored::Timer("TIME_SelectingTracks");
@@ -462,7 +428,7 @@ StatusCode T2VertexBeamSpot::execute(){
       auto nTotalPassedTracks = Monitored::Scalar<unsigned>("nTotalPassedTracks");
       auto nTotalHighPTTracks = Monitored::Scalar<unsigned>("nTotalHighPTTracks");
       //Loop over track collections and select tracks
-      SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey);
+      SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey, ctx);
       ATH_CHECK(trackCollection.isValid());
 
       //Dereference tracks
@@ -494,37 +460,28 @@ StatusCode T2VertexBeamSpot::execute(){
       return StatusCode::SUCCESS;
    }
 
-   m_beamSpotTool->eventStage( hasSeedTrack );
-
    // Check for the total number of available tracks
    if (  ( m_beamSpotTool->notEnoughTracks(nSelectedTracks)) ) {
       ATH_MSG_DEBUG( "Not enough total passed tracks to vertex");
       return StatusCode::SUCCESS;
    }
 
-   m_beamSpotTool->eventStage( enoughTracks );
-
    ATH_MSG_DEBUG( "Reconstruct vertices" );
    //Reconstruct vertices if passed track selection
    {
       //Monitor how long does it take to loop over all collections
       auto tReconstructVertices = Monitored::Timer("TIME_ReconstructVertices");
-      m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections );
+      m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections, ctx );
       //Monitor total number of tracks
       auto monitor = Monitored::Group(m_monTool, tReconstructVertices);
    }
 
-   //Do i want to call createOutputTEs even if the conditions are not fulfilled?
    ATH_MSG_DEBUG( "Number of track collection containers: " << mySelectedTrackCollection.size() );
 
    //What should go as an output? SelectedTrackCollection and Vertices?
    //Atm just try add vertex
    //TODO: adding split vertices as well, will need an array
 
-
-   //Monitoring eventStatistics
-   auto eventStatistics = Monitored::Collection("EventStatistics", m_beamSpotTool->m_eventStage );
-   auto monitor = Monitored::Group(m_monTool, eventStatistics, tTotal);
    return StatusCode::SUCCESS;
 } 
 
diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx
index e0e9a225143..81e8fda7e0e 100644
--- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx
+++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx
@@ -42,16 +42,6 @@ using std::abs;
 using namespace PESA;
 
 
-//Delete a vector of dynamically created objects
-template<typename T>
-void deleteVector(std::vector<T*> &v){
-   while(!v.empty()){
-      delete v.back();
-      v.pop_back();
-   }
-   v.clear();
-}
-
 namespace Beamspot
 { 
   class TrackPTSort{
@@ -81,7 +71,6 @@ PESA::T2VertexBeamSpotTool::T2VertexBeamSpotTool( const std::string& type, const
    : AthAlgTool( type, name, parent),
    m_primaryVertexFitterTool("TrigInDetToolInterfaces/ITrigPrimaryVertexFitter", this){
 
-   declareInterface<IT2VertexBeamSpotTool>(this);
    //Declare properties in here
    declareProperty( "BeamSpotData",  m_beamSpotKey   );
    declareProperty( "PrimaryVertexFitter",  m_primaryVertexFitterTool);
@@ -165,7 +154,7 @@ StatusCode T2VertexBeamSpotTool::initialize(){
 *  Detailed description of the select track function
  ***********************************************/
 void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
-      ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) {
+      ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) const {
 
    ATH_MSG_DEBUG( "Selecting tracks for the beamSpot algorithm" );
 
@@ -177,7 +166,7 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
    auto nHiPTTracksPassedPerROI = Monitored::Scalar<unsigned>("SelectedHiPTTracksPerROI", 0);
 
    //T2Track with easily accesable parameters
-   std::vector<const T2Track*> myTracks; myTracks.reserve(trackCollection->size() );
+   std::vector<T2Track> myTracks; myTracks.reserve(trackCollection->size() );
 
    // Loop over all tracks in the given track collections
    for ( TrackCollection::const_iterator trackIter = trackCollection->begin();
@@ -186,13 +175,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
       const Trk::Track& track = **trackIter;
 
       // Make sure that the event has tracks
-      eventStage( hasTracks );
       //Counter for all input tracks
       nTracksPerROI++;
 
-      const T2Track *myTrack = new T2Track( track );
+      T2Track myTrack( track );
       // Check for passed track
-      if ( isGoodTrack( *myTrack ) ) {
+      if ( isGoodTrack( myTrack ) ) {
          // Add this track to the set used to find a vertex
          mySelectedTrackCollection.push_back( *trackIter );
 
@@ -203,22 +191,22 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
          nTracksPassedPerROI++;
 
          // Check for high-pT track
-         if ( myTrack->Pt() > m_trackSeedPt ){
+         if ( myTrack.Pt() > m_trackSeedPt ){
             //Counter for high pT tracks
             nHiPTTracksPassedPerROI++;
          }
-         else ATH_MSG_DEBUG( "Track->pt: " << myTrack->Pt()*GeV );
+         else ATH_MSG_DEBUG( "Track.pt: " << myTrack.Pt()*GeV );
       }
       else {
-         ATH_MSG_DEBUG( "Track->failed selection: d0: " << myTrack->D0() <<
-               " z0: " << myTrack->Z0() <<
-               " phi0: " << myTrack->Phi() <<
-               " eta: " << myTrack->Eta() <<
-               " pT: " << myTrack->Pt()*GeV <<
-               " chi2: " << myTrack->Qual() <<
-               " NpixSPs: " << myTrack->PIXHits() <<
-               " NsctSPs: " << myTrack->SCTHits() <<
-               " NstrawHits: " << myTrack->TRTHits() );
+         ATH_MSG_DEBUG( "Track.failed selection: d0: " << myTrack.D0() <<
+               " z0: " << myTrack.Z0() <<
+               " phi0: " << myTrack.Phi() <<
+               " eta: " << myTrack.Eta() <<
+               " pT: " << myTrack.Pt()*GeV <<
+               " chi2: " << myTrack.Qual() <<
+               " NpixSPs: " << myTrack.PIXHits() <<
+               " NsctSPs: " << myTrack.SCTHits() <<
+               " NstrawHits: " << myTrack.TRTHits() );
       }
    } //end for loop over tracks in a collection
 
@@ -236,14 +224,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
       //Monitor counters per track collection and time to select tracks
       auto mon = Monitored::Group(m_monTool, nTracksPerROI, nTracksPassedPerROI, nHiPTTracksPassedPerROI,
                  timerTrackSelection ); //timers
-      //clear tracks
-      deleteVector( myTracks );
 }
 
 
-void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
+unsigned int T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
                                            TrigVertexCollection& myVertexCollection,
-                                           DataVector< TrigVertexCollection >&  mySplitVertexCollections) {
+                                           DataVector< TrigVertexCollection >&  mySplitVertexCollections, const EventContext& ctx) const {
     ATH_MSG_DEBUG( "Reconstructing vertices" );
 
    //Monitoring counters and timers
@@ -309,7 +295,6 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
       }
 
       // Event has a good cluster
-      eventStage( hasCluster );
       nClusters++;
 
       // Monitor properties of of the cluster
@@ -339,14 +324,11 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
          continue; 
       }
 
-      // Event has a vertex!
-      eventStage( hasVertex );
-
       // Update vertex counter
       nVtx++;
 
       // Extract beam spot parameters
-      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
+      SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx };
 
       T2BeamSpot beamSpot(*beamSpotHandle);
 
@@ -369,10 +351,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
       // Add primary vertex to collection
       myVertexCollection.push_back( primaryVertex ); // passes ownership to vertex collection
 
-      // Event has good vertex
-      eventStage( hasGoodVertex );
-
-      //Monito parameters of the  passed vertex 
+      //Monitor parameters of the  passed vertex 
       monitor_vertex( "Vertex", "Pass", myVertex ); 
 
       //Update good vertex counter
@@ -405,7 +384,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
          {
             // Split, optinally re-cluster, and fit separate vertices
             ATH_MSG_DEBUG( "Reconstruct split vertices");
-            reconstructSplitVertices( mySplitTrackCollection, mySplitVertexCollections, trackClusterer );
+            reconstructSplitVertices( mySplitTrackCollection, mySplitVertexCollections, trackClusterer, ctx );
          }
          // Alternative 3: Split all the tracks and iterate with the remaining tracks
          //          mySplitTrackCollection = mySelectedTrackCollection;
@@ -426,19 +405,15 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
 
     }//End looping over tracks
 
-  //Store flag whether the nvtx passed trig cuts
-  m_passNpvTrigCuts =  (m_minNpvTrigger <= nPassVtx) && (nPassVtx <= m_maxNpvTrigger); 
-  //Keep the track of how many vertices passed the selection
-  m_NvtxPass  = nPassVtx;
-
   //monitor number of (passed) vertices, clusters, etc
   auto mon = Monitored::Group(m_monTool,  nVtx, nPassVtx, nPassBCIDVtx, nClusters, timerVertexRec );
+  return static_cast<unsigned int>(nPassVtx);
 }
 
 
 void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollection>& myFullTrackCollection,
                                                 DataVector< TrigVertexCollection >& mySplitVertexCollections,
-                                                T2TrackClusterer& trackClusterer ) {
+                                                T2TrackClusterer& trackClusterer, const EventContext& ctx ) const {
   auto timerVertexRec = Monitored::Timer("TIME_SplitVertexReconstruction");
 
 
@@ -449,10 +424,8 @@ void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollec
      auto mon = Monitored::Group(m_monTool,  timeToSortTracks ); 
   }
 
-  // Split the track collection (typically into halves)
   // This returns m_nSplitVertices (ideally) or fewer (if clustering fails) track collections
-  m_trackManager.ResetKey( m_EventID % 2 - 1 );
-  vector< ConstDataVector<TrackCollection> > splitTrackCollections = m_trackManager.split( *myFullTrackCollection.asDataVector() );
+  vector< ConstDataVector<TrackCollection> > splitTrackCollections = m_trackManager.split( *myFullTrackCollection.asDataVector(), ctx );
 
   // Add a new track collection for the split vertices corresponding to this primary vertex
   // There can be anywhere between zero and m_nSplitVertices entries in the collection
@@ -582,38 +555,29 @@ bool T2VertexBeamSpotTool::isGoodVertexBCID( const T2Vertex& vertex ) const {
      );
 }
 
-void T2VertexBeamSpotTool::resetMonitoredVariables() {
-   if(m_eventStageFlag.size() != 0 ) m_eventStageFlag.clear();
-   if(m_eventStage.size() != 0 ) m_eventStage.clear();
-   //Reset all variables just in case
-   m_NvtxPass = 0;
-   m_passNpvTrigCuts = false;
-
-}
-
 
 //Monitoring track variables
-void T2VertexBeamSpotTool::monitor_tracks(std::string prefix, std::string suffix, std::vector<const T2Track*> tracks ){
-   auto  trackPt      = Monitored::Collection(  prefix + "Pt"       + suffix, tracks, [](const T2Track *t){ return t->Pt()      ;});
-   auto  trackEta     = Monitored::Collection(  prefix + "Eta"      + suffix, tracks, [](const T2Track *t){ return t->Eta()     ;});
-   auto  trackPhi     = Monitored::Collection(  prefix + "Phi"      + suffix, tracks, [](const T2Track *t){ return t->Phi()     ;});
-   auto  trackZ0      = Monitored::Collection(  prefix + "Z0"       + suffix, tracks, [](const T2Track *t){ return t->Z0()      ;});
-   auto  trackD0      = Monitored::Collection(  prefix + "D0"       + suffix, tracks, [](const T2Track *t){ return t->D0()      ;});
-   auto  trackZ0err   = Monitored::Collection(  prefix + "Z0err"    + suffix, tracks, [](const T2Track *t){ return t->Z0err()   ;});
-   auto  trackD0err   = Monitored::Collection(  prefix + "D0err"    + suffix, tracks, [](const T2Track *t){ return t->D0err()   ;});
-   auto  trackNDF     = Monitored::Collection(  prefix + "NDF"      + suffix, tracks, [](const T2Track *t){ return t->NDF()     ;});
-   auto  trackQual    = Monitored::Collection(  prefix + "Qual"     + suffix, tracks, [](const T2Track *t){ return t->Qual()    ;});
-   auto  trackChi2Prob= Monitored::Collection(  prefix + "Chi2Prob" + suffix, tracks, [](const T2Track *t){ return t->Chi2Prob();});
-   auto  trackSiHits  = Monitored::Collection(  prefix + "SiHits"   + suffix, tracks, [](const T2Track *t){ return t->SiHits()  ;});
-   auto  trackPiHits  = Monitored::Collection(  prefix + "PIXHits"  + suffix, tracks, [](const T2Track *t){ return t->PIXHits() ;});
-   auto  trackSCTHits = Monitored::Collection(  prefix + "SCTHits"  + suffix, tracks, [](const T2Track *t){ return t->SCTHits() ;});
-   auto  trackTRTHits = Monitored::Collection(  prefix + "TRTHits"  + suffix, tracks, [](const T2Track *t){ return t->TRTHits() ;});
+void T2VertexBeamSpotTool::monitor_tracks(const std::string& prefix, const std::string& suffix, const std::vector<T2Track>& tracks ) const {
+   auto  trackPt      = Monitored::Collection(  prefix + "Pt"       + suffix, tracks, [](const T2Track t){ return t.Pt()      ;});
+   auto  trackEta     = Monitored::Collection(  prefix + "Eta"      + suffix, tracks, [](const T2Track t){ return t.Eta()     ;});
+   auto  trackPhi     = Monitored::Collection(  prefix + "Phi"      + suffix, tracks, [](const T2Track t){ return t.Phi()     ;});
+   auto  trackZ0      = Monitored::Collection(  prefix + "Z0"       + suffix, tracks, [](const T2Track t){ return t.Z0()      ;});
+   auto  trackD0      = Monitored::Collection(  prefix + "D0"       + suffix, tracks, [](const T2Track t){ return t.D0()      ;});
+   auto  trackZ0err   = Monitored::Collection(  prefix + "Z0err"    + suffix, tracks, [](const T2Track t){ return t.Z0err()   ;});
+   auto  trackD0err   = Monitored::Collection(  prefix + "D0err"    + suffix, tracks, [](const T2Track t){ return t.D0err()   ;});
+   auto  trackNDF     = Monitored::Collection(  prefix + "NDF"      + suffix, tracks, [](const T2Track t){ return t.NDF()     ;});
+   auto  trackQual    = Monitored::Collection(  prefix + "Qual"     + suffix, tracks, [](const T2Track t){ return t.Qual()    ;});
+   auto  trackChi2Prob= Monitored::Collection(  prefix + "Chi2Prob" + suffix, tracks, [](const T2Track t){ return t.Chi2Prob();});
+   auto  trackSiHits  = Monitored::Collection(  prefix + "SiHits"   + suffix, tracks, [](const T2Track t){ return t.SiHits()  ;});
+   auto  trackPiHits  = Monitored::Collection(  prefix + "PIXHits"  + suffix, tracks, [](const T2Track t){ return t.PIXHits() ;});
+   auto  trackSCTHits = Monitored::Collection(  prefix + "SCTHits"  + suffix, tracks, [](const T2Track t){ return t.SCTHits() ;});
+   auto  trackTRTHits = Monitored::Collection(  prefix + "TRTHits"  + suffix, tracks, [](const T2Track t){ return t.TRTHits() ;});
    auto mon = Monitored::Group(m_monTool, trackPt, trackEta, trackPhi, trackZ0, trackD0, trackZ0err, trackD0err,
                                trackNDF, trackQual, trackChi2Prob, trackSiHits, trackPiHits, trackSCTHits, trackTRTHits );
 }
 
 
-void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer  ){
+void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer  ) const {
    auto  clusterZ                = Monitored::Scalar<double>("ClusterZ", clusterer.seedZ0()            );
    auto  clusterNtracks          = Monitored::Scalar<int>("ClusterZ", clusterer.cluster().size()       );
    auto  clusterNUnusedTracks    = Monitored::Scalar<int>("ClusterZ", clusterer.unusedTracks().size()  );
@@ -622,7 +586,7 @@ void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer  )
 }
 
 
-void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, const Trk::Track &track  ){
+void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, const Trk::Track &track  ) const {
    const double deltaZ0 = track.perigeeParameters()->parameters()[Trk::z0] - clusterer.seedZ0();
    const AmgSymMatrix(5)& perigeeCov = *track.perigeeParameters()->covariance();
    const double z0Error = std::sqrt(perigeeCov(Trk::z0,Trk::z0));
@@ -635,7 +599,7 @@ void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, c
 
 
 
-void T2VertexBeamSpotTool::monitor_vertex(std::string prefix, std::string suffix, const T2Vertex &vertex ){
+void T2VertexBeamSpotTool::monitor_vertex(const std::string& prefix, const std::string& suffix, const T2Vertex &vertex ) const {
 
    auto ntrk      = Monitored::Scalar<int>   ( prefix + "NTrks"      + suffix, vertex.NTrks()      ); 
    auto sumpt     = Monitored::Scalar<double>( prefix + "SumPt"      + suffix, vertex.SumPt()      ); 
@@ -662,13 +626,4 @@ void T2VertexBeamSpotTool::monitor_vertex(std::string prefix, std::string suffix
   
 
 
-bool T2VertexBeamSpotTool::eventStage( Statistics stage ) {
-   if ( ! m_eventStageFlag[ stage ] )
-   {
-      m_eventStageFlag[ stage ] = true;
-      m_eventStage.push_back( stage );
-      return true;
-   }
-   return false;
-}
 
-- 
GitLab