ATLAS Offline Software
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 
12 
14 #include "SGTools/DataProxy.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 //______________________________________________________________________________
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 //______________________________________________________________________________
90 }
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 //______________________________________________________________________________
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 //_____________________________________________________________________________
126  return(&m_token);
127 }
128 //_____________________________________________________________________________
129 const 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 //______________________________________________________________________________
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 //______________________________________________________________________________
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 //______________________________________________________________________________
216 }
217 //______________________________________________________________________________
219  if (this != &rhs) {
222  m_status = rhs.m_status;
224  m_attrList = rhs.m_attrList;
225  }
226  return(*this);
227 }
228 //______________________________________________________________________________
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 //______________________________________________________________________________
272  m_dataHeader.push_back(dhe);
273 }
274 //______________________________________________________________________________
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 //______________________________________________________________________________
288  m_inputDataHeader.push_back(dhe);
289 }
290 //______________________________________________________________________________
293  last = m_dataHeader.end(); iter != last; ++iter) {
294  iter->addHash(pool);
295  }
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 //______________________________________________________________________________
313  m_attrList = attrList;
314 }
315 //______________________________________________________________________________
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 //______________________________________________________________________________
350 {
351 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
DataHeader::isInput
bool isInput() const
Check whether StatusFlag is "Input".
Definition: DataHeader.cxx:233
DataHeader::setProcessTag
void setProcessTag(const std::string &processTag)
Set ProcessTag for DataHeader.
Definition: DataHeader.cxx:237
IStringPool
Abstract interface for looking up strings/CLIDs in a pool.
Definition: IStringPool.h:28
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
DataHeader::endProvenance
std::vector< DataHeaderElement >::const_iterator endProvenance() const
Definition: DataHeader.cxx:283
DataHeaderElement::m_key
std::string m_key
string with StoreGate key.
Definition: DataHeader.h:109
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:407
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
DataHeaderElement::m_alias
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition: DataHeader.h:111
DataHeader::DataHeader
DataHeader()
Default Constructor.
Definition: DataHeader.cxx:197
DataHeaderElement::m_token
Token m_token
Transient address token.
Definition: DataHeader.h:113
OfflineHitType::Other
@ Other
DataHeader::operator=
DataHeader & operator=(const DataHeader &rhs)
Assignment Operator.
Definition: DataHeader.cxx:218
DataHeader::dump
void dump(std::ostream &ostr) const
Definition: DataHeader.cxx:331
DataHeader::setAttributeList
void setAttributeList(const coral::AttributeList *attrList)
Definition: DataHeader.cxx:312
DataHeaderElement::m_pClid
CLID m_pClid
primary ClassID.
Definition: DataHeader.h:105
DataHeader::addHash
void addHash(IStringPool *pool)
Add new entry to hash map.
Definition: DataHeader.cxx:291
pool
pool namespace
Definition: libname.h:15
SG::TransientAddress::setAlias
void setAlias(const std::string &key)
set alias'
Definition: TransientAddress.h:257
skel.it
it
Definition: skel.GENtoEVGEN.py:407
DataHeader::elements
const std::vector< DataHeaderElement > & elements() const
Definition: DataHeader.cxx:257
SG::TransientAddress
Definition: TransientAddress.h:34
DataHeader::begin
std::vector< DataHeaderElement >::const_iterator begin() const
Definition: DataHeader.cxx:249
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
DataHeader::statusFlag
statusFlag
Definition: DataHeader.h:125
DataHeader::insertProvenance
void insertProvenance(const DataHeaderElement &dhe)
Insert a new element into the "Provenance" vector.
Definition: DataHeader.cxx:287
Token
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition: Token.h:21
TokenAddress
This class provides a Generic Transient Address for POOL tokens.
Definition: TokenAddress.h:23
DataHeaderElement::operator=
DataHeaderElement & operator=(const DataHeaderElement &rhs)
Assignment Operator.
Definition: DataHeader.cxx:92
DataHeaderElement::getKey
const std::string & getKey() const
Definition: DataHeader.cxx:117
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
DataHeader::m_dhFormToken
std::string m_dhFormToken
Token to the DH format object.
Definition: DataHeader.h:221
DataHeaderElement
This class provides a persistent form for the TransientAddress.
Definition: DataHeader.h:37
DataHeaderElement::getAlias
const std::vector< std::string > & getAlias() const
Definition: DataHeader.cxx:121
DataHeader::beginProvenance
std::vector< DataHeaderElement >::const_iterator beginProvenance() const
Definition: DataHeader.cxx:279
IStringPool.h
Abstract interface for looking up strings/CLIDs in a pool.
DataHeaderElement::~DataHeaderElement
virtual ~DataHeaderElement()
Destructor.
Definition: DataHeader.cxx:89
DataHeader
This class provides the layout for summary information stored for data written to POOL.
Definition: DataHeader.h:123
DataHeader::size
int size() const
Definition: DataHeader.cxx:245
h
vector
Definition: MultiHisto.h:13
extractSporadic.h
list h
Definition: extractSporadic.py:96
DataHeaderElement::getAddress
SG::TransientAddress * getAddress(long storageType) const
Definition: DataHeader.cxx:144
COOLRates.alias
alias
Definition: COOLRates.py:1172
DataHeader::sizeProvenance
int sizeProvenance() const
Definition: DataHeader.cxx:275
DataHeaderElement::DataHeaderElement
DataHeaderElement()
Default Constructor.
Definition: DataHeader.cxx:19
DataHeaderElement::dump
void dump(std::ostream &ostr) const
Definition: DataHeader.cxx:172
DataHeader::recycle
virtual void recycle()
Called before this object is recycled.
Definition: DataHeader.cxx:349
python.getProblemFolderFromLogs.el
dictionary el
Definition: getProblemFolderFromLogs.py:48
TokenAddress::getToken
Token * getToken()
Definition: TokenAddress.cxx:15
jobOptions.pTag
string pTag
Definition: jobOptions.py:28
DataHeader.h
This file contains the class definition for the DataHeader and DataHeaderElement classes.
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
DataHeaderElement::getHashes
const std::vector< sgkey_t > & getHashes() const
Definition: DataHeader.cxx:130
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::setStatus
void setStatus(statusFlag status)
Set StatusFlag enum for DataHeader.
Definition: DataHeader.cxx:229
DataHeaderElement::getClassIDs
const std::set< CLID > getClassIDs() const
Definition: DataHeader.cxx:111
DataHeader::m_status
statusFlag m_status
StatusFlag (i.e.: Output, Primary, Input, Manual, Other).
Definition: DataHeader.h:213
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DataHeader::end
std::vector< DataHeaderElement >::const_iterator end() const
Definition: DataHeader.cxx:253
DataHeaderElement::addHash
void addHash(IStringPool *pool)
Add new entry to hash map.
Definition: DataHeader.cxx:134
DataHeaderElement::getPrimaryClassID
CLID getPrimaryClassID() const
Definition: DataHeader.cxx:104
Token::toString
virtual const std::string toString() const
Retrieve the string representation of the token.
Definition: Token.cxx:134
DataHeader::m_dataHeader
std::vector< DataHeaderElement > m_dataHeader
vector with DataHeaderElement to "DataObject".
Definition: DataHeader.h:209
DataHeader::getEvtRefTokenStr
const std::string & getEvtRefTokenStr()
Definition: DataHeader.cxx:324
DataHeader::setDhFormToken
void setDhFormToken(const std::string &formToken)
Definition: DataHeader.cxx:307
RTTAlgmain.address
address
Definition: RTTAlgmain.py:55
DataHeaderElement::m_hashes
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition: DataHeader.h:115
DataHeaderElement::m_clids
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition: DataHeader.h:107
Token::fromString
Token & fromString(const std::string_view from)
Build from the string representation of a token.
Definition: Token.cxx:147
TokenAddress.h
This file contains the class definition for the TokenAddress class.
DataHeader::~DataHeader
virtual ~DataHeader()
Destructor.
Definition: DataHeader.cxx:215
DataHeader::getAttributeList
const coral::AttributeList * getAttributeList()
Definition: DataHeader.cxx:316
a
TList * a
Definition: liststreamerinfos.cxx:10
DataHeader::getProcessTag
const std::string & getProcessTag() const
Definition: DataHeader.cxx:241
TransientAddress.h
SG::TransientAddress::setSGKey
void setSGKey(sgkey_t sgkey)
check if it is a transient ID (primary or symLinked):
Definition: TransientAddress.h:235
DataHeader::setEvtRefTokenStr
void setEvtRefTokenStr(const std::string &tokenStr)
Definition: DataHeader.cxx:320
DataHeader::m_processTag
std::string m_processTag
ProcessTag (e.g.: "StreamESD", "StreamAOD" ...).
Definition: DataHeader.h:215
merge.status
status
Definition: merge.py:16
NswErrorCalibData::Input
Helper struct to be parsed to the object to derive the specific error of the cluster.
Definition: NswErrorCalibData.h:25
ranges.h
C++20 range helpers.
Token::setData
const Token & setData(Token *pToken) const
Set all the data part of the token.
Definition: Token.cxx:225
DataHeaderElement::getToken
const Token * getToken() const
Definition: DataHeader.cxx:125
SG::DataProxy
Definition: DataProxy.h:45
python.compressB64.c
def c
Definition: compressB64.py:93
DataHeader::m_inputDataHeader
std::vector< DataHeaderElement > m_inputDataHeader
vector with DataHeaderElement to upstream DataHeader ("Provenance").
Definition: DataHeader.h:211
DataHeader::dhFormToken
const std::string & dhFormToken() const
Form token, to be able to tell when the form changes.
Definition: DataHeader.cxx:302
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
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
DataProxy.h