27 bool VrtSecInclusive::selectTrack_d0Cut (
const xAOD::TrackParticle* trk )
const {
return ( fabs( trk->
d0() ) > m_jp.d0TrkPVDstMinCut && fabs( trk->
d0() ) < m_jp.d0TrkPVDstMaxCut ); }
28 bool VrtSecInclusive::selectTrack_z0Cut (
const xAOD::TrackParticle* trk )
const {
return ( fabs( trk->
z0() ) > m_jp.z0TrkPVDstMinCut && fabs( trk->
z0() ) < m_jp.z0TrkPVDstMaxCut ); }
33 bool VrtSecInclusive::selectTrack_pTCut (
const xAOD::TrackParticle* trk )
const {
return trk->
pt() > m_jp.TrkPtCut; }
53 uint8_t SharedHits = PixShare + SCTShare;
56 if( !m_jp.SAloneTRT ) {
57 if(PixelHits < m_jp.CutPixelHits)
return false;
58 if(SCTHits < m_jp.CutSctHits)
return false;
59 if((PixelHits+SCTHits) < m_jp.CutSiHits)
return false;
60 if(BLayHits < m_jp.CutBLayHits)
return false;
61 if(SharedHits > m_jp.CutSharedHits)
return false;
65 if( m_jp.doTRTPixCut ) {
66 if(TRTHits == 0 && PixelHits < 2)
return false;
69 if( PixelHits == 0 && SCTHits < 6 )
return false;
84 if( trk->
pt() > 20.e3 )
return true;
86 if( SCTHits < m_jp.CutTightSCTHits )
return false;
88 if( fabs( trk->
eta() ) < 1.7 ) {
89 if( TRTHits < m_jp.CutTightTRTHits )
return false;
111 bool geometric_cut = dTheta < 1. || std::fabs(trk->
z0()) < 200. ;
113 bool z0_cut = trk->
z0() <= 500. ;
115 bool NSiHits_cut =
nSiHits >=8 ;
116 bool NSCTHits_cut = nsct >= 7 ;
117 bool NSCTHoles_cut = nSCTHoles <= 1;
119 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": z0_cut, chi2_cut, NSiHits_cut, NSCTHits_cut, NSCTHoles_cut = " <<z0_cut<<
", "<<chi2_cut<<
", "<<NSiHits_cut<<
", "<<NSCTHits_cut<<
", "<< NSCTHoles_cut );
120 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() ) ;
122 const std::bitset<xAOD::NumberOfTrackRecoInfo> patternReco = trk->
patternRecoInfo();
123 bool isLRT = patternReco.test(49) ;
126 return (z0_cut && chi2_cut && NSiHits_cut && NSCTHits_cut && NSCTHoles_cut && geometric_cut);
137 if( !m_decor_isSelected ) m_decor_isSelected = std::make_unique< SG::AuxElement::Decorator< char > >(
"is_selected" + m_jp.augVerString );
140 if( m_trackSelectionFuncs.empty() && !m_jp.passThroughTrackSelection ) {
143 if( m_jp.do_PVvetoCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_notPVassociated );
144 if( m_jp.do_d0Cut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_d0Cut );
145 if( m_jp.do_z0Cut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_z0Cut );
146 if( m_jp.do_d0errCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_d0errCut );
147 if( m_jp.do_z0errCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_z0errCut );
148 if (m_jp.doSelectTracksWithLRTCuts) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_LRTR3Cut );
153 m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_hitPattern );
154 m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_hitPatternTight );
155 m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_chi2Cut );
156 m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_pTCut );
160 if(
std::find( m_selectedTracks->begin(), m_selectedTracks->end(), trk ) != m_selectedTracks->end() )
return;
162 std::vector<bool> cutBits;
164 cutBits.reserve(m_trackSelectionFuncs.size());
165 for(
auto func : m_trackSelectionFuncs ) cutBits.emplace_back( (this->*func)( trk ) );
167 if( m_jp.FillHist ) {
168 m_hists[
"trkSelCuts"]->Fill( 0 );
169 for(
size_t ibit = 0; ibit < cutBits.size(); ibit++) {
170 if( cutBits.at(ibit) ) {
171 m_hists[
"trkSelCuts"]->Fill( ibit+1 );
179 bool isGood_standard = (
std::find( cutBits.begin(), cutBits.end(),
false ) == cutBits.end() );
181 if( isGood_standard ) {
191 const auto* truth = getTrkGenParticle(trk);
199 (*m_decor_isSelected)( *trk ) =
true;
200 if (m_jp.doSelectTracksFromElectrons || m_jp.doSelectIDAndGSFTracks) {
203 if (id_tr !=
nullptr){
204 (*m_decor_isSelected)( *id_tr ) =
true; }
207 m_selectedTracks->emplace_back( trk );
209 if( m_jp.FillNtuple ) m_ntupleVars->get< vector<int> >(
"SelTrk_barcode" ).emplace_back(
barcode);
211 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Track index " << trk->index() <<
" has been selected." );
212 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Track index " << trk->index()
214 <<
" pt = " << trk->pt()
215 <<
" eta = " << trk->eta()
216 <<
" d0 = " << trk->d0()
217 <<
" z0 = " << trk->z0() <<
"." );
235 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Extracted xAOD::TrackParticle number=" << trackParticleContainer->
size() );
237 if( m_jp.FillNtuple )
238 m_ntupleVars->get<
unsigned int>(
"NumAllTrks" ) =
static_cast<int>( trackParticleContainer->
size() );
242 for(
const auto *trk : *trackParticleContainer ) { selectTrack( trk ); }
244 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of total ID tracks = " << trackParticleContainer->size() );
245 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of selected tracks = " << m_selectedTracks->size() );
247 return StatusCode::SUCCESS;
258 for(
const auto *
const muon : *muons ) {
259 const auto* trk =
muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
263 if (m_jp.doRemoveCaloTaggedMuons) {
264 if (
muon->muonType() == xAOD::Muon::CaloTagged)
continue;
270 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of total muons = " << muons->size() );
271 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of selected tracks = " << m_selectedTracks->size() );
273 return StatusCode::SUCCESS;
284 if( 0 ==
electron->nTrackParticles() )
continue;
287 const auto* trk =
electron->trackParticle(0);
294 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of selected tracks = " << m_selectedTracks->size() );
296 return StatusCode::SUCCESS;
318 std::vector<const xAOD::TrackParticle*> IDTrksFromEls;
322 if( 0 ==
electron->nTrackParticles() ) {
continue; }
326 m_leptonicTracks->emplace_back(
el_trk);
331 for(
const auto *trk : *IDtracks ) {
333 if (
std::find(IDTrksFromEls.begin(), IDTrksFromEls.end(), trk) != IDTrksFromEls.end() ) {
continue; }
338 for (
const auto *
muon : *muons) {
339 if (m_jp.doRemoveCaloTaggedMuons &&
muon->muonType() == xAOD::Muon::CaloTagged) {
continue; }
340 const auto*
mu_trk =
muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
342 m_leptonicTracks->emplace_back(
mu_trk);
345 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of total ID tracks = " << IDtracks->size() );
347 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of selected tracks = " << m_selectedTracks->size() );
349 return StatusCode::SUCCESS;