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