ATLAS Offline Software
Loading...
Searching...
No Matches
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
12
14#include "SGTools/DataProxy.h"
16#include "CxxUtils/ranges.h"
17#include <print>
18
19//______________________________________________________________________________
22//______________________________________________________________________________
30//______________________________________________________________________________
31DataHeaderElement::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//______________________________________________________________________________
42DataHeaderElement::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//______________________________________________________________________________
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//______________________________________________________________________________
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//______________________________________________________________________________
92//______________________________________________________________________________
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//______________________________________________________________________________
106 if (m_pClid > 0) {
107 return(m_pClid);
108 }
109 return(m_clids.front());
110}
111//______________________________________________________________________________
112const 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//______________________________________________________________________________
118const std::string& DataHeaderElement::getKey() const {
119 return(m_key);
120}
121//______________________________________________________________________________
122const std::vector<std::string>& DataHeaderElement::getAlias() const {
123 return(m_alias);
124}
125//_____________________________________________________________________________
127 return(&m_token);
128}
129//_____________________________________________________________________________
130const std::vector<DataHeaderElement::sgkey_t>&
132 return(m_hashes);
133}
134//______________________________________________________________________________
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//______________________________________________________________________________
146 return getAddress(storageType, m_key);
147}
148//______________________________________________________________________________
149SG::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//______________________________________________________________________________
173void 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//______________________________________________________________________________
205//______________________________________________________________________________
215//______________________________________________________________________________
218//______________________________________________________________________________
220 if (this != &rhs) {
223 m_status = rhs.m_status;
226 }
227 return(*this);
228}
229//______________________________________________________________________________
231 m_status = status;
232}
233//______________________________________________________________________________
235 return(m_status == statusFlag(Input));
236}
237//______________________________________________________________________________
238void DataHeader::setProcessTag(const std::string& processTag) {
239 m_processTag = processTag;
240}
241//______________________________________________________________________________
242const std::string& DataHeader::getProcessTag() const {
243 return(m_processTag);
244}
245//______________________________________________________________________________
246int DataHeader::size() const {
247 return(m_dataHeader.size());
248}
249//______________________________________________________________________________
250std::vector<DataHeaderElement>::const_iterator DataHeader::begin() const {
251 return(m_dataHeader.begin());
252}
253//______________________________________________________________________________
254std::vector<DataHeaderElement>::const_iterator DataHeader::end() const {
255 return(m_dataHeader.end());
256}
257//______________________________________________________________________________
258const std::vector<DataHeaderElement>& DataHeader::elements() const {
259 return m_dataHeader;
260}
261//______________________________________________________________________________
262void 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//______________________________________________________________________________
268void DataHeader::insert(const SG::DataProxy* proxy, IOpaqueAddress* tokAddress, const std::string& pTag) {
269 m_dataHeader.emplace_back(proxy, tokAddress, pTag);
270}
271//______________________________________________________________________________
273 m_dataHeader.push_back(dhe);
274}
275//______________________________________________________________________________
277 return(m_inputDataHeader.size());
278}
279//______________________________________________________________________________
280std::vector<DataHeaderElement>::const_iterator DataHeader::beginProvenance() const {
281 return(m_inputDataHeader.begin());
282}
283//______________________________________________________________________________
284std::vector<DataHeaderElement>::const_iterator DataHeader::endProvenance() const {
285 return(m_inputDataHeader.end());
286}
287//______________________________________________________________________________
289 m_inputDataHeader.push_back(dhe);
290}
291//______________________________________________________________________________
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//______________________________________________________________________________
303const std::string& DataHeader::dhFormToken() const
304{
305 return m_dhFormToken;
306}
307//______________________________________________________________________________
308void DataHeader::setDhFormToken(const std::string& formToken)
309{
310 m_dhFormToken = formToken;
311}
312//______________________________________________________________________________
313void DataHeader::setAttributeList(const coral::AttributeList* attrList) {
314 m_attrList = attrList;
315}
316//______________________________________________________________________________
317const coral::AttributeList* DataHeader::getAttributeList() {
318 return(m_attrList);
319}
320//______________________________________________________________________________
321void DataHeader::setEvtRefTokenStr(const std::string& tokenStr) {
322 m_evtRefTokenStr = tokenStr;
323}
324//______________________________________________________________________________
325const std::string& DataHeader::getEvtRefTokenStr() {
326 return(m_evtRefTokenStr);
327}
328//______________________________________________________________________________
329#include "CoralBase/AttributeList.h"
330#include "CoralBase/Attribute.h"
331
332void 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//______________________________________________________________________________
351{
352}
This file contains the class definition for the DataHeader and DataHeaderElement classes.
uint32_t CLID
The Class ID type.
Abstract interface for looking up strings/CLIDs in a pool.
static Double_t a
size_t size() const
Number of registered mappings.
This file contains the class definition for the TokenAddress class.
static const Attributes_t empty
Header file for AthHistogramAlgorithm.
This class provides a persistent form for the TransientAddress.
Definition DataHeader.h:37
CLID m_pClid
primary ClassID.
Definition DataHeader.h:105
SG::TransientAddress * getAddress(long storageType) const
const std::vector< std::string > & getAlias() const
DataHeaderElement()
Default Constructor.
std::string m_key
string with StoreGate key.
Definition DataHeader.h:109
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition DataHeader.h:111
const Token * getToken() const
CLID getPrimaryClassID() const
virtual ~DataHeaderElement()
Destructor.
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition DataHeader.h:107
const std::vector< sgkey_t > & getHashes() const
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition DataHeader.h:115
void dump(std::ostream &ostr) const
const std::set< CLID > getClassIDs() const
Token m_token
Transient address token.
Definition DataHeader.h:113
DataHeaderElement & operator=(const DataHeaderElement &rhs)
Assignment Operator.
void addHash(IStringPool *pool)
Add new entry to hash map.
const std::string & getKey() const
void addHash(IStringPool *pool)
Add new entry to hash map.
int sizeProvenance() const
std::vector< DataHeaderElement >::const_iterator beginProvenance() const
statusFlag m_status
StatusFlag (i.e.: Output, Primary, Input, Manual, Other).
Definition DataHeader.h:213
std::vector< DataHeaderElement >::const_iterator endProvenance() const
std::string m_dhFormToken
Token to the DH format object.
Definition DataHeader.h:221
std::vector< DataHeaderElement >::const_iterator begin() const
DataHeader()
Default Constructor.
void setDhFormToken(const std::string &formToken)
void setStatus(statusFlag status)
Set StatusFlag enum for DataHeader.
virtual void recycle()
Called before this object is recycled.
void insertProvenance(const DataHeaderElement &dhe)
Insert a new element into the "Provenance" vector.
const std::vector< DataHeaderElement > & elements() const
void setEvtRefTokenStr(const std::string &tokenStr)
std::vector< DataHeaderElement >::const_iterator end() const
const std::string & getProcessTag() const
std::string m_processTag
ProcessTag (e.g.: "StreamESD", "StreamAOD" ...).
Definition DataHeader.h:215
const std::string & dhFormToken() const
Form token, to be able to tell when the form changes.
void dump(std::ostream &ostr) const
std::vector< DataHeaderElement > m_inputDataHeader
vector with DataHeaderElement to upstream DataHeader ("Provenance").
Definition DataHeader.h:211
std::vector< DataHeaderElement > m_dataHeader
vector with DataHeaderElement to "DataObject".
Definition DataHeader.h:209
void setAttributeList(const coral::AttributeList *attrList)
virtual ~DataHeader()
Destructor.
DataHeader & operator=(const DataHeader &rhs)
Assignment Operator.
const coral::AttributeList * m_attrList
Optional pointer to AttributeList to enable writing of TAG Attributes to Payload files.
Definition DataHeader.h:217
bool isInput() const
Check whether StatusFlag is "Input".
void insert(const SG::TransientAddress *sgAddress, IOpaqueAddress *tokAddress=0, const std::string &pTag="")
Insert a new element into the "DataObject" vector.
int size() const
const std::string & getEvtRefTokenStr()
const coral::AttributeList * getAttributeList()
void setProcessTag(const std::string &processTag)
Set ProcessTag for DataHeader.
std::string m_evtRefTokenStr
Optional Token String for Event Reference to enable writing of TAG to Payload files.
Definition DataHeader.h:219
Abstract interface for looking up strings/CLIDs in a pool.
Definition IStringPool.h:28
void setAlias(const std::string &key)
set alias'
void setSGKey(sgkey_t sgkey)
check if it is a transient ID (primary or symLinked):
This class provides a Generic Transient Address for POOL tokens.
Token * getToken()
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition Token.h:22
const Token & setData(Token *pToken) const
Set all the data part of the token.
Definition Token.cxx:265
STL class.
Framework include files.
Definition libname.h:15
STL namespace.
C++20 range helpers.