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

Used at the start of a sequence to create the EventViews: retrieves filtered collections via menu decision from previous step, merges them and writes out a merged collection to be consumed by HypoAlg(s). More...

#include <EventViewCreatorAlgorithm.h>

Inheritance diagram for EventViewCreatorAlgorithm:
Collaboration diagram for EventViewCreatorAlgorithm:

Public Member Functions

 EventViewCreatorAlgorithm (const std::string &name, ISvcLocator *pSvcLocator)
virtual ~EventViewCreatorAlgorithm ()
virtual StatusCode initialize () override
virtual StatusCode execute (const EventContext &) const override
virtual StatusCode finalize () override
virtual StatusCode sysInitialize () override
 initialise this base class and renounce input decision key handles
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
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
virtual void setFilterPassed (bool state, const EventContext &ctx) const
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

 EventViewCreatorAlgorithm ()
StatusCode linkViewToParent (const TrigCompositeUtils::Decision *outputDecision, SG::View *newView) const
 Makes sure the views are linked, if configuration requireParentView is set.
StatusCode placeRoIInView (const ElementLink< TrigRoiDescriptorCollection > &roi, SG::View *view, const EventContext &context) const
 Seeds a newly created view with an ROI collection containing the single seeding ROI.
SmartIF< IScheduler > getScheduler () const
 Obtain smart pointer to scheduler in order to schedule newly spawned views.
bool checkCache (const TrigCompositeUtils::DecisionContainer *cachedViews, const TrigCompositeUtils::Decision *outputDecision, size_t &cachedIndex, MatchingCache &matchingCache) const
 Allow for the re-use of EventViews run in a previous Step in another EVCA instance configured to spawn EventViews using the same reconstruction sequence (i.e.
StatusCode populateMatchingCacheWithCachedViews (const TrigCompositeUtils::DecisionContainer *cachedViews, MatchingCache &matchingCache) const
 We look for matching Decision Objects in a matchingCache.
const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionInputs () const
 methods for derived classes to access handles of the base class input and output decisions; other read/write handles may be implemented by derived classes
const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & decisionOutputs () const
 methods for derived classes to access handles of the base class input and output decisions; other read/write handles may be implemented by derived classes
void debugPrintOut (const EventContext &context, SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle) const
 provides debug printout of the output of the algorithm
StatusCode decisionInputToOutput (const EventContext &context, SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle) const
 does the standard handling of input decisions: read from handles with all the checks, create merged output handles and link them, copies links and return outputHandles
size_t matchDecision (const TrigCompositeUtils::DecisionContainer *outDecisions, const TrigCompositeUtils::Decision *toMatch, const std::string &linkNameToMatch, MatchingCache &matchingCache) const
 Checks for merge-able Decision objects coming from N upstream filters. Check based on most-recent element link with name 'linkNameToMatch'. Works for any link type.
bool matchInCollection (const TrigCompositeUtils::DecisionContainer *outDecisions, const TrigCompositeUtils::Decision *toMatch, size_t &matchIndex, bool &usedROIMatchingFlag, MatchingCache &matchingCache) const
 Wrapper around matchDecision. Returns boolean if the match was successful.
uint64_t getMatchingHashForDecision (const TrigCompositeUtils::Decision *toMatch, const std::string &linkNameToMatch) const
 Searches from toMatch to locate a single (type-less) Element Link with given edge name. Returns a hash corresponding to this Element Link.
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.

Protected Attributes

SG::WriteHandleKey< ViewContainerm_viewsKey
SG::WriteHandleKey< ConstDataVector< TrigRoiDescriptorCollection > > m_inViewRoIs
Gaudi::Property< std::string > m_schedulerName { this, "SchedulerName", "AvalancheSchedulerSvc", "Name of the scheduler" }
Gaudi::Property< std::string > m_viewNodeName { this, "ViewNodeName", "", "Name of the ControlFlow node to attach new views to" }
Gaudi::Property< bool > m_viewFallThrough
Gaudi::Property< std::vector< std::string > > m_viewFallFilter
Gaudi::Property< bool > m_requireParentView
Gaudi::Property< bool > m_reverseViews
SG::ReadHandleKey< TrigCompositeUtils::DecisionContainerm_cachedViewsKey
ToolHandle< IViewCreatorROIToolm_roiTool
StringProperty m_roisLink
Gaudi::Property< bool > m_mergeUsingFeature
Gaudi::Property< bool > m_isEmptyStep

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

std::vector< TrigCompositeUtils::LinkInfo< ViewContainer > > viewsToLink (const TrigCompositeUtils::Decision *outputDecision) const
 Obtain view(s) from most recent prior step(s) which are to be wired up.
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainerm_inputs { this, "InputMakerInputDecisions", {}, "Input Decisions (implicit)" }
 input decisions array, will be implicit (renounced).
SG::WriteHandleKey< TrigCompositeUtils::DecisionContainerm_outputs { this, "InputMakerOutputDecisions", "", "Output Decisions" }
 output decisions
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

Muon slice code

Gaudi::Property< bool > m_placeMuonInView
SG::WriteHandleKey< xAOD::MuonContainerm_inViewMuons
SG::WriteHandleKey< ConstDataVector< MuonCandidateCollection > > m_inViewMuonCandidates
StatusCode placeMuonInView (const xAOD::Muon *theObject, SG::View *view, const EventContext &context) const
 Creates a SG::VIEW_ELEMENTS collection inside a newly created View populated by the MuonCombined::MuonCandidate used to seed the View Also currently populated by the xAOD::Muon for the iso use case, but this should be removed.

Jet slice code

Gaudi::Property< bool > m_placeJetInView
Gaudi::Property< bool > m_cacheDisabled
SG::WriteHandleKey< xAOD::JetContainerm_inViewJets
StatusCode placeJetInView (const xAOD::Jet *theObject, SG::View *view, const EventContext &context) const
 Creates a SG::VIEW_ELEMENTS collection inside a newly created View populated by the jet used to seed the View.

Detailed Description

Used at the start of a sequence to create the EventViews: retrieves filtered collections via menu decision from previous step, merges them and writes out a merged collection to be consumed by HypoAlg(s).

Spawns EventViews for each unique ROI associated to each Decision object in the merged output. Links the EventView and the ROI to each Decision object in the merged output.

Definition at line 44 of file EventViewCreatorAlgorithm.h.

Member Typedef Documentation

◆ StoreGateSvc_t

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

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ EventViewCreatorAlgorithm() [1/2]

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

Definition at line 17 of file EventViewCreatorAlgorithm.cxx.

18: InputMakerBase( name, pSvcLocator ) {}
InputMakerBase(const std::string &name, ISvcLocator *pSvcLocator)
constructor, to be called by sub-class constructors

◆ ~EventViewCreatorAlgorithm()

EventViewCreatorAlgorithm::~EventViewCreatorAlgorithm ( )
virtual

Definition at line 20 of file EventViewCreatorAlgorithm.cxx.

20{}

◆ EventViewCreatorAlgorithm() [2/2]

EventViewCreatorAlgorithm::EventViewCreatorAlgorithm ( )
protected

Member Function Documentation

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ checkCache()

bool EventViewCreatorAlgorithm::checkCache ( const TrigCompositeUtils::DecisionContainer * cachedViews,
const TrigCompositeUtils::Decision * outputDecision,
size_t & cachedIndex,
MatchingCache & matchingCache ) const
protected

Allow for the re-use of EventViews run in a previous Step in another EVCA instance configured to spawn EventViews using the same reconstruction sequence (i.e.

both algs should share a common ViewNodeName).

Definition at line 187 of file EventViewCreatorAlgorithm.cxx.

187 {
188 if (cachedViews == nullptr or m_cacheDisabled) {
189 return false; // No cached input configured, which is fine.
190 }
191
192 // If we ever stop using cached views mid-processing of a chain, then it is by far safer to continue to not use cached views in all following steps. See for example towards the end of ATR-25996
193 // We can tell this by querying for View instances in previous steps and looking for evidence of the instance being cached (no "_probe" postfix, from initiall "tag" pass)
194 // or not cached (with "_probe" postfix, from second "probe" pass)
195 std::vector<LinkInfo<ViewContainer>> previousStepViews = findLinks<ViewContainer>(outputDecision, viewString(), TrigDefs::allFeaturesOfType);
196 // If this collection is empty then we're the 1st step, so OK to look for a cached EventView to re-use. Otherwise...
197 if (previousStepViews.size()) {
198 // If there are one or more prior steps, we want to focus on the most recent which will be the first entry in the vector
199 ElementLink<ViewContainer> previousView = previousStepViews.at(0).link;
200 const bool previousStepDidNotUsedCachedView = endsWith(previousView.dataID(), "_probe");
201 if (previousStepDidNotUsedCachedView) {
202 // If we are not the 1st step, and the previous step did not use a cached view, then we are safer here to not use one either. Don't search for one. Just say no to caching here.
203 ATH_MSG_DEBUG("Previous probe step used a probe EventView for this decision object. Do not attempt to use a cached EventView in this step.");
204 return false;
205 }
206 }
207
208 bool usedROIMatchingFlag{false}; // Sanity check
209 bool result = matchInCollection(cachedViews, outputDecision, cachedIndex, usedROIMatchingFlag, matchingCache);
210 if (usedROIMatchingFlag and m_mergeUsingFeature) {
211 ATH_MSG_ERROR("Called matchInCollection in an EVCA configured with mergeUsingFeature=True, however ROI matching was used instead?! Should not be possible.");
212 }
213
214 if (result) {
215 // We have another check we have to make before we are confident that we can re-use this View
216 // The view will have originally be launched linked to N proxies (N>=0), which are the previous Steps which the View
217 // needs to link to (in which one might need to later search for physics collections needed in this or later Steps).
218 //
219 // But the list of proxies in the probe pass might be different than what it was in the tag pass.
220 // We cannot change the list of proxies in the existing tag EventView (it is now immutable)
221 //
222 // So if we are missing required proxies then we cannot re-use this EventView and have to reject the cached EV.
223 const SG::View* view = *(cachedViews->at(cachedIndex)->objectLink<ViewContainer>(viewString()));
224
225 // What prior views would we have linked if we were spawning a new View here in probe?
226 std::vector<LinkInfo<ViewContainer>> viewsToLinkVector = viewsToLink(outputDecision);
227 for (const LinkInfo<ViewContainer>& toLinkLI : viewsToLinkVector) {
228 const SG::View* toLink = *(toLinkLI.link);
229 // Was toLink linked as a proxy back in the tag stage?
230 bool foundIt = false;
231 for (const SG::View* prevLinked : view->getParentLinks()) {
232 if (prevLinked == toLink) {
233 foundIt = true;
234 break;
235 }
236 }
237 if (!foundIt) {
238 ATH_MSG_DEBUG("The cached view from the tag step is not linked to the required views from earlier steps which we need in the probe processing, we cannot re-use it.");
239 result = false;
240 break;
241 }
242 }
243 }
244
245 return result;
246}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
bool endsWith(const std::string &value, const std::string &ending)
const T * at(size_type n) const
Access an element, as an rvalue.
std::vector< TrigCompositeUtils::LinkInfo< ViewContainer > > viewsToLink(const TrigCompositeUtils::Decision *outputDecision) const
Obtain view(s) from most recent prior step(s) which are to be wired up.
Gaudi::Property< bool > m_cacheDisabled
bool matchInCollection(const TrigCompositeUtils::DecisionContainer *outDecisions, const TrigCompositeUtils::Decision *toMatch, size_t &matchIndex, bool &usedROIMatchingFlag, MatchingCache &matchingCache) const
Wrapper around matchDecision. Returns boolean if the match was successful.
Gaudi::Property< bool > m_mergeUsingFeature
const std::string & viewString()
void findLinks(const Decision *start, const std::string &linkName, std::vector< LinkInfo< T > > &links, unsigned int behaviour=TrigDefs::allFeaturesOfType, std::set< const xAOD::TrigComposite * > *fullyExploredFrom=nullptr)
search back the TC links for the object of type T linked to the one of TC (recursively) Populates pro...
static const unsigned int allFeaturesOfType
Run 3 "enum". Return all features along legs (still with type and container checks)

◆ debugPrintOut()

void InputMakerBase::debugPrintOut ( const EventContext & context,
SG::WriteHandle< TrigCompositeUtils::DecisionContainer > & outputHandle ) const
protectedinherited

provides debug printout of the output of the algorithm

Definition at line 200 of file InputMakerBase.cxx.

200 {
201 size_t validInput=0;
202 for ( const auto& inputKey: decisionInputs() ) {
203 auto inputHandle = SG::makeHandle( inputKey, context );
204 ATH_MSG_DEBUG(" " << inputKey.key() << " " << (inputHandle.isValid()? "valid": "not valid" ) );
205 if (inputHandle.isValid()) {
206 if (inputHandle->size() > 0) {
207 validInput++;
208 } else {
209 ATH_MSG_DEBUG(" " << inputKey.key() << " actually NOT valid due to size() == 0");
210 }
211 }
212 }
213 ATH_MSG_DEBUG( "Number of implicit ReadHandles for input decisions is " << decisionInputs().size() << ", " << validInput << " are valid/not-empty" );
214
215 ATH_MSG_DEBUG("Output " << outputHandle.key() <<" with "<< outputHandle->size() <<" decisions:");
216 for (const auto outdecision : *outputHandle){
218 TrigCompositeUtils::decisionIDs( outdecision, objDecisions );
219 ATH_MSG_DEBUG("Number of positive decisions for this output: " << objDecisions.size() );
220 for ( TrigCompositeUtils::DecisionID id : objDecisions ) {
221 ATH_MSG_DEBUG( " --- decision " << HLT::Identifier( id ) );
222 }
223 }
224}
const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionInputs() const
methods for derived classes to access handles of the base class input and output decisions; other rea...
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
unsigned int DecisionID
std::set< DecisionID > DecisionIDContainer
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.

◆ decisionInputs()

const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & InputMakerBase::decisionInputs ( ) const
protectedinherited

methods for derived classes to access handles of the base class input and output decisions; other read/write handles may be implemented by derived classes

Definition at line 17 of file InputMakerBase.cxx.

17 {
18 return m_inputs;
19}
SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > m_inputs
input decisions array, will be implicit (renounced).

◆ decisionInputToOutput()

StatusCode InputMakerBase::decisionInputToOutput ( const EventContext & context,
SG::WriteHandle< TrigCompositeUtils::DecisionContainer > & outputHandle ) const
protectedinherited

does the standard handling of input decisions: read from handles with all the checks, create merged output handles and link them, copies links and return outputHandles

Definition at line 43 of file InputMakerBase.cxx.

43 {
44
45 ATH_MSG_DEBUG("Creating one merged output per Decision object, IsEmptyStep flag = " << m_isEmptyStep);
46 ATH_CHECK( outputHandle.isValid() );
47 TrigCompositeUtils::DecisionContainer* outDecisions = outputHandle.ptr();
48
49 // Empty IMs have a dynamic (runtime) matching configuration. But any single IM should find itself using exclusively-feature or exclusively-ROI based matching
50 size_t usedROIMatching = 0, usedFeatureMatching = 0;
51
52 MatchingCache matchingCache; // Used to remember temporarily which hash is associated with each Decision object when performing the de-duplication matching
53 size_t totalInput = 0;
54 for ( const auto& inputKey: decisionInputs() ) {
55 auto inputHandle = SG::makeHandle( inputKey, context );
56
57 if( not inputHandle.isValid() ) {
58 ATH_MSG_DEBUG( "Got no decisions from input "<< inputKey.key() << " because implicit handle not valid");
59 continue;
60 }
61 if( inputHandle->size() == 0){
62 ATH_MSG_DEBUG( "Got no decisions from input "<< inputKey.key()<<": implicit handle is valid but container is empty.");
63 continue;
64 }
65 ATH_MSG_DEBUG( "Running on input "<< inputKey.key()<<" with " << inputHandle->size() << " elements" );
66
67
68 size_t input_counter = 0;
69 for (const TrigCompositeUtils::Decision* inputDecision : *inputHandle){
70 ATH_MSG_DEBUG( " -- Input Decision " << input_counter <<": has " <<TrigCompositeUtils::getLinkToPrevious(inputDecision).size()<<" previous links");
71
72 bool usedROIMatchingFlag = false;
73 size_t alreadyAddedIndex = std::numeric_limits<std::size_t>::max();
74 const bool alreadyAdded = matchInCollection(outDecisions, inputDecision, alreadyAddedIndex, usedROIMatchingFlag, matchingCache);
75
76 TrigCompositeUtils::Decision* outputDecision = nullptr;
77 if (alreadyAdded) { // Already added, at alreadyAddedIndex
78 if (usedROIMatchingFlag) {
79 ++usedROIMatching;
80 } else {
81 ++usedFeatureMatching;
82 }
83 outputDecision = outDecisions->at( alreadyAddedIndex );
84 ATH_MSG_DEBUG( " -- Matched to existing, " << inputKey.key() << " index " << input_counter << " is merged into existing output index " << alreadyAddedIndex << (usedROIMatchingFlag ? " Matched using ROI" : " Matched using Feature"));
85 } else { // Not already added, make new
86 outputDecision = TrigCompositeUtils::newDecisionIn( outDecisions );
87 outputDecision->setName(inputMakerNodeName());
88 outputDecision->setDetail<int32_t>("isEmpty", static_cast<int32_t>(m_isEmptyStep)); // Transient detail (only used by runtime navigation validation, never persisted)
89 matchingCache.linkOutputToInput(outputDecision, inputDecision);
90 ATH_MSG_DEBUG( " -- Did not match to existing, " << inputKey.key() << " index " << input_counter << " creates output index " << outDecisions->size()-1);
91 }
92
93 // Note: We will call linkToPrevious and insertDecisionIDs N times on a single "outputDecision", where N is the number of inputDecision which checkExisting determines are the same object.
94 TrigCompositeUtils::linkToPrevious( outputDecision, inputDecision, context ); // Link inputDecision object as the 'seed' of outputDecision
95 TrigCompositeUtils::insertDecisionIDs( inputDecision, outputDecision ); // Copy decision IDs from inputDecision into outputDecision
96 ATH_MSG_DEBUG(" -- This output decision now has " << TrigCompositeUtils::getLinkToPrevious(outputDecision).size() << " seeds and "<< outputDecision->decisions().size() << " decisionIds");
97 input_counter++;
98 } // loop over input decisions
99 totalInput+=input_counter;
100 } // end of: for ( auto inputKey: decisionInputs() )
101
102 if (usedROIMatching and usedFeatureMatching) {
103 ATH_MSG_DEBUG("This input maker used Feature-based mapping on " << usedFeatureMatching << " inputs and ROI-based mapping on " << usedROIMatching
104 << " inputs. The isEmptyIM flag is " << m_isEmptyStep);
105 }
106
107 // Print some debug messages summarising the content of the outputHandles.
108 if (msgLvl(MSG::DEBUG)) {
109 debugPrintOut(context, outputHandle);
110 }
111 ATH_MSG_DEBUG("Merging complete: from "<<totalInput<<" input decision to "<<outputHandle->size()<<" output decisions");
112
113 return StatusCode::SUCCESS;
114}
#define ATH_CHECK
Evaluate an expression and check for errors.
bool msgLvl(const MSG::Level lvl) const
size_type size() const noexcept
Returns the number of elements in the collection.
Gaudi::Property< bool > m_isEmptyStep
void debugPrintOut(const EventContext &context, SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle) const
provides debug printout of the output of the algorithm
virtual bool isValid() override final
Can the handle be successfully dereferenced?
pointer_type ptr()
Dereference the pointer.
void setName(const std::string &name)
Set a human-readable name for the object.
const std::vector< TrigCompositeUtils::DecisionID > & decisions() const
Get positive HLT chain decisions associated with this TrigComposite. Navigation use.
bool setDetail(const std::string &name, const TYPE &value)
Set an TYPE detail on the object.
const std::string & inputMakerNodeName()
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'
void linkToPrevious(Decision *d, const std::string &previousCollectionKey, size_t previousIndex)
Links to the previous object, location of previous 'seed' decision supplied by hand.
Used to cache each incoming Decision object's ElementLink which is being used to identify the Decisio...

◆ decisionOutputs()

const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & InputMakerBase::decisionOutputs ( ) const
protectedinherited

methods for derived classes to access handles of the base class input and output decisions; other read/write handles may be implemented by derived classes

Definition at line 21 of file InputMakerBase.cxx.

21 {
22 return m_outputs;
23}
SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > m_outputs
output decisions

◆ 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 EventViewCreatorAlgorithm::execute ( const EventContext & context) const
overridevirtual

Definition at line 48 of file EventViewCreatorAlgorithm.cxx.

48 {
49
50 // create the output decisions from the input collections
51 ATH_MSG_DEBUG("Starting to merge " << decisionInputs().size() << " inputs to the " << decisionOutputs().key() << " output.");
52 SG::WriteHandle<DecisionContainer> outputHandle = createAndStore( decisionOutputs(), context );
53 ATH_CHECK(outputHandle.isValid());
54 ATH_CHECK(decisionInputToOutput(context, outputHandle));
55 ATH_MSG_DEBUG("Merging complete");
56
57 // make the views
58 auto viewsHandle = SG::makeHandle( m_viewsKey, context );
59 ATH_CHECK( viewsHandle.record( std::make_unique<ViewContainer>() ) );
60 auto viewVector = viewsHandle.ptr();
61
62 // Check for an optional input handle to use as a source of cached, already-executed, views.
63 const DecisionContainer* cachedViews = nullptr;
64 MatchingCache matchingCache; // Used to remember temporarily which hash is associated with each DecisionObject when performing maching in a PROBE IM to TAG IM DecisionObjects
65 if (!m_cachedViewsKey.empty()) {
66 SG::ReadHandle<DecisionContainer> cachedRH = SG::makeHandle(m_cachedViewsKey, context);
67 // Even if the handle is configured, this precursor EventViewCreatorAlg may not have executed in a given event
68 if (cachedRH.isValid()) {
69 cachedViews = cachedRH.ptr();
70 ATH_CHECK(populateMatchingCacheWithCachedViews(cachedViews, matchingCache));
71 }
72 }
73
74 // Keep track of the ROIs we spawn a View for, do not spawn duplicates.
75 // For many cases, this will be covered by the Merging operation preceding this.
76 std::vector<ElementLink<TrigRoiDescriptorCollection>> RoIsFromDecision;
77
78 if( outputHandle->size() == 0) {
79 ATH_MSG_DEBUG( "Have no decisions in output handle "<< outputHandle.key() << ". Handle is valid but container is empty. "
80 << "This can happen if a ROI-based HLT chain leg was activated in a chain whose L1 item which does not explicitly require the ROI.");
81 } else {
82 ATH_MSG_DEBUG( "Have output " << outputHandle.key() << " with " << outputHandle->size() << " elements" );
83 }
84
85 // Find and link to the output Decision objects the ROIs to run over
86 ATH_CHECK( m_roiTool->attachROILinks(*outputHandle, context) );
87
88 for ( Decision* outputDecision : *outputHandle ) {
89
90 if (!outputDecision->hasObjectLink(roiString(), ClassID_traits<TrigRoiDescriptorCollection>::ID())) {
91 ATH_MSG_ERROR("No '" << roiString() << "'link was attached by the ROITool. Decision object dump:" << *outputDecision);
92 return StatusCode::FAILURE;
93 }
94 const ElementLink<TrigRoiDescriptorCollection> roiEL = outputDecision->objectLink<TrigRoiDescriptorCollection>(roiString());
95 ATH_CHECK(roiEL.isValid());
96
97 // We do one of three things here, either...
98 // a) We realise that an identically configured past EVCA has already run a View on an equivalent ROI. If so we can re-use this.
99 // b) We encounter a new ROI and hence need to spawn a new view.
100 // c) We encounter a ROI that we have already seen in looping over this outputHandle, we can re-use a view.
101
102 // cachedIndex and useCached are to do with a)
103 size_t cachedIndex = std::numeric_limits<std::size_t>::max();
104 const bool useCached = checkCache(cachedViews, outputDecision, cachedIndex, matchingCache);
105
106 // roiIt is to do with b) and c)
107 auto roiIt = find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL);
108
109 if (useCached) {
110
111 // Re-use an already processed view from a previously executed EVCA instance
112 const Decision* cached = cachedViews->at(cachedIndex);
113 ElementLink<ViewContainer> cachedViewEL = cached->objectLink<ViewContainer>(viewString());
114 ElementLink<TrigRoiDescriptorCollection> cachedROIEL = cached->objectLink<TrigRoiDescriptorCollection>(roiString());
115 ATH_CHECK(cachedViewEL.isValid());
116 ATH_CHECK(cachedROIEL.isValid());
117 ATH_MSG_DEBUG("Re-using cached existing view from " << cachedViewEL.dataID() << ", index:" << cachedViewEL.index() << " on ROI " << **cachedROIEL);
118 outputDecision->setObjectLink( viewString(), cachedViewEL );
119 outputDecision->setObjectLink( roiString(), cachedROIEL );
120 // Note: This overwrites the link created in the above tool with what should be a spatially identical ROI (check?)
121
122 } else if ( roiIt == RoIsFromDecision.end() ) {
123
124 // We have not yet spawned an ROI on this View. Do it now.
125 RoIsFromDecision.push_back(roiEL);
126 ATH_MSG_DEBUG("Found RoI:" << **roiEL << " FS=" << (*roiEL)->isFullscan() << ". Making View.");
127 SG::View* newView = ViewHelper::makeView( name()+"_view", viewVector->size() /*view counter*/, m_viewFallThrough );
128 viewVector->push_back( newView );
129 // Use a fall-through filter if one is provided
130 if ( m_viewFallFilter.size() ) {
131 newView->setFilter( m_viewFallFilter );
132 }
133 // Set parent view, if required. Note: Must be called before we link the new view to outputDecision.
134 ATH_CHECK(linkViewToParent(outputDecision, newView));
135 // Add the single ROI into the view to seed it.
136 ATH_CHECK(placeRoIInView(roiEL, viewVector->back(), context));
137 // Special muon case - following from a FullScan view, seed each new View with its MuonCombined::MuonCandidate
138 if (m_placeMuonInView) {
139 std::vector<LinkInfo<xAOD::MuonContainer>> muonELInfo = findLinks<xAOD::MuonContainer>(outputDecision, featureString(), TrigDefs::lastFeatureOfType);
140 ATH_CHECK( muonELInfo.size() == 1 );
141 ATH_CHECK( muonELInfo.at(0).isValid() );
142 ATH_CHECK( placeMuonInView( *(muonELInfo.at(0).link), viewVector->back(), context ) );
143 }
144 // Special jet case - following from a FullScan view, seed each new View with its xAOD::Jet
145 if (m_placeJetInView) {
146 std::vector<LinkInfo<xAOD::JetContainer>> jetELInfo = findLinks<xAOD::JetContainer>(outputDecision, featureString(), TrigDefs::lastFeatureOfType);
147 ATH_CHECK( jetELInfo.size() == 1 );
148 ATH_CHECK( jetELInfo.at(0).isValid() );
149 ATH_CHECK( placeJetInView( *(jetELInfo.at(0).link), viewVector->back(), context ) );
150 }
151 // Link the view to the Decision object
152 outputDecision->setObjectLink( viewString(), ElementLink<ViewContainer>(m_viewsKey.key(), viewVector->size()-1 ));
153 ATH_MSG_DEBUG( "Made new View, storing view in viewVector " << m_viewsKey.key() << " index:" << viewVector->size()-1 );
154
155 } else {
156
157 // We have already spawned a ROI in this View. Link it here too.
158 const size_t existingIndex = std::distance(RoIsFromDecision.begin(), roiIt);
159 ATH_MSG_DEBUG("Found existing View, stored in view in viewVector " << m_viewsKey.key() << " index:" << existingIndex );
160 outputDecision->setObjectLink( viewString(), ElementLink<ViewContainer>(m_viewsKey.key(), existingIndex )); //adding View link to Decision
161
162 }
163 } // loop over output decisions
164
165 // launch view execution
166 ATH_MSG_DEBUG( "Launching execution in " << viewVector->size() << " unique views" );
167 ATH_CHECK( ViewHelper::scheduleViews( viewVector, // Vector containing views
168 m_viewNodeName, // CF node to attach views to
169 context, // Source context
170 getScheduler(), // Scheduler to launch with
171 m_reverseViews ) ); // Debug option
172
173 return StatusCode::SUCCESS;
174}
Athena::TPCnvVers::Current Athena::TPCnvVers::Old TrigRoiDescriptorCollection
DataVector< SG::View > ViewContainer
View container for recording in StoreGate.
Definition View.h:290
Gaudi::Property< bool > m_placeJetInView
StatusCode linkViewToParent(const TrigCompositeUtils::Decision *outputDecision, SG::View *newView) const
Makes sure the views are linked, if configuration requireParentView is set.
Gaudi::Property< bool > m_placeMuonInView
Gaudi::Property< std::vector< std::string > > m_viewFallFilter
StatusCode placeRoIInView(const ElementLink< TrigRoiDescriptorCollection > &roi, SG::View *view, const EventContext &context) const
Seeds a newly created view with an ROI collection containing the single seeding ROI.
SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > m_cachedViewsKey
StatusCode placeJetInView(const xAOD::Jet *theObject, SG::View *view, const EventContext &context) const
Creates a SG::VIEW_ELEMENTS collection inside a newly created View populated by the jet used to seed ...
SG::WriteHandleKey< ViewContainer > m_viewsKey
bool checkCache(const TrigCompositeUtils::DecisionContainer *cachedViews, const TrigCompositeUtils::Decision *outputDecision, size_t &cachedIndex, MatchingCache &matchingCache) const
Allow for the re-use of EventViews run in a previous Step in another EVCA instance configured to spaw...
Gaudi::Property< bool > m_reverseViews
Gaudi::Property< bool > m_viewFallThrough
ToolHandle< IViewCreatorROITool > m_roiTool
StatusCode placeMuonInView(const xAOD::Muon *theObject, SG::View *view, const EventContext &context) const
Creates a SG::VIEW_ELEMENTS collection inside a newly created View populated by the MuonCombined::Muo...
SmartIF< IScheduler > getScheduler() const
Obtain smart pointer to scheduler in order to schedule newly spawned views.
Gaudi::Property< std::string > m_viewNodeName
StatusCode populateMatchingCacheWithCachedViews(const TrigCompositeUtils::DecisionContainer *cachedViews, MatchingCache &matchingCache) const
We look for matching Decision Objects in a matchingCache.
StatusCode decisionInputToOutput(const EventContext &context, SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle) const
does the standard handling of input decisions: read from handles with all the checks,...
const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & decisionOutputs() const
methods for derived classes to access handles of the base class input and output decisions; other rea...
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
void setFilter(std::vector< std::string > const &inputFilter)
Set a filtering rule for anything loaded via fall-through.
Definition View.h:86
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138
const std::string & roiString()
const std::string & featureString()
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.
static const unsigned int lastFeatureOfType
Run 3 "enum". Only return the final feature along each route through the navigation.
StatusCode scheduleViews(ViewContainer *viewVector, std::string const &nodeName, EventContext const &sourceContext, SmartIF< IScheduler > scheduler, bool reverseOrder=false)
Definition ViewHelper.h:85
SG::View * makeView(const std::string &common_name, int const unique_index=-1, bool const allowFallThrough=true)
Definition ViewHelper.h:252
cached(func)
Decorator to cache function return value.
Definition cached.py:6

◆ 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 & AthCommonReentrantAlgorithm< 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 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

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

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ finalize()

virtual StatusCode EventViewCreatorAlgorithm::finalize ( )
inlineoverridevirtual

Definition at line 51 of file EventViewCreatorAlgorithm.h.

51{ return StatusCode::SUCCESS; }

◆ getMatchingHashForDecision()

uint64_t InputMakerBase::getMatchingHashForDecision ( const TrigCompositeUtils::Decision * toMatch,
const std::string & linkNameToMatch ) const
protectedinherited

Searches from toMatch to locate a single (type-less) Element Link with given edge name. Returns a hash corresponding to this Element Link.

< Used to accelerate the recursive typelessFindLinks.

Definition at line 159 of file InputMakerBase.cxx.

159 {
160 std::set<const Decision*> cache;
161 std::vector<SG::sgkey_t> keys;
162 std::vector<uint32_t> clids;
163 std::vector<Decision::index_type> indicies;
164 std::vector<const Decision*> sources; // Unused
165 TrigCompositeUtils::typelessFindLinks(toMatch, linkNameToMatch, keys, clids, indicies, sources, TrigDefs::lastFeatureOfType, &cache);
166 ATH_MSG_DEBUG("getMatchingHashForDecision keys.size()="<<keys.size());
167 if (keys.size() != 1) {
168 bool suppressError = false;
169 // We silence this ERROR when the IM isEmptyStep and we are tentatively testing at runtime if there is an available "feature" link.
170 if (m_isEmptyStep and linkNameToMatch == featureString()) {
171 suppressError = true;
172 }
173 // However... we _always_ want to print the ERROR if we got here not because keys.size() == 0 but because keys.size() > 1!
174 // This is an ambiguous situation, and such things are always bad.
175 if ( keys.size() > 1) {
176 suppressError = false;
177 }
178 if (not suppressError) {
179 ATH_MSG_ERROR("InputMakerBase::getMatchingHashForDecision Did not locate exactly one object having searched for a link named '" << linkNameToMatch
180 << "', found " << keys.size() << ". Unable to match this Decision object.");
181 for (size_t i = 0; i < keys.size(); ++i) {
182 const std::string* sgKeyStr = evtStore()->keyToString(keys.at(i));
183 ATH_MSG_ERROR(" -- Key:" << keys.at(i) << " KeyStr:" << (sgKeyStr ? *sgKeyStr : "UNKNOWN") << " Index:" << indicies.at(i) << " CLID:" << clids.at(i));
184 }
185 // Super verbose output
186 ATH_MSG_ERROR(" -- -- TRACKING FULL HISTORY ");
187 NavGraph navGraph;
188 recursiveGetDecisions(toMatch, navGraph);
189 navGraph.printAllPaths(msg(), MSG::ERROR);
190 }
191 return std::numeric_limits<std::size_t>::max();
192 }
193
194 // Construct a new hash by combining the SGkey (a hash), the CLID (a hash) and the index (an offset)
195 const uint64_t matchingHash = keys.at(0) + clids.at(0) + indicies.at(0);
196 return matchingHash;
197}
void printAllPaths(MsgStream &log, MSG::Level msgLevel=MSG::VERBOSE) const
Helper function.
Definition NavGraph.cxx:165
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...

◆ getScheduler()

SmartIF< IScheduler > EventViewCreatorAlgorithm::getScheduler ( ) const
protected

Obtain smart pointer to scheduler in order to schedule newly spawned views.

◆ initialize()

StatusCode EventViewCreatorAlgorithm::initialize ( )
overridevirtual

Definition at line 22 of file EventViewCreatorAlgorithm.cxx.

22 {
23 ATH_MSG_DEBUG("Will produce views=" << m_viewsKey << " roIs=" << m_inViewRoIs );
24 ATH_CHECK( m_viewsKey.initialize() );
25 ATH_CHECK( m_inViewRoIs.initialize() );
26 ATH_CHECK( m_roiTool.retrieve() );
28 if (not m_cachedViewsKey.empty()) {
29 renounce(m_cachedViewsKey); // Reading in and using cached inputs is optional, not guarenteed to be produced in every event.
30 }
31
32 if (m_isEmptyStep) {
33 ATH_MSG_ERROR("The EventViewCreatorAlgorithm class cannot be used as the InputMaker for an empty step.");
34 return StatusCode::FAILURE;
35 }
36
37 // Muon slice code
40
41 // Jet slice code
43
44 return StatusCode::SUCCESS;
45}
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)
SG::WriteHandleKey< xAOD::MuonContainer > m_inViewMuons
SG::WriteHandleKey< ConstDataVector< TrigRoiDescriptorCollection > > m_inViewRoIs
SG::WriteHandleKey< ConstDataVector< MuonCandidateCollection > > m_inViewMuonCandidates
SG::WriteHandleKey< xAOD::JetContainer > m_inViewJets

◆ 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()

◆ linkViewToParent()

StatusCode EventViewCreatorAlgorithm::linkViewToParent ( const TrigCompositeUtils::Decision * outputDecision,
SG::View * newView ) const
protected

Makes sure the views are linked, if configuration requireParentView is set.

Failure to set the parent is an error

Definition at line 263 of file EventViewCreatorAlgorithm.cxx.

263 {
264 if (!m_requireParentView) {
265 ATH_MSG_DEBUG("Parent view linking not required");
266 return StatusCode::SUCCESS;
267 }
268 // We must call this BEFORE having added the new link, check
269 if (outputDecision->hasObjectLink(viewString())) {
270 ATH_MSG_ERROR("Called linkViewToParent on a Decision object which already has been given a '"
271 << viewString() << "' link. Call this fn BEFORE linking the new View.");
272 return StatusCode::FAILURE;
273 }
274 std::vector<LinkInfo<ViewContainer>> viewsToLinkVector = viewsToLink(outputDecision);
275 if (viewsToLinkVector.size() == 0) {
276 ATH_MSG_ERROR("Could not find the parent View, but 'RequireParentView' is true.");
277 return StatusCode::FAILURE;
278 }
279 // Note: Some Physics Objects will have diverging reco paths, but later re-combine.
280 // Examples include an ROI processed as both Electron and Photon re-combining for PrecisionCalo.
281 // Or, a tau ROI processed with different algorithms for different chains in an earlier Step.
282 // This will only cause a problem if downstream a collection is requested which was produced in more that one
283 // of the linked parent Views (or their parents...) as it is then ambiguous which collection should be read.
284 ATH_MSG_DEBUG( "Will link " << viewsToLinkVector.size() << " parent view(s)" );
285 for (const LinkInfo<ViewContainer>& toLinkLI : viewsToLinkVector) {
286 ATH_CHECK(toLinkLI.isValid());
287 newView->linkParent( *(toLinkLI.link) );
288 ATH_MSG_DEBUG( "Parent view linked (" << toLinkLI.link.dataID() << ", index:" << toLinkLI.link.index() << ")" );
289 }
290
291 return StatusCode::SUCCESS;
292}
Gaudi::Property< bool > m_requireParentView
void linkParent(const IProxyDict *parent)
Link to the previously used views.
Definition View.cxx:35
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.

◆ matchDecision()

size_t InputMakerBase::matchDecision ( const TrigCompositeUtils::DecisionContainer * outDecisions,
const TrigCompositeUtils::Decision * toMatch,
const std::string & linkNameToMatch,
MatchingCache & matchingCache ) const
protectedinherited

Checks for merge-able Decision objects coming from N upstream filters. Check based on most-recent element link with name 'linkNameToMatch'. Works for any link type.

Definition at line 140 of file InputMakerBase.cxx.

140 {
141 const uint64_t matchingHash = getMatchingHashForDecision(toMatch, linkNameToMatch);
142 ATH_MSG_DEBUG("matchDecision "<<linkNameToMatch<<" with matchingHash="<<matchingHash);
143 // Cache this matching hash, so that in subsequent calls we can compare other incoming decision object's matching hash against this one
144 matchingCache.setMatchingHash(toMatch, matchingHash);
145
146 // Look for match
147 for (size_t index = 0; index < outDecisions->size(); ++index) {
148 const TrigCompositeUtils::Decision* checkDecision = outDecisions->at(index);
149 const uint64_t checkHash = matchingCache.getMatchingHash(checkDecision);
150 ATH_MSG_DEBUG("matchDecision checkHash="<<checkHash<<" index="<<index);
151 if (checkHash == matchingHash) {
152 return index;
153 }
154 }
155
156 return std::numeric_limits<std::size_t>::max();
157}
uint64_t getMatchingHashForDecision(const TrigCompositeUtils::Decision *toMatch, const std::string &linkNameToMatch) const
Searches from toMatch to locate a single (type-less) Element Link with given edge name....
str index
Definition DeMoScan.py:362

◆ matchInCollection()

bool InputMakerBase::matchInCollection ( const TrigCompositeUtils::DecisionContainer * outDecisions,
const TrigCompositeUtils::Decision * toMatch,
size_t & matchIndex,
bool & usedROIMatchingFlag,
MatchingCache & matchingCache ) const
protectedinherited

Wrapper around matchDecision. Returns boolean if the match was successful.

< Used to accelerate the recursive typelessFindLinks.

Definition at line 117 of file InputMakerBase.cxx.

117 {
118 std::set<const Decision*> cache;
119 std::vector<SG::sgkey_t> keys;
120 std::vector<uint32_t> clids;
121 std::vector<Decision::index_type> indicies;
122 std::vector<const Decision*> sources; // Unused
123 TrigCompositeUtils::typelessFindLinks(toMatch, featureString(), keys, clids, indicies, sources, TrigDefs::lastFeatureOfType, &cache);
124 bool hasFeature = false;
125 if (keys.size() != 0) hasFeature=true;
126 ATH_MSG_DEBUG("This decision hasFeature="<< hasFeature);
127 // Do feature based matching if configured to do so, or do it tentatively for empty step IMs (will not generate an ERROR if it fails for the empty step case)
128 if ( m_mergeUsingFeature == true or (m_isEmptyStep and hasFeature) ) {
129 matchIndex = matchDecision(outDecisions, toMatch, featureString(), matchingCache);
130 ATH_MSG_DEBUG("matchDecision in features: "<< matchIndex);
131 }
132 // Do ROI based batching if configured to do so, or if feature matching failed for an empty step IM.
133 else {
134 matchIndex = matchDecision(outDecisions, toMatch, m_roisLink.value(), matchingCache);
135 usedROIMatchingFlag = true;
136 }
137 return (matchIndex != std::numeric_limits<std::size_t>::max());
138}
StringProperty m_roisLink
size_t matchDecision(const TrigCompositeUtils::DecisionContainer *outDecisions, const TrigCompositeUtils::Decision *toMatch, const std::string &linkNameToMatch, MatchingCache &matchingCache) const
Checks for merge-able Decision objects coming from N upstream filters. Check based on most-recent ele...

◆ 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.

◆ placeJetInView()

StatusCode EventViewCreatorAlgorithm::placeJetInView ( const xAOD::Jet * theObject,
SG::View * view,
const EventContext & context ) const
protected

Creates a SG::VIEW_ELEMENTS collection inside a newly created View populated by the jet used to seed the View.

Definition at line 336 of file EventViewCreatorAlgorithm.cxx.

336 {
337
338 // fill the Jet output collection
339 ATH_MSG_DEBUG( "Adding Jet To View : " << m_inViewJets.key() );
340
341 auto oneObjectCollection = std::make_unique< xAOD::JetContainer >();
342 auto oneObjectAuxCollection = std::make_unique< xAOD::JetAuxContainer >();
343 oneObjectCollection->setStore( oneObjectAuxCollection.get() );
344
345 xAOD::Jet* copiedJet = new xAOD::Jet();
346 oneObjectCollection->push_back( copiedJet );
347 *copiedJet = *theObject;
348
349 auto handle = ViewHelper::makeHandle( view, m_inViewJets, context );
350 ATH_CHECK( handle.record( std::move(oneObjectCollection),std::move(oneObjectAuxCollection) ) );
351
352 return StatusCode::SUCCESS;
353}
auto makeHandle(const SG::View *view, const KEY &key, const EventContext &ctx)
Create a view handle from a handle key.
Definition ViewHelper.h:273
Jet_v1 Jet
Definition of the current "jet version".

◆ placeMuonInView()

StatusCode EventViewCreatorAlgorithm::placeMuonInView ( const xAOD::Muon * theObject,
SG::View * view,
const EventContext & context ) const
protected

Creates a SG::VIEW_ELEMENTS collection inside a newly created View populated by the MuonCombined::MuonCandidate used to seed the View Also currently populated by the xAOD::Muon for the iso use case, but this should be removed.

Definition at line 309 of file EventViewCreatorAlgorithm.cxx.

309 {
310 // fill the Muon output collection
311 ATH_MSG_DEBUG( "Adding Muon To View : " << m_inViewMuons.key()<<" and "<<m_inViewMuonCandidates.key() );
312 auto oneObjectCollection = std::make_unique< xAOD::MuonContainer >();
313 auto oneObjectAuxCollection = std::make_unique< xAOD::MuonAuxContainer >();
314 oneObjectCollection->setStore( oneObjectAuxCollection.get() );
315
316 xAOD::Muon* copiedMuon = new xAOD::Muon();
317 oneObjectCollection->push_back( copiedMuon );
318 *copiedMuon = *theObject;
319
320 auto muonCandidate = std::make_unique< ConstDataVector< MuonCandidateCollection > >();
321 auto msLink = theObject->muonSpectrometerTrackParticleLink();
322 auto extTrackLink = theObject->extrapolatedMuonSpectrometerTrackParticleLink();
323 if(msLink.isValid() && extTrackLink.isValid()) muonCandidate->push_back( new MuonCombined::MuonCandidate(msLink, (*extTrackLink)->trackLink(), (*extTrackLink)->index()) );
324
325 //store both in the view
326 auto handleMuon = ViewHelper::makeHandle( view, m_inViewMuons, context );
327 ATH_CHECK( handleMuon.record( std::move( oneObjectCollection ), std::move( oneObjectAuxCollection )) );
328
329 auto handleCandidate = ViewHelper::makeHandle( view, m_inViewMuonCandidates, context );
330 ATH_CHECK( handleCandidate.record( std::move( muonCandidate ) ) );
331
332 return StatusCode::SUCCESS;
333}
const ElementLink< TrackParticleContainer > & extrapolatedMuonSpectrometerTrackParticleLink() const
Returns an ElementLink to the Extrapolated Muon Spectrometer TrackParticle used in identification of ...
const ElementLink< TrackParticleContainer > & muonSpectrometerTrackParticleLink() const
Returns an ElementLink to the InnerDetector TrackParticle used in identification of this muon.
Muon_v1 Muon
Reference the current persistent version:

◆ placeRoIInView()

StatusCode EventViewCreatorAlgorithm::placeRoIInView ( const ElementLink< TrigRoiDescriptorCollection > & roi,
SG::View * view,
const EventContext & context ) const
protected

Seeds a newly created view with an ROI collection containing the single seeding ROI.

Definition at line 294 of file EventViewCreatorAlgorithm.cxx.

294 {
295 // fill the RoI output collection
296 auto oneRoIColl = std::make_unique< ConstDataVector<TrigRoiDescriptorCollection> >();
297 oneRoIColl->clear( SG::VIEW_ELEMENTS ); //Don't delete the RoIs
298 oneRoIColl->push_back( *roiEL );
299
300 view->setROI(roiEL);
301
302 //store the RoI in the view
303 auto handle = ViewHelper::makeHandle( view, m_inViewRoIs, context );
304 ATH_CHECK( handle.record( std::move( oneRoIColl ) ) );
305 return StatusCode::SUCCESS;
306}
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts

◆ populateMatchingCacheWithCachedViews()

StatusCode EventViewCreatorAlgorithm::populateMatchingCacheWithCachedViews ( const TrigCompositeUtils::DecisionContainer * cachedViews,
MatchingCache & matchingCache ) const
protected

We look for matching Decision Objects in a matchingCache.

When we are trying in a PROBE InputMaker to match against the Decision Objects created prior in a TAG InputMaker then we need to pre-populate the cache with the data from the TAG InputMaker.

Definition at line 248 of file EventViewCreatorAlgorithm.cxx.

248 {
249 const std::string linkNameToMatch = m_mergeUsingFeature ? featureString() : m_roisLink.value();
250 for (const Decision* cachedView : *cachedViews) {
251 const uint64_t matchingHash = getMatchingHashForDecision(cachedView, linkNameToMatch);
252 if (matchingHash == std::numeric_limits<std::size_t>::max()) {
253 return StatusCode::FAILURE;
254 }
255 matchingCache.setMatchingHash(cachedView, matchingHash);
256 // There is no output-to-input redirection required when we're matching against the old TAG collection in the PROBE EVCA, so we can set key=value in this redirection map
257 matchingCache.linkOutputToInput(cachedView, cachedView);
258 }
259 return StatusCode::SUCCESS;
260}

◆ 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 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }

◆ renounceArray()

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

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

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

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< 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.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode InputMakerBase::sysInitialize ( )
overridevirtualinherited

initialise this base class and renounce input decision key handles

Reimplemented from AthCommonReentrantAlgorithm< Gaudi::Algorithm >.

Definition at line 25 of file InputMakerBase.cxx.

25 {
26 CHECK( AthReentrantAlgorithm::sysInitialize() ); // initialise base class
29 ATH_MSG_DEBUG("roisLink="<<m_roisLink);
30 CHECK( m_inputs.initialize() );
31 renounceArray(m_inputs); // make inputs implicit, i.e. not required by scheduler
32 ATH_MSG_DEBUG("Will consume implicit decisions:" );
33 for (auto& input: m_inputs){
34 ATH_MSG_DEBUG( " "<<input.key() );
35 }
36 CHECK( m_outputs.initialize() );
37 ATH_MSG_DEBUG(" and produce decisions: " << m_outputs.key());
38 return StatusCode::SUCCESS;
39}
#define CHECK(...)
Evaluate an expression and check for errors.
void renounceArray(SG::VarHandleKeyArray &handlesArray)

◆ 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.

◆ updateVHKA()

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

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

◆ viewsToLink()

std::vector< LinkInfo< ViewContainer > > EventViewCreatorAlgorithm::viewsToLink ( const TrigCompositeUtils::Decision * outputDecision) const
private

Obtain view(s) from most recent prior step(s) which are to be wired up.

Definition at line 183 of file EventViewCreatorAlgorithm.cxx.

183 {
185}

Member Data Documentation

◆ m_cacheDisabled

Gaudi::Property< bool > EventViewCreatorAlgorithm::m_cacheDisabled
protected
Initial value:
{ this, "CacheDisabled", false,
"Set whether cached EventViews are to be accessed" }

Definition at line 108 of file EventViewCreatorAlgorithm.h.

108 { this, "CacheDisabled", false,
109 "Set whether cached EventViews are to be accessed" };

◆ m_cachedViewsKey

SG::ReadHandleKey<TrigCompositeUtils::DecisionContainer> EventViewCreatorAlgorithm::m_cachedViewsKey
protected
Initial value:
{ this, "InputCachedViews", "",
"Optional ReadHandle on the output (InputMakerOutputDecisions) of an EVCA in a previous Step, whose Views can be re-used. Not currently used." }

Definition at line 77 of file EventViewCreatorAlgorithm.h.

77 { this, "InputCachedViews", "",
78 "Optional ReadHandle on the output (InputMakerOutputDecisions) of an EVCA in a previous Step, whose Views can be re-used. Not currently used." };

◆ m_detStore

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

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

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

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

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

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

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_inputs

SG::ReadHandleKeyArray<TrigCompositeUtils::DecisionContainer> InputMakerBase::m_inputs { this, "InputMakerInputDecisions", {}, "Input Decisions (implicit)" }
privateinherited

input decisions array, will be implicit (renounced).

Definition at line 87 of file InputMakerBase.h.

87{ this, "InputMakerInputDecisions", {}, "Input Decisions (implicit)" };

◆ m_inViewJets

SG::WriteHandleKey< xAOD::JetContainer > EventViewCreatorAlgorithm::m_inViewJets
protected
Initial value:
{this,"InViewJets","",
"Name with which the Jet should be inserted into the views"}

Definition at line 112 of file EventViewCreatorAlgorithm.h.

112 {this,"InViewJets","",
113 "Name with which the Jet should be inserted into the views"};

◆ m_inViewMuonCandidates

SG::WriteHandleKey< ConstDataVector<MuonCandidateCollection> > EventViewCreatorAlgorithm::m_inViewMuonCandidates
protected
Initial value:
{this,"InViewMuonCandidates","",
"Name with which the Muon Candidate should be inserted into the views"}

Definition at line 92 of file EventViewCreatorAlgorithm.h.

92 {this,"InViewMuonCandidates","",
93 "Name with which the Muon Candidate should be inserted into the views"};

◆ m_inViewMuons

SG::WriteHandleKey< xAOD::MuonContainer > EventViewCreatorAlgorithm::m_inViewMuons
protected
Initial value:
{this,"InViewMuons","",
"Name with which the Muon should be inserted into the views"}

Definition at line 89 of file EventViewCreatorAlgorithm.h.

89 {this,"InViewMuons","",
90 "Name with which the Muon should be inserted into the views"};

◆ m_inViewRoIs

SG::WriteHandleKey< ConstDataVector<TrigRoiDescriptorCollection> > EventViewCreatorAlgorithm::m_inViewRoIs
protected
Initial value:
{ this, "InViewRoIs", "Unspecified",
"Name of the collection which should be inserted into the just-spawned views to seed them with their ROI" }

Definition at line 59 of file EventViewCreatorAlgorithm.h.

59 { this, "InViewRoIs", "Unspecified",
60 "Name of the collection which should be inserted into the just-spawned views to seed them with their ROI" };

◆ m_isEmptyStep

Gaudi::Property<bool> InputMakerBase::m_isEmptyStep
protectedinherited
Initial value:
{this, "isEmptyStep", false,
"True if this InputMaker instance is being used in an empty step. Forgoes the requirement to link an ROI, and auto-configures the 'mergeUsingFeature' property at runtime." }

Definition at line 56 of file InputMakerBase.h.

56 {this, "isEmptyStep", false,
57 "True if this InputMaker instance is being used in an empty step. Forgoes the requirement to link an ROI, and auto-configures the 'mergeUsingFeature' property at runtime." };

◆ m_mergeUsingFeature

Gaudi::Property<bool> InputMakerBase::m_mergeUsingFeature
protectedinherited
Initial value:
{this, "mergeUsingFeature", false,
"True=the IParicle-derived feature from the previous step is used to determine identical inputs. False=the ROI located with the RoIsLink property is used to determine identical inputs" }

Definition at line 53 of file InputMakerBase.h.

53 {this, "mergeUsingFeature", false,
54 "True=the IParicle-derived feature from the previous step is used to determine identical inputs. False=the ROI located with the RoIsLink property is used to determine identical inputs" };

◆ m_outputs

SG::WriteHandleKey<TrigCompositeUtils::DecisionContainer> InputMakerBase::m_outputs { this, "InputMakerOutputDecisions", "", "Output Decisions" }
privateinherited

output decisions

Definition at line 90 of file InputMakerBase.h.

90{ this, "InputMakerOutputDecisions", "", "Output Decisions" };

◆ m_placeJetInView

Gaudi::Property< bool > EventViewCreatorAlgorithm::m_placeJetInView
protected
Initial value:
{ this, "PlaceJetInView", false,
"Jet slice specific option. Place Jet inside newly spawned View instance. See also InViewJets" }

Definition at line 104 of file EventViewCreatorAlgorithm.h.

104 { this, "PlaceJetInView", false,
105 "Jet slice specific option. Place Jet inside newly spawned View instance. See also InViewJets" };

◆ m_placeMuonInView

Gaudi::Property< bool > EventViewCreatorAlgorithm::m_placeMuonInView
protected
Initial value:
{ this, "PlaceMuonInView", false,
"Muon slice specific option. Place Muon and MuonCandidate inside newly spawned View instance. See also InViewMuons, InViewMuonCandidates" }

Definition at line 85 of file EventViewCreatorAlgorithm.h.

85 { this, "PlaceMuonInView", false,
86 "Muon slice specific option. Place Muon and MuonCandidate inside newly spawned View instance. See also InViewMuons, InViewMuonCandidates" };

◆ m_requireParentView

Gaudi::Property< bool > EventViewCreatorAlgorithm::m_requireParentView
protected
Initial value:
{ this, "RequireParentView", false,
"For each new view, locate and link any parent views (previous step). Fail if no parent view can not be found." }

Definition at line 71 of file EventViewCreatorAlgorithm.h.

71 { this, "RequireParentView", false,
72 "For each new view, locate and link any parent views (previous step). Fail if no parent view can not be found." };

◆ m_reverseViews

Gaudi::Property< bool > EventViewCreatorAlgorithm::m_reverseViews
protected
Initial value:
{ this, "ReverseViewsDebug", false,
"Reverse order of views, as a debugging option" }

Definition at line 74 of file EventViewCreatorAlgorithm.h.

74 { this, "ReverseViewsDebug", false,
75 "Reverse order of views, as a debugging option" };

◆ m_roisLink

StringProperty InputMakerBase::m_roisLink
protectedinherited
Initial value:
{this, "RoIsLink", "initialRoI",
"Name of EL to RoI object linked to the decision, used in merging input Decision objects when mergeUsingFeature=False." }

Definition at line 50 of file InputMakerBase.h.

50 {this, "RoIsLink", "initialRoI",
51 "Name of EL to RoI object linked to the decision, used in merging input Decision objects when mergeUsingFeature=False." };

◆ m_roiTool

ToolHandle<IViewCreatorROITool> EventViewCreatorAlgorithm::m_roiTool
protected
Initial value:
{this, "RoITool", "",
"Tool used to supply per-Decision Object the RoI on which the Decision Object's view is to be spawned"}

Definition at line 80 of file EventViewCreatorAlgorithm.h.

80 {this, "RoITool", "",
81 "Tool used to supply per-Decision Object the RoI on which the Decision Object's view is to be spawned"};

◆ m_schedulerName

Gaudi::Property< std::string > EventViewCreatorAlgorithm::m_schedulerName { this, "SchedulerName", "AvalancheSchedulerSvc", "Name of the scheduler" }
protected

Definition at line 63 of file EventViewCreatorAlgorithm.h.

63{ this, "SchedulerName", "AvalancheSchedulerSvc", "Name of the scheduler" };

◆ m_varHandleArraysDeclared

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

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

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

Definition at line 398 of file AthCommonDataStore.h.

◆ m_viewFallFilter

Gaudi::Property< std::vector< std::string > > EventViewCreatorAlgorithm::m_viewFallFilter
protected
Initial value:
{ this, "FallThroughFilter", {},
"An optional list of SG keys (or parts of them) that can come from StoreGate via FallThrough" }

Definition at line 68 of file EventViewCreatorAlgorithm.h.

68 { this, "FallThroughFilter", {},
69 "An optional list of SG keys (or parts of them) that can come from StoreGate via FallThrough" };

◆ m_viewFallThrough

Gaudi::Property< bool > EventViewCreatorAlgorithm::m_viewFallThrough
protected
Initial value:
{ this, "ViewFallThrough", false,
"Set whether views may access StoreGate directly to retrieve data" }

Definition at line 66 of file EventViewCreatorAlgorithm.h.

66 { this, "ViewFallThrough", false,
67 "Set whether views may access StoreGate directly to retrieve data" };

◆ m_viewNodeName

Gaudi::Property< std::string > EventViewCreatorAlgorithm::m_viewNodeName { this, "ViewNodeName", "", "Name of the ControlFlow node to attach new views to" }
protected

Definition at line 64 of file EventViewCreatorAlgorithm.h.

64{ this, "ViewNodeName", "", "Name of the ControlFlow node to attach new views to" };

◆ m_viewsKey

SG::WriteHandleKey< ViewContainer > EventViewCreatorAlgorithm::m_viewsKey
protected
Initial value:
{ this, "Views", "Unspecified",
"The key of views collection produced" }

Definition at line 56 of file EventViewCreatorAlgorithm.h.

56 { this, "Views", "Unspecified",
57 "The key of views collection produced" };

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