22 const IInterface*
p ) :
27 m_nEventsPassElectron(0),
29 m_nJetsPassAlphaMax(0),
40 m_electronIDKey(
"LHMedium"),
42 m_muonSelectionTool(
"CP::MuonSelectionTool/MuonSelectionTool"),
43 m_muonIDKey(
"Medium"),
48 declareInterface<DerivationFramework::ISkimmingTool>(
this);
73 ATH_CHECK(m_electronIsoDecorKey.initialize());
75 ATH_CHECK(m_muonIsoDecorKey.initialize());
77 ATH_CHECK(m_jetBtagDecorKey.initialize());
79 ATH_CHECK(m_primaryVerticesKey.initialize());
80 return StatusCode::SUCCESS;
86 ATH_MSG_INFO(
"Processed "<< m_nEventsTotal <<
" events, "<< m_nEventsPass<<
" events passed filter ");
87 ATH_MSG_INFO(
"Percent of events passed Jet filter "<< 100.0*(
float)m_nEventsPassJet/(
float)m_nEventsTotal <<
" % ");
88 ATH_MSG_INFO(
"Percent of events passing CHF "<< 100.0*(
float)m_nJetsPassCHF/(
float)m_nEventsTotal <<
" % ");
89 ATH_MSG_INFO(
"Percent of events passing alphaMax "<< 100.0*(
float)m_nJetsPassAlphaMax/(
float)m_nEventsTotal <<
" % ");
90 ATH_MSG_INFO(
"Percent of events passed Electron filter "<< 100.0*(
float)m_nEventsPassElectron/(
float)m_nEventsTotal <<
" % ");
91 ATH_MSG_INFO(
"Percent events passed Muon filter "<< 100.0*(
float)m_nEventsPassMuon/(
float)m_nEventsTotal <<
" % ");
92 return StatusCode::SUCCESS;
101 typedef std::vector<TrackLink> TrackLinks;
103 bool passesEl=
false, passesMu=
false, passesJet=
false;
114 ATH_MSG_FATAL(
"No vertex collection with name PrimaryVertices found in StoreGate!");
124 ATH_MSG_FATAL(
"No electron collection with name " << m_electronSGKey <<
" found in StoreGate!");
132 if(
electron->pt()<m_electronPtCut)
continue;
133 if( (std::abs(
electron->caloCluster()->etaBE(2))>1.37 && std::abs(
electron->caloCluster()->etaBE(2))<1.52)
134 || std::abs(
electron->caloCluster()->etaBE(2))>2.47 )
continue;
139 if (!
electron->passSelection(passID, m_electronIDKey)) {
140 ATH_MSG_WARNING(
"Cannot find the electron quality flag " << m_electronIDKey);
143 if(!passID)
continue;
145 for (
auto vertex: *vertices){
150 double delta_z0 =
tp->z0() +
tp->vz() -
vertex->z();
152 float z0sintheta = std::abs(delta_z0 *
sin(
theta));
154 if (sigd0>5)
continue;
155 if (z0sintheta>0.5)
continue;
163 m_nEventsPassElectron++;
175 ATH_MSG_FATAL(
"No muon collection with name " << m_muonSGKey <<
" found in StoreGate!");
180 for(
auto muon : *muons){
182 if (
muon->pt()<m_muonPtCut)
continue;
183 if (std::abs(
muon->eta())>2.5)
continue;
184 if (!(m_muonSelectionTool->passedMuonCuts(*
muon)))
continue;
188 for (
auto vertex : *vertices) {
194 if (std::abs(d0sig)>3)
continue;
196 float delta_z0 =
tp->z0() +
tp->vz() -
vertex->z();
198 double z0sintheta = delta_z0 *
sin(
theta);
200 if (std::abs(z0sintheta)>0.5)
continue;
219 if( !
jets.isValid() ) {
224 std::vector<const xAOD::Jet*> goodJets;
227 if (
jet->pt() < m_jetPtCut)
continue;
228 if (std::abs(
jet->eta()) > m_jetEtaCut)
continue;
230 TLorentzVector VJet = TLorentzVector(0.0,0.0,0.0,0.0);
231 VJet.SetPtEtaPhiE(
jet->pt(),
jet->eta(),
jet->phi(),
jet->e());
233 float minDeltaR = 100;
238 if (std::abs(
electron->eta())>2.47)
continue;
240 bool passLoose=
false;
241 if (!
electron->passSelection(passLoose,
"LHLoose")){
245 if (!passLoose)
continue;
247 TLorentzVector VElec=
electron->p4();
248 float deltaR = VJet.DeltaR(VElec);
253 if (minDeltaR<0.2)
continue;
255 goodJets.push_back(
jet);
261 for (
auto jet : goodJets){
265 TLorentzVector CHFNum = TLorentzVector(0.0,0.0,0.0,0.0);
273 TrackLinks assocTracks = BTagTrackToJetAssociatorAcc(*
bjet);
275 std::vector<const xAOD::TrackParticle*> goodTracks;
276 for (
auto track : assocTracks) {
277 if (!
track.isValid())
continue;
278 goodTracks.push_back(*
track);
281 float alpha_max=-999;
282 for (
auto vertex : *vertices) {
283 TLorentzVector alphaDen = TLorentzVector(0.0,0.0,0.0,0.0);
284 TLorentzVector alphaNum = TLorentzVector(0.0,0.0,0.0,0.0);
287 for(
auto track : goodTracks) {
288 if (
track->pt() < m_TrackMinPt)
continue;
290 TLorentzVector VTrack = TLorentzVector(0.0,0.0,0.0,0.0);
292 alphaDen=alphaDen+VTrack;
293 if (std::abs(
track->d0()) > m_TrackD0Max)
continue;
297 if (std::abs(
z0*
sin(
theta)) > m_TrackZ0Max)
continue;
299 alphaNum=alphaNum+VTrack;
301 if (alphaDen.Pt()==0) alpha=-999;
302 else alpha = alphaNum.Pt()/alphaDen.Pt();
304 if (alpha > alpha_max) alpha_max=alpha;
307 CHFNum = TLorentzVector(0.0,0.0,0.0,0.0);
308 for(
auto track : goodTracks) {
309 if (
track->pt() < m_TrackMinPt)
continue;
310 if (std::abs(
track->d0()) > m_TrackD0Max)
continue;
312 TLorentzVector VTrack = TLorentzVector(0.0,0.0,0.0,0.0);
314 CHFNum=CHFNum+VTrack;
318 float chf = CHFNum.Pt()/
jet->pt();
320 if (alpha_max < m_AlphaMaxCut) m_nJetsPassAlphaMax++;
321 if (chf < m_CHFCut) m_nJetsPassCHF++;
323 if (chf > m_CHFCut && alpha_max > m_AlphaMaxCut)
continue;
329 if (nJetsPassed >= m_nJetsReq){
336 if (passesJet && (passesEl || passesMu)){