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 //_____________________________________________________________________________
130  return(POOL_StorageType);
131 }
132 //_____________________________________________________________________________
133 const std::vector<DataHeaderElement::sgkey_t>&
135  return(m_hashes);
136 }
137 //______________________________________________________________________________
139  if (!m_hashes.empty()) {
140  return;
141  }
142  std::set<CLID> clids = getClassIDs();
143  for (std::set<CLID>::iterator iter = clids.begin(), last = clids.end(); iter != last; ++iter) {
144  m_hashes.push_back(pool->stringToKey(m_key, *iter));
145  }
146 }
147 //______________________________________________________________________________
148 SG::TransientAddress* DataHeaderElement::getAddress(unsigned long contextId) const {
149  return(getAddress(m_key, contextId));
150 }
151 //______________________________________________________________________________
153  unsigned long contextId) const {
154  CLID primaryClID = getPrimaryClassID();
155  TokenAddress* tokAdd = new TokenAddress(this->getStorageType(), primaryClID, "", m_key, contextId , &m_token);
156  SG::TransientAddress* sgAddress = new SG::TransientAddress(primaryClID, key, tokAdd, m_clids);
157  if (!m_hashes.empty()) {
158  // If we have the sgkey corresponding to the primary clid, record
159  // it in the address. This will allow us to do lookups later by sgkey
160  // rather than by name.
161  // But be careful: the key for the primary clid is not necessarily
162  // the first one in m_hashes. The keys in m_hashes correspond to
163  // all the CLIDs in ascending order. m_clids holds all CLIDs
164  // _except_ for the primary one, in sorted order.
165  // So we want to find the index at which the primary CLID would
166  // be inserted into m_clids to keep it sorted. We could do this
167  // using std::upper_bound. However, in the common cases, we only
168  // have about 2 entries in m_clids. In that case, it's faster
169  // to just do a linear search.
170  auto it = std::ranges::find_if (m_clids, std::bind_front(std::less<int>{}, primaryClID));
171  sgAddress->setSGKey (m_hashes[it - m_clids.begin()]);
172  }
173  sgAddress->setAlias(m_alias);
174  return(sgAddress);
175 }
176 //______________________________________________________________________________
177 void DataHeaderElement::dump(std::ostream& ostr) const
178 {
179  using namespace std;
180  ostr << "SGKey: " << getKey() << endl;
181  ostr << "CLID: " << getPrimaryClassID();
182  if( getClassIDs().size() > 1 ) {
183  ostr << " ||";
184  for( auto& c : getClassIDs() ) ostr << " " << c;
185  }
186  ostr << std::endl;
187  if( getAlias().size() > 0 ) {
188  ostr << "Alias: ";
189  for( const std::string& a : getAlias() ) ostr << " " << a;
190  ostr << endl;
191  }
192  ostr << "Token: " << m_token.toString() << endl;
193  if( m_hashes.size() ) {
194  ostr << "Hashes:";
195  for( auto h : m_hashes ) ostr << " " << h;
196  ostr << endl;
197  }
198 }
199 
200 //______________________________________________________________________________
201 //______________________________________________________________________________
202 DataHeader::DataHeader() : m_dataHeader(),
203  m_inputDataHeader(),
204  m_status(statusFlag(Other)),
205  m_processTag(),
206  m_attrList(0),
207  m_evtRefTokenStr() {
208 }
209 //______________________________________________________________________________
211  DataObject (rhs),
212  m_dataHeader(rhs.m_dataHeader),
213  m_inputDataHeader(rhs.m_inputDataHeader),
214  m_status(rhs.m_status),
215  m_processTag(rhs.m_processTag),
216  m_attrList(rhs.m_attrList),
217  m_evtRefTokenStr() {
218 }
219 //______________________________________________________________________________
221 }
222 //______________________________________________________________________________
224  if (this != &rhs) {
227  m_status = rhs.m_status;
229  m_attrList = rhs.m_attrList;
230  }
231  return(*this);
232 }
233 //______________________________________________________________________________
235  m_status = status;
236 }
237 //______________________________________________________________________________
238 bool DataHeader::isInput() const {
239  return(m_status == statusFlag(Input));
240 }
241 //______________________________________________________________________________
242 void DataHeader::setProcessTag(const std::string& processTag) {
243  m_processTag = processTag;
244 }
245 //______________________________________________________________________________
246 const std::string& DataHeader::getProcessTag() const {
247  return(m_processTag);
248 }
249 //______________________________________________________________________________
250 int DataHeader::size() const {
251  return(m_dataHeader.size());
252 }
253 //______________________________________________________________________________
254 std::vector<DataHeaderElement>::const_iterator DataHeader::begin() const {
255  return(m_dataHeader.begin());
256 }
257 //______________________________________________________________________________
258 std::vector<DataHeaderElement>::const_iterator DataHeader::end() const {
259  return(m_dataHeader.end());
260 }
261 //______________________________________________________________________________
262 const std::vector<DataHeaderElement>& DataHeader::elements() const {
263  return m_dataHeader;
264 }
265 //______________________________________________________________________________
266 void DataHeader::insert(const SG::TransientAddress* sgAddress, IOpaqueAddress* tokAddress, const std::string& pTag) {
267  if (sgAddress != 0) {
268  m_dataHeader.emplace_back(sgAddress, tokAddress, pTag);
269  }
270 }
271 //______________________________________________________________________________
272 void DataHeader::insert(const SG::DataProxy* proxy, IOpaqueAddress* tokAddress, const std::string& pTag) {
273  m_dataHeader.emplace_back(proxy, tokAddress, pTag);
274 }
275 //______________________________________________________________________________
277  m_dataHeader.push_back(dhe);
278 }
279 //______________________________________________________________________________
281  return(m_inputDataHeader.size());
282 }
283 //______________________________________________________________________________
284 std::vector<DataHeaderElement>::const_iterator DataHeader::beginProvenance() const {
285  return(m_inputDataHeader.begin());
286 }
287 //______________________________________________________________________________
288 std::vector<DataHeaderElement>::const_iterator DataHeader::endProvenance() const {
289  return(m_inputDataHeader.end());
290 }
291 //______________________________________________________________________________
293  m_inputDataHeader.push_back(dhe);
294 }
295 //______________________________________________________________________________
298  last = m_dataHeader.end(); iter != last; ++iter) {
299  iter->addHash(pool);
300  }
302  last = m_inputDataHeader.end(); iter != last; ++iter) {
303  iter->addHash(pool);
304  }
305 }
306 //______________________________________________________________________________
307 const std::string& DataHeader::dhFormToken() const
308 {
309  return m_dhFormToken;
310 }
311 //______________________________________________________________________________
312 void DataHeader::setDhFormToken(const std::string& formToken)
313 {
314  m_dhFormToken = formToken;
315 }
316 //______________________________________________________________________________
318  m_attrList = attrList;
319 }
320 //______________________________________________________________________________
322  return(m_attrList);
323 }
324 //______________________________________________________________________________
325 void DataHeader::setEvtRefTokenStr(const std::string& tokenStr) {
326  m_evtRefTokenStr = tokenStr;
327 }
328 //______________________________________________________________________________
329 const std::string& DataHeader::getEvtRefTokenStr() {
330  return(m_evtRefTokenStr);
331 }
332 //______________________________________________________________________________
333 #include "CoralBase/AttributeList.h"
334 #include "CoralBase/Attribute.h"
335 
336 void DataHeader::dump(std::ostream& ostr) const
337 {
338  using namespace std;
339  ostr << "--- DataHeader Dump ---" << endl;
340  for( auto& el : m_dataHeader ) {
341  el.dump(ostr);
342  }
343  for( auto& el : m_inputDataHeader ) {
344  el.dump(ostr);
345  }
346  ostr << "Status: " << m_status << endl;
347  ostr << "Proc tag: " << m_processTag << endl;
348  ostr << "evtRef: " << m_evtRefTokenStr << endl;
349  ostr << "attrListPtr: " << m_attrList << endl;
350  if( m_attrList ) ostr << "attrListSize: " << m_attrList->size() << endl;
351  ostr << "--- DataHeader End ---" << endl;
352 }
353 //______________________________________________________________________________
355 {
356 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
DataHeader::isInput
bool isInput() const
Check whether StatusFlag is "Input".
Definition: DataHeader.cxx:238
DataHeader::setProcessTag
void setProcessTag(const std::string &processTag)
Set ProcessTag for DataHeader.
Definition: DataHeader.cxx:242
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:288
DataHeaderElement::m_key
std::string m_key
string with StoreGate key.
Definition: DataHeader.h:112
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:220
DataHeaderElement::m_alias
std::vector< std::string > m_alias
vector of StoreGate alias string.
Definition: DataHeader.h:114
DataHeader::DataHeader
DataHeader()
Default Constructor.
Definition: DataHeader.cxx:202
DataHeaderElement::m_token
Token m_token
Transient address token.
Definition: DataHeader.h:116
OfflineHitType::Other
@ Other
DataHeader::operator=
DataHeader & operator=(const DataHeader &rhs)
Assignment Operator.
Definition: DataHeader.cxx:223
DataHeader::dump
void dump(std::ostream &ostr) const
Definition: DataHeader.cxx:336
DataHeader::setAttributeList
void setAttributeList(const coral::AttributeList *attrList)
Definition: DataHeader.cxx:317
DataHeaderElement::m_pClid
CLID m_pClid
primary ClassID.
Definition: DataHeader.h:108
DataHeader::addHash
void addHash(IStringPool *pool)
Add new entry to hash map.
Definition: DataHeader.cxx:296
pool
pool namespace
Definition: libname.h:15
SG::TransientAddress::setAlias
void setAlias(const std::string &key)
set alias'
Definition: TransientAddress.h:260
skel.it
it
Definition: skel.GENtoEVGEN.py:407
DataHeader::elements
const std::vector< DataHeaderElement > & elements() const
Definition: DataHeader.cxx:262
SG::TransientAddress
Definition: TransientAddress.h:32
DataHeader::begin
std::vector< DataHeaderElement >::const_iterator begin() const
Definition: DataHeader.cxx:254
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
DataHeader::statusFlag
statusFlag
Definition: DataHeader.h:128
DataHeader::insertProvenance
void insertProvenance(const DataHeaderElement &dhe)
Insert a new element into the "Provenance" vector.
Definition: DataHeader.cxx:292
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
Token::fromString
Token & fromString(const std::string &from)
Build from the string representation of a token.
Definition: Token.cxx:148
DataHeader::m_dhFormToken
std::string m_dhFormToken
Token to the DH format object.
Definition: DataHeader.h:224
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:284
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:126
DataHeader::size
int size() const
Definition: DataHeader.cxx:250
h
vector
Definition: MultiHisto.h:13
extractSporadic.h
list h
Definition: extractSporadic.py:96
COOLRates.alias
alias
Definition: COOLRates.py:1172
DataHeader::sizeProvenance
int sizeProvenance() const
Definition: DataHeader.cxx:280
DataHeaderElement::DataHeaderElement
DataHeaderElement()
Default Constructor.
Definition: DataHeader.cxx:19
DataHeaderElement::dump
void dump(std::ostream &ostr) const
Definition: DataHeader.cxx:177
DataHeader::recycle
virtual void recycle()
Called before this object is recycled.
Definition: DataHeader.cxx:354
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:134
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:266
DataHeader::setStatus
void setStatus(statusFlag status)
Set StatusFlag enum for DataHeader.
Definition: DataHeader.cxx:234
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:216
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DataHeader::end
std::vector< DataHeaderElement >::const_iterator end() const
Definition: DataHeader.cxx:258
DataHeaderElement::addHash
void addHash(IStringPool *pool)
Add new entry to hash map.
Definition: DataHeader.cxx:138
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:129
DataHeader::m_dataHeader
std::vector< DataHeaderElement > m_dataHeader
vector with DataHeaderElement to "DataObject".
Definition: DataHeader.h:212
DataHeader::getEvtRefTokenStr
const std::string & getEvtRefTokenStr()
Definition: DataHeader.cxx:329
DataHeader::setDhFormToken
void setDhFormToken(const std::string &formToken)
Definition: DataHeader.cxx:312
RTTAlgmain.address
address
Definition: RTTAlgmain.py:55
DataHeaderElement::getStorageType
long getStorageType() const
Definition: DataHeader.cxx:129
DataHeaderElement::m_hashes
std::vector< sgkey_t > m_hashes
hash table for ElementLink host container keys.
Definition: DataHeader.h:118
DataHeaderElement::m_clids
std::vector< CLID > m_clids
vector of unsigned long to store ClassID's for symlinked container.
Definition: DataHeader.h:110
DataHeaderElement::getAddress
SG::TransientAddress * getAddress(unsigned long contextId=0) const
Definition: DataHeader.cxx:148
TokenAddress.h
This file contains the class definition for the TokenAddress class.
DataHeader::~DataHeader
virtual ~DataHeader()
Destructor.
Definition: DataHeader.cxx:220
DataHeader::getAttributeList
const coral::AttributeList * getAttributeList()
Definition: DataHeader.cxx:321
a
TList * a
Definition: liststreamerinfos.cxx:10
DataHeader::getProcessTag
const std::string & getProcessTag() const
Definition: DataHeader.cxx:246
TransientAddress.h
SG::TransientAddress::setSGKey
void setSGKey(sgkey_t sgkey)
check if it is a transient ID (primary or symLinked):
Definition: TransientAddress.h:238
DataHeader::setEvtRefTokenStr
void setEvtRefTokenStr(const std::string &tokenStr)
Definition: DataHeader.cxx:325
DataHeader::m_processTag
std::string m_processTag
ProcessTag (e.g.: "StreamESD", "StreamAOD" ...).
Definition: DataHeader.h:218
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:209
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:214
DataHeader::dhFormToken
const std::string & dhFormToken() const
Form token, to be able to tell when the form changes.
Definition: DataHeader.cxx:307
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:222
DataProxy.h