ATLAS Offline Software
Loading...
Searching...
No Matches
Navigation.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6
7#include "GaudiKernel/System.h"
8
11#include "GaudiKernel/MsgStream.h"
12#include <sstream>
13#include <iostream>
14#include <algorithm>
15#include <charconv>
16#include <ranges>
17#include <string_view>
18
19using namespace HLT;
20
21Navigation::Navigation( const std::string& type, const std::string& name,
22 const IInterface* parent )
23 : AthAlgTool(type, name, parent),
24 NavigationCore(static_cast<AthAlgTool&>(*this)),
25 m_serializerServiceHandle("TrigSerializeCnvSvc", name),
26 m_clidSvc("ClassIDSvc", name),
28{
29
31 "List of classes which need to be serialized together with the Navigation.");
32
33 declareProperty("ClassesToPayload_DSonly", m_classesToPayloadProperty_DSonly,
34 "List of classes which need to be serialized together with the Navigation (Only in DataScouting collection).");
35
36 declareProperty("ClassesFromPayloadIgnore", m_classesFromPayloadIgnoreProperty,
37 "List of classes (Type[#Key]) to ignore on deserialization of the Navigation. "
38 "Type can be an actual type name or CLID (useful for deleted classes).");
39
40 declareProperty("ClassesToPreregister", m_classesToPreregisterProperty,
41 "List of classes which need to be put in SG independently if they appear in event.");
42
43 declareProperty("ObjectsKeyPrefix", m_objectsKeyPrefix="HLT", "The prefix which all Trigger EDM objects will get, by default it is HLT");
44 declareProperty("ObjectsIndexOffset", m_objectsIndexOffset=0, "The offset with which the objects idx is be shifted.");
45 declareProperty("ReadonlyHolders", m_readonly = false, "read only flag for holders (cannot create new feature containers");
46}
47
50
51
53
54 // initialize some pointers of our base class
55 //m_log = &msg();
56 m_storeGate = evtStore().operator->();
57
60
63
64 ATH_CHECK(m_clidSvc.retrieve());
65
66 // payload def
69
70 // ignored classes
71 std::vector<CSPair> ignore;
73 if ( !ignore.empty() ) {
74 ATH_MSG_INFO( "Ignoring " << m_classesFromPayloadIgnoreProperty << " during deserialization");
75 }
76 for (const auto& c : ignore) {
77 ATH_MSG_DEBUG("Ignoring CLID " << c.first << (c.second.empty() ? "" : " with label "+c.second) <<
78 " during deserialization");
79 m_fullholderfactory.addClassToIgnore(c.first, c.second);
80 }
81
82 // initialize converters
83 for (const CSPair& p : m_classesToPayload) {
84 const CLID cl = p.first;
85 StatusCode stmp = m_serializerSvc->addConverter(cl);
86 if (stmp.isFailure())
87 ATH_MSG_WARNING("Initialization of a converter for CLID=" << cl << " failed");
88 }
89
90 // preregistration def
92
93 // print out registered holders
94 if ( msgLvl(MSG::VERBOSE) ) {
95 for (const auto& [clid, holder] : HLT::TypeMaps::holders()) {
96 if (holder==nullptr)
97 ATH_MSG_ERROR("static type information not intialized. Holder is null pointer");
98 else
99 ATH_MSG_VERBOSE(*holder);
100 }
101 }
102
103 // load libraries
104 for ( const std::string& dll : m_dlls ) {
105 System::ImageHandle handle = 0;
106 if ( System::loadDynamicLib( dll, &handle) != 1 )
107 ATH_MSG_WARNING("failed to load " << dll);
108 else
109 ATH_MSG_DEBUG("forcibly loaded library " << dll);
110 }
111
112 ATH_MSG_DEBUG(" successfully initialized Navigation");
113
114 return StatusCode::SUCCESS;
115}
116
117StatusCode
118Navigation::classKey2CLIDKey(const std::vector<std::string>& property,
119 std::vector<CSPair>& decoded ) {
120 // translate Class names into CLID numbers
121
122 for ( const std::string& cname : property ) {
123 CLID clid{0};
124 std::string key;
125 std::string type;
126
127 if ( auto hashPos = cname.find('#'); hashPos!= std::string::npos ) {
128 type = cname.substr(0, hashPos);
129 key = cname.substr(hashPos+1 );
130 } else {
131 type = cname;
132 key = "";
133 }
134
135 // First check if type is already a CLID
136 auto result = std::from_chars(type.data(), type.data() + type.size(), clid);
137
138 // If not, convert type name to CLID
139 if (result.ec != std::errc()) {
140 if ( m_clidSvc->getIDOfTypeName(type, clid).isFailure() ) {
141 ATH_MSG_ERROR("Unable to get CLID for class: " << cname);
142 return StatusCode::FAILURE;
143 }
144 }
145
146 ATH_MSG_DEBUG("Recognized CLID : " << type << " and key: " << key);
147
149
150 // anything after a dot is a list of dynamic Aux attributes, separated by dots
151 size_t dotpos = key.find('.');
152 if( dotpos == std::string::npos ) {
153 // If no explicit selection, we want to select nothing (this is a
154 // difference from the offline logic). But an empty selection list
155 // in AuxSelection means to accept everything. So add a dummy name
156 // that shouldn't match anything.
157 const char* dummyName = "__dummyThatShouldNotMatch";
158 [[maybe_unused]]
159 static const SG::Accessor<int> dummyVar (dummyName);
160 static const std::set<std::string> dummySet { dummyName };
161 sel.selectAux (dummySet);
162 }
163 else {
164 std::string aux_attr = key.substr(dotpos+1);
165 key.erase (dotpos, std::string::npos);
166 std::vector<std::string> tokens;
167 for (auto&& token : std::views::split(std::string_view{aux_attr}, '.')) tokens.emplace_back(token.begin(), token.end());
168 sel.selectAux (std::set<std::string> (tokens.begin(), tokens.end()));
169 }
170
171 decoded.emplace_back (clid, key, std::move (sel));
172 }
173 return StatusCode::SUCCESS;
174}
175
176MsgStream& HLT::operator<< ( MsgStream& m, const Navigation& nav ) {
177 m << (NavigationCore&)nav;
178 return m;
179}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
Base class for elements of a container that can have aux data.
uint32_t CLID
The Class ID type.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
The NavigationCore class, adds on top of the TrigNavStructure the EDM read-only handling.
NavigationCore(const AthAlgTool &logger)
constructor with parent AlgTool for printing
ITrigHolderFactory * m_holderfactory
std::vector< std::string > m_classesFromPayloadIgnoreProperty
list of classes::keys to ignore on deserialization
std::vector< CSPair > m_classesToPayload_DSonly
classess are put to payload according to that priority list (CLID + key)
IConversionSvc * m_serializerSvc
unsigned m_objectsIndexOffset
small integer used to generate sub type index
std::vector< std::string > m_classesToPayloadProperty_DSonly
list of classes::keys to be put to DS payload
std::vector< std::string > m_classesToPayloadProperty
list of classes::keys to be put to BS payload
StoreGateSvc * m_storeGate
std::vector< std::string > m_classesToPreregisterProperty
as above but for preregistration
std::vector< CSPair > m_classesToPayload
classess are put to payload according to that priority list (CLID + key)
std::vector< CSPair > m_classesToPreregister
classes mentioned here will be put to SG irrespectively of thier presence in event
bool msgLvl(const MSG::Level lvl) const
std::string m_objectsKeyPrefix
property setting prefix which is to be given to all trigger EDM objects
The Navigation class, organizes TriggerElements into the tree structure.
Definition Navigation.h:100
ServiceHandle< IClassIDSvc > m_clidSvc
Definition Navigation.h:168
StatusCode classKey2CLIDKey(const std::vector< std::string > &property, std::vector< CSPair > &decoded)
FullHolderFactory m_fullholderfactory
Definition Navigation.h:170
virtual StatusCode initialize() override
Gaudi::Property< std::vector< std::string > > m_dlls
Definition Navigation.h:169
virtual ~Navigation()
ServiceHandle< IConversionSvc > m_serializerServiceHandle
Definition Navigation.h:167
static const CLIDtoHolderMap & holders()
Definition TypeMaps.h:30
Helper class to provide type-safe access to aux data.
Class helping in dealing with dynamic branch selection.
It used to be useful piece of code for replacing actual SG with other store of similar functionality ...
MsgStream & operator<<(MsgStream &m, const Navigation &nav)