ATLAS Offline Software
Loading...
Searching...
No Matches
EventViewCreatorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 General-purpose view creation algorithm <bwynne@cern.ch>
3
4 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5*/
6
8#include "AthLinks/ElementLink.h"
10#include "AthViews/View.h"
12
13#include <sstream>
14
15using namespace TrigCompositeUtils;
16
17EventViewCreatorAlgorithm::EventViewCreatorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
18: InputMakerBase( name, pSvcLocator ) {}
19
21
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}
46
47
48StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) const {
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.");
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()) {
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());
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}
175
176bool endsWith(const std::string& value, const std::string& ending) {
177 if (ending.size() > value.size()) {
178 return false;
179 }
180 return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
181}
182
183std::vector<LinkInfo<ViewContainer>> EventViewCreatorAlgorithm::viewsToLink(const Decision* outputDecision) const {
185}
186
187bool EventViewCreatorAlgorithm::checkCache(const DecisionContainer* cachedViews, const Decision* outputDecision, size_t& cachedIndex, MatchingCache& matchingCache) const {
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}
247
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}
261
262
263StatusCode EventViewCreatorAlgorithm::linkViewToParent( const TrigCompositeUtils::Decision* outputDecision, SG::View* newView ) const {
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}
293
294StatusCode EventViewCreatorAlgorithm::placeRoIInView( const ElementLink<TrigRoiDescriptorCollection>& roiEL, SG::View* view, const EventContext& context ) const {
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}
307
308
309StatusCode EventViewCreatorAlgorithm::placeMuonInView( const xAOD::Muon* theObject, SG::View* view, const EventContext& context ) const {
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}
334
335// TODO - Template this?
336StatusCode EventViewCreatorAlgorithm::placeJetInView( const xAOD::Jet* theObject, SG::View* view, const EventContext& context ) const {
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
bool endsWith(const std::string &value, const std::string &ending)
DataVector< SG::View > ViewContainer
View container for recording in StoreGate.
Definition View.h:290
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 T * at(size_type n) const
Access an element, as an rvalue.
SG::WriteHandleKey< xAOD::MuonContainer > m_inViewMuons
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
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< 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
SG::WriteHandleKey< ConstDataVector< TrigRoiDescriptorCollection > > m_inViewRoIs
Gaudi::Property< bool > m_requireParentView
virtual StatusCode initialize() override
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 ...
virtual StatusCode execute(const EventContext &) const override
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...
SG::WriteHandleKey< ConstDataVector< MuonCandidateCollection > > m_inViewMuonCandidates
Gaudi::Property< bool > m_reverseViews
Gaudi::Property< bool > m_cacheDisabled
Gaudi::Property< bool > m_viewFallThrough
ToolHandle< IViewCreatorROITool > m_roiTool
SG::WriteHandleKey< xAOD::JetContainer > m_inViewJets
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.
Gaudi::Property< bool > m_isEmptyStep
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....
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,...
StringProperty m_roisLink
const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & decisionOutputs() const
methods for derived classes to access handles of the base class input and output decisions; other rea...
InputMakerBase(const std::string &name, ISvcLocator *pSvcLocator)
constructor, to be called by sub-class constructors
const SG::ReadHandleKeyArray< TrigCompositeUtils::DecisionContainer > & decisionInputs() const
methods for derived classes to access handles of the base class input and output decisions; other rea...
Gaudi::Property< bool > m_mergeUsingFeature
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
A "view" of the event store (IProxyDict).
Definition View.h:46
void setFilter(std::vector< std::string > const &inputFilter)
Set a filtering rule for anything loaded via fall-through.
Definition View.h:86
void linkParent(const IProxyDict *parent)
Link to the previously used views.
Definition View.cxx:35
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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.
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.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
const std::string & viewString()
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.
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 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)
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
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".
Muon_v1 Muon
Reference the current persistent version:
Used to cache each incoming Decision object's ElementLink which is being used to identify the Decisio...
void linkOutputToInput(const TrigCompositeUtils::Decision *outputDecision, const TrigCompositeUtils::Decision *inputDecision)
void setMatchingHash(const TrigCompositeUtils::Decision *inputDecision, const uint64_t matchingHash)
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
Definition LinkInfo.h:22