The Gaudi Framework  master (37c0b60a)
RootCnvSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 //====================================================================
12 // RootCnvSvc implementation
13 //--------------------------------------------------------------------
14 //
15 // Description: Implementation of the ROOT data storage
16 //
17 // Author : M.Frank
18 //
19 //====================================================================
20 
21 // Framework include files
22 #include "RootUtils.h"
27 #include <GaudiKernel/IRegistry.h>
29 #include <GaudiKernel/Incident.h>
32 #include <GaudiKernel/MsgStream.h>
33 #include <GaudiKernel/System.h>
34 #include <RootCnv/RootAddress.h>
35 #include <RootCnv/RootCnvSvc.h>
36 #include <RootCnv/RootConverter.h>
40 #include <RootCnv/RootNTupleCnv.h>
41 #include <RootCnv/RootRefs.h>
42 
43 using namespace std;
44 using namespace Gaudi;
45 typedef const string& CSTR;
46 
47 #define S_OK StatusCode::SUCCESS
48 #define S_FAIL StatusCode::FAILURE
49 namespace GaudiRoot {
50  bool patchStreamers( MsgStream& log );
51 }
52 
53 namespace {
54  static map<string, TClass*> s_classesNames;
55  static map<CLID, TClass*> s_classesClids;
56 } // namespace
57 #define MBYTE ( 1024 * 1024 )
58 #define kBYTE 1024
59 // Standard constructor
60 RootCnvSvc::RootCnvSvc( CSTR nam, ISvcLocator* svc )
61  : ConversionSvc( nam, svc, ROOT_StorageType ), m_setup{ new RootConnectionSetup() } {
62  m_setup->cacheBranches.push_back( "*" );
63  declareProperty( "LoadSection", m_setup->loadSection = "Event" );
64 
65  // ROOT Read parameters: must be shared for the entire file!
66  declareProperty( "CacheSize", m_setup->cacheSize = 10 * MBYTE );
67  declareProperty( "LearnEntries", m_setup->learnEntries = 10 );
68  declareProperty( "CacheBranches", m_setup->cacheBranches );
69  declareProperty( "VetoBranches", m_setup->vetoBranches );
70 
71  declareProperty( m_setup->produceReproducibleFiles );
72  m_setup->produceReproducibleFiles.setOwnerType<RootCnvSvc>();
73 
74  declareProperty( m_setup->root630ForwardCompatibility );
75  m_setup->root630ForwardCompatibility.setOwnerType<RootCnvSvc>();
76 }
77 
78 // Small routine to issue exceptions
80  if ( m_log ) {
81  log() << MSG::ERROR << "Error: " << msg << endmsg;
82  return S_FAIL;
83  }
84  MsgStream m( msgSvc(), name() );
85  m << MSG::ERROR << "Error: " << msg << endmsg;
86  return S_FAIL;
87 }
88 
89 // Initialize the Db data persistency service
91  string cname;
93  if ( !status.isSuccess() ) { return error( "Failed to initialize ConversionSvc base class." ); }
94  m_log.reset( new MsgStream( msgSvc(), name() ) );
95  if ( !m_compression.empty() ) {
96  log() << MSG::INFO << "Setting global ROOT compression to:" << m_compression.value() << endmsg;
97  if ( !( status = RootConnectionSetup::setCompression( m_compression.value() ) ).isSuccess() ) {
98  return error( "Unable to interprete ROOT compression encoding:" + m_compression );
99  }
100  }
101  m_ioMgr = service( "IODataManager" );
102  if ( !m_ioMgr ) return error( "Unable to localize interface from service:IODataManager" );
103  m_incidentSvc = service( "IncidentSvc" );
104  if ( !m_incidentSvc ) return error( "Unable to localize interface from service:IncidentSvc" );
105  m_setup->setMessageSvc( new MsgStream( msgSvc(), name() ) );
106  m_setup->setIncidentSvc( m_incidentSvc.get() );
108  cname = System::typeinfoName( typeid( DataObject ) );
109  m_classDO = TClass::GetClass( cname.c_str() );
110  if ( !m_classDO ) return error( "Unable to load class description for DataObject" );
111  cname = System::typeinfoName( typeid( RootObjectRefs ) );
112  m_classRefs = TClass::GetClass( cname.c_str() );
113  if ( !m_classRefs ) return error( "Unable to load class description for ObjectRefs" );
114  return S_OK;
115 }
116 
117 // Finalize the Db data persistency service
119  log() << MSG::INFO;
120  if ( m_ioMgr ) {
121  IIODataManager::Connections cons = m_ioMgr->connections( nullptr );
122  for ( auto& i : cons ) {
123  auto pc = dynamic_cast<RootDataConnection*>( i );
124  if ( pc ) {
125  if ( pc->owner() == this && !m_ioPerfStats.empty() ) { pc->saveStatistics( m_ioPerfStats.value() ); }
126  if ( pc->lookupClient( this ) ) {
127  size_t num_clients = pc->removeClient( this );
128  if ( num_clients == 0 ) {
129  if ( m_ioMgr->disconnect( pc ).isSuccess() ) {
130  log() << "Disconnected data IO:" << pc->fid() << " [" << pc->pfn() << "]" << endmsg;
131  delete pc;
132  }
133  }
134  }
135  }
136  }
137  m_ioMgr.reset();
138  }
139  m_log.reset();
141  m_setup->setIncidentSvc( nullptr );
142  return ConversionSvc::finalize();
143 }
144 
145 // ConversionSvc overload: Create new Converter using factory
146 IConverter* RootCnvSvc::createConverter( long typ, const CLID& wanted, const ICnvFactory* ) {
147  if ( wanted == CLID_StatisticsFile )
148  return new RootDatabaseCnv( typ, wanted, serviceLocator().get(), this );
149  else if ( wanted == CLID_StatisticsDirectory )
150  return new RootDirectoryCnv( typ, wanted, serviceLocator().get(), this );
151  else if ( wanted == CLID_RowWiseTuple )
152  return new RootNTupleCnv( typ, wanted, serviceLocator().get(), this );
153  else if ( wanted == CLID_ColumnWiseTuple )
154  return new RootNTupleCnv( typ, wanted, serviceLocator().get(), this );
155  else
156  return new RootConverter( typ, wanted, serviceLocator().get(), this );
157 }
158 
159 // ConversionSvc overload: Load the class (dictionary) for the converter
161  if ( pObject ) {
162  string cname = System::typeinfoName( typeid( *pObject ) );
163  if ( log().level() <= MSG::DEBUG )
164  log() << MSG::DEBUG << "Trying to 'Autoload' dictionary for class " << cname << endmsg;
165  TClass* cl = s_classesNames[cname];
166  if ( nullptr == cl ) {
167  cl = TClass::GetClass( cname.c_str() );
168  if ( cl ) {
169  s_classesNames[cname] = cl;
170  s_classesClids[pObject->clID()] = cl;
171  }
172  }
173  }
174 }
175 
176 // Helper: Get TClass for a given DataObject pointer
177 TClass* RootCnvSvc::getClass( DataObject* pObject ) {
178  auto i = s_classesClids.find( pObject->clID() );
179  if ( i != s_classesClids.end() ) return i->second;
180  loadConverter( pObject );
181  i = s_classesClids.find( pObject->clID() );
182  if ( i != s_classesClids.end() ) return i->second;
183 
184  string cname = System::typeinfoName( typeid( *pObject ) );
185  throw runtime_error( "Unknown ROOT class for object:" + cname );
186  return nullptr;
187 }
188 
189 // Connect the output file to the service with open mode.
191  StatusCode sc = S_FAIL;
192  m_current = nullptr;
194  if ( ::strncasecmp( openMode.c_str(), "RECREATE", 3 ) == 0 )
196  else if ( ::strncasecmp( openMode.c_str(), "NEW", 1 ) == 0 )
198  else if ( ::strncasecmp( openMode.c_str(), "CREATE", 1 ) == 0 )
200  else if ( ::strncasecmp( openMode.c_str(), "UPDATE", 1 ) == 0 )
202  if ( sc.isSuccess() && m_current && m_current->isConnected() ) { return S_OK; }
203  m_incidentSvc->fireIncident( Incident( dsn, IncidentType::FailOutputFile ) );
204  log() << MSG::ERROR << "The dataset " << dsn << " cannot be opened in mode " << openMode << ". [Invalid mode]"
205  << endmsg;
206  return sc;
207 }
208 
209 // Connect the output file to the service with open mode.
211  try {
212  IDataConnection* c = m_ioMgr->connection( dataset );
213  bool fire_incident = false;
214  *con = nullptr;
215  if ( !c ) {
216  auto connection = std::make_unique<RootDataConnection>( this, dataset, m_setup );
217  StatusCode sc = ( mode != IDataConnection::READ )
218  ? m_ioMgr->connectWrite( connection.get(), IDataConnection::IoType( mode ), "ROOT" )
219  : m_ioMgr->connectRead( false, connection.get() );
220  c = sc.isSuccess() ? m_ioMgr->connection( dataset ) : nullptr;
221  if ( c ) {
222  bool writable = 0 != ( mode & ( IDataConnection::UPDATE | IDataConnection::RECREATE ) );
223  fire_incident = m_incidentEnabled && ( 0 != ( mode & ( IDataConnection::UPDATE | IDataConnection::READ ) ) );
224  if ( writable ) {
225  m_incidentSvc->fireIncident(
226  ContextIncident<TFile*>( connection->pfn(), "CONNECTED_OUTPUT", connection->file() ) );
227  }
228  if ( 0 != ( mode & IDataConnection::READ ) ) {
229  m_incidentSvc->fireIncident(
230  ContextIncident<TFile*>( connection->pfn(), "CONNECTED_INPUT", connection->file() ) );
231  if ( !m_ioPerfStats.empty() ) { connection->enableStatistics( m_setup->loadSection ); }
232  }
233  connection.release();
234  } else {
235  m_incidentSvc->fireIncident( Incident(
236  dataset, mode == IDataConnection::READ ? IncidentType::FailInputFile : IncidentType::FailOutputFile ) );
237  // An error message was already printed by the IODataManager. no need to do it here!
238  return StatusCode::FAILURE;
239  }
240  }
241  RootDataConnection* pc = dynamic_cast<RootDataConnection*>( c );
242  if ( pc ) {
243  if ( !pc->isConnected() )
244  if ( auto sc = pc->connectRead(); !sc ) return sc;
245  *con = pc;
246  pc->resetAge();
247  pc->addClient( this );
248  }
249  if ( *con ) {
250  if ( fire_incident ) {
251  IOpaqueAddress* pAddr = nullptr;
252  string fid = pc->fid();
253  string section = m_recordName[0] == '/' ? m_recordName.value().substr( 1 ) : m_recordName.value();
254  TBranch* b = pc->getBranch( section, m_recordName.value() );
255  if ( b ) {
256  const string par[2] = { fid, m_recordName };
257  unsigned long ipar[2] = { (unsigned long)( *con ), (unsigned long)b->GetEntries() - 1 };
258  for ( int i = 0; i < b->GetEntries(); ++i ) {
259  ipar[1] = i;
260  if ( !pc->mergeFIDs().empty() ) fid = pc->mergeFIDs()[i];
261  if ( !createAddress( repSvcType(), CLID_DataObject, par, ipar, pAddr ).isSuccess() ) {
262  if ( log().level() <= MSG::VERBOSE )
263  log() << MSG::VERBOSE << "Failed to create address for " << m_recordName << " in:" << fid << " ["
264  << pc->fid() << "][" << i << "]" << endmsg;
265  continue;
266  }
267  if ( log().level() <= MSG::VERBOSE )
268  log() << MSG::VERBOSE << "Prepare " << m_recordName << " " << fid << " [" << par[0] << "][" << i << "]"
269  << endmsg;
270  m_incidentSvc->fireIncident( ContextIncident<IOpaqueAddress*>( fid, "FILE_OPEN_READ", pAddr ) );
271  }
272  } else {
273  if ( log().level() <= MSG::VERBOSE )
274  log() << MSG::VERBOSE << "No valid Records " << m_recordName << " present in:" << pc->fid() << endmsg;
275  }
276  }
277 
278  // We can remove retired connections, which are no longer used....
279  for ( auto& i : m_ioMgr->connections( this ) ) {
280  if ( i != *con && !i->isConnected() ) {
281  RootDataConnection* pc = dynamic_cast<RootDataConnection*>( i );
282  if ( pc && pc->lookupClient( this ) ) {
283  size_t num_client = pc->removeClient( this );
284  if ( num_client == 0 ) {
285  if ( m_ioMgr->disconnect( pc ).isSuccess() ) {
286  log() << MSG::INFO << "Removed disconnected IO stream:" << pc->fid() << " [" << pc->pfn() << "]"
287  << endmsg;
288  delete pc;
289  }
290  }
291  }
292  }
293  }
294  return S_OK;
295  }
296  m_incidentSvc->fireIncident( Incident( dataset, IncidentType::FailOutputFile ) );
297  return S_FAIL;
298  } catch ( exception& e ) {
299  m_incidentSvc->fireIncident( Incident( dataset, IncidentType::FailOutputFile ) );
300  return error( string( "connectDatabase> Caught exception:" ) + e.what() );
301  } catch ( ... ) {
302  m_incidentSvc->fireIncident( Incident( dataset, IncidentType::FailOutputFile ) );
303  return error( "connectDatabase> Unknown Fatal Exception for " + dataset );
304  }
305 }
306 
307 // Conect output stream (valid until overwritten)
308 StatusCode RootCnvSvc::connectOutput( CSTR db_name ) { return connectOutput( db_name, "NEW" ); }
309 
310 // Commit pending output on open container
311 StatusCode RootCnvSvc::commitOutput( CSTR dsn, bool /* doCommit */ ) {
312  if ( m_current ) {
313  size_t len = m_currSection.find( '/', 1 );
314  string section = m_currSection.substr( 1, len == string::npos ? string::npos : len - 1 );
315  TBranch* b = m_current->getBranch( section, m_currSection );
316  if ( b ) {
317  Long64_t evt = b->GetEntries();
318  TTree* t = b->GetTree();
319  TObjArray* a = t->GetListOfBranches();
320  Int_t nb = a->GetEntriesFast();
322  for ( Int_t i = 0; i < nb; ++i ) {
323  TBranch* br_ptr = (TBranch*)a->UncheckedAt( i );
324  Long64_t br_evt = br_ptr->GetEntries();
325  if ( br_evt < evt ) {
326  Long64_t num = evt - br_evt;
327  br_ptr->SetAddress( nullptr );
328  while ( num > 0 ) {
329  br_ptr->Fill();
330  --num;
331  }
332  if ( log().level() <= MSG::DEBUG )
333  log() << MSG::DEBUG << "commit: Added " << long( evt - br_evt ) << " Section: " << evt
334  << " Branch: " << br_ptr->GetEntries() << " RefNo: " << br_ptr->GetEntries() - 1
335  << " NULL entries to:" << br_ptr->GetName() << endmsg;
336  }
337  }
338 
339  b->GetTree()->SetEntries( evt );
340  if ( log().level() <= MSG::DEBUG )
341  log() << MSG::DEBUG << "Set section entries of " << m_currSection << " to " << long( evt ) << " entries."
342  << endmsg;
343  } else {
344  return error( "commitOutput> Failed to update entry numbers on " + dsn );
345  }
346  }
347  return S_OK;
348 }
349 
350 // Disconnect from an existing data stream.
352  IDataConnection* c = m_ioMgr->connection( dataset );
353  return c ? m_ioMgr->disconnect( c ) : S_FAIL;
354 }
355 
356 // IAddressCreator implementation: Address creation
357 StatusCode RootCnvSvc::createAddress( long typ, const CLID& clid, const string* par, const unsigned long* ip,
358  IOpaqueAddress*& refpAddress ) {
359  refpAddress = new RootAddress( typ, clid, par[0], par[1], ip[0], ip[1] );
360  return S_OK;
361 }
362 
363 // Insert null marker for not existent transient object
365  size_t len = path.find( '/', 1 );
366  string section = path.substr( 1, len == string::npos ? string::npos : len - 1 );
368  m_splitLevel );
369  return S_OK;
370 }
371 
372 // Insert null marker for not existent transient object
374  RootObjectRefs* refs = nullptr;
375  size_t len = path.find( '/', 1 );
376  string section = path.substr( 1, len == string::npos ? string::npos : len - 1 );
377  pair<int, unsigned long> ret = m_current->save( section, path + "#R", nullptr, refs, m_minBufferSize, m_maxBufferSize,
379  if ( log().level() <= MSG::VERBOSE )
380  log() << MSG::VERBOSE << "Writing object:" << path << " " << ret.first << " " << hex << ret.second << dec
381  << " [NULL]" << endmsg;
382  return S_OK;
383 }
384 
385 // Mark an object for write given an object reference
387  refpAddr = nullptr;
388  if ( !pObj ) return error( "createRep> Current Database is invalid!" );
389  CLID clid = pObj->clID();
390  IRegistry* pR = pObj->registry();
391  string p[2] = { m_current->fid(), pR->identifier() };
392  TClass* cl = ( clid == CLID_DataObject ) ? m_classDO : getClass( pObj );
393  size_t len = p[1].find( '/', 1 );
394  string sect = p[1].substr( 1, len == string::npos ? string::npos : len - 1 );
397  if ( ret.first > 1 || ( clid == CLID_DataObject && ret.first == 1 ) ) {
398  unsigned long ip[2] = { 0, ret.second };
399  if ( m_currSection.empty() ) m_currSection = p[1];
400  return createAddress( repSvcType(), clid, p, ip, refpAddr );
401  }
402  return error( "Failed to write object data for:" + p[1] );
403 }
404 
405 // Save object references to data file
407  if ( pObj ) {
408  typedef vector<IRegistry*> Leaves;
409  Leaves leaves;
410  RootObjectRefs refs;
411  IRegistry* pR = pObj->registry();
412  auto dataMgr = SmartIF<IDataManagerSvc>{ pR->dataSvc() };
413  if ( dataMgr ) {
414  StatusCode status = dataMgr->objectLeaves( pObj, leaves );
415  if ( status.isSuccess() ) {
416  RootRef ref;
417  const string& id = pR->identifier();
418  size_t len = id.find( '/', 1 );
419  string sect = id.substr( 1, len == string::npos ? string::npos : len - 1 );
420  LinkManager* pLinks = pObj->linkMgr();
421  for ( auto& i : leaves ) {
422  if ( i->address() ) {
423  m_current->makeRef( *i, ref );
424  ref.entry = i->address()->ipar()[1];
425  refs.refs.push_back( ref );
426  }
427  }
428  for ( int i = 0, n = pLinks->size(); i < n; ++i ) {
429  const LinkManager::Link* lnk = pLinks->link( i );
430  int link_id = m_current->makeLink( lnk->path() );
431  refs.links.push_back( link_id );
432  }
433  pair<int, unsigned long> ret = m_current->save( sect, id + "#R", m_classRefs, &refs, m_minBufferSize,
435  if ( ret.first > 1 ) {
436  if ( log().level() <= MSG::DEBUG )
437  log() << MSG::DEBUG << "Writing object:" << id << " " << ret.first << " " << hex << ret.second << dec
438  << endmsg;
439  return S_OK;
440  }
441  }
442  }
443  }
444  return S_FAIL;
445 }
446 
447 // Read existing object. Open transaction in read mode if not active
449  refpObj = nullptr;
450  if ( !pA ) return S_FAIL;
451  RootDataConnection* con = nullptr;
452  const string* par = pA->par();
453  unsigned long* ipar = const_cast<unsigned long*>( pA->ipar() );
455  if ( sc.isSuccess() ) {
456  ipar[0] = (unsigned long)con;
457  DataObject* pObj = nullptr;
458  size_t len = par[1].find( '/', 1 );
459  string section = par[1].substr( 1, len == string::npos ? string::npos : len - 1 );
460 
461  int nb = con->loadObj( section, par[1], ipar[1], pObj );
462  if ( nb > 1 || ( nb == 1 && pObj->clID() == CLID_DataObject ) ) {
463  refpObj = pObj;
464  return S_OK;
465  }
466  delete pObj;
467  }
468  string tag = par[0] + ":" + par[1];
469 
470  const auto [itr, new_bad] = m_badFiles.insert( tag );
471  if ( new_bad ) { return error( "createObj> Cannot access the object:" + tag ); }
472  return S_FAIL;
473 }
474 
475 // Resolve the references of the created transient object.
477  if ( !pA || !pObj ) return error( "read> Cannot read object -- no valid object address present " );
478 
479  const unsigned long* ipar = pA->ipar();
480  RootDataConnection* con = (RootDataConnection*)ipar[0];
481  if ( con ) {
482  RootObjectRefs refs;
483  const string* par = pA->par();
484  size_t len = par[1].find( '/', 1 );
485  string section = par[1].substr( 1, len == string::npos ? string::npos : len - 1 );
486  int nb = con->loadRefs( section, par[1], ipar[1], refs );
487  if ( nb >= 1 ) {
488  string npar[3];
489  unsigned long nipar[2];
490  IRegistry* pR = pObj->registry();
491  auto dataMgr = SmartIF<IDataManagerSvc>{ pR->dataSvc() };
492  LinkManager* mgr = pObj->linkMgr();
493  for ( const auto& i : refs.links ) mgr->addLink( con->getLink( i ), nullptr );
494  for ( auto& r : refs.refs ) {
495  npar[0] = con->getDb( r.dbase );
496  npar[1] = con->getCont( r.container );
497  npar[2] = con->getLink( r.link );
498  nipar[0] = 0;
499  nipar[1] = r.entry;
500  IOpaqueAddress* nPA = nullptr;
501  StatusCode sc = addressCreator()->createAddress( r.svc, r.clid, npar, nipar, nPA );
502  if ( sc.isSuccess() ) {
503  if ( log().level() <= MSG::VERBOSE )
504  log() << MSG::VERBOSE << dataMgr.as<IService>()->name() << " -> Register:" << pA->registry()->identifier()
505  << "#" << npar[2] << "[" << r.entry << "]" << endmsg;
506  sc = dataMgr->registerAddress( pA->registry(), npar[2], nPA );
507  if ( sc.isSuccess() ) continue;
508  }
509  log() << MSG::ERROR << con->fid() << ": Failed to create address!!!!" << endmsg;
510  return S_FAIL;
511  }
512  return pObj->update();
513  } else if ( nb < 0 ) {
514  string tag = par[0] + ":" + par[1];
515 
516  const auto [itr, new_bad] = m_badFiles.insert( tag );
517  if ( new_bad ) { return error( "createObj> Cannot access the object:" + tag + " [Corrupted file]" ); }
518  }
519  }
520  return S_FAIL;
521 }
IOTest.evt
evt
Definition: IOTest.py:107
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
IService
Definition: IService.h:28
ConversionSvc
Definition: ConversionSvc.h:55
Gaudi::RootCnvSvc::finalize
StatusCode finalize() override
ConversionSvc overload: Finalize Db service.
Definition: RootCnvSvc.cpp:118
Gaudi::RootCnvSvc::m_maxBufferSize
Gaudi::Property< int > m_maxBufferSize
Definition: RootCnvSvc.h:75
MSG::hex
MsgStream & hex(MsgStream &log)
Definition: MsgStream.h:281
GaudiRoot
Definition: RootCnvSvc.cpp:49
Gaudi::RootDataConnection::isConnected
bool isConnected() const override
Check if connected to data source.
Definition: RootDataConnection.h:266
Gaudi::Units::pc
constexpr double pc
Definition: SystemOfUnits.h:116
Gaudi::RootCnvSvc::loadConverter
void loadConverter(DataObject *pObj) override
ConversionSvc overload: Load the class (dictionary) for the converter.
Definition: RootCnvSvc.cpp:160
std::string
STL class.
IOpaqueAddress::par
virtual const std::string * par() const =0
Retrieve String parameters.
std::exception
STL class.
Gaudi::RootConnectionSetup::cacheBranches
StringVec cacheBranches
Vector of strings with branches to be cached for input files.
Definition: RootDataConnection.h:66
Gaudi::RootCnvSvc::initialize
StatusCode initialize() override
ConversionSvc overload: initialize Db service.
Definition: RootCnvSvc.cpp:90
AtlasMCRecoFullPrecedenceDump.path
path
Definition: AtlasMCRecoFullPrecedenceDump.py:49
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
MSG::INFO
@ INFO
Definition: IMessageSvc.h:25
Gaudi::RootCnvSvc::connectDatabase
StatusCode connectDatabase(const std::string &dataset, int mode, RootDataConnection **con)
Connect the output file to the service with open mode.
Definition: RootCnvSvc.cpp:210
Gaudi::IDataConnection
Definition: IIODataManager.h:34
System.h
Gaudi::RootCnvSvc::error
StatusCode error(const std::string &msg)
Standard way to print errors.
Definition: RootCnvSvc.cpp:79
std::pair
Gaudi::RootCnvSvc
Definition: RootCnvSvc.h:62
IOpaqueAddress
Definition: IOpaqueAddress.h:33
Gaudi::RootCnvSvc::m_minBufferSize
Gaudi::Property< int > m_minBufferSize
Definition: RootCnvSvc.h:73
MBYTE
#define MBYTE
Definition: RootCnvSvc.cpp:57
std::vector
STL class.
SmartIF::reset
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:96
std::string::find
T find(T... args)
Gaudi::RootDatabaseCnv
Definition: RootDatabaseCnv.h:38
Gaudi::RootDataConnection::getLink
const std::string & getLink(int which) const
Access link name from saved index.
Definition: RootDataConnection.h:351
ISvcLocator
Definition: ISvcLocator.h:46
GaudiPartProp.decorators.get
get
decorate the vector of properties
Definition: decorators.py:283
IConverter
Definition: IConverter.h:68
Gaudi::IDataConnection::RECREATE
@ RECREATE
Definition: IIODataManager.h:49
Gaudi::RootCnvSvc::m_incidentEnabled
Gaudi::Property< bool > m_incidentEnabled
Definition: RootCnvSvc.h:68
GaudiMP.FdsRegistry.msg
msg
Definition: FdsRegistry.py:19
ContextIncident
Definition: DataIncident.h:26
RootDirectoryCnv.h
Gaudi::RootDataConnection::saveObj
std::pair< int, unsigned long > saveObj(std::string_view section, std::string_view cnt, TClass *cl, DataObject *pObj, int minBufferSize, int maxBufferSize, int approxEventsPerBasket, int split_lvl, bool fill_missing=false)
Save object of a given class to section and container.
Definition: RootDataConnection.cpp:498
DataIncident.h
Gaudi::RootCnvSvc::m_log
std::unique_ptr< MsgStream > m_log
Message streamer.
Definition: RootCnvSvc.h:102
gaudirun.c
c
Definition: gaudirun.py:525
IRegistry
Definition: IRegistry.h:32
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:315
KeyedContainer.h
RootDataConnection.h
RootDatabaseCnv.h
std::unique_ptr::reset
T reset(T... args)
IDataProviderSvc.h
Gaudi::RootConverter
Definition: RootConverter.h:42
std::string::clear
T clear(T... args)
AvalancheSchedulerErrorTest.msgSvc
msgSvc
Definition: AvalancheSchedulerErrorTest.py:80
Gaudi::RootObjectRefs
Definition: RootRefs.h:68
Gaudi::RootDataConnection
Definition: RootDataConnection.h:112
Gaudi::RootCnvSvc::createNullRef
virtual StatusCode createNullRef(const std::string &path)
Insert null marker for not existent transient object.
Definition: RootCnvSvc.cpp:373
IIncidentSvc.h
std::vector::push_back
T push_back(T... args)
compareOutputFiles.par
par
Definition: compareOutputFiles.py:477
Gaudi::RootCnvSvc::m_incidentSvc
SmartIF< IIncidentSvc > m_incidentSvc
Reference to incident service.
Definition: RootCnvSvc.h:86
bug_34121.t
t
Definition: bug_34121.py:31
Gaudi::IDataConnection::CREATE
@ CREATE
Definition: IIODataManager.h:49
Gaudi::RootCnvSvc::m_badFiles
std::set< std::string > m_badFiles
Set with bad files/tables.
Definition: RootCnvSvc.h:99
Gaudi::RootCnvSvc::createAddress
StatusCode createAddress(long svc_type, const CLID &clid, const std::string *par, const unsigned long *ip, IOpaqueAddress *&refpAddress) override
IAddressCreator implementation: Address creation.
Definition: RootCnvSvc.cpp:357
Gaudi::RootDataConnection::getDb
const std::string & getDb(int which) const
Access database/file name from saved index.
Definition: RootDataConnection.cpp:486
S_OK
#define S_OK
Definition: RootCnvSvc.cpp:47
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:332
StatusCode
Definition: StatusCode.h:65
Gaudi::RootNTupleCnv
Definition: RootNTupleCnv.h:45
std::log
T log(T... args)
Gaudi::Units::m
constexpr double m
Definition: SystemOfUnits.h:108
MSG::dec
MsgStream & dec(MsgStream &log)
Definition: MsgStream.h:277
Gaudi::RootCnvSvc::commitOutput
StatusCode commitOutput(const std::string &outputFile, bool do_commit) override
Commit pending output.
Definition: RootCnvSvc.cpp:311
std::string::c_str
T c_str(T... args)
Gaudi::RootCnvSvc::createConverter
IConverter * createConverter(long typ, const CLID &wanted, const ICnvFactory *fac) override
ConversionSvc overload: Create new Converter using factory.
Definition: RootCnvSvc.cpp:146
Gaudi::RootDataConnection::getCont
const std::string & getCont(int which) const
Access container name from saved index.
Definition: RootDataConnection.h:346
Gaudi::RootCnvSvc::log
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:107
Gaudi::RootObjectRefs::links
std::vector< int > links
The links of the link manager.
Definition: RootRefs.h:70
Gaudi::IDataConnection::UPDATE
@ UPDATE
Definition: IIODataManager.h:49
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:237
Gaudi::IDataConnection::READ
@ READ
Definition: IIODataManager.h:49
GaudiRoot::patchStreamers
bool patchStreamers(MsgStream &log)
Definition: RootIOHandler.cpp:211
RootNTupleCnv.h
Gaudi::RootRef
Definition: RootRefs.h:40
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:87
Gaudi::RootConnectionSetup::setCompression
static StatusCode setCompression(std::string_view compression)
Set the global compression level.
Definition: RootDataConnection.cpp:126
Gaudi::IDataConnection::IoType
IoType
I/O Connection types.
Definition: IIODataManager.h:49
RootCnvSvc.h
DataObject::update
virtual StatusCode update()
Provide empty placeholder for internal object reconfiguration callback.
Definition: DataObject.cpp:75
std::runtime_error
STL class.
Gaudi::RootCnvSvc::m_ioMgr
SmartIF< Gaudi::IIODataManager > m_ioMgr
Reference to the I/O data manager.
Definition: RootCnvSvc.h:84
Gaudi::RootCnvSvc::m_splitLevel
Gaudi::Property< int > m_splitLevel
Definition: RootCnvSvc.h:79
SmartIF< IDataManagerSvc >
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
Gaudi::RootDataConnection::makeRef
void makeRef(const IRegistry &pA, RootRef &ref)
Create reference object from registry entry.
Definition: RootDataConnection.cpp:646
ROOT_StorageType
const long ROOT_StorageType
Definition: ClassID.h:62
std::map
STL class.
Gaudi::RootDirectoryCnv
Definition: RootDirectoryCnv.h:40
gaudirun.level
level
Definition: gaudirun.py:364
IRegistry.h
MsgStream
Definition: MsgStream.h:33
IOpaqueAddress::registry
virtual IRegistry * registry() const =0
Update branch name.
Gaudi
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition: __init__.py:1
cpluginsvc.n
n
Definition: cpluginsvc.py:234
Gaudi::RootCnvSvc::m_ioPerfStats
Gaudi::Property< std::string > m_ioPerfStats
Definition: RootCnvSvc.h:64
Gaudi::RootCnvSvc::i__fillObjRefs
virtual StatusCode i__fillObjRefs(IOpaqueAddress *pAddr, DataObject *pObj)
Resolve the references of the created transient object.
Definition: RootCnvSvc.cpp:476
Gaudi::RootDataConnection::makeLink
int makeLink(std::string_view p)
Convert path string to path index.
Definition: RootDataConnection.cpp:478
std::string::substr
T substr(T... args)
Gaudi::RootCnvSvc::i__createRep
virtual StatusCode i__createRep(DataObject *pObj, IOpaqueAddress *&refpAddr)
Convert the transient object to the requested persistent representation.
Definition: RootCnvSvc.cpp:386
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:25
ConversionSvc::initialize
StatusCode initialize() override
Initialize the service.
Definition: ConversionSvc.cpp:237
Gaudi::RootConnectionSetup
Definition: RootDataConnection.h:54
Gaudi::RootCnvSvc::connectOutput
StatusCode connectOutput(const std::string &outputFile, const std::string &openMode) override
Connect the output file to the service with open mode.
RootRefs.h
Gaudi::RootCnvSvc::m_classDO
TClass * m_classDO
TClass pointer to DataObject class.
Definition: RootCnvSvc.h:92
SmartIF::get
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:86
Gaudi::RootCnvSvc::i__createObj
virtual StatusCode i__createObj(IOpaqueAddress *pAddr, DataObject *&refpObj)
Create transient object from persistent data.
Definition: RootCnvSvc.cpp:448
Gaudi::RootDataConnection::loadRefs
int loadRefs(std::string_view section, std::string_view cnt, unsigned long entry, RootObjectRefs &refs)
Load references object.
Definition: RootDataConnection.cpp:603
Gaudi::RootCnvSvc::m_current
Gaudi::RootDataConnection * m_current
On writing: reference to active output stream.
Definition: RootCnvSvc.h:88
Gaudi::RootDataConnection::save
std::pair< int, unsigned long > save(std::string_view section, std::string_view cnt, TClass *cl, void *pObj, int minBufferSize, int maxBufferSize, int approxEventsPerBasket, int split_lvl, bool fill_missing=false)
Save object of a given class to section and container.
Definition: RootDataConnection.cpp:506
Gaudi::RootCnvSvc::getClass
TClass * getClass(DataObject *pObject)
Helper: Get TClass for a given DataObject pointer.
Definition: RootCnvSvc.cpp:177
CSTR
const string & CSTR
Definition: RootCnvSvc.cpp:45
Gaudi::RootCnvSvc::m_classRefs
TClass * m_classRefs
TClass pointer to reference class.
Definition: RootCnvSvc.h:90
ConversionSvc::finalize
StatusCode finalize() override
stop the service.
Definition: ConversionSvc.cpp:240
std
STL namespace.
std::set::insert
T insert(T... args)
RootConverter.h
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:25
IRegistry::identifier
virtual const id_type & identifier() const =0
Full identifier (or key)
DataObject
Definition: DataObject.h:36
Gaudi::RootCnvSvc::disconnect
virtual StatusCode disconnect(const std::string &dbName)
Disconnect from an existing data stream.
Definition: RootCnvSvc.cpp:351
Gaudi::IDataConnection::fid
const std::string & fid() const
Access file id.
Definition: IIODataManager.h:63
RootUtils.h
std::string::empty
T empty(T... args)
IUpdateable.h
RootAddress.h
Gaudi::RootCnvSvc::m_currSection
std::string m_currSection
Property: ROOT section name.
Definition: RootCnvSvc.h:96
Gaudi::RootCnvSvc::m_approxEventsPerBasket
Gaudi::Property< int > m_approxEventsPerBasket
Definition: RootCnvSvc.h:77
Gaudi::RootDataConnection::loadObj
int loadObj(std::string_view section, std::string_view cnt, unsigned long entry, DataObject *&pObj)
Load object.
Definition: RootDataConnection.cpp:553
Gaudi::RootObjectRefs::refs
std::vector< RootRef > refs
The references corresponding to the next layer of items in the data store.
Definition: RootRefs.h:72
Gaudi::RootCnvSvc::m_recordName
Gaudi::Property< std::string > m_recordName
Definition: RootCnvSvc.h:69
compareRootHistos.ref
ref
Definition: compareRootHistos.py:27
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
ConversionSvc::addressCreator
SmartIF< IAddressCreator > & addressCreator() const override
Retrieve address creator facility.
Definition: ConversionSvc.cpp:181
DataObject::linkMgr
LinkManager * linkMgr()
Retrieve Link manager.
Definition: DataObject.h:80
Incident.h
Gaudi::RootDataConnection::getBranch
TBranch * getBranch(std::string_view section, std::string_view branch_name)
Access data branch by name: Get existing branch in read only mode.
Definition: RootDataConnection.h:326
Incident
Definition: Incident.h:27
DataObject::clID
virtual const CLID & clID() const
Retrieve reference to class definition structure.
Definition: DataObject.cpp:66
ConversionSvc::repSvcType
long repSvcType() const override
Retrieve the class type of the data store the converter uses.
Definition: ConversionSvc.cpp:286
Gaudi::RootCnvSvc::i__fillRepRefs
virtual StatusCode i__fillRepRefs(IOpaqueAddress *pAddr, DataObject *pObj)
Resolve the references of the converted object.
Definition: RootCnvSvc.cpp:406
Gaudi::RootCnvSvc::createNullRep
virtual StatusCode createNullRep(const std::string &path)
Insert null marker for not existent transient object.
Definition: RootCnvSvc.cpp:364
Service::service
StatusCode service(const std::string &name, const T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
Definition: Service.h:89
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:78
Gaudi::RootCnvSvc::m_setup
std::shared_ptr< RootConnectionSetup > m_setup
Setup structure (ref-counted) and passed to data connections.
Definition: RootCnvSvc.h:94
MsgStream::level
MSG::Level level() const
Retrieve output level.
Definition: MsgStream.h:112
IRegistry::dataSvc
virtual IDataProviderSvc * dataSvc() const =0
Retrieve pointer to Transient Store.
IDataManagerSvc.h
std::exception::what
T what(T... args)
S_FAIL
#define S_FAIL
Definition: RootCnvSvc.cpp:48
MsgStream.h
IOpaqueAddress::ipar
virtual const unsigned long * ipar() const =0
Access to generic link parameters.
Service::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator
Definition: Service.cpp:335
Gaudi::RootCnvSvc::m_compression
Gaudi::Property< std::string > m_compression
Definition: RootCnvSvc.h:80
Gaudi::RootAddress
Definition: RootAddress.h:46