7# pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
28 return StatusCode::SUCCESS;
34 std::vector<const xAOD::Electron*> el_vec;
37 if(!electrons.isValid()) {
44 if(el->p4().Pt()/Gaudi::Units::GeV <
threshold)
continue;
58 std::vector<const xAOD::Muon*> mu_vec;
68 if(mu->p4().Pt()/Gaudi::Units::GeV <
threshold)
continue;
71 if(!(mu->quality() <= xAOD::Muon::Quality::Medium && mu->passesIDCuts()))
continue;
82 std::vector<const xAOD::Electron*> el_vec;
85 for(
auto &featLinkInfo :
vec) {
86 const auto *feat = *(featLinkInfo.link);
88 el_vec.push_back(feat);
97 std::vector<const xAOD::Muon*> mu_vec;
100 for(
auto &featLinkInfo :
vec) {
101 const auto *feat = *(featLinkInfo.link);
103 mu_vec.push_back(feat);
112 constexpr float threshold_offset = 10.0;
118 for(
const std::string& trigger :
m_triggers) {
121 if(!info.isHLTTandP()) {
122 ATH_MSG_WARNING(
"Chain \"" << trigger <<
"\" is not a Tag and Probe trigger. Skipping...");
135 std::vector<const xAOD::TauJet*> offline_taus =
classifyTausAll(ctx, offline_taus_with_id, info.getHLTTauThreshold() - threshold_offset);
138 std::vector<const xAOD::TauJet*> hlt_taus =
getOnlineTausAll(trigger,
true);
140 if(info.hasHLTElectronLeg()) {
142 std::vector<const xAOD::IParticle*> offline_electrons;
146 for(
int i = offline_taus.size()-1; i >= 0; i--) {
147 bool is_match =
matchObjects(offline_taus.at(i), offline_electrons, 0.2);
148 if(is_match) offline_taus.erase(offline_taus.begin() + i);
152 std::vector<const xAOD::IParticle*> hlt_electrons;
158 }
else if(info.hasHLTMuonLeg()) {
160 std::vector<const xAOD::IParticle*> offline_muons;
164 for(
int i = offline_taus.size()-1; i >= 0; i--) {
165 bool is_match =
matchObjects(offline_taus.at(i), offline_muons, 0.2);
166 if(is_match) offline_taus.erase(offline_taus.begin() + i);
170 std::vector<const xAOD::IParticle*> hlt_muons;
178 return StatusCode::SUCCESS;
182void TrigTauMonitorTandPAlgorithm::fillTAndPHLTEfficiencies(
const EventContext& ctx,
const std::string& trigger,
const std::vector<const xAOD::IParticle*>& offline_lep_vec,
const std::vector<const xAOD::IParticle*>& online_lep_vec,
const std::vector<const xAOD::TauJet*>& offline_tau_vec,
const std::vector<const xAOD::TauJet*>& online_tau_vec)
const
184 ATH_MSG_DEBUG(
"Fill Tag and Probe HLT efficiencies: " << trigger);
187 if(online_tau_vec.size() != 1 || offline_tau_vec.size() != 1)
return;
189 if(online_lep_vec.size() != 1 || offline_lep_vec.size() != 1)
return;
191 auto monGroup =
getGroup(trigger+
"_TAndPHLT_Efficiency");
206 bool tau1_match =
matchObjects(offline_tau_vec[0], online_tau_vec, 0.2);
207 bool lep1_match =
matchObjects(offline_lep_vec[0], online_lep_vec, 0.2);
209 tauPt = offline_tau_vec[0]->pt()/Gaudi::Units::GeV;
210 tauEta = offline_tau_vec[0]->eta();
211 tauPhi = offline_tau_vec[0]->phi();
212 dR = offline_tau_vec[0]->p4().DeltaR(offline_lep_vec[0]->p4());
213 dEta = std::abs(offline_tau_vec[0]->
eta() - offline_lep_vec[0]->
eta());
214 dPhi = offline_tau_vec[0]->p4().DeltaPhi(offline_lep_vec[0]->p4());
216 HLT_match = hlt_fires && tau1_match && lep1_match;
218 fill(monGroup, tauPt, tauEta, tauPhi,
dR, dEta, dPhi, averageMu, HLT_match);
222 HLT_match_highPt =
static_cast<bool>(HLT_match);
223 fill(monGroup, tauEta, tauPhi, HLT_match_highPt);
227 ATH_MSG_DEBUG(
"After fill Tag and Probe HLT efficiencies: " << trigger);
235 auto monGroup =
getGroup(trigger+
"_TAndPVars");
238 if(tau_vec.empty() || lep_vec.empty())
return;
254 for(
uint i=0; i < tau_vec.size(); i++) {
255 for(
uint j=0; j< lep_vec.size(); j++) {
256 if(tau_vec[i]->p4().DeltaR(lep_vec[j]->p4()) >= 0.3) {
263 dR = tau_vec[index_tau]->p4().DeltaR(lep_vec[index_lep]->p4());
264 dEta = std::abs(tau_vec[index_tau]->
eta() - lep_vec[index_lep]->
eta());
265 dPhi = tau_vec[index_tau]->p4().DeltaPhi(lep_vec[index_lep]->p4());
266 dPt = std::abs((tau_vec[index_tau]->pt() - lep_vec[index_lep]->pt())/Gaudi::Units::GeV);
268 TLorentzVector diTau4V = tau_vec[index_tau]->p4() + lep_vec[index_lep]->p4();
270 Pt = diTau4V.Pt()/Gaudi::Units::GeV;
273 M = diTau4V.M()/Gaudi::Units::GeV;
275 fill(monGroup,
dR, dEta, dPhi, dPt, Pt, Eta, Phi, M);
277 ATH_MSG_DEBUG(
"After fill Tag & Probe variables: " << trigger);
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
std::vector< size_t > vec
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Tool to tell whether a specific trigger is passed.
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
float getHLTTauThreshold() const
Gaudi::Property< bool > m_do_efficiency_plots
virtual StatusCode initialize() override
initialize
double dR(const double eta1, const double phi1, const double eta2, const double phi2) const
TrigTauMonitorBaseAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< const xAOD::TauJet * > getOfflineTausAll(const EventContext &ctx, const float threshold=20.0) const
bool matchObjects(const T1 *tau, const std::vector< const T2 * > &tau_vec, float threshold) const
Gaudi::Property< std::vector< std::string > > m_triggers
const TrigTauInfo & getTrigInfo(const std::string &trigger) const
std::vector< const xAOD::TauJet * > classifyTausAll(const EventContext &ctx, const std::vector< const xAOD::TauJet * > &taus, const float threshold=0.0, const TauID tau_id=TauID::None) const
std::vector< const xAOD::TauJet * > getOnlineTausAll(const std::string &trigger, bool include_0P=true, bool filter_legs=false) const
Gaudi::Property< bool > m_do_variable_plots
SG::ReadHandleKey< xAOD::MuonContainer > m_hltMuonKey
TrigTauMonitorTandPAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode processEvent(const EventContext &ctx) const override
SG::ReadHandleKey< xAOD::ElectronContainer > m_offlineElectronKey
void fillTAndPHLTEfficiencies(const EventContext &ctx, const std::string &trigger, const std::vector< const xAOD::IParticle * > &offline_lep_vec, const std::vector< const xAOD::IParticle * > &online_lep_vec, const std::vector< const xAOD::TauJet * > &offline_tau_vec, const std::vector< const xAOD::TauJet * > &online_tau_vec) const
Gaudi::Property< unsigned int > m_offline_tau_id
std::vector< const xAOD::Electron * > getOfflineElectrons(const EventContext &ctx, const float threshold=0.0) const
std::vector< const xAOD::Muon * > getOfflineMuons(const EventContext &ctx, const float threshold=0.0) const
SG::ReadHandleKey< xAOD::ElectronContainer > m_hltElectronKey
void fillTagAndProbeVars(const std::string &trigger, const std::vector< const xAOD::TauJet * > &tau_vec, const std::vector< const xAOD::IParticle * > &lep_vec) const
Gaudi::Property< bool > m_requireOfflineTaus
std::vector< const xAOD::Muon * > getOnlineMuons(const std::string &trigger) const
std::vector< const xAOD::Electron * > getOnlineElectrons(const std::string &trigger) const
SG::ReadHandleKey< xAOD::MuonContainer > m_offlineMuonKey
virtual StatusCode initialize() override
initialize
Class providing the definition of the 4-vector interface.
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
virtual float lbAverageInteractionsPerCrossing(const EventContext &ctx) const
Calculate the average mu, i.e.
static const unsigned int EF_prescaled
static const unsigned int L1_isPassedAfterVeto
static const unsigned int Physics
const uint32_t BADCLUSELECTRON
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
Electron_v1 Electron
Definition of the current "egamma version".