10#ifndef XAOD_STANDALONE
21 const EventContext& ctx,
23 const bool printWarningMessages)
27 bool errState =
false;
29 msg << MSG::ERROR <<
"features may only be called with: "
30 "TrigDefs::Physics - features from the legs of the chain(s) which passed the trigger. "
31 "TrigDefs::includeFailedDecisions - all features from the chain(s) irrespective of pass/fail of each Step." <<
endmsg;
36 msg << MSG::ERROR <<
"featureCollectionMode may only be called with: "
37 "TrigDefs::lastFeatureOfType - stop exploring each route through the navigation once a feature matching all requirements is found. "
38 "TrigDefs::allFeaturesOfType - always fully explore each route through the navigation graph and collect all matching features." <<
endmsg;
44 msg << MSG::ERROR <<
"Unable to read trigger navigation from " << navRHKey.
key() <<
". Cannot retrieve features." <<
endmsg;
52 if (terminusNode ==
nullptr) {
53 msg << MSG::ERROR <<
"Unable to locate HLTPassRaw element of " << navRHKey.
key()
54 <<
", collection contains " << navigationRH->size() <<
" nodes." <<
endmsg;
60 msg << MSG::ERROR <<
"Encountered one or more errors in FeatureRequestHelpers::typelessFeaturesImplimentation" <<
endmsg;
61 throw std::runtime_error(
"Encountered one or more errors in FeatureRequestHelpers::typelessFeaturesImplimentation");
69 chainIDs.insert( chainID.
numeric() );
72 if (legMultiplicites.size() == 0) {
73 msg << MSG::ERROR <<
"chain " << chainID <<
" has invalid configuration, no parsed multiplicity data." <<
endmsg;
74 throw std::runtime_error(
"Encountered chain which could not be parsed in FeatureRequestHelpers::typelessFeaturesImplimentation");
75 }
else if (legMultiplicites.size() > 1) {
76 if (frd.
restrictRequestToLeg() >=
static_cast<int>(legMultiplicites.size()) && printWarningMessages) {
77 msg << MSG::WARNING <<
"Requested features from leg index " << frd.
restrictRequestToLeg() <<
" for chain " << chainID <<
78 " but this chain only has " << legMultiplicites.size() <<
" legs" <<
endmsg;
82 for (
size_t legNumeral = 0; legNumeral < legMultiplicites.size(); ++legNumeral) {
88 chainIDs.insert( legID.
numeric() );
91 if (
msg.level() <= MSG::DEBUG)
msg << MSG::DEBUG <<
"Fetching navigation data for chain " << chainID <<
" with " << legMultiplicites.size() <<
" leg(s)." <<
endmsg;
92 if (
msg.level() <= MSG::VERBOSE) {
102 if (
msg.level() <= MSG::DEBUG) {
103 msg <<
"Added all passed navigation data for chain " << chainID
104 <<
", total nodes:" << navGraph.
nodes() <<
" total edges:" << navGraph.
edges() <<
" final nodes:" << navGraph.
finalNodes().size() <<
endmsg;
112 std::vector<const TrigCompositeUtils::Decision*> rejectedDecisionNodes =
115 if (
msg.level() <= MSG::DEBUG) {
116 msg << MSG::DEBUG <<
"Chain " << chainID <<
" has " << rejectedDecisionNodes.size()
117 <<
" dangling nodes in the graph from objects which were rejected." <<
endmsg;
125 if (
msg.level() <= MSG::DEBUG) {
126 msg << MSG::DEBUG <<
"Added all failed navigation data for chain " << chainID
127 <<
", total nodes:" << navGraph.
nodes() <<
" total edges:" << navGraph.
edges() <<
" final nodes:" << navGraph.
finalNodes().size() <<
endmsg;
131 if (
msg.level() <= MSG::DEBUG) {
132 msg << MSG::DEBUG <<
"Finished adding nodes to sub-graph. "
133 <<
"Total nodes:" << navGraph.
nodes() <<
" total edges:" << navGraph.
edges() <<
" final nodes:" << navGraph.
finalNodes().size() <<
endmsg;
135 if (
msg.level() <= MSG::VERBOSE && navGraph.
finalNodes().size()) {
157 const EventContext& ctx,
160 std::vector<TrigCompositeUtils::TypelessLinkInfo> features;
161 std::set<const TrigCompositeUtils::NavGraphNode*> fullyExploredFrom;
182 std::vector<TrigCompositeUtils::TypelessLinkInfo>& features,
183 std::set<const TrigCompositeUtils::NavGraphNode*>& fullyExploredFrom,
189 const EventContext& ctx,
196 std::vector<sgkey_t> featureKeys;
197 std::vector<CLID> featureClids;
198 std::vector<TrigCompositeUtils::Decision::index_type> featureIndices;
201 std::vector<std::string> availableLinkNames;
203 const std::vector<std::string> getSingleLinkNames = decisionObj->
getObjectNames(clid);
205 std::copy(getSingleLinkNames.begin(), getSingleLinkNames.end(), std::back_inserter(availableLinkNames));
206 std::copy(getCollectionLinkNames.begin(), getCollectionLinkNames.end(), std::back_inserter(availableLinkNames));
208 availableLinkNames.push_back( frd.
linkName() );
212 for (
const std::string& featureNameToGet : availableLinkNames) {
215#ifndef XAOD_STANDALONE
220 std::vector<sgkey_t> keyVec;
221 std::vector<CLID> clidVec;
222 std::vector<TrigCompositeUtils::Decision::index_type> indexVec;
225 std::copy(keyVec.begin(), keyVec.end(), std::back_inserter(featureKeys));
226 std::copy(clidVec.begin(), clidVec.end(), std::back_inserter(featureClids));
227 std::copy(indexVec.begin(), indexVec.end(), std::back_inserter(featureIndices));
229#ifndef XAOD_STANDALONE
243 std::vector<sgkey_t> keyVec = {fKey};
244 std::vector<CLID> clidVec = {fClid};
245 std::vector<TrigCompositeUtils::Decision::index_type> indexVec = {fIndex};
247 std::copy(keyVec.begin(), keyVec.end(), std::back_inserter(featureKeys));
248 std::copy(clidVec.begin(), clidVec.end(), std::back_inserter(featureClids));
249 std::copy(indexVec.begin(), indexVec.end(), std::back_inserter(featureIndices));
251#ifndef XAOD_STANDALONE
260 if (chainIDs.size() > 0) {
264 if (std::count(decisionObj->
decisions().begin(), decisionObj->
decisions().end(),
id) == 1) {
274 if (std::count(decisionObjChild->
decisions().begin(), decisionObjChild->
decisions().end(),
id) == 1) {
282 for (
size_t i = 0; i < featureKeys.size(); ++i) {
283 typename std::vector<TrigCompositeUtils::TypelessLinkInfo>::iterator vecIt =
284 std::find_if(features.begin(), features.end(), [&](
const auto& li) { return li.key == featureKeys[i] and li.clid == featureClids[i] and li.index == featureIndices[i]; } );
285 if (vecIt == features.end()) {
287 features.emplace_back( decisionObj, featureKeys[i], featureClids[i], featureIndices[i], state );
295 vecIt->decisions->insert(ids.begin(), ids.end());
306 if (fullyExploredFrom.count(seedNavNode) == 1) {
323 fullyExploredFrom.insert( navGraphNode );
327 const std::regex& expression,
328 std::vector<sgkey_t>& keyVec,
329 std::vector<CLID>& clidVec,
330 std::vector<TrigCompositeUtils::Decision::index_type>& indexVec,
331 [[maybe_unused]]
const EventContext& ctx,
334 if (std::regex_match(
"", expression)) {
337 std::vector<size_t> indicesToRemove;
338 for (
size_t i = 0; i < keyVec.size(); ++i) {
339#ifdef XAOD_STANDALONE
340 const std::string keyStr = eventStore->event()->getName(keyVec[i]);
341 const std::string* keyStrPtr = (keyStr.empty() ?
nullptr : &keyStr);
348 if (not keyStrPtr or not std::regex_match(*keyStrPtr, expression)) {
349 indicesToRemove.push_back(i);
353 for (
auto it = indicesToRemove.rbegin(); it != indicesToRemove.rend(); ++it) {
354 keyVec.erase(keyVec.begin() + *it);
355 clidVec.erase(clidVec.begin() + *it);
356 indexVec.erase(indexVec.begin() + *it);
uint32_t CLID
The Class ID type.
TrigCompositeUtils::DecisionID numeric() const
numeric ID
std::string name() const
reports human redable name
Exception — Attempt to set DataLink / ElementLink with CLID <clid> to object with CLID <clid>.
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const std::string & key() const
Return the StoreGate ID for the referenced object.
Transient utility class to represent a node in a graph (m_decisionObject), and a vector of edges (m_f...
const std::vector< NavGraphNode * > & children() const
Return a vector of const pointers to the Decision object nodes which are the children of this NavGrap...
const std::vector< NavGraphNode * > & seeds() const
Return a vector of const pointers to the Decision object nodes which this NavGraphNode seeds from.
const Decision * node() const
Return a const pointer to the Decision object node which this NavGraphNode is shadowing.
Structure to hold a transient Directed Acyclic Graph (DAG) structure.
const std::vector< NavGraphNode * > & finalNodes() const
Get all final nodes.
void printAllPaths(MsgStream &log, MSG::Level msgLevel=MSG::VERBOSE) const
Helper function.
int restrictRequestToLeg() const
const std::string & chainGroup() const
const std::string & linkName() const
const std::regex & SGKeyExpression() const
unsigned int condition() const
unsigned int featureCollectionMode() const
const std::vector< TrigCompositeUtils::DecisionID > & decisions() const
Get positive HLT chain decisions associated with this TrigComposite. Navigation use.
bool hasObjectLink(const std::string &name, const CLID clid=CLID_NULL) const
Check if a link to an object with a given name and type exists. CLID_NULL to not check type.
bool typelessGetObjectLink(const std::string &name, sgkey_t &key, uint32_t &clid, index_type &index) const
Fetches a single link without type.
bool typelessGetObjectCollectionLinks(const std::string &name, std::vector< sgkey_t > &keyVec, std::vector< uint32_t > &clidVec, std::vector< index_type > &indexVec) const
Fetches a collection of links without type.
bool hasObjectCollectionLinks(const std::string &collectionName, const CLID clid=CLID_NULL) const
Check if links exist to a collection of objects with given name and type. CLID_NULL to not check type...
std::vector< std::string > getObjectNames() const
Look up all links stored to objects of (container) type CONTAINER.
const std::string & name() const
Get a human-readable name for the object.
std::vector< std::string > getObjectCollectionNames() const
Look up all links stored to collections objects from (container) type CONTAINER.
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
std::vector< int > multiplicities(const std::string &chain)
void typelessGetFeaturesInternal(std::vector< TrigCompositeUtils::TypelessLinkInfo > &features, std::set< const TrigCompositeUtils::NavGraphNode * > &fullyExploredFrom, const TrigCompositeUtils::NavGraphNode *navGraphNode, const Trig::FeatureRequestDescriptor &frd, const CLID clid, const TrigCompositeUtils::DecisionIDContainer chainIDs, const EventContext &ctx, const asg::EventStoreType *eventStore)
Internal implementation called by typelessGetFeatures, and by itself.
void filterLinkVectorByContainerKey(const std::regex &expression, std::vector< sgkey_t > &keyVec, std::vector< CLID > &clidVec, std::vector< TrigCompositeUtils::Decision::index_type > &indexVec, const EventContext &ctx, const asg::EventStoreType *eventStore)
Removes type erased element links from the supplied vectors if they do not come from the specified co...
const std::vector< TrigCompositeUtils::TypelessLinkInfo > typelessGetFeatures(const TrigCompositeUtils::NavGraph &navGraph, const Trig::FeatureRequestDescriptor &frd, const CLID clid, const TrigCompositeUtils::DecisionIDContainer chainIDs, const EventContext &ctx, const asg::EventStoreType *eventStore)
Extract features from the supplied navGraph (obtained through typelessGetFeaturesInternal).
std::vector< TrigCompositeUtils::TypelessLinkInfo > typelessFeaturesImplimentation(const Trig::FeatureRequestDescriptor &frd, const CLID clid, const SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > &navRHKey, MsgStream &msg, const EventContext &ctx, const asg::EventStoreType *eventStore, const bool printWarningMessages)
Standalone implementation of feature retrieval, common between TrigDecisionTool and TrigDecisionToolL...
HLT::Identifier createLegName(const HLT::Identifier &chainIdentifier, size_t counter)
Generate the HLT::Identifier which corresponds to a specific leg of a given chain.
xAOD::TrigComposite Decision
ActiveState
Additional information returned by the TrigerDecisionTool's feature retrieval, contained within the L...
@ ACTIVE
The link was still active for one-or-more of the HLT Chains requested in the TDT.
@ UNSET
Default property of state.
@ INACTIVE
The link was inactive for all of the HLT Chains requested in the TDT.
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.
std::vector< const Decision * > getRejectedDecisionNodes(const asg::EventStoreType *eventStore, const EventContext &ctx, const std::string &summaryCollectionKey, const DecisionIDContainer &ids, const std::set< std::string > &keysToIgnore)
Query all DecisionCollections in the event store, locate all Decision nodes in the graph where an obj...
const std::string & comboHypoAlgNodeName()
std::set< DecisionID > DecisionIDContainer
const Decision * getTerminusNode(SG::ReadHandle< DecisionContainer > &container)
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.
static const unsigned int includeFailedDecisions
Run3 synonym of alsoDeactivateTEs.
static const unsigned int lastFeatureOfType
Run 3 "enum". Only return the final feature along each route through the navigation.
static const unsigned int allFeaturesOfType
Run 3 "enum". Return all features along legs (still with type and container checks)
static const unsigned int Physics
StoreGateSvc EventStoreType
the type returned by AsgTool::evtStore