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

EF hypothesis algorithm for B -> mu+ mu- X decays: B+ -> mu+ mu- K+ B_c+ -> J/psi(-> mu+ mu-) pi+ B_s0 -> mu+ mu- phi1020(-> K+, K-) B0 -> mu+ mu- K*0(-> K+ pi-) Lambda_b0 -> J/psi(-> mu+ mu-) p K- B_c+ -> J/psi(-> mu+ mu-) D_s+(->phi(-> K+ K-) pi+) B_c+ -> J/psi(-> mu+ mu-) D+(-> K- pi+ pi+) B_c+ -> J/psi(-> mu+ mu-) D*+(-> D0(-> K- pi+) pi+) partial (lost pion from D*+) and full reconstruction. More...

#include <TrigBmumuxComboHypo.h>

Inheritance diagram for TrigBmumuxComboHypo:
Collaboration diagram for TrigBmumuxComboHypo:

Public Types

enum  Decay : size_t {
  kPsi_2mu , kB_2mu1trk , kB_2mu2trk , kDs ,
  kDplus , kD0 , kB_PsiPi , kFastFit_2trk ,
  kFastFit_2mu1trk
}

Public Member Functions

 TrigBmumuxComboHypo (const std::string &name, ISvcLocator *pSvcLocator)
 TrigBmumuxComboHypo ()=delete
virtual StatusCode initialize () override
virtual StatusCode execute (const EventContext &context) const override
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
 Get filter decision:
virtual void setFilterPassed (bool state, const EventContext &ctx) const
 Set filter decision:
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsInput () const
const SG::WriteHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsOutput () const
const Combo::MultiplicityReqMap & triggerMultiplicityMap () const
const Combo::LegMap & legToInputCollectionMap () const
ToolHandleArray< ComboHypoToolBase > & hypoTools ()
const ToolHandleArray< ComboHypoToolBase > & hypoTools () const
void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
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)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvc > StoreGateSvc_t

Private Member Functions

StatusCode mergeMuonsFromDecisions (TrigBmumuxState &) const
 Go through state.previousDecisions(), fetch xAOD::Muons objects attached to decisions and save links to them in state.muons().
StatusCode mergeTracksFromViews (TrigBmumuxState &) const
 Go through state.previousDecisions() and fetch xAOD::TrackParticle objects associated with the nearest SG::View.
StatusCode findDimuonCandidates (TrigBmumuxState &) const
 Make all possible dimuon combinations from state.muons(), fit muon InDet tracks to the common vertex, dimuon vertices are stored in state.dimuons() and in state.trigBphysCollection() (as xAOD::TrigBphys objects).
StatusCode findBmumuxCandidates (TrigBmumuxState &) const
 Find B decays by appling next three subprocedures to each found dimuon candidate.
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(makeCombinations = true) Perform fast fit if combination occurred more than five times.
StatusCode findBmumuxCandidates_fit (TrigBmumuxState &, size_t dimuonIndex, bool makeCombinations=false) const
 Perform fit of B decays for the topologies described above if makeCombinations = false.
StatusCode createDecisionObjects (TrigBmumuxState &) const
 Create a decision for each xAOD::TrigBphys object from state.trigBphysCollection() and save it to state.decisions(); use hypoTools() to assign correct decisionIDs according to xAOD::TrigBphys::particleType().
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.
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.
bool isIdenticalTracks (const xAOD::TrackParticle *lhs, const xAOD::TrackParticle *rhs) const
 Attempts to identify identical tracks by selection on DeltaR.
bool isIdenticalTracks (const xAOD::Muon *lhs, const xAOD::Muon *rhs) const
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 limits.
bool passDimuonTrigger (const std::vector< const TrigCompositeUtils::DecisionIDContainer * > &previousDecisionIDs) const
bool isInMassRange (double mass, const std::pair< double, double > &range) const
 Checks that the given mass value falls into the specified range.
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 production and decay vertices projected along the transverse momentum of the particle.
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.
StatusCode copyDecisions (const Combo::LegDecisionsMap &passingLegs, const EventContext &context) const
 iterates over the inputs and for every object (no filtering) crates output object linked to input moving the decisions that are mentioned in the passing set
StatusCode extractFeatureAndRoI (const HLT::Identifier &chainLegId, const ElementLink< TrigCompositeUtils::DecisionContainer > &EL, SG::sgkey_t &featureKey, TrigCompositeUtils::Decision::index_type &featureIndex, SG::sgkey_t &roiKey, TrigCompositeUtils::Decision::index_type &roiIndex, bool &roiFullscan, bool &objectRequestsNoMultiplicityCheck, SG::SGKeyMap< std::set< uint32_t > > &priorFeaturesMap) const
 For a given Decision node from a HypoAlg, extracts type-less identification data on the node's Feature and seeding ROI.
StatusCode fillDecisionsMap (Combo::LegDecisionsMap &dmap, const EventContext &context) const
 iterates over all inputs, associating inputs to legs
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainerKey
SG::WriteHandleKey< xAOD::TrigBphysContainer > m_trigBphysContainerKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"}
Gaudi::Property< double > m_deltaR
Gaudi::Property< double > m_trkZ0
Gaudi::Property< double > m_roiEtaWidth
Gaudi::Property< double > m_roiPhiWidth
Gaudi::Property< size_t > m_fitAttemptsWarningThreshold
Gaudi::Property< size_t > m_fitAttemptsBreakThreshold
Gaudi::Property< double > m_fastFit_2trk_chi2
Gaudi::Property< double > m_fastFit_2mu1trk_chi2
Gaudi::Property< bool > m_dimuon_rejectSameChargeTracks
Gaudi::Property< std::pair< double, double > > m_dimuon_massRange
Gaudi::Property< double > m_dimuon_chi2
Gaudi::Property< bool > m_BplusToMuMuKaon
Gaudi::Property< double > m_BplusToMuMuKaon_minKaonPt
Gaudi::Property< std::pair< double, double > > m_BplusToMuMuKaon_massRange
Gaudi::Property< float > m_BplusToMuMuKaon_chi2
Gaudi::Property< bool > m_BplusToMuMuKaon_useFastFit
Gaudi::Property< bool > m_BcToMuMuPion
Gaudi::Property< double > m_BcToMuMuPion_minPionPt
Gaudi::Property< std::pair< double, double > > m_BcToMuMuPion_dimuonMassRange
Gaudi::Property< std::pair< double, double > > m_BcToMuMuPion_massRange
Gaudi::Property< float > m_BcToMuMuPion_chi2
Gaudi::Property< bool > m_BcToMuMuPion_useFastFit
Gaudi::Property< bool > m_BsToMuMuPhi1020
Gaudi::Property< bool > m_BsToMuMuPhi1020_rejectSameChargeTracks
Gaudi::Property< double > m_BsToMuMuPhi1020_minKaonPt
Gaudi::Property< std::pair< double, double > > m_BsToMuMuPhi1020_massRange
Gaudi::Property< std::pair< double, double > > m_BsToMuMuPhi1020_phiMassRange
Gaudi::Property< float > m_BsToMuMuPhi1020_chi2
Gaudi::Property< bool > m_BsToMuMuPhi1020_useFastFit
Gaudi::Property< bool > m_BdToMuMuKstar0
Gaudi::Property< bool > m_BdToMuMuKstar0_rejectSameChargeTracks
Gaudi::Property< double > m_BdToMuMuKstar0_minKaonPt
Gaudi::Property< double > m_BdToMuMuKstar0_minPionPt
Gaudi::Property< std::pair< double, double > > m_BdToMuMuKstar0_massRange
Gaudi::Property< std::pair< double, double > > m_BdToMuMuKstar0_KstarMassRange
Gaudi::Property< float > m_BdToMuMuKstar0_chi2
Gaudi::Property< bool > m_BdToMuMuKstar0_useFastFit
Gaudi::Property< bool > m_LambdaBToMuMuProtonKaon
Gaudi::Property< bool > m_LambdaBToMuMuProtonKaon_rejectSameChargeTracks
Gaudi::Property< double > m_LambdaBToMuMuProtonKaon_minProtonPt
Gaudi::Property< double > m_LambdaBToMuMuProtonKaon_minKaonPt
Gaudi::Property< double > m_LambdaBToMuMuProtonKaon_minKstarMass
Gaudi::Property< std::pair< double, double > > m_LambdaBToMuMuProtonKaon_dimuonMassRange
Gaudi::Property< std::pair< double, double > > m_LambdaBToMuMuProtonKaon_massRange
Gaudi::Property< float > m_LambdaBToMuMuProtonKaon_chi2
Gaudi::Property< bool > m_LambdaBToMuMuProtonKaon_useFastFit
Gaudi::Property< bool > m_BcToDsMuMu
Gaudi::Property< double > m_BcToDsMuMu_minKaonPt
Gaudi::Property< double > m_BcToDsMuMu_minPionPt
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_massRange
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_dimuonMassRange
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_phiMassRange
Gaudi::Property< std::pair< double, double > > m_BcToDsMuMu_DsMassRange
Gaudi::Property< float > m_BcToDsMuMu_chi2
Gaudi::Property< bool > m_BcToDsMuMu_useFastFit
Gaudi::Property< bool > m_BcToDplusMuMu
Gaudi::Property< double > m_BcToDplusMuMu_minKaonPt
Gaudi::Property< double > m_BcToDplusMuMu_minPionPt
Gaudi::Property< std::pair< double, double > > m_BcToDplusMuMu_massRange
Gaudi::Property< std::pair< double, double > > m_BcToDplusMuMu_dimuonMassRange
Gaudi::Property< std::pair< double, double > > m_BcToDplusMuMu_DplusMassRange
Gaudi::Property< float > m_BcToDplusMuMu_chi2
Gaudi::Property< bool > m_BcToDplusMuMu_useFastFit
Gaudi::Property< bool > m_BcToDstarMuMu
Gaudi::Property< bool > m_BcToDstarMuMu_makeDstar
Gaudi::Property< double > m_BcToDstarMuMu_minD0KaonPt
Gaudi::Property< double > m_BcToDstarMuMu_minD0PionPt
Gaudi::Property< double > m_BcToDstarMuMu_minDstarPionPt
Gaudi::Property< double > m_BcToDstarMuMu_maxDstarPionZ0
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_massRange
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_dimuonMassRange
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_D0MassRange
Gaudi::Property< std::pair< double, double > > m_BcToDstarMuMu_DstarMassRange
Gaudi::Property< float > m_BcToDstarMuMu_chi2
ToolHandle< InDet::VertexPointEstimator > m_vertexPointEstimator
ToolHandle< Trk::TrkVKalVrtFitter > m_vertexFitter
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
ToolHandle< GenericMonitoringTool > m_monTool
TrigCompositeUtils::DecisionIDContainer m_allowedIDs
SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > m_inputs { this, "HypoInputDecisions", {}, "Input Decisions" }
SG::WriteHandleKeyArray< TrigCompositeUtils::DecisionContainer > m_outputs { this, "HypoOutputDecisions", {}, "Output Decisions" }
Gaudi::Property< bool > m_requireUniqueROI
Gaudi::Property< Combo::MultiplicityReqMap > m_multiplicitiesReqMap
Gaudi::Property< Combo::LegMap > m_legToInputCollectionMap
Gaudi::Property< bool > m_checkMultiplicityMap
ToolHandleArray< ComboHypoToolBase > m_hypoTools {this, "ComboHypoTools", {}, "Tools to perform selection"}
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Static Private Attributes

static const std::vector< std::vector< double > > s_trkMass

Detailed Description

EF hypothesis algorithm for B -> mu+ mu- X decays: B+ -> mu+ mu- K+ B_c+ -> J/psi(-> mu+ mu-) pi+ B_s0 -> mu+ mu- phi1020(-> K+, K-) B0 -> mu+ mu- K*0(-> K+ pi-) Lambda_b0 -> J/psi(-> mu+ mu-) p K- B_c+ -> J/psi(-> mu+ mu-) D_s+(->phi(-> K+ K-) pi+) B_c+ -> J/psi(-> mu+ mu-) D+(-> K- pi+ pi+) B_c+ -> J/psi(-> mu+ mu-) D*+(-> D0(-> K- pi+) pi+) partial (lost pion from D*+) and full reconstruction.

Definition at line 115 of file TrigBmumuxComboHypo.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 376 of file AthCommonDataStore.h.

Member Enumeration Documentation

◆ Decay

Enumerator
kPsi_2mu 
kB_2mu1trk 
kB_2mu2trk 
kDs 
kDplus 
kD0 
kB_PsiPi 
kFastFit_2trk 
kFastFit_2mu1trk 

Definition at line 123 of file TrigBmumuxComboHypo.h.

123 : size_t {
124 kPsi_2mu, // psi -> mu+ mu-
125 kB_2mu1trk, // B -> mu+ mu- trk1
126 kB_2mu2trk, // B -> mu+ mu- trk1 trk2
127 kDs, // D_s+ -> K+ K- pi+
128 kDplus, // D+ -> K- pi+ pi+
129 kD0, // D0 -> K- pi+
130 kB_PsiPi, // psi + pion from D*+
131 kFastFit_2trk, // trk1 + trk2
132 kFastFit_2mu1trk // dimuon + trk1
133 };

Constructor & Destructor Documentation

◆ TrigBmumuxComboHypo() [1/2]

TrigBmumuxComboHypo::TrigBmumuxComboHypo ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 53 of file TrigBmumuxComboHypo.cxx.

54 : ::ComboHypo(name, pSvcLocator) {}
ComboHypo(const std::string &name, ISvcLocator *pSvcLocator)
Definition ComboHypo.cxx:13

◆ TrigBmumuxComboHypo() [2/2]

TrigBmumuxComboHypo::TrigBmumuxComboHypo ( )
delete

Member Function Documentation

◆ copyDecisions()

StatusCode ComboHypo::copyDecisions ( const Combo::LegDecisionsMap & passingLegs,
const EventContext & context ) const
privateinherited

iterates over the inputs and for every object (no filtering) crates output object linked to input moving the decisions that are mentioned in the passing set

Definition at line 86 of file ComboHypo.cxx.

86 {
87 DecisionIDContainer passing;
88 for (auto const& element : passingLegs) {
89 passing.insert(element.first);
90 }
91
92 ATH_MSG_DEBUG( "Copying "<<passing.size()<<" positive decision IDs to outputs");
93
94 for ( size_t input_counter = 0; input_counter < m_inputs.size(); ++input_counter ) {
95 // new output decisions
96 SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(m_outputs.at(input_counter), context );
97 auto outDecisions = outputHandle.ptr();
98 auto inputHandle = SG::makeHandle( m_inputs.at(input_counter), context );
99 if ( inputHandle.isValid() ) {
100
101 for (const Decision* inputDecision : *inputHandle) {
102 auto thisEL = TrigCompositeUtils::decisionToElementLink(inputDecision, context);
103
104 // from all positive decision in the input only the ones that survived counting are passed over
105 const DecisionIDContainer& common = passedDecisionIDs(inputDecision, passing);
106
107 // check if this EL is in the combination map for the passing decIDs:
108 ATH_MSG_DEBUG("Searching this element in the map: ("<<thisEL.dataID() << " , " << thisEL.index()<<")");
109 DecisionIDContainer finalIds;
110 for (const DecisionID c : common){
111 const HLT::Identifier cID = HLT::Identifier(c);
112 // add the decID only if this candidate passed the combination selection
113 const std::vector<ElementLink<DecisionContainer>>& Comb=passingLegs.at(c);
114 if(std::find(Comb.begin(), Comb.end(), thisEL) == Comb.end()) {
115 continue;
116 }
117 ATH_MSG_DEBUG(" Adding "<< cID <<" because EL is found in the passingLegs map");
118 finalIds.insert( cID.numeric() ); // all Ids used by the Filter, including legs
119 if (TrigCompositeUtils::isLegId ( cID )){
120 const HLT::Identifier mainChain = TrigCompositeUtils::getIDFromLeg( cID );
121 finalIds.insert( mainChain.numeric() );
122 ATH_MSG_DEBUG(" Adding "<< mainChain <<" consequently");
123 }
124 }
125
126 Decision* newDec = newDecisionIn( outDecisions, inputDecision, comboHypoAlgNodeName(), context );
127 ATH_MSG_DEBUG("New decision (Container Index:" << input_counter << ", Element Index:"<< newDec->index() <<") has "
129 << " valid initialRoI, "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions and "<<finalIds.size()<<" decision IDs") ;
130 insertDecisionIDs( finalIds, newDec );
131
132 }
133 }
134
135 if (msgLvl(MSG::DEBUG)) {
136 ATH_MSG_DEBUG("Output Handle " << m_outputs.at(input_counter).key() << " with " << outputHandle->size() <<" Decision objects");
137 for (const Decision* d : *outputHandle){
138 DecisionIDContainer objDecisions;
139 decisionIDs( d, objDecisions );
140 ATH_MSG_DEBUG(" Decision object #" << d->index() << " with " << objDecisions.size()<<" positive decision IDs");
141 for (const TrigCompositeUtils::DecisionID id : objDecisions ) {
142 ATH_MSG_DEBUG(" --- Passes: " << HLT::Identifier( id ));
143 }
144 }
145 }
146 }
147
148 return StatusCode::SUCCESS;
149}
#define ATH_MSG_DEBUG(x,...)
size_t size() const
Number of registered mappings.
bool msgLvl(const MSG::Level lvl) const
SG::WriteHandleKeyArray< TrigCompositeUtils::DecisionContainer > m_outputs
Definition ComboHypo.h:51
SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > m_inputs
Definition ComboHypo.h:50
TrigCompositeUtils::DecisionID numeric() const
numeric ID
pointer_type ptr()
Dereference the pointer.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
unsigned int DecisionID
xAOD::TrigComposite Decision
void insertDecisionIDs(const Decision *src, Decision *dest)
Appends the decision IDs of src to the dest decision object.
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::vector< ElementLink< DecisionContainer > > getLinkToPrevious(const Decision *d)
returns links to previous decision object 'seed'
DecisionIDContainer passedDecisionIDs(const Decision *d, const T &required)
return DecisionIDs in Decision object that match the required ones
HLT::Identifier getIDFromLeg(const HLT::Identifier &legIdentifier)
Generate the HLT::Identifier which corresponds to the chain name from the leg name.
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 EventContext &ctx, 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 & initialRoIString()
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.
bool isLegId(const HLT::Identifier &legIdentifier)
Recognise whether the chain ID is a leg ID.

◆ createDecisionObjects()

StatusCode TrigBmumuxComboHypo::createDecisionObjects ( TrigBmumuxState & state) const
private

Create a decision for each xAOD::TrigBphys object from state.trigBphysCollection() and save it to state.decisions(); use hypoTools() to assign correct decisionIDs according to xAOD::TrigBphys::particleType().

Definition at line 819 of file TrigBmumuxComboHypo.cxx.

819 {
820
821 for (const xAOD::TrigBphys* triggerObject : state.trigBphysCollection()) {
822 // skip the first vertex of the cascade decay B_c+(-> mu+ mu- D*+), it is already linked to the xAOD::TrigBphys::BCDSTMUMU trigger object via lowerChainLink()
823 if (triggerObject->particleType() == xAOD::TrigBphys::DSTDZPI) continue;
824
825 ATH_MSG_DEBUG( "Found xAOD::TrigBphys object: mass = " << triggerObject->mass() );
826
827 auto triggerObjectEL = ElementLink<xAOD::TrigBphysContainer>(state.trigBphysCollection(), triggerObject->index());
828 ATH_CHECK( triggerObjectEL.isValid() );
829
830 const xAOD::TrigBphys* dimuonTriggerObject = (triggerObject->particleType() == xAOD::TrigBphys::MULTIMU ? triggerObject : triggerObject->lowerChain());
831 if (triggerObject->particleType() == xAOD::TrigBphys::BCDSTMUMU && dimuonTriggerObject) dimuonTriggerObject = dimuonTriggerObject->lowerChain();
832 if (!dimuonTriggerObject) {
833 ATH_MSG_ERROR( "Failed to found a valid link for preceding dimuon trigger object" );
834 return StatusCode::FAILURE;
835 }
836
837 // need to get the references to the original muon objects used to build the dimuon vertex
838 // the position of this vertex in state.dimuons container is the same as for dimuonTriggerObject in trigBphysCollection
839 // dimuon vertex has already been decorated with muon indices
840 auto dimuonIndex = dimuonTriggerObject->index();
841 const xAOD::Vertex* dimuon = state.dimuons.get(dimuonIndex);
842 if ( !dimuon || dimuonIndex >= state.trigBphysMuonIndices.size() ) {
843 ATH_MSG_ERROR( "Failed to find original muons the dimuon vertex had been built from" );
844 return StatusCode::FAILURE;
845 }
846
847 // create a new output Decision object, backed by the 'decisions' container.
849
850 std::vector<const DecisionIDContainer*> previousDecisionIDs;
851 for (const size_t& i : state.trigBphysMuonIndices.at(dimuonIndex)) {
852 const auto& muon = state.muons.at(i);
853 // attach all previous decisions: if the same previous decision is called twice, that's fine - internally takes care of that
854 // we already have an array of links to the previous decisions, so there is no need to use TrigCompositeUtils::linkToPrevious()
856 previousDecisionIDs.push_back(&muon.decisionIDs);
857 }
858
859 // set mandatory link to the trigger object
861
862 for (const auto& tool : hypoTools()) {
863 ATH_MSG_DEBUG( "Go to " << tool );
864 ATH_CHECK( tool->decideOnSingleObject(decision, previousDecisionIDs) );
865 }
866 }
867
868 return StatusCode::SUCCESS;
869}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
ToolHandleArray< ComboHypoToolBase > & hypoTools()
Definition ComboHypo.h:45
const T * get(size_type n) const
Access an element, as an rvalue.
TrigCompositeUtils::DecisionContainer & decisions()
xAOD::TrigBphysContainer & trigBphysCollection()
std::vector< Muon > muons
xAOD::VertexContainer dimuons
std::vector< std::array< size_t, 2 > > trigBphysMuonIndices
const TrigBphys_v1 * lowerChain() const
accessor method: lowerChain decay particle
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.
const std::string & featureString()
const std::string & seedString()
TrigBphys_v1 TrigBphys
Definition TrigBphys.h:18
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrigBphysContainer_v1 TrigBphysContainer

◆ decisionsInput()

const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & ComboHypo::decisionsInput ( ) const
inlineprotectedinherited

Definition at line 41 of file ComboHypo.h.

41{ return m_inputs; }

◆ decisionsOutput()

const SG::WriteHandleKeyArray< TrigCompositeUtils::DecisionContainer > & ComboHypo::decisionsOutput ( ) const
inlineprotectedinherited

Definition at line 42 of file ComboHypo.h.

42{ return m_outputs; }

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode TrigBmumuxComboHypo::execute ( const EventContext & context) const
overridevirtual

Reimplemented from ComboHypo.

Definition at line 102 of file TrigBmumuxComboHypo.cxx.

102 {
103
104 ATH_MSG_DEBUG( "TrigBmumuxComboHypo::execute() starts" );
105
106 ATH_MSG_DEBUG( "decision input key: " << decisionsInput().at(0).key() );
107 auto previousDecisionsHandle = SG::makeHandle(decisionsInput().at(0), context);
108 ATH_CHECK( previousDecisionsHandle.isValid() );
109 ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" );
110
111 SG::WriteHandle<DecisionContainer> outputDecisionsHandle = TrigCompositeUtils::createAndStore(decisionsOutput().at(0), context);
112
113 auto trigBphysHandle = SG::makeHandle(m_trigBphysContainerKey, context);
114 ATH_CHECK( trigBphysHandle.record(std::make_unique<xAOD::TrigBphysContainer>(),
115 std::make_unique<xAOD::TrigBphysAuxContainer>()) );
116
117 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle {m_beamSpotKey, context};
118 ATH_CHECK( beamSpotHandle.isValid() );
119
120 auto state = std::make_unique<TrigBmumuxState>(context, *previousDecisionsHandle, *outputDecisionsHandle, trigBphysHandle.ptr(), *beamSpotHandle);
121
124
125 if (!state->dimuons.empty()) {
129 }
130
131 ATH_MSG_DEBUG( "TrigBmumuxComboHypo::execute() terminates with StatusCode::SUCCESS" );
132 return StatusCode::SUCCESS;
133}
const SG::WriteHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsOutput() const
Definition ComboHypo.h:42
const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionsInput() const
Definition ComboHypo.h:41
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
SG::WriteHandleKey< xAOD::TrigBphysContainer > m_trigBphysContainerKey
StatusCode findBmumuxCandidates(TrigBmumuxState &) const
Find B decays by appling next three subprocedures to each found dimuon candidate.
StatusCode mergeMuonsFromDecisions(TrigBmumuxState &) const
Go through state.previousDecisions(), fetch xAOD::Muons objects attached to decisions and save links ...
StatusCode mergeTracksFromViews(TrigBmumuxState &) const
Go through state.previousDecisions() and fetch xAOD::TrackParticle objects associated with the neares...
StatusCode createDecisionObjects(TrigBmumuxState &) const
Create a decision for each xAOD::TrigBphys object from state.trigBphysCollection() and save it to sta...
StatusCode findDimuonCandidates(TrigBmumuxState &) const
Make all possible dimuon combinations from state.muons(), fit muon InDet tracks to the common vertex,...
mapped_type at(key_type key) const
Look up an element in the map.

◆ extractFeatureAndRoI()

StatusCode ComboHypo::extractFeatureAndRoI ( const HLT::Identifier & chainLegId,
const ElementLink< TrigCompositeUtils::DecisionContainer > & EL,
SG::sgkey_t & featureKey,
TrigCompositeUtils::Decision::index_type & featureIndex,
SG::sgkey_t & roiKey,
TrigCompositeUtils::Decision::index_type & roiIndex,
bool & roiFullscan,
bool & objectRequestsNoMultiplicityCheck,
SG::SGKeyMap< std::set< uint32_t > > & priorFeaturesMap ) const
privateinherited

For a given Decision node from a HypoAlg, extracts type-less identification data on the node's Feature and seeding ROI.

Parameters
[in]chainLegIdThe HLT::Identifer of the chain (leg) we're extracting features for.
[in]ELThe Decision node from the HypoAlg, expected to have a "feature" link attached to it. Expected to be able to locate a "initialRoI" in its history if RequireUniqueROI=True.
[out]featureKeyType-less SG Key hash of the collection hosting the Decision node's feature .
[out]featureIndexIndex inside the featureKey collection.
[out]roiKeyType-less SG Key hash of the collection hosting the Decision node's initial ROI collection.
[out]roiIndexIndex inside the roiKey collection.
[out]roiIsFullscanFlag indicating if the located initial ROI has the FullScan flag enabled. Triggers special behaviour allowing the ROI to satisfy arbitrary multiplicities in an arbitrary number of legs.
[out]objectRequestsNoMultiplicityCheckFlag indicating of the DecisionObject requested not be included in the multiplicity computation. Triggers special behaviour allowing the DecisionObject to satisfy arbitrary multiplicities in an arbitrary number of legs.
[in,out]priorFeaturesMapData structure collating for a given feature (key) what the prior features were integrated over all previous steps (value set).

Definition at line 378 of file ComboHypo.cxx.

387{
388 // Return collections for the findLinks call.
389 // While we will be focusing on the most recent feature, for tag-and-probe we need to keep a record of the features from the prior steps too.
390
391 // Construct a sub-graph following just this leg back through the nav
392 DecisionIDContainer chainLegIdSet = {chainLegId.numeric()};
393 TrigCompositeUtils::NavGraph subGraph;
394 recursiveGetDecisions((*dEL), subGraph, chainLegIdSet, /*enforceDecisionOnStartNode =*/ true);
395
396 if (subGraph.finalNodes().size() != 1) {
397 ATH_MSG_ERROR("We are only expecting to search from a single navigation node in extractFeatureAndRoI");
398 return StatusCode::FAILURE;
399 }
400 const NavGraphNode* start = *(subGraph.finalNodes().begin());
401
402 std::vector<SG::sgkey_t> keys;
403 std::vector<uint32_t> clids; // We don't care about the class ID. This part gets ignored.
404 std::vector<Decision::index_type> indicies;
405 std::vector<const Decision*> sources;
406
407 std::set<const Decision*> fullyExploredFrom; // This is a cache which typelessFindLinks will use to avoid re-visiting already explored regions of the graph
408 // Note: This call to typelessFindLinks is exploring from a NavGraphNode* rather than a Decision*,
409 // this indicates that the search is restricted to a sub-graph (specifically, only following one chain-leg)
410 const bool foundFeature = typelessFindLinks(start, featureString(), keys, clids, indicies, sources, TrigDefs::allFeaturesOfType, &fullyExploredFrom);
411
412 const Decision* featureSource = nullptr;
413 // The "most recent" feature (from the step just run) is the one we find first. Hence it's at index 0
414 if (foundFeature) {
415 featureKey = keys.at(0);
416 featureIndex = indicies.at(0);
417 featureSource = sources.at(0);
418 }
419
420 objectRequestsNoMultiplicityCheck = (featureSource and featureSource->hasDetail<int32_t>("noCombo") and featureSource->getDetail<int32_t>("noCombo") == 1);
421
422 if (foundFeature and priorFeaturesMap.count(featureKey + featureIndex) == 0) {
423 const std::string* key_str = evtStore()->keyToString(featureKey);
424 ATH_MSG_DEBUG("Note: Will use feature hash " << featureKey + featureIndex << ", for " << (key_str ? *key_str : "UNKNOWN") << " index=" << featureIndex);
425 // Use the deep-search data to look further back than .at(0)
426 // Here's where we keep the record of the features in previous steps. Step ordering is unimportant, we can use a set.
427 if (keys.size() > 1) {
428 for (size_t i = 1; i < keys.size(); ++i) { // Skip the 1st entry, this will be equal to featureKey and featureIndex from typelessFindLink above.
429 // featureKey + featureIndex should be considered as equivalent to a per-feature hash (featureKey is a real hash, featureIndex is an offset index)
430 if (featureKey + featureIndex == keys.at(i) + indicies.at(i)) {
431 continue; // Do not add the case where a feature is re-attached to more than one step.
432 }
433 priorFeaturesMap[featureKey + featureIndex].insert(keys.at(i) + indicies.at(i));
434 }
435 } else { // Exactly one feature. Make a note of this by inserting an empty set, such that we don't do this search again.
436 priorFeaturesMap.insert( std::pair<uint32_t, std::set<uint32_t>>(featureKey + featureIndex, std::set<uint32_t>()) );
437 }
438 }
439
440 // Try and get seeding ROI data too.
441 uint32_t roiClid{0}; // Unused
442 const Decision* roiSource{nullptr}; // Unused
443 const bool foundROI = typelessFindLink(subGraph, initialRoIString(), roiKey, roiClid, roiIndex, roiSource);
444 if (foundROI) {
445 ElementLink<TrigRoiDescriptorCollection> roiEL(roiKey, roiIndex);
446 ATH_CHECK( roiEL.isValid() );
447 roiIsFullscan = (*(roiEL))->isFullscan();
448 if (!foundFeature) {
449 const std::string* roi_str = evtStore()->keyToString(roiKey);
450 ATH_MSG_DEBUG("Note: Located fallback-ROI, if used this will have feature hash =" << roiKey + roiIndex << ", for " << (roi_str ? *roi_str : "UNKNOWN") << " index=" << roiIndex);
451 }
452 }
453
454 if (!foundFeature && !foundROI) {
455 ATH_MSG_WARNING("Did not find the feature or initialRoI for " << dEL.dataID() << " index " << dEL.index());
456 }
457
458 return StatusCode::SUCCESS;
459}
#define ATH_MSG_WARNING(x,...)
ServiceHandle< StoreGateSvc > & evtStore()
const std::vector< NavGraphNode * > & finalNodes() const
Get all final nodes.
Definition NavGraph.cxx:100
bool hasDetail(const std::string &name) const
Check if a given type of detail is available.
bool getDetail(const std::string &name, TYPE &value) const
Get an TYPE detail from the object.
void recursiveGetDecisions(const Decision *start, NavGraph &navGraph, const DecisionIDContainer &ids, const bool enforceDecisionOnStartNode)
Search back in time from "node" and locate all paths back through Decision objects for a given chain.
bool typelessFindLinks(const Decision *start, const std::string &linkName, std::vector< sgkey_t > &keyVec, std::vector< CLID > &clidVec, std::vector< Decision::index_type > &indexVec, std::vector< const Decision * > &sourceVec, const unsigned int behaviour, std::set< const Decision * > *fullyExploredFrom)
search back the TC links for the object of type T linked to the one of TC (recursively) Returns the l...
bool typelessFindLink(const Decision *start, const std::string &linkName, sgkey_t &key, CLID &clid, Decision::index_type &index, const Decision *&source, const bool suppressMultipleLinksWarning)
Perform a recursive search for ElementLinks of any time and name 'linkName', starting from Decision o...
static const unsigned int allFeaturesOfType
Run 3 "enum". Return all features along legs (still with type and container checks).
setEventNumber uint32_t

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 89 of file AthCommonAlgorithm.cxx.

54{
55 // If we didn't find any symlinks to add, just return the collection
56 // from the base class. Otherwise, return the extended collection.
57 if (!m_extendedExtraObjects.empty()) {
59 }
61}
Common base class for algorithms.

◆ fillDecisionsMap()

StatusCode ComboHypo::fillDecisionsMap ( Combo::LegDecisionsMap & dmap,
const EventContext & context ) const
privateinherited

iterates over all inputs, associating inputs to legs

Definition at line 462 of file ComboHypo.cxx.

462 {
463 for ( size_t inputContainerIndex = 0; inputContainerIndex < m_inputs.size(); ++inputContainerIndex ) {
464 auto inputHandle = SG::makeHandle( m_inputs.at(inputContainerIndex), context );
465 if ( !inputHandle.isValid() ) {
466 ATH_MSG_ERROR( "No input ReadHandle from " << inputHandle.key() );
467 return StatusCode::FAILURE;
468 }
469 ATH_MSG_DEBUG( "-- Found ReadHandle from " << inputHandle.key() <<" with "<< inputHandle->size() << " elements:" );
470 for ( const Decision* decision : *inputHandle ) {
471 ATH_MSG_DEBUG( "-- -- Input Decision #"<< decision->index() <<" with "<< decisionIDs( decision ).size() << " active IDs. Populating the multiplicity map:" );
472 for ( const DecisionID id: decisionIDs( decision ) ) {
473
474 // Handles regular and multi-leg case
475 const auto& [chainName, chainLeg] = getNameAndIndexFromLeg(HLT::Identifier(id).name());
476
477 // We need to check if we are configured to accept DecisionObjects passing 'chainName' ...
478 Combo::LegMap::const_iterator it = m_legToInputCollectionMap.find(chainName);
479 if (it == m_legToInputCollectionMap.end()) {
480 ATH_MSG_VERBOSE("-- -- -- Ignoring the DecsionID " << id << " on leg " << chainLeg << " as it does not correspond to any of the " << m_legToInputCollectionMap.size() << " chains this Alg is processing.");
481 continue;
482 }
483
484 // ... and if so we need to further check that we are accepting passing IDs for chainLeg on the current inputContainerIndex
485 const std::vector<int>& legToInputCollectionIndex = it->second;
486 const size_t requiredInputContainerIndex = static_cast<size_t>(legToInputCollectionIndex.at(chainLeg));
487 if (requiredInputContainerIndex != inputContainerIndex) {
488 ATH_MSG_VERBOSE("-- -- -- Ignoring the DecisionID " << id << " on leg " << chainLeg << " as we are only permitted to accept passing objects on leg #" << chainLeg << " of " << chainName
489 << " which come from input collection index " << requiredInputContainerIndex << " (which is " << m_inputs.at(requiredInputContainerIndex).key() << ")"
490 << ". Not the current index " << inputContainerIndex << " (which is " << m_inputs.at(inputContainerIndex).key() << ")");
491 continue;
492 }
493
494 ATH_MSG_DEBUG( " ++++ " << HLT::Identifier( id ) );
495 dmap[id].push_back( TrigCompositeUtils::decisionToElementLink(decision, context) );
496 }
497 }
498 }
499
500 if (msgLvl(MSG::DEBUG)){
501 ATH_MSG_DEBUG( "Decision map filled :" );
502 size_t legCount = 0;
503 for (const auto& entry: dmap){
504 ATH_MSG_DEBUG("leg ["<<legCount<<"]: ");
505 const std::vector<ElementLink<DecisionContainer>>& decisions = entry.second;
506 ATH_MSG_DEBUG(" ++++ " << HLT::Identifier( entry.first ) <<" Number Decisions: "<< decisions.size());
507 for (const ElementLink<DecisionContainer>& d : decisions){
508 ATH_MSG_DEBUG(" Decision: (ContainerKey:"<<d.dataID()<<", DecisionElementIndex:"<<d.index()<<")");
509 }
510 legCount++;
511 }
512 }
513
514
515 return StatusCode::SUCCESS;
516}
#define ATH_MSG_VERBOSE(x,...)
Gaudi::Property< Combo::LegMap > m_legToInputCollectionMap
Definition ComboHypo.h:59
std::pair< std::string, int32_t > getNameAndIndexFromLeg(const std::string &name)
Extract the name and numeric index of a leg identifier.

◆ filterPassed()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Get filter decision:

Definition at line 93 of file AthCommonAlgorithm.h.

93 {
94 return execState( ctx ).filterPassed();
95 }
virtual bool filterPassed(const EventContext &ctx) const
Get filter decision:

◆ findBmumuxCandidates()

StatusCode TrigBmumuxComboHypo::findBmumuxCandidates ( TrigBmumuxState & state) const
private

Find B decays by appling next three subprocedures to each found dimuon candidate.

Definition at line 314 of file TrigBmumuxComboHypo.cxx.

314 {
315
316 std::vector<int> nSelectedTrk;
317 auto mon_nTrk = Monitored::Scalar<int>("nTrk", 0);
318 auto mon_nSelectedTrk = Monitored::Collection("nSelectedTrk", nSelectedTrk);
319 auto mon_nBPhysObject = Monitored::Scalar<int>("nBPhysObject", 0);
320 auto group = Monitored::Group(m_monTool, mon_nTrk, mon_nSelectedTrk, mon_nBPhysObject);
321
322 for (size_t dimuonIndex = 0; dimuonIndex < state.dimuons.size(); ++dimuonIndex) {
323
324 ATH_CHECK( findBmumuxCandidates_selectTracks(state, dimuonIndex) );
325 if (state.selectedTracks.empty()) continue;
326 nSelectedTrk.push_back(state.selectedTracks.size());
327
328 ATH_CHECK( findBmumuxCandidates_fit(state, dimuonIndex, true) );
329 ATH_CHECK( findBmumuxCandidates_fastFit(state, dimuonIndex) );
330 ATH_CHECK( findBmumuxCandidates_fit(state, dimuonIndex) );
331 }
332
333 mon_nTrk = state.tracks.size();
334 mon_nBPhysObject = state.trigBphysCollection().size() - state.dimuons.size();
335
336 return StatusCode::SUCCESS;
337}
size_type size() const noexcept
Returns the number of elements in the collection.
StatusCode findBmumuxCandidates_fit(TrigBmumuxState &, size_t dimuonIndex, bool makeCombinations=false) const
Perform fit of B decays for the topologies described above if makeCombinations = false.
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...
ToolHandle< GenericMonitoringTool > m_monTool
std::vector< ElementLink< xAOD::TrackParticleContainer > > selectedTracks
std::vector< ElementLink< xAOD::TrackParticleContainer > > tracks
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.

◆ findBmumuxCandidates_fastFit()

StatusCode TrigBmumuxComboHypo::findBmumuxCandidates_fastFit ( TrigBmumuxState & state,
size_t dimuonIndex ) const
private

Go through (dimuon+track) and (track+track) combinations found by findBmumuxCandidates_fit(makeCombinations = true) Perform fast fit if combination occurred more than five times.

If fast fit fails, put combination into state.badTrackCombinations().

Definition at line 779 of file TrigBmumuxComboHypo.cxx.

779 {
780
781 state.badTrackCombinations.clear();
782
783 const xAOD::Vertex* dimuon = state.dimuons.get(dimuonIndex);
784
785 // {mu1, mu2, trk1}
786 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_2mu1trk(dimuon->trackParticleLinks());
787 trackParticleLinks_2mu1trk.emplace_back();
788
789 // {trk1, trk2}
790 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_2trk(2);
791
792 size_t n = state.selectedTracks.size();
793 size_t iterations = 0;
794 for (const auto& item : state.trackCombinations) {
795 if (item.second < 5) continue;
796
797 size_t key = item.first;
798 if (key < n) { // dimuon + track
799 trackParticleLinks_2mu1trk[2] = state.selectedTracks[key];
800 auto vertex = fit(state.context(), trackParticleLinks_2mu1trk, kFastFit_2mu1trk, dimuon);
801 iterations++;
802 if (!vertex || vertex->chiSquared() > m_fastFit_2mu1trk_chi2) state.badTrackCombinations.push_back(key);
803 }
804 else { // track + track
805 trackParticleLinks_2trk[0] = state.selectedTracks[key % n];
806 trackParticleLinks_2trk[1] = state.selectedTracks[key / n];
807 auto vertex = fit(state.context(), trackParticleLinks_2trk, kFastFit_2trk);
808 iterations++;
809 if (!vertex || vertex->chiSquared() > m_fastFit_2trk_chi2) state.badTrackCombinations.push_back(key);
810 }
811 }
812 std::sort(state.badTrackCombinations.begin(), state.badTrackCombinations.end());
813 ATH_MSG_DEBUG( "Fast fit found " << state.badTrackCombinations.size() << " bad combinations after " << iterations << " iterations" );
814
815 return StatusCode::SUCCESS;
816}
const EventContext & context() const
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< double > m_fastFit_2mu1trk_chi2
Gaudi::Property< double > m_fastFit_2trk_chi2
std::map< size_t, size_t > trackCombinations
std::vector< size_t > badTrackCombinations
const TrackParticleLinks_t & trackParticleLinks() const
Get all the particles associated with the vertex.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.

◆ findBmumuxCandidates_fit()

StatusCode TrigBmumuxComboHypo::findBmumuxCandidates_fit ( TrigBmumuxState & state,
size_t dimuonIndex,
bool makeCombinations = false ) const
private

Perform fit of B decays for the topologies described above if makeCombinations = false.

Otherwise add simple combinations to state.trackCombinations().

Definition at line 397 of file TrigBmumuxComboHypo.cxx.

397 {
398
399 const auto& selectedTracks = state.selectedTracks;
400 if (makeCombinations) state.trackCombinations.clear();
401
402 const xAOD::Vertex* dimuon = state.dimuons.get(dimuonIndex);
403 auto dimuonTriggerObjectEL = ElementLink<xAOD::TrigBphysContainer>(state.trigBphysCollection(), dimuonIndex);
404 ATH_CHECK( dimuonTriggerObjectEL.isValid() );
405
406 // vtx1 = {mu1, mu2, trk1}
407 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_vtx1(dimuon->trackParticleLinks());
408 trackParticleLinks_vtx1.emplace_back();
409
410 // vtx2 = {mu1, mu2, trk1, trk2}
411 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_vtx2(trackParticleLinks_vtx1);
412 trackParticleLinks_vtx2.emplace_back();
413
414 // vtx3 = {trk1, trk2, trk3}
415 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_vtx3(3);
416
417 const xAOD::TrackParticle* mu1 = *trackParticleLinks_vtx1[0];
418 const xAOD::TrackParticle* mu2 = *trackParticleLinks_vtx1[1];
419 auto p_dimuon = mu1->genvecP4().SetM(PDG::mMuon) + mu2->genvecP4().SetM(PDG::mMuon);
420
421 size_t iterations = 0;
422 size_t nTrigBphysObjects = state.trigBphysCollection().size();
423 bool isOverWarningThreshold = false;
424 // dimuon + 1 track
425 for (size_t itrk1 = 0; itrk1 < selectedTracks.size(); ++itrk1) {
426 const xAOD::TrackParticle* trk1 = *selectedTracks[itrk1];
427
428 trackParticleLinks_vtx1[2] = selectedTracks[itrk1];
429 auto p_trk1 = trk1->genvecP4();
430 auto charge1 = trk1->charge();
431
432 std::unique_ptr<xAOD::Vertex> vtx1;
433 bool makeFit_vtx1 = !makeCombinations;
434 bool passFastFit_vtx1 = (!makeCombinations && !state.isBadCombination(itrk1));
435
436 // B+ -> mu+ mu- K+
437 if (m_BplusToMuMuKaon &&
438 p_trk1.Pt() > m_BplusToMuMuKaon_minKaonPt &&
439 isInMassRange((p_dimuon + p_trk1.SetM(PDG::mKaon)).M(), m_BplusToMuMuKaon_massRange)) {
440
441 if (makeCombinations && m_BplusToMuMuKaon_useFastFit) state.addTrackCombination(itrk1);
442 if (!vtx1 && makeFit_vtx1 && (passFastFit_vtx1 || !m_BplusToMuMuKaon_useFastFit)) {
443 vtx1 = fit(state.context(), trackParticleLinks_vtx1, kB_2mu1trk, dimuon);
444 makeFit_vtx1 = false;
445 ++iterations;
446 }
447 if (vtx1 && vtx1->chiSquared() < m_BplusToMuMuKaon_chi2) {
448 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx1, xAOD::TrigBphys::BKMUMU, {PDG::mMuon, PDG::mMuon, PDG::mKaon}, dimuonTriggerObjectEL);
449 ATH_CHECK( state.addTriggerObject(trigBphys) );
450 }
451 }
452
453 // B_c+ -> J/psi(-> mu+ mu-) pi+
454 if (m_BcToMuMuPion &&
455 p_trk1.Pt() > m_BcToMuMuPion_minPionPt &&
457 isInMassRange((p_dimuon + p_trk1.SetM(PDG::mPion)).M() - p_dimuon.M() + PDG::mJpsi, m_BcToMuMuPion_massRange)) {
458
459 if (makeCombinations && m_BcToMuMuPion_useFastFit) state.addTrackCombination(itrk1);
460 if (!vtx1 && makeFit_vtx1 && (passFastFit_vtx1 || !m_BcToMuMuPion_useFastFit)) {
461 vtx1 = fit(state.context(), trackParticleLinks_vtx1, kB_2mu1trk, dimuon);
462 makeFit_vtx1 = false;
463 ++iterations;
464 }
465 if (vtx1 && vtx1->chiSquared() < m_BcToMuMuPion_chi2) {
466 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx1, xAOD::TrigBphys::BCPIMUMU, {PDG::mMuon, PDG::mMuon, PDG::mPion}, dimuonTriggerObjectEL);
467 ATH_CHECK( state.addTriggerObject(trigBphys) );
468 }
469 }
470 vtx1.reset();
471
472 // dimuon + 2 tracks
473 for (size_t itrk2 = itrk1 + 1; itrk2 < selectedTracks.size(); ++itrk2) {
474 const xAOD::TrackParticle* trk2 = *selectedTracks[itrk2];
475
476 trackParticleLinks_vtx2[2] = selectedTracks[itrk1];
477 trackParticleLinks_vtx2[3] = selectedTracks[itrk2];
478 auto p_trk2 = trk2->genvecP4();
479 auto charge2 = trk2->charge();
480
481 std::unique_ptr<xAOD::Vertex> vtx2;
482 bool makeFit_vtx2 = !makeCombinations;
483 bool passFastFit_vtx2 = (!makeCombinations && !state.isBadCombination(itrk1) && !state.isBadCombination(itrk2));
484
485 // B_s0 -> mu+ mu- phi(-> K+ K-)
486 if (m_BsToMuMuPhi1020 &&
487 (!m_BsToMuMuPhi1020_rejectSameChargeTracks || charge1 * charge2 < 0.) &&
488 p_trk1.Pt() > m_BsToMuMuPhi1020_minKaonPt &&
489 p_trk2.Pt() > m_BsToMuMuPhi1020_minKaonPt &&
490 isInMassRange((p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mKaon)).M(), m_BsToMuMuPhi1020_phiMassRange) &&
491 isInMassRange((p_dimuon + p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mKaon)).M(), m_BsToMuMuPhi1020_massRange)) {
492
493 if (makeCombinations && m_BsToMuMuPhi1020_useFastFit) {
494 state.addTrackCombination(itrk1);
495 state.addTrackCombination(itrk2);
496 }
497 if (!vtx2 && makeFit_vtx2 && (passFastFit_vtx2 || !m_BsToMuMuPhi1020_useFastFit)) {
498 vtx2 = fit(state.context(), trackParticleLinks_vtx2, kB_2mu2trk, dimuon);
499 makeFit_vtx2 = false;
500 ++iterations;
501 }
502 if (vtx2 && vtx2->chiSquared() < m_BsToMuMuPhi1020_chi2) {
503 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx2, xAOD::TrigBphys::BSPHIMUMU, {PDG::mMuon, PDG::mMuon, PDG::mKaon, PDG::mKaon}, dimuonTriggerObjectEL);
504 ATH_CHECK( state.addTriggerObject(trigBphys) );
505 }
506 }
507
508 // B0 -> mu+ mu- K*0(-> K+ pi-)
509 if (m_BdToMuMuKstar0 &&
510 (!m_BdToMuMuKstar0_rejectSameChargeTracks || charge1 * charge2 < 0.) &&
511 p_trk1.Pt() > m_BdToMuMuKstar0_minKaonPt &&
512 p_trk2.Pt() > m_BdToMuMuKstar0_minPionPt &&
513 isInMassRange((p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mPion)).M(), m_BdToMuMuKstar0_KstarMassRange) &&
514 isInMassRange((p_dimuon + p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mPion)).M(), m_BdToMuMuKstar0_massRange)) {
515
516 if (makeCombinations && m_BdToMuMuKstar0_useFastFit) {
517 state.addTrackCombination(itrk1);
518 state.addTrackCombination(itrk2);
519 }
520 if (!vtx2 && makeFit_vtx2 && (passFastFit_vtx2 || !m_BdToMuMuKstar0_useFastFit)) {
521 vtx2 = fit(state.context(), trackParticleLinks_vtx2, kB_2mu2trk, dimuon);
522 makeFit_vtx2 = false;
523 ++iterations;
524 }
525 if (vtx2 && vtx2->chiSquared() < m_BdToMuMuKstar0_chi2) {
526 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx2, xAOD::TrigBphys::BDKSTMUMU, {PDG::mMuon, PDG::mMuon, PDG::mKaon, PDG::mPion}, dimuonTriggerObjectEL);
527 ATH_CHECK( state.addTriggerObject(trigBphys) );
528 }
529 }
530 // anti-B0 -> mu+ mu- anti-K*0(-> K- pi+)
531 if (m_BdToMuMuKstar0 &&
532 (!m_BdToMuMuKstar0_rejectSameChargeTracks || charge1 * charge2 < 0.) &&
533 p_trk1.Pt() > m_BdToMuMuKstar0_minPionPt &&
534 p_trk2.Pt() > m_BdToMuMuKstar0_minKaonPt &&
535 isInMassRange((p_trk1.SetM(PDG::mPion) + p_trk2.SetM(PDG::mKaon)).M(), m_BdToMuMuKstar0_KstarMassRange) &&
536 isInMassRange((p_dimuon + p_trk1.SetM(PDG::mPion) + p_trk2.SetM(PDG::mKaon)).M(), m_BdToMuMuKstar0_massRange)) {
537
538 if (makeCombinations && m_BdToMuMuKstar0_useFastFit) {
539 state.addTrackCombination(itrk1);
540 state.addTrackCombination(itrk2);
541 }
542 if (!vtx2 && makeFit_vtx2 && (passFastFit_vtx2 || !m_BdToMuMuKstar0_useFastFit)) {
543 vtx2 = fit(state.context(), trackParticleLinks_vtx2, kB_2mu2trk, dimuon);
544 makeFit_vtx2 = false;
545 ++iterations;
546 }
547 if (vtx2 && vtx2->chiSquared() < m_BdToMuMuKstar0_chi2) {
548 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx2, xAOD::TrigBphys::BDKSTMUMU, {PDG::mMuon, PDG::mMuon, PDG::mPion, PDG::mKaon}, dimuonTriggerObjectEL);
549 ATH_CHECK( state.addTriggerObject(trigBphys) );
550 }
551 }
552
553 // Lambda_b0 -> J/psi(-> mu+ mu-) p K-
557 (p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mPion)).M() > m_LambdaBToMuMuProtonKaon_minKstarMass &&
558 (p_trk1.SetM(PDG::mPion) + p_trk2.SetM(PDG::mKaon)).M() > m_LambdaBToMuMuProtonKaon_minKstarMass &&
560 isInMassRange((p_dimuon + p_trk1.SetM(PDG::mProton) + p_trk2.SetM(PDG::mKaon)).M() - p_dimuon.M() + PDG::mJpsi, m_LambdaBToMuMuProtonKaon_massRange)) {
561
562 if (makeCombinations && m_LambdaBToMuMuProtonKaon_useFastFit) {
563 state.addTrackCombination(itrk1);
564 state.addTrackCombination(itrk2);
565 }
566 if (!vtx2 && makeFit_vtx2 && (passFastFit_vtx2 || !m_LambdaBToMuMuProtonKaon_useFastFit)) {
567 vtx2 = fit(state.context(), trackParticleLinks_vtx2, kB_2mu2trk, dimuon);
568 makeFit_vtx2 = false;
569 ++iterations;
570 }
571 if (vtx2 && vtx2->chiSquared() < m_LambdaBToMuMuProtonKaon_chi2 && Lxy(state.beamSpotPosition(), *vtx2) > 0.) {
572 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx2, xAOD::TrigBphys::LBPQMUMU, {PDG::mMuon, PDG::mMuon, PDG::mProton, PDG::mKaon}, dimuonTriggerObjectEL);
573 ATH_CHECK( state.addTriggerObject(trigBphys) );
574 }
575 }
576 // anti-Lambda_b0 -> J/psi(-> mu+ mu-) anti-p K+
580 (p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mPion)).M() > m_LambdaBToMuMuProtonKaon_minKstarMass &&
581 (p_trk1.SetM(PDG::mPion) + p_trk2.SetM(PDG::mKaon)).M() > m_LambdaBToMuMuProtonKaon_minKstarMass &&
583 isInMassRange((p_dimuon + p_trk1.SetM(PDG::mKaon) + p_trk2.SetM(PDG::mProton)).M() - p_dimuon.M() + PDG::mJpsi, m_LambdaBToMuMuProtonKaon_massRange)) {
584
585 if (makeCombinations && m_LambdaBToMuMuProtonKaon_useFastFit) {
586 state.addTrackCombination(itrk1);
587 state.addTrackCombination(itrk2);
588 }
589 if (!vtx2 && makeFit_vtx2 && (passFastFit_vtx2 || !m_LambdaBToMuMuProtonKaon_useFastFit)) {
590 vtx2 = fit(state.context(), trackParticleLinks_vtx2, kB_2mu2trk, dimuon);
591 makeFit_vtx2 = false;
592 ++iterations;
593 }
594 if (vtx2 && vtx2->chiSquared() < m_LambdaBToMuMuProtonKaon_chi2 && Lxy(state.beamSpotPosition(), *vtx2) > 0.) {
595 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx2, xAOD::TrigBphys::LBPQMUMU, {PDG::mMuon, PDG::mMuon, PDG::mKaon, PDG::mProton}, dimuonTriggerObjectEL);
596 ATH_CHECK( state.addTriggerObject(trigBphys) );
597 }
598 }
599 vtx2.reset();
600
601 for (size_t itrk3 = 0; itrk3 < selectedTracks.size(); ++itrk3) {
602 const xAOD::TrackParticle* trk3 = *selectedTracks[itrk3];
603 if (itrk3 == itrk1 || itrk3 == itrk2) continue;
604
605 trackParticleLinks_vtx3[0] = selectedTracks[itrk1];
606 trackParticleLinks_vtx3[1] = selectedTracks[itrk2];
607 trackParticleLinks_vtx3[2] = selectedTracks[itrk3];
608 auto p_trk3 = trk3->genvecP4();
609 auto charge3 = trk3->charge();
610
611 std::unique_ptr<xAOD::Vertex> vtx3;
612 bool makeFit_vtx3 = !makeCombinations;
613 bool passFastFit_vtx3 = (!makeCombinations && !state.isBadCombination(itrk1, itrk2, itrk3));
614
615 // B_c+ -> J/psi(-> mu+ mu-) D_s+(->phi(-> K+ K-) pi+)
616 p_trk1.SetM(PDG::mKaon); // D_s+.phi.K+
617 p_trk2.SetM(PDG::mKaon); // D_s+.phi.K-
618 p_trk3.SetM(PDG::mPion); // D_s+.pi+
619 if (m_BcToDsMuMu &&
620 charge1 * charge2 < 0. &&
621 p_trk1.Pt() > m_BcToDsMuMu_minKaonPt &&
622 p_trk2.Pt() > m_BcToDsMuMu_minKaonPt &&
623 p_trk3.Pt() > m_BcToDsMuMu_minPionPt &&
625 isInMassRange((p_trk1 + p_trk2).M(), m_BcToDsMuMu_phiMassRange) &&
626 isInMassRange((p_trk1 + p_trk2 + p_trk3).M(), m_BcToDsMuMu_DsMassRange) &&
627 isInMassRange((p_dimuon + p_trk1 + p_trk2 + p_trk3).M() - p_dimuon.M() + PDG::mJpsi, m_BcToDsMuMu_massRange)) {
628
629 if (makeCombinations && m_BcToDsMuMu_useFastFit) state.addTrackCombination(itrk1, itrk2, itrk3);
630 if (!vtx3 && makeFit_vtx3 && (passFastFit_vtx3 || !m_BcToDsMuMu_useFastFit)) {
631 vtx3 = fit(state.context(), trackParticleLinks_vtx3, kDs, dimuon);
632 makeFit_vtx3 = false;
633 ++iterations;
634 }
635 if (vtx3 && vtx3->chiSquared() < m_BcToDsMuMu_chi2) {
636 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx3, xAOD::TrigBphys::BCDSMUMU, {PDG::mKaon, PDG::mKaon, PDG::mPion}, dimuonTriggerObjectEL);
637 ATH_CHECK( state.addTriggerObject(trigBphys) );
638 }
639 }
640
641 // B_c+ -> J/psi(-> mu+ mu-) D+(-> K- pi+ pi+)
642 p_trk1.SetM(PDG::mPion); // D+.pi+
643 p_trk2.SetM(PDG::mPion); // D+.pi+
644 p_trk3.SetM(PDG::mKaon); // D+.K-
645 if (m_BcToDplusMuMu &&
646 charge1 * charge2 > 0. && charge1 * charge3 < 0. &&
647 p_trk1.Pt() > m_BcToDplusMuMu_minPionPt &&
648 p_trk2.Pt() > m_BcToDplusMuMu_minPionPt &&
649 p_trk3.Pt() > m_BcToDplusMuMu_minKaonPt &&
651 isInMassRange((p_trk1 + p_trk2 + p_trk3).M(), m_BcToDplusMuMu_DplusMassRange) &&
652 isInMassRange((p_dimuon + p_trk1 + p_trk2 + p_trk3).M() - p_dimuon.M() + PDG::mJpsi, m_BcToDplusMuMu_massRange)) {
653
654 if (makeCombinations && m_BcToDplusMuMu_useFastFit) state.addTrackCombination(itrk1, itrk2, itrk3);
655 if (!vtx3 && makeFit_vtx3 && (passFastFit_vtx3 || !m_BcToDplusMuMu_useFastFit)) {
656 vtx3 = fit(state.context(), trackParticleLinks_vtx3, kDplus, dimuon);
657 makeFit_vtx3 = false;
658 ++iterations;
659 }
660 if (vtx3 && vtx3->chiSquared() < m_BcToDplusMuMu_chi2 && Lxy(dimuon->position(), *vtx3) > 0.) {
661 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vtx3, xAOD::TrigBphys::BCDPMUMU, {PDG::mPion, PDG::mPion, PDG::mKaon}, dimuonTriggerObjectEL);
662 ATH_CHECK( state.addTriggerObject(trigBphys) );
663 }
664 }
665 vtx3.reset();
666
667 }
668 }
669
670 if (iterations > m_fitAttemptsWarningThreshold && !isOverWarningThreshold) {
671 ATH_MSG_WARNING( "Dimuon + tracks: " << state.trigBphysCollection().size() - nTrigBphysObjects << " vertices created after " << iterations << " vertex fitter calls" );
672 isOverWarningThreshold = true;
673 }
674 if (iterations > m_fitAttemptsBreakThreshold) {
675 ATH_MSG_WARNING( "Dimuon + tracks: the number of fit attempts has exceeded the limit; breaking the loop at this point" );
676 break;
677 }
678 }
679 ATH_MSG_DEBUG( "Dimuon + tracks: " << state.trigBphysCollection().size() - nTrigBphysObjects << " vertices created after " << iterations << " vertex fitter calls" );
680
681 iterations = 0;
682 nTrigBphysObjects = state.trigBphysCollection().size();
683 isOverWarningThreshold = false;
684 // B_c+ -> J/psi(-> mu+ mu-) D*+(-> D0(-> K- pi+) pi+)
685 if (!makeCombinations && m_BcToDstarMuMu && isInMassRange(p_dimuon.M(), m_BcToDstarMuMu_dimuonMassRange)) {
686 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks_D0(2); // {K-, pi+}
687
688 for (size_t itrk1 = 0; itrk1 < selectedTracks.size(); ++itrk1) {
689 const xAOD::TrackParticle* trk1 = *selectedTracks[itrk1];
690
691 trackParticleLinks_D0[0] = selectedTracks[itrk1];
692 auto p_trk1 = trk1->genvecP4();
693 p_trk1.SetM(PDG::mKaon);
694 auto charge1 = trk1->charge();
695
696 for (size_t itrk2 = 0; itrk2 < selectedTracks.size(); ++itrk2) {
697 if (itrk2 == itrk1) continue;
698 const xAOD::TrackParticle* trk2 = *selectedTracks[itrk2];
699
700 trackParticleLinks_D0[1] = selectedTracks[itrk2];
701 auto p_trk2 = trk2->genvecP4();
702 p_trk2.SetM(PDG::mPion);
703 auto charge2 = trk2->charge();
704
705 std::unique_ptr<xAOD::Vertex> D0;
706 if (charge1 * charge2 < 0. &&
707 p_trk1.Pt() > m_BcToDstarMuMu_minD0KaonPt &&
708 p_trk2.Pt() > m_BcToDstarMuMu_minD0PionPt &&
709 isInMassRange((p_trk1 + p_trk2).M(), m_BcToDstarMuMu_D0MassRange) &&
710 isInMassRange((p_dimuon + p_trk1 + p_trk2).M() - p_dimuon.M() + PDG::mJpsi, m_BcToDstarMuMu_massRange)) {
711 D0 = fit(state.context(), trackParticleLinks_D0, kD0, dimuon);
712 ++iterations;
713 }
714 bool isValidD0 = false;
715 if (D0 && D0->chiSquared() < m_BcToDstarMuMu_chi2 && Lxy(dimuon->position(), *D0) > 0.) {
716 isValidD0 = true;
717 ATH_MSG_DEBUG( "Partially reconstructed B_c+(-> mu+ mu- D0 X) candidate has been created" );
718 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *D0, xAOD::TrigBphys::DZKPI, s_trkMass[kD0], dimuonTriggerObjectEL);
719 ATH_CHECK( state.addTriggerObject(trigBphys) );
720 }
721
722 if (m_BcToDstarMuMu_makeDstar && isValidD0) { // full B_c+ reconstruction
724
725 for (size_t itrk3 = 0; itrk3 < selectedTracks.size(); ++itrk3) {
726 const xAOD::TrackParticle* trk3 = *selectedTracks[itrk3];
727 if (itrk3 == itrk1 || itrk3 == itrk2) continue;
728
729 // J/psi + pion from D*+
730 trackParticleLinks_vtx1[2] = selectedTracks[itrk3];
731 auto p_trk3 = trk3->genvecP4();
732 p_trk3.SetM(PDG::mPion);
733
734 if (p_trk3.Pt() > m_BcToDstarMuMu_minDstarPionPt &&
736 isInMassRange((p_D0 + p_trk3).M() - p_D0.M() + PDG::mD0, m_BcToDstarMuMu_DstarMassRange)) {
737 auto Bc_vtx1 = fit(state.context(), trackParticleLinks_vtx1, kB_PsiPi);
738 ++iterations;
739
740 if (Bc_vtx1 && Bc_vtx1->chiSquared() < m_BcToDstarMuMu_chi2) {
741 ATH_MSG_DEBUG( "Decay vertex(mu+ mu- D*+.pi+) for B_c+ candidate has been created" );
742 xAOD::TrigBphys* triggerObject_vtx1 = makeTriggerObject(state, *Bc_vtx1, xAOD::TrigBphys::DSTDZPI, s_trkMass[kB_PsiPi], dimuonTriggerObjectEL);
743 auto triggerObjectEL_vtx1 = ElementLink<xAOD::TrigBphysContainer>(state.trigBphysCollection(), state.trigBphysCollection().size());
744 ATH_CHECK( state.addTriggerObject(triggerObject_vtx1) );
745 ATH_CHECK( triggerObjectEL_vtx1.isValid() );
746
747 // refit D0 vertex
748 auto Bc_vtx2 = fit(state.context(), trackParticleLinks_D0, kD0, Bc_vtx1.get());
749 ++iterations;
750 if (Bc_vtx2 && Bc_vtx2->chiSquared() < m_BcToDstarMuMu_chi2) {
751 ATH_MSG_DEBUG( "Fully reconstructed B_c+(-> mu+ mu- D*+) candidate has been created" );
752 xAOD::TrigBphys* triggerObject_vtx2 = makeTriggerObject(state, *Bc_vtx2, xAOD::TrigBphys::BCDSTMUMU, s_trkMass[kD0], triggerObjectEL_vtx1);
753 ATH_CHECK( state.addTriggerObject(triggerObject_vtx2) );
754 }
755 }
756 }
757 }
758 } // end of full B_c+ reconstruction
759
760 }
761
762 if (iterations > m_fitAttemptsWarningThreshold && !isOverWarningThreshold) {
763 ATH_MSG_WARNING( "B_c+ -> mu+ mu- D*+: " << state.trigBphysCollection().size() - nTrigBphysObjects << " vertices created after " << iterations << " vertex fitter calls" );
764 isOverWarningThreshold = true;
765 }
766 if (iterations > m_fitAttemptsBreakThreshold) {
767 ATH_MSG_WARNING( "B_c+ -> mu+ mu- D*+: the number of fit attempts has exceeded the limit; breaking the loop at this point" );
768 break;
769 }
770 }
771 ATH_MSG_DEBUG( "B_c+ -> mu+ mu- D*+: " << state.trigBphysCollection().size() - nTrigBphysObjects << " vertices created after " << iterations << " vertex fitter calls" );
772
773 } // end of B_c+ -> J/psi D*+ topology
774
775 return StatusCode::SUCCESS;
776}
static const int D0
Definition AtlasPID.h:119
int charge3(const T &p)
Definition AtlasPID.h:997
Amg::Vector3D beamSpotPosition() const
Gaudi::Property< bool > m_BcToDplusMuMu_useFastFit
Gaudi::Property< std::pair< double, double > > m_BcToMuMuPion_massRange
Gaudi::Property< float > m_BdToMuMuKstar0_chi2
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
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< 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
Gaudi::Property< bool > m_LambdaBToMuMuProtonKaon
Gaudi::Property< double > m_BcToMuMuPion_minPionPt
Gaudi::Property< float > m_BsToMuMuPhi1020_chi2
Gaudi::Property< bool > m_BcToDsMuMu_useFastFit
Gaudi::Property< double > m_BsToMuMuPhi1020_minKaonPt
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
Gaudi::Property< std::pair< double, double > > m_LambdaBToMuMuProtonKaon_massRange
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
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
Gaudi::Property< std::pair< double, double > > m_BcToDplusMuMu_dimuonMassRange
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
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< size_t > m_fitAttemptsWarningThreshold
Gaudi::Property< float > m_LambdaBToMuMuProtonKaon_chi2
Gaudi::Property< std::pair< double, double > > m_BcToMuMuPion_dimuonMassRange
Gaudi::Property< bool > m_BsToMuMuPhi1020_rejectSameChargeTracks
Gaudi::Property< float > m_BcToDplusMuMu_chi2
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_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.
std::map< const xAOD::TrackParticle *, double > selectedTrackZ0
void addTrackCombination(size_t i1)
bool isBadCombination(size_t i1) const
StatusCode addTriggerObject(xAOD::TrigBphys *triggerObject)
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.
const Amg::Vector3D & position() const
Returns the 3-pos.
TrackParticle_v1 TrackParticle
Reference the current persistent version:

◆ findBmumuxCandidates_selectTracks()

StatusCode TrigBmumuxComboHypo::findBmumuxCandidates_selectTracks ( TrigBmumuxState & state,
size_t dimuonIndex ) const
private

Select tracks in vicinity of given dimuon vertex.

Definition at line 340 of file TrigBmumuxComboHypo.cxx.

340 {
341
342 auto& selectedTracks = state.selectedTracks;
343 auto& selectedTrackZ0 = state.selectedTrackZ0;
344
345 selectedTracks.clear();
346 selectedTrackZ0.clear();
347
348 const xAOD::Vertex* dimuon = state.dimuons.get(dimuonIndex);
349
350 std::vector<const xAOD::Muon*> muons(2, nullptr);
351 const auto& muonIndices = state.trigBphysMuonIndices.at(dimuonIndex);
352 for (size_t i = 0; i < 2; ++i) {
353 const auto& muon = state.muons.at(muonIndices[i]);
354 muons[i] = *muon.link;
355 }
356
357 const xAOD::TrackParticle* mu1 = dimuon->trackParticle(0);
358 const xAOD::TrackParticle* mu2 = dimuon->trackParticle(1);
359
360 // check impact parameter of the track with respect to the fitted dimuon vertex
361 // we can safely omit tracks with large z0
362 state.selectedTracks.reserve(state.tracks.size());
363 for (const auto& trackEL : state.tracks) {
364 if (state.isCompositeRoI && !isInSameRoI(muons[0], *trackEL) && !isInSameRoI(muons[1], *trackEL)) continue;
365 if (m_trkZ0 > 0.) {
366 std::unique_ptr<const Trk::Perigee> perigee(m_trackToVertexTool->perigeeAtVertex(state.context(), **trackEL, dimuon->position()));
367 if (perigee && std::abs(perigee->parameters()[Trk::z0]) < m_trkZ0) {
368 selectedTracks.push_back(trackEL);
369 selectedTrackZ0[*trackEL] = perigee->parameters()[Trk::z0];
370 }
371 }
372 else {
373 selectedTracks.push_back(trackEL);
374 selectedTrackZ0[*trackEL] = -1000.;
375 }
376 }
377
378 // remove muon duplicates
379 if (selectedTracks.size() < 2) {
380 ATH_MSG_DEBUG( "Found no tracks consistent with dimuon vertex " << dimuonIndex );
381 selectedTracks.clear();
382 selectedTrackZ0.clear();
383 return StatusCode::SUCCESS;
384 }
385 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()); });
386 if (isIdenticalTracks(mu1, *selectedTracks.back())) selectedTracks.pop_back();
387 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()); });
388 if (isIdenticalTracks(mu2, *selectedTracks.back())) selectedTracks.pop_back();
389 std::sort(selectedTracks.begin(), selectedTracks.end(), [](const auto& lhs, const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
390
391 ATH_MSG_DEBUG( "Found " << selectedTracks.size() << " tracks consistent with dimuon vertex " << dimuonIndex );
392
393 return StatusCode::SUCCESS;
394}
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
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 ...
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
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
@ z0
Definition ParamDefs.h:64

◆ findDimuonCandidates()

StatusCode TrigBmumuxComboHypo::findDimuonCandidates ( TrigBmumuxState & state) const
private

Make all possible dimuon combinations from state.muons(), fit muon InDet tracks to the common vertex, dimuon vertices are stored in state.dimuons() and in state.trigBphysCollection() (as xAOD::TrigBphys objects).

Definition at line 241 of file TrigBmumuxComboHypo.cxx.

241 {
242
243 auto mon_nDimuon = Monitored::Scalar<int>("nDimuon", 0);
244 auto group = Monitored::Group(m_monTool, mon_nDimuon);
245
246 const auto& muons = state.muons;
247 std::vector<ElementLink<xAOD::TrackParticleContainer>> trackParticleLinks(2);
248 std::vector<const DecisionIDContainer*> previousDecisionIDs(2, nullptr);
249
250 for (size_t itrk1 = 0; itrk1 < muons.size(); ++itrk1) {
251 const xAOD::Muon* mu1 = *muons[itrk1].link;
252 trackParticleLinks[0] = ::linkTrack(mu1->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle));
253 previousDecisionIDs[0] = &muons[itrk1].decisionIDs;
254 const xAOD::TrackParticle* trk1 = *trackParticleLinks[0];
255 auto p1 = trk1->genvecP4();
256 p1.SetM(PDG::mMuon);
257 auto charge1 = trk1->charge();
258
259 for (size_t itrk2 = itrk1 + 1; itrk2 < muons.size(); ++itrk2) {
260 const xAOD::Muon* mu2 = *muons[itrk2].link;
261 trackParticleLinks[1] = ::linkTrack(mu2->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle));
262 //cppcheck-suppress objectIndex
263 previousDecisionIDs[1] = &muons[itrk2].decisionIDs;
264 const xAOD::TrackParticle* trk2 = *trackParticleLinks[1];
265 auto p2 = trk2->genvecP4();
266 p2.SetM(PDG::mMuon);
267 auto charge2 = trk2->charge();
268
269 double mass = (p1 + p2).M();
270
271 ATH_MSG_DEBUG( "muon 1: " << p1.Pt()<< " / " << p1.Eta() << " / " << p1.Phi() << " / " << trk1->charge() );
272 ATH_MSG_DEBUG( "muon 2: " << p2.Pt()<< " / " << p2.Eta() << " / " << p2.Phi() << " / " << trk2->charge() );
273 ATH_MSG_DEBUG( "track pair mass: " << mass );
274
275 if (m_dimuon_rejectSameChargeTracks && charge1 * charge2 > 0.) {
276 ATH_MSG_DEBUG( "muon pair is rejected by opposite charge check" );
277 continue;
278 }
279
280 if (!passDimuonTrigger(previousDecisionIDs)) {
281 ATH_MSG_DEBUG( "muon pair did not pass passDimuonTrigger() check" );
282 continue;
283 }
284
285 if (!isInMassRange(mass, m_dimuon_massRange)) {
286 ATH_MSG_DEBUG( "muon pair is out of the requested mass range" );
287 continue;
288 }
289
290 // fit muons to the common vertex and pass this vertex to the dimuons collection which also takes the ownership of the created object
291 auto vertex = fit(state.context(), trackParticleLinks);
292 if (!vertex) continue;
293
294 // convert vertex to trigger object and add it to the output xAOD::TrigBphysContainer
295 xAOD::TrigBphys* trigBphys = makeTriggerObject(state, *vertex);
296 if (!trigBphys) {
297 ATH_MSG_ERROR( "xAOD::Vertex could not be converted to xAOD::TrigBphys object: please enable MakeExtendedVertex option in vertex fitter " << m_vertexFitter->name() );
298 return StatusCode::FAILURE;
299 }
300
301 // the dimuon vertex in the xAOD::TrigBphysContainer is used as a reference for the upcoming B-candidates and to fire bBmumux_idperf chain
302 state.dimuons.push_back(vertex.release());
303 state.trigBphysMuonIndices.emplace_back(std::array<size_t, 2>{itrk1, itrk2});
304 state.trigBphysCollection().push_back(trigBphys);
305 }
306 }
307 mon_nDimuon = state.dimuons.size();
308 ATH_MSG_DEBUG( "Found " << state.dimuons.size() << " dimuon candidates" );
309
310 return StatusCode::SUCCESS;
311}
ElementLink< xAOD::TrackParticleContainer > linkTrack(const xAOD::TrackParticle *trk)
value_type push_back(value_type pElem)
Add an element to the end of the collection.
Gaudi::Property< bool > m_dimuon_rejectSameChargeTracks
ToolHandle< Trk::TrkVKalVrtFitter > m_vertexFitter
bool passDimuonTrigger(const std::vector< const TrigCompositeUtils::DecisionIDContainer * > &previousDecisionIDs) const
Gaudi::Property< std::pair< double, double > > m_dimuon_massRange
const TrackParticle * trackParticle(TrackParticleType type) const
Returns a pointer (which can be a nullptr) to the TrackParticle used in identification of this muon.
Definition Muon_v1.cxx:422
std::vector< ElementLink< xAOD::TrackParticleContainer > > trackParticleLinks(const xAOD::TauJet *tau, xAOD::TauJetParameters::TauTrackFlag flag=xAOD::TauJetParameters::TauTrackFlag::classifiedCharged)
Muon_v1 Muon
Reference the current persistent version:
Definition Muon.h:13

◆ fit()

std::unique_ptr< xAOD::Vertex > TrigBmumuxComboHypo::fit ( const EventContext & context,
const std::vector< ElementLink< xAOD::TrackParticleContainer > > & trackParticleLinks,
Decay decay = kPsi_2mu,
const xAOD::Vertex * dimuon = nullptr ) const
private

Perform a vertex fit on selected tracks.

Parameters
contextthe event context used to make the vertex threadsafe.
trackParticleLinksthe trackParticles to fit
decaythe decay enumerator to specify the mass contraints
dimuonThe dimuon vertex position can be used as the initial position to increase effeciency
Returns
The fitted vertex - null if fit fails or is very low quality

Definition at line 872 of file TrigBmumuxComboHypo.cxx.

876 {
877
878 ATH_MSG_VERBOSE( "Perform vertex fit" );
879
880 if (trackParticleLinks.size() < 2) {
881 ATH_MSG_WARNING( "At least two tracks should be given to the vertex fitter" );
882 return nullptr;
883 }
884
885 std::vector<const xAOD::TrackParticle*> tracklist(trackParticleLinks.size(), nullptr);
886 std::transform(trackParticleLinks.begin(), trackParticleLinks.end(), tracklist.begin(),
887 [](const ElementLink<xAOD::TrackParticleContainer>& link){ return *link; });
888
889 Amg::Vector3D startingPoint = Amg::Vector3D::Zero(3);
890 if (dimuon) {
891 startingPoint = Amg::Vector3D(dimuon->x(), dimuon->y(), dimuon->z());
892 }
893 else {
894 if (decay != Decay::kPsi_2mu && decay != Decay::kB_PsiPi && decay != Decay::kFastFit_2trk) {
895 ATH_MSG_WARNING( "Already fitted dimuon vertex should be provided for B -> mu1 mu2 trk1 .. trkN decay as a starting point for fitter" );
896 }
897 int flag = 0;
898 int errorcode = 0;
899 const Trk::Perigee& perigee1 = tracklist[0]->perigeeParameters();
900 const Trk::Perigee& perigee2 = tracklist[1]->perigeeParameters();
901 startingPoint = m_vertexPointEstimator->getCirclesIntersectionPoint(&perigee1, &perigee2, flag, errorcode);
902 if (errorcode != 0) startingPoint = Amg::Vector3D::Zero(3);
903 }
904 ATH_MSG_VERBOSE( "Starting point: (" << startingPoint(0) << ", " << startingPoint(1) << ", " << startingPoint(2) << ")" );
905
906 auto fitterState = m_vertexFitter->makeState(context);
907 m_vertexFitter->setMassInputParticles(s_trkMass[static_cast<size_t>(decay)], *fitterState);
908
909 // the combined momentum of D+/D_s+ candidate is constrained to point to the dimuon vertex
910 if (dimuon && (decay == Decay::kDs || decay == Decay::kDplus || decay == Decay::kD0)) {
911 m_vertexFitter->setVertexForConstraint(*dimuon, *fitterState);
912 m_vertexFitter->setCnstType(8, *fitterState);
913 }
914
915 std::unique_ptr<xAOD::Vertex> vertex(m_vertexFitter->fit(tracklist, startingPoint, *fitterState));
916 if (!vertex) {
917 ATH_MSG_VERBOSE( "Vertex fit fails" );
918 return vertex;
919 }
920 if (vertex->chiSquared() > 150. || (decay == Decay::kPsi_2mu && vertex->chiSquared() > m_dimuon_chi2)) {
921 ATH_MSG_VERBOSE( "Fit is successful, but vertex chi2 is too high, we are not going to save it (chi2 = " << vertex->chiSquared() << ")" );
922 vertex.reset();
923 return vertex;
924 }
925 ATH_MSG_VERBOSE( "Fit is successful" );
926
927 // update trackParticleLinks()
928 vertex->clearTracks();
929 vertex->setTrackParticleLinks(trackParticleLinks);
930
931 return vertex;
932}
Gaudi::Property< double > m_dimuon_chi2
ToolHandle< InDet::VertexPointEstimator > m_vertexPointEstimator
float z() const
Returns the z position.
float y() const
Returns the y position.
float x() const
Returns the x position.
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
bool flag
Definition master.py:29

◆ hypoTools() [1/2]

ToolHandleArray< ComboHypoToolBase > & ComboHypo::hypoTools ( )
inlineprotectedinherited

Definition at line 45 of file ComboHypo.h.

45{ return m_hypoTools; }
ToolHandleArray< ComboHypoToolBase > m_hypoTools
Definition ComboHypo.h:104

◆ hypoTools() [2/2]

const ToolHandleArray< ComboHypoToolBase > & ComboHypo::hypoTools ( ) const
inlineprotectedinherited

Definition at line 46 of file ComboHypo.h.

46{ return m_hypoTools; }

◆ initialize()

StatusCode TrigBmumuxComboHypo::initialize ( )
overridevirtual

Reimplemented from ComboHypo.

Definition at line 57 of file TrigBmumuxComboHypo.cxx.

57 {
58 ATH_MSG_DEBUG( "TrigBmumuxComboHypo::initialize()" );
59
61
62 ATH_CHECK( m_muonContainerKey.initialize() );
66 ATH_CHECK( m_trigBphysContainerKey.initialize() );
67 ATH_CHECK( m_beamSpotKey.initialize() );
68
69 ATH_CHECK( m_vertexFitter.retrieve() );
71 ATH_CHECK( m_trackToVertexTool.retrieve() );
72
73 // allowed IDs to filter out incoming decisions at L2 level
74 for (const auto& item : triggerMultiplicityMap()) {
75 const HLT::Identifier id = HLT::Identifier(item.first);
76 m_allowedIDs.insert(id.numeric());
77 if (item.second.size() > 1) {
78 for (size_t i = 0; i < item.second.size(); i++) {
79 m_allowedIDs.insert(TrigCompositeUtils::createLegName(id, i).numeric());
80 }
81 }
82 }
83 if (msgLvl(MSG::DEBUG)) {
84 ATH_MSG_DEBUG( "Allowed decisions:" );
85 for (const DecisionID& id : m_allowedIDs) {
86 ATH_MSG_DEBUG( " +++ " << HLT::Identifier(id) );
87 }
88 }
89
90 if (!m_monTool.empty()) {
91 ATH_CHECK( m_monTool.retrieve() );
92 ATH_MSG_DEBUG( "GenericMonitoringTool name:" << m_monTool );
93 }
94 else {
95 ATH_MSG_DEBUG( "No GenericMonitoringTool configured: no monitoring histograms will be available" );
96 }
97
98 return StatusCode::SUCCESS;
99}
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)
const Combo::MultiplicityReqMap & triggerMultiplicityMap() const
Definition ComboHypo.h:43
virtual StatusCode initialize() override
Definition ComboHypo.cxx:22
TrigCompositeUtils::DecisionIDContainer m_allowedIDs
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleContainerKey
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainerKey
HLT::Identifier createLegName(const HLT::Identifier &chainIdentifier, size_t counter)
Generate the HLT::Identifier which corresponds to a specific leg of a given chain.

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::isClonable ( ) const
inlineoverridevirtualinherited

Specify if the algorithm is clonable.

Only relevant for non-reentrant algorithms. Actual number of clones needs to be set via the "Cardinality" property.

Reimplemented in AFP_DigiTop, AlgB, AlgT, BCM_Digitization, CscDigitBuilder, CscDigitToCscRDO, G4AtlasAlg, G4RunAlg, HGTD_Digitization, HiveAlgBase, InDet::GNNSeedingTrackMaker, InDet::SCT_Clusterization, InDet::SiSPGNNTrackMaker, InDet::SiSPSeededTrackFinder, InDet::SiTrackerSpacePointFinder, ISF::SimKernelMT, ITk::StripDigitization, ITkPixelCablingAlg, ITkStripCablingAlg, LArHitEMapMaker, LArTTL1Maker, LUCID_DigiTop, LVL1::L1TopoSimulation, MergeCalibHits, MergeGenericMuonSimHitColl, MergeHijingPars, MergeMcEventCollection, MergeTrackRecordCollection, MergeTruthJets, MergeTruthParticles, MuonDigitizer, PileUpMTAlg, PixelDigitization, RoIBResultToxAOD, SCT_ByteStreamErrorsTestAlg, SCT_CablingCondAlgFromCoraCool, SCT_CablingCondAlgFromText, SCT_ConditionsParameterTestAlg, SCT_ConditionsSummaryTestAlg, SCT_ConfigurationConditionsTestAlg, SCT_Digitization, SCT_FlaggedConditionTestAlg, SCT_LinkMaskingTestAlg, SCT_MajorityConditionsTestAlg, SCT_ModuleVetoTestAlg, SCT_MonitorConditionsTestAlg, SCT_PrepDataToxAOD, SCT_RawDataToxAOD, SCT_ReadCalibChipDataTestAlg, SCT_ReadCalibDataTestAlg, SCT_RODVetoTestAlg, SCT_SensorsTestAlg, SCT_SiliconConditionsTestAlg, SCT_StripVetoTestAlg, SCT_TdaqEnabledTestAlg, SCT_TestCablingAlg, SCTEventFlagWriter, SCTRawDataProvider, SCTSiLorentzAngleTestAlg, SCTSiPropertiesTestAlg, SGInputLoader, Simulation::BeamEffectsAlg, TileHitVecToCnt, TileMuonFitter, TilePulseForTileMuonReceiver, TileRawChannelMaker, TRTDigitization, and ZDC_DigiTop.

Definition at line 68 of file AthCommonAlgorithm.h.

68 {
69 return true;
70 }

◆ isIdenticalTracks() [1/2]

bool TrigBmumuxComboHypo::isIdenticalTracks ( const xAOD::Muon * lhs,
const xAOD::Muon * rhs ) const
private

◆ isIdenticalTracks() [2/2]

bool TrigBmumuxComboHypo::isIdenticalTracks ( const xAOD::TrackParticle * lhs,
const xAOD::TrackParticle * rhs ) const
private

Attempts to identify identical tracks by selection on DeltaR.

Returns
true if 'identical', false otherwise

Definition at line 1008 of file TrigBmumuxComboHypo.cxx.

1008 {
1009
1010 if (lhs->charge() * rhs->charge() < 0.) return false;
1011 return (ROOT::Math::VectorUtil::DeltaR(lhs->genvecP4(), rhs->genvecP4()) < m_deltaR);
1012}
Gaudi::Property< double > m_deltaR

◆ isInMassRange()

bool TrigBmumuxComboHypo::isInMassRange ( double mass,
const std::pair< double, double > & range ) const
inlineprivate

Checks that the given mass value falls into the specified range.

Definition at line 229 of file TrigBmumuxComboHypo.h.

229{ return (mass > range.first && mass < range.second); }

◆ isInSameRoI()

bool TrigBmumuxComboHypo::isInSameRoI ( const xAOD::Muon * muon,
const xAOD::TrackParticle * track ) const
private

Attempts to identify if the track is in the same RoI as the muon by comparing the angle with the RoI limits.

Returns
true if in same RoI

Definition at line 1022 of file TrigBmumuxComboHypo.cxx.

1022 {
1023
1024 auto p_mu = muon->genvecP4();
1025 auto p_trk = track->genvecP4();
1026 return (ROOT::Math::VectorUtil::DeltaPhi(p_mu, p_trk) < m_roiPhiWidth && std::abs(p_mu.eta() - p_trk.eta()) < m_roiEtaWidth);
1027}
Gaudi::Property< double > m_roiPhiWidth
Gaudi::Property< double > m_roiEtaWidth

◆ legToInputCollectionMap()

const Combo::LegMap & ComboHypo::legToInputCollectionMap ( ) const
inlineprotectedinherited

Definition at line 44 of file ComboHypo.h.

44{ return m_legToInputCollectionMap.value(); }

◆ Lxy()

double TrigBmumuxComboHypo::Lxy ( const Amg::Vector3D & productionVertex,
const xAOD::Vertex & decayVertex ) const
private

Calculate the Lxy (~distance between vertices) It is defined as the transverse distance between the production and decay vertices projected along the transverse momentum of the particle.

Returns
The Lxy value in [mm]

Definition at line 1030 of file TrigBmumuxComboHypo.cxx.

1030 {
1031
1032 XYVector R(decayVertex.x() - productionVertex.x(), decayVertex.y() - productionVertex.y());
1033 XYVector pT;
1034
1035 if (!decayVertex.vxTrackAtVertexAvailable()) return -100.;
1036 const auto& tracks = decayVertex.vxTrackAtVertex();
1037 for (const auto& track : tracks) {
1038 const Trk::TrackParameters* perigee = track.perigeeAtVertex();
1039 if (!perigee) return -100.;
1040 const Amg::Vector3D& momentum = perigee->momentum();
1041 pT += XYVector(momentum.x(), momentum.y());
1042 }
1043 return R.Dot(pT.unit());
1044}
const Amg::Vector3D & momentum() const
Access method for the momentum.
bool vxTrackAtVertexAvailable() const
Check if VxTrackAtVertices are attached to the object.
std::vector< Trk::VxTrackAtVertex > & vxTrackAtVertex()
Non-const access to the VxTrackAtVertex vector.
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ makeTriggerObject()

xAOD::TrigBphys * TrigBmumuxComboHypo::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
private

Construct the trigger object that may be stored for debugging or matching.

Parameters
stateEvent object containing the current events selections
typedecay type enumerator. Corresponds to EDM definitions
trkMassTrack mass hypothesis for mass calculations
dimuonLinkAssociated dimuon container
Returns
Pointer to the TrigBphys object

Definition at line 935 of file TrigBmumuxComboHypo.cxx.

940 {
941
942 const xAOD::TrigBphys* dimuon = (type != xAOD::TrigBphys::MULTIMU ? *dimuonLink : nullptr);
944
945 // refitted track momentum as a 4-vector for mass hypothesis defined by the given decay value
947 std::vector<xAOD::TrackParticle::GenVecFourMom_t> momenta;
948 if (!vertex.vxTrackAtVertexAvailable()) return nullptr;
949 for (size_t i = 0; i < vertex.vxTrackAtVertex().size(); ++i) {
950 const Trk::TrackParameters* perigee = vertex.vxTrackAtVertex()[i].perigeeAtVertex();
951 if (!perigee) return nullptr;
952 const Amg::Vector3D& p = perigee->momentum();
953 momenta.emplace_back(p.x(), p.y(), p.z(), trkMass[i]);
954 momentum += momenta.back();
955 }
956 if (isCascadeDecay) {
957 momentum += ROOT::Math::PtEtaPhiMVector(dimuon->pt(), dimuon->eta(), dimuon->phi(), dimuon->mass());
958 }
959
960 auto result = new xAOD::TrigBphys();
961 result->makePrivateStore();
962
963 float mass = momentum.M();
964 if (type == xAOD::TrigBphys::BCDSTMUMU) {
965 mass += PDG::mD0 - (momenta[0] + momenta[1]).M();
966 }
967 else if (type != xAOD::TrigBphys::MULTIMU) {
968 mass += PDG::mJpsi - (isCascadeDecay ? dimuon->mass() : (momenta[0] + momenta[1]).M());
969 }
970
971 result->initialise(0, momentum.Eta(), momentum.Phi(), momentum.Pt(), type, mass, xAOD::TrigBphys::EF);
972
973 result->setFitmass(momentum.M());
974 result->setFitx(vertex.x());
975 result->setFity(vertex.y());
976 result->setFitz(vertex.z());
977 result->setFitchi2(vertex.chiSquared());
978 result->setFitndof(vertex.numberDoF());
979
980 Amg::Vector3D productionVertex = (isCascadeDecay ? Amg::Vector3D(dimuon->fitx(), dimuon->fity(), dimuon->fitz()) : state.beamSpotPosition());
981 result->setLxy(Lxy(productionVertex, vertex));
982
983 // set all the particles associated with the decay
984 result->setTrackParticleLinks(vertex.trackParticleLinks());
985
986 // use lowerChainLink() as a link to the preceding dimuon trigger object
987 if (type != xAOD::TrigBphys::MULTIMU) {
988 result->setLowerChainLink(dimuonLink);
989 }
990
992 "TrigBphys object:\n\t " <<
993 "roiId: " << result->roiId() << "\n\t " <<
994 "particleType: " << result->particleType() << "\n\t " <<
995 "level: " << result->level() << "\n\t " <<
996 "eta: " << result->eta() << "\n\t " <<
997 "phi: " << result->phi() << "\n\t " <<
998 "mass: " << result->mass() << "\n\t " <<
999 "fitmass: " << result->fitmass() << "\n\t " <<
1000 "chi2/NDF: " << result->fitchi2() << " / " << result->fitndof() << "\n\t " <<
1001 "vertex: (" << result->fitx() << ", " << result->fity() << ", " << result->fitz() << ")" << "\n\t " <<
1002 "Lxy: " << result->lxy() );
1003
1004 return result;
1005}
if(pathvar)
float pt() const
accessor method: pt
float eta() const
accessor method: eta
float phi() const
accessor method: phi
float fitx() const
accessor method: x position of vertex
float fitz() const
accessor method: z position of vertex
float mass() const
accessor method: mass
float fity() const
accessor method: y position of vertex

◆ mergeMuonsFromDecisions()

StatusCode TrigBmumuxComboHypo::mergeMuonsFromDecisions ( TrigBmumuxState & state) const
private

Go through state.previousDecisions(), fetch xAOD::Muons objects attached to decisions and save links to them in state.muons().

Definition at line 136 of file TrigBmumuxComboHypo.cxx.

136 {
137
138 auto& muons = state.muons;
139 muons.clear();
140
141 // all muons from views are already connected with previous decisions by TrigMuonEFHypoAlg
142 for (const Decision* decision : state.previousDecisions()) {
144 auto muonEL = decision->objectLink<xAOD::MuonContainer>(TrigCompositeUtils::featureString());
145 const xAOD::Muon* muon = *muonEL;
146 if (!muon->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle)) continue;
147
148 auto decisionEL = TrigCompositeUtils::decisionToElementLink(decision, state.context());
149 auto itr = std::find_if(muons.begin(), muons.end(), [this, muon](const auto& x){ return isIdenticalTracks(muon, *x.link); });
150 if (itr == muons.end()) {
151 muons.push_back({muonEL, std::vector<ElementLink<DecisionContainer>>(1, decisionEL), DecisionIDContainer()});
152 }
153 else {
154 (*itr).decisionLinks.push_back(decisionEL);
155 }
156 }
157
158 // muon->pt() is equal to muon->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle)->pt()
159 // and the later is used by TrigMuonEFHypoTool for classification of muEFCB candidates
160 std::sort(muons.begin(), muons.end(), [](const auto& lhs, const auto& rhs){ return ((*lhs.link)->pt() > (*rhs.link)->pt()); });
161
162 // for each muon we extract DecisionIDs stored in the associated Decision objects and copy them at muon.decisionIDs
163 for (auto& item : muons) {
164 for (const ElementLink<xAOD::TrigCompositeContainer>& decisionEL : item.decisionLinks) {
165 TrigCompositeUtils::decisionIDs(*decisionEL, item.decisionIDs);
166 }
167 }
168
169 if (msgLvl(MSG::DEBUG)) {
170 ATH_MSG_DEBUG( "Dump found muons before vertex fit: " << muons.size() << " candidates" );
171 for (const auto& item : muons) {
172 const xAOD::Muon* muon = *item.link;
173 const xAOD::TrackParticle* track = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
174 ATH_MSG_DEBUG( " -- muon InDetTrackParticle pt/eta/phi/q: " << track->pt() << " / " << track->eta() << " / " << track->phi() << " / " << track->charge() );
175 ATH_MSG_DEBUG( " muon CombinedTrackParticle pt: " << muon->pt() );
176 ATH_MSG_DEBUG( " allowed decisions:" );
177 for (const DecisionID& id : item.decisionIDs) {
178 ATH_MSG_DEBUG( " +++ " << HLT::Identifier(id) );
179 }
180 }
181 }
182
183 return StatusCode::SUCCESS;
184}
#define x
const TrigCompositeUtils::DecisionContainer & previousDecisions() const
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".

◆ mergeTracksFromViews()

StatusCode TrigBmumuxComboHypo::mergeTracksFromViews ( TrigBmumuxState & state) const
private

Go through state.previousDecisions() and fetch xAOD::TrackParticle objects associated with the nearest SG::View.

Enable overlap removal to get collection of unique objects at state.tracks().

Definition at line 187 of file TrigBmumuxComboHypo.cxx.

187 {
188
189 auto& tracks = state.tracks;
190 tracks.clear();
191
192 size_t viewCounter = 0;
193 for (const Decision* decision : state.previousDecisions()) {
194 auto viewLinkInfo = TrigCompositeUtils::findLink<ViewContainer>(state.context(), decision, TrigCompositeUtils::viewString(), true);
195 ATH_CHECK( viewLinkInfo.isValid() );
196 auto view = *viewLinkInfo.link;
197
199 ATH_CHECK( roiLinkInfo.isValid() );
200 const auto roi = *roiLinkInfo.link;
201
202 auto tracksHandle = ViewHelper::makeHandle(view, m_trackParticleContainerKey, state.context());
203 ATH_CHECK( tracksHandle.isValid() );
204 ATH_MSG_DEBUG( "tracks handle " << m_trackParticleContainerKey << " size: " << tracksHandle->size() );
205
206 std::vector<ElementLink<xAOD::TrackParticleContainer>> tracksFromView;
207 tracksFromView.reserve(tracksHandle->size());
208 for (size_t idx = 0; idx < tracksHandle->size(); ++idx) {
209 tracksFromView.emplace_back(ViewHelper::makeLink<xAOD::TrackParticleContainer>(view, tracksHandle, idx));
210 }
211
212 for (const auto& trackEL : tracksFromView) {
213 const xAOD::TrackParticle* track = *trackEL;
214 if (track->definingParametersCovMatrixVec().empty()) continue;
215
216 if (viewCounter == 0 ||
217 std::find_if(tracks.begin(), tracks.end(),
218 [this, track](const auto& x){ return isIdenticalTracks(track, *x); }) == tracks.end()) {
219 tracks.emplace_back(trackEL);
220 }
221 }
222 viewCounter++;
223 if (roi->composite()) {
224 state.isCompositeRoI = true;
225 break;
226 }
227 }
228 std::sort(tracks.begin(), tracks.end(), [](const auto& lhs, const auto& rhs){ return ((*lhs)->pt() > (*rhs)->pt()); });
229
230 if (msgLvl(MSG::DEBUG)) {
231 ATH_MSG_DEBUG( "Dump found tracks before vertex fit: " << tracks.size() << " candidates" );
232 for (const auto& trackEL : tracks) {
233 const xAOD::TrackParticle* track = *trackEL;
234 ATH_MSG_DEBUG( " -- track pt/eta/phi/q: " << track->pt() << " / " << track->eta() << " / " << track->phi() << " / " << track->charge() );
235 }
236 }
237 return StatusCode::SUCCESS;
238}
const std::string & viewString()
const std::string & roiString()
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

◆ momentum()

xAOD::TrackParticle::GenVecFourMom_t TrigBmumuxComboHypo::momentum ( const xAOD::Vertex & vertex,
const std::vector< double > & trkMass ) const
private

Calculate 4-momentum of the fitted vertex particle assuming the given masses.

Parameters
vertexthe fitted vertex linking to the original tracks
themass hypothesis for the given tracks in the vertex
Returns
The 4-momentum of the vertexed hypothesis

Definition at line 1047 of file TrigBmumuxComboHypo.cxx.

1047 {
1048
1050 for (size_t i = 0; i < vertex.vxTrackAtVertex().size(); ++i) {
1051 const Trk::TrackParameters* perigee = vertex.vxTrackAtVertex()[i].perigeeAtVertex();
1052 const Amg::Vector3D& p = perigee->momentum();
1053 momentum += xAOD::TrackParticle::GenVecFourMom_t(p.x(), p.y(), p.z(), trkMass[i]);
1054 }
1055 return momentum;
1056}

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ passDimuonTrigger()

bool TrigBmumuxComboHypo::passDimuonTrigger ( const std::vector< const TrigCompositeUtils::DecisionIDContainer * > & previousDecisionIDs) const
private

Definition at line 1059 of file TrigBmumuxComboHypo.cxx.

1059 {
1060
1061 if (previousDecisionIDs.size() != 2) {
1062 ATH_MSG_WARNING( "TrigBmumuxComboHypo::passDimuonTrigger() expects exactly two containers with previous decision IDs" );
1063 return false;
1064 }
1065
1066 for (const auto& tool : hypoTools()) {
1067 const std::vector<HLT::Identifier>& legDecisionIDs = tool->legDecisionIds();
1068 if (legDecisionIDs.size() == 1 && tool->legMultiplicity().at(0) >= 2) {
1069 // trigger with symmetric legs like HLT_2mu4_bBmumux_BsmumuPhi_L12MU4
1070 const DecisionID id = legDecisionIDs[0].numeric();
1071 if (TrigCompositeUtils::passed(id, *previousDecisionIDs[0]) && TrigCompositeUtils::passed(id, *previousDecisionIDs[1])) return true;
1072 }
1073 else if (legDecisionIDs.size() == 2) {
1074 // trigger with asymmetric legs like HLT_mu6_mu4_bBmumux_BsmumuPhi_L1MU6_2MU4
1075 bool direct = true;
1076 bool inverse = true;
1077 for (size_t i = 0; i < 2; ++i) {
1078 if (direct && !TrigCompositeUtils::passed(legDecisionIDs[i].numeric(), *previousDecisionIDs[i])) direct = false;
1079 if (inverse && !TrigCompositeUtils::passed(legDecisionIDs[i].numeric(), *previousDecisionIDs[1-i])) inverse = false;
1080 }
1081 if (direct || inverse) return true;
1082 }
1083 else {
1084 ATH_MSG_WARNING( "TrigBmumuxComboHypo can not check decisions for " << tool->name() );
1085 }
1086 }
1087 return false;
1088}
bool passed(DecisionID id, const DecisionIDContainer &idSet)
checks if required decision ID is in the set of IDs in the container

◆ renounce()

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 > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 368 of file AthCommonDataStore.h.

369 {
370 h.renounce();
372 }

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 352 of file AthCommonDataStore.h.

352 {
354 }

◆ setFilterPassed()

virtual void AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Set filter decision:

Definition at line 99 of file AthCommonAlgorithm.h.

99 {
101 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Set filter decision:

◆ sysExecute()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Reimplemented in AthAnalysisAlgorithm.

Definition at line 80 of file AthCommonAlgorithm.cxx.

41{
42 return BaseAlg::sysExecute (ctx);
43}

◆ sysInitialize()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthHistogramAlgorithm, HypoBase, InputMakerBase, and PyAthena::Alg.

Definition at line 60 of file AthCommonAlgorithm.cxx.

71 {
73
74 if (sc.isFailure()) {
75 return sc;
76 }
77
78 ServiceHandle<ICondSvc> cs("CondSvc",name());
79 for (auto h : outputHandles()) {
80 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
81 // do this inside the loop so we don't create the CondSvc until needed
82 if ( cs.retrieve().isFailure() ) {
83 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
85 }
86 if (cs->regHandle(this,*h).isFailure()) {
88 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
89 << " with CondSvc");
90 }
91 }
92 }
93 return sc;
94}
virtual StatusCode sysInitialize() override
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ triggerMultiplicityMap()

const Combo::MultiplicityReqMap & ComboHypo::triggerMultiplicityMap ( ) const
inlineprotectedinherited

Definition at line 43 of file ComboHypo.h.

43{ return m_multiplicitiesReqMap.value(); }
Gaudi::Property< Combo::MultiplicityReqMap > m_multiplicitiesReqMap
Definition ComboHypo.h:56

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 298 of file AthCommonDataStore.h.

298 {
299 for (auto &a : m_vhka) {
301 for (auto k : keys) {
302 k->setOwner(this);
303 }
304 }
305 }

Member Data Documentation

◆ m_allowedIDs

TrigCompositeUtils::DecisionIDContainer TrigBmumuxComboHypo::m_allowedIDs
private

Definition at line 432 of file TrigBmumuxComboHypo.h.

◆ m_BcToDplusMuMu

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToDplusMuMu
private
Initial value:
{this,
"BcToDplusMuMu", true, "switch on/off B_c+ -> J/psi(-> mu+ mu-) D+(-> K- pi+ pi+) decay"}

Definition at line 381 of file TrigBmumuxComboHypo.h.

381 {this,
382 "BcToDplusMuMu", true, "switch on/off B_c+ -> J/psi(-> mu+ mu-) D+(-> K- pi+ pi+) decay"};

◆ m_BcToDplusMuMu_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_BcToDplusMuMu_chi2
private
Initial value:
{this,
"BcToDplusMuMu_chi2", 60., "maximum chi2 of the fitted B_c+ vertex"}

Definition at line 393 of file TrigBmumuxComboHypo.h.

393 {this,
394 "BcToDplusMuMu_chi2", 60., "maximum chi2 of the fitted B_c+ vertex"};

◆ m_BcToDplusMuMu_dimuonMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDplusMuMu_dimuonMassRange
private
Initial value:
{this,
"BcToDplusMuMu_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ -> J/psi D+ decay"}

Definition at line 389 of file TrigBmumuxComboHypo.h.

389 {this,
390 "BcToDplusMuMu_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ -> J/psi D+ decay"};

◆ m_BcToDplusMuMu_DplusMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDplusMuMu_DplusMassRange
private
Initial value:
{this,
"BcToDplusMuMu_DplusMassRange", {1750., 2000.}, "D+ mass range"}

Definition at line 391 of file TrigBmumuxComboHypo.h.

391 {this,
392 "BcToDplusMuMu_DplusMassRange", {1750., 2000.}, "D+ mass range"};

◆ m_BcToDplusMuMu_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDplusMuMu_massRange
private
Initial value:
{this,
"BcToDplusMuMu_massRange", {5500., 7300.}, "B_c+ mass range"}

Definition at line 387 of file TrigBmumuxComboHypo.h.

387 {this,
388 "BcToDplusMuMu_massRange", {5500., 7300.}, "B_c+ mass range"};

◆ m_BcToDplusMuMu_minKaonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDplusMuMu_minKaonPt
private
Initial value:
{this,
"BcToDplusMuMu_minKaonPt", 1000., "minimum pT of kaon track from D+"}

Definition at line 383 of file TrigBmumuxComboHypo.h.

383 {this,
384 "BcToDplusMuMu_minKaonPt", 1000., "minimum pT of kaon track from D+"};

◆ m_BcToDplusMuMu_minPionPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDplusMuMu_minPionPt
private
Initial value:
{this,
"BcToDplusMuMu_minPionPt", 1000., "minimum pT of pion track from D+"}

Definition at line 385 of file TrigBmumuxComboHypo.h.

385 {this,
386 "BcToDplusMuMu_minPionPt", 1000., "minimum pT of pion track from D+"};

◆ m_BcToDplusMuMu_useFastFit

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToDplusMuMu_useFastFit
private
Initial value:
{this,
"BcToDplusMuMu_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"}

Definition at line 395 of file TrigBmumuxComboHypo.h.

395 {this,
396 "BcToDplusMuMu_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"};

◆ m_BcToDsMuMu

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToDsMuMu
private
Initial value:
{this,
"BcToDsMuMu", true, "switch on/off B_c+ -> J/psi(-> mu+ mu-) D_s+(->phi(-> K+ K-) pi+) decay"}

Definition at line 361 of file TrigBmumuxComboHypo.h.

361 {this,
362 "BcToDsMuMu", true, "switch on/off B_c+ -> J/psi(-> mu+ mu-) D_s+(->phi(-> K+ K-) pi+) decay"};

◆ m_BcToDsMuMu_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_BcToDsMuMu_chi2
private
Initial value:
{this,
"BcToDsMuMu_chi2", 60., "maximum chi2 of the fitted B_c+ vertex"}

Definition at line 375 of file TrigBmumuxComboHypo.h.

375 {this,
376 "BcToDsMuMu_chi2", 60., "maximum chi2 of the fitted B_c+ vertex"};

◆ m_BcToDsMuMu_dimuonMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDsMuMu_dimuonMassRange
private
Initial value:
{this,
"BcToDsMuMu_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ -> J/psi D_s+ decay"}

Definition at line 369 of file TrigBmumuxComboHypo.h.

369 {this,
370 "BcToDsMuMu_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ -> J/psi D_s+ decay"};

◆ m_BcToDsMuMu_DsMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDsMuMu_DsMassRange
private
Initial value:
{this,
"BcToDsMuMu_DsMassRange", {1750., 2100.}, "D_s+ mass range"}

Definition at line 373 of file TrigBmumuxComboHypo.h.

373 {this,
374 "BcToDsMuMu_DsMassRange", {1750., 2100.}, "D_s+ mass range"};

◆ m_BcToDsMuMu_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDsMuMu_massRange
private
Initial value:
{this,
"BcToDsMuMu_massRange", {5500., 7300.}, "B_c+ mass range"}

Definition at line 367 of file TrigBmumuxComboHypo.h.

367 {this,
368 "BcToDsMuMu_massRange", {5500., 7300.}, "B_c+ mass range"};

◆ m_BcToDsMuMu_minKaonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDsMuMu_minKaonPt
private
Initial value:
{this,
"BcToDsMuMu_minKaonPt", 1000., "minimum pT of kaon track from phi(1020)"}

Definition at line 363 of file TrigBmumuxComboHypo.h.

363 {this,
364 "BcToDsMuMu_minKaonPt", 1000., "minimum pT of kaon track from phi(1020)"};

◆ m_BcToDsMuMu_minPionPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDsMuMu_minPionPt
private
Initial value:
{this,
"BcToDsMuMu_minPionPt", 1000., "minimum pT of pion track from D_s+"}

Definition at line 365 of file TrigBmumuxComboHypo.h.

365 {this,
366 "BcToDsMuMu_minPionPt", 1000., "minimum pT of pion track from D_s+"};

◆ m_BcToDsMuMu_phiMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDsMuMu_phiMassRange
private
Initial value:
{this,
"BcToDsMuMu_phiMassRange", {940., 1100.}, "phi(1020) mass range"}

Definition at line 371 of file TrigBmumuxComboHypo.h.

371 {this,
372 "BcToDsMuMu_phiMassRange", {940., 1100.}, "phi(1020) mass range"};

◆ m_BcToDsMuMu_useFastFit

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToDsMuMu_useFastFit
private
Initial value:
{this,
"BcToDsMuMu_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"}

Definition at line 377 of file TrigBmumuxComboHypo.h.

377 {this,
378 "BcToDsMuMu_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"};

◆ m_BcToDstarMuMu

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToDstarMuMu
private
Initial value:
{this,
"BcToDstarMuMu", true, "switch on/off partial reconstruction of B_c+ -> J/psi(-> mu+ mu-) D0(-> K- pi+) X decay"}

Definition at line 399 of file TrigBmumuxComboHypo.h.

399 {this,
400 "BcToDstarMuMu", true, "switch on/off partial reconstruction of B_c+ -> J/psi(-> mu+ mu-) D0(-> K- pi+) X decay"};

◆ m_BcToDstarMuMu_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_BcToDstarMuMu_chi2
private
Initial value:
{this,
"BcToDstarMuMu_chi2", 60., "maximum chi2 of the fitted B_c+ vertex"}

Definition at line 419 of file TrigBmumuxComboHypo.h.

419 {this,
420 "BcToDstarMuMu_chi2", 60., "maximum chi2 of the fitted B_c+ vertex"};

◆ m_BcToDstarMuMu_D0MassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDstarMuMu_D0MassRange
private
Initial value:
{this,
"BcToDstarMuMu_D0MassRange", {1750., 2000.}, "D0 mass range"}

Definition at line 415 of file TrigBmumuxComboHypo.h.

415 {this,
416 "BcToDstarMuMu_D0MassRange", {1750., 2000.}, "D0 mass range"};

◆ m_BcToDstarMuMu_dimuonMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDstarMuMu_dimuonMassRange
private
Initial value:
{this,
"BcToDstarMuMu_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ -> J/psi D+ decay"}

Definition at line 413 of file TrigBmumuxComboHypo.h.

413 {this,
414 "BcToDstarMuMu_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ -> J/psi D+ decay"};

◆ m_BcToDstarMuMu_DstarMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDstarMuMu_DstarMassRange
private
Initial value:
{this,
"BcToDstarMuMu_DstarMassRange", {-1., 2110.}, "D*+ mass range"}

Definition at line 417 of file TrigBmumuxComboHypo.h.

417 {this,
418 "BcToDstarMuMu_DstarMassRange", {-1., 2110.}, "D*+ mass range"};

◆ m_BcToDstarMuMu_makeDstar

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToDstarMuMu_makeDstar
private
Initial value:
{this,
"BcToDstarMuMu_makeDstar", true, "switch on/off full reconstruction of B_c+ -> J/psi(-> mu+ mu-) D*+(-> D0(-> K- pi+) pi+) decay"}

Definition at line 401 of file TrigBmumuxComboHypo.h.

401 {this,
402 "BcToDstarMuMu_makeDstar", true, "switch on/off full reconstruction of B_c+ -> J/psi(-> mu+ mu-) D*+(-> D0(-> K- pi+) pi+) decay"};

◆ m_BcToDstarMuMu_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToDstarMuMu_massRange
private
Initial value:
{this,
"BcToDstarMuMu_massRange", {5500., 7300.}, "B_c+ mass range"}

Definition at line 411 of file TrigBmumuxComboHypo.h.

411 {this,
412 "BcToDstarMuMu_massRange", {5500., 7300.}, "B_c+ mass range"};

◆ m_BcToDstarMuMu_maxDstarPionZ0

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDstarMuMu_maxDstarPionZ0
private
Initial value:
{this,
"BcToDstarMuMu_maxDstarPionZ0", 5., "maximum z0 impact parameter of the pion track from D*+ wrt the fitted dimuon vertex; no preselection if negative"}

Definition at line 409 of file TrigBmumuxComboHypo.h.

409 {this,
410 "BcToDstarMuMu_maxDstarPionZ0", 5., "maximum z0 impact parameter of the pion track from D*+ wrt the fitted dimuon vertex; no preselection if negative"};

◆ m_BcToDstarMuMu_minD0KaonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDstarMuMu_minD0KaonPt
private
Initial value:
{this,
"BcToDstarMuMu_minD0KaonPt", 1000., "minimum pT of kaon track from D0"}

Definition at line 403 of file TrigBmumuxComboHypo.h.

403 {this,
404 "BcToDstarMuMu_minD0KaonPt", 1000., "minimum pT of kaon track from D0"};

◆ m_BcToDstarMuMu_minD0PionPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDstarMuMu_minD0PionPt
private
Initial value:
{this,
"BcToDstarMuMu_minD0PionPt", 1000., "minimum pT of pion track from D0"}

Definition at line 405 of file TrigBmumuxComboHypo.h.

405 {this,
406 "BcToDstarMuMu_minD0PionPt", 1000., "minimum pT of pion track from D0"};

◆ m_BcToDstarMuMu_minDstarPionPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToDstarMuMu_minDstarPionPt
private
Initial value:
{this,
"BcToDstarMuMu_minDstarPionPt", 500., "minimum pT of pion track from D*+"}

Definition at line 407 of file TrigBmumuxComboHypo.h.

407 {this,
408 "BcToDstarMuMu_minDstarPionPt", 500., "minimum pT of pion track from D*+"};

◆ m_BcToMuMuPion

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToMuMuPion
private
Initial value:
{this,
"BcToMuMuPion", true, "switch on/off B_c+ -> J/psi(-> mu+ mu-) pi+ decay"}

Definition at line 293 of file TrigBmumuxComboHypo.h.

293 {this,
294 "BcToMuMuPion", true, "switch on/off B_c+ -> J/psi(-> mu+ mu-) pi+ decay"};

◆ m_BcToMuMuPion_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_BcToMuMuPion_chi2
private
Initial value:
{this,
"BcToMuMuPion_chi2", 50., "maximum chi2 of the fitted B_c+ vertex"}

Definition at line 301 of file TrigBmumuxComboHypo.h.

301 {this,
302 "BcToMuMuPion_chi2", 50., "maximum chi2 of the fitted B_c+ vertex"};

◆ m_BcToMuMuPion_dimuonMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToMuMuPion_dimuonMassRange
private
Initial value:
{this,
"BcToMuMuPion_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ decay"}

Definition at line 297 of file TrigBmumuxComboHypo.h.

297 {this,
298 "BcToMuMuPion_dimuonMassRange", {2500., 4300.}, "dimuon mass range for B_c+ decay"};

◆ m_BcToMuMuPion_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BcToMuMuPion_massRange
private
Initial value:
{this,
"BcToMuMuPion_massRange", {5500., 7300.}, "B_c+ mass range"}

Definition at line 299 of file TrigBmumuxComboHypo.h.

299 {this,
300 "BcToMuMuPion_massRange", {5500., 7300.}, "B_c+ mass range"};

◆ m_BcToMuMuPion_minPionPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BcToMuMuPion_minPionPt
private
Initial value:
{this,
"BcToMuMuPion_minPionPt", 2000., "minimum pT of pion track"}

Definition at line 295 of file TrigBmumuxComboHypo.h.

295 {this,
296 "BcToMuMuPion_minPionPt", 2000., "minimum pT of pion track"};

◆ m_BcToMuMuPion_useFastFit

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BcToMuMuPion_useFastFit
private
Initial value:
{this,
"BcToMuMuPion_useFastFit", false, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"}

Definition at line 303 of file TrigBmumuxComboHypo.h.

303 {this,
304 "BcToMuMuPion_useFastFit", false, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"};

◆ m_BdToMuMuKstar0

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BdToMuMuKstar0
private
Initial value:
{this,
"BdToMuMuKstar0", true, "switch on/off B0 -> mu+ mu- K*0(-> K+ pi-) decay"}

Definition at line 323 of file TrigBmumuxComboHypo.h.

323 {this,
324 "BdToMuMuKstar0", true, "switch on/off B0 -> mu+ mu- K*0(-> K+ pi-) decay"};

◆ m_BdToMuMuKstar0_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_BdToMuMuKstar0_chi2
private
Initial value:
{this,
"BdToMuMuKstar0_chi2", 60., "maximum chi2 of the fitted B0 vertex"}

Definition at line 335 of file TrigBmumuxComboHypo.h.

335 {this,
336 "BdToMuMuKstar0_chi2", 60., "maximum chi2 of the fitted B0 vertex"};

◆ m_BdToMuMuKstar0_KstarMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BdToMuMuKstar0_KstarMassRange
private
Initial value:
{this,
"BdToMuMuKstar0_KstarMassRange", {700., 1100.}, "K*0 mass range"}

Definition at line 333 of file TrigBmumuxComboHypo.h.

333 {this,
334 "BdToMuMuKstar0_KstarMassRange", {700., 1100.}, "K*0 mass range"};

◆ m_BdToMuMuKstar0_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BdToMuMuKstar0_massRange
private
Initial value:
{this,
"BdToMuMuKstar0_massRange", {4600., 5900.}, "B0 mass range"}

Definition at line 331 of file TrigBmumuxComboHypo.h.

331 {this,
332 "BdToMuMuKstar0_massRange", {4600., 5900.}, "B0 mass range"};

◆ m_BdToMuMuKstar0_minKaonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BdToMuMuKstar0_minKaonPt
private
Initial value:
{this,
"BdToMuMuKstar0_minKaonPt", 100., "minimum pT of kaon track"}

Definition at line 327 of file TrigBmumuxComboHypo.h.

327 {this,
328 "BdToMuMuKstar0_minKaonPt", 100., "minimum pT of kaon track"};

◆ m_BdToMuMuKstar0_minPionPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BdToMuMuKstar0_minPionPt
private
Initial value:
{this,
"BdToMuMuKstar0_minPionPt", 100., "minimum pT of pion track"}

Definition at line 329 of file TrigBmumuxComboHypo.h.

329 {this,
330 "BdToMuMuKstar0_minPionPt", 100., "minimum pT of pion track"};

◆ m_BdToMuMuKstar0_rejectSameChargeTracks

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BdToMuMuKstar0_rejectSameChargeTracks
private
Initial value:
{this,
"BdToMuMuKstar0_rejectSameChargeTracks", true, "if true, the only (K+, pi-) and (K-, pi+) pairs will be kept (no wrong-charge combinations)"}

Definition at line 325 of file TrigBmumuxComboHypo.h.

325 {this,
326 "BdToMuMuKstar0_rejectSameChargeTracks", true, "if true, the only (K+, pi-) and (K-, pi+) pairs will be kept (no wrong-charge combinations)"};

◆ m_BdToMuMuKstar0_useFastFit

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BdToMuMuKstar0_useFastFit
private
Initial value:
{this,
"BdToMuMuKstar0_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"}

Definition at line 337 of file TrigBmumuxComboHypo.h.

337 {this,
338 "BdToMuMuKstar0_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"};

◆ m_beamSpotKey

SG::ReadCondHandleKey<InDet::BeamSpotData> TrigBmumuxComboHypo::m_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"}
private

Definition at line 252 of file TrigBmumuxComboHypo.h.

252{this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"};

◆ m_BplusToMuMuKaon

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BplusToMuMuKaon
private
Initial value:
{this,
"BplusToMuMuKaon", true, "switch on/off B+ -> mu+ mu- K+ decay"}

Definition at line 281 of file TrigBmumuxComboHypo.h.

281 {this,
282 "BplusToMuMuKaon", true, "switch on/off B+ -> mu+ mu- K+ decay"};

◆ m_BplusToMuMuKaon_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_BplusToMuMuKaon_chi2
private
Initial value:
{this,
"BplusToMuMuKaon_chi2", 50., "maximum chi2 of the fitted B+ vertex"}

Definition at line 287 of file TrigBmumuxComboHypo.h.

287 {this,
288 "BplusToMuMuKaon_chi2", 50., "maximum chi2 of the fitted B+ vertex"};

◆ m_BplusToMuMuKaon_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BplusToMuMuKaon_massRange
private
Initial value:
{this,
"BplusToMuMuKaon_massRange", {4500., 5900.}, "B+ mass range"}

Definition at line 285 of file TrigBmumuxComboHypo.h.

285 {this,
286 "BplusToMuMuKaon_massRange", {4500., 5900.}, "B+ mass range"};

◆ m_BplusToMuMuKaon_minKaonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BplusToMuMuKaon_minKaonPt
private
Initial value:
{this,
"BplusToMuMuKaon_minKaonPt", 100., "minimum pT of kaon track"}

Definition at line 283 of file TrigBmumuxComboHypo.h.

283 {this,
284 "BplusToMuMuKaon_minKaonPt", 100., "minimum pT of kaon track"};

◆ m_BplusToMuMuKaon_useFastFit

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BplusToMuMuKaon_useFastFit
private
Initial value:
{this,
"BplusToMuMuKaon_useFastFit", false, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"}

Definition at line 289 of file TrigBmumuxComboHypo.h.

289 {this,
290 "BplusToMuMuKaon_useFastFit", false, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"};

◆ m_BsToMuMuPhi1020

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BsToMuMuPhi1020
private
Initial value:
{this,
"BsToMuMuPhi1020", true, "switch on/off B_s0 -> mu+ mu- phi(-> K+ K-) decay"}

Definition at line 307 of file TrigBmumuxComboHypo.h.

307 {this,
308 "BsToMuMuPhi1020", true, "switch on/off B_s0 -> mu+ mu- phi(-> K+ K-) decay"};

◆ m_BsToMuMuPhi1020_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_BsToMuMuPhi1020_chi2
private
Initial value:
{this,
"BsToMuMuPhi1020_chi2", 60., "maximum chi2 of the fitted B+ vertex"}

Definition at line 317 of file TrigBmumuxComboHypo.h.

317 {this,
318 "BsToMuMuPhi1020_chi2", 60., "maximum chi2 of the fitted B+ vertex"};

◆ m_BsToMuMuPhi1020_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BsToMuMuPhi1020_massRange
private
Initial value:
{this,
"BsToMuMuPhi1020_massRange", {4800., 5800.}, "B_s0 mass range"}

Definition at line 313 of file TrigBmumuxComboHypo.h.

313 {this,
314 "BsToMuMuPhi1020_massRange", {4800., 5800.}, "B_s0 mass range"};

◆ m_BsToMuMuPhi1020_minKaonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_BsToMuMuPhi1020_minKaonPt
private
Initial value:
{this,
"BsToMuMuPhi1020_minKaonPt", 100., "minimum pT of kaon tracks"}

Definition at line 311 of file TrigBmumuxComboHypo.h.

311 {this,
312 "BsToMuMuPhi1020_minKaonPt", 100., "minimum pT of kaon tracks"};

◆ m_BsToMuMuPhi1020_phiMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_BsToMuMuPhi1020_phiMassRange
private
Initial value:
{this,
"BsToMuMuPhi1020_phiMassRange", {940., 1100.}, "phi1020 mass range"}

Definition at line 315 of file TrigBmumuxComboHypo.h.

315 {this,
316 "BsToMuMuPhi1020_phiMassRange", {940., 1100.}, "phi1020 mass range"};

◆ m_BsToMuMuPhi1020_rejectSameChargeTracks

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BsToMuMuPhi1020_rejectSameChargeTracks
private
Initial value:
{this,
"BsToMuMuPhi1020_rejectSameChargeTracks", true, "if true, the only (K+, K-) pairs will be kept (no wrong-charge combinations)"}

Definition at line 309 of file TrigBmumuxComboHypo.h.

309 {this,
310 "BsToMuMuPhi1020_rejectSameChargeTracks", true, "if true, the only (K+, K-) pairs will be kept (no wrong-charge combinations)"};

◆ m_BsToMuMuPhi1020_useFastFit

Gaudi::Property<bool> TrigBmumuxComboHypo::m_BsToMuMuPhi1020_useFastFit
private
Initial value:
{this,
"BsToMuMuPhi1020_useFastFit", false, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"}

Definition at line 319 of file TrigBmumuxComboHypo.h.

319 {this,
320 "BsToMuMuPhi1020_useFastFit", false, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"};

◆ m_checkMultiplicityMap

Gaudi::Property<bool> ComboHypo::m_checkMultiplicityMap
privateinherited
Initial value:
{ this, "CheckMultiplicityMap", true,
"Perform a consistency check of the MultiplicitiesMap"}

Definition at line 62 of file ComboHypo.h.

62 { this, "CheckMultiplicityMap", true,
63 "Perform a consistency check of the MultiplicitiesMap"};

◆ m_deltaR

Gaudi::Property<double> TrigBmumuxComboHypo::m_deltaR
private
Initial value:
{this,
"DeltaR", 0.01, "minimum deltaR between same-sign tracks (overlap removal)"}

Definition at line 255 of file TrigBmumuxComboHypo.h.

255 {this,
256 "DeltaR", 0.01, "minimum deltaR between same-sign tracks (overlap removal)"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 381 of file AthCommonDataStore.h.

◆ m_dimuon_chi2

Gaudi::Property<double> TrigBmumuxComboHypo::m_dimuon_chi2
private
Initial value:
{this,
"Dimuon_chi2", 20., "maximum chi2 of the dimuon vertex"}

Definition at line 277 of file TrigBmumuxComboHypo.h.

277 {this,
278 "Dimuon_chi2", 20., "maximum chi2 of the dimuon vertex"};

◆ m_dimuon_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_dimuon_massRange
private
Initial value:
{this,
"Dimuon_massRange", {100., 5500.}, "dimuon mass range"}

Definition at line 275 of file TrigBmumuxComboHypo.h.

275 {this,
276 "Dimuon_massRange", {100., 5500.}, "dimuon mass range"};

◆ m_dimuon_rejectSameChargeTracks

Gaudi::Property<bool> TrigBmumuxComboHypo::m_dimuon_rejectSameChargeTracks
private
Initial value:
{this,
"Dimuon_rejectSameChargeTracks", true, "if true, the only (mu+, mu-) pairs will be kept (no wrong-charge combinations)"}

Definition at line 273 of file TrigBmumuxComboHypo.h.

273 {this,
274 "Dimuon_rejectSameChargeTracks", true, "if true, the only (mu+, mu-) pairs will be kept (no wrong-charge combinations)"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 378 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 108 of file AthCommonAlgorithm.h.

◆ m_fastFit_2mu1trk_chi2

Gaudi::Property<double> TrigBmumuxComboHypo::m_fastFit_2mu1trk_chi2
private
Initial value:
{this,
"FastFit_2mu1trk_chi2", 60., "maximum chi2 for fast fit of dimuon + trk1"}

Definition at line 269 of file TrigBmumuxComboHypo.h.

269 {this,
270 "FastFit_2mu1trk_chi2", 60., "maximum chi2 for fast fit of dimuon + trk1"};

◆ m_fastFit_2trk_chi2

Gaudi::Property<double> TrigBmumuxComboHypo::m_fastFit_2trk_chi2
private
Initial value:
{this,
"FastFit_2trk_chi2", 50., "maximum chi2 for fast fit of trk1 + trk2"}

Definition at line 267 of file TrigBmumuxComboHypo.h.

267 {this,
268 "FastFit_2trk_chi2", 50., "maximum chi2 for fast fit of trk1 + trk2"};

◆ m_fitAttemptsBreakThreshold

Gaudi::Property<size_t> TrigBmumuxComboHypo::m_fitAttemptsBreakThreshold
private
Initial value:
{this,
"FitAttemptsBreakThreshold", 1000, "Events processing this many calls of the vertex fitter will generate a second WARNING message and the loop over combinations will be terminated at this point (time-out protect)"}

Definition at line 265 of file TrigBmumuxComboHypo.h.

265 {this,
266 "FitAttemptsBreakThreshold", 1000, "Events processing this many calls of the vertex fitter will generate a second WARNING message and the loop over combinations will be terminated at this point (time-out protect)"};

◆ m_fitAttemptsWarningThreshold

Gaudi::Property<size_t> TrigBmumuxComboHypo::m_fitAttemptsWarningThreshold
private
Initial value:
{this,
"FitAttemptsWarningThreshold", 200, "Events processing this many calls of the vertex fitter will generate a WARNING message (time-out protect)"}

Definition at line 263 of file TrigBmumuxComboHypo.h.

263 {this,
264 "FitAttemptsWarningThreshold", 200, "Events processing this many calls of the vertex fitter will generate a WARNING message (time-out protect)"};

◆ m_hypoTools

ToolHandleArray< ComboHypoToolBase > ComboHypo::m_hypoTools {this, "ComboHypoTools", {}, "Tools to perform selection"}
privateinherited

Definition at line 104 of file ComboHypo.h.

104{this, "ComboHypoTools", {}, "Tools to perform selection"};

◆ m_inputs

SG::ReadHandleKeyArray<TrigCompositeUtils::DecisionContainer> ComboHypo::m_inputs { this, "HypoInputDecisions", {}, "Input Decisions" }
privateinherited

Definition at line 50 of file ComboHypo.h.

50{ this, "HypoInputDecisions", {}, "Input Decisions" };

◆ m_LambdaBToMuMuProtonKaon

Gaudi::Property<bool> TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon", true, "switch on/off Lambda_b0 -> J/psi(-> mu+ mu-) p K- decay"}

Definition at line 341 of file TrigBmumuxComboHypo.h.

341 {this,
342 "LambdaBToMuMuProtonKaon", true, "switch on/off Lambda_b0 -> J/psi(-> mu+ mu-) p K- decay"};

◆ m_LambdaBToMuMuProtonKaon_chi2

Gaudi::Property<float> TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_chi2
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_chi2", 60., "maximum chi2 of the fitted Lambda_b0 vertex"}

Definition at line 355 of file TrigBmumuxComboHypo.h.

355 {this,
356 "LambdaBToMuMuProtonKaon_chi2", 60., "maximum chi2 of the fitted Lambda_b0 vertex"};

◆ m_LambdaBToMuMuProtonKaon_dimuonMassRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_dimuonMassRange
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_dimuonMassRange", {2500., 4300.}, "dimuon mass range for Lambda_b0 decay"}

Definition at line 351 of file TrigBmumuxComboHypo.h.

351 {this,
352 "LambdaBToMuMuProtonKaon_dimuonMassRange", {2500., 4300.}, "dimuon mass range for Lambda_b0 decay"};

◆ m_LambdaBToMuMuProtonKaon_massRange

Gaudi::Property<std::pair<double, double> > TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_massRange
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_massRange", {4800., 6400.}, "Lambda_b0 mass range"}

Definition at line 353 of file TrigBmumuxComboHypo.h.

353 {this,
354 "LambdaBToMuMuProtonKaon_massRange", {4800., 6400.}, "Lambda_b0 mass range"};

◆ m_LambdaBToMuMuProtonKaon_minKaonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_minKaonPt
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_minKaonPt", 1000., "minimum pT of kaon track"}

Definition at line 347 of file TrigBmumuxComboHypo.h.

347 {this,
348 "LambdaBToMuMuProtonKaon_minKaonPt", 1000., "minimum pT of kaon track"};

◆ m_LambdaBToMuMuProtonKaon_minKstarMass

Gaudi::Property<double> TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_minKstarMass
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_minKstarMass", 1300., "min value for both mass(trk1=kaon, trk2=pion) and mass(trk1=pion, trk2=kaon)"}

Definition at line 349 of file TrigBmumuxComboHypo.h.

349 {this,
350 "LambdaBToMuMuProtonKaon_minKstarMass", 1300., "min value for both mass(trk1=kaon, trk2=pion) and mass(trk1=pion, trk2=kaon)"};

◆ m_LambdaBToMuMuProtonKaon_minProtonPt

Gaudi::Property<double> TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_minProtonPt
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_minProtonPt", 1000., "minimum pT of proton track"}

Definition at line 345 of file TrigBmumuxComboHypo.h.

345 {this,
346 "LambdaBToMuMuProtonKaon_minProtonPt", 1000., "minimum pT of proton track"};

◆ m_LambdaBToMuMuProtonKaon_rejectSameChargeTracks

Gaudi::Property<bool> TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_rejectSameChargeTracks
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_rejectSameChargeTracks", false, "if true, the only (p, K-) and (anti-p, K+) pairs will be kept (no wrong-charge combinations)"}

Definition at line 343 of file TrigBmumuxComboHypo.h.

343 {this,
344 "LambdaBToMuMuProtonKaon_rejectSameChargeTracks", false, "if true, the only (p, K-) and (anti-p, K+) pairs will be kept (no wrong-charge combinations)"};

◆ m_LambdaBToMuMuProtonKaon_useFastFit

Gaudi::Property<bool> TrigBmumuxComboHypo::m_LambdaBToMuMuProtonKaon_useFastFit
private
Initial value:
{this,
"LambdaBToMuMuProtonKaon_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"}

Definition at line 357 of file TrigBmumuxComboHypo.h.

357 {this,
358 "LambdaBToMuMuProtonKaon_useFastFit", true, "true: perform vertex fit depending on only if fast fit; false: always perform vertex fit"};

◆ m_legToInputCollectionMap

Gaudi::Property< Combo::LegMap > ComboHypo::m_legToInputCollectionMap
privateinherited
Initial value:
{this, "LegToInputCollectionMap", {},
"Map from the chain name to the per-leg index in this algorithm's ReadHandleKeyArray which should be used as the source of incoming Decision Objects on the leg."}

Definition at line 59 of file ComboHypo.h.

59 {this, "LegToInputCollectionMap", {},
60 "Map from the chain name to the per-leg index in this algorithm's ReadHandleKeyArray which should be used as the source of incoming Decision Objects on the leg."};

◆ m_monTool

ToolHandle<GenericMonitoringTool> TrigBmumuxComboHypo::m_monTool
private
Initial value:
{this,
"MonTool", "", "monitoring tool"}

Definition at line 429 of file TrigBmumuxComboHypo.h.

429 {this,
430 "MonTool", "", "monitoring tool"};

◆ m_multiplicitiesReqMap

Gaudi::Property< Combo::MultiplicityReqMap > ComboHypo::m_multiplicitiesReqMap
privateinherited
Initial value:
{this, "MultiplicitiesMap", {},
"Map from the chain name to multiplicities required at each input"}

Definition at line 56 of file ComboHypo.h.

56 {this, "MultiplicitiesMap", {},
57 "Map from the chain name to multiplicities required at each input"};

◆ m_muonContainerKey

SG::ReadHandleKey<xAOD::MuonContainer> TrigBmumuxComboHypo::m_muonContainerKey
private
Initial value:
{this,
"MuonCollectionKey", "Muons", "input EF Muon container name"}

Definition at line 247 of file TrigBmumuxComboHypo.h.

247 {this,
248 "MuonCollectionKey", "Muons", "input EF Muon container name"};

◆ m_outputs

SG::WriteHandleKeyArray<TrigCompositeUtils::DecisionContainer> ComboHypo::m_outputs { this, "HypoOutputDecisions", {}, "Output Decisions" }
privateinherited

Definition at line 51 of file ComboHypo.h.

51{ this, "HypoOutputDecisions", {}, "Output Decisions" };

◆ m_requireUniqueROI

Gaudi::Property<bool> ComboHypo::m_requireUniqueROI
privateinherited
Initial value:
{this, "RequireUniqueROI", false,
"Require each Feature in each leg of the combination to come from a unique L1 seeding ROI."}

Definition at line 53 of file ComboHypo.h.

53 {this, "RequireUniqueROI", false,
54 "Require each Feature in each leg of the combination to come from a unique L1 seeding ROI."};

◆ m_roiEtaWidth

Gaudi::Property<double> TrigBmumuxComboHypo::m_roiEtaWidth
private
Initial value:
{this,
"RoiEtaWidth", 0.75, "extent of the RoI in eta from initial muon, to be check for SuperRoI"}

Definition at line 259 of file TrigBmumuxComboHypo.h.

259 {this,
260 "RoiEtaWidth", 0.75, "extent of the RoI in eta from initial muon, to be check for SuperRoI"};

◆ m_roiPhiWidth

Gaudi::Property<double> TrigBmumuxComboHypo::m_roiPhiWidth
private
Initial value:
{this,
"RoiPhiWidth", 0.75, "extent of the RoI in phi from initial muon, to be check for SuperRoI"}

Definition at line 261 of file TrigBmumuxComboHypo.h.

261 {this,
262 "RoiPhiWidth", 0.75, "extent of the RoI in phi from initial muon, to be check for SuperRoI"};

◆ m_trackParticleContainerKey

SG::ReadHandleKey<xAOD::TrackParticleContainer> TrigBmumuxComboHypo::m_trackParticleContainerKey
private
Initial value:
{this,
"TrackCollectionKey", "InDetTrackParticles", "input TrackParticle container name"}

Definition at line 245 of file TrigBmumuxComboHypo.h.

245 {this,
246 "TrackCollectionKey", "InDetTrackParticles", "input TrackParticle container name"};

◆ m_trackToVertexTool

ToolHandle<Reco::ITrackToVertex> TrigBmumuxComboHypo::m_trackToVertexTool
private
Initial value:
{this,
"TrackToVertexTool", "", "tool to extrapolate track to vertex or beamspot"}

Definition at line 427 of file TrigBmumuxComboHypo.h.

427 {this,
428 "TrackToVertexTool", "", "tool to extrapolate track to vertex or beamspot"};

◆ m_trigBphysContainerKey

SG::WriteHandleKey<xAOD::TrigBphysContainer> TrigBmumuxComboHypo::m_trigBphysContainerKey
private
Initial value:
{this,
"TrigBphysCollectionKey", "TrigBphysContainer", "output TrigBphysContainer name"}

Definition at line 249 of file TrigBmumuxComboHypo.h.

249 {this,
250 "TrigBphysCollectionKey", "TrigBphysContainer", "output TrigBphysContainer name"};

◆ m_trkZ0

Gaudi::Property<double> TrigBmumuxComboHypo::m_trkZ0
private
Initial value:
{this,
"TrkZ0", 50., "maximum z0 impact parameter of the track wrt the fitted dimuon vertex; no preselection if negative"}

Definition at line 257 of file TrigBmumuxComboHypo.h.

257 {this,
258 "TrkZ0", 50., "maximum z0 impact parameter of the track wrt the fitted dimuon vertex; no preselection if negative"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 387 of file AthCommonDataStore.h.

◆ m_vertexFitter

ToolHandle<Trk::TrkVKalVrtFitter> TrigBmumuxComboHypo::m_vertexFitter
private
Initial value:
{this,
"VertexFitter", "", "VKalVrtFitter tool to fit tracks into the common vertex"}

Definition at line 425 of file TrigBmumuxComboHypo.h.

425 {this,
426 "VertexFitter", "", "VKalVrtFitter tool to fit tracks into the common vertex"};

◆ m_vertexPointEstimator

ToolHandle<InDet::VertexPointEstimator> TrigBmumuxComboHypo::m_vertexPointEstimator
private
Initial value:
{this,
"VertexPointEstimator", "", "tool to find starting point for the vertex fitter"}

Definition at line 423 of file TrigBmumuxComboHypo.h.

423 {this,
424 "VertexPointEstimator", "", "tool to find starting point for the vertex fitter"};

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 386 of file AthCommonDataStore.h.

◆ s_trkMass

const std::vector< std::vector< double > > TrigBmumuxComboHypo::s_trkMass
staticprivate
Initial value:

Definition at line 41 of file TrigBmumuxComboHypo.h.

45 : public ::ITrigBphysState {
46 public:
47 TrigBmumuxState() = delete;
48 TrigBmumuxState(const EventContext& context,
49 const TrigCompositeUtils::DecisionContainer& previousDecisions,
51 xAOD::TrigBphysContainer* trigBphysCollection = nullptr,
xAOD::TrigCompositeContainer DecisionContainer

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