32 #define GAUDISVC_NTUPLESVC_CPP 62 m_rootName =
"/NTUPLES";
63 m_rootCLID = CLID_DataObject;
99 if ( !pRegistry )
return nullptr;
102 auto idx = full.find(
SEPARATOR, len + 1 );
103 std::string path = ( idx == std::string::npos ) ? full : full.substr( 0, idx );
105 return ( i !=
m_connections.end() ) ? i->second.service :
nullptr;
109 long need_update = 0;
118 for (
auto d = leaves.
begin(); d != leaves.
end(); d++ ) {
119 if ( !( *d )->object() )
continue;
122 unsigned long typ = pA->
ipar()[1];
123 if ( typ !=
'R' && typ !=
'N' && typ !=
'U' )
continue;
126 if ( !svc )
continue;
131 if ( obj )
sel.push_back( obj );
137 if ( !status.isSuccess() ) iret = status;
142 if ( !status.isSuccess() ) iret = status;
153 if ( need_update > 0 ) {
info() <<
"NTuples saved successfully" <<
endmsg; }
160 if ( isvc ) isvc->finalize().ignore();
161 c.service->release();
192 return connect( ident, logName );
201 long loc = ident.
find(
" " );
203 logname = ident.
substr( 0, loc );
207 for (
auto attrib : Parser( ident.
substr( loc + 1 ) ) ) {
208 switch ( ::
toupper( attrib.tag[0] ) ) {
216 switch ( ::
toupper( attrib.value[0] ) ) {
254 error() <<
"Cannot add " << ident <<
" invalid filename!" <<
endmsg;
272 error() <<
"Could not get NTuple Persistency format" 273 <<
" from ApplicationMgr properties" <<
endmsg;
278 if (
sp.value() ==
"HBOOK" ) {
280 }
else if (
sp.value() ==
"ROOT" ) {
283 error() <<
"Unknown NTuple Persistency format: " <<
sp.value() <<
endmsg;
287 if ( !typ.
empty() && typ !=
sp.value() ) {
288 warning() <<
"NTuple persistency type is " <<
sp.value() <<
"." <<
endmsg <<
"Type given by job option " 289 <<
"NTupleSvc.Input/Output ignored!" <<
endmsg;
305 auto status = pService->sysInitialize();
306 if ( !status.isSuccess() )
return status;
314 if ( typ == CLID_ColumnWiseTuple ) {
316 }
else if ( typ == CLID_RowWiseTuple ) {
333 assert( !
path.empty() );
341 error() <<
"Cannot book N-tuple " <<
path <<
" (Exists already)" <<
endmsg;
345 if ( sep == std::string::npos ) {
346 error() <<
"Cannot book N-tuple " <<
path <<
" (Invalid path)" <<
endmsg;
354 error() <<
"Cannot book N-tuple " <<
path <<
" (Invalid parent directory)" <<
endmsg;
359 if ( !tup ) {
error() <<
"Cannot book N-tuple " <<
path <<
" (Unknown reason)" <<
endmsg; }
367 assert( !relPath.
empty() );
404 assert( !relPath.
empty() );
409 if ( relPath[0] !=
'/' ) full +=
"/";
429 assert( !relPath.
empty() );
431 if ( relPath[0] !=
'/' ) full +=
"/";
445 entryname += logname;
464 if ( sep2 != std::string::npos ) {
500 return status.
isSuccess() ?
save( pObj ) : Status::INVALID_OBJ_PATH;
510 if ( pSvc && pReg ) {
516 return Status::NO_DATA_LOADER;
519 return Status::INVALID_OBJECT;
526 return status.
isSuccess() ?
save( pObj ) : Status::INVALID_OBJ_PATH;
549 return Status::NO_DATA_LOADER;
552 return Status::INVALID_OBJECT;
583 status = pSvc->
updateObj( pAddr, n_tuple );
587 status = Status::NO_DATA_LOADER;
588 }
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)