13 return (left->
pt() > right->
pt());
20 const IInterface*
p ) :
26 m_isolatedTrack(false),
29 m_muonSelectionTool(
"CP::MuonSelectionTool/MuonSelectionTool"),
30 m_muonIDKey(
"Medium"),
31 m_electronIDKey(
"LHTight"),
41 declareInterface<DerivationFramework::ISkimmingTool>(
this);
72 ATH_CHECK(m_pixelTrackletKey.initialize());
73 ATH_CHECK(m_primaryVerticesKey.initialize());
74 ATH_CHECK(m_standardTrackKey.initialize());
76 return StatusCode::SUCCESS;
82 ATH_MSG_INFO(
"Processed " << m_ntot <<
" events, " << m_npass <<
" events passed filter ");
83 ATH_MSG_INFO(
"Efficiency = "<< 100.0*(
float)m_npass/(
float)m_ntot <<
" % ");
84 return StatusCode::SUCCESS;
92 bool acceptEvent(
false);
104 if( !metContainer.
isValid() ) {
105 msg(MSG::WARNING) <<
"No MET container found, will skip this event" <<
endmsg;
108 met = (*metContainer)[m_metTerm];
110 ATH_MSG_ERROR(
"Cannot retrieve MissingET term " << m_metTerm <<
" in " << m_metSGKey);
114 if (
met->met() < m_metCut)
return acceptEvent;
119 msg(MSG::WARNING) <<
"No jet container found, will skip this event" <<
endmsg;
124 std::vector<const xAOD::Jet *> sortedJetContainer;
126 sortedJetContainer.push_back(*
jet);
132 std::sort(sortedJetContainer.begin(), sortedJetContainer.end(),
sortJetContainer());
134 int nJetRequired = 0;
135 std::vector<const xAOD::Jet*> goodJets;
136 int nJet = sortedJetContainer.size();
138 for(
int i=0;
i<nJet;
i++){
140 if (sortedJetContainer.at(
i)->pt() > m_jetMetPtMin && std::abs(sortedJetContainer.at(
i)->eta()) < m_jetEtaMax) {
141 goodJets.push_back(sortedJetContainer.at(
i));
142 valHt += sortedJetContainer.at(
i)->pt();
146 if(nJetRequired < m_jetNumCut){
147 if (sortedJetContainer.at(
i)->pt() > m_jetPtCuts[nJetRequired] && std::abs(sortedJetContainer.at(
i)->eta()) < m_jetEtaMax){
153 if(nJetRequired < m_jetNumCut)
return acceptEvent;
155 if((
met->met()/1000.0)/sqrt(valHt/1000.0) < m_metHtCut)
return acceptEvent;
158 float minDphi = 9999;
159 for (
unsigned int i=0;
i<goodJets.size();
i++) {
160 if (
i >= m_jetPtCuts.size())
break;
165 if (minDphi < m_jetMetDphiMin)
return acceptEvent;
172 msg(MSG::WARNING) <<
"No muons container found, will skip this event" <<
endmsg;
176 if (m_muonIDKey ==
"VeryLoose") {
178 }
else if (m_muonIDKey ==
"Loose") {
180 }
else if (m_muonIDKey ==
"Medium") {
182 }
else if (m_muonIDKey ==
"Tight") {
185 ATH_MSG_WARNING(
"Cannot find the muon quality flag " << m_muonIDKey <<
". Use Medium instead.");
189 for (
auto muon: *muons) {
191 if (m_muonSelectionTool->getQuality(*
muon) <= qflag) {
194 if (
muon->pt() > m_leptonPtCut && std::abs(
muon->eta()) < m_leptonEtaMax && passID) {
202 msg(MSG::WARNING) <<
"No electron container found, will skip this event" <<
endmsg;
207 if (!ele->passSelection(passID, m_electronIDKey)) {
208 ATH_MSG_WARNING(
"Cannot find the electron quality flag " << m_muonIDKey);
210 if (ele->pt() > m_leptonPtCut && std::abs(ele->eta()) < m_leptonEtaMax && passID) {
221 if( !pixelTrackletContainer.
isValid() ) {
222 msg(MSG::WARNING) <<
"No pixel tracklet container found, will skip this event" <<
endmsg;
228 msg(MSG::WARNING) <<
"No primary vertices container found, will skip this event" <<
endmsg;
232 for(
const auto v: *vertices ){
243 bool passIsolatedTracklet =
false;
244 for(
const auto Tracklet : *pixelTrackletContainer){
245 passIsolatedTracklet =
true;
246 for(
unsigned int i=0;
i<goodJets.size();
i++){
253 passIsolatedTracklet =
false;
257 if(passIsolatedTracklet==
false)
261 passIsolatedTracklet =
false;
266 passIsolatedTracklet =
false;
271 passIsolatedTracklet =
false;
276 if(numberOfContribPixelLayersAcc(*
Tracklet)<3){
277 passIsolatedTracklet =
false;
282 if(numberOfPixelSpoiltHitsAcc(*
Tracklet)>0){
283 passIsolatedTracklet =
false;
289 passIsolatedTracklet =
false;
293 if(passIsolatedTracklet)
break;
297 if(passIsolatedTracklet==
false){
300 bool passIsolatedStdTrack =
false;
302 if( !standardTrackContainer.
isValid() ) {
303 msg(MSG::WARNING) <<
"No Standard Track container found, will skip this event" <<
endmsg;
308 for(
const auto StdTrack : *standardTrackContainer){
309 if(StdTrack->pt()/1000.0 < 20.0)
312 passIsolatedStdTrack =
true;
314 for(
unsigned int i=0;
i<goodJets.size();
i++){
315 double deltaPhi = (std::abs(StdTrack->phi() - goodJets.at(
i)->phi()) >
M_PI) ? 2.0*
M_PI-std::abs(StdTrack->phi()-goodJets.at(
i)->phi()) : std::abs(StdTrack->phi()-goodJets.at(
i)->phi());
316 double deltaEta = std::abs(StdTrack->eta() - goodJets.at(
i)->eta());
320 passIsolatedStdTrack =
false;
324 if(passIsolatedStdTrack){
326 for(
auto Track : *standardTrackContainer){
327 if(
Track->pt()/1000.0 < 0.4)
330 double deltaPhi = (std::abs(StdTrack->phi() -
Track->phi()) >
M_PI) ? 2.0*
M_PI-std::abs(StdTrack->phi()-
Track->phi()) : std::abs(StdTrack->phi()-
Track->phi());
342 passIsolatedStdTrack =
false;
347 if(passIsolatedStdTrack==
false)