ATLAS Offline Software
Loading...
Searching...
No Matches
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
12
14#include "SGTools/DataProxy.h"
16#include "CxxUtils/ranges.h"
17
18//______________________________________________________________________________
21//______________________________________________________________________________
29//______________________________________________________________________________
30DataHeaderElement::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//______________________________________________________________________________
41DataHeaderElement::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//______________________________________________________________________________
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//______________________________________________________________________________
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//______________________________________________________________________________
91//______________________________________________________________________________
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//______________________________________________________________________________
105 if (m_pClid > 0) {
106 return(m_pClid);
107 }
108 return(m_clids.front());
109}
110//______________________________________________________________________________
111const 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//______________________________________________________________________________
117const std::string& DataHeaderElement::getKey() const {
118 return(m_key);
119}
120//______________________________________________________________________________
121const std::vector<std::string>& DataHeaderElement::getAlias() const {
122 return(m_alias);
123}
124//_____________________________________________________________________________
126 return(&m_token);
127}
128//_____________________________________________________________________________
129const std::vector<DataHeaderElement::sgkey_t>&
131 return(m_hashes);
132}
133//______________________________________________________________________________
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//______________________________________________________________________________
145 return getAddress(storageType, m_key);
146}
147//______________________________________________________________________________
148SG::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//______________________________________________________________________________
172void 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//______________________________________________________________________________
204//______________________________________________________________________________
214//______________________________________________________________________________
217//______________________________________________________________________________
219 if (this != &rhs) {
222 m_status = rhs.m_status;
225 }
226 return(*this);
227}
228//______________________________________________________________________________
230 m_status = status;
231}
232//______________________________________________________________________________
234 return(m_status == statusFlag(Input));
235}
236//______________________________________________________________________________
237void DataHeader::setProcessTag(const std::string& processTag) {
238 m_processTag = processTag;
239}
240//______________________________________________________________________________
241const std::string& DataHeader::getProcessTag() const {
242 return(m_processTag);
243}
244//______________________________________________________________________________
245int DataHeader::size() const {
246 return(m_dataHeader.size());
247}
248//______________________________________________________________________________
249std::vector<DataHeaderElement>::const_iterator DataHeader::begin() const {
250 return(m_dataHeader.begin());
251}
252//______________________________________________________________________________
253std::vector<DataHeaderElement>::const_iterator DataHeader::end() const {
254 return(m_dataHeader.end());
255}
256//______________________________________________________________________________
257const std::vector<DataHeaderElement>& DataHeader::elements() const {
258 return m_dataHeader;
259}
260//______________________________________________________________________________
261void 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//______________________________________________________________________________
267void DataHeader::insert(const SG::DataProxy* proxy, IOpaqueAddress* tokAddress, const std::string& pTag) {
268 m_dataHeader.emplace_back(proxy, tokAddress, pTag);
269}
270//______________________________________________________________________________
272 m_dataHeader.push_back(dhe);
273}
274//______________________________________________________________________________
276 return(m_inputDataHeader.size());
277}
278//______________________________________________________________________________
279std::vector<DataHeaderElement>::const_iterator DataHeader::beginProvenance() const {
280 return(m_inputDataHeader.begin());
281}
282//______________________________________________________________________________
283std::vector<DataHeaderElement>::const_iterator DataHeader::endProvenance() const {
284 return(m_inputDataHeader.end());
285}
286//______________________________________________________________________________
288 m_inputDataHeader.push_back(dhe);
289}
290//______________________________________________________________________________
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//______________________________________________________________________________
302const std::string& DataHeader::dhFormToken() const
303{
304 return m_dhFormToken;
305}
306//______________________________________________________________________________
307void DataHeader::setDhFormToken(const std::string& formToken)
308{
309 m_dhFormToken = formToken;
310}
311//______________________________________________________________________________
312void DataHeader::setAttributeList(const coral::AttributeList* attrList) {
313 m_attrList = attrList;
314}
315//______________________________________________________________________________
316const coral::AttributeList* DataHeader::getAttributeList() {
317 return(m_attrList);
318}
319//______________________________________________________________________________
320void DataHeader::setEvtRefTokenStr(const std::string& tokenStr) {
321 m_evtRefTokenStr = tokenStr;
322}
323//______________________________________________________________________________
324const std::string& DataHeader::getEvtRefTokenStr() {
325 return(m_evtRefTokenStr);
326}
327//______________________________________________________________________________
328#include "CoralBase/AttributeList.h"
329#include "CoralBase/Attribute.h"
330
331void 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//______________________________________________________________________________
350{
351}
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
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:21
const Token & setData(Token *pToken) const
Set all the data part of the token.
Definition Token.cxx:225
STL class.
pool namespace
Definition libname.h:15
STL namespace.
C++20 range helpers.