28   bool VrtSecInclusive::selectTrack_d0Cut       ( 
const xAOD::TrackParticle* trk )
 const { 
return ( fabs( trk->
d0() ) > m_jp.d0TrkPVDstMinCut && fabs( trk->
d0() ) < m_jp.d0TrkPVDstMaxCut ); }
 
   29   bool VrtSecInclusive::selectTrack_z0Cut       ( 
const xAOD::TrackParticle* trk )
 const { 
return ( fabs( trk->
z0() ) > m_jp.z0TrkPVDstMinCut && fabs( trk->
z0() ) < m_jp.z0TrkPVDstMaxCut ); }
 
   34   bool VrtSecInclusive::selectTrack_pTCut       ( 
const xAOD::TrackParticle* trk )
 const { 
return trk->
pt() > m_jp.TrkPtCut; }
 
   54     uint8_t SharedHits = PixShare + SCTShare;
 
   57     if( !m_jp.SAloneTRT ) {
 
   58       if(PixelHits           < m_jp.CutPixelHits)  
return false;
 
   59       if(SCTHits             < m_jp.CutSctHits)    
return false;
 
   60       if((PixelHits+SCTHits) < m_jp.CutSiHits)     
return false;
 
   61       if(BLayHits            < m_jp.CutBLayHits)   
return false;
 
   62       if(SharedHits          > m_jp.CutSharedHits) 
return false;
 
   66     if( m_jp.doTRTPixCut ) {
 
   67       if(TRTHits == 0 && PixelHits < 2)           
return false;
 
   70     if( PixelHits == 0 && SCTHits < 6 ) 
return false;
 
   85     if( trk->
pt() > 20.e3 ) 
return true;
 
   87     if( SCTHits < m_jp.CutTightSCTHits                   ) 
return false;
 
   89     if( fabs( trk->
eta() ) < 1.7 ) {
 
   90       if( TRTHits < m_jp.CutTightTRTHits ) 
return false;
 
  112       bool geometric_cut = dTheta < 1. || std::fabs(trk->
z0()) < 200. ;
 
  114       bool z0_cut = trk->
z0() <= 500. ;
 
  116       bool NSiHits_cut = 
nSiHits >=8 ;
 
  117       bool NSCTHits_cut = nsct >= 7 ;
 
  120       ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": z0_cut, chi2_cut, NSiHits_cut, NSCTHits_cut, NSCTHoles_cut  = " <<z0_cut<<
", "<<chi2_cut<<
", "<<NSiHits_cut<<
", "<<NSCTHits_cut<<
", "<< NSCTHoles_cut );
 
  121       ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": npix, nsct, nSiHits, nSCTHoles, dTheta, z0, d0, chi2  = " <<
unsigned(npix)<<
", "<<
unsigned(nsct)<<
", "<<
unsigned(
nSiHits)<<
", "<<
unsigned(
nSCTHoles)<<
", "<< dTheta<<
", "<< trk->
z0()<<
", "<< trk->
d0()<<
", " <<trk->
chiSquared() ) ;
 
  123       const std::bitset<xAOD::NumberOfTrackRecoInfo> patternReco = trk->
patternRecoInfo();
 
  124       bool isLRT = patternReco.test(49) ;
 
  127         return (z0_cut && chi2_cut && NSiHits_cut && NSCTHits_cut && NSCTHoles_cut && geometric_cut);
 
  138     if( !m_decor_isSelected ) {
 
  139       m_decor_isSelected.emplace( 
"is_selected" + m_jp.augVerString );
 
  143     if( m_trackSelectionFuncs.empty() && !m_jp.passThroughTrackSelection ) {
 
  146       if( m_jp.do_PVvetoCut )             m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_notPVassociated );
 
  147       if( m_jp.do_d0Cut )                 m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_d0Cut );
 
  148       if( m_jp.do_z0Cut )                 m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_z0Cut );
 
  149       if( m_jp.do_d0errCut )              m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_d0errCut );
 
  150       if( m_jp.do_z0errCut )              m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_z0errCut );
 
  151       if (m_jp.doSelectTracksWithLRTCuts) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_LRTR3Cut );
 
  156       m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_hitPattern );
 
  157       m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_hitPatternTight );
 
  158       m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_chi2Cut );
 
  159       m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_pTCut );
 
  163     if(  
std::find( m_selectedTracks.begin(), m_selectedTracks.end(), trk ) != m_selectedTracks.end() ) 
return;
 
  165     std::vector<bool> cutBits;
 
  167     cutBits.reserve(m_trackSelectionFuncs.size());
 
  168     for( 
auto func : m_trackSelectionFuncs ) cutBits.emplace_back( (this->*func)( trk ) );
 
  170     if( m_jp.FillHist ) {
 
  171       m_hists[
"trkSelCuts"]->Fill( 0 );
 
  172       for( 
size_t ibit = 0; ibit < cutBits.size(); ibit++) {
 
  173         if( cutBits.at(ibit) ) {
 
  174           m_hists[
"trkSelCuts"]->Fill( ibit+1 );
 
  182     bool isGood_standard = ( 
std::find( cutBits.begin(), cutBits.end(), 
false ) == cutBits.end() );
 
  184     if( isGood_standard ) {
 
  202       (*m_decor_isSelected)( *trk ) = 
true;
 
  203       if (m_jp.doSelectTracksFromElectrons  || m_jp.doSelectIDAndGSFTracks) {
 
  206         if (id_tr != 
nullptr){
 
  207         (*m_decor_isSelected)( *id_tr ) = 
true; }
 
  210       m_selectedTracks.emplace_back( trk );
 
  212       if( m_jp.FillNtuple ) m_ntupleVars->get< vector<int> >( 
"SelTrk_uniqueID" ).emplace_back(
uniqueID);
 
  214       ATH_MSG_VERBOSE( 
" > " << __FUNCTION__ << 
": Track index " << trk->index() << 
" has been selected." );
 
  215       ATH_MSG_VERBOSE( 
" > " << __FUNCTION__ << 
": Track index " << trk->index()
 
  217                        << 
" pt = "  << trk->pt()
 
  218                        << 
" eta = " << trk->eta()
 
  219                        << 
" d0 = "  << trk->d0()
 
  220                        << 
" z0 = "  << trk->z0() << 
"." );
 
  238     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Extracted xAOD::TrackParticle number=" << trackParticleContainer->
size() );
 
  240     if( m_jp.FillNtuple )
 
  241       m_ntupleVars->get<
unsigned int>( 
"NumAllTrks" ) = 
static_cast<int>( trackParticleContainer->
size() );
 
  245     for( 
const auto *trk : *trackParticleContainer ) { selectTrack( trk ); }
 
  247     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Number of total ID tracks   = " << trackParticleContainer->size() );
 
  248     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Number of selected tracks   = " << m_selectedTracks.size() );
 
  250     return StatusCode::SUCCESS;
 
  261     for( 
const auto *
const muon : *muons ) {
 
  262       const auto* trk = 
muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
 
  266       if (m_jp.doRemoveCaloTaggedMuons) {
 
  267         if (
muon->muonType() == xAOD::Muon::CaloTagged) 
continue;
 
  273     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Number of total muons       = " << muons->size() );
 
  274     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Number of selected tracks   = " << m_selectedTracks.size() );
 
  276     return StatusCode::SUCCESS;
 
  287       if( 0 == 
electron->nTrackParticles() ) 
continue;
 
  290       const auto* trk = 
electron->trackParticle(0);
 
  297     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Number of selected tracks   = " << m_selectedTracks.size() );
 
  299     return StatusCode::SUCCESS;
 
  321     std::vector<const xAOD::TrackParticle*> IDTrksFromEls;
 
  325       if( 0 == 
electron->nTrackParticles() ) { 
continue; }
 
  329       m_leptonicTracks.emplace_back(
el_trk);
 
  334     for( 
const auto *trk : *IDtracks ) {
 
  336       if ( 
std::find(IDTrksFromEls.begin(), IDTrksFromEls.end(), trk) != IDTrksFromEls.end() ) { 
continue; }
 
  341     for (
const auto *
muon : *muons) {
 
  342       if (m_jp.doRemoveCaloTaggedMuons && 
muon->muonType() == xAOD::Muon::CaloTagged) { 
continue; }
 
  343       const auto* 
mu_trk = 
muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
 
  345       m_leptonicTracks.emplace_back(
mu_trk);
 
  348     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Number of total ID tracks   = " << IDtracks->size() );
 
  350     ATH_MSG_DEBUG( 
" > " << __FUNCTION__ << 
": Number of selected tracks   = " << m_selectedTracks.size() );
 
  352     return StatusCode::SUCCESS;