The Gaudi Framework  v29r0 (ff2e7097)
Gaudi::RootCnvSvc Class Reference

Description: More...

#include <src/RootCnvSvc.h>

Inheritance diagram for Gaudi::RootCnvSvc:
Collaboration diagram for Gaudi::RootCnvSvc:

Public Member Functions

 RootCnvSvc (const std::string &name, ISvcLocator *svc)
 Standard constructor. More...
 
 ~RootCnvSvc () override=default
 Standard destructor. More...
 
virtual StatusCode updateServiceState (IOpaqueAddress *) override
 Update state of the service. More...
 
StatusCode error (const std::string &msg)
 Standard way to print errors. More...
 
StatusCode connectDatabase (const std::string &dataset, int mode, RootDataConnection **con)
 Connect the output file to the service with open mode. More...
 
StatusCode initialize () override
 ConversionSvc overload: initialize Db service. More...
 
StatusCode finalize () override
 ConversionSvc overload: Finalize Db service. More...
 
IConvertercreateConverter (long typ, const CLID &wanted, const ICnvFactory *fac) override
 ConversionSvc overload: Create new Converter using factory. More...
 
void loadConverter (DataObject *pObj) override
 ConversionSvc overload: Load the class (dictionary) for the converter. More...
 
StatusCode connectOutput (const std::string &outputFile, const std::string &openMode) override
 Connect the output file to the service with open mode. More...
 
StatusCode connectOutput (const std::string &outputFile) override
 Connect the output file to the service. More...
 
StatusCode commitOutput (const std::string &outputFile, bool do_commit) override
 Commit pending output. More...
 
virtual StatusCode disconnect (const std::string &dbName)
 Disconnect from an existing data stream. More...
 
StatusCode createAddress (long svc_type, const CLID &clid, const std::string *par, const unsigned long *ip, IOpaqueAddress *&refpAddress) override
 IAddressCreator implementation: Address creation. More...
 
StatusCode createAddress (long svc_type, const CLID &clid, const std::string &refAddress, IOpaqueAddress *&refpAddress) override
 IAddressCreator implementation: Creates an address in string form to object form. More...
 
virtual StatusCode createNullRep (const std::string &path)
 Insert null marker for not existent transient object. More...
 
virtual StatusCode createNullRef (const std::string &path)
 Insert null marker for not existent transient object. More...
 
virtual StatusCode i__createRep (DataObject *pObj, IOpaqueAddress *&refpAddr)
 Convert the transient object to the requested persistent representation. More...
 
virtual StatusCode i__fillRepRefs (IOpaqueAddress *pAddr, DataObject *pObj)
 Resolve the references of the converted object. More...
 
virtual StatusCode i__createObj (IOpaqueAddress *pAddr, DataObject *&refpObj)
 Create transient object from persistent data. More...
 
virtual StatusCode i__fillObjRefs (IOpaqueAddress *pAddr, DataObject *pObj)
 Resolve the references of the created transient object. More...
 
- Public Member Functions inherited from ConversionSvc
 ConversionSvc (const std::string &name, ISvcLocator *svc, long type)
 Standard Constructor. More...
 
 ConversionSvc (const ConversionSvc &)=delete
 disable copy and assignment More...
 
ConversionSvcoperator= (const ConversionSvc &)=delete
 
StatusCode initialize () override
 Initialize the service. More...
 
StatusCode finalize () override
 stop the service. More...
 
long repSvcType () const override
 Retrieve the class type of the data store the converter uses. More...
 
const CLIDobjType () const override
 Implementation of IConverter: dummy call. More...
 
StatusCode setDataProvider (IDataProviderSvc *pService) override
 Implementation of IConverter: Set Data provider service. More...
 
SmartIF< IDataProviderSvc > & dataProvider () const override
 Implementation of IConverter: Get Data provider service. More...
 
StatusCode setConversionSvc (IConversionSvc *svc) override
 Implementation of IConverter: Set conversion service the converter is connected to. More...
 
SmartIF< IConversionSvc > & conversionSvc () const override
 Implementation of IConverter: Get conversion service the converter is connected to. More...
 
StatusCode setAddressCreator (IAddressCreator *creator) override
 Set address creator facility. More...
 
SmartIF< IAddressCreator > & addressCreator () const override
 Retrieve address creator facility. More...
 
StatusCode createObj (IOpaqueAddress *pAddress, DataObject *&refpObject) override
 Implementation of IConverter: Create the transient representation of an object. More...
 
StatusCode fillObjRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Implementation of IConverter: Resolve the references of the created transient object. More...
 
StatusCode updateObj (IOpaqueAddress *pAddress, DataObject *refpObject) override
 Implementation of IConverter: Update the transient object from the other representation. More...
 
StatusCode updateObjRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Implementation of IConverter: Update the references of an updated transient object. More...
 
StatusCode createRep (DataObject *pObject, IOpaqueAddress *&refpAddress) override
 Implementation of IConverter: Convert the transient object to the requested representation. More...
 
StatusCode fillRepRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Implementation of IConverter: Resolve the references of the converted object. More...
 
StatusCode updateRep (IOpaqueAddress *pAddress, DataObject *pObject) override
 Implementation of IConverter: Update the converted representation of a transient object. More...
 
StatusCode updateRepRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Implementation of IConverter: Update the references of an already converted object. More...
 
StatusCode addConverter (const CLID &clid) override
 Add converter object to conversion service. More...
 
StatusCode addConverter (IConverter *pConverter) override
 Add converter object to conversion service. More...
 
StatusCode removeConverter (const CLID &clid) override
 Remove converter object from conversion service (if present). More...
 
IConverterconverter (const CLID &wanted) override
 Retrieve converter from list. More...
 
StatusCode connectOutput (const std::string &outputFile, const std::string &openMode) override
 Connect the output file to the service with open mode. More...
 
StatusCode connectOutput (const std::string &output) override
 Connect the output file to the service. More...
 
StatusCode commitOutput (const std::string &output, bool do_commit) override
 Commit pending output. More...
 
StatusCode createAddress (long svc_type, const CLID &clid, const std::string *par, const unsigned long *ip, IOpaqueAddress *&refpAddress) override
 Create a Generic address using explicit arguments to identify a single object. More...
 
StatusCode convertAddress (const IOpaqueAddress *pAddress, std::string &refAddress) override
 Convert an address to string form. More...
 
StatusCode createAddress (long svc_type, const CLID &clid, const std::string &refAddress, IOpaqueAddress *&refpAddress) override
 Convert an address in string form to object form. More...
 
- Public Member Functions inherited from extends< Service, IConversionSvc, IAddressCreator >
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::stringgetInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
 ~extends () override=default
 Virtual destructor. More...
 
- Public Member Functions inherited from Service
const std::stringname () const override
 Retrieve name of the service. More...
 
StatusCode configure () override
 
StatusCode initialize () override
 
StatusCode start () override
 
StatusCode stop () override
 
StatusCode finalize () override
 
StatusCode terminate () override
 
Gaudi::StateMachine::State FSMState () const override
 
Gaudi::StateMachine::State targetFSMState () const override
 
StatusCode reinitialize () override
 
StatusCode restart () override
 
StatusCode sysInitialize () override
 Initialize Service. More...
 
StatusCode sysStart () override
 Initialize Service. More...
 
StatusCode sysStop () override
 Initialize Service. More...
 
StatusCode sysFinalize () override
 Finalize Service. More...
 
StatusCode sysReinitialize () override
 Re-initialize the Service. More...
 
StatusCode sysRestart () override
 Re-initialize the Service. More...
 
 Service (std::string name, ISvcLocator *svcloc)
 Standard Constructor. More...
 
SmartIF< ISvcLocator > & serviceLocator () const override
 Retrieve pointer to service locator. More...
 
StatusCode setProperties ()
 Method for setting declared properties to the values specified for the job. More...
 
template<class T >
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. More...
 
template<class T >
StatusCode service (const std::string &name, T *&psvc, bool createIf=true) const
 
template<typename IFace = IService>
SmartIF< IFace > service (const std::string &name, bool createIf=true) const
 
template<class T >
StatusCode service (const std::string &svcType, const std::string &svcName, T *&psvc) const
 Access a service by name and type, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode declareTool (ToolHandle< T > &handle, std::string toolTypeAndName, bool createIf=true)
 Declare used tool. More...
 
SmartIF< IAuditorSvc > & auditorSvc () const
 The standard auditor service.May not be invoked before sysInitialize() has been invoked. More...
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 PropertyHolder ()=default
 
 ~PropertyHolder () override=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none")
 Helper to wrap a regular data member and use it as a regular property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none") const
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, Gaudi::Property< TYPE, VERIFIER, HANDLERS > &prop, const std::string &doc="none")
 Declare a PropertyBase instance setting name and documentation. More...
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property. More...
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p) override
 set the property form another property More...
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string More...
 
StatusCode setProperty (const std::string &n, const std::string &v) override
 set the property from name and the value More...
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value More...
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property More...
 
const Gaudi::Details::PropertyBasegetProperty (const std::string &name) const override
 get the property by name More...
 
StatusCode getProperty (const std::string &n, std::string &v) const override
 convert the property to the string More...
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties More...
 
bool hasProperty (const std::string &name) const override
 Return true if we have a property with the given name. More...
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, GaudiHandleBase &ref, const std::string &doc="none")
 Specializations for various GaudiHandles. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, GaudiHandleArrayBase &ref, const std::string &doc="none")
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, DataObjectHandleBase &ref, const std::string &doc="none")
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
SmartIF< IMessageSvc > & msgSvc () const
 The standard message service. More...
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream. More...
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts. More...
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS) More...
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL) More...
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING) More...
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG) More...
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE) More...
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MSG::Level msgLevel () const
 get the output level from the embedded MsgStream More...
 
MSG::Level outputLevel () const __attribute__((deprecated))
 Backward compatibility function for getting the output level. More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
- Public Member Functions inherited from extend_interfaces< Interfaces... >
 ~extend_interfaces () override=default
 Virtual destructor. More...
 

Protected Member Functions

TClass * getClass (DataObject *pObject)
 Helper: Get TClass for a given DataObject pointer. More...
 
MsgStreamlog () const
 Helper: Use message streamer. More...
 
- Protected Member Functions inherited from ConversionSvc
virtual StatusCode configureConverter (long typ, const CLID &clid, IConverter *cnv)
 Configure the new converter before initialize is called. More...
 
virtual StatusCode initializeConverter (long typ, const CLID &clid, IConverter *cnv)
 Initialize the new converter. More...
 
virtual StatusCode activateConverter (long typ, const CLID &clid, IConverter *cnv)
 Activate the new converter after initialization. More...
 
virtual SmartIF< IAddressCreator > & addressCreator ()
 Retrieve address creation interface. More...
 
StatusCode makeCall (int typ, bool ignore_add, bool ignore_obj, bool update, IOpaqueAddress *&pAddress, DataObject *&pObject)
 
- Protected Member Functions inherited from Service
 ~Service () override
 Standard Destructor. More...
 
int outputLevel () const
 get the Service's output level More...
 
- Protected Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
Gaudi::Details::PropertyBaseproperty (const std::string &name) const
 
- Protected Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 

Protected Attributes

Gaudi::Property< std::stringm_ioPerfStats
 
Gaudi::Property< std::stringm_shareFiles
 
Gaudi::Property< bool > m_incidentEnabled {this, "EnableIncident", true, "Flag to enable incidents on FILE_OPEN"}
 
Gaudi::Property< std::stringm_recordName
 
Gaudi::Property< int > m_autoFlush
 
Gaudi::Property< int > m_basketSize
 
Gaudi::Property< int > m_bufferSize
 
Gaudi::Property< int > m_splitLevel {this, "SplitLevel", 0, "Split level optimization parameter for ROOT TTree"}
 
Gaudi::Property< std::stringm_compression
 
SmartIF< Gaudi::IIODataManagerm_ioMgr
 Reference to the I/O data manager. More...
 
SmartIF< IIncidentSvcm_incidentSvc
 Reference to incident service. More...
 
Gaudi::RootDataConnectionm_current = nullptr
 On writing: reference to active output stream. More...
 
TClass * m_classRefs = nullptr
 TClass pointer to reference class. More...
 
TClass * m_classDO = nullptr
 TClass pointer to DataObject class. More...
 
std::shared_ptr< RootConnectionSetupm_setup
 Setup structure (ref-counted) and passed to data connections. More...
 
std::string m_currSection
 Property: ROOT section name. More...
 
std::set< std::stringm_badFiles
 Set with bad files/tables. More...
 
std::unique_ptr< MsgStreamm_log
 Message streamer. More...
 
- Protected Attributes inherited from ConversionSvc
SmartIF< IDataProviderSvcm_dataSvc
 Pointer to data provider service. More...
 
SmartIF< IAddressCreatorm_addressCreator
 Pointer to the address creation service interface. More...
 
SmartIF< IConversionSvcm_cnvSvc
 Pointer to the IConversionSvc interface of this. More...
 
long m_type
 Conversion service type. More...
 
std::vector< WorkerEntrym_workers
 List of conversion workers. More...
 
- Protected Attributes inherited from Service
Gaudi::StateMachine::State m_state = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::StateMachine::State m_targetState = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::Property< int > m_outputLevel {this, "OutputLevel", MSG::NIL, "output level"}
 
Gaudi::Property< bool > m_auditInit {this, "AuditServices", false, "[[deprecated]] unused"}
 
Gaudi::Property< bool > m_auditorInitialize {this, "AuditInitialize", false, "trigger auditor on initialize()"}
 
Gaudi::Property< bool > m_auditorStart {this, "AuditStart", false, "trigger auditor on start()"}
 
Gaudi::Property< bool > m_auditorStop {this, "AuditStop", false, "trigger auditor on stop()"}
 
Gaudi::Property< bool > m_auditorFinalize {this, "AuditFinalize", false, "trigger auditor on finalize()"}
 
Gaudi::Property< bool > m_auditorReinitialize {this, "AuditReinitialize", false, "trigger auditor on reinitialize()"}
 
Gaudi::Property< bool > m_auditorRestart {this, "AuditRestart", false, "trigger auditor on restart()"}
 
SmartIF< IAuditorSvcm_pAuditorSvc
 Auditor Service. More...
 

Additional Inherited Members

- Public Types inherited from extends< Service, IConversionSvc, IAddressCreator >
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces... >
 Typedef to the base of this class. More...
 
- Public Types inherited from Service
typedef Gaudi::PluginService::Factory< IService *, const std::string &, ISvcLocator * > Factory
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
using PropertyHolderImpl = PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 Typedef used to refer to this class from derived classes, as in. More...
 
- Public Types inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
using base_class = CommonMessaging
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids... >::type
 take union of the ext_iids of all Interfaces... More...
 

Detailed Description

Description:

RootCnvSvc class implementation definition.

Author
Markus Frank
Version
1.0
Date
20/12/2009

Definition at line 53 of file RootCnvSvc.h.

Constructor & Destructor Documentation

RootCnvSvc::RootCnvSvc ( const std::string name,
ISvcLocator svc 
)

Standard constructor.

Definition at line 53 of file RootCnvSvc.cpp.

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 }
ConversionSvc(const std::string &name, ISvcLocator *svc, long type)
Standard Constructor.
std::shared_ptr< RootConnectionSetup > m_setup
Setup structure (ref-counted) and passed to data connections.
Definition: RootCnvSvc.h:86
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Details::PropertyBase &prop)
Declare a property.
const long ROOT_StorageType
Definition: ClassID.h:52
#define MBYTE
Definition: RootCnvSvc.cpp:50
Gaudi::RootCnvSvc::~RootCnvSvc ( )
overridedefault

Standard destructor.

Member Function Documentation

StatusCode RootCnvSvc::commitOutput ( const std::string outputFile,
bool  do_commit 
)
override

Commit pending output.

Parameters
outputFileString containig output file
do_commitif true commit the output and flush eventually pending items to the database if false, discard pending buffers. Note: The possibility to commit or rollback depends on the database technology used!
Returns
Status code indicating success or failure.

fill NULL pointers to all branches, which have less entries than the section branch

Definition at line 312 of file RootCnvSvc.cpp.

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 }
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
Gaudi::Property< int > m_autoFlush
Definition: RootCnvSvc.h:65
std::string m_currSection
Property: ROOT section name.
Definition: RootCnvSvc.h:88
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
#define S_OK
Definition: RootCnvSvc.cpp:38
TBranch * getBranch(const std::string &section, const std::string &branch_name)
Access data branch by name: Get existing branch in read only mode.
T find(T...args)
T substr(T...args)
Gaudi::Property< int > m_basketSize
Definition: RootCnvSvc.h:67
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
evt
Definition: IOTest.py:96
Gaudi::RootDataConnection * m_current
On writing: reference to active output stream.
Definition: RootCnvSvc.h:80
StatusCode RootCnvSvc::connectDatabase ( const std::string dataset,
int  mode,
RootDataConnection **  con 
)

Connect the output file to the service with open mode.

Parameters
datasetString containig file name
modeString containig opening mode
Returns
Status code indicating success or failure.

Definition at line 211 of file RootCnvSvc.cpp.

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 ) {
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 {
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 }
void addClient(const IInterface *client)
Add new client to this data source.
bool lookupClient(const IInterface *client) const
Lookup client for this data source.
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
T empty(T...args)
const std::string & fid() const
Access file id.
Gaudi::Property< std::string > m_recordName
Definition: RootCnvSvc.h:61
IoType
I/O Connection types.
SmartIF< IIncidentSvc > m_incidentSvc
Reference to incident service.
Definition: RootCnvSvc.h:78
bool isConnected() const override
Check if connected to data source.
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
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
std::shared_ptr< RootConnectionSetup > m_setup
Setup structure (ref-counted) and passed to data connections.
Definition: RootCnvSvc.h:86
size_t removeClient(const IInterface *client)
Remove client from this data source.
constexpr double pc
const std::string & pfn() const
Access physical file name.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
T what(T...args)
Gaudi::Property< std::string > m_ioPerfStats
Definition: RootCnvSvc.h:56
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
#define S_OK
Definition: RootCnvSvc.cpp:38
TBranch * getBranch(const std::string &section, const std::string &branch_name)
Access data branch by name: Get existing branch in read only mode.
STL class.
const StringVec & mergeFIDs() const
Access merged FIDs.
StatusCode connectRead() override
Open data stream in read mode.
STL class.
ABC describing basic data connection.
SmartIF< Gaudi::IIODataManager > m_ioMgr
Reference to the I/O data manager.
Definition: RootCnvSvc.h:76
void resetAge()
Reset age.
Base class for all Incidents (computing events).
Definition: Incident.h:17
long repSvcType() const override
Retrieve the class type of the data store the converter uses.
Opaque address interface definition.
#define S_FAIL
Definition: RootCnvSvc.cpp:39
Concrete implementation of the IDataConnection interface to access ROOT files.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
Gaudi::Property< bool > m_incidentEnabled
Definition: RootCnvSvc.h:60
StatusCode Gaudi::RootCnvSvc::connectOutput ( const std::string outputFile,
const std::string openMode 
)
override

Connect the output file to the service with open mode.

Parameters
outputFileString containig output file
openModeString containig opening mode of the output file
Returns
Status code indicating success or failure.
StatusCode Gaudi::RootCnvSvc::connectOutput ( const std::string outputFile)
override

Connect the output file to the service.

Parameters
outputFileString containig output file
Returns
Status code indicating success or failure.
StatusCode RootCnvSvc::createAddress ( long  svc_type,
const CLID clid,
const std::string par,
const unsigned long *  ip,
IOpaqueAddress *&  refpAddress 
)
override

IAddressCreator implementation: Address creation.

Create an address using the link infotmation together with the triple (database name/container name/object name).

Parameters
refLinkReference to abstract link information
dbNameDatabase name
containerNameObject container name
refpAddressOpaque address information to retrieve object
Returns
StatusCode indicating SUCCESS or failure

Definition at line 371 of file RootCnvSvc.cpp.

373 {
374  refpAddress = new RootAddress( typ, clid, par[0], par[1], ip[0], ip[1] );
375  return S_OK;
376 }
Description:
Definition: RootAddress.h:37
#define S_OK
Definition: RootCnvSvc.cpp:38
StatusCode Gaudi::RootCnvSvc::createAddress ( long  svc_type,
const CLID clid,
const std::string refAddress,
IOpaqueAddress *&  refpAddress 
)
inlineoverride

IAddressCreator implementation: Creates an address in string form to object form.

Parameters
svc_typeTechnology identifier encapsulated in this address.
clidClass identifier of the DataObject represented by the opaque address
addressInput address.
refpAddressOutput address in string form.
Returns
Status code indicating success or failure.

Definition at line 195 of file RootCnvSvc.h.

197  {
198  return this->ConversionSvc::createAddress( svc_type, clid, refAddress, refpAddress );
199  }
StatusCode createAddress(long svc_type, const CLID &clid, const std::string *par, const unsigned long *ip, IOpaqueAddress *&refpAddress) override
Create a Generic address using explicit arguments to identify a single object.
IConverter * RootCnvSvc::createConverter ( long  typ,
const CLID wanted,
const ICnvFactory *  fac 
)
overridevirtual

ConversionSvc overload: Create new Converter using factory.

Reimplemented from ConversionSvc.

Definition at line 141 of file RootCnvSvc.cpp.

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 }
Statistics file converter class definition.
NTuple converter class definition for NTuples writted/read using ROOT.
Definition: RootNTupleCnv.h:36
Description: NTuple directory converter class definition Definition of the converter to manage the di...
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:292
Description: Definition of the ROOT data converter.
Definition: RootConverter.h:33
StatusCode RootCnvSvc::createNullRef ( const std::string path)
virtual

Insert null marker for not existent transient object.

Parameters
path[IN] Path to the (null-)object
Returns
Status code indicating success or failure.

Definition at line 388 of file RootCnvSvc.cpp.

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 }
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
MsgStream & dec(MsgStream &log)
Definition: MsgStream.h:299
MsgStream & hex(MsgStream &log)
Definition: MsgStream.h:304
Gaudi::Property< int > m_splitLevel
Definition: RootCnvSvc.h:71
Gaudi::Property< int > m_bufferSize
Definition: RootCnvSvc.h:69
Persistent reference object containing all leafs and links corresponding to a Gaudi DataObject...
Definition: RootRefs.h:60
#define S_OK
Definition: RootCnvSvc.cpp:38
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.
T find(T...args)
T substr(T...args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
Gaudi::RootDataConnection * m_current
On writing: reference to active output stream.
Definition: RootCnvSvc.h:80
StatusCode RootCnvSvc::createNullRep ( const std::string path)
virtual

Insert null marker for not existent transient object.

Parameters
path[IN] Path to the (null-)object
Returns
Status code indicating success or failure.

Definition at line 379 of file RootCnvSvc.cpp.

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 }
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.
Gaudi::Property< int > m_splitLevel
Definition: RootCnvSvc.h:71
Gaudi::Property< int > m_bufferSize
Definition: RootCnvSvc.h:69
#define S_OK
Definition: RootCnvSvc.cpp:38
T find(T...args)
T substr(T...args)
Gaudi::RootDataConnection * m_current
On writing: reference to active output stream.
Definition: RootCnvSvc.h:80
StatusCode RootCnvSvc::disconnect ( const std::string dbName)
virtual

Disconnect from an existing data stream.

Parameters
dbNameString containing name of the database
Returns
Status code indicating success or failure.

Definition at line 364 of file RootCnvSvc.cpp.

365 {
366  IDataConnection* c = m_ioMgr->connection( dataset );
367  return c ? m_ioMgr->disconnect( c ) : S_FAIL;
368 }
ABC describing basic data connection.
SmartIF< Gaudi::IIODataManager > m_ioMgr
Reference to the I/O data manager.
Definition: RootCnvSvc.h:76
#define S_FAIL
Definition: RootCnvSvc.cpp:39
StatusCode RootCnvSvc::error ( const std::string msg)

Standard way to print errors.

after the printout an exception is thrown.

Parameters
msg[IN] Message string to be printed.
Returns
Status code returning failure.

Definition at line 67 of file RootCnvSvc.cpp.

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 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
std::unique_ptr< MsgStream > m_log
Message streamer.
Definition: RootCnvSvc.h:94
constexpr double m
Definition: SystemOfUnits.h:94
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
#define S_FAIL
Definition: RootCnvSvc.cpp:39
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
StatusCode RootCnvSvc::finalize ( )
override

ConversionSvc overload: Finalize Db service.

Definition at line 110 of file RootCnvSvc.cpp.

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();
136  m_setup->setIncidentSvc( nullptr );
137  return ConversionSvc::finalize();
138 }
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
SmartIF< IIncidentSvc > m_incidentSvc
Reference to incident service.
Definition: RootCnvSvc.h:78
std::shared_ptr< RootConnectionSetup > m_setup
Setup structure (ref-counted) and passed to data connections.
Definition: RootCnvSvc.h:86
constexpr double pc
Gaudi::Property< std::string > m_ioPerfStats
Definition: RootCnvSvc.h:56
std::unique_ptr< MsgStream > m_log
Message streamer.
Definition: RootCnvSvc.h:94
T reset(T...args)
STL class.
SmartIF< Gaudi::IIODataManager > m_ioMgr
Reference to the I/O data manager.
Definition: RootCnvSvc.h:76
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:92
Concrete implementation of the IDataConnection interface to access ROOT files.
StatusCode finalize() override
stop the service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
TClass * RootCnvSvc::getClass ( DataObject pObject)
protected

Helper: Get TClass for a given DataObject pointer.

Definition at line 174 of file RootCnvSvc.cpp.

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 }
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:329
void loadConverter(DataObject *pObj) override
ConversionSvc overload: Load the class (dictionary) for the converter.
Definition: RootCnvSvc.cpp:156
virtual const CLID & clID() const
Retrieve reference to class definition structure.
Definition: DataObject.cpp:62
StatusCode RootCnvSvc::i__createObj ( IOpaqueAddress pAddr,
DataObject *&  refpObj 
)
virtual

Create transient object from persistent data.

Parameters
pAddr[IN] Pointer to object address.
refpObj[OUT] Location to pointer to store data object
Returns
Status code indicating success or failure.

Definition at line 464 of file RootCnvSvc.cpp.

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 }
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
int loadObj(const std::string &section, const std::string &cnt, unsigned long entry, DataObject *&pObj)
Load object.
T end(T...args)
StatusCode connectDatabase(const std::string &dataset, int mode, RootDataConnection **con)
Connect the output file to the service with open mode.
Definition: RootCnvSvc.cpp:211
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
virtual const CLID & clID() const
Retrieve reference to class definition structure.
Definition: DataObject.cpp:62
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
#define S_OK
Definition: RootCnvSvc.cpp:38
T insert(T...args)
std::set< std::string > m_badFiles
Set with bad files/tables.
Definition: RootCnvSvc.h:91
T find(T...args)
T substr(T...args)
#define S_FAIL
Definition: RootCnvSvc.cpp:39
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:29
Concrete implementation of the IDataConnection interface to access ROOT files.
StatusCode RootCnvSvc::i__createRep ( DataObject pObj,
IOpaqueAddress *&  refpAddr 
)
virtual

Convert the transient object to the requested persistent representation.

Parameters
pObj[IN] Pointer to data object
refpAddr[OUT] Location to store pointer to object address.
Returns
Status code indicating success or failure.

Definition at line 401 of file RootCnvSvc.cpp.

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 }
T empty(T...args)
const std::string & fid() const
Access file id.
std::string m_currSection
Property: ROOT section name.
Definition: RootCnvSvc.h:88
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.
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
Gaudi::Property< int > m_splitLevel
Definition: RootCnvSvc.h:71
Gaudi::Property< int > m_bufferSize
Definition: RootCnvSvc.h:69
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:72
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
virtual const CLID & clID() const
Retrieve reference to class definition structure.
Definition: DataObject.cpp:62
virtual const id_type & identifier() const =0
Full identifier (or key)
TClass * m_classDO
TClass pointer to DataObject class.
Definition: RootCnvSvc.h:84
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
T find(T...args)
long repSvcType() const override
Retrieve the class type of the data store the converter uses.
T substr(T...args)
Gaudi::RootDataConnection * m_current
On writing: reference to active output stream.
Definition: RootCnvSvc.h:80
TClass * getClass(DataObject *pObject)
Helper: Get TClass for a given DataObject pointer.
Definition: RootCnvSvc.cpp:174
StatusCode RootCnvSvc::i__fillObjRefs ( IOpaqueAddress pAddr,
DataObject pObj 
)
virtual

Resolve the references of the created transient object.

Parameters
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns
Status code indicating success or failure.

Definition at line 494 of file RootCnvSvc.cpp.

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 }
SmartIF< IAddressCreator > & addressCreator() const override
Retrieve address creator facility.
virtual StatusCode update()
Provide empty placeholder for internal object reconfiguration callback.
Definition: DataObject.cpp:71
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
const std::string & fid() const
Access file id.
const std::string & getDb(int which) const
Access database/file name from saved index.
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.
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
const std::string & getLink(int which) const
Access link name from saved index.
T end(T...args)
std::vector< RootRef > refs
The references corresponding to the next layer of items in the data store.
Definition: RootRefs.h:64
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:72
int loadRefs(const std::string &section, const std::string &cnt, unsigned long entry, RootObjectRefs &refs)
Load references object.
Persistent reference object containing all leafs and links corresponding to a Gaudi DataObject...
Definition: RootRefs.h:60
LinkManager * linkMgr() const
Retrieve Link manager.
Definition: DataObject.h:74
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
General service interface definition.
Definition: IService.h:18
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
virtual IDataProviderSvc * dataSvc() const =0
Retrieve pointer to Transient Store.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
const std::string & getCont(int which) const
Access container name from saved index.
std::vector< int > links
The links of the link manager.
Definition: RootRefs.h:62
T insert(T...args)
std::set< std::string > m_badFiles
Set with bad files/tables.
Definition: RootCnvSvc.h:91
T find(T...args)
T substr(T...args)
MSG::Level level() const
Retrieve output level.
Definition: MsgStream.h:108
Opaque address interface definition.
#define S_FAIL
Definition: RootCnvSvc.cpp:39
Concrete implementation of the IDataConnection interface to access ROOT files.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
StatusCode RootCnvSvc::i__fillRepRefs ( IOpaqueAddress pAddr,
DataObject pObj 
)
virtual

Resolve the references of the converted object.

Parameters
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns
Status code indicating success or failure.

Definition at line 421 of file RootCnvSvc.cpp.

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  }
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 }
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
MsgStream & dec(MsgStream &log)
Definition: MsgStream.h:299
std::vector< RootRef > refs
The references corresponding to the next layer of items in the data store.
Definition: RootRefs.h:64
MsgStream & hex(MsgStream &log)
Definition: MsgStream.h:304
Gaudi::Property< int > m_splitLevel
Definition: RootCnvSvc.h:71
Gaudi::Property< int > m_bufferSize
Definition: RootCnvSvc.h:69
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:72
Persistent reference object containing all leafs and links corresponding to a Gaudi DataObject...
Definition: RootRefs.h:60
LinkManager * linkMgr() const
Retrieve Link manager.
Definition: DataObject.h:74
Persistent reference object.
Definition: RootRefs.h:31
T push_back(T...args)
virtual const id_type & identifier() const =0
Full identifier (or key)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
#define S_OK
Definition: RootCnvSvc.cpp:38
void makeRef(IRegistry *pA, RootRef &ref)
Create reference object from registry entry.
virtual IDataProviderSvc * dataSvc() const =0
Retrieve pointer to Transient Store.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
std::vector< int > links
The links of the link manager.
Definition: RootRefs.h:62
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.
T find(T...args)
int makeLink(const std::string &p)
Convert path string to path index.
#define S_FAIL
Definition: RootCnvSvc.cpp:39
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
Gaudi::RootDataConnection * m_current
On writing: reference to active output stream.
Definition: RootCnvSvc.h:80
TClass * m_classRefs
TClass pointer to reference class.
Definition: RootCnvSvc.h:82
StatusCode RootCnvSvc::initialize ( )
override

ConversionSvc overload: initialize Db service.

Definition at line 79 of file RootCnvSvc.cpp.

80 {
81  string cname;
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() );
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 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
SmartIF< IIncidentSvc > m_incidentSvc
Reference to incident service.
Definition: RootCnvSvc.h:78
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:329
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
std::shared_ptr< RootConnectionSetup > m_setup
Setup structure (ref-counted) and passed to data connections.
Definition: RootCnvSvc.h:86
Gaudi::Property< std::string > m_compression
Definition: RootCnvSvc.h:72
bool patchStreamers(MsgStream &log)
Persistent reference object containing all leafs and links corresponding to a Gaudi DataObject...
Definition: RootRefs.h:60
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:82
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
std::unique_ptr< MsgStream > m_log
Message streamer.
Definition: RootCnvSvc.h:94
#define S_OK
Definition: RootCnvSvc.cpp:38
TClass * m_classDO
TClass pointer to DataObject class.
Definition: RootCnvSvc.h:84
T reset(T...args)
SmartIF< Gaudi::IIODataManager > m_ioMgr
Reference to the I/O data manager.
Definition: RootCnvSvc.h:76
T c_str(T...args)
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
static long setCompression(const std::string &compression)
Set the global compression level.
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
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:29
StatusCode initialize() override
Initialize the service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
TClass * m_classRefs
TClass pointer to reference class.
Definition: RootCnvSvc.h:82
void RootCnvSvc::loadConverter ( DataObject pObj)
overridevirtual

ConversionSvc overload: Load the class (dictionary) for the converter.

Reimplemented from ConversionSvc.

Definition at line 156 of file RootCnvSvc.cpp.

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 }
MsgStream & log() const
Helper: Use message streamer.
Definition: RootCnvSvc.h:99
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:329
T c_str(T...args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
MsgStream& Gaudi::RootCnvSvc::log ( ) const
inlineprotected

Helper: Use message streamer.

Definition at line 99 of file RootCnvSvc.h.

99 { return *m_log; }
std::unique_ptr< MsgStream > m_log
Message streamer.
Definition: RootCnvSvc.h:94
virtual StatusCode Gaudi::RootCnvSvc::updateServiceState ( IOpaqueAddress )
inlineoverridevirtual

Update state of the service.

Reimplemented from ConversionSvc.

Definition at line 109 of file RootCnvSvc.h.

Member Data Documentation

Gaudi::Property<int> Gaudi::RootCnvSvc::m_autoFlush
protected
Initial value:
{this, "AutoFlush", 100,
"AutoFlush parameter for ROOT TTree (Number of events between auto flushes)"}

Definition at line 65 of file RootCnvSvc.h.

std::set<std::string> Gaudi::RootCnvSvc::m_badFiles
protected

Set with bad files/tables.

Definition at line 91 of file RootCnvSvc.h.

Gaudi::Property<int> Gaudi::RootCnvSvc::m_basketSize
protected
Initial value:
{this, "BasketSize", 2 * 1024 * 1024 ,
"Basket optimization parameter for ROOT TTree (total basket size)"}

Definition at line 67 of file RootCnvSvc.h.

Gaudi::Property<int> Gaudi::RootCnvSvc::m_bufferSize
protected
Initial value:
{this, "BufferSize", 2 * 1024 ,
"Buffer size optimization parameter for ROOT TTree"}

Definition at line 69 of file RootCnvSvc.h.

TClass* Gaudi::RootCnvSvc::m_classDO = nullptr
protected

TClass pointer to DataObject class.

Definition at line 84 of file RootCnvSvc.h.

TClass* Gaudi::RootCnvSvc::m_classRefs = nullptr
protected

TClass pointer to reference class.

Definition at line 82 of file RootCnvSvc.h.

Gaudi::Property<std::string> Gaudi::RootCnvSvc::m_compression
protected
Initial value:
{this, "GlobalCompression", "",
"Compression-algorithm:compression-level, empty: do nothing"}

Definition at line 72 of file RootCnvSvc.h.

Gaudi::RootDataConnection* Gaudi::RootCnvSvc::m_current = nullptr
protected

On writing: reference to active output stream.

Definition at line 80 of file RootCnvSvc.h.

std::string Gaudi::RootCnvSvc::m_currSection
protected

Property: ROOT section name.

Definition at line 88 of file RootCnvSvc.h.

Gaudi::Property<bool> Gaudi::RootCnvSvc::m_incidentEnabled {this, "EnableIncident", true, "Flag to enable incidents on FILE_OPEN"}
protected

Definition at line 60 of file RootCnvSvc.h.

SmartIF<IIncidentSvc> Gaudi::RootCnvSvc::m_incidentSvc
protected

Reference to incident service.

Definition at line 78 of file RootCnvSvc.h.

SmartIF<Gaudi::IIODataManager> Gaudi::RootCnvSvc::m_ioMgr
protected

Reference to the I/O data manager.

Definition at line 76 of file RootCnvSvc.h.

Gaudi::Property<std::string> Gaudi::RootCnvSvc::m_ioPerfStats
protected
Initial value:
{this, "IOPerfStats", "",
"Enable TTree IOperfStats if not empty; otherwise perf stat file name"}

Definition at line 56 of file RootCnvSvc.h.

std::unique_ptr<MsgStream> Gaudi::RootCnvSvc::m_log
protected

Message streamer.

Definition at line 94 of file RootCnvSvc.h.

Gaudi::Property<std::string> Gaudi::RootCnvSvc::m_recordName
protected
Initial value:
{this, "RecordsName", "/FileRecords",
"Records name to fire incident for file records"}

Definition at line 61 of file RootCnvSvc.h.

std::shared_ptr<RootConnectionSetup> Gaudi::RootCnvSvc::m_setup
protected

Setup structure (ref-counted) and passed to data connections.

Definition at line 86 of file RootCnvSvc.h.

Gaudi::Property<std::string> Gaudi::RootCnvSvc::m_shareFiles
protected
Initial value:
{this, "ShareFiles", "NO",
"Share files? If set to YES, files will not be closed on finalize"}

Definition at line 58 of file RootCnvSvc.h.

Gaudi::Property<int> Gaudi::RootCnvSvc::m_splitLevel {this, "SplitLevel", 0, "Split level optimization parameter for ROOT TTree"}
protected

Definition at line 71 of file RootCnvSvc.h.


The documentation for this class was generated from the following files: