ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Database
PersistentDataModel
src
DataHeader.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
9
10
#include "
PersistentDataModel/DataHeader.h
"
11
#include "
PersistentDataModel/TokenAddress.h
"
12
13
#include "
SGTools/TransientAddress.h
"
14
#include "
SGTools/DataProxy.h
"
15
#include "
AthenaKernel/IStringPool.h
"
16
#include "
CxxUtils/ranges.h
"
17
#include <print>
18
19
//______________________________________________________________________________
20
DataHeaderElement::DataHeaderElement
() :
m_pClid
(0),
m_clids
(),
m_key
(),
m_alias
(),
m_hashes
() {
21
}
22
//______________________________________________________________________________
23
DataHeaderElement::DataHeaderElement
(
const
DataHeaderElement
& rhs) :
m_pClid
(rhs.
m_pClid
),
24
m_clids
(rhs.
m_clids
),
25
m_key
(rhs.
m_key
),
26
m_alias
(rhs.
m_alias
),
27
m_token
(rhs.
getToken
()),
28
m_hashes
(rhs.
m_hashes
) {
29
}
30
//______________________________________________________________________________
31
DataHeaderElement::DataHeaderElement
(
const
SG::TransientAddress
* sgAddress, IOpaqueAddress* tokAddress,
32
const
std::string& pTag)
33
:
DataHeaderElement
(sgAddress->clID(),
34
sgAddress->name(),
35
sgAddress->transientID(),
36
std
::
vector
<
std
::
string
>(sgAddress->alias()),
37
sgAddress->address(),
38
tokAddress, pTag)
39
{
40
}
41
//______________________________________________________________________________
42
DataHeaderElement::DataHeaderElement
(
const
SG::DataProxy
* proxy, IOpaqueAddress* tokAddress,
43
const
std::string& pTag)
44
:
DataHeaderElement
(proxy->clID(),
45
proxy->name(),
46
proxy->transientID(),
47
proxy->alias(),
48
proxy->address(),
49
tokAddress, pTag)
50
{
51
}
52
//______________________________________________________________________________
53
DataHeaderElement::DataHeaderElement
(
CLID
clid,
54
const
std::string& name,
55
const
std::vector<CLID>& tClids,
56
std::vector<std::string>&& alias,
57
IOpaqueAddress* tadAddress,
58
IOpaqueAddress* tokAddress,
59
const
std::string& pTag)
60
:
m_pClid
(clid),
61
m_clids
(tClids),
62
m_key
((pTag.
empty
()) ? name : pTag),
63
m_alias
(
std
::move(alias)),
64
m_hashes
()
65
{
66
std::ranges::sort (
m_clids
);
67
const
auto
ret = std::ranges::unique (
m_clids
);
68
m_clids
.erase (ret.begin(), ret.end());
69
std::erase (
m_clids
,
m_pClid
);
70
TokenAddress
* tokAddr =
dynamic_cast<
TokenAddress
*
>
(tokAddress);
71
if
(tokAddr != 0 && tokAddr->
getToken
() != 0) {
72
tokAddr->
getToken
()->
setData
(&
m_token
);
73
}
else
{
74
tokAddr =
dynamic_cast<
TokenAddress
*
>
(tadAddress);
75
if
(tokAddr != 0 && tokAddr->
getToken
() != 0) {
76
tokAddr->
getToken
()->
setData
(&
m_token
);
77
}
else
if
(tokAddress != 0) {
78
m_token
.fromString(*(tokAddress->par()));
79
}
else
if
(tadAddress != 0) {
80
m_token
.fromString(*(tadAddress->par()));
81
}
82
}
83
}
84
//______________________________________________________________________________
85
DataHeaderElement::DataHeaderElement
(
const
CLID
classID
,
86
const
std::string& key,
Token
&& token)
87
:
m_pClid
(
classID
),
m_clids
(),
m_key
(key),
m_alias
(),
m_token
(
std
::move(token)),
m_hashes
() {
88
}
89
//______________________________________________________________________________
90
DataHeaderElement::~DataHeaderElement
() {
91
}
92
//______________________________________________________________________________
93
DataHeaderElement
&
DataHeaderElement::operator=
(
const
DataHeaderElement
& rhs) {
94
if
(
this
!= &rhs) {
95
m_pClid
= rhs.
m_pClid
;
96
m_clids
= rhs.
m_clids
;
97
m_key
= rhs.
m_key
;
98
m_alias
= rhs.
m_alias
;
99
rhs.
getToken
()->
setData
(&
m_token
);
100
m_hashes
= rhs.
m_hashes
;
101
}
102
return
(*
this
);
103
}
104
//______________________________________________________________________________
105
CLID
DataHeaderElement::getPrimaryClassID
()
const
{
106
if
(
m_pClid
> 0) {
107
return
(
m_pClid
);
108
}
109
return
(
m_clids
.front());
110
}
111
//______________________________________________________________________________
112
const
std::set<CLID>
DataHeaderElement::getClassIDs
()
const
{
113
std::set<CLID> allClids (
m_clids
.begin(),
m_clids
.end());
114
allClids.insert(
m_pClid
);
115
return
(allClids);
116
}
117
//______________________________________________________________________________
118
const
std::string&
DataHeaderElement::getKey
()
const
{
119
return
(
m_key
);
120
}
121
//______________________________________________________________________________
122
const
std::vector<std::string>&
DataHeaderElement::getAlias
()
const
{
123
return
(
m_alias
);
124
}
125
//_____________________________________________________________________________
126
const
Token
*
DataHeaderElement::getToken
()
const
{
127
return
(&
m_token
);
128
}
129
//_____________________________________________________________________________
130
const
std::vector<DataHeaderElement::sgkey_t>&
131
DataHeaderElement::getHashes
()
const
{
132
return
(
m_hashes
);
133
}
134
//______________________________________________________________________________
135
void
DataHeaderElement::addHash
(
IStringPool
*
pool
) {
136
if
(!
m_hashes
.empty()) {
137
return
;
138
}
139
std::set<CLID> clids =
getClassIDs
();
140
for
(std::set<CLID>::iterator iter = clids.begin(), last = clids.end(); iter != last; ++iter) {
141
m_hashes
.push_back(
pool
->stringToKey(
m_key
, *iter));
142
}
143
}
144
//______________________________________________________________________________
145
SG::TransientAddress
*
DataHeaderElement::getAddress
(
long
storageType)
const
{
146
return
getAddress
(storageType,
m_key
);
147
}
148
//______________________________________________________________________________
149
SG::TransientAddress
*
DataHeaderElement::getAddress
(
long
storageType,
const
std::string& key)
const
{
150
CLID
primaryClID =
getPrimaryClassID
();
151
TokenAddress
* tokAdd =
new
TokenAddress
(storageType, primaryClID,
""
,
m_key
, 0, &
m_token
);
152
SG::TransientAddress
* sgAddress =
new
SG::TransientAddress
(primaryClID, key, tokAdd,
m_clids
);
153
if
(!
m_hashes
.empty()) {
154
// If we have the sgkey corresponding to the primary clid, record
155
// it in the address. This will allow us to do lookups later by sgkey
156
// rather than by name.
157
// But be careful: the key for the primary clid is not necessarily
158
// the first one in m_hashes. The keys in m_hashes correspond to
159
// all the CLIDs in ascending order. m_clids holds all CLIDs
160
// _except_ for the primary one, in sorted order.
161
// So we want to find the index at which the primary CLID would
162
// be inserted into m_clids to keep it sorted. We could do this
163
// using std::upper_bound. However, in the common cases, we only
164
// have about 2 entries in m_clids. In that case, it's faster
165
// to just do a linear search.
166
auto
it = std::ranges::find_if (
m_clids
, std::bind_front(std::less<int>{}, primaryClID));
167
sgAddress->
setSGKey
(
m_hashes
[it -
m_clids
.begin()]);
168
}
169
sgAddress->
setAlias
(
m_alias
);
170
return
(sgAddress);
171
}
172
//______________________________________________________________________________
173
void
DataHeaderElement::dump
(std::ostream& ostr)
const
174
{
175
using namespace
std
;
176
std::println (ostr,
"SGKey: {}"
,
getKey
());
177
std::print (ostr,
"CLID: {}"
,
getPrimaryClassID
());
178
if
(
getClassIDs
().
size
() > 1 ) {
179
std::print (ostr,
" ||"
);
180
for
(
auto
& c :
getClassIDs
() ) std::print (ostr,
" {}"
, c);
181
}
182
std::println();
183
if
(
getAlias
().
size
() > 0 ) {
184
std::print (ostr,
"Alias: "
);
185
for
(
const
std::string&
a
:
getAlias
() ) std::print (ostr,
" {}"
,
a
);
186
std::println();
187
}
188
std::println (ostr,
"Token: {}"
,
m_token
.toString());
189
if
(
m_hashes
.size() ) {
190
std::print (ostr,
"Hashes:"
);
191
for
(
auto
h
:
m_hashes
) std::print (ostr,
" {}"
,
h
);
192
std::println();
193
}
194
}
195
196
//______________________________________________________________________________
197
//______________________________________________________________________________
198
DataHeader::DataHeader
() :
m_dataHeader
(),
199
m_inputDataHeader
(),
200
m_status
(
statusFlag
(
Other
)),
201
m_processTag
(),
202
m_attrList
(0),
203
m_evtRefTokenStr
() {
204
}
205
//______________________________________________________________________________
206
DataHeader::DataHeader
(
const
DataHeader
& rhs) :
207
DataObject (rhs),
208
m_dataHeader
(rhs.
m_dataHeader
),
209
m_inputDataHeader
(rhs.
m_inputDataHeader
),
210
m_status
(rhs.
m_status
),
211
m_processTag
(rhs.
m_processTag
),
212
m_attrList
(rhs.
m_attrList
),
213
m_evtRefTokenStr
() {
214
}
215
//______________________________________________________________________________
216
DataHeader::~DataHeader
() {
217
}
218
//______________________________________________________________________________
219
DataHeader
&
DataHeader::operator=
(
const
DataHeader
& rhs) {
220
if
(
this
!= &rhs) {
221
m_dataHeader
= rhs.
m_dataHeader
;
222
m_inputDataHeader
= rhs.
m_inputDataHeader
;
223
m_status
= rhs.
m_status
;
224
m_processTag
= rhs.
m_processTag
;
225
m_attrList
= rhs.
m_attrList
;
226
}
227
return
(*
this
);
228
}
229
//______________________________________________________________________________
230
void
DataHeader::setStatus
(
statusFlag
status) {
231
m_status
= status;
232
}
233
//______________________________________________________________________________
234
bool
DataHeader::isInput
()
const
{
235
return
(
m_status
==
statusFlag
(
Input
));
236
}
237
//______________________________________________________________________________
238
void
DataHeader::setProcessTag
(
const
std::string& processTag) {
239
m_processTag
= processTag;
240
}
241
//______________________________________________________________________________
242
const
std::string&
DataHeader::getProcessTag
()
const
{
243
return
(
m_processTag
);
244
}
245
//______________________________________________________________________________
246
int
DataHeader::size
()
const
{
247
return
(
m_dataHeader
.size());
248
}
249
//______________________________________________________________________________
250
std::vector<DataHeaderElement>::const_iterator
DataHeader::begin
()
const
{
251
return
(
m_dataHeader
.begin());
252
}
253
//______________________________________________________________________________
254
std::vector<DataHeaderElement>::const_iterator
DataHeader::end
()
const
{
255
return
(
m_dataHeader
.end());
256
}
257
//______________________________________________________________________________
258
const
std::vector<DataHeaderElement>&
DataHeader::elements
()
const
{
259
return
m_dataHeader
;
260
}
261
//______________________________________________________________________________
262
void
DataHeader::insert
(
const
SG::TransientAddress
* sgAddress, IOpaqueAddress* tokAddress,
const
std::string& pTag) {
263
if
(sgAddress != 0) {
264
m_dataHeader
.emplace_back(sgAddress, tokAddress, pTag);
265
}
266
}
267
//______________________________________________________________________________
268
void
DataHeader::insert
(
const
SG::DataProxy
* proxy, IOpaqueAddress* tokAddress,
const
std::string& pTag) {
269
m_dataHeader
.emplace_back(proxy, tokAddress, pTag);
270
}
271
//______________________________________________________________________________
272
void
DataHeader::insert
(
const
DataHeaderElement
& dhe) {
273
m_dataHeader
.push_back(dhe);
274
}
275
//______________________________________________________________________________
276
int
DataHeader::sizeProvenance
()
const
{
277
return
(
m_inputDataHeader
.size());
278
}
279
//______________________________________________________________________________
280
std::vector<DataHeaderElement>::const_iterator
DataHeader::beginProvenance
()
const
{
281
return
(
m_inputDataHeader
.begin());
282
}
283
//______________________________________________________________________________
284
std::vector<DataHeaderElement>::const_iterator
DataHeader::endProvenance
()
const
{
285
return
(
m_inputDataHeader
.end());
286
}
287
//______________________________________________________________________________
288
void
DataHeader::insertProvenance
(
const
DataHeaderElement
& dhe) {
289
m_inputDataHeader
.push_back(dhe);
290
}
291
//______________________________________________________________________________
292
void
DataHeader::addHash
(
IStringPool
*
pool
) {
293
for
(std::vector<DataHeaderElement>::iterator iter =
m_dataHeader
.begin(),
294
last =
m_dataHeader
.end(); iter != last; ++iter) {
295
iter->addHash(
pool
);
296
}
297
for
(std::vector<DataHeaderElement>::iterator iter =
m_inputDataHeader
.begin(),
298
last =
m_inputDataHeader
.end(); iter != last; ++iter) {
299
iter->addHash(
pool
);
300
}
301
}
302
//______________________________________________________________________________
303
const
std::string&
DataHeader::dhFormToken
()
const
304
{
305
return
m_dhFormToken
;
306
}
307
//______________________________________________________________________________
308
void
DataHeader::setDhFormToken
(
const
std::string& formToken)
309
{
310
m_dhFormToken
= formToken;
311
}
312
//______________________________________________________________________________
313
void
DataHeader::setAttributeList
(
const
coral::AttributeList* attrList) {
314
m_attrList
= attrList;
315
}
316
//______________________________________________________________________________
317
const
coral::AttributeList*
DataHeader::getAttributeList
() {
318
return
(
m_attrList
);
319
}
320
//______________________________________________________________________________
321
void
DataHeader::setEvtRefTokenStr
(
const
std::string& tokenStr) {
322
m_evtRefTokenStr
= tokenStr;
323
}
324
//______________________________________________________________________________
325
const
std::string&
DataHeader::getEvtRefTokenStr
() {
326
return
(
m_evtRefTokenStr
);
327
}
328
//______________________________________________________________________________
329
#include "CoralBase/AttributeList.h"
330
#include "CoralBase/Attribute.h"
331
332
void
DataHeader::dump
(std::ostream& ostr)
const
333
{
334
using namespace
std
;
335
std::println (ostr,
"--- DataHeader Dump ---"
);
336
for
(
auto
& el :
m_dataHeader
) {
337
el.dump(ostr);
338
}
339
for
(
auto
& el :
m_inputDataHeader
) {
340
el.dump(ostr);
341
}
342
std::println (ostr,
"Status: {}"
,
static_cast<
int
>
(
m_status
));
343
std::println (ostr,
"Proc tag: {}"
,
m_processTag
);
344
std::println (ostr,
"evtRef: {}"
,
m_evtRefTokenStr
);
345
std::println (ostr,
"attrListPtr: {}"
,
static_cast<
const
void
*
>
(
m_attrList
));
346
if
(
m_attrList
) std::println (ostr,
"attrListSize: {}"
,
m_attrList
->size());
347
std::println (ostr,
"--- DataHeader End ---"
);
348
}
349
//______________________________________________________________________________
350
void
DataHeader::recycle
()
351
{
352
}
classID
static CLID classID()
DataHeader.h
This file contains the class definition for the DataHeader and DataHeaderElement classes.
DataProxy.h
CLID
uint32_t CLID
The Class ID type.
Definition
Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
IStringPool.h
Abstract interface for looking up strings/CLIDs in a pool.
a
static Double_t a
Definition
LArPhysWaveHECTool.cxx:38
size
size_t size() const
Number of registered mappings.
TokenAddress.h
This file contains the class definition for the TokenAddress class.
TransientAddress.h
empty
static const Attributes_t empty
Definition
XmlStreamer.cxx:16
h
Header file for AthHistogramAlgorithm.
DataHeaderElement
This class provides a persistent form for the TransientAddress.
Definition
DataHeader.h:37
DataHeaderElement::m_pClid
CLID m_pClid
primary ClassID.
Definition
DataHeader.h:105
DataHeaderElement::getAddress
SG::TransientAddress * getAddress(long storageType) const
Definition
DataHeader.cxx:145
DataHeaderElement::getAlias
const std::vector< std::string > & getAlias() const
Definition
DataHeader.cxx:122
DataHeaderElement::DataHeaderElement
DataHeaderElement()
Default Constructor.
Definition
DataHeader.cxx:20
DataHeaderElement::m_key
std::string m_key
string with StoreGate key.
Definition
DataHeader.h:109
DataHeaderElement::m_alias
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition
DataHeader.h:111
DataHeaderElement::getToken
const Token * getToken() const
Definition
DataHeader.cxx:126
DataHeaderElement::getPrimaryClassID
CLID getPrimaryClassID() const
Definition
DataHeader.cxx:105
DataHeaderElement::~DataHeaderElement
virtual ~DataHeaderElement()
Destructor.
Definition
DataHeader.cxx:90
DataHeaderElement::m_clids
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition
DataHeader.h:107
DataHeaderElement::getHashes
const std::vector< sgkey_t > & getHashes() const
Definition
DataHeader.cxx:131
DataHeaderElement::m_hashes
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition
DataHeader.h:115
DataHeaderElement::dump
void dump(std::ostream &ostr) const
Definition
DataHeader.cxx:173
DataHeaderElement::getClassIDs
const std::set< CLID > getClassIDs() const
Definition
DataHeader.cxx:112
DataHeaderElement::m_token
Token m_token
Transient address token.
Definition
DataHeader.h:113
DataHeaderElement::operator=
DataHeaderElement & operator=(const DataHeaderElement &rhs)
Assignment Operator.
Definition
DataHeader.cxx:93
DataHeaderElement::addHash
void addHash(IStringPool *pool)
Add new entry to hash map.
Definition
DataHeader.cxx:135
DataHeaderElement::getKey
const std::string & getKey() const
Definition
DataHeader.cxx:118
DataHeader::addHash
void addHash(IStringPool *pool)
Add new entry to hash map.
Definition
DataHeader.cxx:292
DataHeader::sizeProvenance
int sizeProvenance() const
Definition
DataHeader.cxx:276
DataHeader::beginProvenance
std::vector< DataHeaderElement >::const_iterator beginProvenance() const
Definition
DataHeader.cxx:280
DataHeader::m_status
statusFlag m_status
StatusFlag (i.e.: Output, Primary, Input, Manual, Other).
Definition
DataHeader.h:213
DataHeader::endProvenance
std::vector< DataHeaderElement >::const_iterator endProvenance() const
Definition
DataHeader.cxx:284
DataHeader::m_dhFormToken
std::string m_dhFormToken
Token to the DH format object.
Definition
DataHeader.h:221
DataHeader::begin
std::vector< DataHeaderElement >::const_iterator begin() const
Definition
DataHeader.cxx:250
DataHeader::DataHeader
DataHeader()
Default Constructor.
Definition
DataHeader.cxx:198
DataHeader::setDhFormToken
void setDhFormToken(const std::string &formToken)
Definition
DataHeader.cxx:308
DataHeader::setStatus
void setStatus(statusFlag status)
Set StatusFlag enum for DataHeader.
Definition
DataHeader.cxx:230
DataHeader::recycle
virtual void recycle()
Called before this object is recycled.
Definition
DataHeader.cxx:350
DataHeader::insertProvenance
void insertProvenance(const DataHeaderElement &dhe)
Insert a new element into the "Provenance" vector.
Definition
DataHeader.cxx:288
DataHeader::elements
const std::vector< DataHeaderElement > & elements() const
Definition
DataHeader.cxx:258
DataHeader::setEvtRefTokenStr
void setEvtRefTokenStr(const std::string &tokenStr)
Definition
DataHeader.cxx:321
DataHeader::end
std::vector< DataHeaderElement >::const_iterator end() const
Definition
DataHeader.cxx:254
DataHeader::getProcessTag
const std::string & getProcessTag() const
Definition
DataHeader.cxx:242
DataHeader::m_processTag
std::string m_processTag
ProcessTag (e.g.: "StreamESD", "StreamAOD" ...).
Definition
DataHeader.h:215
DataHeader::dhFormToken
const std::string & dhFormToken() const
Form token, to be able to tell when the form changes.
Definition
DataHeader.cxx:303
DataHeader::dump
void dump(std::ostream &ostr) const
Definition
DataHeader.cxx:332
DataHeader::m_inputDataHeader
std::vector< DataHeaderElement > m_inputDataHeader
vector with DataHeaderElement to upstream DataHeader ("Provenance").
Definition
DataHeader.h:211
DataHeader::m_dataHeader
std::vector< DataHeaderElement > m_dataHeader
vector with DataHeaderElement to "DataObject".
Definition
DataHeader.h:209
DataHeader::setAttributeList
void setAttributeList(const coral::AttributeList *attrList)
Definition
DataHeader.cxx:313
DataHeader::~DataHeader
virtual ~DataHeader()
Destructor.
Definition
DataHeader.cxx:216
DataHeader::operator=
DataHeader & operator=(const DataHeader &rhs)
Assignment Operator.
Definition
DataHeader.cxx:219
DataHeader::m_attrList
const coral::AttributeList * m_attrList
Optional pointer to AttributeList to enable writing of TAG Attributes to Payload files.
Definition
DataHeader.h:217
DataHeader::isInput
bool isInput() const
Check whether StatusFlag is "Input".
Definition
DataHeader.cxx:234
DataHeader::insert
void insert(const SG::TransientAddress *sgAddress, IOpaqueAddress *tokAddress=0, const std::string &pTag="")
Insert a new element into the "DataObject" vector.
Definition
DataHeader.cxx:262
DataHeader::size
int size() const
Definition
DataHeader.cxx:246
DataHeader::getEvtRefTokenStr
const std::string & getEvtRefTokenStr()
Definition
DataHeader.cxx:325
DataHeader::getAttributeList
const coral::AttributeList * getAttributeList()
Definition
DataHeader.cxx:317
DataHeader::statusFlag
statusFlag
Definition
DataHeader.h:125
DataHeader::Other
@ Other
Definition
DataHeader.h:125
DataHeader::Input
@ Input
Definition
DataHeader.h:125
DataHeader::setProcessTag
void setProcessTag(const std::string &processTag)
Set ProcessTag for DataHeader.
Definition
DataHeader.cxx:238
DataHeader::m_evtRefTokenStr
std::string m_evtRefTokenStr
Optional Token String for Event Reference to enable writing of TAG to Payload files.
Definition
DataHeader.h:219
IStringPool
Abstract interface for looking up strings/CLIDs in a pool.
Definition
IStringPool.h:28
SG::DataProxy
Definition
DataProxy.h:45
SG::TransientAddress
Definition
TransientAddress.h:34
SG::TransientAddress::setAlias
void setAlias(const std::string &key)
set alias'
Definition
TransientAddress.h:257
SG::TransientAddress::setSGKey
void setSGKey(sgkey_t sgkey)
check if it is a transient ID (primary or symLinked):
Definition
TransientAddress.h:235
TokenAddress
This class provides a Generic Transient Address for POOL tokens.
Definition
TokenAddress.h:23
TokenAddress::getToken
Token * getToken()
Definition
TokenAddress.cxx:15
Token
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition
Token.h:22
Token::setData
const Token & setData(Token *pToken) const
Set all the data part of the token.
Definition
Token.cxx:265
string
STL class.
vector
Definition
MultiHisto.h:13
pool
Framework include files.
Definition
libname.h:15
std
STL namespace.
ranges.h
C++20 range helpers.
Generated on
for ATLAS Offline Software by
1.17.0