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;