ATLAS Offline Software
DataHeaderCnv.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
10 #include "DataHeaderCnv.h"
11 
15 
18 
19 #include "CoralBase/AttributeList.h"
20 #include "CoralBase/Attribute.h"
21 
22 #include "GaudiKernel/IIncidentSvc.h"
23 #include "GaudiKernel/FileIncident.h"
25 
26 #include <stdexcept>
27 
28 // cppcheck-suppress uninitMemberVar
29 DataHeaderCnv::DataHeaderCnv(ISvcLocator* svcloc) :
30  DataHeaderCnvBase(svcloc, "DataHeaderCnv")
31 {
32  m_classDesc = RootType( "DataHeader_p6" );
33 }
34 
35 //______________________________________________________________________________
37 {
38  // Remove itself from the IncidentSvc - if it is still around
39  ServiceHandle<IIncidentSvc> incSvc("IncidentSvc", "DataHeaderCnv");
40  if( incSvc.retrieve().isSuccess() ) {
41  incSvc->removeListener(this, IncidentType::EndInputFile);
42  }
43 }
44 //______________________________________________________________________________
46 {
47  // Read properties from the ConversionSvc
48  m_inDHFMapMaxsize = 100; // default DHForm cache size
49  bool doFilterDHAliases = true;
50  IConversionSvc* cnvSvc(nullptr);
51  if( service("AthenaPoolCnvSvc", cnvSvc, true ).isSuccess() ) {
52  IProperty* prop = dynamic_cast<IProperty*>( cnvSvc );
53  if( prop ) {
54  IntegerProperty sizeProp("maxDHFormCacheSize", m_inDHFMapMaxsize);
55  if( prop->getProperty(&sizeProp).isSuccess() ) {
56  m_inDHFMapMaxsize = sizeProp.value();
57  }
58  BooleanProperty aliasFilterProp("doFilterDHAliases", doFilterDHAliases);
59  if( prop->getProperty(&aliasFilterProp).isSuccess() ) {
60  doFilterDHAliases = aliasFilterProp.value();
61  }
62  }
63  }
64  ATH_MSG_VERBOSE("Using DHForm cache size: " << m_inDHFMapMaxsize);
65  if( doFilterDHAliases ) {
66  ATH_MSG_VERBOSE("Will filter SG Aux aliases in DataHeader");
67  } else {
68  ATH_MSG_VERBOSE("Will NOT filter SG Aux aliases in DataHeader");
69  }
70  m_tpOutConverter.setSGAliasFiltering( doFilterDHAliases );
71 
72  // Listen to EndInputFile incidents to clear old DataHeaderForms from the cache
73  // Get IncidentSvc
74  ServiceHandle<IIncidentSvc> incSvc("IncidentSvc", "DataHeaderCnv");
75  ATH_CHECK( incSvc.retrieve() );
76  incSvc->addListener(this, IncidentType::EndInputFile, 0);
77  incSvc->addListener(this, "PreFork", 0);
79 }
80 
81 
82 void DataHeaderCnv::handle(const Incident& incident)
83 {
84  if( incident.type() == "PreFork" ) {
85  m_persFormMap.clear();
86  }
87  if( incident.type() == IncidentType::EndInputFile ) {
88  // remove cached DHForms that came from the file that is now being closed
89  const std::string& guid = static_cast<const FileIncident&>(incident).fileGuid();
91  }
92 }
93 
94 
95 void DataHeaderCnv::clearInputDHFormCache( const std::string& dbGuid )
96 {
97  auto iter = m_inputDHForms.begin();
98  while( iter != m_inputDHForms.end() ) {
99  size_t dbpos = iter->first.find("[DB=");
100  if( dbpos != std::string::npos && iter->first.compare(dbpos+4, dbpos+36, dbGuid) == 0 ) {
101  iter = m_inputDHForms.erase( iter );
102  } else {
103  iter++;
104  }
105  }
106  m_inDHFormCount[ dbGuid ] = 0;
107 }
108 
109 //______________________________________________________________________________
110 /* DH is received by the SharedWriter first and needs the DHForm object both for
111  reference (Token) and to add DHElem with the ref to itself.
112  These updates will be handled by updateRepRefs() - cache the DH info so it can
113  by used later by updateRepRefs
114  pObject contains pointer to DataHeader_p6
115  pAddress: par[0] contains DH token, par[1] contains placement + DH processingTag as KEY
116 */
117 StatusCode DataHeaderCnv::updateRep(IOpaqueAddress* pAddress, DataObject* pObject)
118 {
119  if( m_sharedWriterCachedDH ) {
120  ATH_MSG_ERROR( "updateRep called but the previous DataHeader was not yet processed."
121  << " cached DH Key=" << m_sharedWriterCachedDHKey
122  << " cached DH Ref=" << m_sharedWriterCachedDHToken );
123  return StatusCode::FAILURE;
124  }
125  // remember this DH and finish processing in updateRepRefs()
126  m_sharedWriterCachedDH = reinterpret_cast<DataHeader_p6*>( pObject );
127  m_sharedWriterCachedDHToken = pAddress->par()[0];
128  std::size_t tagBeg = pAddress->par()[1].find("[KEY=") + 5;
129  std::size_t tagSize = pAddress->par()[1].find(']', tagBeg) - tagBeg;
130  m_sharedWriterCachedDHKey = pAddress->par()[1].substr( tagBeg, tagSize );
131  return StatusCode::SUCCESS;
132 }
133 
134 //______________________________________________________________________________
135 /* Attach a DHForm to the previous DataHeader (in SharedWriter server mode)
136  Finish writing of the DataHeader by attaching the DHForm to it and by adding
137  the self reference. DHForm is passed as pObject and is cached until a new one
138  arrives. This method is called for each event after the DH is received.
139  pObject is null if there is no new DHForm for this event - in this case the old
140  one is used
141  */
142 StatusCode DataHeaderCnv::updateRepRefs(IOpaqueAddress* pAddress, DataObject* pObject)
143 {
144  static const pool::Guid dhf_p6_guid("7BE56CEF-C866-4BEE-9348-A5F34B5F1DAD");
145  std::string dhid = pAddress->par()[1];
146  if( pObject ) {
147  this->setToken( pAddress->par()[0] );
148  if( !compareClassGuid( dhf_p6_guid ) ) {
149  ATH_MSG_ERROR( "updateRepRefs called without DataHeaderForm" );
150  return StatusCode::FAILURE;
151  }
152  // replace the old DHForm
153  // will keep this DHForm until a new one arrives
154  m_sharedWriterCachedDHForm[dhid].reset( reinterpret_cast<DataHeaderForm_p6*>( pObject ) );
155  m_sharedWriterCachedDHForm[dhid]->setToken( pAddress->par()[0] );
156  }
157 
158  if( m_sharedWriterCachedDHForm.find(dhid) == m_sharedWriterCachedDHForm.end() ) {
159  ATH_MSG_ERROR( "updateRepRefs: missing DataHeaderForm for DH ID=" << dhid );
160  return StatusCode::FAILURE;
161  }
162  if( !m_sharedWriterCachedDH ) {
163  ATH_MSG_ERROR( "updateRepRefs: missing DataHeader" );
164  return StatusCode::FAILURE;
165  }
166  // update the cached DataHeader (can be done until a commit is called)
170 
171  // this DataHeader object is now fully processed, so forget it
172  m_sharedWriterCachedDH = nullptr;
173  return(StatusCode::SUCCESS);
174 }
175 
176 
177 //______________________________________________________________________________
178 StatusCode DataHeaderCnv::DataObjectToPool(IOpaqueAddress* pAddr, DataObject* pObj)
179 {
180  DataHeader* obj = nullptr;
181  if (!SG::fromStorable(pObj, obj) || obj == nullptr) {
182  ATH_MSG_ERROR( "Failed to cast DataHeader to transient type" );
183  return(StatusCode::FAILURE);
184  }
185  // DH placement first:
186  Placement dh_placement = setPlacementWithType("DataHeader", pObj->name(), *pAddr->par());
187  // remember the connection string, it may get changed in registerForWrite by SharedWriter
188  const std::string connection = dh_placement.fileName();
189  dh_placement.setAuxString("[KEY=" + obj->getProcessTag() + "]");
190 
191  // DHForm placement:
192  Placement dhf_placement = setPlacementWithType("DataHeaderForm", pObj->name(), *pAddr->par());
193  std::string form_placement_str = dhf_placement.toString();
194  // Find or create Form
195  std::unique_ptr<DataHeaderForm_p6>& dhForm = m_persFormMap[form_placement_str];
196  if (dhForm == nullptr) {
197  // create new DHF for this file. Every new file/container should get its own DHForm
198  dhForm = std::make_unique<DataHeaderForm_p6>();
199  }
200 
201  // Create persistent DH and update Form
202  DataHeader_p6* persObj = nullptr;
203  try {
204  persObj = createPersistent(obj, dhForm.get());
205  } catch (std::exception &e) {
206  ATH_MSG_FATAL("Failed to convert DataHeader to persistent type: " << e.what());
207  return(StatusCode::FAILURE);
208  }
209  // Set the Ref to the Form, if know (may be updated if a new Form is created below)
210  persObj->setDhFormToken( dhForm->getToken() );
211 
212  // Queue DH for write - for local writes object can still be updated
213  Token* dh_token = m_athenaPoolCnvSvc->registerForWrite(&dh_placement, persObj, m_classDesc);
214  if (dh_token == nullptr) {
215  ATH_MSG_FATAL("Failed to write DataHeader");
216  return(StatusCode::FAILURE);
217  }
218  keepPoolObj(persObj, connection);
219  // this updates DH and can update Form
220  m_tpOutConverter.insertDHRef(persObj, obj->getProcessTag(), dh_token->toString(), *dhForm);
221 
222  // Queue Form for write if it was modified (or new)
223  if (dhForm->wasModified()) {
224  m_wroteDHForm = true;
225  static const RootType dhFormType(typeid(*dhForm));
226  Token* dhf_token = m_athenaPoolCnvSvc->registerForWrite(&dhf_placement, dhForm.get(), dhFormType);
227  if (dhf_token == nullptr) {
228  ATH_MSG_FATAL("Failed to write " << dhFormType.Name());
229  return(StatusCode::FAILURE);
230  }
231  if (dhf_token->technology() != 0) { // Only store DHF token if technology allows it to be appended to DH
232  dhForm->setToken(dhf_token->toString());
233  } else { // Otherwise keep string empty to cause DHF reading via DH token
234  ATH_MSG_DEBUG("Technology does not support setting DHF token for: " << dh_token->toString());
235  dhForm->setToken("");
236  }
237  dhf_token->release(); dhf_token = nullptr;
238  // Update DH with the new Form Ref
239  persObj->setDhFormToken(dhForm->getToken());
240  dhForm->clearModified();
241  ATH_MSG_DEBUG("wrote new DHForm with " << dhForm->sizeObj() << " SG object data");
242  } else {
243  m_wroteDHForm = false;
244  }
245 
246  const coral::AttributeList* list = obj->getAttributeList();
247  if (list != nullptr) {
248  obj->setEvtRefTokenStr(dh_token->toString());
249  Placement attr_placement = this->setPlacementWithType("AttributeList", "Token", *pAddr->par());
250  const Token* ref_token = m_athenaPoolCnvSvc->registerForWrite(&attr_placement,
251  obj->getEvtRefTokenStr().c_str(),
252  RootType("Token"));
253  delete ref_token; ref_token = nullptr;
254  for (coral::AttributeList::const_iterator iter = list->begin(), last = list->end(); iter != last; ++iter) {
255  attr_placement = this->setPlacementWithType("AttributeList", (*iter).specification().name(), *pAddr->par());
256  const Token* attr_token = m_athenaPoolCnvSvc->registerForWrite(&attr_placement,
257  (*iter).addressOfData(),
258  RootType((*iter).specification().type()) );
259  delete attr_token; attr_token = nullptr;
260  }
261  }
262  TokenAddress* tokAddr = dynamic_cast<TokenAddress*>(pAddr);
263  if (tokAddr != nullptr) {
264  tokAddr->setToken(dh_token); dh_token = nullptr;
265  } else {
266  delete dh_token; dh_token = nullptr;
267  return(StatusCode::FAILURE);
268  }
269  return(StatusCode::SUCCESS);
270 }
271 
272 //______________________________________________________________________________
273 std::unique_ptr<DataHeader_p5> DataHeaderCnv::poolReadObject_p5()
274 {
275  void* voidPtr1 = nullptr;
276  m_athenaPoolCnvSvc->setObjPtr(voidPtr1, m_i_poolToken);
277  if (voidPtr1 == nullptr) {
278  throw std::runtime_error("Could not get object for token = " + m_i_poolToken->toString());
279  }
280  std::unique_ptr<DataHeader_p5> header( reinterpret_cast<DataHeader_p5*>(voidPtr1) );
281 
282  void* voidPtr2 = nullptr;
283  Token mapToken;
284  mapToken.fromString( header->dhFormToken() );
285  mapToken.setAuxString( m_i_poolToken->auxString() ); // set PersSvc context
286  if (mapToken.classID() != Guid::null()) {
287  if( header->dhFormMdx() != m_dhFormMdx ) {
288  m_athenaPoolCnvSvc->setObjPtr(voidPtr2, &mapToken);
289  if (voidPtr2 == nullptr) {
290  throw std::runtime_error("Could not get object for token = " + mapToken.toString());
291  }
292  m_dhInForm5.reset( reinterpret_cast<DataHeaderForm_p5*>(voidPtr2) );
293  m_dhFormMdx = header->dhFormMdx();
294  }
295  }
296  return header;
297 }
298 
299 //______________________________________________________________________________
300 // Read the persistent rep of DataHeader
301 // Also read DataHeaderForm if not yet cached
302 std::unique_ptr<DataHeader_p6> DataHeaderCnv::poolReadObject_p6()
303 {
304  void* voidPtr1 = nullptr;
305  std::string error_message;
306  try {
307  m_athenaPoolCnvSvc->setObjPtr(voidPtr1, m_i_poolToken);
308  } catch(const std::exception& err) {
309  voidPtr1 = nullptr;
310  error_message = err.what();
311  }
312  if (voidPtr1 == nullptr) {
313  throw std::runtime_error("Could not get object for token = " + m_i_poolToken->toString() + ", " + error_message);
314  }
315  std::unique_ptr<DataHeader_p6> header( reinterpret_cast<DataHeader_p6*>(voidPtr1) );
316 
317  // see if the DataHeaderForm is already cached
318  std::string dhFormToken = header->dhFormToken();
319  if( dhFormToken.empty() || m_inputDHForms.find(dhFormToken) == m_inputDHForms.end() ) {
320  // no cached DHForm
321  size_t dbpos = dhFormToken.find("[DB=");
322  if( dbpos != std::string::npos ) {
323  const std::string dbGuid = dhFormToken.substr(dbpos+4, dbpos+36);
324  if( ++m_inDHFormCount[dbGuid] > m_inDHFMapMaxsize ) {
325  // prevent the input DHFMap from growing too large
326  clearInputDHFormCache( dbGuid );
327  m_inDHFormCount[dbGuid] = 1;
328  }
329  }
330  // we need to read a new DHF
331  void* voidPtr2 = nullptr;
332  Token mapToken;
333  if( dhFormToken.empty() ) { // Some technologies can't set DHF token, use DH token with new CLID.
334  m_i_poolToken->setData(&mapToken);
335  mapToken.setClassID( Guid("7BE56CEF-C866-4BEE-9348-A5F34B5F1DAD") );
336  } else {
337  mapToken.fromString( dhFormToken );
338  mapToken.setAuxString( m_i_poolToken->auxString() ); // set PersSvc context
339  }
340  if (mapToken.classID() != Guid::null()) {
341  try {
342  m_athenaPoolCnvSvc->setObjPtr(voidPtr2, &mapToken);
343  } catch(const std::exception& err) {
344  voidPtr2 = nullptr;
345  error_message = err.what();
346  }
347  if (voidPtr2 == nullptr) {
348  // if there is no good lastGoodDHFRef then try reading DataHeaderForm Token from the first DataHeader
349  if( m_lastGoodDHFRef.find(m_i_poolToken->contID()) == m_lastGoodDHFRef.end() ) {
350  Token firstToken;
351  m_i_poolToken->setData(&firstToken);
352  firstToken.setOid(Token::OID_t(firstToken.oid().first, 0));
353  void* firstPtr1 = nullptr;
354  try {
355  m_athenaPoolCnvSvc->setObjPtr(firstPtr1, &firstToken);
356  } catch(const std::exception& err) {
357  firstPtr1 = nullptr;
358  error_message = err.what();
359  }
360  if (firstPtr1 == nullptr) throw std::runtime_error("Could not get first DataHeader for token = " + firstToken.toString() + ", " + error_message);
361 
362  // Get DataHeaderForm Token from the first DataHeader
363  std::unique_ptr<DataHeader_p6> firstHeader( reinterpret_cast<DataHeader_p6*>(firstPtr1) );
364  dhFormToken = firstHeader->dhFormToken();
365 
366  // Read DataHeaderForm and insert it to the cache
367  mapToken.fromString( dhFormToken );
368  mapToken.setAuxString( m_i_poolToken->auxString() ); // set PersSvc context
369  try {
370  m_athenaPoolCnvSvc->setObjPtr(voidPtr2, &mapToken);
371  } catch(const std::exception& err) {
372  voidPtr2 = nullptr;
373  error_message = err.what();
374  }
375  if (voidPtr2 == nullptr) throw std::runtime_error("Could not get DataHeaderForm for token = " + mapToken.toString() + ", " + error_message);
376  m_lastGoodDHFRef[m_i_poolToken->contID()] = dhFormToken;
377  m_inputDHForms[dhFormToken].reset( reinterpret_cast<DataHeaderForm_p6*>(voidPtr2) );
378  ATH_MSG_WARNING("DataHeaderForm read exception: " << error_message << " - reusing the last good DHForm");
379  } else {
380  // try to reuse the last good DHForm Ref (object is already cached)
381  ATH_MSG_WARNING("DataHeaderForm read exception: " << error_message << " - reusing the last good DHForm");
382  }
383  header->setDhFormToken(m_lastGoodDHFRef[m_i_poolToken->contID()]);
384  return header;
385  }
386  if (voidPtr2 == nullptr) {
387  throw std::runtime_error("Could not get object for token = " + mapToken.toString());
388  }
389  m_lastGoodDHFRef[m_i_poolToken->contID()] = dhFormToken;
390  }
391  m_inputDHForms[dhFormToken].reset( reinterpret_cast<DataHeaderForm_p6*>(voidPtr2) );
392  }
393  return header;
394 }
395 
396 //______________________________________________________________________________
398 {
399  return m_tpOutConverter.createPersistent( transObj, *dh_form );
400 }
401 
402 //______________________________________________________________________________
404 {
405  auto iter = dh->m_inputDataHeader.begin();
406  while( iter != dh->m_inputDataHeader.end() ) {
407  if( iter->getToken()->dbID() == Guid::null() ) {
408  ATH_MSG_WARNING("Removed incomplete Input Element");
409  iter = dh->m_inputDataHeader.erase(iter);
410  } else {
411  ++iter;
412  }
413  }
414 }
415 
416 //______________________________________________________________________________
418  if (this->m_i_poolToken == nullptr) {
419  return(nullptr);
420  }
421  if (this->m_i_poolToken->technology() == 0x00001000) { // Artificial ByteStream DataHeader Token
422  DataHeader* dh = new DataHeader();
423  std::string bestPfn, fileType;
424  m_athenaPoolCnvSvc->getPoolSvc()->lookupBestPfn(this->m_i_poolToken->dbID().toString(), bestPfn, fileType);
425  const Token* copy = new Token(this->m_i_poolToken);
427  dh->insert(dhe);
428  return(dh);
429  }
430  static const pool::Guid p6_guid("4DDBD295-EFCE-472A-9EC8-15CD35A9EB8D");
431  static const pool::Guid p5_guid("D82968A1-CF91-4320-B2DD-E0F739CBC7E6");
432  static const pool::Guid p4_guid("9630EB7B-CCD7-47D9-A39B-CBBF4133CDF2");
433  static const pool::Guid p3_guid("EC1318F0-8E28-45F8-9A2D-2597C1CC87A6");
434  try {
435  if( compareClassGuid( p6_guid ) ) {
436  std::unique_ptr<DataHeader_p6> header( poolReadObject_p6() );
437  auto dh = m_tpInConverter.createTransient( header.get(), *(m_inputDHForms[ header->dhFormToken() ]) );
438  dh->setEvtRefTokenStr( m_i_poolToken->toString() );
440  // To dump the DataHeader uncomment below
441  // std::ostringstream ss; dh->dump(ss); std::cout << ss.str() << std::endl;
442  return dh;
443  } else if (this->compareClassGuid( p5_guid )) {
444  std::unique_ptr<DataHeader_p5> obj_p5( poolReadObject_p5() );
445  return m_tpInConverter_p5.createTransient( *obj_p5, *m_dhInForm5 ).release();
446  } else if (this->compareClassGuid( p4_guid )) {
447  std::unique_ptr<DataHeader_p4> obj_p4(this->poolReadObject<DataHeader_p4>());
448  DataHeaderCnv_p4 tPconverter_p4;
449  return(tPconverter_p4.createTransient(obj_p4.get()));
450  } else if (this->compareClassGuid( p3_guid )) {
451  std::unique_ptr<DataHeader_p3> obj_p3(this->poolReadObject<DataHeader_p3>());
452  DataHeaderCnv_p3 tPconverter_p3;
453  return(tPconverter_p3.createTransient(obj_p3.get()));
454  }
455  } catch (std::exception &e) {
456  // upgrade all exceptions to runtime_error (who needs that? MN)
457  std::string error = e.what();
458  throw std::runtime_error(error);
459  }
460  return(nullptr);
461 }
DataHeaderCnv::handle
virtual void handle(const Incident &incident) override
Incident service handle listening for EndInputFile.
Definition: DataHeaderCnv.cxx:82
DataHeaderForm_p6
This class provides storage for the constant fields of the persistent DataHeader class.
Definition: DataHeader_p6.h:27
AthenaPoolConverter::setPlacementWithType
virtual Placement setPlacementWithType(const std::string &tname, const std::string &key, const std::string &output)
Set POOL placement hint for a given type.
Definition: AthenaPoolConverter.cxx:176
DataHeaderCnv_p6::setSGAliasFiltering
void setSGAliasFiltering(bool doFiltering)
Definition: DataHeaderCnv_p6.h:41
Guid::null
static const Guid & null()
NULL-Guid: static class method.
Definition: Guid.cxx:18
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
Placement
This class holds all the necessary information to guide the writing of an object in a physical place.
Definition: Placement.h:19
DataHeaderCnv::updateRep
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject) override
Extend base-class conversion methods.
Definition: DataHeaderCnv.cxx:117
DataHeaderCnv::createTransient
virtual DataHeader * createTransient() override
Definition: DataHeaderCnv.cxx:417
header
Definition: hcg.cxx:526
DataHeaderCnv::m_sharedWriterCachedDHToken
std::string m_sharedWriterCachedDHToken
Definition: DataHeaderCnv.h:97
AthCheckMacros.h
Token::contID
const std::string & contID() const
Access container identifier.
Definition: Token.h:67
SG::fromStorable
bool fromStorable(DataObject *pDObj, T *&pTrans, bool quiet=false, IRegisterTransient *irt=0, bool isConst=true)
Definition: StorableConversions.h:180
AthenaPoolConverter::m_athenaPoolCnvSvc
ServiceHandle< IAthenaPoolCnvSvc > m_athenaPoolCnvSvc
Definition: AthenaPoolConverter.h:111
DataHeaderCnv::m_dhFormMdx
std::string m_dhFormMdx
Definition: DataHeaderCnv.h:90
DataHeaderCnv::m_sharedWriterCachedDHKey
std::string m_sharedWriterCachedDHKey
Definition: DataHeaderCnv.h:96
Token::auxString
const std::string & auxString() const
Access auxiliary string.
Definition: Token.h:89
DataHeaderCnv::m_tpOutConverter
DataHeaderCnv_p6 m_tpOutConverter
Definition: DataHeaderCnv.h:68
Token::dbID
const Guid & dbID() const
Access database identifier.
Definition: Token.h:62
T_AthenaPoolCustomCnvWithKey::keepPoolObj
void keepPoolObj(PERS *obj, const std::string &output)
Remember the POOL object to be written out (will be deleted after commit)
DataHeaderCnv_p6::createPersistent
DataHeader_p6 * createPersistent(const DataHeader *transObj, DataHeaderForm_p6 &form)
Definition: DataHeaderCnv_p6.cxx:126
DataHeaderForm_p5
This class provides storage for the constant fields of the persistent DataHeader class.
Definition: DataHeader_p5.h:42
Guid::toString
const std::string toString() const
Automatic conversion to string representation.
Definition: Guid.cxx:58
DataHeaderCnv::m_tpInConverter_p5
DataHeaderCnv_p5 m_tpInConverter_p5
for use when reading DataHeader_p5
Definition: DataHeaderCnv.h:88
PyPoolBrowser.dh
dh
Definition: PyPoolBrowser.py:102
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
Token::classID
const Guid & classID() const
Access database identifier.
Definition: Token.h:71
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
DataHeaderCnv::m_inputDHForms
std::map< std::string, std::unique_ptr< DataHeaderForm_p6 > > m_inputDHForms
DHForm cache indexed by its parent DataHeader reference (for readinh)
Definition: DataHeaderCnv.h:76
DataHeader_p6::setDhFormToken
void setDhFormToken(const std::string &formToken)
Definition: DataHeader_p6.cxx:168
DataHeaderCnv::m_sharedWriterCachedDHForm
std::map< std::string, std::unique_ptr< DataHeaderForm_p6 > > m_sharedWriterCachedDHForm
map of cached DHForms for DataHeader ID
Definition: DataHeaderCnv.h:95
DataHeaderCnv::m_wroteDHForm
bool m_wroteDHForm
true if the last writing of the DataHeader had to write a new DHForm
Definition: DataHeaderCnv.h:84
Placement::setAuxString
Placement & setAuxString(const std::string &auxString)
Set auxiliary string.
Definition: Placement.h:42
DataHeaderCnv_p6::insertDHRef
void insertDHRef(DataHeader_p6 *pers_dh, const std::string &key, const std::string &dh_tokstr, DataHeaderForm_p6 &dh_form)
insert DH self reference as one of the DHElements. Contains the stream Key
Definition: DataHeaderCnv_p6.cxx:144
RootType
TTypeAdapter RootType
Definition: RootType.h:211
T_AthenaPoolCustCnv::setToken
virtual void setToken(const std::string &token)
Set the token (in std::string representation) and classID for the object that will be read next.
Token
This class provides a token that identifies in a unique way objects on the persistent storage.
Definition: Token.h:21
DataHeaderCnv::DataHeaderCnv
DataHeaderCnv(ISvcLocator *svcloc)
Definition: DataHeaderCnv.cxx:29
TokenAddress
This class provides a Generic Transient Address for POOL tokens.
Definition: TokenAddress.h:21
DataHeaderCnv::m_inDHFMapMaxsize
unsigned m_inDHFMapMaxsize
Max DHForms to cache per input file.
Definition: DataHeaderCnv.h:81
Token::OID_t
Definition: Token.h:24
pool::Guid
::Guid Guid
Definition: T_AthenaPoolCustCnv.h:19
Token::fromString
Token & fromString(const std::string &from)
Build from the string representation of a token.
Definition: Token.cxx:133
Token::setClassID
Token & setClassID(const Guid &cl_id)
Access database identifier.
Definition: Token.h:73
TokenAddress::setToken
void setToken(Token *token)
Definition: TokenAddress.h:50
DataHeaderElement
This class provides a persistent form for the TransientAddress.
Definition: DataHeader.h:36
Token::technology
int technology() const
Access technology type.
Definition: Token.h:75
AthenaPoolConverter::m_i_poolToken
const Token * m_i_poolToken
Definition: AthenaPoolConverter.h:124
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
DataHeaderForm_p6::getToken
const std::string & getToken() const
Definition: DataHeader_p6.cxx:149
DataHeaderCnv::m_sharedWriterCachedDH
DataHeader_p6 * m_sharedWriterCachedDH
cached values for use with SharedWriter server
Definition: DataHeaderCnv.h:93
dqt_zlumi_pandas.err
err
Definition: dqt_zlumi_pandas.py:193
T_AthenaPoolCustomCnv
Compatibility for old converter classes that don't get passed the key.
Definition: T_AthenaPoolCustomCnv.h:132
DataHeader
This class provides the layout for summary information stored for data written to POOL.
Definition: DataHeader.h:124
DataHeader_p6::dhFormToken
const std::string & dhFormToken() const
Definition: DataHeader_p6.cxx:164
DataHeaderCnv_p6::createTransient
DataHeader * createTransient(const DataHeader_p6 *persObj, const DataHeaderForm_p6 &form)
Definition: DataHeaderCnv_p6.cxx:61
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
DataHeaderCnv::updateRepRefs
virtual StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Definition: DataHeaderCnv.cxx:142
DataHeaderCnv::DataObjectToPool
virtual StatusCode DataObjectToPool(IOpaqueAddress *pAddr, DataObject *pObj) override
Write an object into POOL.
Definition: DataHeaderCnv.cxx:178
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:40
DataHeaderCnv::m_tpInConverter
DataHeaderCnv_p6 m_tpInConverter
Definition: DataHeaderCnv.h:69
calibdata.exception
exception
Definition: calibdata.py:496
DataHeaderCnv_p3.h
This file contains the class definition for the DataHeaderCnv_p3 and DataHeaderElementCnv_p3 classes.
DataHeaderCnv::clearInputDHFormCache
void clearInputDHFormCache(const std::string &dbGuid)
Delete cached DHForms for a given input file GUID.
Definition: DataHeaderCnv.cxx:95
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Placement::fileName
const std::string & fileName() const
Access file name.
Definition: Placement.h:28
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
Token::release
int release()
Release token: Decrease reference count and eventually delete.
Definition: Token.cxx:60
DataHeader_p6
This class provides a persistent representation for the DataHeader class.
Definition: DataHeader_p6.h:105
DataHeaderCnv_p4::createTransient
DataHeader * createTransient(const DataHeader_p4 *persObj)
Definition: DataHeaderCnv_p4.h:51
TScopeAdapter::Name
std::string Name(unsigned int mod=Reflex::SCOPED) const
Definition: RootType.cxx:607
DataHeaderCnv::createPersistent
DataHeader_p6 * createPersistent(DataHeader *transObj, DataHeaderForm_p6 *)
Definition: DataHeaderCnv.cxx:397
DataHeaderCnv::m_dhInForm5
std::unique_ptr< DataHeaderForm_p5 > m_dhInForm5
Definition: DataHeaderCnv.h:89
DataHeaderCnv::poolReadObject_p5
std::unique_ptr< DataHeader_p5 > poolReadObject_p5()
Definition: DataHeaderCnv.cxx:273
pool_uuid.guid
guid
Definition: pool_uuid.py:112
DataHeaderCnv::m_lastGoodDHFRef
std::map< std::string, std::string > m_lastGoodDHFRef
Definition: DataHeaderCnv.h:85
DataHeaderForm_p6::clearModified
void clearModified()
Definition: DataHeader_p6.cxx:140
DataHeaderCnv_p4.h
This file contains the class definition for the DataHeaderCnv_p4 and DataHeaderElementCnv_p4 classes.
DataHeaderForm_p6::setToken
void setToken(const std::string &tok)
Definition: DataHeader_p6.cxx:144
DataHeaderCnv_p4
This class provides the converter to customize the saving of DataHeader_p4.
Definition: DataHeaderCnv_p4.h:35
Token::toString
virtual const std::string toString() const
Retrieve the string representation of the token.
Definition: Token.cxx:114
DataHeaderForm_p6::sizeObj
std::size_t sizeObj() const
Definition: DataHeader_p6.cxx:102
DataHeaderCnv::m_inDHFormCount
std::map< std::string, unsigned > m_inDHFormCount
How many DHForms for an input file are in the cache.
Definition: DataHeaderCnv.h:79
Token::setOid
Token & setOid(const OID_t &oid)
Set object identifier.
Definition: Token.h:83
Placement::toString
const std::string toString() const
Retrieve the string representation of the placement.
Definition: Placement.cxx:15
DataHeaderCnv_p3::createTransient
DataHeader * createTransient(const DataHeader_p3 *persObj)
Definition: DataHeaderCnv_p3.h:51
TokenAddress.h
This file contains the class definition for the TokenAddress class.
DataHeaderCnv::removeBadElements
void removeBadElements(DataHeader *dh)
Remove DataHeaderElements with incomplete (dbID="") refs.
Definition: DataHeaderCnv.cxx:403
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
DataHeaderCnv_p5::createTransient
std::unique_ptr< DataHeader > createTransient(const DataHeader_p5 &persObj, const DataHeaderForm_p5 &dhForm) const
Definition: DataHeaderCnv_p5.h:70
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DataHeader_p5
This class provides a persistent representation for the DataHeader class.
Definition: DataHeader_p5.h:67
Token::oid
const OID_t & oid() const
Access object identifier.
Definition: Token.h:79
Token::setAuxString
Token & setAuxString(const std::string &auxString)
Set auxiliary string.
Definition: Token.h:91
calibdata.copy
bool copy
Definition: calibdata.py:27
T_AthenaPoolCustCnv::compareClassGuid
virtual bool compareClassGuid(const Guid &clid) const
Compare POOL class GUID with the one of the object being read.
Placement.h
This file contains the class definition for the Placement class (migrated from POOL).
DataHeaderCnv_p3
This class provides the converter to customize the saving of DataHeader_p3.
Definition: DataHeaderCnv_p3.h:35
AthenaPoolConverter::m_classDesc
RootType m_classDesc
Definition: AthenaPoolConverter.h:112
Token::setData
const Token & setData(Token *pToken) const
Set all the data part of the token.
Definition: Token.cxx:194
makeTOC.header
header
Definition: makeTOC.py:28
T_AthenaPoolCustCnv::initialize
virtual StatusCode initialize()
Gaudi Service Interface method implementations:
python.PyAthena.obj
obj
Definition: PyAthena.py:135
DataHeaderCnv::~DataHeaderCnv
~DataHeaderCnv()
Definition: DataHeaderCnv.cxx:36
Token.h
This file contains the class definition for the Token class (migrated from POOL).
error
Definition: IImpactPoint3dEstimator.h:70
DataHeaderCnv::m_persFormMap
std::map< std::string, std::unique_ptr< DataHeaderForm_p6 > > m_persFormMap
DHForm cache indexed by filename or reference for writing.
Definition: DataHeaderCnv.h:74
DataHeaderCnv::poolReadObject_p6
std::unique_ptr< DataHeader_p6 > poolReadObject_p6()
Definition: DataHeaderCnv.cxx:302
DataHeaderForm_p6::wasModified
bool wasModified() const
Definition: DataHeader_p6.cxx:136
DataHeaderCnv::initialize
virtual StatusCode initialize() override
Gaudi Service Interface method implementations:
Definition: DataHeaderCnv.cxx:45
ServiceHandle< IIncidentSvc >
DataHeaderCnv.h
This file contains the class definition for the DataHeaderCnv class.
TScopeAdapter
Definition: RootType.h:119