35 using namespace Gaudi;
36 typedef const string&
CSTR;
38 #define S_OK StatusCode::SUCCESS 39 #define S_FAIL StatusCode::FAILURE 50 #define MBYTE ( 1024 * 1024 ) 56 m_setup->cacheBranches.push_back(
"*" );
84 return error(
"Failed to initialize ConversionSvc base class." );
94 if ( !
m_ioMgr )
return error(
"Unable to localize interface from service:IODataManager" );
96 if ( !
m_incidentSvc )
return error(
"Unable to localize interface from service:IncidentSvc" );
102 if ( !
m_classDO )
return error(
"Unable to load class description for DataObject" );
105 if ( !
m_classRefs )
return error(
"Unable to load class description for ObjectRefs" );
115 for (
auto& i : cons ) {
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;
136 m_setup->setIncidentSvc(
nullptr );
143 if ( wanted == CLID_StatisticsFile )
145 else if ( wanted == CLID_StatisticsDirectory )
147 else if ( wanted == CLID_RowWiseTuple )
149 else if ( wanted == CLID_ColumnWiseTuple )
162 TClass* cl = s_classesNames[cname];
163 if (
nullptr == cl ) {
164 cl = TClass::GetClass( cname.
c_str() );
166 s_classesNames[cname] = cl;
167 s_classesClids[pObject->
clID()] = cl;
176 auto i = s_classesClids.find( pObject->
clID() );
177 if ( i != s_classesClids.end() )
return i->second;
179 i = s_classesClids.find( pObject->
clID() );
180 if ( i != s_classesClids.end() )
return i->second;
183 throw runtime_error(
"Unknown ROOT class for object:" + cname );
193 if (::strncasecmp( openMode.
c_str(),
"RECREATE", 3 ) == 0 )
195 else if (::strncasecmp( openMode.
c_str(),
"NEW", 1 ) == 0 )
197 else if (::strncasecmp( openMode.
c_str(),
"CREATE", 1 ) == 0 )
199 else if (::strncasecmp( openMode.
c_str(),
"UPDATE", 1 ) == 0 )
205 log() <<
MSG::ERROR <<
"The dataset " << dsn <<
" cannot be opened in mode " << openMode <<
". [Invalid mode]" 215 bool fire_incident =
false;
221 :
m_ioMgr->connectRead(
false, connection.
get() );
238 dataset, mode ==
IDataConnection::READ ? IncidentType::FailInputFile : IncidentType::FailOutputFile ) );
251 if ( fire_incident ) {
253 string fid = pc->
fid();
258 unsigned long ipar[2] = {(
unsigned long)( *con ), (
unsigned long)b->GetEntries() - 1};
259 for (
int i = 0; i < b->GetEntries(); ++i ) {
264 log() <<
MSG::VERBOSE <<
"Failed to create address for " << m_recordName <<
" in:" << fid <<
" [" 265 << pc->
fid() <<
"][" << i <<
"]" <<
endmsg;
269 log() <<
MSG::VERBOSE <<
"Prepare " << m_recordName <<
" " << fid <<
" [" << par[0] <<
"][" << i <<
"]" 280 for (
auto& i :
m_ioMgr->connections(
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() <<
"]" 301 return error(
string(
"connectDatabase> Caught exception:" ) + e.
what() );
304 return error(
"connectDatabase> Unknown Fatal Exception for " + dataset );
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 );
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;
341 b->GetTree()->SetEntries( evt );
346 if ( evt == m_autoFlush ) {
347 b->GetTree()->SetAutoFlush( m_autoFlush );
350 b->GetTree()->FlushBaskets();
357 return error(
"commitOutput> Failed to update entry numbers on " + dsn );
374 refpAddress =
new RootAddress( typ, clid, par[0], par[1], ip[0], ip[1] );
381 size_t len = path.
find(
'/', 1 );
382 string section = path.
substr( 1, len == string::npos ? string::npos : len - 1 );
391 size_t len = path.
find(
'/', 1 );
392 string section = path.
substr( 1, len == string::npos ? string::npos : len - 1 );
395 log() <<
MSG::VERBOSE <<
"Writing object:" << path <<
" " << ret.first <<
" " <<
hex << ret.second <<
dec 404 if ( !pObj )
return error(
"createRep> Current Database is invalid!" );
409 size_t len = p[1].
find(
'/', 1 );
410 string sect = p[1].
substr( 1, len == string::npos ? string::npos : len - 1 );
412 if ( ret.first > 1 || ( clid == CLID_DataObject && ret.first == 1 ) ) {
413 unsigned long ip[2] = {0, ret.second};
417 return error(
"Failed to write object data for:" + p[1] );
430 StatusCode status = dataMgr->objectLeaves( pObj, leaves );
434 size_t len =
id.
find(
'/', 1 );
435 string sect =
id.substr( 1, len == string::npos ? string::npos : len - 1 );
437 for (
auto& i : leaves ) {
438 if ( i->address() ) {
440 ref.
entry = i->address()->ipar()[1];
444 for (
int i = 0,
n = pLinks->
size(); i <
n; ++i ) {
451 if ( ret.first > 1 ) {
453 log() <<
MSG::DEBUG <<
"Writing object:" <<
id <<
" " << ret.first <<
" " <<
hex << ret.second <<
dec 469 const string*
par = pA->
par();
470 unsigned long* ipar =
const_cast<unsigned long*
>( pA->
ipar() );
473 ipar[0] = (
unsigned long)con;
475 size_t len = par[1].
find(
'/', 1 );
476 string section = par[1].
substr( 1, len == string::npos ? string::npos : len - 1 );
478 int nb = con->
loadObj( section, par[1], ipar[1], pObj );
479 if ( nb > 1 || ( nb == 1 && pObj->
clID() == CLID_DataObject ) ) {
485 string tag = par[0] +
":" + par[1];
488 return error(
"createObj> Cannot access the object:" + tag );
496 if ( !pA || !pObj )
return error(
"read> Cannot read object -- no valid object address present " );
498 const unsigned long* ipar = pA->
ipar();
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 );
508 unsigned long nipar[2];
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 );
524 <<
"#" << npar[2] <<
"[" << r.entry <<
"]" <<
endmsg;
525 sc = dataMgr->registerAddress( pA->
registry(), npar[2], nPA );
532 }
else if ( nb < 0 ) {
533 string tag = par[0] +
":" + par[1];
536 return error(
"createObj> Cannot access the object:" + tag +
" [Corrupted file]" );
void addClient(const IInterface *client)
Add new client to this data source.
bool lookupClient(const IInterface *client) const
Lookup client for this data source.
const std::string & path() const
Access to path of object.
Definition of the MsgStream class used to transmit messages.
SmartIF< IAddressCreator > & addressCreator() const override
Retrieve address creator facility.
virtual StatusCode update()
Provide empty placeholder for internal object reconfiguration callback.
MsgStream & log() const
Helper: Use message streamer.
Gaudi::Property< int > m_autoFlush
MsgStream & msg() const
shortcut for the method msgStream(MSG::INFO)
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
The data converters are responsible to translate data from one representation into another...
const std::string & name() const override
Retrieve name of the service.
const std::string & fid() const
Access file id.
std::string m_currSection
Property: ROOT section name.
Gaudi::Property< std::string > m_recordName
virtual StatusCode createNullRef(const std::string &path)
Insert null marker for not existent transient object.
IoType
I/O Connection types.
std::pair< int, unsigned long > saveObj(const std::string §ion, 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.
TFile * file() const
Direct access to TFile structure.
SmartIF< IIncidentSvc > m_incidentSvc
Reference to incident service.
bool isConnected() const override
Check if connected to data source.
const std::string & getDb(int which) const
Access database/file name from saved index.
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
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.
StatusCode createAddress(long svc_type, const CLID &clid, const std::string *par, const unsigned long *ip, IOpaqueAddress *&refpAddress) override
IAddressCreator implementation: Address creation.
bool isSuccess() const
Test for a status code of SUCCESS.
int loadObj(const std::string §ion, const std::string &cnt, unsigned long entry, DataObject *&pObj)
Load object.
std::shared_ptr< RootConnectionSetup > m_setup
Setup structure (ref-counted) and passed to data connections.
void loadConverter(DataObject *pObj) override
ConversionSvc overload: Load the class (dictionary) for the converter.
MsgStream & dec(MsgStream &log)
virtual IRegistry * registry() const =0
Update branch name.
Gaudi::Property< std::string > m_compression
size_t removeClient(const IInterface *client)
Remove client from this data source.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Details::PropertyBase &prop)
Declare a property.
bool patchStreamers(MsgStream &log)
StatusCode initialize() override
ConversionSvc overload: initialize Db service.
const std::string & getLink(int which) const
Access link name from saved index.
StatusCode connectDatabase(const std::string &dataset, int mode, RootDataConnection **con)
Connect the output file to the service with open mode.
long addLink(const std::string &path, const DataObject *pObject) const
Add link by object reference and path.
std::vector< RootRef > refs
The references corresponding to the next layer of items in the data store.
StatusCode finalize() override
ConversionSvc overload: Finalize Db service.
MsgStream & hex(MsgStream &log)
Gaudi::Property< int > m_splitLevel
Gaudi::Property< int > m_bufferSize
virtual const std::string * par() const =0
Retrieve String parameters.
const std::string & pfn() const
Access physical file name.
StatusCode commitOutput(const std::string &outputFile, bool do_commit) override
Commit pending output.
IRegistry * registry() const
Get pointer to Registry.
int loadRefs(const std::string §ion, 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...
LinkManager * linkMgr() const
Retrieve Link manager.
TYPE * get() const
Get interface pointer.
Persistent reference object.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
virtual const CLID & clID() const
Retrieve reference to class definition structure.
virtual const unsigned long * ipar() const =0
Access to generic link parameters.
virtual const id_type & identifier() const =0
Full identifier (or key)
Gaudi::Property< std::string > m_ioPerfStats
General service interface definition.
This class is used for returning status codes from appropriate routines.
std::unique_ptr< MsgStream > m_log
Message streamer.
TBranch * getBranch(const std::string §ion, const std::string &branch_name)
Access data branch by name: Get existing branch in read only mode.
void makeRef(IRegistry *pA, RootRef &ref)
Create reference object from registry entry.
Link * link(long id)
Retrieve symbolic link identified by ID.
Statistics file converter class definition.
virtual IDataProviderSvc * dataSvc() const =0
Retrieve pointer to Transient Store.
TClass * m_classDO
TClass pointer to DataObject class.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
const long ROOT_StorageType
virtual StatusCode i__createObj(IOpaqueAddress *pAddr, DataObject *&refpObj)
Create transient object from persistent data.
const std::string & getCont(int which) const
Access container name from saved index.
unsigned int CLID
Class ID definition.
NTuple converter class definition for NTuples writted/read using ROOT.
virtual StatusCode disconnect(const std::string &dbName)
Disconnect from an existing data stream.
std::vector< int > links
The links of the link manager.
std::pair< int, unsigned long > save(const std::string §ion, 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.
const StringVec & mergeFIDs() const
Access merged FIDs.
IConverter * createConverter(long typ, const CLID &wanted, const ICnvFactory *fac) override
ConversionSvc overload: Create new Converter using factory.
std::set< std::string > m_badFiles
Set with bad files/tables.
Description: NTuple directory converter class definition Definition of the converter to manage the di...
virtual StatusCode createNullRep(const std::string &path)
Insert null marker for not existent transient object.
StatusCode connectRead() override
Open data stream in read mode.
ABC describing basic data connection.
int makeLink(const std::string &p)
Convert path string to path index.
SmartIF< Gaudi::IIODataManager > m_ioMgr
Reference to the I/O data manager.
void resetAge()
Reset age.
Base class for all Incidents (computing events).
virtual StatusCode i__fillRepRefs(IOpaqueAddress *pAddr, DataObject *pObj)
Resolve the references of the converted object.
long repSvcType() const override
Retrieve the class type of the data store the converter uses.
SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
static long setCompression(const std::string &compression)
Set the global compression level.
virtual StatusCode i__fillObjRefs(IOpaqueAddress *pAddr, DataObject *pObj)
Resolve the references of the created transient object.
Gaudi::Property< int > m_basketSize
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.
MSG::Level level() const
Retrieve output level.
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Embedded class defining a symbolic link Note: No copy constructor; bitwise copy (done by the compiler...
Opaque address interface definition.
Base class for all conversion services.
void enableStatistics(const std::string §ion)
Enable TTreePerStats.
A DataObject is the base class of any identifiable object on any data store.
Concrete implementation of the IDataConnection interface to access ROOT files.
StatusCode finalize() override
stop the service.
A LinkManager is the object aggregated into a DataObject, which is responsible for the handling of no...
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Helper functions to set/get the application return code.
virtual StatusCode i__createRep(DataObject *pObj, IOpaqueAddress *&refpAddr)
Convert the transient object to the requested persistent representation.
StatusCode initialize() override
Initialize the service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Gaudi::Property< bool > m_incidentEnabled
StatusCode connectOutput(const std::string &outputFile, const std::string &openMode) override
Connect the output file to the service with open mode.
Description: Definition of the ROOT data converter.
long size() const
Retrieve number of link present.
Gaudi::RootDataConnection * m_current
On writing: reference to active output stream.
TClass * getClass(DataObject *pObject)
Helper: Get TClass for a given DataObject pointer.
TClass * m_classRefs
TClass pointer to reference class.