Go to the documentation of this file.
32 #define GAUDISVC_NTUPLESVC_CPP
62 m_rootName =
"/NTUPLES";
63 m_rootCLID = CLID_DataObject;
96 if ( !pRegistry )
return nullptr;
99 auto idx = full.find(
SEPARATOR, len + 1 );
100 std::string path = ( idx == std::string::npos ) ? full : full.substr( 0, idx );
102 return ( i !=
m_connections.end() ) ? i->second.service :
nullptr;
106 long need_update = 0;
115 for (
auto d = leaves.
begin(); d != leaves.
end(); d++ ) {
116 if ( !( *d )->object() )
continue;
119 unsigned long typ = pA->
ipar()[1];
120 if ( typ !=
'R' && typ !=
'N' && typ !=
'U' )
continue;
123 if ( !svc )
continue;
127 DataObject* obj = r->object();
128 if ( obj ) sel.push_back( obj );
134 if ( !status.isSuccess() ) iret = status;
139 if ( !status.isSuccess() ) iret = status;
147 error() <<
"ERROR while saving NTuples" <<
endmsg;
150 if ( need_update > 0 ) { info() <<
"NTuples saved successfully" <<
endmsg; }
157 if ( isvc ) isvc->finalize().ignore();
158 c.service->release();
198 long loc =
ident.find(
" " );
200 logname =
ident.substr( 0, loc );
204 for (
auto attrib : Parser(
ident.substr( loc + 1 ) ) ) {
205 switch ( ::
toupper( attrib.tag[0] ) ) {
213 switch ( ::
toupper( attrib.value[0] ) ) {
235 props.emplace_back( attrib.tag, attrib.value );
251 error() <<
"Cannot add " <<
ident <<
" invalid filename!" <<
endmsg;
262 error() <<
"Could not get PropMgr" <<
endmsg;
269 error() <<
"Could not get NTuple Persistency format"
270 <<
" from ApplicationMgr properties" <<
endmsg;
275 if (
sp.value() ==
"HBOOK" ) {
277 }
else if (
sp.value() ==
"ROOT" ) {
280 error() <<
"Unknown NTuple Persistency format: " <<
sp.value() <<
endmsg;
284 if ( !typ.
empty() && typ !=
sp.value() ) {
285 warning() <<
"NTuple persistency type is " <<
sp.value() <<
"." <<
endmsg <<
"Type given by job option "
286 <<
"NTupleSvc.Input/Output ignored!" <<
endmsg;
302 auto status = pService->sysInitialize();
303 if ( !status.isSuccess() )
return status;
311 if ( typ == CLID_ColumnWiseTuple ) {
313 }
else if ( typ == CLID_RowWiseTuple ) {
330 assert( !
path.empty() );
338 error() <<
"Cannot book N-tuple " <<
path <<
" (Exists already)" <<
endmsg;
342 if ( sep == std::string::npos ) {
343 error() <<
"Cannot book N-tuple " <<
path <<
" (Invalid path)" <<
endmsg;
351 error() <<
"Cannot book N-tuple " <<
path <<
" (Invalid parent directory)" <<
endmsg;
356 if ( !tup ) { error() <<
"Cannot book N-tuple " <<
path <<
" (Unknown reason)" <<
endmsg; }
364 assert( !relPath.
empty() );
401 assert( !relPath.
empty() );
406 if ( relPath[0] !=
'/' ) full +=
"/";
426 assert( !relPath.
empty() );
428 if ( relPath[0] !=
'/' ) full +=
"/";
442 entryname += logname;
446 info() <<
"Added stream file:" <<
filename <<
" as " << logname <<
endmsg;
451 error() <<
"Cannot add file:" <<
filename <<
" as " << logname <<
endmsg;
461 if ( sep2 != std::string::npos ) {
497 return status.
isSuccess() ?
save( pObj ) : Status::INVALID_OBJ_PATH;
507 if ( pSvc && pReg ) {
513 return Status::NO_DATA_LOADER;
516 return Status::INVALID_OBJECT;
523 return status.
isSuccess() ?
save( pObj ) : Status::INVALID_OBJ_PATH;
546 return Status::NO_DATA_LOADER;
549 return Status::INVALID_OBJECT;
580 status = pSvc->
updateObj( pAddr, n_tuple );
584 status = Status::NO_DATA_LOADER;
585 }
catch ( ... ) { status = Status::INVALID_OBJECT; }
std::map< std::string, Connection > m_connections
Container of connection points.
NTuple::Directory * createDirectory(DataObject *pParent, const std::string &title) override
Create Ntuple directory and register it with the data store.
void toupper(std::string &s)
StatusCode attachTuple(const std::string &filename, const std::string &logname, const char typ, const long t)
Attach output/input file.
StatusCode writeRecord(NTuple::Tuple *tuple) override
Write single record to N tuple.
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the converted object.
virtual StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an already converted object.
Small class representing an N tuple directory in the transient store.
StatusCode updateDirectories()
Update directory data.
IConversionSvc * conversionService() const
Access conversion service.
::details::reverse_wrapper< T > reverse(T &&iterable)
virtual unsigned long release()
release reference to object
const long HBOOK_StorageType
StatusCode reinitialize() override
DataSvc overrides: reinitialize service.
NTuple::Tuple * book(const std::string &fullPath, const CLID &type, const std::string &title) override
Book Ntuple and register it with the data store.
Gaudi::Property< DBaseEntries > m_output
StatusCode findObject(std::string_view fullPath, DataObject *&pObject) override
Find object identified by its full path in the data store.
StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject) override
Retrieve object from data store.
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
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.
virtual StatusCode setDataProvider(IDataProviderSvc *pService)=0
Set Data provider service.
#define DECLARE_NAMESPACE_OBJECT_FACTORY(n, x)
StatusCode connect(const std::string &ident) override
Add file to list I/O list.
const std::string & name() const override
Retrieve name of the service
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
Gaudi::Property< std::string > m_rootName
StatusCode finalize() override
DataSvc overrides: stop the service.
NTuple::Tuple * access(const std::string &fullPath, const std::string &filename) override
Access N tuple on disk.
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
const ValueType & value() const
Gaudi::Property< DBaseEntries > m_input
unsigned int CLID
Class ID definition.
virtual void setAddress(IOpaqueAddress *pAddress)=0
Set/Update Opaque storage address.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
const long ROOT_StorageType
StatusCode create(const CLID &typ, const std::string &title, NTuple::Tuple *&refpTuple) override
Create requested N tuple (Hide constructor)
virtual long repSvcType() const =0
Retrieve the class type of the data store the converter uses.
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
void releaseConnection(Connection &c)
Finalize single service.
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
StatusCode disconnect(const std::string &nam) override
Close open connection.
constexpr static const auto SUCCESS
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves) override
IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
unsigned long release() override
release reference to object
bool isConnected(const std::string &identifier) const override
Check if a datasource is connected.
StatusCode createService(const std::string &nam, const std::string &typ, const std::vector< Prop > &props, IConversionSvc *&pSvc)
Create conversion service.
Abstract base class which allows the user to interact with the actual N tuple implementation.
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the converted representation of a transient object.
#define DECLARE_COMPONENT(type)
StatusCode disconnectAll() override
Close all open connections.
StatusCode setRoot(std::string root_name, DataObject *pRootObj) override
Initialize data store for new event by giving new event path and root object.
virtual const id_type & identifier() const =0
Full identifier (or key)
StatusCode registerObject(std::string_view parentPath, std::string_view objPath, DataObject *pObject) override
Register object with the data store.
StatusCode initialize() override
Service initialization.
StatusCode unregisterObject(std::string_view fullPath) override
Unregister object from the data store.
constexpr static const auto FAILURE
StatusCode initialize() override
DataSvc overrides: Initialize the service.
StatusCode readRecord(NTuple::Tuple *tuple) override
Read single record from N tuple.
IConversionSvc * getDataLoader(IRegistry *pReg) override
DataSvc overrides: Retrieve data loader.
Parse attribute strings allowing iteration over the various attributes.
const long TEST_StorageType
void setConversionService(IConversionSvc *svc)
Access conversion service.
IRegistry * registry() const
Get pointer to Registry.
virtual unsigned long addRef()=0
Increment the reference count of Interface instance.
void setTupleService(INTupleSvc *svc)
Access conversion service.
StatusCode registerAddress(std::string_view fullPath, IOpaqueAddress *pAddress) override
IDataManagerSvc: Register object address with the data store.
StatusCode save(const std::string &fullPath) override
Save N tuple to disk. Must be called in order to close the ntuple file properly.
virtual const unsigned long * ipar() const =0
Access to generic link parameters.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator
StatusCode finalize() override
Service initialization.