From 26d48988421912a436567c25a5c818596cd42eab Mon Sep 17 00:00:00 2001
From: Hideyuki Oide <Hideyuki.Oide@cern.ch>
Date: Thu, 21 Sep 2017 15:37:59 +0200
Subject: [PATCH] VrtSecInclusive:  added track selection using electrons

Former-commit-id: 4e91a71dded76753c9ad67319fe0bdafcee616c8
---
 .../VrtSecInclusive/VrtSecInclusive.h         |  4 +++-
 .../src/TrackSelectionAlgs.cxx                | 22 +++++++++++++++++++
 .../VKalVrt/VrtSecInclusive/src/Utilities.cxx |  3 ++-
 .../VrtSecInclusive/src/VrtSecInclusive.cxx   | 20 ++++++++++++-----
 4 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/VrtSecInclusive.h b/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/VrtSecInclusive.h
index 7a22fb21eef3..d76bec130245 100755
--- a/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/VrtSecInclusive.h
+++ b/Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/VrtSecInclusive.h
@@ -196,6 +196,7 @@ namespace VKalVrtAthena {
       
       // vertexing using muons (test implementation)
       bool doSelectTracksFromMuons;
+      bool doSelectTracksFromElectrons;
       
       // Additional dressing option
       bool doAugmentDVimpactParametersToMuons;     // potentially useful for DV + muon search
@@ -312,9 +313,10 @@ namespace VKalVrtAthena {
     /** select tracks which become seeds for vertex finding */
     StatusCode selectTracks();
     StatusCode selectTracksFromMuons();
+    StatusCode selectTracksFromElectrons();
     
     using TrackSelectionAlg = StatusCode (VrtSecInclusive::*)();
-    TrackSelectionAlg m_trackSelectionAlg;
+    std::vector<TrackSelectionAlg> m_trackSelectionAlgs;
     
     /** track-by-track selection strategies */
     bool selectTrack_notPVassociated ( const xAOD::TrackParticle* ) const;
diff --git a/Reconstruction/VKalVrt/VrtSecInclusive/src/TrackSelectionAlgs.cxx b/Reconstruction/VKalVrt/VrtSecInclusive/src/TrackSelectionAlgs.cxx
index b0aea2e22d4a..65ae7be4f75c 100644
--- a/Reconstruction/VKalVrt/VrtSecInclusive/src/TrackSelectionAlgs.cxx
+++ b/Reconstruction/VKalVrt/VrtSecInclusive/src/TrackSelectionAlgs.cxx
@@ -202,4 +202,26 @@ namespace VKalVrtAthena {
     return StatusCode::SUCCESS;
   }
   
+  //____________________________________________________________________________________________________
+  StatusCode  VrtSecInclusive::selectTracksFromElectrons() { 
+    
+    const xAOD::ElectronContainer *electrons( nullptr );
+    ATH_CHECK( evtStore()->retrieve( electrons, "Electrons" ) );
+    
+    static SG::AuxElement::Decorator< char > decor_isSelected( "is_selected" );
+    
+    for( const auto& electron : *electrons ) {
+      if( 0 == electron->nTrackParticles() ) continue;
+      
+      // The first track is the best-matched track
+      const auto* trk = electron->trackParticle(0);
+      if( trk ) {
+        decor_isSelected( *trk ) = true;
+        m_selectedTracks->emplace_back( trk );
+      }
+    }
+    
+    return StatusCode::SUCCESS;
+  }
+  
 } // end of namespace VKalVrtAthena
diff --git a/Reconstruction/VKalVrt/VrtSecInclusive/src/Utilities.cxx b/Reconstruction/VKalVrt/VrtSecInclusive/src/Utilities.cxx
index 5081c4c13444..cb44cdcb39e2 100644
--- a/Reconstruction/VKalVrt/VrtSecInclusive/src/Utilities.cxx
+++ b/Reconstruction/VKalVrt/VrtSecInclusive/src/Utilities.cxx
@@ -702,9 +702,10 @@ namespace VKalVrtAthena {
     
     // A test implementation for muon vertices
     declareProperty("doSelectTracksFromMuons",         m_jp.doSelectTracksFromMuons         = false                         );
+    declareProperty("doSelectTracksFromElectrons",     m_jp.doSelectTracksFromElectrons     = false                         );
     
     // Additional dressing option
-    declareProperty("doAugmentDVimpactParametersToMuons", m_jp.doAugmentDVimpactParametersToMuons = false                   );
+    declareProperty("doAugmentDVimpactParametersToMuons",     m_jp.doAugmentDVimpactParametersToMuons     = false           );
     declareProperty("doAugmentDVimpactParametersToElectrons", m_jp.doAugmentDVimpactParametersToElectrons = false           );
     
     // Additional ToolHandles
diff --git a/Reconstruction/VKalVrt/VrtSecInclusive/src/VrtSecInclusive.cxx b/Reconstruction/VKalVrt/VrtSecInclusive/src/VrtSecInclusive.cxx
index 835733775bee..ff1aff1fb66b 100644
--- a/Reconstruction/VKalVrt/VrtSecInclusive/src/VrtSecInclusive.cxx
+++ b/Reconstruction/VKalVrt/VrtSecInclusive/src/VrtSecInclusive.cxx
@@ -150,13 +150,21 @@ namespace VKalVrtAthena {
     }
     
     // Track selection algorithm configuration
-    if( !m_jp.doSelectTracksFromMuons ) {
+    if( m_jp.doSelectTracksFromMuons ) {
       
-      m_trackSelectionAlg = &VrtSecInclusive::selectTracks;
+      m_trackSelectionAlgs.emplace_back( &VrtSecInclusive::selectTracksFromMuons );
       
-    } else {
+    }
+    
+    if( m_jp.doSelectTracksFromElectrons ) {
+      
+      m_trackSelectionAlgs.emplace_back( &VrtSecInclusive::selectTracksFromElectrons );
       
-      m_trackSelectionAlg = &VrtSecInclusive::selectTracksFromMuons;
+    }
+    
+    if( !m_jp.doSelectTracksFromMuons && !m_jp.doSelectTracksFromElectrons ) {
+      
+      m_trackSelectionAlgs.emplace_back( &VrtSecInclusive::selectTracks );
       
     }
     
@@ -361,7 +369,9 @@ namespace VKalVrtAthena {
     }    
 
     // Perform track selection and store it to selectedBaseTracks
-    ATH_CHECK( (this->*m_trackSelectionAlg)() );
+    for( auto alg : m_trackSelectionAlgs ) {
+      ATH_CHECK( (this->*alg)() );
+    }
     
     if( m_jp.FillNtuple )
       m_ntupleVars->get<unsigned int>( "NumSelTrks" ) = static_cast<int>( m_selectedTracks->size() );
-- 
GitLab