The Gaudi Framework  master (69a68366)
Loading...
Searching...
No Matches
Gaudi::RootNTupleCnv Class Reference

NTuple converter class definition for NTuples writted/read using ROOT. More...

#include <Root/RootNTupleCnv.h>

Inheritance diagram for Gaudi::RootNTupleCnv:
Collaboration diagram for Gaudi::RootNTupleCnv:

Public Member Functions

 RootNTupleCnv (long typ, const CLID &clid, ISvcLocator *svc, RootCnvSvc *mgr)
 Standard constructor.
 
StatusCode createRep (DataObject *pObj, IOpaqueAddress *&refpAdd) override
 Converter overrides: Convert the transient object to the requested representation.
 
StatusCode fillRepRefs (IOpaqueAddress *pAdd, DataObject *pObj) override
 Resolve the references of the converted object.
 
StatusCode createObj (IOpaqueAddress *pAddress, DataObject *&refpObject) override
 Converter overrides: Update the references of an updated transient object.
 
StatusCode fillObjRefs (IOpaqueAddress *, DataObject *) override
 Converter overrides: Update the references of an updated transient object.
 
StatusCode updateObj (IOpaqueAddress *pAddress, DataObject *pObject) override
 Update the transient object: NTuples end here when reading records.
 
StatusCode updateObjRefs (IOpaqueAddress *, DataObject *) override
 Converter overrides: Update the references of an updated transient object.
 
StatusCode updateRep (IOpaqueAddress *, DataObject *) override
 Converter overrides: Update the converted representation of a transient object.
 
StatusCode updateRepRefs (IOpaqueAddress *, DataObject *) override
 Converter overrides: Update the converted representation of a transient object.
 
- Public Member Functions inherited from Gaudi::RootStatCnv
 RootStatCnv (long typ, const CLID &clid, ISvcLocator *svc, RootCnvSvc *mgr)
 Initializing Constructor.
 
- Public Member Functions inherited from Gaudi::RootConverter
 RootConverter (long typ, const CLID &clid, ISvcLocator *svc, RootCnvSvc *mgr)
 Initializing Constructor.
 
long repSvcType () const override
 Retrieve the class type of the data store the converter uses.
 
StatusCode createObj (IOpaqueAddress *pAddr, DataObject *&refpObj) override
 Converter overrides: Create transient object from persistent data.
 
StatusCode fillObjRefs (IOpaqueAddress *pAddr, DataObject *pObj) override
 Resolve the references of the created transient object.
 
StatusCode createRep (DataObject *pObj, IOpaqueAddress *&refpAddr) override
 Converter overrides: Convert the transient object to the requested representation.
 
StatusCode fillRepRefs (IOpaqueAddress *pAddr, DataObject *pObj) override
 Resolve the references of the created transient object.
 
- Public Member Functions inherited from Converter
StatusCode initialize () override
 Initialize the converter.
 
StatusCode finalize () override
 Initialize the converter.
 
StatusCode setDataProvider (IDataProviderSvc *svc) override
 Set Data provider service.
 
SmartIF< IDataProviderSvc > & dataProvider () const override
 Get Data provider service.
 
StatusCode setConversionSvc (IConversionSvc *svc) override
 Set conversion service the converter is connected to.
 
SmartIF< IConversionSvc > & conversionSvc () const override
 Get conversion service the converter is connected to.
 
StatusCode setAddressCreator (IAddressCreator *creator) override
 Set address creator facility.
 
SmartIF< IAddressCreator > & addressCreator () const override
 Retrieve address creator facility.
 
const CLIDobjType () const override
 Retrieve the class type of objects the converter produces.
 
virtual long i_repSvcType () const
 Retrieve the class type of the data store the converter uses.
 
StatusCode createObj (IOpaqueAddress *pAddress, DataObject *&refpObject) override
 Create the transient representation of an object.
 
StatusCode fillObjRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Resolve the references of the created transient object.
 
StatusCode updateObj (IOpaqueAddress *pAddress, DataObject *refpObject) override
 Update the transient object from the other representation.
 
StatusCode updateObjRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Update the references of an updated transient object.
 
StatusCode createRep (DataObject *pObject, IOpaqueAddress *&refpAddress) override
 Convert the transient object to the requested representation.
 
StatusCode fillRepRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Resolve the references of the converted object.
 
StatusCode updateRep (IOpaqueAddress *pAddress, DataObject *pObject) override
 Update the converted representation of a transient object.
 
StatusCode updateRepRefs (IOpaqueAddress *pAddress, DataObject *pObject) override
 Update the references of an already converted object.
 
 Converter (long storage_type, const CLID &class_type, ISvcLocator *svc=0)
 Standard Constructor.
 
SmartIF< IServiceservice (const std::string &name, const bool createIf=true) const
 Return a pointer to the service identified by name (or "type/name")
 
- Public Member Functions inherited from implements< IConverter >
void const * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast.
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface.
 
std::vector< std::string > getInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames.
 
 implements ()=default
 Default constructor.
 
 implements (const implements &)
 Copy constructor (zero the reference count)
 
implementsoperator= (const implements &)
 Assignment operator (do not touch the reference count).
 
unsigned long addRef () const override
 Reference Interface instance.
 
unsigned long release () const override
 Release Interface instance.
 
unsigned long refCount () const override
 Current reference count.
 

Protected Member Functions

StatusCode i__updateObjRoot (RootAddress *rpA, INTuple *tupl, TTree *tree, RootDataConnection *con)
 Update the transient object: NTuples end here when reading records.
 
- Protected Member Functions inherited from Gaudi::RootStatCnv
MsgStreamlog () const
 Helper to use mesage logger.
 
StatusCode initialize () override
 Initialize converter object.
 
StatusCode finalize () override
 Finalize converter object.
 
virtual const std::string containerName (IRegistry *pDir) const
 Retrieve the name of the container a given object is placed into.
 
virtual const std::string fileName (IRegistry *pReg) const
 Retrieve the name of the file a given object is placed into.
 
virtual const std::string topLevel (IRegistry *pReg) const
 Retrieve the full path of the file a given object is placed into.
 
StatusCode makeError (const std::string &msg, bool throw_exception=false) const
 Helper method to issue error messages.
 
StatusCode saveDescription (const std::string &path, const std::string &ident, const std::string &desc, const std::string &opt, const CLID &clid)
 Save statistics object description.
 
- Protected Member Functions inherited from Converter
SmartIF< ISvcLocator > & serviceLocator () const
 Retrieve pointer to service locator.
 
SmartIF< IMessageSvc > & msgSvc () const
 Retrieve pointer to message service.
 
SmartIF< IDataManagerSvc > & dataManager () const
 Get Data Manager service.
 
- Protected Member Functions inherited from implements< IConverter >
unsigned long decRef () const override
 

Additional Inherited Members

- Public Types inherited from Converter
using Factory = Gaudi::PluginService::Factory<IConverter*( ISvcLocator* )>
 
- Public Types inherited from implements< IConverter >
using base_class
 Typedef to this class.
 
using extend_interfaces_base
 Typedef to the base of this class.
 
using iids
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids
 take union of the ext_iids of all Interfaces...
 
- Protected Attributes inherited from Gaudi::RootStatCnv
SmartIF< IDataManagerSvcm_dataMgr
 Reference to data manager service to manipulate the TES.
 
std::unique_ptr< MsgStreamm_log
 Reference to logger object.
 
- Protected Attributes inherited from Gaudi::RootConverter
RootCnvSvcm_dbMgr
 Conversion service needed for proper operation to forward requests.
 
- Protected Attributes inherited from implements< IConverter >
std::atomic_ulong m_refCount
 Reference counter.
 

Detailed Description

NTuple converter class definition for NTuples writted/read using ROOT.

Description: Definition of the generic converter for row wise and column wise Ntuples.

Author
M.Frank
Version
1.0

Definition at line 44 of file RootNTupleCnv.h.

Constructor & Destructor Documentation

◆ RootNTupleCnv()

Gaudi::RootNTupleCnv::RootNTupleCnv ( long typ,
const CLID & clid,
ISvcLocator * svc,
RootCnvSvc * mgr )
inline

Standard constructor.

Parameters
clid[IN] Class ID of the object type to be converted.
db[IN] Pointer to POOL database interface
svc[IN] Pointer to Gaudi service locator
Returns
Reference to RootNTupleCnv object

Definition at line 63 of file RootNTupleCnv.h.

64 : RootStatCnv( typ, clid, svc, mgr ) {}
RootStatCnv(long typ, const CLID &clid, ISvcLocator *svc, RootCnvSvc *mgr)
Initializing Constructor.

Member Function Documentation

◆ createObj()

StatusCode RootNTupleCnv::createObj ( IOpaqueAddress * pAddress,
DataObject *& refpObject )
override

Converter overrides: Update the references of an updated transient object.

Parameters
pAddress[IN] Valid pointer to the object's opaque address
refpObject[OUT] Location to store pointer to DataObject
Returns
Status code indicating success or failure

Definition at line 155 of file RootNTupleCnv.cpp.

155 {
156 StatusCode status = S_FAIL;
157 RootDataConnection* con = nullptr;
158 IRegistry* pRegistry = pAddr->registry();
159 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
160 string path = fileName( pRegistry );
161 string cntName = containerName( pRegistry );
162 string* par = const_cast<string*>( pAddr->par() );
163 status = m_dbMgr->connectDatabase( path, IDataConnection::READ, &con );
164 if ( status.isSuccess() ) {
165 string par_val, par_guid;
166 TBranch* b = con->getBranch( "##Descriptors", "GaudiStatisticsDescription" );
167 if ( b ) {
168 RootNTupleDescriptor* ptr;
169 std::unique_ptr<RootNTupleDescriptor> dsc( ptr = new RootNTupleDescriptor() );
170 b->SetAddress( &ptr );
171 for ( Long64_t i = 0, nent = b->GetEntries(); i < nent; ++i ) {
172 int nb = b->GetEntry( i );
173 if ( nb > 1 ) {
174 if ( ptr->container == cntName ) {
175 par_val = ptr->description;
176 break;
177 }
178 }
179 }
180 }
181 par[2] = _tr( cntName );
182 TTree* tree = con->getSection( par[2] );
183 if ( nullptr == tree ) { return makeError( "Failed to access N-Tuple tree:" + cntName ); }
184 if ( !par_val.empty() ) {
185 auto ntupleSvc = dataProvider().as<INTupleSvc>();
186 if ( ntupleSvc ) {
187 char c;
188 CLID clid;
189 int siz, typ;
190 string title;
191 NTuple::Tuple* nt = nullptr;
192 istringstream is( par_val );
193 getline( is, title, ';' ) >> clid >> c >> siz >> c;
194 status = ntupleSvc->create( clid, title, nt );
195 for ( int j = 0; j < siz && status.isSuccess(); j++ ) {
196 is >> c;
197 getline( is, title, ';' ) >> typ >> c;
198 switch ( typ ) {
200 status = createItem( tree, nt, is, title, true, (unsigned char)0 );
201 break;
203 status = createItem( tree, nt, is, title, true, (unsigned short)0 );
204 break;
206 status = createItem( tree, nt, is, title, true, 0u );
207 break;
209 status = createItem( tree, nt, is, title, true, 0ul );
210 break;
212 status = createItem( tree, nt, is, title, true, char( 0 ) );
213 break;
215 status = createItem( tree, nt, is, title, true, short( 0 ) );
216 break;
218 status = createItem( tree, nt, is, title, true, 0 );
219 break;
221 status = createItem( tree, nt, is, title, true, 0l );
222 break;
224 status = createItem( tree, nt, is, title, true, false );
225 break;
227 status = createItem( tree, nt, is, title, true, 0.f );
228 break;
230 status = createItem( tree, nt, is, title, true, 0. );
231 break;
232 /*
233 case DataTypeInfo::NTCHAR:
234 case DataTypeInfo::LONG_NTCHAR:
235 status =
236 createItem(tree, nt, is, title, true, (char*)0);
237 break;
238 case DataTypeInfo::STRING:
239 case DataTypeInfo::LONG_STRING:
240 status =
241 createItem(tree, nt, is, title, true, string(""));
242 break;
243 */
245 status = createItem( tree, nt, is, title, false, static_cast<IOpaqueAddress*>( nullptr ) );
246 break;
248 status = createItem( tree, nt, is, title, true, static_cast<void*>( nullptr ) );
249 break;
251 default:
252 status = S_FAIL;
253 break;
254 }
255 if ( !status.isSuccess() ) {
256 log() << MSG::FATAL << "Error connecting (Unknown) column:" << j << endmsg << par_val << endmsg;
257 return makeError( "createObj[NTuple]> Cannot determine column!" );
258 }
259 }
260 if ( status.isSuccess() && rpA ) {
261 unsigned long* ipar = const_cast<unsigned long*>( rpA->ipar() );
262 log() << MSG::DEBUG << "Created N-tuple with description:" << par_val << endl;
263 ipar[0] = reinterpret_cast<uintptr_t>( con );
264 ipar[1] = ~0x0UL;
265 rpA->section = tree;
266 refpObject = nt;
267 } else {
268 refpObject = nullptr;
269 if ( nt ) nt->release();
270 }
271 }
272 }
273 }
274 return status;
275}
unsigned int CLID
Class ID definition.
Definition ClassID.h:16
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
#define S_FAIL
SmartIF< IDataProviderSvc > & dataProvider() const override
Get Data provider service.
Definition Converter.cpp:77
virtual unsigned long release()
release reference to object
TTree * section
Pointer to ROOT TTree (filled for N-tuples only)
Definition RootAddress.h:50
RootCnvSvc * m_dbMgr
Conversion service needed for proper operation to forward requests.
TTree * getSection(std::string_view sect, bool create=false)
Access TTree section from section name. The section is created if required.
TBranch * getBranch(std::string_view section, std::string_view branch_name)
Access data branch by name: Get existing branch in read only mode.
virtual const std::string fileName(IRegistry *pReg) const
Retrieve the name of the file a given object is placed into.
StatusCode makeError(const std::string &msg, bool throw_exception=false) const
Helper method to issue error messages.
MsgStream & log() const
Helper to use mesage logger.
Definition RootStatCnv.h:47
virtual const std::string containerName(IRegistry *pDir) const
Retrieve the name of the container a given object is placed into.
const unsigned long * ipar() const override
Retrieve integer parameters.
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition SmartIF.h:110
bool isSuccess() const
Definition StatusCode.h:314
GAUDI_API std::string path(const AIDA::IBaseHistogram *aida)
get the path in THS for AIDA histogram
@ FATAL
Definition IMessageSvc.h:22
@ DEBUG
Definition IMessageSvc.h:22
std::string description
Description string.
Definition RootRefs.h:88
std::string container
Identifier of description.
Definition RootRefs.h:92

◆ createRep()

StatusCode RootNTupleCnv::createRep ( DataObject * pObj,
IOpaqueAddress *& refpAdd )
override

Converter overrides: Convert the transient object to the requested representation.

Convert the transient object to the requested representation.

Parameters
pObj[IN] Valid pointer to DataObject
refpAdd[OUT] Location to store pointer to the object's opaque address
Returns
Status code indicating success or failure

Definition at line 396 of file RootNTupleCnv.cpp.

396 {
397 IRegistry* pRegistry = pObj->registry();
398 if ( pRegistry ) {
399 pAddr = pRegistry->address();
400 if ( pAddr ) return S_OK;
401
402 RootDataConnection* con = nullptr;
403 string path = fileName( pRegistry );
404 string cntName = containerName( pRegistry );
405 string secName = cntName;
406 const INTuple* nt = dynamic_cast<const INTuple*>( pObj );
407 StatusCode status = m_dbMgr->connectDatabase( path, IDataConnection::UPDATE, &con );
408 if ( !status.isSuccess() ) { return makeError( "Failed to access Tuple file:" + path ); }
409 TTree* tree = con->getSection( _tr( secName ), true );
410 if ( nullptr != nt ) {
411 const INTuple::ItemContainer& items = nt->items();
412 ostringstream os;
413 size_t item_no;
414 string desc;
415 os << nt->title() << ';' << pObj->clID() << ';' << items.size() << ';';
416 map<string, TBranch*> branches;
417 TBranch* b = nullptr;
418 for ( item_no = 0; item_no < items.size(); ++item_no ) {
419 INTupleItem* it = items[item_no];
420 if ( it->hasIndex() ) {
421 INTupleItem* itm = it->indexItem();
422 const string& n = itm->name();
423 switch ( itm->type() ) {
425 desc = n + "/b";
426 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
427 break;
429 desc = n + "/s";
430 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
431 break;
433 desc = n + "/i";
434 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
435 break;
437 desc = n + "/l";
438 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
439 break;
441 desc = n + "/B";
442 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
443 break;
445 desc = n + "/S";
446 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
447 break;
449 desc = n + "/I";
450 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
451 break;
453 desc = n + "/L";
454 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
455 break;
456 default:
457 return makeError( "Column " + it->index() + " is not a valid index column!" );
458 }
459 branches[n] = b;
460 }
461 }
462 for ( item_no = 0; item_no < items.size(); ++item_no ) {
463 INTupleItem* it = items[item_no];
464 const string& n = it->name();
465 os << '{' << n << ';' << it->type() << ';' << it->length() << ';' << it->ndim() << ';' << it->hasIndex() << ';';
466 if ( it->hasIndex() ) {
467 os << it->index() << ';';
468 INTupleItem* itm = it->indexItem();
469 switch ( itm->type() ) {
471 putRange( os, dynamic_cast<NTuple::_Data<unsigned char>*>( itm ) );
472 break;
474 putRange( os, dynamic_cast<NTuple::_Data<unsigned short>*>( itm ) );
475 break;
477 putRange( os, dynamic_cast<NTuple::_Data<unsigned int>*>( itm ) );
478 break;
480 putRange( os, dynamic_cast<NTuple::_Data<unsigned long>*>( itm ) );
481 break;
483 putRange( os, dynamic_cast<NTuple::_Data<char>*>( itm ) );
484 break;
486 putRange( os, dynamic_cast<NTuple::_Data<short>*>( itm ) );
487 break;
489 putRange( os, dynamic_cast<NTuple::_Data<int>*>( itm ) );
490 break;
492 putRange( os, dynamic_cast<NTuple::_Data<long>*>( itm ) );
493 break;
494 default:
495 return makeError( "NTuple:" + pRegistry->name() + " Column " + it->index() +
496 " is not a valid index column!" );
497 }
498 }
499 for ( long k = 0; k < it->ndim(); k++ ) { os << it->dim( k ) << ';'; }
500 desc = n;
501 TClass* cl = nullptr;
502 switch ( it->type() ) {
504 desc = "/C";
505 os << 0 << ';' << 0 << ';';
506 break;
508 desc = "/C";
509 os << 0 << ';' << 0 << ';';
510 break;
512 if ( it->length() == 1 ) {
513 desc = System::typeinfoName( typeid( RootRef ) );
514 os << 0 << ';' << 0 << ';';
515 cl = TClass::GetClass( desc.c_str(), kTRUE );
516 }
517 break;
519 if ( it->length() == 1 ) {
520 os << 0 << ';' << 0 << ';';
521 cl = TClass::GetClass( it->typeID(), kTRUE );
522 }
523 break;
525 desc = "/b";
526 putRange( os, dynamic_cast<NTuple::_Data<unsigned char>*>( it ) );
527 break;
529 desc = "/s";
530 putRange( os, dynamic_cast<NTuple::_Data<unsigned short>*>( it ) );
531 break;
533 desc = "/i";
534 putRange( os, dynamic_cast<NTuple::_Data<unsigned int>*>( it ) );
535 break;
537 desc = "/l";
538 putRange( os, dynamic_cast<NTuple::_Data<unsigned long>*>( it ) );
539 break;
541 desc = "/B";
542 putRange( os, dynamic_cast<NTuple::_Data<char>*>( it ) );
543 break;
545 desc = "/S";
546 putRange( os, dynamic_cast<NTuple::_Data<short>*>( it ) );
547 break;
549 desc = "/I";
550 putRange( os, dynamic_cast<NTuple::_Data<int>*>( it ) );
551 break;
553 desc = "/L";
554 putRange( os, dynamic_cast<NTuple::_Data<long>*>( it ) );
555 break;
557 desc = "/b";
558 putRange( os, dynamic_cast<NTuple::_Data<bool>*>( it ) );
559 break;
561 desc = "/F";
562 putRange( os, dynamic_cast<NTuple::_Data<float>*>( it ) );
563 break;
565 desc = "/D";
566 putRange( os, dynamic_cast<NTuple::_Data<double>*>( it ) );
567 break;
569 default:
570 return makeError( "Create item[FAIL]: " + it->name() );
571 }
572 os << '}';
573 if ( branches.find( n ) == branches.end() ) {
574 string tmp;
575 char text[32];
576 switch ( it->ndim() ) {
577 case 0:
578 desc = n + desc;
579 break;
580 case 2:
581 snprintf( text, sizeof( text ), "[%ld]", it->dim( 0 ) );
582 tmp = text;
583 [[fallthrough]];
584 case 1:
585 if ( it->hasIndex() ) {
586 INTupleItem* itm = it->indexItem();
587 desc = n + tmp + "[" + itm->name() + "]" + desc;
588 } else {
589 snprintf( text, sizeof( text ), "[%ld]", it->dim( 0 ) );
590 desc = n + tmp + text + desc;
591 }
592 }
593 log() << MSG::DEBUG << "Create branch:" << n << " Desc:" << desc << " of type:" << it->type() << endmsg;
594 switch ( it->type() ) {
596 branches[n] = tree->Branch( n.c_str(), cl->GetName(), const_cast<void*>( it->buffer() ) );
597 break;
599 branches[n] = tree->Branch( n.c_str(), cl->GetName(), const_cast<void*>( it->buffer() ) );
600 break;
601 default:
602 branches[n] = tree->Branch( n.c_str(), const_cast<void*>( it->buffer() ), desc.c_str() );
603 break;
604 }
605 }
606 }
607
608 log() << MSG::DEBUG << "Save description:" << path << " -> " << cntName << endmsg << os.str() << endmsg;
609 status = saveDescription( path, cntName, os.str(), "", pObj->clID() );
610 if ( status.isSuccess() ) {
611 status = m_dbMgr->commitOutput( path, true );
612 if ( status.isSuccess() ) {
613 string spar[] = { path, cntName };
614 unsigned long ipar[] = { (unsigned long)con, ~0x0u };
615 status = m_dbMgr->createAddress( repSvcType(), pObj->clID(), spar, ipar, pAddr );
616 if ( status.isSuccess() ) {
617 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
618 if ( rpA ) {
619 ( (unsigned long*)rpA->ipar() )[0] = (unsigned long)con;
620 rpA->section = tree;
621 } else {
622 log() << MSG::ERROR << "cannot dynamic cast to RootAddress" << endmsg;
623 }
624
625 } else {
626 pAddr->release();
627 pAddr = nullptr;
628 }
629 }
630 }
631 return status;
632 }
633 }
634 return S_FAIL;
635}
#define S_OK
IRegistry * registry() const
Get pointer to Registry.
Definition DataObject.h:79
virtual const CLID & clID() const
Retrieve reference to class definition structure.
long repSvcType() const override
Retrieve the class type of the data store the converter uses.
StatusCode saveDescription(const std::string &path, const std::string &ident, const std::string &desc, const std::string &opt, const CLID &clid)
Save statistics object description.
std::vector< INTupleItem * > ItemContainer
Definition INTuple.h:93
virtual ItemContainer & items()=0
Access item container.
virtual const std::string & title() const =0
Object title.
virtual long ndim() const =0
Dimension.
virtual const void * buffer() const =0
Access data buffer (CONST)
virtual long dim(long i) const =0
Access individual dimensions.
virtual const std::string & index() const =0
Access the index _Item.
virtual const std::type_info & typeID() const =0
Compiler type ID.
virtual long type() const =0
Type information of the item.
virtual long length() const =0
Access the buffer length.
virtual INTupleItem * indexItem()=0
Pointer to index column (if present, 0 else)
virtual const std::string & name() const =0
Access _Item name.
virtual bool hasIndex() const =0
Is the tuple have an index item?
virtual const name_type & name() const =0
Name of the directory (or key)
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
@ ERROR
Definition IMessageSvc.h:22
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition System.cpp:260

◆ fillObjRefs()

StatusCode Gaudi::RootNTupleCnv::fillObjRefs ( IOpaqueAddress * ,
DataObject *  )
inlineoverride

Converter overrides: Update the references of an updated transient object.

Parameters
pAddress[IN] Valid pointer to the object's opaque address
pObject[IN] Valid pointer to DataObject
Returns
Status code indicating success or failure

Definition at line 104 of file RootNTupleCnv.h.

104 {
105 return StatusCode::SUCCESS;
106 }
constexpr static const auto SUCCESS
Definition StatusCode.h:99

◆ fillRepRefs()

StatusCode RootNTupleCnv::fillRepRefs ( IOpaqueAddress * pAdd,
DataObject * pObj )
override

Resolve the references of the converted object.

Parameters
pAdd[IN] Valid pointer to the object's opaque address
pObj[IN] Valid pointer to DataObject
Returns
Status code indicating success or failure

Definition at line 638 of file RootNTupleCnv.cpp.

638 {
639 typedef INTuple::ItemContainer Cont;
640 INTuple* tupl = dynamic_cast<INTuple*>( pObj );
641 IRegistry* pReg = pObj->registry();
642 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
643 if ( tupl && pReg && rpA ) {
644 string cntName = containerName( pReg );
645 unsigned long* ipar = const_cast<unsigned long*>( pAddr->ipar() );
646 RootDataConnection* con = reinterpret_cast<RootDataConnection*>( rpA->ipar()[0] );
647 if ( con ) {
648 TTree* tree = rpA->section;
649 if ( tree ) {
650 Cont& it = tupl->items();
651 size_t k, n = it.size();
652 vector<RootRef*> paddr( n );
653 vector<RootRef> addr( n );
654 for ( k = 0; k < n; ++k ) {
655 IOpaqueAddress* pA = nullptr;
656 Cont::value_type j = it[k];
657 switch ( j->type() ) {
659 pA = ( *(IOpaqueAddress**)j->buffer() );
660 paddr[k] = &addr[k];
661 addr[k].reset();
662 if ( pA ) {
663 con->makeRef( *pA->registry(), addr[k] );
664 addr[k].entry = pA->ipar()[1];
665 }
666 tree->SetBranchAddress( j->name().c_str(), &paddr[k] );
667 break;
668 default:
669 break;
670 }
671 }
672 int nb = tree->Fill();
673 if ( nb > 1 ) ++ipar[1];
674 for ( k = 0; k < n; ++k ) it[k]->reset();
676 }
677 return makeError( "fillRepRefs> Failed to access data tree:" + cntName );
678 }
679 return makeError( "fillRepRefs> Failed to access data source!" );
680 }
681 return makeError( "fillRepRefs> Invalid Tuple reference." );
682}
void makeRef(const IRegistry &pA, RootRef &ref)
Create reference object from registry entry.
virtual const unsigned long * ipar() const =0
Access to generic link parameters.
virtual IRegistry * registry() const =0
Update branch name.
constexpr static const auto FAILURE
Definition StatusCode.h:100

◆ i__updateObjRoot()

StatusCode RootNTupleCnv::i__updateObjRoot ( RootAddress * rpA,
INTuple * tupl,
TTree * tree,
RootDataConnection * con )
protected

Update the transient object: NTuples end here when reading records.

Definition at line 297 of file RootNTupleCnv.cpp.

297 {
298 typedef INTuple::ItemContainer Cont;
299 const string* par = rpA->par();
300 unsigned long* ipar = const_cast<unsigned long*>( rpA->ipar() );
301 ++ipar[1];
302 if ( Long64_t( ipar[1] ) <= tree->GetEntries() ) {
303 GenericAddress* pA = nullptr;
304 Cont& it = tupl->items();
305 size_t k, n = it.size();
306 vector<RootRef*> paddr( n );
307 vector<RootRef> addr( n );
308 for ( k = 0; k < n; ++k ) {
309 Cont::value_type j = it[k];
310 switch ( j->type() ) {
312 paddr[k] = &addr[k];
313 tree->SetBranchAddress( j->name().c_str(), &paddr[k] );
314 break;
315 default:
316 break;
317 }
318 }
319
320 ULong64_t last = tree->GetEntries();
321 ISelectStatement* sel = tupl->selector();
322 if ( sel ) {
323 string criteria = ( sel && ( sel->type() & ISelectStatement::STRING ) ) ? sel->criteria() : string( "" );
324 if ( !( criteria.length() == 0 || criteria == "*" ) ) {
325 if ( rpA->select == nullptr ) {
326 log() << MSG::DEBUG << "Selection criteria: " << criteria << " " << ipar[1] << endmsg;
327 rpA->select = new TTreeFormula( tree->GetName(), criteria.c_str(), tree );
328 }
329 rpA->select->SetTree( tree );
330 for ( ; ipar[1] < last; ++ipar[1] ) { // loop on all selected entries
331 tree->LoadTree( ipar[1] );
332 rpA->select->GetNdata();
333 if ( fabs( rpA->select->EvalInstance( 0 ) ) > std::numeric_limits<double>::epsilon() ) { break; }
334 log() << MSG::DEBUG << par[0] << "/" << par[1] << " SKIP Entry: " << ipar[1] << endmsg;
335 }
336 }
337 }
338 if ( ipar[1] < last ) {
339 unsigned long entry = ipar[1];
340 if ( tree->GetEntry( entry ) > 1 ) {
341 RootRef* r = nullptr;
342 string* spar = nullptr;
343 for ( k = 0; k < n; ++k ) {
344 Cont::value_type j = it[k];
345 switch ( j->type() ) {
347 r = paddr[k];
348 pA = ( *(GenericAddress**)j->buffer() );
349 if ( pA ) { // Fill only if item is connected!
350 spar = const_cast<string*>( pA->par() );
351 ipar = const_cast<unsigned long*>( pA->ipar() );
352 log() << MSG::DEBUG;
353 pair<const RootRef*, const RootDataConnection::ContainerSection*> ls =
354 con->getMergeSection( tree->GetName(), entry );
355 if ( ls.first ) {
356 if ( ls.first->dbase >= 0 ) {
357 // Now patch the references and links 'en block' to be efficient
358 // First the leafs from the TES
359
360 r->dbase += ls.first->dbase;
361 r->container += ls.first->container;
362 r->link += ls.first->link;
363
364 if ( log().isActive() ) {
365 log() << "Refs: LS [" << entry << "] -> " << ls.first->dbase << "," << ls.first->container << ","
366 << ls.first->link << "," << ls.first->entry << " DB:" << con->getDb( r->dbase ) << endmsg;
367 }
368 }
369 }
370 spar[0] = con->getDb( r->dbase );
371 spar[1] = con->getCont( r->container );
372 spar[2] = con->getLink( r->link );
373 ipar[0] = 0;
374 ipar[1] = r->entry;
375 pA->setClID( r->clid );
376 pA->setSvcType( r->svc );
377 break;
378 }
379 break;
380 default:
381 break;
382 }
383 }
384 return StatusCode::SUCCESS;
385 }
386 log() << MSG::ERROR << "Failed to read data from NTuple tree." << endmsg;
387 return StatusCode::FAILURE;
388 }
389 log() << MSG::INFO << "End of input Ntuple." << endmsg;
390 return StatusCode::FAILURE;
391 }
392 return StatusCode::FAILURE;
393}
TTreeFormula * select
Pointer to ROOT select statement (filled for N-tuples only)
Definition RootAddress.h:48
const std::string & getLink(int which) const
Access link name from saved index.
const std::string & getDb(int which) const
Access database/file name from saved index.
std::pair< const RootRef *, const ContainerSection * > getMergeSection(std::string_view container, int entry) const
Access link section for single container and entry.
const std::string & getCont(int which) const
Access container name from saved index.
void setClID(const CLID &clid)
Access : Set class ID of the link.
const std::string * par() const override
Retrieve string parameters.
void setSvcType(long typ)
Access : set the storage type of the class id.
virtual ISelectStatement * selector()=0
Access selector.
@ INFO
Definition IMessageSvc.h:22
int dbase
Data members to define object location in the persistent world.
Definition RootRefs.h:41

◆ updateObj()

StatusCode RootNTupleCnv::updateObj ( IOpaqueAddress * pAddress,
DataObject * pObject )
override

Update the transient object: NTuples end here when reading records.

Parameters
pAddress[IN] Valid pointer to the object's opaque address
pObject[IN] Valid pointer to DataObject
Returns
Status code indicating success or failure

Definition at line 278 of file RootNTupleCnv.cpp.

278 {
279 INTuple* tupl = dynamic_cast<INTuple*>( pObj );
280 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
281 if ( !tupl || !rpA ) return makeError( "updateObj> Invalid Tuple reference." );
282 RootDataConnection* con = reinterpret_cast<RootDataConnection*>( rpA->ipar()[0] );
283 if ( !con ) return makeError( "updateObj> Failed to access data source!" );
284 TTree* tree = rpA->section;
285 if ( !tree ) return makeError( "Failed to access data tree:" + pAddr->par()[1] );
286 con->resetAge();
287 if ( con->tool()->refs() ) return i__updateObjRoot( rpA, tupl, tree, con );
288#ifdef __POOL_COMPATIBILITY
289 // POOL compatibility mode:
290 return i__updateObjPool( rpA, tupl, tree, con );
291#else
292 return makeError( "Failed to access reference branch for data tree:" + rpA->par()[1] );
293#endif
294}
void resetAge()
Reset age.
Tool * tool() const
Access tool.
StatusCode i__updateObjRoot(RootAddress *rpA, INTuple *tupl, TTree *tree, RootDataConnection *con)
Update the transient object: NTuples end here when reading records.

◆ updateObjRefs()

StatusCode Gaudi::RootNTupleCnv::updateObjRefs ( IOpaqueAddress * ,
DataObject *  )
inlineoverride

Converter overrides: Update the references of an updated transient object.

Parameters
pAddress[IN] Valid pointer to the object's opaque address
pObject[IN] Valid pointer to DataObject
Returns
Status code indicating success or failure

Definition at line 125 of file RootNTupleCnv.h.

125 {
126 return StatusCode::SUCCESS;
127 }

◆ updateRep()

StatusCode Gaudi::RootNTupleCnv::updateRep ( IOpaqueAddress * ,
DataObject *  )
inlineoverride

Converter overrides: Update the converted representation of a transient object.

Parameters
pAddress[IN] Valid pointer to the object's opaque address
pObject[IN] Valid pointer to DataObject
Returns
Status code indicating success or failure

Definition at line 137 of file RootNTupleCnv.h.

137 {
138 return StatusCode::SUCCESS;
139 }

◆ updateRepRefs()

StatusCode Gaudi::RootNTupleCnv::updateRepRefs ( IOpaqueAddress * ,
DataObject *  )
inlineoverride

Converter overrides: Update the converted representation of a transient object.

Parameters
pAddress[IN] Valid pointer to the object's opaque address
pObject[IN] Valid pointer to DataObject
Returns
Status code indicating success or failure

Definition at line 149 of file RootNTupleCnv.h.

149 {
150 return StatusCode::SUCCESS;
151 }

The documentation for this class was generated from the following files: