35 using namespace Gaudi;
36 typedef const string&
CSTR;
38 #define S_OK StatusCode::SUCCESS 39 #define S_FAIL StatusCode::FAILURE 46 #define MBYTE (1024*1024) 53 m_setup->cacheBranches.push_back(
"*");
79 return error(
"Failed to initialize ConversionSvc base class.");
90 return error(
"Unable to localize interface from service:IODataManager");
93 return error(
"Unable to localize interface from service:IncidentSvc");
100 return error(
"Unable to load class description for DataObject");
104 return error(
"Unable to load class description for ObjectRefs");
113 for(
auto &i : cons ) {
119 if (
pc->lookupClient(
this) ) {
120 size_t num_clients =
pc->removeClient(
this);
121 if ( num_clients == 0 ) {
122 if (
m_ioMgr->disconnect(
pc).isSuccess() ) {
123 log() <<
"Disconnected data IO:" <<
pc->fid()
124 <<
" [" <<
pc->pfn() <<
"]" <<
endmsg;
135 m_setup->setIncidentSvc(
nullptr);
141 if ( wanted == CLID_StatisticsFile )
143 else if ( wanted == CLID_StatisticsDirectory )
145 else if ( wanted == CLID_RowWiseTuple )
147 else if ( wanted == CLID_ColumnWiseTuple )
159 TClass* cl = s_classesNames[cname];
160 if (
nullptr == cl ) {
161 cl = TClass::GetClass(cname.
c_str());
163 s_classesNames[cname] = cl;
164 s_classesClids[pObject->
clID()] = cl;
172 auto i=s_classesClids.find(pObject->
clID());
173 if ( i != s_classesClids.end() )
return i->second;
175 i=s_classesClids.find(pObject->
clID());
176 if ( i != s_classesClids.end() )
return i->second;
188 if ( ::strncasecmp(openMode.
c_str(),
"RECREATE",3)==0 )
190 else if ( ::strncasecmp(openMode.
c_str(),
"NEW",1)==0 )
192 else if ( ::strncasecmp(openMode.
c_str(),
"CREATE",1)==0 )
194 else if ( ::strncasecmp(openMode.
c_str(),
"UPDATE",1)==0 )
200 log() <<
MSG::ERROR <<
"The dataset " << dsn <<
" cannot be opened in mode " 201 << openMode <<
". [Invalid mode]" <<
endmsg;
210 bool fire_incident =
false;
216 :
m_ioMgr->connectRead(
false,connection.
get());
233 ? IncidentType::FailInputFile
234 : IncidentType::FailOutputFile));
247 if ( fire_incident ) {
249 string fid = pc->
fid();
254 unsigned long ipar[2] = { (
unsigned long)(*con), (
unsigned long)b->GetEntries()-1 };
255 for(
int i=0; i<b->GetEntries(); ++i) {
261 log() <<
MSG::VERBOSE <<
"Failed to create address for " << m_recordName <<
" in:" << fid
262 <<
" [" << pc->
fid() <<
"][" << i <<
"]" <<
endmsg;
266 log() <<
MSG::VERBOSE <<
"Prepare " << m_recordName <<
" " << fid <<
" [" << par[0] <<
"][" << i <<
"]" <<
endmsg;
277 for(
auto &i :
m_ioMgr->connections(
this) ) {
282 if ( num_client == 0 ) {
283 if (
m_ioMgr->disconnect(pc).isSuccess() ) {
299 return error(
string(
"connectDatabase> Caught exception:")+e.
what());
303 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 <<
"commit: Added " << long(evt-br_evt)
336 <<
" Section: " << evt <<
" Branch: " << br_ptr->GetEntries()
337 <<
" RefNo: " << br_ptr->GetEntries()-1
338 <<
" NULL entries to:" << br_ptr->GetName() <<
endmsg;
342 b->GetTree()->SetEntries(evt);
347 if ( evt == m_autoFlush ) {
348 b->GetTree()->SetAutoFlush(m_autoFlush);
352 b->GetTree()->FlushBaskets();
357 <<
" to " << long(evt) <<
" entries." <<
endmsg;
360 return error(
"commitOutput> Failed to update entry numbers on "+dsn);
376 const unsigned long* ip,
379 refpAddress =
new RootAddress(typ,clid,par[0],par[1],ip[0],ip[1]);
385 size_t len = path.
find(
'/',1);
386 string section = path.
substr(1,len==string::npos ? string::npos : len-1);
394 size_t len = path.
find(
'/',1);
395 string section = path.
substr(1,len==string::npos ? string::npos : len-1);
400 << ret.first <<
" " <<
hex << ret.second <<
dec <<
" [NULL]" <<
endmsg;
407 if ( !pObj )
return error(
"createRep> Current Database is invalid!");
412 size_t len = p[1].
find(
'/',1);
413 string sect = p[1].
substr(1,len==string::npos ? string::npos : len-1);
416 if ( ret.first > 1 || (clid == CLID_DataObject && ret.first==1) ) {
417 unsigned long ip[2] = {0,ret.second};
421 return error(
"Failed to write object data for:"+p[1]);
433 StatusCode status = dataMgr->objectLeaves(pObj, leaves);
437 size_t len =
id.
find(
'/',1);
438 string sect =
id.substr(1,len==string::npos ? string::npos : len-1);
440 for(
auto &i : leaves ) {
441 if ( i->address() ) {
443 ref.
entry = i->address()->ipar()[1];
447 for(
int i = 0,
n=pLinks->
size(); i <
n; ++i) {
454 if ( ret.first > 1 ) {
457 << ret.first <<
" " <<
hex << ret.second <<
dec <<
endmsg;
471 const string*
par = pA->
par();
472 unsigned long* ipar =
const_cast<unsigned long*
>(pA->
ipar());
475 ipar[0] = (
unsigned long)con;
477 size_t len = par[1].
find(
'/',1);
478 string section = par[1].
substr(1,len==string::npos ? string::npos : len-1);
480 int nb = con->
loadObj(section,par[1],ipar[1],pObj);
481 if ( nb > 1 || (nb == 1 && pObj->
clID() == CLID_DataObject) ) {
487 string tag = par[0]+
":"+par[1];
490 return error(
"createObj> Cannot access the object:"+tag);
499 return error(
"read> Cannot read object -- no valid object address present ");
501 const unsigned long* ipar = pA->
ipar();
505 const string*
par = pA->
par();
506 size_t len = par[1].
find(
'/',1);
507 string section = par[1].
substr(1,len==string::npos ? string::npos : len-1);
508 int nb = con->
loadRefs(section,par[1],ipar[1],refs);
511 unsigned long nipar[2];
516 for(
auto & r : refs.
refs) {
517 npar[0] = con->
getDb(r.dbase);
518 npar[1] = con->
getCont(r.container);
519 npar[2] = con->
getLink(r.link);
528 <<
"#" << npar[2] <<
"[" << r.entry <<
"]" <<
endmsg;
529 sc = dataMgr->registerAddress(pA->
registry(),npar[2],nPA);
536 }
else if ( nb < 0 ) {
537 string tag = par[0]+
":"+par[1];
540 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.
MSG::Level level()
Retrieve output level.
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.
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.