22 #define GAUDISVC_NTUPLESVC_CPP 52 m_rootName =
"/NTUPLES";
53 m_rootCLID = CLID_DataObject;
89 if ( !pRegistry )
return nullptr;
92 auto idx = full.find(
SEPARATOR, len + 1 );
93 std::string path = ( idx == std::string::npos ) ? full : full.substr( 0, idx );
95 return ( i !=
m_connections.end() ) ? i->second.service :
nullptr;
108 for (
auto d = leaves.
begin(); d != leaves.
end(); d++ ) {
109 if ( !( *d )->object() )
continue;
112 unsigned long typ = pA->
ipar()[1];
113 if ( typ !=
'R' && typ !=
'N' && typ !=
'U' )
continue;
116 if ( !svc )
continue;
121 if ( obj )
sel.push_back( obj );
127 if ( !status.isSuccess() ) iret = status;
132 if ( !status.isSuccess() ) iret = status;
143 if ( need_update > 0 ) {
info() <<
"NTuples saved successfully" <<
endmsg; }
150 if ( isvc ) isvc->finalize().ignore();
151 c.service->release();
182 return connect( ident, logName );
191 long loc = ident.
find(
" " );
193 logname = ident.
substr( 0, loc );
197 for (
auto attrib : Parser( ident.
substr( loc + 1 ) ) ) {
198 switch ( ::
toupper( attrib.tag[0] ) ) {
206 switch ( ::
toupper( attrib.value[0] ) ) {
244 error() <<
"Cannot add " << ident <<
" invalid filename!" <<
endmsg;
262 error() <<
"Could not get NTuple Persistency format" 263 <<
" from ApplicationMgr properties" <<
endmsg;
268 if (
sp.value() ==
"HBOOK" ) {
270 }
else if (
sp.value() ==
"ROOT" ) {
273 error() <<
"Unknown NTuple Persistency format: " <<
sp.value() <<
endmsg;
277 if ( !typ.
empty() && typ !=
sp.value() ) {
278 warning() <<
"NTuple persistency type is " <<
sp.value() <<
"." <<
endmsg <<
"Type given by job option " 279 <<
"NTupleSvc.Input/Output ignored!" <<
endmsg;
295 auto status = pService->sysInitialize();
296 if ( !status.isSuccess() )
return status;
304 if ( typ == CLID_ColumnWiseTuple ) {
306 }
else if ( typ == CLID_RowWiseTuple ) {
323 assert( !
path.empty() );
331 error() <<
"Cannot book N-tuple " <<
path <<
" (Exists already)" <<
endmsg;
335 if ( sep == std::string::npos ) {
336 error() <<
"Cannot book N-tuple " <<
path <<
" (Invalid path)" <<
endmsg;
344 error() <<
"Cannot book N-tuple " <<
path <<
" (Invalid parent directory)" <<
endmsg;
349 if ( !tup ) {
error() <<
"Cannot book N-tuple " <<
path <<
" (Unknown reason)" <<
endmsg; }
357 assert( !relPath.
empty() );
394 assert( !relPath.
empty() );
399 if ( relPath[0] !=
'/' ) full +=
"/";
419 assert( !relPath.
empty() );
421 if ( relPath[0] !=
'/' ) full +=
"/";
435 entryname += logname;
454 if ( sep2 != std::string::npos ) {
490 return status.
isSuccess() ?
save( pObj ) : Status::INVALID_OBJ_PATH;
500 if ( pSvc && pReg ) {
506 return Status::NO_DATA_LOADER;
509 return Status::INVALID_OBJECT;
516 return status.
isSuccess() ?
save( pObj ) : Status::INVALID_OBJ_PATH;
539 return Status::NO_DATA_LOADER;
542 return Status::INVALID_OBJECT;
573 status = pSvc->
updateObj( pAddr, n_tuple );
577 status = Status::NO_DATA_LOADER;
578 }
catch ( ... ) { status = Status::INVALID_OBJECT; }
Parse attribute strings allowing iteration over the various attributes.
void releaseConnection(Connection &c)
Finalize single service.
const long TEST_StorageType
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
StatusCode writeRecord(NTuple::Tuple *tuple) override
Write single record to N tuple.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
const long HBOOK_StorageType
IRegistry * registry() const
Get pointer to Registry.
Implementation of property with value of concrete type.
virtual StatusCode traverseSubTree(std::string_view sub_tree_path, IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects below the sub tree identified by its full path name.
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
StatusCode initialize() override
DataSvc overrides: Initialize the service.
bool isConnected(const std::string &identifier) const override
Check if a datasource is connected.
StatusCode reinitialize() override
DataSvc overrides: reinitialize service.
unsigned long release() override
release reference to object
StatusCode setRoot(std::string root_name, DataObject *pRootObj) override
Initialize data store for new event by giving new event path and root object.
::details::reverse_wrapper< T > reverse(T &&iterable)
Gaudi::Property< std::string > m_rootName
virtual StatusCode setDataProvider(IDataProviderSvc *pService)=0
Set Data provider service.
constexpr static const auto SUCCESS
std::map< std::string, Connection > m_connections
Container of connection points.
NTuple::Tuple * book(const std::string &fullPath, const CLID &type, const std::string &title) override
Book Ntuple and register it with the data store.
NTuple::Tuple * access(const std::string &fullPath, const std::string &filename) override
Access N tuple on disk.
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
StatusCode disconnect(const std::string &nam) override
Close open connection.
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
Generic Transient Address.
virtual StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an already converted object.
IConversionSvc * conversionService() const
Access conversion service.
StatusCode updateDirectories()
Update directory data.
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
StatusCode createService(const std::string &nam, const std::string &typ, const std::vector< Prop > &props, IConversionSvc *&pSvc)
Create conversion service.
#define DECLARE_COMPONENT(type)
const std::string & name() const override
Retrieve name of the service.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
StatusCode unregisterObject(std::string_view fullPath) override
Unregister object from the data store.
virtual long repSvcType() const =0
Retrieve the class type of the data store the converter uses.
This class is used for returning status codes from appropriate routines.
Definition of the basic interface.
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
StatusCode readRecord(NTuple::Tuple *tuple) override
Read single record from N tuple.
Gaudi::Property< DBaseEntries > m_output
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves) override
IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
NTuple::Directory * createDirectory(DataObject *pParent, const std::string &title) override
Create Ntuple directory and register it with the data store.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
const long ROOT_StorageType
StatusCode finalize() override
Service initialization.
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the converted representation of a transient object.
unsigned int CLID
Class ID definition.
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
StatusCode setProperties()
Method for setting declared properties to the values specified for the job.
virtual DataObject * object() const =0
Retrieve object behind the link.
Abstract base class which allows the user to interact with the actual N tuple implementation.
StatusCode registerAddress(std::string_view fullPath, IOpaqueAddress *pAddress) override
IDataManagerSvc: Register object address with the data store.
virtual unsigned long release()
release reference to object
StatusCode finalize() override
DataSvc overrides: stop the service.
#define DECLARE_NAMESPACE_OBJECT_FACTORY(n, x)
IConversionSvc * getDataLoader(IRegistry *pReg) override
DataSvc overrides: Retrieve data loader.
StatusCode initialize() override
Service initialization.
virtual void setAddress(IOpaqueAddress *pAddress)=0
Set/Update Opaque storage address.
void setTupleService(INTupleSvc *svc)
Access conversion service.
StatusCode save(const std::string &fullPath) override
Save N tuple to disk. Must be called in order to close the ntuple file properly.
constexpr static const auto FAILURE
StatusCode registerObject(std::string_view parentPath, std::string_view objPath, DataObject *pObject) override
Register object with the data store.
Gaudi::Property< DBaseEntries > m_input
virtual unsigned long addRef()=0
Increment the reference count of Interface instance.
StatusCode connect(const std::string &ident) override
Add file to list I/O list.
StatusCode create(const CLID &typ, const std::string &title, NTuple::Tuple *&refpTuple) override
Create requested N tuple (Hide constructor)
Small class representing an N tuple directory in the transient store.
virtual const id_type & identifier() const =0
Full identifier (or key)
void setConversionService(IConversionSvc *svc)
Access conversion service.
StatusCode disconnectAll() override
Close all open connections.
StatusCode findObject(std::string_view fullPath, DataObject *&pObject) override
Find object identified by its full path in the data store.
Opaque address interface definition.
Base class for all conversion services.
The IProperty is the basic interface for all components which have properties that can be set or get.
StatusCode attachTuple(const std::string &filename, const std::string &logname, const char typ, const long t)
Attach output/input file.
A DataObject is the base class of any identifiable object on any data store.
StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject) override
Retrieve object from data store.
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the converted object.
virtual const unsigned long * ipar() const =0
Access to generic link parameters.
void toupper(std::string &s)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
T emplace_back(T... args)