ATLAS Offline Software
Loading...
Searching...
No Matches
TrigMultiTrkComboHypo.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5/**************************************************************************
6 **
7 ** File: Trigger/TrigHypothesis/TrigBphysHypo/TrigMultiTrkComboHypo.h
8 **
9 ** Description: multi-track hypothesis algorithm
10 **
11 ** Author: Heather Russell
12 **
13 **************************************************************************/
14
15#ifndef TRIG_TrigMultiTrkComboHypo_H
16#define TRIG_TrigMultiTrkComboHypo_H
17
18#include <string>
19#include <vector>
20
29
32
35
39
42
43#include "ITrigBphysState.h"
46
47#include "AthViews/View.h"
48
49namespace Trk {
50class IVKalState;
51}
52
53
58
60 public:
69 virtual ~TrigMultiTrkStateBase() = default;
70 virtual std::vector<ElementLink<TrigCompositeUtils::DecisionContainer>>& getDecisionLinks(size_t) = 0;
72 virtual void addTrigBphysObject(xAOD::TrigBphys*, const std::vector<size_t>& legIndices) = 0;
73 virtual bool checkMultiplicity(const std::vector<int>& legMultiplicity, const std::vector<HLT::Identifier>& legDecisionIDs) const = 0;
74
75 void setEventAccepted(bool flag = true) { m_isEventAccepted = (flag ? 1 : 0); }
76 inline int isEventAccepted() const { return m_isEventAccepted; }
77 inline std::vector<std::vector<size_t>>& trigBphysLegIndices() { return m_trigBphysLegIndices; }
78 inline std::vector<size_t>& getTrigBphysLegIndices(size_t idx) { return m_trigBphysLegIndices[idx]; }
79 inline std::vector<ElementLink<xAOD::TrackParticleContainer>>& tracks() { return m_tracks; }
80
81 private:
83 std::vector<std::vector<size_t>> m_trigBphysLegIndices;
84 std::vector<ElementLink<xAOD::TrackParticleContainer>> m_tracks;
85};
86
87
88template<typename CONTAINER>
90 public:
98 virtual ~TrigMultiTrkState() = default;
99
100 struct LEPTON {
102 std::vector<ElementLink<TrigCompositeUtils::DecisionContainer>> decisionLinks;
104 };
105
106 std::vector<LEPTON>& leptons() { return m_leptons; }
107 virtual std::vector<ElementLink<TrigCompositeUtils::DecisionContainer>>& getDecisionLinks(size_t i) override final {
108 return m_leptons.at(i).decisionLinks;
109 }
110 virtual TrigCompositeUtils::DecisionIDContainer& getDecisionIDs(size_t i) override final {
111 return m_leptons.at(i).decisionIDs;
112 }
113 virtual void addTrigBphysObject(xAOD::TrigBphys* trigBphysObject, const std::vector<size_t>& legIndices) override final {
114 trigBphysCollection().push_back(trigBphysObject);
115 trigBphysLegIndices().push_back(legIndices);
116 }
117 virtual bool checkMultiplicity(const std::vector<int>& legMultiplicity, const std::vector<HLT::Identifier>& legDecisionIDs) const override final {
118 if (legMultiplicity.size() == 1) return true;
119 int N = std::accumulate(legMultiplicity.begin(), legMultiplicity.end(), 0);
120 int n = 0;
121 for (size_t i = 0; i < m_leptons.size(); ++i) {
122 for (size_t j = 0; j < legMultiplicity.size(); ++j) {
123 if (TrigCompositeUtils::passed(legDecisionIDs.at(j).numeric(), m_leptons.at(i).decisionIDs)) {
124 n++;
125 break;
126 }
127 }
128 }
129 return (n >= N);
130 }
131
132 private:
133 std::vector<LEPTON> m_leptons;
134};
135
136
137
139 public:
140 TrigMultiTrkComboHypo(const std::string& name, ISvcLocator* pSvcLocator);
142
143 virtual StatusCode initialize() override;
144 virtual StatusCode execute(const EventContext& context) const override;
145
146 private:
147
153
158 template<typename CONTAINER>
160
165 template<typename CONTAINER>
167
177 template<typename CONTAINER>
179
186
193
199
206
212
218
226 std::unique_ptr<xAOD::Vertex> fit(
227 const std::vector<ElementLink<xAOD::TrackParticleContainer>>& trackParticleLinks,
228 const std::vector<double>& particleMasses,
229 Trk::IVKalState& fitterState) const;
230
240 const xAOD::Vertex& vertex,
241 const std::vector<double>& particleMasses,
242 const xAOD::Vertex& beamSpot,
243 const Trk::IVKalState& fitterState) const;
244
249 bool isIdenticalTracks(const xAOD::TrackParticle* lhs, const xAOD::TrackParticle* rhs) const;
250 bool isIdenticalTracks(const xAOD::Muon* lhs, const xAOD::Muon* rhs) const;
251 bool isIdenticalTracks(const xAOD::Electron* lhs, const xAOD::Electron* rhs) const;
252 bool isInMassRange(double mass, size_t idx) const;
253 bool passedDeltaRcut(const std::vector<xAOD::TrackParticle::GenVecFourMom_t>& momenta) const;
254
256 m_trackParticleContainerKey {this, "TrackCollectionKey", "Tracks", "input TrackParticle container name"};
257
259 m_trigBphysContainerKey {this, "TrigBphysCollectionKey", "TrigBphysContainer", "output TrigBphysContainer name"};
260
262 m_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"};
263
264 Gaudi::Property<std::vector<unsigned int>> m_nTrk {this, "nTracks", {2},
265 "number of tracks to be fitted into the common vertex"};
266 Gaudi::Property<std::vector<int>> m_nTrkCharge {this, "totalCharge", {},
267 "magnitude of the total charge to accept, negative is none"};
268 Gaudi::Property<std::vector<std::vector<double>>> m_trkMass {this, "trackMasses", {},
269 "track masses for vertex reco (one per track); muon mass is used by default"};
270 Gaudi::Property<std::vector<std::vector<double>>> m_trkPt {this, "trackPtThresholds", { {3650., 3650.} },
271 "minimum track transverse momenta (one per track, sorted descending)"};
272 Gaudi::Property<std::vector<std::pair<double, double>>> m_massRange {this, "massRange", { {0., 100000.} },
273 "range of the invariant mass of the track combinations"};
274 Gaudi::Property<bool> m_applyOverlapRemoval {this, "applyOverlapRemoval", true,
275 "apply overlap removal for the close-by same-sign objects from different views"};
276 Gaudi::Property<bool> m_combineInputDecisionCollections {this, "combineInputDecisionCollections", false,
277 "combine objects attached to decisions from different input collections, needed for HLT_mu4_ivarloose_mu4_b10invmAB120vtx20_L12MU3V chains"};
278 Gaudi::Property<bool> m_useLeptonMomentum {this, "useLeptonMomentum", false,
279 "use 4-momentum of the xAOD::Muon to make fast calculation of the xAOD::TrigBphys mass, needed for consistency with TrigComboHypoTool::compute()"};
280 Gaudi::Property<bool> m_checkMultiplicity {this, "checkMultiplicity", false,
281 "check that we have enough leptons to fire the chain, needed for HLT_mu6_2mu4_bJpsi_L1MU5VF_3MU3VF"};
282 Gaudi::Property<float> m_deltaR {this, "deltaR", 0.01,
283 "minimum deltaR between same-sign tracks (overlap removal)"};
284 Gaudi::Property<float> m_deltaRMax {this, "deltaRMax", std::numeric_limits<float>::max(),
285 "maximum deltaR between tracks in a candidate"};
286 Gaudi::Property<float> m_deltaRMin {this, "deltaRMin", std::numeric_limits<float>::lowest(),
287 "maximum deltaR between tracks in a candidate"};
288 Gaudi::Property<float> m_chi2 {this, "chi2", 150.,
289 "chi2 cut for the fitted vertex"};
290 Gaudi::Property<bool> m_isStreamer {this, "isStreamer", false,
291 "if true we do not create trigger objects, just copy all appropriate decisions to the next step or break the chain"};
292 Gaudi::Property<bool> m_isMuTrkMode {this, "isMuTrkMode", false,
293 "make pairs between muon from SG::View and tracks from the same SG::View"};
294 Gaudi::Property<bool> m_doElectrons {this, "doElectrons", false,
295 "use electrons if true, otherwise use muons"};
296 Gaudi::Property<std::string> m_trigLevel {this, "trigLevel", "EF",
297 "trigger Level to set for created TrigBphys objects: L2, L2IO, L2MT or EF"};
298 Gaudi::Property<std::vector<std::string>> m_mergedElectronChains {this, "mergedElectronChains", {"BPH-0DR3-EM7J15"},
299 "patterns for BPH-0DR3-EM7J15 like chains"};
300 Gaudi::Property<double> m_caloClusterEtThreshold {this, "caloClusterEtThreshold", 5.,
301 "minimum transverse energy of the cluster, associated with close-by electron"};
302
303 ToolHandle<InDet::VertexPointEstimator> m_vertexPointEstimator {this, "VertexPointEstimator", "", "tool to find starting point for the vertex fitter"};
304 ToolHandle<Trk::TrkVKalVrtFitter> m_vertexFitter {this, "VertexFitter", "", "VKalVrtFitter tool to fit tracks into the common vertex"};
305 ToolHandle<Trk::V0Tools> m_v0Tools {this, "V0Tools", "", "tool to calculate Lxy/LxyError of dimuon candidate wrt beam spot"};
306
307 ToolHandle<GenericMonitoringTool> m_monTool {this, "MonTool", "", "monitoring tool"};
308
312
313 double m_trkPtMin = 0.0;
314
315};
316
317#endif // TRIG_TrigMultiTrkComboHypo_H
Header file to be included by clients of the Monitored infrastructure.
Property holding a SG store/key/clid from which a ReadHandle is made.
Property holding a SG store/key/clid from which a WriteHandle is made.
ComboHypo(const std::string &name, ISvcLocator *pSvcLocator)
Definition ComboHypo.cxx:13
value_type push_back(value_type pElem)
Add an element to the end of the collection.
TrigCompositeUtils::DecisionContainer & decisions()
ITrigBphysState()=delete
const TrigCompositeUtils::DecisionContainer & previousDecisions() const
xAOD::TrigBphysContainer & trigBphysCollection()
const EventContext & context() const
Property holding a SG store/key/clid from which a ReadHandle is made.
Property holding a SG store/key/clid from which a WriteHandle is made.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
StatusCode mergeLeptonsFromDecisions(TrigMultiTrkState< CONTAINER > &) const
Go through state.previousDecisions(), fetch xAOD::Muons/xAODElectron objects attached to decisions an...
Gaudi::Property< bool > m_combineInputDecisionCollections
TrigMultiTrkComboHypo(const std::string &name, ISvcLocator *pSvcLocator)
ToolHandle< GenericMonitoringTool > m_monTool
Gaudi::Property< bool > m_checkMultiplicity
SG::WriteHandleKey< xAOD::TrigBphysContainer > m_trigBphysContainerKey
virtual StatusCode initialize() override
TrigCompositeUtils::DecisionIDContainer m_mergedElectronIDs
Gaudi::Property< float > m_deltaR
xAOD::TrigBphys * makeTrigBPhys(const xAOD::Vertex &vertex, const std::vector< double > &particleMasses, const xAOD::Vertex &beamSpot, const Trk::IVKalState &fitterState) const
Construct the trigger object that may be stored for debugging or matching.
virtual StatusCode execute(const EventContext &context) const override
Gaudi::Property< float > m_chi2
StatusCode findMuTrkCandidates(TrigMultiTrkState< xAOD::MuonContainer > &) const
Build J/psi candidates from muon from SG::View and tracks from the same SG::View, to be used for Tag-...
Gaudi::Property< bool > m_useLeptonMomentum
std::unique_ptr< xAOD::Vertex > fit(const std::vector< ElementLink< xAOD::TrackParticleContainer > > &trackParticleLinks, const std::vector< double > &particleMasses, Trk::IVKalState &fitterState) const
Perform a vertex fit on selected tracks.
bool isInMassRange(double mass, size_t idx) const
Gaudi::Property< std::vector< std::vector< double > > > m_trkMass
Gaudi::Property< std::vector< int > > m_nTrkCharge
ToolHandle< Trk::V0Tools > m_v0Tools
StatusCode filterTrackCombinations(TrigMultiTrkStateBase &) const
Make all possible combinations from state.tracks(), fit tracks to the common vertex and set state....
ToolHandle< InDet::VertexPointEstimator > m_vertexPointEstimator
Gaudi::Property< std::vector< std::vector< double > > > m_trkPt
StatusCode copyAdditionalDecisionObjects(TrigMultiTrkStateBase &) const
For chains from CombinedSlice (similar to 'HLT_e9_lhvloose_e5_lhvloose_bBeeM6000_mu4_L1BPH-0M9-EM7-EM...
Gaudi::Property< std::vector< std::string > > m_mergedElectronChains
TrigCompositeUtils::DecisionIDContainer m_allowedIDs
Gaudi::Property< std::vector< unsigned int > > m_nTrk
Gaudi::Property< bool > m_applyOverlapRemoval
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
bool isIdenticalTracks(const xAOD::TrackParticle *lhs, const xAOD::TrackParticle *rhs) const
Attempts to identify identical tracks by selection on DeltaR.
bool passedDeltaRcut(const std::vector< xAOD::TrackParticle::GenVecFourMom_t > &momenta) const
Gaudi::Property< bool > m_isStreamer
Gaudi::Property< float > m_deltaRMin
ToolHandle< Trk::TrkVKalVrtFitter > m_vertexFitter
Gaudi::Property< float > m_deltaRMax
Gaudi::Property< std::vector< std::pair< double, double > > > m_massRange
Gaudi::Property< bool > m_doElectrons
StatusCode findMultiLeptonCandidates(TrigMultiTrkState< CONTAINER > &) const
Make all possible combinations from state.leptons(), fit tracks to the common vertex,...
StatusCode copyDecisionObjects(TrigMultiTrkStateBase &) const
All appropriate decisions from state.previousDecisions() will be copied to state.decisions() if flag ...
StatusCode processMergedElectrons(TrigMultiTrkState< xAOD::ElectronContainer > &) const
Make all possible combinations from electrons originating from the same BPH-0DR3-EM7J15 cluster,...
Gaudi::Property< double > m_caloClusterEtThreshold
Gaudi::Property< std::string > m_trigLevel
Gaudi::Property< bool > m_isMuTrkMode
TrigMultiTrkComboHypo()=delete
StatusCode mergeTracksFromViews(TrigMultiTrkStateBase &) const
Go through state.previousDecisions() and fetch xAOD::TrackParticle objects associated with the neares...
StatusCode createDecisionObjects(TrigMultiTrkStateBase &) const
Create a decision for each xAOD::TrigBphys object from state.trigBphysCollection() and save it to sta...
TrigCompositeUtils::DecisionIDContainer m_resolvedElectronIDs
bool isIdenticalTracks(const xAOD::Muon *lhs, const xAOD::Muon *rhs) const
StatusCode mergeTracksFromDecisions(TrigMultiTrkStateBase &) const
Go through state.previousDecisions(), fetch xAOD::Muons/xAODElectron objects attached to decisions an...
virtual bool checkMultiplicity(const std::vector< int > &legMultiplicity, const std::vector< HLT::Identifier > &legDecisionIDs) const =0
virtual void addTrigBphysObject(xAOD::TrigBphys *, const std::vector< size_t > &legIndices)=0
virtual ~TrigMultiTrkStateBase()=default
std::vector< std::vector< size_t > > & trigBphysLegIndices()
TrigMultiTrkStateBase(const EventContext &context, const TrigCompositeUtils::DecisionContainer &previousDecisions, TrigCompositeUtils::DecisionContainer &decisions, xAOD::TrigBphysContainer *trigBphysCollection=nullptr, const InDet::BeamSpotData *beamSpotData=nullptr)
std::vector< ElementLink< xAOD::TrackParticleContainer > > & tracks()
std::vector< ElementLink< xAOD::TrackParticleContainer > > m_tracks
std::vector< size_t > & getTrigBphysLegIndices(size_t idx)
virtual TrigCompositeUtils::DecisionIDContainer & getDecisionIDs(size_t)=0
virtual std::vector< ElementLink< TrigCompositeUtils::DecisionContainer > > & getDecisionLinks(size_t)=0
void setEventAccepted(bool flag=true)
TrigMultiTrkStateBase()=delete
std::vector< std::vector< size_t > > m_trigBphysLegIndices
State class for TrigMultiTrkComboHypo algorithm.
TrigMultiTrkState(const EventContext &context, const TrigCompositeUtils::DecisionContainer &previousDecisions, TrigCompositeUtils::DecisionContainer &decisions, xAOD::TrigBphysContainer *trigBphysCollection=nullptr, const InDet::BeamSpotData *beamSpotData=nullptr)
std::vector< LEPTON > m_leptons
std::vector< LEPTON > & leptons()
virtual ~TrigMultiTrkState()=default
virtual std::vector< ElementLink< TrigCompositeUtils::DecisionContainer > > & getDecisionLinks(size_t i) override final
virtual void addTrigBphysObject(xAOD::TrigBphys *trigBphysObject, const std::vector< size_t > &legIndices) override final
virtual TrigCompositeUtils::DecisionIDContainer & getDecisionIDs(size_t i) override final
TrigMultiTrkState()=delete
virtual bool checkMultiplicity(const std::vector< int > &legMultiplicity, const std::vector< HLT::Identifier > &legDecisionIDs) const override final
bool passed(DecisionID id, const DecisionIDContainer &idSet)
checks if required decision ID is in the set of IDs in the container
std::set< DecisionID > DecisionIDContainer
Ensure that the ATLAS eigen extensions are properly loaded.
TrigBphys_v1 TrigBphys
Definition TrigBphys.h:18
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
Muon_v1 Muon
Reference the current persistent version:
TrigBphysContainer_v1 TrigBphysContainer
Electron_v1 Electron
Definition of the current "egamma version".
ElementLink< CONTAINER > link
TrigCompositeUtils::DecisionIDContainer decisionIDs
std::vector< ElementLink< TrigCompositeUtils::DecisionContainer > > decisionLinks