28#include "Math/GenVector/VectorUtil.h"
29#include "Math/Vector2D.h"
36using ROOT::Math::XYVector;
75 if (item.second.size() > 1) {
76 for (
size_t i = 0; i < item.second.size(); i++) {
93 ATH_MSG_DEBUG(
"No GenericMonitoringTool configured: no monitoring histograms will be available" );
96 return StatusCode::SUCCESS;
106 ATH_CHECK( previousDecisionsHandle.isValid() );
107 ATH_MSG_DEBUG(
"Running with " << previousDecisionsHandle->size() <<
" previous decisions" );
112 ATH_CHECK( trigBphysHandle.record(std::make_unique<xAOD::TrigBphysContainer>(),
113 std::make_unique<xAOD::TrigBphysAuxContainer>()) );
118 auto state = std::make_unique<TrigBmumuxState>(context, *previousDecisionsHandle, *outputDecisionsHandle, trigBphysHandle.
ptr(), *beamSpotHandle);
123 if (!state->dimuons.empty()) {
129 ATH_MSG_DEBUG(
"TrigBmumuxComboHypo::execute() terminates with StatusCode::SUCCESS" );
130 return StatusCode::SUCCESS;
136 auto& muons = state.
muons;
144 if (!muon->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle))
continue;
147 auto itr = std::find_if(muons.begin(), muons.end(), [
this, muon](
const auto&
x){ return isIdenticalTracks(muon, *x.link); });
148 if (itr == muons.end()) {
149 muons.push_back({muonEL, std::vector<ElementLink<DecisionContainer>>(1, decisionEL),
DecisionIDContainer()});
152 (*itr).decisionLinks.push_back(decisionEL);
158 std::sort(muons.begin(), muons.end(), [](
const auto& lhs,
const auto& rhs){ return ((*lhs.link)->pt() > (*rhs.link)->pt()); });
161 for (
auto& item : muons) {
168 ATH_MSG_DEBUG(
"Dump found muons before vertex fit: " << muons.size() <<
" candidates" );
169 for (
const auto& item : muons) {
172 ATH_MSG_DEBUG(
" -- muon InDetTrackParticle pt/eta/phi/q: " << track->pt() <<
" / " << track->eta() <<
" / " << track->phi() <<
" / " << track->charge() );
173 ATH_MSG_DEBUG(
" muon CombinedTrackParticle pt: " << muon->pt() );
175 for (
const DecisionID&
id : item.decisionIDs) {
181 return StatusCode::SUCCESS;
187 auto& tracks = state.
tracks;
190 size_t viewCounter = 0;
194 auto view = *viewLinkInfo.link;
198 const auto roi = *roiLinkInfo.link;
204 std::vector<ElementLink<xAOD::TrackParticleContainer>> tracksFromView;
205 tracksFromView.reserve(tracksHandle->size());
206 for (
size_t idx = 0; idx < tracksHandle->size(); ++idx) {
210 for (
const auto& trackEL : tracksFromView) {
212 if (track->definingParametersCovMatrixVec().empty())
continue;
214 if (viewCounter == 0 ||
215 std::find_if(tracks.begin(), tracks.end(),
216 [
this, track](
const auto&
x){ return isIdenticalTracks(track, *x); }) == tracks.end()) {
217 tracks.emplace_back(trackEL);
221 if (roi->composite()) {
226 std::sort(tracks.begin(), tracks.end(), [](
const auto& lhs,
const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
229 ATH_MSG_DEBUG(
"Dump found tracks before vertex fit: " << tracks.size() <<
" candidates" );
230 for (
const auto& trackEL : tracks) {
232 ATH_MSG_DEBUG(
" -- track pt/eta/phi/q: " << track->pt() <<
" / " << track->eta() <<
" / " << track->phi() <<
" / " << track->charge() );
235 return StatusCode::SUCCESS;
244 const auto& muons = state.
muons;
245 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks(2);
246 std::vector<const DecisionIDContainer*> previousDecisionIDs(2,
nullptr);
248 for (
size_t itrk1 = 0; itrk1 < muons.size(); ++itrk1) {
251 previousDecisionIDs[0] = &muons[itrk1].decisionIDs;
255 auto charge1 = trk1->
charge();
257 for (
size_t itrk2 = itrk1 + 1; itrk2 < muons.size(); ++itrk2) {
260 previousDecisionIDs[1] = &muons[itrk2].decisionIDs;
264 auto charge2 = trk2->
charge();
266 double mass = (p1 + p2).M();
268 ATH_MSG_DEBUG(
"muon 1: " << p1.Pt()<<
" / " << p1.Eta() <<
" / " << p1.Phi() <<
" / " << trk1->
charge() );
269 ATH_MSG_DEBUG(
"muon 2: " << p2.Pt()<<
" / " << p2.Eta() <<
" / " << p2.Phi() <<
" / " << trk2->
charge() );
273 ATH_MSG_DEBUG(
"muon pair is rejected by opposite charge check" );
278 ATH_MSG_DEBUG(
"muon pair did not pass passDimuonTrigger() check" );
283 ATH_MSG_DEBUG(
"muon pair is out of the requested mass range" );
288 auto vertex =
fit(state.
context(), trackParticleLinks);
289 if (!vertex)
continue;
294 ATH_MSG_ERROR(
"xAOD::Vertex could not be converted to xAOD::TrigBphys object: please enable MakeExtendedVertex option in vertex fitter " <<
m_vertexFitter->name() );
295 return StatusCode::FAILURE;
307 return StatusCode::SUCCESS;
313 std::vector<int> nSelectedTrk;
319 for (
size_t dimuonIndex = 0; dimuonIndex < state.
dimuons.
size(); ++dimuonIndex) {
330 mon_nTrk = state.
tracks.size();
333 return StatusCode::SUCCESS;
342 selectedTracks.clear();
343 selectedTrackZ0.clear();
347 std::vector<const xAOD::Muon*> muons(2,
nullptr);
349 for (
size_t i = 0; i < 2; ++i) {
350 const auto& muon = state.
muons.at(muonIndices[i]);
351 muons[i] = *muon.link;
360 for (
const auto& trackEL : state.
tracks) {
364 if (perigee && std::abs(perigee->parameters()[
Trk::z0]) <
m_trkZ0) {
365 selectedTracks.push_back(trackEL);
366 selectedTrackZ0[*trackEL] = perigee->parameters()[
Trk::z0];
370 selectedTracks.push_back(trackEL);
371 selectedTrackZ0[*trackEL] = -1000.;
376 if (selectedTracks.size() < 2) {
377 ATH_MSG_DEBUG(
"Found no tracks consistent with dimuon vertex " << dimuonIndex );
378 selectedTracks.clear();
379 selectedTrackZ0.clear();
380 return StatusCode::SUCCESS;
382 std::sort(selectedTracks.begin(), selectedTracks.end(), [p_mu=mu1->
genvecP4()](
const auto& lhs,
const auto& rhs){ return ROOT::Math::VectorUtil::DeltaR(p_mu, (*lhs)->genvecP4()) > ROOT::Math::VectorUtil::DeltaR(p_mu, (*rhs)->genvecP4()); });
384 std::sort(selectedTracks.begin(), selectedTracks.end(), [p_mu=mu2->
genvecP4()](
const auto& lhs,
const auto& rhs){ return ROOT::Math::VectorUtil::DeltaR(p_mu, (*lhs)->genvecP4()) > ROOT::Math::VectorUtil::DeltaR(p_mu, (*rhs)->genvecP4()); });
386 std::sort(selectedTracks.begin(), selectedTracks.end(), [](
const auto& lhs,
const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
388 ATH_MSG_DEBUG(
"Found " << selectedTracks.size() <<
" tracks consistent with dimuon vertex " << dimuonIndex );
390 return StatusCode::SUCCESS;
401 ATH_CHECK( dimuonTriggerObjectEL.isValid() );
404 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_vtx1(dimuon->
trackParticleLinks());
405 trackParticleLinks_vtx1.emplace_back();
408 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_vtx2(trackParticleLinks_vtx1);
409 trackParticleLinks_vtx2.emplace_back();
412 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_vtx3(3);
418 size_t iterations = 0;
420 bool isOverWarningThreshold =
false;
422 for (
size_t itrk1 = 0; itrk1 < selectedTracks.size(); ++itrk1) {
425 trackParticleLinks_vtx1[2] = selectedTracks[itrk1];
427 auto charge1 = trk1->
charge();
429 std::unique_ptr<xAOD::Vertex> vtx1;
430 bool makeFit_vtx1 = !makeCombinations;
431 bool passFastFit_vtx1 = (!makeCombinations && !state.
isBadCombination(itrk1));
441 makeFit_vtx1 =
false;
459 makeFit_vtx1 =
false;
470 for (
size_t itrk2 = itrk1 + 1; itrk2 < selectedTracks.size(); ++itrk2) {
473 trackParticleLinks_vtx2[2] = selectedTracks[itrk1];
474 trackParticleLinks_vtx2[3] = selectedTracks[itrk2];
476 auto charge2 = trk2->
charge();
478 std::unique_ptr<xAOD::Vertex> vtx2;
479 bool makeFit_vtx2 = !makeCombinations;
496 makeFit_vtx2 =
false;
519 makeFit_vtx2 =
false;
541 makeFit_vtx2 =
false;
565 makeFit_vtx2 =
false;
588 makeFit_vtx2 =
false;
598 for (
size_t itrk3 = 0; itrk3 < selectedTracks.size(); ++itrk3) {
600 if (itrk3 == itrk1 || itrk3 == itrk2)
continue;
602 trackParticleLinks_vtx3[0] = selectedTracks[itrk1];
603 trackParticleLinks_vtx3[1] = selectedTracks[itrk2];
604 trackParticleLinks_vtx3[2] = selectedTracks[itrk3];
608 std::unique_ptr<xAOD::Vertex> vtx3;
609 bool makeFit_vtx3 = !makeCombinations;
610 bool passFastFit_vtx3 = (!makeCombinations && !state.
isBadCombination(itrk1, itrk2, itrk3));
617 charge1 * charge2 < 0. &&
628 vtx3 =
fit(state.
context(), trackParticleLinks_vtx3,
kDs, dimuon);
629 makeFit_vtx3 =
false;
643 charge1 * charge2 > 0. && charge1 *
charge3 < 0. &&
654 makeFit_vtx3 =
false;
669 isOverWarningThreshold =
true;
672 ATH_MSG_WARNING(
"Dimuon + tracks: the number of fit attempts has exceeded the limit; breaking the loop at this point" );
680 isOverWarningThreshold =
false;
683 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_D0(2);
685 for (
size_t itrk1 = 0; itrk1 < selectedTracks.size(); ++itrk1) {
688 trackParticleLinks_D0[0] = selectedTracks[itrk1];
691 auto charge1 = trk1->
charge();
693 for (
size_t itrk2 = 0; itrk2 < selectedTracks.size(); ++itrk2) {
694 if (itrk2 == itrk1)
continue;
697 trackParticleLinks_D0[1] = selectedTracks[itrk2];
700 auto charge2 = trk2->
charge();
702 std::unique_ptr<xAOD::Vertex> D0;
703 if (charge1 * charge2 < 0. &&
708 D0 =
fit(state.
context(), trackParticleLinks_D0,
kD0, dimuon);
711 bool isValidD0 =
false;
714 ATH_MSG_DEBUG(
"Partially reconstructed B_c+(-> mu+ mu- D0 X) candidate has been created" );
722 for (
size_t itrk3 = 0; itrk3 < selectedTracks.size(); ++itrk3) {
724 if (itrk3 == itrk1 || itrk3 == itrk2)
continue;
727 trackParticleLinks_vtx1[2] = selectedTracks[itrk3];
738 ATH_MSG_DEBUG(
"Decay vertex(mu+ mu- D*+.pi+) for B_c+ candidate has been created" );
742 ATH_CHECK( triggerObjectEL_vtx1.isValid() );
745 auto Bc_vtx2 =
fit(state.
context(), trackParticleLinks_D0,
kD0, Bc_vtx1.get());
748 ATH_MSG_DEBUG(
"Fully reconstructed B_c+(-> mu+ mu- D*+) candidate has been created" );
761 isOverWarningThreshold =
true;
764 ATH_MSG_WARNING(
"B_c+ -> mu+ mu- D*+: the number of fit attempts has exceeded the limit; breaking the loop at this point" );
772 return StatusCode::SUCCESS;
783 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_2mu1trk(dimuon->
trackParticleLinks());
784 trackParticleLinks_2mu1trk.emplace_back();
787 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_2trk(2);
790 size_t iterations = 0;
792 if (item.second < 5)
continue;
794 size_t key = item.first;
812 return StatusCode::SUCCESS;
822 ATH_MSG_DEBUG(
"Found xAOD::TrigBphys object: mass = " << triggerObject->mass() );
829 if (!dimuonTriggerObject) {
830 ATH_MSG_ERROR(
"Failed to found a valid link for preceding dimuon trigger object" );
831 return StatusCode::FAILURE;
837 auto dimuonIndex = dimuonTriggerObject->
index();
840 ATH_MSG_ERROR(
"Failed to find original muons the dimuon vertex had been built from" );
841 return StatusCode::FAILURE;
847 std::vector<const DecisionIDContainer*> previousDecisionIDs;
849 const auto& muon = state.
muons.at(i);
853 previousDecisionIDs.push_back(&muon.decisionIDs);
861 ATH_CHECK( tool->decideOnSingleObject(decision, previousDecisionIDs) );
865 return StatusCode::SUCCESS;
870 const EventContext& context,
877 if (trackParticleLinks.size() < 2) {
878 ATH_MSG_WARNING(
"At least two tracks should be given to the vertex fitter" );
882 std::vector<const xAOD::TrackParticle*> tracklist(trackParticleLinks.size(),
nullptr);
883 std::transform(trackParticleLinks.begin(), trackParticleLinks.end(), tracklist.begin(),
892 ATH_MSG_WARNING(
"Already fitted dimuon vertex should be provided for B -> mu1 mu2 trk1 .. trkN decay as a starting point for fitter" );
896 const Trk::Perigee& perigee1 = tracklist[0]->perigeeParameters();
897 const Trk::Perigee& perigee2 = tracklist[1]->perigeeParameters();
898 startingPoint =
m_vertexPointEstimator->getCirclesIntersectionPoint(&perigee1, &perigee2, flag, errorcode);
899 if (errorcode != 0) startingPoint = Amg::Vector3D::Zero(3);
901 ATH_MSG_VERBOSE(
"Starting point: (" << startingPoint(0) <<
", " << startingPoint(1) <<
", " << startingPoint(2) <<
")" );
912 std::unique_ptr<xAOD::Vertex> vertex(
m_vertexFitter->fit(tracklist, startingPoint, *fitterState));
918 ATH_MSG_VERBOSE(
"Fit is successful, but vertex chi2 is too high, we are not going to save it (chi2 = " << vertex->chiSquared() <<
")" );
925 vertex->clearTracks();
926 vertex->setTrackParticleLinks(trackParticleLinks);
936 const std::vector<double>& trkMass,
944 std::vector<xAOD::TrackParticle::GenVecFourMom_t> momenta;
945 if (!vertex.vxTrackAtVertexAvailable())
return nullptr;
946 for (
size_t i = 0; i < vertex.vxTrackAtVertex().size(); ++i) {
948 if (!perigee)
return nullptr;
950 momenta.emplace_back(p.x(), p.y(), p.z(), trkMass[i]);
953 if (isCascadeDecay) {
954 momentum += ROOT::Math::PtEtaPhiMVector(dimuon->
pt(), dimuon->
eta(), dimuon->
phi(), dimuon->
mass());
958 result->makePrivateStore();
962 mass +=
PDG::mD0 - (momenta[0] + momenta[1]).M();
965 mass +=
PDG::mJpsi - (isCascadeDecay ? dimuon->
mass() : (momenta[0] + momenta[1]).M());
971 result->setFitx(vertex.x());
972 result->setFity(vertex.y());
973 result->setFitz(vertex.z());
974 result->setFitchi2(vertex.chiSquared());
975 result->setFitndof(vertex.numberDoF());
978 result->setLxy(
Lxy(productionVertex, vertex));
981 result->setTrackParticleLinks(vertex.trackParticleLinks());
985 result->setLowerChainLink(dimuonLink);
989 "TrigBphys object:\n\t " <<
990 "roiId: " <<
result->roiId() <<
"\n\t " <<
991 "particleType: " <<
result->particleType() <<
"\n\t " <<
992 "level: " <<
result->level() <<
"\n\t " <<
993 "eta: " <<
result->eta() <<
"\n\t " <<
994 "phi: " <<
result->phi() <<
"\n\t " <<
995 "mass: " <<
result->mass() <<
"\n\t " <<
996 "fitmass: " <<
result->fitmass() <<
"\n\t " <<
997 "chi2/NDF: " <<
result->fitchi2() <<
" / " <<
result->fitndof() <<
"\n\t " <<
998 "vertex: (" <<
result->fitx() <<
", " <<
result->fity() <<
", " <<
result->fitz() <<
")" <<
"\n\t " <<
999 "Lxy: " <<
result->lxy() );
1020 auto p_mu = muon->genvecP4();
1021 auto p_trk = track->genvecP4();
1022 return (ROOT::Math::VectorUtil::DeltaPhi(p_mu, p_trk) <
m_roiPhiWidth && std::abs(p_mu.eta() - p_trk.eta()) <
m_roiEtaWidth);
1028 XYVector R(decayVertex.
x() - productionVertex.x(), decayVertex.
y() - productionVertex.y());
1033 for (
const auto& track : tracks) {
1035 if (!perigee)
return -100.;
1039 return R.Dot(pT.unit());
1046 for (
size_t i = 0; i < vertex.vxTrackAtVertex().size(); ++i) {
1057 if (previousDecisionIDs.size() != 2) {
1058 ATH_MSG_WARNING(
"TrigBmumuxComboHypo::passDimuonTrigger() expects exactly two containers with previous decision IDs" );
1063 const std::vector<HLT::Identifier>& legDecisionIDs = tool->legDecisionIds();
1064 if (legDecisionIDs.size() == 1 && tool->legMultiplicity().at(0) >= 2) {
1066 const DecisionID id = legDecisionIDs[0].numeric();
1069 else if (legDecisionIDs.size() == 2) {
1072 bool inverse =
true;
1073 for (
size_t i = 0; i < 2; ++i) {
1077 if (direct || inverse)
return true;
1080 ATH_MSG_WARNING(
"TrigBmumuxComboHypo can not check decisions for " << tool->name() );
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Base class for elements of a container that can have aux data.
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
const T * get(size_type n) const
Access an element, 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.
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.
size_t index() const
Return the index of this element within its container.
pointer_type ptr()
Dereference the pointer.
Gaudi::Property< bool > m_dimuon_rejectSameChargeTracks
Gaudi::Property< bool > m_BcToDplusMuMu_useFastFit
StatusCode findBmumuxCandidates_fit(TrigBmumuxState &, size_t dimuonIndex, bool makeCombinations=false) const
Perform fit of B decays for the topologies described above if makeCombinations = false.
Gaudi::Property< std::pair< double, double > > m_BcToMuMuPion_massRange
Gaudi::Property< float > m_BdToMuMuKstar0_chi2
ToolHandle< Trk::TrkVKalVrtFitter > m_vertexFitter
Gaudi::Property< bool > m_BdToMuMuKstar0_rejectSameChargeTracks
Gaudi::Property< bool > m_BdToMuMuKstar0_useFastFit
Gaudi::Property< double > m_BdToMuMuKstar0_minPionPt
Gaudi::Property< std::pair< double, double > > m_BcToDplusMuMu_massRange
std::unique_ptr< xAOD::Vertex > fit(const EventContext &context, const std::vector< ElementLink< xAOD::TrackParticleContainer > > &trackParticleLinks, Decay decay=kPsi_2mu, const xAOD::Vertex *dimuon=nullptr) const
Perform a vertex fit on selected tracks.
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_phiMassRange
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_D0MassRange
Gaudi::Property< std::pair< double, double > > m_BcToDplusMuMu_DplusMassRange
Gaudi::Property< bool > m_BcToDsMuMu
Gaudi::Property< double > m_fastFit_2mu1trk_chi2
Gaudi::Property< bool > m_BcToMuMuPion
Gaudi::Property< double > m_BplusToMuMuKaon_minKaonPt
Gaudi::Property< std::pair< double, double > > m_BsToMuMuPhi1020_massRange
Gaudi::Property< double > m_BcToDsMuMu_minPionPt
Gaudi::Property< std::pair< double, double > > m_BdToMuMuKstar0_massRange
TrigCompositeUtils::DecisionIDContainer m_allowedIDs
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Gaudi::Property< bool > m_LambdaBToMuMuProtonKaon
Gaudi::Property< double > m_roiPhiWidth
Gaudi::Property< double > m_BcToMuMuPion_minPionPt
SG::WriteHandleKey< xAOD::TrigBphysContainer > m_trigBphysContainerKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
Gaudi::Property< double > m_dimuon_chi2
Gaudi::Property< float > m_BsToMuMuPhi1020_chi2
Gaudi::Property< bool > m_BcToDsMuMu_useFastFit
Gaudi::Property< double > m_BsToMuMuPhi1020_minKaonPt
ToolHandle< InDet::VertexPointEstimator > m_vertexPointEstimator
bool passDimuonTrigger(const std::vector< const TrigCompositeUtils::DecisionIDContainer * > &previousDecisionIDs) const
Gaudi::Property< std::pair< double, double > > m_BsToMuMuPhi1020_phiMassRange
Gaudi::Property< float > m_BcToDsMuMu_chi2
Gaudi::Property< std::pair< double, double > > m_BplusToMuMuKaon_massRange
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_DsMassRange
Gaudi::Property< float > m_BcToMuMuPion_chi2
Gaudi::Property< double > m_BcToDstarMuMu_minD0KaonPt
Gaudi::Property< double > m_BdToMuMuKstar0_minKaonPt
double Lxy(const Amg::Vector3D &productionVertex, const xAOD::Vertex &decayVertex) const
Calculate the Lxy (~distance between vertices) It is defined as the transverse distance between the p...
Gaudi::Property< bool > m_LambdaBToMuMuProtonKaon_useFastFit
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
Gaudi::Property< std::pair< double, double > > m_LambdaBToMuMuProtonKaon_massRange
StatusCode findBmumuxCandidates(TrigBmumuxState &) const
Find B decays by appling next three subprocedures to each found dimuon candidate.
Gaudi::Property< std::pair< double, double > > m_dimuon_massRange
StatusCode mergeMuonsFromDecisions(TrigBmumuxState &) const
Go through state.previousDecisions(), fetch xAOD::Muons objects attached to decisions and save links ...
Gaudi::Property< float > m_BplusToMuMuKaon_chi2
Gaudi::Property< bool > m_BsToMuMuPhi1020
Gaudi::Property< double > m_LambdaBToMuMuProtonKaon_minKaonPt
Gaudi::Property< bool > m_BplusToMuMuKaon
Gaudi::Property< bool > m_BdToMuMuKstar0
Gaudi::Property< double > m_BcToDstarMuMu_minD0PionPt
StatusCode findBmumuxCandidates_selectTracks(TrigBmumuxState &, size_t dimuonIndex) const
Select tracks in vicinity of given dimuon vertex.
StatusCode findBmumuxCandidates_fastFit(TrigBmumuxState &, size_t dimuonIndex) const
Go through (dimuon+track) and (track+track) combinations found by findBmumuxCandidates_fit(makeCombin...
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_DstarMassRange
xAOD::TrigBphys * makeTriggerObject(TrigBmumuxState &state, const xAOD::Vertex &vertex, xAOD::TrigBphys::pType type=xAOD::TrigBphys::MULTIMU, const std::vector< double > &trkMass={PDG::mMuon, PDG::mMuon}, const ElementLink< xAOD::TrigBphysContainer > &dimuonLink=ElementLink< xAOD::TrigBphysContainer >()) const
Construct the trigger object that may be stored for debugging or matching.
Gaudi::Property< double > m_BcToDstarMuMu_minDstarPionPt
Gaudi::Property< std::pair< double, double > > m_LambdaBToMuMuProtonKaon_dimuonMassRange
Gaudi::Property< bool > m_BplusToMuMuKaon_useFastFit
Gaudi::Property< bool > m_BsToMuMuPhi1020_useFastFit
bool isInSameRoI(const xAOD::Muon *, const xAOD::TrackParticle *) const
Attempts to identify if the track is in the same RoI as the muon by comparing the angle with the RoI ...
Gaudi::Property< std::pair< double, double > > m_BcToDplusMuMu_dimuonMassRange
TrigBmumuxComboHypo()=delete
virtual StatusCode initialize() override
Gaudi::Property< double > m_roiEtaWidth
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_massRange
Gaudi::Property< double > m_BcToDplusMuMu_minPionPt
Gaudi::Property< bool > m_BcToDstarMuMu
Gaudi::Property< std::pair< double, double > > m_BdToMuMuKstar0_KstarMassRange
static const std::vector< std::vector< double > > s_trkMass
Gaudi::Property< bool > m_BcToDstarMuMu_makeDstar
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_massRange
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainerKey
ToolHandle< GenericMonitoringTool > m_monTool
Gaudi::Property< double > m_BcToDstarMuMu_maxDstarPionZ0
Gaudi::Property< bool > m_BcToDplusMuMu
Gaudi::Property< double > m_LambdaBToMuMuProtonKaon_minProtonPt
Gaudi::Property< bool > m_BcToMuMuPion_useFastFit
Gaudi::Property< size_t > m_fitAttemptsBreakThreshold
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_dimuonMassRange
Gaudi::Property< float > m_BcToDstarMuMu_chi2
Gaudi::Property< double > m_deltaR
Gaudi::Property< size_t > m_fitAttemptsWarningThreshold
Gaudi::Property< float > m_LambdaBToMuMuProtonKaon_chi2
Gaudi::Property< std::pair< double, double > > m_BcToMuMuPion_dimuonMassRange
Gaudi::Property< double > m_fastFit_2trk_chi2
StatusCode mergeTracksFromViews(TrigBmumuxState &) const
Go through state.previousDecisions() and fetch xAOD::TrackParticle objects associated with the neares...
virtual StatusCode execute(const EventContext &context) const override
Gaudi::Property< bool > m_BsToMuMuPhi1020_rejectSameChargeTracks
StatusCode createDecisionObjects(TrigBmumuxState &) const
Create a decision for each xAOD::TrigBphys object from state.trigBphysCollection() and save it to sta...
Gaudi::Property< float > m_BcToDplusMuMu_chi2
StatusCode findDimuonCandidates(TrigBmumuxState &) const
Make all possible dimuon combinations from state.muons(), fit muon InDet tracks to the common vertex,...
bool isInMassRange(double mass, const std::pair< double, double > &range) const
Checks that the given mass value falls into the specified range.
bool isIdenticalTracks(const xAOD::TrackParticle *lhs, const xAOD::TrackParticle *rhs) const
Attempts to identify identical tracks by selection on DeltaR.
Gaudi::Property< double > m_trkZ0
Gaudi::Property< double > m_BcToDplusMuMu_minKaonPt
Gaudi::Property< double > m_LambdaBToMuMuProtonKaon_minKstarMass
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_dimuonMassRange
Gaudi::Property< double > m_BcToDsMuMu_minKaonPt
xAOD::TrackParticle::GenVecFourMom_t momentum(const xAOD::Vertex &vertex, const std::vector< double > &trkMass) const
Calculate 4-momentum of the fitted vertex particle assuming the given masses.
State class for TrigBmumuxComboHypo algorithm.
std::vector< Muon > muons
std::map< const xAOD::TrackParticle *, double > selectedTrackZ0
void addTrackCombination(size_t i1)
bool isBadCombination(size_t i1) const
std::vector< ElementLink< xAOD::TrackParticleContainer > > selectedTracks
std::map< size_t, size_t > trackCombinations
StatusCode addTriggerObject(xAOD::TrigBphys *triggerObject)
std::vector< size_t > badTrackCombinations
xAOD::VertexContainer dimuons
std::vector< ElementLink< xAOD::TrackParticleContainer > > tracks
std::vector< std::array< size_t, 2 > > trigBphysMuonIndices
const Amg::Vector3D & momentum() const
Access method for the momentum.
const ElementLink< TrackParticleContainer > & inDetTrackParticleLink() const
Returns an ElementLink to the InnerDetector TrackParticle used in identification of this muon.
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.
float pt() const
accessor method: pt
float eta() const
accessor method: eta
float phi() const
accessor method: phi
const TrigBphys_v1 * lowerChain() const
accessor method: lowerChain decay particle
float fitx() const
accessor method: x position of vertex
float fitz() const
accessor method: z position of vertex
float mass() const
accessor method: mass
pType
enum for different particle types
float fity() const
accessor method: y position of vertex
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.
float z() const
Returns the z position.
const TrackParticleLinks_t & trackParticleLinks() const
Get all the particles associated with the vertex.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
float y() const
Returns the y position.
bool vxTrackAtVertexAvailable() const
Check if VxTrackAtVertices are attached to the object.
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
const Amg::Vector3D & position() const
Returns the 3-pos.
float x() const
Returns the x position.
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()
bool passed(DecisionID id, const DecisionIDContainer &idSet)
checks if required decision ID is in the set of IDs in the container
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.
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 double mD0
static constexpr double mProton
static constexpr double mPion
static constexpr double mMuon
static constexpr double mJpsi
static constexpr double mKaon