19 m_trigDecisionTool(
"Trig::TrigDecisionTool/TrigDecisionTool")
21 declareInterface<DerivationFramework::ISkimmingTool>(
this);
74 ATH_CHECK(m_muonIsoDecorKey.initialize());
75 ATH_CHECK(m_electronIsoDecorKey.initialize());
77 return StatusCode::SUCCESS;
84 return StatusCode::SUCCESS;
95 if (not
mu.parameter(
chi2, xAOD::Muon::msInnerMatchChi2))
return false;
98 if (not
mu.parameter(dof, xAOD::Muon::msInnerMatchDOF))
return false;
99 if (dof == 0) dof = 1;
101 return ((
chi2 /
static_cast<float>(dof)) < 5.);
107 bool acceptEvent =
false;
110 bool passedTrigger =
true;
111 if (m_triggers.size() > 0) {
112 passedTrigger =
false;
113 for (
const std::string&
trigger : m_triggers) {
114 bool decision = m_trigDecisionTool->isPassed(
trigger);
116 passedTrigger =
true;
121 if (not passedTrigger)
return acceptEvent;
125 if (m_isPromptMuon or m_isDisplacedMuon) {
127 ATH_MSG_FATAL(
"No muon collection with name " << m_muonSGKey <<
" found in StoreGate!");
134 if ((not m_isPromptMuon) or (not m_isDisplacedMuon)) {
136 ATH_MSG_FATAL(
"No electron collection with name " << m_electronSGKey <<
" found in StoreGate!");
142 std::vector<const xAOD::Muon*> promptMuonCandidates;
143 std::vector<const xAOD::Electron*> promptElectronCandidates;
144 if (m_isPromptMuon) {
145 getPromptMuonCandidates(muons, promptMuonCandidates);
146 if (promptMuonCandidates.empty())
return acceptEvent;
148 getPromptElectronCandidates(
electrons, promptElectronCandidates);
149 if (promptElectronCandidates.empty())
return acceptEvent;
153 std::vector<const xAOD::Muon*> displacedMuonCandidates;
154 std::vector<const xAOD::Electron*> displacedElectronCandidates;
155 if (m_isDisplacedMuon) {
156 getDisplacedMuonCandidates(muons, displacedMuonCandidates);
157 if (displacedMuonCandidates.empty())
return acceptEvent;
159 getDisplacedElectronCandidates(
electrons, displacedElectronCandidates);
160 if (displacedElectronCandidates.empty())
return acceptEvent;
165 if (m_isPromptMuon and m_isDisplacedMuon) {
167 for (
const xAOD::Muon* promptMuonCandidate : promptMuonCandidates) {
168 for (
const xAOD::Muon* displacedMuonCandidate : displacedMuonCandidates) {
169 if (promptMuonCandidate!=displacedMuonCandidate) {
170 double dPhi = promptMuonCandidate->phi() - displacedMuonCandidate->phi();
174 if (
dPhi>=m_dPhiMin) {
181 }
else if (m_isPromptMuon and (not m_isDisplacedMuon)) {
183 for (
const xAOD::Muon* promptMuonCandidate : promptMuonCandidates) {
184 for (
const xAOD::Electron* displacedElectronCandidate : displacedElectronCandidates) {
185 double dPhi = promptMuonCandidate->phi() - displacedElectronCandidate->phi();
189 if (
dPhi>=m_dPhiMin) {
195 }
else if ((not m_isPromptMuon) and m_isDisplacedMuon) {
197 for (
const xAOD::Electron* promptElectronCandidate : promptElectronCandidates) {
198 for (
const xAOD::Muon* displacedMuonCandidate : displacedMuonCandidates) {
199 double dPhi = promptElectronCandidate->phi() - displacedMuonCandidate->phi();
203 if (
dPhi>=m_dPhiMin) {
209 }
else if ((not m_isPromptMuon) and (not m_isDisplacedMuon)) {
211 for (
const xAOD::Electron* promptElectronCandidate : promptElectronCandidates) {
212 for (
const xAOD::Electron* displacedElectronCandidate : displacedElectronCandidates) {
213 if (promptElectronCandidate!=displacedElectronCandidate) {
214 double dPhi = promptElectronCandidate->phi() - displacedElectronCandidate->phi();
218 if (
dPhi>=m_dPhiMin) {
231 std::vector<const xAOD::Muon*>& promptMuonCandidates)
const
235 if (not (
muon->pt() > m_mu1PtMin))
continue;
238 if (not (std::abs(
muon->eta()) < m_mu1AbsEtaMax))
continue;
241 bool passTypeCut =
true;
242 if (m_mu1Types.size() > 0) {
245 for (
const int& allowedType : m_mu1Types) {
246 if (allowedType==
type) {
252 if (not passTypeCut)
continue;
258 if (not m_mu1IsoCutIsRel) {
259 if (
muon->isolation(isoValue, isoType) and (isoValue < m_mu1IsoCut)) isIso =
true;
261 if (
muon->isolation(isoValue, isoType) and (isoValue/
muon->pt() < m_mu1IsoCut)) isIso =
true;
263 if (not isIso)
continue;
265 promptMuonCandidates.push_back(
muon);
270 std::vector<const xAOD::Muon*>& displacedMuonCandidates)
const
274 if (not (
muon->pt() > m_mu2PtMin))
continue;
277 if (not (std::abs(
muon->eta()) < m_mu2AbsEtaMax))
continue;
280 bool passTypeCut =
true;
282 if (m_mu2Types.size() > 0) {
284 for (
const int& allowedType : m_mu2Types) {
285 if (
type==allowedType) {
291 if (not passTypeCut)
continue;
297 if (not m_mu2IsoCutIsRel) {
298 if (
muon->isolation(isoValue, isoType) and (isoValue < m_mu2IsoCut)) isIso =
true;
300 if (
muon->isolation(isoValue, isoType) and isoValue/
muon->pt() < m_mu2IsoCut) isIso =
true;
302 if (not isIso)
continue;
305 bool passD0cut =
true;
309 if (std::abs(
muon->primaryTrackParticle()->d0()) > m_mu2d0Min) passD0cut =
true;
314 if (not passD0cut)
continue;
316 displacedMuonCandidates.push_back(
muon);
321 std::vector<const xAOD::Electron*>& promptElectronCandidates)
const
325 if (not (
electron->pt() > m_el1PtMin))
continue;
328 if (not (std::abs(
electron->eta()) < m_el1AbsEtaMax))
continue;
331 bool passEID =
false;
332 if (not
electron->passSelection(passEID, m_el1IDKey))
continue;
333 if (not passEID)
continue;
339 if (not m_el1IsoCutIsRel) {
340 if (
electron->isolation(isoValue, isoType) and (isoValue < m_el1IsoCut)) isIso =
true;
342 if (
electron->isolation(isoValue, isoType) and (isoValue/
electron->pt() < m_el1IsoCut)) isIso =
true;
344 if (not isIso)
continue;
346 promptElectronCandidates.push_back(
electron);
351 std::vector<const xAOD::Electron*>& displacedElectronCandidates)
const
355 if (not (
electron->pt() > m_el2PtMin))
continue;
358 if (not (std::abs(
electron->eta()) < m_el2AbsEtaMax))
continue;
364 if (not m_el2IsoCutIsRel) {
365 if (
electron->isolation(isoValue, isoType) and (isoValue < m_el2IsoCut)) isIso =
true;
367 if (
electron->isolation(isoValue, isoType) and isoValue/
electron->pt() < m_el2IsoCut) isIso =
true;
369 if (not isIso)
continue;
372 bool passD0cut =
false;
373 if (std::abs(
electron->trackParticle()->d0()) > m_el2d0Min) passD0cut =
true;
374 if (not passD0cut)
continue;
376 displacedElectronCandidates.push_back(
electron);