| The Gaudi Framework v30r0 (c919700c)

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

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