29#include "Math/GenVector/VectorUtil.h"
30#include "Math/Vector2D.h"
38using ROOT::Math::XYVector;
74 if (item.second.size() > 1) {
75 for (
size_t i = 0; i < item.second.size(); i++) {
92 ATH_MSG_DEBUG(
"No GenericMonitoringTool configured: no monitoring histograms will be available" );
95 return StatusCode::SUCCESS;
105 ATH_CHECK( previousDecisionsHandle.isValid() );
106 ATH_MSG_DEBUG(
"Running with " << previousDecisionsHandle->size() <<
" previous decisions" );
111 ATH_CHECK( trigBphysHandle.record(std::make_unique<xAOD::TrigBphysContainer>(),
112 std::make_unique<xAOD::TrigBphysAuxContainer>()) );
117 auto state = std::make_unique<TrigBmuxState>(context, *previousDecisionsHandle, *outputDecisionsHandle, trigBphysHandle.
ptr(), *beamSpotHandle);
122 ATH_MSG_DEBUG(
"TrigBmuxComboHypo::execute() terminates with StatusCode::SUCCESS" );
123 return StatusCode::SUCCESS;
129 auto& muons = state.
muons;
133 std::vector<int> nTrk;
139 mon_nMuon, mon_nTrk, mon_nBPhysObject);
147 const auto muon = *muonEL;
148 if (!muon->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle))
continue;
149 if (!muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle))
continue;
150 const auto muonInDetTrack = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
151 auto p_mu = muonInDetTrack->genvecP4();
159 size_t muonIndex = muons.size();
160 muons.push_back({muonEL, decisionEL,
decisionIDs});
162 ATH_MSG_DEBUG(
"Found muon (CombinedTrackParticle) pt/eta/phi/q: " << muon->pt() <<
" / " << muon->eta() <<
" / " << muon->phi() <<
" / " << muon->charge() );
166 auto view = *viewLinkInfo.link;
170 const auto roi = *roiLinkInfo.link;
176 std::vector<ElementLink<xAOD::TrackParticleContainer>> tracks;
177 tracks.reserve(tracksHandle->size());
178 for (
size_t idx = 0; idx < tracksHandle->size(); ++idx) {
179 const auto track = tracksHandle->get(idx);
181 if (roi->composite() && !
isInSameRoI(muon, track))
continue;
185 if (tracks.size() < 2)
continue;
186 std::sort(tracks.begin(), tracks.end(), [p_mu](
const auto& lhs,
const auto& rhs){ return ROOT::Math::VectorUtil::DeltaR(p_mu, (*lhs)->genvecP4()) > ROOT::Math::VectorUtil::DeltaR(p_mu, (*rhs)->genvecP4()); });
188 nTrk.push_back(tracks.size());
190 std::sort(tracks.begin(), tracks.end(), [](
const auto& lhs,
const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
193 ATH_MSG_DEBUG(
"Dump found tracks before vertex fit: " << tracks.size() <<
" candidates" );
194 for (
const auto& trackEL : tracks) {
196 ATH_MSG_DEBUG(
" -- track pt/eta/phi/q: " << track->pt() <<
" / " << track->eta() <<
" / " << track->phi() <<
" / " << track->charge() );
200 size_t iterations = 0;
201 bool isOverWarningThreshold =
false;
202 for (
size_t itrk1 = 0; itrk1 < tracks.size(); ++itrk1) {
205 auto charge1 = trk1->
charge();
207 for (
size_t itrk2 = 0; itrk2 < tracks.size(); ++itrk2) {
208 if (itrk2 == itrk1)
continue;
211 auto charge2 = trk2->
charge();
215 std::unique_ptr<xAOD::Vertex> vtx_D0;
218 charge1 * charge2 < 0. &&
224 vtx_D0 =
fit(state.
context(), {linkTrack(muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)), tracks[itrk1], tracks[itrk2]},
kD0);
228 ATH_MSG_DEBUG(
"Partially reconstructed B+ -> mu+ nu_mu anti-D0(-> K+ pi-) candidate has been created from { " << itrk1 <<
", " << itrk2 <<
" }" );
230 auto result =
fitCascade(state.
context(), {linkTrack(muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)),
231 tracks[itrk1], tracks[itrk2]},
kD0);
235 std::vector<xAOD::TrigBphys*> triggerObjects = state.
addTriggerObjects(2, muonIndex);
237 p_D0 = ROOT::Math::PtEtaPhiMVector(triggerObjects[0]->pt(), triggerObjects[0]->
eta(), triggerObjects[0]->
phi(), triggerObjects[0]->fitmass());
251 p_D0 = ROOT::Math::PtEtaPhiMVector(triggerObject->
pt(), triggerObject->
eta(), triggerObject->
phi(), triggerObject->
fitmass());
252 triggerObject->
setMass((p_mu + p_D0).M());
260 for (
size_t itrk3 = 0; itrk3 < tracks.size(); ++itrk3) {
261 if (itrk3 == itrk1 || itrk3 == itrk2)
continue;
266 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks = {
linkTrack(muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle)),
267 tracks[itrk1], tracks[itrk2], tracks[itrk3]};
275 bool makeDstar =
true;
277 std::unique_ptr<const Trk::Perigee> perigee(
m_trackToVertexTool->perigeeAtVertex(state.
context(), *trk3, vtx_D0->position()));
287 Lxy(result->vertices()[1]->position(), result->vertices()[0]->position(), result->getParticleMoms()[0]) >
m_BToD0_LxyD0) {
289 std::vector<xAOD::TrigBphys*> triggerObjects = state.
addTriggerObjects(2, muonIndex);
291 triggerObjects[1]->setSecondaryDecayLink(D0);
304 "TrigBphys object:\n\t " <<
305 "roiId: " << Dstar->
roiId() <<
"\n\t " <<
307 "level: " << Dstar->
level() <<
"\n\t " <<
308 "eta: " << Dstar->
eta() <<
"\n\t " <<
309 "phi: " << Dstar->
phi() <<
"\n\t " <<
310 "mass: " << Dstar->
mass() <<
"\n\t " <<
311 "fitmass: " << Dstar->
fitmass() <<
"\n\t " <<
312 "chi2/NDF: " << Dstar->
fitchi2() <<
" / " << Dstar->
fitndof() <<
"\n\t " <<
313 "vertex: (" << Dstar->
fitx() <<
", " << Dstar->
fity() <<
", " << Dstar->
fitz() <<
")" );
323 charge1 * charge2 < 0. && charge2 * charge3 > 0. &&
334 ATH_MSG_DEBUG(
"Partially reconstructed B0 -> mu+ nu_mu D-(-> K+ pi- pi-) candidate has been created from { " << itrk1 <<
", " << itrk2 <<
", " << itrk3 <<
" }" );
340 Lxy(result->vertices()[1]->position(), result->vertices()[0]->position(), result->getParticleMoms()[0]) >
m_BdToD_LxyD) {
342 std::vector<xAOD::TrigBphys*> triggerObjects = state.
addTriggerObjects(2, muonIndex);
351 triggerObject->
setMass((p_mu + p_D).M());
360 charge1 * charge2 < 0. &&
372 ATH_MSG_DEBUG(
"Partially reconstructed B_s0 -> mu+ nu_mu D_s-(->phi(-> K+ K-) pi-) candidate has been created from { " << itrk1 <<
", " << itrk2 <<
", " << itrk3 <<
" }" );
378 Lxy(result->vertices()[1]->position(), result->vertices()[0]->position(), result->getParticleMoms()[0]) >
m_BsToDs_LxyDs) {
380 std::vector<xAOD::TrigBphys*> triggerObjects = state.
addTriggerObjects(2, muonIndex);
389 triggerObject->
setMass((p_mu + p_Ds).M());
397 charge1 *
charge3 > 0. && charge1 * charge2 < 0. &&
408 ATH_MSG_DEBUG(
"Partially reconstructed Lambda_b0 -> mu+ nu_mu anti-Lambda_c-(-> anti-p K+ pi-) candidate has been created from { " << itrk1 <<
", " << itrk2 <<
", " << itrk3 <<
" }" );
414 Lxy(result->vertices()[1]->position(), result->vertices()[0]->position(), result->getParticleMoms()[0]) >
m_LambdaBToLambdaC_LxyLc) {
416 std::vector<xAOD::TrigBphys*> triggerObjects = state.
addTriggerObjects(2, muonIndex);
425 triggerObject->
setMass((p_mu + p_LambdaC).M());
437 ATH_MSG_WARNING( iterations <<
" combinations for vertex fitter have been processed; " << mon_nBPhysObject <<
" vertices have been created" );
438 isOverWarningThreshold =
true;
441 ATH_MSG_WARNING(
"the number of fit attempts has exceeded the limit; breaking the loop at this point" );
446 return StatusCode::SUCCESS;
456 ATH_MSG_DEBUG(
"Found xAOD::TrigBphys object: mass = " << triggerObject->mass() );
472 std::vector<const DecisionIDContainer*> previousDecisionIDs(1, &muon.decisionIDs);
475 ATH_CHECK( tool->decideOnSingleObject(decision, previousDecisionIDs) );
480 return StatusCode::SUCCESS;
485 const EventContext& context,
491 if (trackParticleLinks.size() < 3) {
492 ATH_MSG_WARNING(
"At least muon and two tracks should be given to the vertex fitter" );
493 return std::unique_ptr<xAOD::Vertex>(
nullptr);
496 std::vector<const xAOD::TrackParticle*> tracklist(trackParticleLinks.size() - 1,
nullptr);
497 std::transform(trackParticleLinks.begin() + 1, trackParticleLinks.end(), tracklist.begin(),
503 const Trk::Perigee& perigee1 = tracklist[0]->perigeeParameters();
504 const Trk::Perigee& perigee2 = tracklist[1]->perigeeParameters();
505 startingPoint =
m_vertexPointEstimator->getCirclesIntersectionPoint(&perigee1, &perigee2, flag, errorcode);
506 if (errorcode != 0) startingPoint = Amg::Vector3D::Zero(3);
507 ATH_MSG_DEBUG(
"Starting point: (" << startingPoint(0) <<
", " << startingPoint(1) <<
", " << startingPoint(2) <<
")" );
512 std::unique_ptr<xAOD::Vertex> vertex(
m_vertexFitter->fit(tracklist, startingPoint, *fitterState));
517 if (vertex->chiSquared() > 50.) {
518 ATH_MSG_DEBUG(
"Fit is successful, but vertex chi2 is too high, we are not going to save it (chi2 = " << vertex->chiSquared() <<
")" );
525 vertex->clearTracks();
526 vertex->setTrackParticleLinks(trackParticleLinks);
533 const EventContext& context,
537 if (trackParticleLinks.size() != (decay ==
kD0 ? 3 : 4)) {
538 ATH_MSG_WARNING(
"fitCascade(): " << (decay ==
kD0 ? 3 : 4) <<
" tracks required for decay " << decay <<
", but trackParticleLinks size = " << trackParticleLinks.size() );
539 return std::unique_ptr<Trk::VxCascadeInfo>(
nullptr);
542 std::vector<std::vector<ElementLink<xAOD::TrackParticleContainer>>> vtx_trackParticleLinks;
546 vtx_trackParticleLinks = {{trackParticleLinks[1], trackParticleLinks[2]},
547 {trackParticleLinks[0]}};
551 vtx_trackParticleLinks = {{trackParticleLinks[1], trackParticleLinks[2]},
552 {trackParticleLinks[0], trackParticleLinks[3]}};
558 vtx_trackParticleLinks = {{trackParticleLinks[1], trackParticleLinks[2], trackParticleLinks[3]},
559 {trackParticleLinks[0]}};
563 ATH_MSG_WARNING(
"fitCascade(): decay " << decay <<
" has not been defined in McTopologyTool" );
564 return std::unique_ptr<Trk::VxCascadeInfo>(
nullptr);
568 std::vector<std::vector<const xAOD::TrackParticle*>> vtx_tracks(vtx_trackParticleLinks.size());
569 for (
size_t i = 0; i < vtx_trackParticleLinks.size(); ++i) {
570 for (
size_t j = 0; j < vtx_trackParticleLinks[i].size(); ++j) {
571 vtx_tracks[i].push_back(*vtx_trackParticleLinks[i][j]);
578 std::vector<Trk::VertexID> precedingVertices(1,
m_vertexFitter->startVertex(vtx_tracks[0],
s_trkMass[
static_cast<size_t>(decay)][0], *state));
579 m_vertexFitter->nextVertex(vtx_tracks[1],
s_trkMass[
static_cast<size_t>(decay)][1], precedingVertices, *state);
580 std::unique_ptr<Trk::VxCascadeInfo> result(
m_vertexFitter->fitCascade(*state));
583 ATH_MSG_DEBUG(
"Cascade fit is successful: chi2 = " << result->fitChi2() <<
"; NDF = " << result->nDoF() );
584 result->setSVOwnership(
true);
588 vertex->clearTracks();
589 vertex->setTrackParticleLinks(vtx_trackParticleLinks[i++]);
601 const std::vector<double>& trkMass)
const {
605 std::vector<xAOD::TrackParticle::GenVecFourMom_t> momenta;
606 ATH_CHECK( vertex.vxTrackAtVertexAvailable() );
607 ATH_CHECK( vertex.vxTrackAtVertex().size() == trkMass.size() );
608 for (
size_t i = 0; i < vertex.vxTrackAtVertex().
size(); ++i) {
612 momenta.emplace_back(p.x(), p.y(), p.z(), trkMass[i]);
613 momentum += momenta.back();
619 triggerObject.
setFitx(vertex.x());
620 triggerObject.
setFity(vertex.y());
621 triggerObject.
setFitz(vertex.z());
622 triggerObject.
setFitchi2(vertex.chiSquared());
629 "TrigBphys object:\n\t " <<
630 "roiId: " << triggerObject.
roiId() <<
"\n\t " <<
631 "particleType: " << triggerObject.
particleType() <<
"\n\t " <<
632 "level: " << triggerObject.
level() <<
"\n\t " <<
633 "eta: " << triggerObject.
eta() <<
"\n\t " <<
634 "phi: " << triggerObject.
phi() <<
"\n\t " <<
635 "mass: " << triggerObject.
mass() <<
"\n\t " <<
636 "fitmass: " << triggerObject.
fitmass() <<
"\n\t " <<
637 "chi2/NDF: " << triggerObject.
fitchi2() <<
" / " << triggerObject.
fitndof() <<
"\n\t " <<
638 "vertex: (" << triggerObject.
fitx() <<
", " << triggerObject.
fity() <<
", " << triggerObject.
fitz() <<
")" );
640 return StatusCode::SUCCESS;
645 std::vector<xAOD::TrigBphys*>& triggerObjects,
650 const std::vector<xAOD::Vertex*>& vertices = vxCascadeInfo.
vertices();
651 const std::vector<std::vector<TLorentzVector>>& momenta = vxCascadeInfo.
getParticleMoms();
652 ATH_CHECK( triggerObjects.size() == vertices.size() );
654 for (
size_t i = 0; i < vertices.size(); ++i) {
656 TLorentzVector momentum = std::accumulate(momenta[i].begin(), momenta[i].end(), TLorentzVector());
660 triggerObject->
setFitx(vertex->x());
661 triggerObject->
setFity(vertex->y());
662 triggerObject->
setFitz(vertex->z());
667 triggerObjects[0]->setLxy(
Lxy(vertices[1]->position(), vertices[0]->position(), momenta[0]));
672 triggerObjects[1]->setParticleType(
type);
673 triggerObjects[1]->setFitchi2(vxCascadeInfo.
fitChi2());
674 triggerObjects[1]->setFitndof(vxCascadeInfo.
nDoF());
675 triggerObjects[1]->setLxy(
Lxy(beamSpotPosition, vertices[1]->position(), momenta[1]));
683 "TrigBphys object:\n\t " <<
685 "chi2/NDF: " << vtx1->
fitchi2() <<
" / " << vtx1->
fitndof() <<
"\n\t " <<
686 "vertex0: (" << vtx0->
fitx() <<
", " << vtx0->
fity() <<
", " << vtx0->
fitz() <<
")\n\t " <<
687 "vertex1: (" << vtx1->
fitx() <<
", " << vtx1->
fity() <<
", " << vtx1->
fitz() <<
")\n\t " <<
688 "Lxy(B): " << vtx1->
lxy() <<
"\n\t " <<
689 "Lxy(D): " << vtx0->
lxy() );
692 return StatusCode::SUCCESS;
705 auto p_mu = muon->genvecP4();
706 auto p_trk = track->genvecP4();
713 std::unique_ptr<const Trk::Perigee> perigee(
m_trackToVertexTool->perigeeAtVertex(ctx, track, vertex));
714 return (perigee ? perigee->parameters()[
Trk::z0] : -1000.);
720 XYVector R(decayVertex.x() - productionVertex.x(), decayVertex.y() - productionVertex.y());
722 for (
const auto& p : momenta) {
723 pT += XYVector(p.Px(), p.Py());
725 return R.Dot(pT.unit());
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
ElementLink()
Default constructor.
bool isValid() const
Test to see if the link can be dereferenced.
#define ATH_MSG_WARNING(x)
Base class for elements of a container that can have aux data.
ElementLink< xAOD::TrackParticleContainer > linkTrack(const xAOD::TrackParticle *trk)
void decisionIDs(const Decision *d, DecisionIDContainer &id)
Extracts DecisionIDs stored in the Decision object.
size_t size() const
Number of registered mappings.
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)
const SG::WriteHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsOutput() const
const Combo::MultiplicityReqMap & triggerMultiplicityMap() const
ToolHandleArray< ComboHypoToolBase > & hypoTools()
const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsInput() const
virtual StatusCode initialize() override
size_type size() const noexcept
Returns the number of elements in the collection.
ElementLink implementation for ROOT usage.
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.
Gaudi::Property< float > m_BsToDs_chi2
double getTrkImpactParameterZ0(const EventContext &ctx, const xAOD::TrackParticle &track, const Amg::Vector3D &vertex) const
Returns the longitudinal impact parameter z0 of the track w.r.t.
Gaudi::Property< double > m_BdToD_minPionPt
Gaudi::Property< std::pair< double, double > > m_LambdaBToLambdaC_LambdaCMassRange
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
Gaudi::Property< bool > m_BsToDs
Gaudi::Property< float > m_BsToDs_LxyBs
Gaudi::Property< std::pair< double, double > > m_BdToD_massRange
bool isInSameRoI(const xAOD::Muon *, const xAOD::TrackParticle *) const
Checks that the given track is close enough to the muon, i.e.
Gaudi::Property< float > m_BToD0_chi2
Gaudi::Property< bool > m_BdToD
Gaudi::Property< std::pair< double, double > > m_LambdaBToLambdaC_massRange
TrigCompositeUtils::DecisionIDContainer m_allowedIDs
Gaudi::Property< bool > m_BToD0_makeDstar
Gaudi::Property< size_t > m_fitAttemptsWarningThreshold
Gaudi::Property< float > m_BsToDs_LxyDs
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainerKey
ToolHandle< Trk::TrkVKalVrtFitter > m_vertexFitter
Gaudi::Property< float > m_BToD0_LxyB
Gaudi::Property< float > m_BdToD_LxyD
std::unique_ptr< xAOD::Vertex > fit(const EventContext &context, const std::vector< ElementLink< xAOD::TrackParticleContainer > > &trackParticleLinks, Decay decay) const
Perform a vertex fit on selected tracks.
StatusCode createDecisionObjects(TrigBmuxState &) const
Gaudi::Property< double > m_BToD0_minD0Pt
Gaudi::Property< double > m_LambdaBToLambdaC_minPionPt
double Lxy(const Amg::Vector3D &productionVertex, const Amg::Vector3D &decayVertex, const std::vector< TLorentzVector > &momenta) const
Returns the transverse decay length of a particle Lxy in [mm].
SG::WriteHandleKey< xAOD::TrigBphysContainer > m_trigBphysContainerKey
Gaudi::Property< double > m_trkZ0
Gaudi::Property< double > m_BsToDs_minPionPt
ToolHandle< GenericMonitoringTool > m_monTool
bool isInMassRange(double mass, const std::pair< double, double > &range) const
Checks that the given mass value falls into the specified range.
Gaudi::Property< double > m_BdToD_minKaonPt
Gaudi::Property< double > m_BToD0_minDstarPionPt
Gaudi::Property< float > m_BdToD_chi2
Gaudi::Property< std::pair< double, double > > m_BToD0_DstarMassRange
Gaudi::Property< double > m_roiEtaWidth
Gaudi::Property< double > m_BdToD_minDPt
Gaudi::Property< float > m_BdToD_LxyBd
static const std::vector< std::vector< std::vector< double > > > s_trkMass
Gaudi::Property< std::pair< double, double > > m_BsToDs_DsMassRange
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
Gaudi::Property< float > m_LambdaBToLambdaC_LxyLc
Gaudi::Property< double > m_LambdaBToLambdaC_minProtonPt
Gaudi::Property< double > m_BsToDs_minDsPt
Gaudi::Property< float > m_BToD0_LxyD0
Gaudi::Property< size_t > m_fitAttemptsBreakThreshold
StatusCode findBmuxCandidates(TrigBmuxState &) const
Gaudi::Property< double > m_BsToDs_minKaonPt
Gaudi::Property< std::pair< double, double > > m_BsToDs_phiMassRange
Gaudi::Property< double > m_BToD0_minD0PionPt
Gaudi::Property< double > m_roiPhiWidth
Gaudi::Property< double > m_LambdaBToLambdaC_minLambdaCPt
Gaudi::Property< double > m_BToD0_minD0KaonPt
Gaudi::Property< bool > m_LambdaBToLambdaC
Gaudi::Property< float > m_LambdaBToLambdaC_LxyLb
std::unique_ptr< Trk::VxCascadeInfo > fitCascade(const EventContext &context, const std::vector< ElementLink< xAOD::TrackParticleContainer > > &trackParticleLinks, Decay decay) const
Perform a cascade vertex fit on selected tracks.
Gaudi::Property< double > m_deltaR
Gaudi::Property< float > m_BToD0_LxyBd
Gaudi::Property< bool > m_BToD0
StatusCode fillTriggerObjects(std::vector< xAOD::TrigBphys * > &triggerObjects, xAOD::TrigBphys::pType type, const Trk::VxCascadeInfo &vxCascadeInfo, const Amg::Vector3D &beamSpotPosition) const
Fill the trigger object that may be stored for debugging or matching for a cascade vertex.
Gaudi::Property< double > m_BToD0_minDstarPt
bool isIdenticalTracks(const xAOD::TrackParticle *lhs, const xAOD::TrackParticle *rhs) const
Returns false for the tracks with opposite charges.
Gaudi::Property< bool > m_makeCascadeFit
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Gaudi::Property< double > m_LambdaBToLambdaC_minKaonPt
StatusCode fillTriggerObject(xAOD::TrigBphys &triggerObject, xAOD::TrigBphys::pType type, const xAOD::Vertex &vertex, const std::vector< double > &trkMass) const
Fill the trigger object that may be stored for debugging or matching.
Gaudi::Property< float > m_LambdaBToLambdaC_chi2
virtual StatusCode execute(const EventContext &context) const override
virtual StatusCode initialize() override
TrigBmuxComboHypo()=delete
Gaudi::Property< std::pair< double, double > > m_BToD0_D0MassRange
Gaudi::Property< double > m_BToD0_maxDstarPionZ0
Gaudi::Property< std::pair< double, double > > m_BdToD_DMassRange
Gaudi::Property< float > m_cascadeChi2
ToolHandle< InDet::VertexPointEstimator > m_vertexPointEstimator
Gaudi::Property< std::pair< double, double > > m_BsToDs_massRange
Gaudi::Property< std::pair< double, double > > m_BToD0_massRange
State class for TrigBmuxComboHypo algorithm.
std::vector< Muon > muons
xAOD::TrigBphys * addTriggerObject(size_t muonIndex)
std::vector< size_t > trigBphysMuonIndices
std::vector< xAOD::TrigBphys * > addTriggerObjects(size_t n, size_t muonIndex)
const Amg::Vector3D & momentum() const
Access method for the momentum.
const std::vector< std::vector< TLorentzVector > > & getParticleMoms() const
const std::vector< xAOD::Vertex * > & vertices() const
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
float pt() const
accessor method: pt
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 lxy() const
accessor method: lxy
float fitx() const
accessor method: x position of vertex
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.
pType
enum for different particle types
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.
void setLowerChainLink(const ElementLink< xAOD::TrigBphysContainer_v1 > &link)
set method: link to lowerChain decay particle
bool addObjectCollectionLink(const std::string &collectionName, const ElementLink< CONTAINER > &link)
Add a link to a single object within a collection. Performs de-duplication.
bool setObjectLink(const std::string &name, const ElementLink< CONTAINER > &link)
Set the link to an object.
Eigen::Matrix< double, 3, 1 > Vector3D
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
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.
const std::string & viewString()
xAOD::TrigComposite Decision
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()
xAOD::TrigCompositeContainer DecisionContainer
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.
auto makeHandle(const SG::View *view, const KEY &key, const EventContext &ctx)
Create a view handle from a handle key.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
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
static constexpr CLID ID()
static constexpr double mD0
static constexpr double mProton
static constexpr double mPion
static constexpr double mMuon
static constexpr double mKaon