ATLAS Offline Software
Loading...
Searching...
No Matches
TrigMuonEFIdtpInvMassHypoTool Class Reference

#include <TrigMuonEFIdtpInvMassHypoTool.h>

Inheritance diagram for TrigMuonEFIdtpInvMassHypoTool:
Collaboration diagram for TrigMuonEFIdtpInvMassHypoTool:

Public Member Functions

 TrigMuonEFIdtpInvMassHypoTool (const std::string &type, const std::string &name, const IInterface *parent)
 ~TrigMuonEFIdtpInvMassHypoTool ()=default
virtual StatusCode initialize () override
virtual StatusCode decide (Combo::LegDecisionsMap &passingLegs, const EventContext &ctx) const override
 retrieves the decisions associated to this decId, make their combinations and apply the algorithm
virtual HLT::Identifier decisionId () const
 retrieves this ComboHypoTool's chain's decision ID
StatusCode setLegMultiplicity (const Combo::MultiplicityReqMap &multiplicityRequiredMap)
 Sets the number of legs and the multiplicity required on each leg.
const std::vector< int > & legMultiplicity () const
 Gets the number of legs and the multiplicity required on each leg.
HLT::Identifier legDecisionId (size_t i) const
 Retrieves this ComboHypoTool's chain's decision ID for a given leg.
const std::vector< HLT::Identifier > & legDecisionIds () const
 Retrieves this ComboHypoTool's chain's decision IDs for all legs.
virtual StatusCode decideOnSingleObject (TrigCompositeUtils::Decision *, const std::vector< const TrigCompositeUtils::DecisionIDContainer * > &) const
 Alternate method called by BPhysics ComboHypoAlgs instead of the base method decide(...).

Protected Member Functions

StatusCode selectLegs (const Combo::LegDecisionsMap &IDCombMap, std::vector< std::vector< Combo::LegDecision > > &leg_decisions) const
 Creates the per-leg vectors of Decision objects starting from the initial LegDecision map, storing only those concerning this HypoTool's chain Pack the Decision objects in std::pair<DecisionID, ElementLink<Decision>> so the derived class' executeAlg function knows which leg each object is on.
void updateLegDecisionsMap (const std::vector< std::vector< Combo::LegDecision > > &passing_comb, Combo::LegDecisionsMap &passingLegs) const
 For when the tool accepts some/all combinations.
void eraseFromLegDecisionsMap (Combo::LegDecisionsMap &passingLegs) const
 For when the tool rejects all combinations.
void printDebugInformation (const Combo::LegDecisionsMap &passingLegs) const
 Print the output of the tool, after having removed failed Decision Objects.

Protected Attributes

Gaudi::Property< size_t > m_combinationsThresholdWarn
Gaudi::Property< size_t > m_combinationsThresholdBreak
Gaudi::Property< bool > m_modeOR
Gaudi::Property< bool > m_enableOverride

Private Member Functions

bool executeAlg (const std::vector< Combo::LegDecision > &combinaiton, const EventContext &ctx) const override
 Only a dummy implementation exists in ComboHypoToolBase.
StatusCode doTPIdperf (const xAOD::TrackParticle *metrack, const std::vector< const xAOD::TrackParticle * > &tracks_pt, const std::vector< const xAOD::TrackParticle * > &tracks_ftf) const
float qOverPMatching (const xAOD::TrackParticle *metrack, const xAOD::TrackParticle *idtrack) const
bool passedCBQualityCuts (const xAOD::Muon *muon) const
bool passedSAQualityCuts (const xAOD::Muon *muon) const

Private Attributes

Gaudi::Property< double > m_invMassLow
Gaudi::Property< double > m_invMassHigh
Gaudi::Property< bool > m_acceptAll
Gaudi::Property< bool > m_selOS
Gaudi::Property< bool > m_muonqualityCut
ToolHandle< GenericMonitoringToolm_monTool {this, "MonTool", "", "Monitoring tool" }
ToolHandle< CP::IMuonSelectionToolm_muonSelTool {this, "MuonSelectionTool", "CP::MuonSelectionTool/MuonSelectionTool", "Tool for muon quality selection"}
HLT::Identifier m_decisionId
 The DecisionID of the chain, obtained from the Tool's name.
std::vector< HLT::Identifierm_legDecisionIds
 The DecisionIDs of the individual legs, derived from both m_decisionId and m_legMultiplicities.
std::vector< int > m_legMultiplicities
 The number of legs, and the required multiplicity on each leg.

Detailed Description

Definition at line 19 of file TrigMuonEFIdtpInvMassHypoTool.h.

Constructor & Destructor Documentation

◆ TrigMuonEFIdtpInvMassHypoTool()

TrigMuonEFIdtpInvMassHypoTool::TrigMuonEFIdtpInvMassHypoTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 16 of file TrigMuonEFIdtpInvMassHypoTool.cxx.

16 :
17 ComboHypoToolBase(type, name, parent) {
18}
ComboHypoToolBase(const std::string &type, const std::string &name, const IInterface *parent)

◆ ~TrigMuonEFIdtpInvMassHypoTool()

TrigMuonEFIdtpInvMassHypoTool::~TrigMuonEFIdtpInvMassHypoTool ( )
default

Member Function Documentation

◆ decide()

StatusCode ComboHypoToolBase::decide ( Combo::LegDecisionsMap & passingLegs,
const EventContext & ctx ) const
overridevirtualinherited

retrieves the decisions associated to this decId, make their combinations and apply the algorithm

Parameters
[in]LegDecisionsMapthat lists all the passing decisions, to be updated by the tool depending on the outcome of executeAlg
[in]EventContext

Reimplemented in DisplacedJetRankComboHypoTool, Trig3VarComboHypoTool, TrigADComboHypoTool, and TrigComboHypoTool.

Definition at line 48 of file ComboHypoToolBase.cxx.

48 {
49 if (m_legMultiplicities.size() == 0) {
50 ATH_MSG_ERROR("ComboHypoTool for " << m_decisionId << " has not been properly configured. setLegMultiplicity should be called by the parent alg in initalize");
51 return StatusCode::FAILURE;
52 }
53
54 // if no combinations passed, then exit
55 if (passingLegs.size() == 0) {
56 return StatusCode::SUCCESS;
57 }
58
59 ATH_MSG_DEBUG("Looking for legs from " << decisionId() << " in the map. Map contains features for " << passingLegs.size() << " legs, which may be data for many chains.");
60
61 // select the leg decisions from the map with this ID:
62 std::vector<std::vector<Combo::LegDecision>> legDecisions;
63 ATH_CHECK(selectLegs(passingLegs, legDecisions));
64
65 for (size_t legIndex = 0; legIndex < m_legMultiplicities.size(); ++legIndex) {
66 // The static cast is because this gets read as a Gaudi property which only seems to work with vector<int> rather than vector<size_t>
67 if (legDecisions.at(legIndex).size() < static_cast<size_t>(m_legMultiplicities.at(legIndex))) {
68 ATH_MSG_DEBUG("Too few features are found for " << m_decisionId << " on leg " << legIndex <<", require:" << m_legMultiplicities.at(legIndex) << " have:" << legDecisions.at(legIndex).size());
69 ATH_MSG_DEBUG("This ComboHypoTool cannot run in this event, this chain **REJECTS** this event.");
70 eraseFromLegDecisionsMap(passingLegs);
71 if (msgLvl(MSG::DEBUG)) printDebugInformation(passingLegs);
72 return StatusCode::SUCCESS;
73 }
74 }
75
76 // Create and initialise the combinations generator for the requirements of this chain, given the objects available in this event.
77 HLT::NestedUniqueCombinationGenerator nucg;
78 for (size_t legIndex = 0; legIndex < m_legMultiplicities.size(); ++legIndex) {
79 const size_t choose_any = m_legMultiplicities.at(legIndex);
80 const size_t out_of = legDecisions.at(legIndex).size();
81 nucg.add({out_of, choose_any});
82 ATH_MSG_DEBUG("For leg " << legIndex << " we will be choosing any " << choose_any << " Decision Objects out of " << out_of);
83 }
84
85 std::vector<std::vector<Combo::LegDecision>> passingCombinations;
86
87 size_t warnings = 0, iterations = 0;
88 do {
89
90 const std::vector<size_t> combination = nucg();
91 ++nucg;
92 std::vector<Combo::LegDecision> combinationToCheck;
93
94 size_t location_in_combination = 0;
95 for (size_t legIndex = 0; legIndex < m_legMultiplicities.size(); ++legIndex) {
96 // We loop over however many objects are required on the leg,
97 // but we take their index from the 'combination'. Hence 'object' is not used directly
98 for (size_t object = 0; object < static_cast<size_t>(m_legMultiplicities.at(legIndex)); ++object) {
99 const size_t objectIndex = combination.at(location_in_combination++);
100 combinationToCheck.push_back( legDecisions.at(legIndex).at(objectIndex) );
101 }
102 }
103
104 ++iterations;
105
106 try {
107 if (executeAlg(combinationToCheck, ctx)) {
108 ATH_MSG_DEBUG("Combination " << (iterations - 1) << " decided to be passing");
109 passingCombinations.push_back(std::move(combinationToCheck));
110 if (m_modeOR == true and m_enableOverride) {
111 break;
112 }
113 } else { // the combination failed
114 if (m_modeOR == false and m_enableOverride) {
115 break;
116 }
117 }
118 } catch (std::exception& e) {
119 ATH_MSG_ERROR(e.what());
120 return StatusCode::FAILURE;
121 }
122
123 if ((iterations >= m_combinationsThresholdWarn && warnings == 0) or (iterations >= m_combinationsThresholdBreak)) {
124 ATH_MSG_WARNING("Have so far processed " << iterations << " combinations for " << m_decisionId << " in this event, " << passingCombinations.size() << " passing.");
125 ++warnings;
126 if (iterations >= m_combinationsThresholdBreak) {
127 ATH_MSG_WARNING("Too many combinations! Breaking the loop at this point.");
128 break;
129 }
130 }
131
132 } while (nucg);
133
134
135 if (m_modeOR) {
136
137 ATH_MSG_DEBUG("Passing " << passingCombinations.size() << " combinations out of " << iterations << ", "
138 << m_decisionId << (passingCombinations.size() ? " **ACCEPTS**" : " **REJECTS**") << " this event based on OR logic.");
139
140 if (m_enableOverride) {
141 ATH_MSG_DEBUG("Note: stopped after the first successful combination due to the EnableOverride flag.");
142 }
143
144 } else { // modeAND
145
146 const bool passAll = (passingCombinations.size() == iterations);
147
148 ATH_MSG_DEBUG("Passing " << passingCombinations.size() << " combinations out of " << iterations << ", "
149 << m_decisionId << (passAll ? " **ACCEPTS**" : " **REJECTS**") << " this event based on AND logic.");
150
151 if (m_enableOverride) {
152 ATH_MSG_DEBUG("Note: stopped after the first failed combination due to the EnableOverride flag.");
153 }
154
155 if (not passAll) {
156 passingCombinations.clear();
157 }
158
159 }
160
161 if (not passingCombinations.empty()) { // need partial erasure of the decsions (only those not present in any combination)
162 updateLegDecisionsMap(passingCombinations, passingLegs);
163 } else { // need complete erasure of input decisions
164 eraseFromLegDecisionsMap(passingLegs);
165 }
166
167 if (msgLvl(MSG::DEBUG)) printDebugInformation(passingLegs);
168 return StatusCode::SUCCESS;
169}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Gaudi::Property< bool > m_modeOR
virtual bool executeAlg(const std::vector< Combo::LegDecision > &combination, const EventContext &ctx) const
Only a dummy implementation exists in ComboHypoToolBase.
StatusCode selectLegs(const Combo::LegDecisionsMap &IDCombMap, std::vector< std::vector< Combo::LegDecision > > &leg_decisions) const
Creates the per-leg vectors of Decision objects starting from the initial LegDecision map,...
void printDebugInformation(const Combo::LegDecisionsMap &passingLegs) const
Print the output of the tool, after having removed failed Decision Objects.
Gaudi::Property< size_t > m_combinationsThresholdWarn
void eraseFromLegDecisionsMap(Combo::LegDecisionsMap &passingLegs) const
For when the tool rejects all combinations.
HLT::Identifier m_decisionId
The DecisionID of the chain, obtained from the Tool's name.
Gaudi::Property< size_t > m_combinationsThresholdBreak
virtual HLT::Identifier decisionId() const
retrieves this ComboHypoTool's chain's decision ID
std::vector< int > m_legMultiplicities
The number of legs, and the required multiplicity on each leg.
Gaudi::Property< bool > m_enableOverride
void updateLegDecisionsMap(const std::vector< std::vector< Combo::LegDecision > > &passing_comb, Combo::LegDecisionsMap &passingLegs) const
For when the tool accepts some/all combinations.
void add(const UniqueCombinationGenerator &gen)

◆ decideOnSingleObject()

StatusCode ComboHypoToolBase::decideOnSingleObject ( TrigCompositeUtils::Decision * ,
const std::vector< const TrigCompositeUtils::DecisionIDContainer * > &  ) const
virtualinherited

Alternate method called by BPhysics ComboHypoAlgs instead of the base method decide(...).

This function should be considered a specialist use-case only. It must be over-ridden to do anything useful.

Reimplemented in TrigBmumuxComboHypoTool, and TrigMultiTrkComboHypoTool.

Definition at line 283 of file ComboHypoToolBase.cxx.

283 {
284 ATH_MSG_ERROR("Do not use ComboHypoToolBase on its own, inherit this class and override decideOnSingleObject.");
285 ATH_MSG_ERROR("NOTE: Only if you are also supplying your own decide(...) implimentation, or similar.");
286 ATH_MSG_ERROR("NOTE: Most uses cases should only need to override executeAlg(...).");
287 return StatusCode::FAILURE;
288}

◆ decisionId()

virtual HLT::Identifier ComboHypoToolBase::decisionId ( ) const
inlinevirtualinherited

retrieves this ComboHypoTool's chain's decision ID

Definition at line 41 of file ComboHypoToolBase.h.

41{ return m_decisionId; }

◆ doTPIdperf()

StatusCode TrigMuonEFIdtpInvMassHypoTool::doTPIdperf ( const xAOD::TrackParticle * metrack,
const std::vector< const xAOD::TrackParticle * > & tracks_pt,
const std::vector< const xAOD::TrackParticle * > & tracks_ftf ) const
private

Definition at line 163 of file TrigMuonEFIdtpInvMassHypoTool.cxx.

164{
165 ATH_MSG_VERBOSE("----- doTPIdperf -----");
166
167 // monitored variables
168 std::vector<float> mnt_PT_dr, mnt_PT_qovp;
169 std::vector<float> mnt_FTF_dr, mnt_FTF_qovp;
170 auto mon_PT_dr = Monitored::Collection("PT_dr", mnt_PT_dr);
171 auto mon_PT_qovp = Monitored::Collection("PT_qovp", mnt_PT_qovp);
172 auto mon_FTF_dr = Monitored::Collection("FTF_dr", mnt_FTF_dr);
173 auto mon_FTF_qovp = Monitored::Collection("FTF_qovp", mnt_FTF_qovp);
174 auto mon_phi_effi = Monitored::Scalar<float>("probePhiEfficiency", -999.0);
175 auto mon_eta_effi = Monitored::Scalar<float>("probeEtaEfficiency", -999.0);
176 auto mon_pt_found = Monitored::Scalar<float>("PTfound", -1);
177 auto mon_ftf_found = Monitored::Scalar<float>("FTFfound", -1);
178 auto mon_pt_phi = Monitored::Scalar<float>("PTphi", -999.0);
179 auto mon_pt_pix = Monitored::Scalar<float>("PTpixelFound", -1);
180 auto mon_pt_pixnext= Monitored::Scalar<float>("PTpixelNextToFound", -1);
181 auto monitorIt = Monitored::Group(m_monTool, mon_PT_dr, mon_PT_qovp, mon_FTF_dr, mon_FTF_qovp, mon_phi_effi, mon_eta_effi, mon_pt_found, mon_ftf_found, mon_pt_phi, mon_pt_pix, mon_pt_pixnext);
182
183 // probe values
184 auto mnt_probe_pt = Monitored::Scalar<float>("probe_pt", 0);
185 auto mnt_probe_eta = Monitored::Scalar<float>("probe_eta", 0);
186 auto monProbe = Monitored::Group(m_monTool, mnt_probe_pt, mnt_probe_eta);
187 mnt_probe_pt = metrack->pt()/Gaudi::Units::GeV;
188 mnt_probe_eta = metrack->eta();
189
190 // PT
191 const float PT_DR_CUT = 0.1;
192 const float PT_QOVP_CUT = 2.0;
193 ATH_MSG_VERBOSE("PT: n size="<<tracks_pt.size());
194 int n_pt_matched = 0;
195 float min_dr_pt_matched = 999;
196 uint8_t pt_expectInnermost=0;
197 uint8_t pt_numberInnermost=0;
198 uint8_t pt_expectNextToInnermost=0;
199 uint8_t pt_numberNextToInnermost=0;
200 for(auto idtrack : tracks_pt) {
201 float dr_pt = xAOD::P4Helpers::deltaR(metrack,idtrack);
202 float qovp_pt = TrigMuonEFIdtpCommon::qOverPMatching(metrack,idtrack);
203 mnt_PT_dr.push_back(dr_pt);
204 mnt_PT_qovp.push_back(qovp_pt);
205 ATH_MSG_VERBOSE("... dr (ME-PT): "<<dr_pt);
206 ATH_MSG_VERBOSE("... Q/p match (ME-PT): "<<qovp_pt);
207 if( dr_pt > PT_DR_CUT ) continue;
208 if( qovp_pt > PT_QOVP_CUT ) continue;
209 ++n_pt_matched;
210 if( dr_pt < min_dr_pt_matched ) {
211 min_dr_pt_matched = dr_pt;
212 mon_pt_phi = idtrack->phi();
213 idtrack->summaryValue(pt_expectInnermost,xAOD::expectInnermostPixelLayerHit);
214 idtrack->summaryValue(pt_numberInnermost,xAOD::numberOfInnermostPixelLayerHits);
215 idtrack->summaryValue(pt_expectNextToInnermost,xAOD::expectNextToInnermostPixelLayerHit);
216 idtrack->summaryValue(pt_numberNextToInnermost,xAOD::numberOfNextToInnermostPixelLayerHits);
217 }
218 }
219 if( n_pt_matched > 1 ) n_pt_matched=1;
220
221 // FTF
222 const float FTF_DR_CUT = 0.2;
223 const float FTF_QOVP_CUT = 3.0;
224 ATH_MSG_VERBOSE("FTF: n size="<<tracks_ftf.size());
225 int n_ftf_matched = 0;
226 for(auto idtrack : tracks_ftf) {
227 float dr_pt = xAOD::P4Helpers::deltaR(metrack,idtrack);
228 float qovp_pt = TrigMuonEFIdtpCommon::qOverPMatching(metrack,idtrack);
229 mnt_FTF_dr.push_back(dr_pt);
230 mnt_FTF_qovp.push_back(qovp_pt);
231 ATH_MSG_VERBOSE("... dr (ME-FTF): "<<dr_pt);
232 ATH_MSG_VERBOSE("... Q/p match (ME-FTF): "<<qovp_pt);
233 if( dr_pt > FTF_DR_CUT ) continue;
234 if( qovp_pt > FTF_QOVP_CUT ) continue;
235 ++n_ftf_matched;
236 }
237 if( n_ftf_matched > 1 ) n_ftf_matched=1;
238
239 // efficiency
240 float me_eta = metrack->eta();
241 float me_phi = metrack->phi();
242 float me_pt_gev = metrack->pt()/Gaudi::Units::GeV;
243
244 int eta_nr = 0;
245 if( std::abs(me_eta) > 2.0 ) { eta_nr = 2; }
246 else if( std::abs(me_eta) > 1.0 ) { eta_nr = 1; }
247 int pt_nr = 0;
248 if( me_pt_gev > 20.0 ) { pt_nr = 1; }
249
250 std::stringstream ss;
251 ss << "PT_effi_pt" << pt_nr << "_eta" << eta_nr;
252 auto mnt_PT_effi = Monitored::Scalar<int>(ss.str(), 0);
253 ss.clear();
254 ss << "PT_effi_pt" << pt_nr << "_eta" << eta_nr;
255 auto mnt_FTF_effi = Monitored::Scalar<int>(ss.str(), 0);
256 auto monEffi = Monitored::Group(m_monTool, mnt_PT_effi, mnt_FTF_effi);
257 mnt_PT_effi = n_pt_matched;
258 mnt_FTF_effi = n_ftf_matched;
259
260 // TnP monitoring
261 mon_phi_effi = me_phi;
262 mon_eta_effi = me_eta;
263 mon_pt_found = n_pt_matched;
264 mon_ftf_found = n_ftf_matched;
265 if( n_pt_matched != 0 ) {
266 if( pt_expectInnermost == 1 ) {
267 if( pt_numberInnermost>0 ) {
268 mon_pt_pix=1;
269 } else {
270 mon_pt_pix=0;
271 }
272 }
273 if( pt_expectNextToInnermost == 1 ) {
274 if( pt_numberNextToInnermost>0 ) {
275 mon_pt_pixnext=1;
276 } else {
277 mon_pt_pixnext=0;
278 }
279 }
280 }
281
282 //
283 return StatusCode::SUCCESS;
284}
#define ATH_MSG_VERBOSE(x)
static Double_t ss
ToolHandle< GenericMonitoringTool > m_monTool
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
float qOverPMatching(const xAOD::TrackParticle *metrack, const xAOD::TrackParticle *idtrack)
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer

◆ eraseFromLegDecisionsMap()

void ComboHypoToolBase::eraseFromLegDecisionsMap ( Combo::LegDecisionsMap & passingLegs) const
protectedinherited

For when the tool rejects all combinations.

Remove all Decision Objects from all the legs of this HypoTool's chain.

Definition at line 253 of file ComboHypoToolBase.cxx.

253 {
254 for (auto& it : passingLegs) {
255 DecisionID id = it.first;
256 if (id == m_decisionId or (isLegId(id) and getIDFromLeg(id) == m_decisionId)) {
257 const size_t nDecisionObjects = it.second.size();
258 it.second.clear();
259 ATH_MSG_VERBOSE("-- Removed " << nDecisionObjects << " from " << id);
260 }
261 }
262}
unsigned int DecisionID
HLT::Identifier getIDFromLeg(const HLT::Identifier &legIdentifier)
Generate the HLT::Identifier which corresponds to the chain name from the leg name.
bool isLegId(const HLT::Identifier &legIdentifier)
Recognise whether the chain ID is a leg ID.

◆ executeAlg()

bool TrigMuonEFIdtpInvMassHypoTool::executeAlg ( const std::vector< Combo::LegDecision > & combination,
const EventContext & ctx ) const
overrideprivatevirtual

Only a dummy implementation exists in ComboHypoToolBase.

This should be over-ridden by a derived class. The derived class should return a boolean pass/fail for each possible combination in the event. param[in] combination A single combination of objects to be discriminated against. Vector contains the required number of objects over all legs. Use the pair.first to tell which leg a given pair.second decision object belongs to in the current combination.

Reimplemented from ComboHypoToolBase.

Definition at line 53 of file TrigMuonEFIdtpInvMassHypoTool.cxx.

54{
55 ATH_MSG_VERBOSE("in executeAlg");
56 bool result = false;
57
58 if( m_acceptAll ) {
59 ATH_MSG_DEBUG("Accept property is set: taking all the events");
60 return true;
61 }
62
63 // monitored variables
64 std::vector<float> mnt_invMass;
65 auto mon_invMass = Monitored::Collection("Mass", mnt_invMass);
66 auto monitorIt = Monitored::Group(m_monTool, mon_invMass);
67
68 // retrieve muon and tracks
69 std::vector<const xAOD::TrackParticle*> tracks_pt;
70 std::vector<const xAOD::TrackParticle*> tracks_ftf;
71 std::vector<const xAOD::Muon*> muons_cb;
72 std::vector<const xAOD::Muon*> muons_sa;
73 int i_leg_idperf = -1;
74 for(auto leg: combination) {
75 auto decision= (*(leg.second));
76 auto i_leg = TrigCompositeUtils::getIndexFromLeg(leg.first);
77 ATH_MSG_VERBOSE("i_leg="<<i_leg);
79 if( muonLinks.size() != 1 ) continue;
80 if( ! muonLinks.at(0).isValid() ) continue;
81 const xAOD::Muon *mu = *(muonLinks.at(0).link);
82 if( ! mu->primaryTrackParticle() ) continue;
83
84 bool is_idperf_muon = false;
85 ATH_MSG_VERBOSE("... selected: muonType="<<mu->muonType()<<", pT="<<mu->pt()/Gaudi::Units::GeV<<", eta="<<mu->eta()<<", phi="<<mu->phi()<<", author="<<mu->author());
86 if(mu->author()==xAOD::Muon::Author::MuidCo && mu->muonType()==xAOD::Muon::MuonType::Combined) {
87 muons_cb.push_back(mu);
88 }
89 else if(mu->author()==xAOD::Muon::Author::MuidSA && mu->muonType()==xAOD::Muon::MuonType::MuonStandAlone) {
90 muons_sa.push_back(mu);
91 is_idperf_muon = true;
92 if( i_leg_idperf == -1 ) { i_leg_idperf = i_leg; }
93 else if( i_leg_idperf != (int)i_leg ) {
94 ATH_MSG_ERROR("i_leg for idperf looks inconsistent: i_leg_idperf / i_leg="<<i_leg_idperf<<" / "<<i_leg);
95 return result;
96 }
97 }
98
99 // if this leg is idperf leg (muon is SA) get ID tracks
100 if( is_idperf_muon ) {
101 const std::vector< TrigCompositeUtils::LinkInfo<xAOD::TrackParticleContainer> > ptLinks = TrigCompositeUtils::findLinks< xAOD::TrackParticleContainer >( decision, "HLT_IDTrack_Muon_IDTrig", TrigDefs::lastFeatureOfType);
102 ATH_MSG_VERBOSE("PT TrackParticleContainer Links size = "<<ptLinks.size());
103 if( ptLinks.size() == 1 && ptLinks.at(0).isValid() ) {
104 const xAOD::TrackParticle* track = *(ptLinks.at(0).link);
105 tracks_pt.push_back(track);
106 float pt = track->pt();
107 float eta = track->eta();
108 float phi = track->phi();
109 ATH_MSG_VERBOSE("... pt / eta / phi = "<<pt/Gaudi::Units::GeV << " / " << eta << " / " << phi<<", fitter="<<track->trackFitter());
110 }
111 const std::vector< TrigCompositeUtils::LinkInfo<xAOD::TrackParticleContainer> > ftfLinks = TrigCompositeUtils::findLinks< xAOD::TrackParticleContainer >( decision, "HLT_IDTrack_Muon_FTF", TrigDefs::lastFeatureOfType);
112 ATH_MSG_VERBOSE("FTF TrackParticleContainer Links size = "<< ftfLinks.size());
113 if( ftfLinks.size() == 1 && ftfLinks.at(0).isValid() ) {
114 const xAOD::TrackParticle* track = *(ftfLinks.at(0).link);
115 tracks_ftf.push_back(track);
116 float pt = track->pt();
117 float eta = track->eta();
118 float phi = track->phi();
119 ATH_MSG_VERBOSE("... pt / eta / phi = "<<pt/Gaudi::Units::GeV << " / " << eta << " / " << phi<<", fitter="<<track->trackFitter());
120 }
121 }
122 } // end of combination loop
123
124 // mass between CB and SA
125 for(auto muon_cb : muons_cb) {
126 if( m_muonqualityCut && ! passedCBQualityCuts(muon_cb) ) continue;
127
128 for(auto muon_sa : muons_sa) {
129 if( m_muonqualityCut && ! passedSAQualityCuts(muon_sa) ) continue;
130
131 const xAOD::TrackParticle* tr_cb = muon_cb->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle);
132 const xAOD::TrackParticle* tr_sa = muon_sa->trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
133 if (!tr_cb || !tr_sa) {
134 ATH_MSG_ERROR("Either CB or SA TrackParticle not found.");
135 continue;
136 }
137
138 if( m_selOS && (muon_cb->charge()*muon_sa->charge() > 0) ) continue;
139
140 float diMuMass = (tr_cb->p4()+tr_sa->p4()).M()/Gaudi::Units::GeV;
141 mnt_invMass.push_back(diMuMass);
142 ATH_MSG_VERBOSE("pt CB / pt SA = " << (*tr_cb).pt()/Gaudi::Units::GeV << " / " << (*tr_sa).pt()/Gaudi::Units::GeV << ", mass =" << diMuMass);
143
144 if( ((m_invMassLow >=0 && diMuMass>m_invMassLow ) || m_invMassLow <0) &&
145 ((m_invMassHigh>=0 && diMuMass<m_invMassHigh) || m_invMassHigh<0) ) {
146 result = true;
147 StatusCode sc = doTPIdperf(tr_sa, tracks_pt, tracks_ftf);
148 if( sc != StatusCode::SUCCESS ) {
149 ATH_MSG_ERROR("doTPIdperf failed with StatuCode="<<sc);
150 }
151 }
152 }
153 }
154
155 //
156 ATH_MSG_VERBOSE("idperf TP overall result is: "<<(result?"true":"false"));
157 return result;
158}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
static Double_t sc
StatusCode doTPIdperf(const xAOD::TrackParticle *metrack, const std::vector< const xAOD::TrackParticle * > &tracks_pt, const std::vector< const xAOD::TrackParticle * > &tracks_ftf) const
bool passedSAQualityCuts(const xAOD::Muon *muon) const
bool passedCBQualityCuts(const xAOD::Muon *muon) const
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
::StatusCode StatusCode
StatusCode definition for legacy code.
const std::string & featureString()
int32_t getIndexFromLeg(const HLT::Identifier &legIdentifier)
Extract the numeric index of a leg identifier.
void findLinks(const Decision *start, const std::string &linkName, std::vector< LinkInfo< T > > &links, unsigned int behaviour=TrigDefs::allFeaturesOfType, std::set< const xAOD::TrigComposite * > *fullyExploredFrom=nullptr)
search back the TC links for the object of type T linked to the one of TC (recursively) Populates pro...
static const unsigned int lastFeatureOfType
Run 3 "enum". Only return the final feature along each route through the navigation.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Muon_v1 Muon
Reference the current persistent version:

◆ initialize()

StatusCode TrigMuonEFIdtpInvMassHypoTool::initialize ( )
overridevirtual

Definition at line 23 of file TrigMuonEFIdtpInvMassHypoTool.cxx.

24{
25 if( m_muonqualityCut ) {
26 if( m_muonSelTool.retrieve().isFailure() ) {
27 ATH_MSG_ERROR("Unable to retrieve " << m_muonSelTool);
28 return StatusCode::FAILURE;
29 }
30 } else m_muonSelTool.disable();
31
32 if( m_acceptAll ) {
33 ATH_MSG_DEBUG("Accepting all the events!");
34 } else {
35 if( m_invMassLow<0 && m_invMassHigh<0 ) {
36 ATH_MSG_ERROR("Both mass cuts are <0. This is probably a configuration mistake.");
37 return StatusCode::FAILURE;
38 }
39 }
40
41 if ( not m_monTool.name().empty() ) {
42 ATH_CHECK( m_monTool.retrieve() );
43 ATH_MSG_DEBUG("MonTool name: " << m_monTool);
44 }
45
46 ATH_MSG_DEBUG("Initialization completed successfully");
47 return StatusCode::SUCCESS;
48}
ToolHandle< CP::IMuonSelectionTool > m_muonSelTool

◆ legDecisionId()

HLT::Identifier ComboHypoToolBase::legDecisionId ( size_t i) const
inlineinherited

Retrieves this ComboHypoTool's chain's decision ID for a given leg.

Only populated for chains with more than one leg. For chains with one leg, use decisionId()

Definition at line 60 of file ComboHypoToolBase.h.

60{ return m_legDecisionIds.at(i); }
std::vector< HLT::Identifier > m_legDecisionIds
The DecisionIDs of the individual legs, derived from both m_decisionId and m_legMultiplicities.

◆ legDecisionIds()

const std::vector< HLT::Identifier > & ComboHypoToolBase::legDecisionIds ( ) const
inlineinherited

Retrieves this ComboHypoTool's chain's decision IDs for all legs.

Only populated for chains with more than one leg. For chains with one leg, use decisionId()

Definition at line 66 of file ComboHypoToolBase.h.

66{ return m_legDecisionIds; }

◆ legMultiplicity()

const std::vector< int > & ComboHypoToolBase::legMultiplicity ( ) const
inlineinherited

Gets the number of legs and the multiplicity required on each leg.

Definition at line 54 of file ComboHypoToolBase.h.

54{ return m_legMultiplicities; }

◆ passedCBQualityCuts()

bool TrigMuonEFIdtpInvMassHypoTool::passedCBQualityCuts ( const xAOD::Muon * muon) const
private

Definition at line 289 of file TrigMuonEFIdtpInvMassHypoTool.cxx.

290{
291 bool passCut = false;
292
293 const xAOD::TrackParticle* idtrack = muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
294 const xAOD::TrackParticle* metrack = muon->trackParticle( xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle );
295
296 const float CHI2_CUT = 8.0;
297 const float QOVP_CUT = 7.0;
298
299 if( idtrack && metrack ) {
300 float qOverPsignif = TrigMuonEFIdtpCommon::qOverPMatching(metrack,idtrack);
301 float reducedChi2 = muon->primaryTrackParticle()->chiSquared()/muon->primaryTrackParticle()->numberDoF();
302 // Selection criteria based on the requirements that are part of the muon quality working points (offline)
303 if(std::abs(reducedChi2) < CHI2_CUT && !m_muonSelTool->isBadMuon(*muon) && qOverPsignif<QOVP_CUT && muon->author()==xAOD::Muon::MuidCo) passCut = true;
304 }
305
306 return passCut;
307}

◆ passedSAQualityCuts()

bool TrigMuonEFIdtpInvMassHypoTool::passedSAQualityCuts ( const xAOD::Muon * muon) const
private

Definition at line 310 of file TrigMuonEFIdtpInvMassHypoTool.cxx.

311{
312 bool passCut = false;
313
314 const xAOD::TrackParticle* metrack = muon->trackParticle( xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle );
315
316 const float CHI2_CUT = 8.0;
317
318 if( metrack ) {
319 float reducedChi2 = muon->primaryTrackParticle()->chiSquared()/muon->primaryTrackParticle()->numberDoF();
320 if( std::abs(reducedChi2) < CHI2_CUT && !m_muonSelTool->isBadMuon(*muon) ) passCut = true;
321 }
322
323 return passCut;
324}

◆ printDebugInformation()

void ComboHypoToolBase::printDebugInformation ( const Combo::LegDecisionsMap & passingLegs) const
protectedinherited

Print the output of the tool, after having removed failed Decision Objects.

Restricted to the ComboHypoTool's chain's legs.

Definition at line 264 of file ComboHypoToolBase.cxx.

264 {
265 ATH_MSG_DEBUG("ComboHypoToolBase: End of " << m_decisionId << ", passing elements are: ");
266 for (const auto& [id, ELV] : passingLegs) {
267 // Only print for this chain
268 if (id == m_decisionId or (isLegId(id) and m_decisionId == getIDFromLeg(id))) {
269 ATH_MSG_DEBUG("-- " << HLT::Identifier(id) << " with " << ELV.size() << " elements");
270 for (const auto& EL : ELV) {
271 ATH_MSG_DEBUG("-- -- container:" << EL.dataID() << ", index:" << EL.index());
272 }
273 }
274 }
275}
ElementLink< CVec > EL

◆ qOverPMatching()

float TrigMuonEFIdtpInvMassHypoTool::qOverPMatching ( const xAOD::TrackParticle * metrack,
const xAOD::TrackParticle * idtrack ) const
private

◆ selectLegs()

StatusCode ComboHypoToolBase::selectLegs ( const Combo::LegDecisionsMap & IDCombMap,
std::vector< std::vector< Combo::LegDecision > > & leg_decisions ) const
protectedinherited

Creates the per-leg vectors of Decision objects starting from the initial LegDecision map, storing only those concerning this HypoTool's chain Pack the Decision objects in std::pair<DecisionID, ElementLink<Decision>> so the derived class' executeAlg function knows which leg each object is on.

Definition at line 172 of file ComboHypoToolBase.cxx.

173{
174 /*
175 legDecisions: nested vector like:
176 [(leg0, el0), (leg0, el1), (leg0, el2), (leg0, el3)], <-- All leg0 objects are in legDecisions[0][X]
177 [(leg1, mu0), (leg1, mu1)] <-- All leg1 objects are in legDecisions[1][X]
178 We keep the legID in the std::pair inside the inner vector as these pairs will be flattened into a single vector
179 when individual combinations of objects are passed to executeAlg, pair.first then contains the leg, with pair.second containing the Decision Object.
180 */
181
182 // Extract from IDCombMap the features for this chain. Wrap the features up in a pair along with their leg ID
183 for (size_t legIndex = 0; legIndex < m_legMultiplicities.size(); ++ legIndex) {
184
185 // If the chain has more than one leg, then we have per-leg IDs. Otherwise we just use the chain's ID
186 const HLT::Identifier& legIdentifier = (m_legMultiplicities.size() > 1 ? m_legDecisionIds.at(legIndex) : m_decisionId);
187
188 // Combo::LegDecision is a pair of <DecisionID, ElementLink<Decision>>
189 std::vector<Combo::LegDecision> decisionObjectsOnLeg;
190
191 // Find physics objects on this leg. May be zero.
192 const Combo::LegDecisionsMap::const_iterator it = IDCombMap.find(legIdentifier.numeric());
193
194 if (it != IDCombMap.end()) {
195 for (const ElementLink<DecisionContainer>& el : it->second) {
196 decisionObjectsOnLeg.emplace_back(legIdentifier, el);
197 }
198 }
199
200 legDecisions.push_back(std::move(decisionObjectsOnLeg));
201 }
202
203 if (msgLvl(MSG::DEBUG)) {
204 ATH_MSG_DEBUG("Getting " << legDecisions.size() << " legs to combine, for ID: " << decisionId());
205 size_t count = 0;
206 for (const auto& leg : legDecisions) {
207 ATH_MSG_DEBUG("Leg " << count++ << " --");
208 for (const auto& dEL : leg) {
209 ATH_MSG_DEBUG("-- " << HLT::Identifier(dEL.first) << " container:" << dEL.second.dataID() << ", index:" << dEL.second.index());
210 }
211 }
212 }
213 return StatusCode::SUCCESS;
214}
TrigCompositeUtils::DecisionID numeric() const
numeric ID
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146

◆ setLegMultiplicity()

StatusCode ComboHypoToolBase::setLegMultiplicity ( const Combo::MultiplicityReqMap & multiplicityRequiredMap)
inherited

Sets the number of legs and the multiplicity required on each leg.

This should be called when the Tool is retrieved by its parent ComboHypo alg. This also sets the leg Decision IDs at the same time param[in] multiplicityRequiredMap: Mapping of chains to required multiplicity per leg.

Definition at line 16 of file ComboHypoToolBase.cxx.

16 {
17 const std::string nameOfToolsChain = m_decisionId.name();
18 const Combo::MultiplicityReqMap::const_iterator it = multiplicityRequiredMap.find(nameOfToolsChain);
19
20 if (it == multiplicityRequiredMap.end()) {
21 ATH_MSG_ERROR("ComboHypoTool for " << m_decisionId << " could not find its required multiplcity data in the map supplied by its parent alg.");
22 return StatusCode::FAILURE;
23 }
24
25 m_legMultiplicities = it->second;
26 if (m_legMultiplicities.size() == 0) {
27 ATH_MSG_ERROR("ComboHypoTool for " << m_decisionId << " was listed in the supplied multiplicityRequiredMap, but data was not supplied for any legs.");
28 return StatusCode::FAILURE;
29 }
30
31 m_legDecisionIds.clear();
32 for (size_t i = 0; i < m_legMultiplicities.size(); ++i) {
33 if(m_legMultiplicities.at(i) < 0) {
34 ATH_MSG_ERROR("ComboHypoTool for " << m_decisionId << " has been configured with an impossible multiplicity requirement of " << m_legMultiplicities.at(i) << " on leg " << i);
35 return StatusCode::FAILURE;
36 }
37 ATH_MSG_DEBUG("ComboHypoTool for " << m_decisionId << " will require multiplicity " << m_legMultiplicities.at(i) << " on leg " << i);
38 if (m_legMultiplicities.size() > 1) { // We only have per-leg IDs when there is more than one leg
40 } else { // For one leg, just repete the chain's ID
42 }
43 }
44
45 return StatusCode::SUCCESS;
46}
HLT::Identifier createLegName(const HLT::Identifier &chainIdentifier, size_t counter)
Generate the HLT::Identifier which corresponds to a specific leg of a given chain.

◆ updateLegDecisionsMap()

void ComboHypoToolBase::updateLegDecisionsMap ( const std::vector< std::vector< Combo::LegDecision > > & passing_comb,
Combo::LegDecisionsMap & passingLegs ) const
protectedinherited

For when the tool accepts some/all combinations.

Remove Decision Objects from legs of this HypoTool's chain which participated in NONE of combinations which were flagged as accepting the event.

Definition at line 216 of file ComboHypoToolBase.cxx.

216 {
217 if (msgLvl(MSG::DEBUG)) {
218 size_t count = 0;
219 for (const std::vector<Combo::LegDecision>& comb : passingComb) {
220 ATH_MSG_DEBUG("-- Passing combination " << count++ << " of " << passingComb.size());
221 for (const auto& [id, EL] : comb) {
222 ATH_MSG_DEBUG("-- -- " << HLT::Identifier(id) << " container:" << EL.dataID() << ", index:" << EL.index());
223 }
224 }
225 }
226
227 // remove combinations that didn't pass from the final map passingLegs
228 for (auto& it : passingLegs) {
229 DecisionID legId = it.first;
230 if (not(legId == m_decisionId or (isLegId(legId) and getIDFromLeg(legId) == m_decisionId))) {
231 continue; // Some other chain, ignore it to get faster execution.
232 }
233 std::vector<ElementLink<DecisionContainer>> updatedDecisionObjectsOnLeg;
234 bool update = false;
235 // Loop over all passing combinations, and all Decision Objects in each passing combination. Find Decision Objects on this leg.
236 for (const std::vector<Combo::LegDecision>& comb : passingComb) {
237 for (const auto& [id, EL] : comb) {
238 // Check that this Decision Object is on the correct leg, and that we haven't collated it already from another combination.
239 if (id == legId and std::find(updatedDecisionObjectsOnLeg.begin(), updatedDecisionObjectsOnLeg.end(), EL) == updatedDecisionObjectsOnLeg.end()) {
240 ATH_MSG_VERBOSE("Keeping on leg " << HLT::Identifier(id) << " the Decision Object container:" << EL.dataID() << ", index:" << EL.index());
241 updatedDecisionObjectsOnLeg.push_back(EL);
242 update = true;
243 }
244 }
245 }
246 // only update those concerning this tool ID
247 if (update){
248 it.second = std::move(updatedDecisionObjectsOnLeg);
249 }
250 }
251}

Member Data Documentation

◆ m_acceptAll

Gaudi::Property< bool > TrigMuonEFIdtpInvMassHypoTool::m_acceptAll
private
Initial value:
{
this, "AcceptAll", false, "Ignore selection" }

Definition at line 42 of file TrigMuonEFIdtpInvMassHypoTool.h.

42 {
43 this, "AcceptAll", false, "Ignore selection" };

◆ m_combinationsThresholdBreak

Gaudi::Property<size_t> ComboHypoToolBase::m_combinationsThresholdBreak
protectedinherited
Initial value:
{this, "CombinationsThresholdBreak", 10000,
"Events processing this many combinations will generate a second WARNING message, and the loop over combinations will be terminated at this point."}

Definition at line 109 of file ComboHypoToolBase.h.

109 {this, "CombinationsThresholdBreak", 10000,
110 "Events processing this many combinations will generate a second WARNING message, and the loop over combinations will be terminated at this point."};

◆ m_combinationsThresholdWarn

Gaudi::Property<size_t> ComboHypoToolBase::m_combinationsThresholdWarn
protectedinherited
Initial value:
{this, "CombinationsThresholdWarn", 1000,
"Events processing this many combinations will generate a WARNING message."}

Definition at line 106 of file ComboHypoToolBase.h.

106 {this, "CombinationsThresholdWarn", 1000,
107 "Events processing this many combinations will generate a WARNING message."};

◆ m_decisionId

HLT::Identifier ComboHypoToolBase::m_decisionId
privateinherited

The DecisionID of the chain, obtained from the Tool's name.

Definition at line 122 of file ComboHypoToolBase.h.

◆ m_enableOverride

Gaudi::Property<bool> ComboHypoToolBase::m_enableOverride
protectedinherited
Initial value:
{this, "EnableOverride", false,
"Stops processing combinations as soon as a valid combination is found in OR mode, or as soon as an invalid combination is found in AND mode. This is to save CPU."}

Definition at line 115 of file ComboHypoToolBase.h.

115 {this, "EnableOverride", false,
116 "Stops processing combinations as soon as a valid combination is found in OR mode, or as soon as an invalid combination is found in AND mode. This is to save CPU."};

◆ m_invMassHigh

Gaudi::Property< double> TrigMuonEFIdtpInvMassHypoTool::m_invMassHigh
private
Initial value:
{
this, "InvMassHigh", -1.0, "High threshold for invariant mass cut" }

Definition at line 40 of file TrigMuonEFIdtpInvMassHypoTool.h.

40 {
41 this, "InvMassHigh", -1.0, "High threshold for invariant mass cut" };

◆ m_invMassLow

Gaudi::Property< double> TrigMuonEFIdtpInvMassHypoTool::m_invMassLow
private
Initial value:
{
this, "InvMassLow", -1.0, "Low threshold for invariant mass cut" }

Definition at line 38 of file TrigMuonEFIdtpInvMassHypoTool.h.

38 {
39 this, "InvMassLow", -1.0, "Low threshold for invariant mass cut" };

◆ m_legDecisionIds

std::vector<HLT::Identifier> ComboHypoToolBase::m_legDecisionIds
privateinherited

The DecisionIDs of the individual legs, derived from both m_decisionId and m_legMultiplicities.

Definition at line 123 of file ComboHypoToolBase.h.

◆ m_legMultiplicities

std::vector<int> ComboHypoToolBase::m_legMultiplicities
privateinherited

The number of legs, and the required multiplicity on each leg.

Definition at line 124 of file ComboHypoToolBase.h.

◆ m_modeOR

Gaudi::Property<bool> ComboHypoToolBase::m_modeOR
protectedinherited
Initial value:
{this, "ModeOR", true,
"Accepts based on the logical OR over all calls to executeAlg. If this flag is set to false then the logical AND is required instead."}

Definition at line 112 of file ComboHypoToolBase.h.

112 {this, "ModeOR", true,
113 "Accepts based on the logical OR over all calls to executeAlg. If this flag is set to false then the logical AND is required instead."};

◆ m_monTool

ToolHandle< GenericMonitoringTool > TrigMuonEFIdtpInvMassHypoTool::m_monTool {this, "MonTool", "", "Monitoring tool" }
private

Definition at line 50 of file TrigMuonEFIdtpInvMassHypoTool.h.

50{this, "MonTool", "", "Monitoring tool" };

◆ m_muonqualityCut

Gaudi::Property< bool > TrigMuonEFIdtpInvMassHypoTool::m_muonqualityCut
private
Initial value:
{
this, "MuonQualityCut", false, "Ignore selection" }

Definition at line 46 of file TrigMuonEFIdtpInvMassHypoTool.h.

46 {
47 this, "MuonQualityCut", false, "Ignore selection" };

◆ m_muonSelTool

ToolHandle<CP::IMuonSelectionTool> TrigMuonEFIdtpInvMassHypoTool::m_muonSelTool {this, "MuonSelectionTool", "CP::MuonSelectionTool/MuonSelectionTool", "Tool for muon quality selection"}
private

Definition at line 51 of file TrigMuonEFIdtpInvMassHypoTool.h.

51{this, "MuonSelectionTool", "CP::MuonSelectionTool/MuonSelectionTool", "Tool for muon quality selection"};

◆ m_selOS

Gaudi::Property< bool > TrigMuonEFIdtpInvMassHypoTool::m_selOS
private
Initial value:
{
this, "SelectOppositeSign", false, "Select only oppositly charged pairs" }

Definition at line 44 of file TrigMuonEFIdtpInvMassHypoTool.h.

44 {
45 this, "SelectOppositeSign", false, "Select only oppositly charged pairs" };

The documentation for this class was generated from the following files: