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::AuxElement::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
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)