ATLAS Offline Software
Loading...
Searching...
No Matches
APRDefaults.h
Go to the documentation of this file.
1// Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3#ifndef APRDEFAULTS_H
4#define APRDEFAULTS_H
5
7
8#include <atomic>
9#include <map>
10#include <mutex>
11#include <optional>
12#include <shared_mutex>
13#include <string>
14#include <string_view>
15
16namespace APRDefaults {
17
18 // The write configuration namespace encapsulates all logic that is related to the naming scheme of containers in the output file
19 namespace WriteConfig {
20 // Container naming scheme
21 enum class NamingScheme {
22 Historical, // Traditional TTree-based names (CollectionTree, POOLCollectionTree, etc.)
23 Canonical // Modern canonical names (EventData, EventTag, etc.)
24 };
25
26 // Name categories
33
34 // Technology-specific name sets
35 namespace ContainerNames {
36 struct Historical {
37 static constexpr const char* EventData = "CollectionTree";
38 static constexpr const char* EventTag = "POOLCollectionTree";
39 static constexpr const char* DataHeader = "POOLContainer";
40 static constexpr const char* MetaData = "MetaData";
41 };
42
43 struct Canonical {
44 static constexpr const char* EventData = "EventData";
45 static constexpr const char* EventTag = "EventTag";
46 static constexpr const char* DataHeader = "DataHeader";
47 static constexpr const char* MetaData = "MetaData";
48 };
49 }
50
51 namespace detail {
52 // Atomic global naming scheme - shared across all threads
53 inline std::atomic<NamingScheme>& getGlobalScheme() {
54 static std::atomic<NamingScheme> s_scheme{NamingScheme::Historical};
55 return s_scheme;
56 }
57
58 template<NameType NT>
59 constexpr const char* getNameImpl(NamingScheme scheme) {
60 switch (scheme) {
66 break;
72 break;
73 }
74 return "";
75 }
76 }
77
78 // Set the global naming scheme (thread-safe)
79 inline void setNamingScheme(NamingScheme scheme) {
80 detail::getGlobalScheme().store(scheme, std::memory_order_relaxed);
81 }
82
83 // Get the current global naming scheme (thread-safe)
85 return detail::getGlobalScheme().load(std::memory_order_relaxed);
86 }
87
88 // Convenience method to parse strings
89 inline std::optional<NamingScheme> parseNamingScheme(std::string_view name) {
90 if (name == "Historical") return NamingScheme::Historical;
91 if (name == "Canonical") return NamingScheme::Canonical;
92 return std::nullopt;
93 }
94
95 // Public API with explicit scheme parameter
96 constexpr const char* getName(NamingScheme scheme, NameType type) {
97 switch (type) {
102 }
103 return "";
104 }
105
106 // Convenience functions using global scheme
107 inline const char* getEventDataName() {
109 }
110
111 inline const char* getEventTagName() {
113 }
114
115 inline const char* getDataHeaderName() {
117 }
118
119 inline const char* getMetaDataName() {
121 }
122
123 // Overloads with explicit scheme
124 constexpr const char* getEventDataName(NamingScheme scheme) {
125 return getName(scheme, NameType::EventData);
126 }
127
128 constexpr const char* getEventTagName(NamingScheme scheme) {
129 return getName(scheme, NameType::EventTag);
130 }
131
132 constexpr const char* getDataHeaderName(NamingScheme scheme) {
133 return getName(scheme, NameType::DataHeader);
134 }
135
136 constexpr const char* getMetaDataName(NamingScheme scheme) {
137 return getName(scheme, NameType::MetaData);
138 }
139 } // namespace WriteConfig
140
141 // The read configuration namespace encapsulates all logic that is related to the naming scheme of containers in the input file
142 namespace ReadConfig {
143 // Container names default to legacy values in read mode for backwards compatibility
145 std::string EventTag = "POOLCollectionTree";
146 std::string DataHeader = "POOLContainer";
147 };
148
149 namespace detail {
150 inline std::shared_mutex& getMutex() {
151 static std::shared_mutex s_mutex;
152 return s_mutex;
153 }
154
156 static const ContainerNames s_defaultNames{};
157 return s_defaultNames;
158 }
159
160 inline std::map<std::string, ContainerNames, std::less<>>& getNamesByDatabase() {
161 static std::map<std::string, ContainerNames, std::less<>> s_namesByDatabase ATLAS_THREAD_SAFE;
162 return s_namesByDatabase;
163 }
164 }
165
166 // Setters (exclusive write lock)
167 inline void setEventTagName(std::string_view databaseName, std::string_view name) {
168 std::unique_lock lock{detail::getMutex()};
169 detail::getNamesByDatabase().try_emplace(std::string{databaseName}).first->second.EventTag = name;
170 }
171
172 inline void setDataHeaderName(std::string_view databaseName, std::string_view name) {
173 std::unique_lock lock{detail::getMutex()};
174 detail::getNamesByDatabase().try_emplace(std::string{databaseName}).first->second.DataHeader = name;
175 }
176
177 // Removers (exclusive write lock)
178 inline void clearDatabase(std::string_view databaseName) {
179 std::unique_lock lock{detail::getMutex()};
180 auto& m = detail::getNamesByDatabase();
181 const auto it = m.find(databaseName);
182 if (it != m.end()) m.erase(it);
183 }
184
185 inline void clearAll() {
186 std::unique_lock lock{detail::getMutex()};
188 }
189
190 // Getters (shared read lock)
191 inline std::string getEventTagName(std::string_view databaseName) {
192 std::shared_lock lock{detail::getMutex()};
193 const auto& namesByDatabase = detail::getNamesByDatabase();
194 const auto it = namesByDatabase.find(databaseName);
195 return (it != namesByDatabase.end()) ? it->second.EventTag : detail::getDefaultNames().EventTag;
196 }
197
198 inline std::string getDataHeaderName(std::string_view databaseName) {
199 std::shared_lock lock{detail::getMutex()};
200 const auto& namesByDatabase = detail::getNamesByDatabase();
201 const auto it = namesByDatabase.find(databaseName);
202 return (it != namesByDatabase.end()) ? it->second.DataHeader : detail::getDefaultNames().DataHeader;
203 }
204 } // namespace ReadConfig
205
206 static constexpr const char* IndexColName = "index_ref";
207 static constexpr const char* DataHeaderTypeName = "DataHeader";
208 static constexpr const char* DataHeaderFormTypeName = "DataHeaderForm";
209 static constexpr const char* EventTagTypeName = "AttributeList";
210 static constexpr const char* ParamsKeyEventTag = "POOL_CONTAINERNAME_EVENTTAG";
211 static constexpr const char* ParamsKeyDataHeader = "POOL_CONTAINERNAME_DATAHEADER";
212
213}
214
215#endif
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
Define macros for attributes used to control the static checker.
#define ATLAS_THREAD_SAFE
This class provides the layout for summary information stored for data written to POOL.
Definition DataHeader.h:123
std::map< std::string, ContainerNames, std::less<> > & getNamesByDatabase()
std::shared_mutex & getMutex()
const ContainerNames & getDefaultNames()
std::string getDataHeaderName(std::string_view databaseName)
void clearDatabase(std::string_view databaseName)
std::string getEventTagName(std::string_view databaseName)
void setEventTagName(std::string_view databaseName, std::string_view name)
void setDataHeaderName(std::string_view databaseName, std::string_view name)
constexpr const char * getNameImpl(NamingScheme scheme)
Definition APRDefaults.h:59
std::atomic< NamingScheme > & getGlobalScheme()
Definition APRDefaults.h:53
const char * getMetaDataName()
const char * getEventDataName()
std::optional< NamingScheme > parseNamingScheme(std::string_view name)
Definition APRDefaults.h:89
void setNamingScheme(NamingScheme scheme)
Definition APRDefaults.h:79
const char * getDataHeaderName()
NamingScheme getNamingScheme()
Definition APRDefaults.h:84
constexpr const char * getName(NamingScheme scheme, NameType type)
Definition APRDefaults.h:96
const char * getEventTagName()
static constexpr const char * ParamsKeyEventTag
static constexpr const char * DataHeaderTypeName
static constexpr const char * EventTagTypeName
static constexpr const char * ParamsKeyDataHeader
static constexpr const char * DataHeaderFormTypeName
static constexpr const char * IndexColName