ATLAS Offline Software
Loading...
Searching...
No Matches
TrigBhhComboHypo.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <algorithm>
6#include <numeric>
7#include <iterator>
8
9#include "TrigBhhComboHypo.h"
10
11#include "xAODMuon/Muon.h"
13#include "xAODTracking/Vertex.h"
20
24
25#include "AthViews/View.h"
26#include "AthViews/ViewHelper.h"
28
29#include "Math/GenVector/VectorUtil.h"
30#include "Math/Vector2D.h"
31
32
37using ROOT::Math::XYVector;
38
39
40TrigBhhComboHypo::TrigBhhComboHypo(const std::string& name, ISvcLocator* pSvcLocator)
41 : ::ComboHypo(name, pSvcLocator) {}
42
43
45 ATH_MSG_DEBUG( "TrigBhhComboHypo::initialize()" );
46
48
51 ATH_CHECK( m_trigBphysContainerKey.initialize() );
52 ATH_CHECK( m_beamSpotKey.initialize() );
53
54 ATH_CHECK( m_vertexFitter.retrieve() );
56
57 // allowed IDs to filter out incoming decisions at L2 level
58 for (const auto& item : triggerMultiplicityMap()) {
59 const HLT::Identifier id = HLT::Identifier(item.first);
60 m_allowedIDs.insert(id.numeric());
61 if (item.second.size() > 1) {
62 for (size_t i = 0; i < item.second.size(); i++) {
63 m_allowedIDs.insert(TrigCompositeUtils::createLegName(id, i).numeric());
64 }
65 }
66 }
67 if (msgLvl(MSG::DEBUG)) {
68 ATH_MSG_DEBUG( "Allowed decisions:" );
69 for (const DecisionID& id : m_allowedIDs) {
70 ATH_MSG_DEBUG( " +++ " << HLT::Identifier(id) );
71 }
72 }
73
74 if (!m_monTool.empty()) {
75 ATH_CHECK( m_monTool.retrieve() );
76 ATH_MSG_DEBUG( "GenericMonitoringTool name:" << m_monTool );
77 }
78 else {
79 ATH_MSG_DEBUG( "No GenericMonitoringTool configured: no monitoring histograms will be available" );
80 }
81
82 return StatusCode::SUCCESS;
83}
84
85
86StatusCode TrigBhhComboHypo::execute(const EventContext& context) const {
87
88 ATH_MSG_DEBUG( "TrigBhhComboHypo::execute() starts" );
89
90 ATH_MSG_DEBUG( "decision input key: " << decisionsInput().at(0).key() );
91 auto previousDecisionsHandle = SG::makeHandle(decisionsInput().at(0), context);
92 ATH_CHECK( previousDecisionsHandle.isValid() );
93 ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" );
94
96
97 auto trigBphysHandle = SG::makeHandle(m_trigBphysContainerKey, context);
98 ATH_CHECK( trigBphysHandle.record(std::make_unique<xAOD::TrigBphysContainer>(), std::make_unique<xAOD::TrigBphysAuxContainer>()) );
99
101 ATH_CHECK( beamSpotHandle.isValid() );
102
103 auto state = std::make_unique<TrigBhhState>(context, *previousDecisionsHandle, *outputDecisionsHandle, trigBphysHandle.ptr(), *beamSpotHandle);
104
107 ATH_CHECK( findBhhCandidates(*state) );
109
110 ATH_MSG_DEBUG( "TrigBhhComboHypo::execute() terminates with StatusCode::SUCCESS" );
111 return StatusCode::SUCCESS;
112}
113
114
116
117 auto& muons = state.muons;
118 muons.clear();
119
120 // all muons from views are already connected with previous decisions by TrigMuonEFHypoAlg
121 for (const Decision* decision : state.previousDecisions()) {
122 if (!TrigCompositeUtils::isAnyIDPassing(decision, m_allowedIDs)) continue;
123
125 auto muonEL = decision->objectLink<xAOD::MuonContainer>(TrigCompositeUtils::featureString());
126 const xAOD::Muon* muon = *muonEL;
127 if (!muon->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle)) continue;
128
129 auto decisionEL = TrigCompositeUtils::decisionToElementLink(decision, state.context());
130 auto itr = std::find_if(muons.begin(), muons.end(), [this, muon](const auto& x){ return isIdenticalTracks(muon, *x.link); });
131 if (itr == muons.end()) {
132 muons.push_back({muonEL, std::vector<ElementLink<DecisionContainer>>(1, decisionEL), DecisionIDContainer()});
133 }
134 else {
135 (*itr).decisionLinks.push_back(decisionEL);
136 }
137 }
138
139 // muon->pt() is equal to muon->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle)->pt()
140 // and the later is used by TrigMuonEFHypoTool for classification of muEFCB candidates
141 std::sort(muons.begin(), muons.end(), [](const auto& lhs, const auto& rhs){ return ((*lhs.link)->pt() > (*rhs.link)->pt()); });
142
143 // for each muon we extract DecisionIDs stored in the associated Decision objects and copy them at muon.decisionIDs
144 for (auto& item : muons) {
145 for (const ElementLink<xAOD::TrigCompositeContainer>& decisionEL : item.decisionLinks) {
146 TrigCompositeUtils::decisionIDs(*decisionEL, item.decisionIDs);
147 }
148 }
149
150 if (msgLvl(MSG::DEBUG)) {
151 ATH_MSG_DEBUG( "Dump found muons before vertex fit: " << muons.size() << " candidates" );
152 for (const auto& item : muons) {
153 const xAOD::Muon* muon = *item.link;
154 const xAOD::TrackParticle* track = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
155 ATH_MSG_DEBUG( " -- muon InDetTrackParticle pt/eta/phi/q: " << track->pt() << " / " << track->eta() << " / " << track->phi() << " / " << track->charge() );
156 ATH_MSG_DEBUG( " muon CombinedTrackParticle pt: " << muon->pt() );
157 ATH_MSG_DEBUG( " allowed decisions:" );
158 for (const DecisionID& id : item.decisionIDs) {
159 ATH_MSG_DEBUG( " +++ " << HLT::Identifier(id) );
160 }
161 }
162 }
163
164 return StatusCode::SUCCESS;
165}
166
167
169
170 const auto& muons = state.muons;
171 auto& tracks = state.tracks;
172 tracks.clear();
173
174 size_t viewCounter = 0;
175 for (const Decision* decision : state.previousDecisions()) {
176 if (!TrigCompositeUtils::isAnyIDPassing(decision, m_allowedIDs)) continue;
177
179 ATH_CHECK( viewLinkInfo.isValid() );
180 auto view = *viewLinkInfo.link;
181
183 ATH_CHECK( roiLinkInfo.isValid() );
184 const auto roi = *roiLinkInfo.link;
185
186 auto tracksHandle = ViewHelper::makeHandle(view, m_trackParticleContainerKey, state.context());
187 ATH_CHECK( tracksHandle.isValid() );
188 ATH_MSG_DEBUG( "tracks handle " << m_trackParticleContainerKey << " size: " << tracksHandle->size() );
189
190 std::vector<ElementLink<xAOD::TrackParticleContainer>> tracksFromView;
191 tracksFromView.reserve(tracksHandle->size());
192 for (size_t idx = 0; idx < tracksHandle->size(); ++idx) {
193 tracksFromView.emplace_back(ViewHelper::makeLink<xAOD::TrackParticleContainer>(view, tracksHandle, idx));
194 }
195
196 for (const auto& trackEL : tracksFromView) {
197 const xAOD::TrackParticle* track = *trackEL;
198 if (track->definingParametersCovMatrixVec().empty()) continue;
199
200 if (viewCounter == 0 ||
201 std::find_if(tracks.begin(), tracks.end(),
202 [this, track](const auto& x){ return isIdenticalTracks(track, *x); }) == tracks.end()) {
203 tracks.emplace_back(trackEL);
204 }
205 }
206 viewCounter++;
207 if (roi->composite()) {
208 break;
209 }
210 }
211
212 if (msgLvl(MSG::DEBUG)) {
213 std::sort(tracks.begin(), tracks.end(), [](const auto& lhs, const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
214 ATH_MSG_DEBUG( "Found " << tracks.size() << " tracks" );
215 for (const auto& trackEL : tracks) {
216 const xAOD::TrackParticle* track = *trackEL;
217 ATH_MSG_DEBUG( " -- track pt/eta/phi/q: " << track->pt() << " / " << track->eta() << " / " << track->phi() << " / " << track->charge() );
218 }
219 }
220
221 if (tracks.size() < 2) {
222 tracks.clear();
223 return StatusCode::SUCCESS;
224 }
225
226 // remove muon duplicates
227 if (m_applyMuonRemoval) {
228 for (size_t i = 0; i < muons.size(); ++i) {
229 const xAOD::Muon* muon = *muons[i].link;
230 const xAOD::TrackParticle* track = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
231 std::sort(tracks.begin(), tracks.end(), [p_mu=track->genvecP4()](const auto& lhs, const auto& rhs){ return ROOT::Math::VectorUtil::DeltaR(p_mu, (*lhs)->genvecP4()) > ROOT::Math::VectorUtil::DeltaR(p_mu, (*rhs)->genvecP4()); });
232 if (isIdenticalTracks(track, *tracks.back())) tracks.pop_back();
233 }
234 std::sort(tracks.begin(), tracks.end(), [](const auto& lhs, const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
235
236 if (msgLvl(MSG::DEBUG)) {
237 ATH_MSG_DEBUG( "Found " << tracks.size() << " tracks after muon removal" );
238 for (const auto& trackEL : tracks) {
239 const xAOD::TrackParticle* track = *trackEL;
240 ATH_MSG_DEBUG( " -- track pt/eta/phi/q: " << track->pt() << " / " << track->eta() << " / " << track->phi() << " / " << track->charge() );
241 }
242 }
243 }
244
245 // apply pT threshold cut
246 std::sort(tracks.begin(), tracks.end(), [](const auto& lhs, const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
247 tracks.erase(std::upper_bound(tracks.begin(), tracks.end(), m_trkPt, [](double trkPt, const auto& trackEL){ return trkPt > (*trackEL)->pt(); }), tracks.end());
248
249 if (msgLvl(MSG::DEBUG)) {
250 ATH_MSG_DEBUG( "Found " << tracks.size() << " tracks after pT threshold cut" );
251 for (const auto& trackEL : tracks) {
252 const xAOD::TrackParticle* track = *trackEL;
253 ATH_MSG_DEBUG( " -- track pt/eta/phi/q: " << track->pt() << " / " << track->eta() << " / " << track->phi() << " / " << track->charge() );
254 }
255 }
256 return StatusCode::SUCCESS;
257}
258
259
261
262 // monitored variables
263 auto mon_nMuon = Monitored::Scalar<int>("nMuon", 0);
264 auto mon_nTrk = Monitored::Scalar<int>("nTrk", 0);
265 auto mon_nBPhysObject = Monitored::Scalar<int>("nBPhysObject", 0);
266
267 auto group = Monitored::Group(m_monTool,
268 mon_nMuon, mon_nTrk, mon_nBPhysObject);
269
270 const auto& tracks = state.tracks;
271
272 size_t iterations = 0;
273 bool isOverWarningThreshold = false;
274
275 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks(2);
276 for (size_t itrk1 = 0; itrk1 < tracks.size(); ++itrk1) {
277 trackParticleLinks[0] = tracks[itrk1];
278 const xAOD::TrackParticle* trk1 = *trackParticleLinks[0];
279 auto p_trk1 = trk1->genvecP4();
280 auto charge1 = trk1->charge();
281
282 for (size_t itrk2 = itrk1 + 1; itrk2 < tracks.size(); ++itrk2) {
283 trackParticleLinks[1] = tracks[itrk2];
284 const xAOD::TrackParticle* trk2 = *trackParticleLinks[1];
285 auto p_trk2 = trk2->genvecP4();
286 auto charge2 = trk2->charge();
287
288 auto mKK = (p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mKaon)).M();
289 auto mPiPi = (p_trk1.SetM(PDG::mPion) + p_trk2.SetM(PDG::mPion)).M();
290
291 if (charge1 * charge2 > 0. || mKK < m_massRange.value().first || mPiPi > m_massRange.value().second) continue;
292
293 // fit tracks to the common vertex
294 auto vertex = fit(state.context(), trackParticleLinks);
295 iterations++;
296 if (!vertex) continue;
297
299 xAOD::TrigBphys* triggerObject = state.trigBphysCollection().back();
300
301 ATH_CHECK( fillTriggerObject(*triggerObject, *vertex, state.beamSpotPosition()) );
302 triggerObject->setMass(mKK);
303
304 ATH_MSG_DEBUG( "Found B -> h+ h- candidate: M(K+,K-) = " << mKK << " M(pi+,pi-) = " << mPiPi );
305
306 if (iterations > m_fitAttemptsWarningThreshold && !isOverWarningThreshold) {
307 ATH_MSG_WARNING( "B -> hh: " << state.trigBphysCollection().size() << " vertices created after " << iterations << " vertex fitter calls" );
308 isOverWarningThreshold = true;
309 }
310 if (iterations > m_fitAttemptsBreakThreshold) {
311 ATH_MSG_WARNING( "b -> hh: the number of fit attempts has exceeded the limit, breaking the loop at this point" );
312 itrk1 = tracks.size();
313 break;
314 }
315
316 }
317 }
318
319 mon_nMuon = state.muons.size();
320 mon_nTrk = tracks.size();
321 mon_nBPhysObject = state.trigBphysCollection().size();
322
323 return StatusCode::SUCCESS;
324}
325
326
328
329 // state.muons() are common seeds for all B -> hh candidates
330 std::vector<ElementLink<TrigCompositeUtils::DecisionContainer>> previousDecisionLinks;
332 std::vector<const DecisionIDContainer*> previousDecisionIDs = { &decisionIDs };
333
334 for (const Decision* previousDecision : state.previousDecisions()) {
335 if (!TrigCompositeUtils::isAnyIDPassing(previousDecision, m_allowedIDs)) continue;
336
337 previousDecisionLinks.emplace_back(TrigCompositeUtils::decisionToElementLink(previousDecision, state.context()));
339 }
340
341 for (const xAOD::TrigBphys* triggerObject : state.trigBphysCollection()) {
342 ATH_MSG_DEBUG( "Found xAOD::TrigBphys object: fitMass = " << triggerObject->fitmass() << ", chi2 = " << triggerObject->fitchi2() );
343
344 auto triggerObjectEL = ElementLink<xAOD::TrigBphysContainer>(state.trigBphysCollection(), triggerObject->index());
345 ATH_CHECK( triggerObjectEL.isValid() );
346
347 // create a new output Decision object, backed by the 'decisions' container.
349
350 // attach all previous decisions, no need to use TrigCompositeUtils::linkToPrevious()
351 decision->addObjectCollectionLinks(TrigCompositeUtils::seedString(), previousDecisionLinks);
352
353 // set mandatory link to the trigger object
355
356 for (const auto& tool : hypoTools()) {
357 ATH_MSG_DEBUG( "Go to " << tool );
358 ATH_CHECK( tool->decideOnSingleObject(decision, previousDecisionIDs) );
359 }
360 }
361
362 return StatusCode::SUCCESS;
363}
364
365
366std::unique_ptr<xAOD::Vertex> TrigBhhComboHypo::fit(
367 const EventContext& context,
368 const std::vector<ElementLink<xAOD::TrackParticleContainer>>& trackParticleLinks,
369 const std::vector<double>& trkMass) const {
370
371 ATH_MSG_DEBUG( "Perform vertex fit" );
372
373 if (trackParticleLinks.size() != 2) {
374 ATH_MSG_WARNING( "Exactly two tracks should be given to the vertex fitter" );
375 return std::unique_ptr<xAOD::Vertex>(nullptr);
376 }
377
378 std::vector<const xAOD::TrackParticle*> tracklist(trackParticleLinks.size(), nullptr);
379 std::transform(trackParticleLinks.begin(), trackParticleLinks.end(), tracklist.begin(),
380 [](const ElementLink<xAOD::TrackParticleContainer>& link){ return *link; });
381
382 Amg::Vector3D startingPoint = Amg::Vector3D::Zero(3);
383 int flag = 0;
384 int errorcode = 0;
385 const Trk::Perigee& perigee1 = tracklist[0]->perigeeParameters();
386 const Trk::Perigee& perigee2 = tracklist[1]->perigeeParameters();
387 startingPoint = m_vertexPointEstimator->getCirclesIntersectionPoint(&perigee1, &perigee2, flag, errorcode);
388 if (errorcode != 0) startingPoint = Amg::Vector3D::Zero(3);
389 ATH_MSG_DEBUG( "Starting point: (" << startingPoint(0) << ", " << startingPoint(1) << ", " << startingPoint(2) << ")" );
390
391 auto fitterState = m_vertexFitter->makeState(context);
392 m_vertexFitter->setMassInputParticles(trkMass, *fitterState);
393
394 std::unique_ptr<xAOD::Vertex> vertex(m_vertexFitter->fit(tracklist, startingPoint, *fitterState));
395 if (!vertex) {
396 ATH_MSG_DEBUG( "Vertex fit fails" );
397 return vertex;
398 }
399 if (vertex->chiSquared() > m_chi2) {
400 ATH_MSG_DEBUG( "Fit is successful, but vertex chi2 is too high, we are not going to save it (chi2 = " << vertex->chiSquared() << ")" );
401 vertex.reset();
402 return vertex;
403 }
404 ATH_MSG_DEBUG( "Fit is successful" );
405
406 // update trackParticleLinks()
407 vertex->clearTracks();
408 vertex->setTrackParticleLinks(trackParticleLinks);
409
410 return vertex;
411}
412
413
415 xAOD::TrigBphys& triggerObject,
416 const xAOD::Vertex& vertex,
417 const Amg::Vector3D& productionVertex,
418 const std::vector<double>& trkMass) const {
419
420 // refitted track momentum as a 4-vector for mass hypothesis defined by the given decay value
422 std::vector<xAOD::TrackParticle::GenVecFourMom_t> momenta;
423 ATH_CHECK( vertex.vxTrackAtVertexAvailable() );
424 ATH_CHECK( vertex.vxTrackAtVertex().size() == trkMass.size() );
425 for (size_t i = 0; i < vertex.vxTrackAtVertex().size(); ++i) {
426 const Trk::TrackParameters* perigee = vertex.vxTrackAtVertex()[i].perigeeAtVertex();
427 ATH_CHECK( perigee != nullptr );
428 const Amg::Vector3D& p = perigee->momentum();
429 momenta.emplace_back(p.x(), p.y(), p.z(), trkMass[i]);
430 momentum += momenta.back();
431 }
432
433 triggerObject.initialise(0, momentum.Eta(), momentum.Phi(), momentum.Pt(), xAOD::TrigBphys::BHH, momentum.M(), xAOD::TrigBphys::EF);
434
435 triggerObject.setFitmass(momentum.M());
436 triggerObject.setFitx(vertex.x());
437 triggerObject.setFity(vertex.y());
438 triggerObject.setFitz(vertex.z());
439 triggerObject.setFitchi2(vertex.chiSquared());
440 triggerObject.setFitndof(vertex.numberDoF());
441 triggerObject.setLxy(Lxy(productionVertex, vertex.position(), momenta));
442
443 // set all the particles associated with the decay
444 triggerObject.setTrackParticleLinks(vertex.trackParticleLinks());
445
447 "TrigBphys object:\n\t " <<
448 "roiId: " << triggerObject.roiId() << "\n\t " <<
449 "particleType: " << triggerObject.particleType() << "\n\t " <<
450 "level: " << triggerObject.level() << "\n\t " <<
451 "eta: " << triggerObject.eta() << "\n\t " <<
452 "phi: " << triggerObject.phi() << "\n\t " <<
453 "mass: " << triggerObject.mass() << "\n\t " <<
454 "fitmass: " << triggerObject.fitmass() << "\n\t " <<
455 "chi2/NDF: " << triggerObject.fitchi2() << " / " << triggerObject.fitndof() << "\n\t " <<
456 "vertex: (" << triggerObject.fitx() << ", " << triggerObject.fity() << ", " << triggerObject.fitz() << ")" );
457
458 return StatusCode::SUCCESS;
459}
460
461
463
464 if (lhs->charge() * rhs->charge() < 0.) return false;
465 return (ROOT::Math::VectorUtil::DeltaR(lhs->genvecP4(), rhs->genvecP4()) < m_deltaR);
466}
467
468
469bool TrigBhhComboHypo::isIdenticalTracks(const xAOD::Muon* lhs, const xAOD::Muon* rhs) const {
470
471 return isIdenticalTracks(lhs->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle),
472 rhs->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle));
473}
474
475
476double TrigBhhComboHypo::Lxy(const Amg::Vector3D& productionVertex, const Amg::Vector3D& decayVertex, const std::vector<xAOD::TrackParticle::GenVecFourMom_t>& momenta) const {
477
478 XYVector R(decayVertex.x() - productionVertex.x(), decayVertex.y() - productionVertex.y());
479 XYVector pT;
480 for (const auto& p : momenta) {
481 pT += XYVector(p.x(), p.y());
482 }
483 return R.Dot(pT.unit());
484}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Base class for elements of a container that can have aux data.
void decisionIDs(const Decision *d, DecisionIDContainer &id)
Extracts DecisionIDs stored in the Decision object.
size_t size() const
Number of registered mappings.
#define x
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)
bool msgLvl(const MSG::Level lvl) const
ComboHypo(const std::string &name, ISvcLocator *pSvcLocator)
Definition ComboHypo.cxx:13
const SG::WriteHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsOutput() const
Definition ComboHypo.h:42
const Combo::MultiplicityReqMap & triggerMultiplicityMap() const
Definition ComboHypo.h:43
ToolHandleArray< ComboHypoToolBase > & hypoTools()
Definition ComboHypo.h:45
const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsInput() const
Definition ComboHypo.h:41
virtual StatusCode initialize() override
Definition ComboHypo.cxx:22
const T * back() const
Access the last element in the collection as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
TrigCompositeUtils::DecisionContainer & decisions()
const TrigCompositeUtils::DecisionContainer & previousDecisions() const
xAOD::TrigBphysContainer & trigBphysCollection()
Amg::Vector3D beamSpotPosition() const
const EventContext & context() const
Group of local monitoring quantities and retain correlation when filling histograms
Declare a monitored scalar variable.
pointer_type ptr()
Dereference the pointer.
ToolHandle< InDet::VertexPointEstimator > m_vertexPointEstimator
StatusCode fillTriggerObject(xAOD::TrigBphys &triggerObject, const xAOD::Vertex &vertex, const Amg::Vector3D &productionVertex, const std::vector< double > &trkMass={PDG::mKaon, PDG::mKaon}) const
Fill the trigger object that may be stored for debugging or matching.
Gaudi::Property< double > m_chi2
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
TrigBhhComboHypo()=delete
StatusCode mergeMuonsFromDecisions(TrigBhhState &) const
Go through state.previousDecisions(), fetch xAOD::Muons objects attached to decisions and save links ...
ToolHandle< Trk::TrkVKalVrtFitter > m_vertexFitter
Gaudi::Property< double > m_trkPt
virtual StatusCode execute(const EventContext &context) const override
bool isIdenticalTracks(const xAOD::TrackParticle *lhs, const xAOD::TrackParticle *rhs) const
Returns false for the tracks with opposite charges.
Gaudi::Property< std::pair< double, double > > m_massRange
SG::WriteHandleKey< xAOD::TrigBphysContainer > m_trigBphysContainerKey
ToolHandle< GenericMonitoringTool > m_monTool
TrigCompositeUtils::DecisionIDContainer m_allowedIDs
Gaudi::Property< double > m_deltaR
Gaudi::Property< size_t > m_fitAttemptsBreakThreshold
virtual StatusCode initialize() override
std::unique_ptr< xAOD::Vertex > fit(const EventContext &context, const std::vector< ElementLink< xAOD::TrackParticleContainer > > &trackParticleLinks, const std::vector< double > &trkMass={PDG::mKaon, PDG::mKaon}) const
Perform a vertex fit on selected tracks.
Gaudi::Property< bool > m_applyMuonRemoval
double Lxy(const Amg::Vector3D &productionVertex, const Amg::Vector3D &decayVertex, const std::vector< xAOD::TrackParticle::GenVecFourMom_t > &momenta) const
Returns the transverse decay length of a particle Lxy in [mm].
Gaudi::Property< size_t > m_fitAttemptsWarningThreshold
StatusCode findBhhCandidates(TrigBhhState &) const
Make all possible combinations from state.tracks(), fit tracks to the common vertex,...
StatusCode mergeTracksFromViews(TrigBhhState &) const
Go through state.previousDecisions() and fetch xAOD::TrackParticle objects associated with the neares...
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
StatusCode createDecisionObjects(TrigBhhState &) const
Create a decision for each xAOD::TrigBphys object from state.trigBphysCollection() and use hypoTools(...
State class for TrigBhhComboHypo algorithm.
std::vector< ElementLink< xAOD::TrackParticleContainer > > tracks
std::vector< Muon > muons
const Amg::Vector3D & momentum() const
Access method for the momentum.
const TrackParticle * trackParticle(TrackParticleType type) const
Returns a pointer (which can be NULL) to the TrackParticle used in identification of this muon.
Definition Muon_v1.cxx:482
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzM4D< double > > GenVecFourMom_t
Base 4 Momentum type for TrackParticle.
GenVecFourMom_t genvecP4() const
The full 4-momentum of the particle : GenVector form.
float charge() const
Returns the charge.
int fitndof() const
accessor method: ndof from vertex fit
void setFitchi2(float FitChi2)
set method: chi2 from vertex fit
void setFitx(float FitX)
set method: x position of vertex
uint32_t roiId() const
accessor method: ID of L1 RoI
void setFity(float FitY)
set method: y position of vertex
float eta() const
accessor method: eta
pType particleType() const
accessor method: particle Type
float phi() const
accessor method: phi
float fitchi2() const
accessor method: chi2 from vertex fit
void setFitndof(int FitNdof)
set method: ndof from vertex fit
void setFitz(float FitZ)
set method: z position of vertex
float fitx() const
accessor method: x position of vertex
void setLxy(float v)
set method: lxy
void setFitmass(float FitMass)
set method: mass from vertex fit
float fitz() const
accessor method: z position of vertex
float fitmass() const
accessor method: mass from vertex fit
float mass() const
accessor method: mass
void setMass(float)
Set the mass of the object.
float fity() const
accessor method: y position of vertex
levelType level() const
accessor method: level Type
void setTrackParticleLinks(const std::vector< ElementLink< TrackParticleContainer > > &links)
Set the track particle links on the object.
bool setObjectLink(const std::string &name, const ElementLink< CONTAINER > &link)
Set the link to an object.
bool addObjectCollectionLinks(const std::string &collectionName, const std::vector< ElementLink< CONTAINER > > &links)
Add links to multiple objects within a collection. Performs de-duplication.
Eigen::Matrix< double, 3, 1 > Vector3D
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
HLT::Identifier createLegName(const HLT::Identifier &chainIdentifier, size_t counter)
Generate the HLT::Identifier which corresponds to a specific leg of a given chain.
unsigned int DecisionID
const std::string & viewString()
const std::string & roiString()
Decision * newDecisionIn(DecisionContainer *dc, const std::string &name)
Helper method to create a Decision object, place it in the container and return a pointer to it.
const std::string & featureString()
const std::string & comboHypoAlgNodeName()
std::set< DecisionID > DecisionIDContainer
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
LinkInfo< T > findLink(const Decision *start, const std::string &linkName, const bool suppressMultipleLinksWarning=false)
Perform a recursive search for ElementLinks of type T and name 'linkName', starting from Decision obj...
const std::string & seedString()
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.
bool isAnyIDPassing(const Decision *d, const DecisionIDContainer &required)
Checks if any of the DecisionIDs passed in arg required is availble in Decision object.
ElementLink< DecisionContainer > decisionToElementLink(const Decision *d, const EventContext &ctx)
Takes a raw pointer to a Decision and returns an ElementLink to the Decision.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersBase< TrackParametersDim, Charged > TrackParameters
ElementLink< T > makeLink(const SG::View *view, const SG::ReadHandle< T > &handle, size_t index)
Create EL to a collection in view.
Definition ViewHelper.h:309
auto makeHandle(const SG::View *view, const KEY &key, const EventContext &ctx)
Create a view handle from a handle key.
Definition ViewHelper.h:273
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
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:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
TrigBphysContainer_v1 TrigBphysContainer