The Gaudi Framework  master (ff829712)
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 124 of file RootNTupleCnv.cpp.

124 {
125 StatusCode status = S_FAIL;
126 RootDataConnection* con = nullptr;
127 IRegistry* pRegistry = pAddr->registry();
128 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
129 string path = fileName( pRegistry );
130 string cntName = containerName( pRegistry );
131 string* par = const_cast<string*>( pAddr->par() );
132 status = m_dbMgr->connectDatabase( path, IDataConnection::READ, &con );
133 if ( status.isSuccess() ) {
134 string par_val, par_guid;
135 TBranch* b = con->getBranch( "##Descriptors", "GaudiStatisticsDescription" );
136 if ( b ) {
137 RootNTupleDescriptor* ptr;
138 std::unique_ptr<RootNTupleDescriptor> dsc( ptr = new RootNTupleDescriptor() );
139 b->SetAddress( &ptr );
140 for ( Long64_t i = 0, nent = b->GetEntries(); i < nent; ++i ) {
141 int nb = b->GetEntry( i );
142 if ( nb > 1 ) {
143 if ( ptr->container == cntName ) {
144 par_val = ptr->description;
145 break;
146 }
147 }
148 }
149 }
150 par[2] = _tr( cntName );
151 TTree* tree = con->getSection( par[2] );
152 if ( nullptr == tree ) { return makeError( "Failed to access N-Tuple tree:" + cntName ); }
153 if ( !par_val.empty() ) {
154 auto ntupleSvc = dataProvider().as<INTupleSvc>();
155 if ( ntupleSvc ) {
156 char c;
157 CLID clid;
158 int siz, typ;
159 string title;
160 NTuple::Tuple* nt = nullptr;
161 istringstream is( par_val );
162 getline( is, title, ';' ) >> clid >> c >> siz >> c;
163 status = ntupleSvc->create( clid, title, nt );
164 for ( int j = 0; j < siz && status.isSuccess(); j++ ) {
165 is >> c;
166 getline( is, title, ';' ) >> typ >> c;
167 switch ( typ ) {
169 status = createItem( tree, nt, is, title, true, (unsigned char)0 );
170 break;
172 status = createItem( tree, nt, is, title, true, (unsigned short)0 );
173 break;
175 status = createItem( tree, nt, is, title, true, 0u );
176 break;
178 status = createItem( tree, nt, is, title, true, 0ul );
179 break;
181 status = createItem( tree, nt, is, title, true, char( 0 ) );
182 break;
184 status = createItem( tree, nt, is, title, true, short( 0 ) );
185 break;
187 status = createItem( tree, nt, is, title, true, 0 );
188 break;
190 status = createItem( tree, nt, is, title, true, 0l );
191 break;
193 status = createItem( tree, nt, is, title, true, false );
194 break;
196 status = createItem( tree, nt, is, title, true, 0.f );
197 break;
199 status = createItem( tree, nt, is, title, true, 0. );
200 break;
201 /*
202 case DataTypeInfo::NTCHAR:
203 case DataTypeInfo::LONG_NTCHAR:
204 status =
205 createItem(tree, nt, is, title, true, (char*)0);
206 break;
207 case DataTypeInfo::STRING:
208 case DataTypeInfo::LONG_STRING:
209 status =
210 createItem(tree, nt, is, title, true, string(""));
211 break;
212 */
214 status = createItem( tree, nt, is, title, false, static_cast<IOpaqueAddress*>( nullptr ) );
215 break;
217 status = createItem( tree, nt, is, title, true, static_cast<void*>( nullptr ) );
218 break;
220 default:
221 status = S_FAIL;
222 break;
223 }
224 if ( !status.isSuccess() ) {
225 log() << MSG::FATAL << "Error connecting (Unknown) column:" << j << endmsg << par_val << endmsg;
226 return makeError( "createObj[NTuple]> Cannot determine column!" );
227 }
228 }
229 if ( status.isSuccess() && rpA ) {
230 unsigned long* ipar = const_cast<unsigned long*>( rpA->ipar() );
231 log() << MSG::DEBUG << "Created N-tuple with description:" << par_val << endl;
232 ipar[0] = reinterpret_cast<uintptr_t>( con );
233 ipar[1] = ~0x0UL;
234 rpA->section = tree;
235 refpObject = nt;
236 } else {
237 refpObject = nullptr;
238 if ( nt ) nt->release();
239 }
240 }
241 }
242 }
243 return status;
244}
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 365 of file RootNTupleCnv.cpp.

365 {
366 IRegistry* pRegistry = pObj->registry();
367 if ( pRegistry ) {
368 pAddr = pRegistry->address();
369 if ( pAddr ) return S_OK;
370
371 RootDataConnection* con = nullptr;
372 string path = fileName( pRegistry );
373 string cntName = containerName( pRegistry );
374 string secName = cntName;
375 const INTuple* nt = dynamic_cast<const INTuple*>( pObj );
376 StatusCode status = m_dbMgr->connectDatabase( path, IDataConnection::UPDATE, &con );
377 if ( !status.isSuccess() ) { return makeError( "Failed to access Tuple file:" + path ); }
378 TTree* tree = con->getSection( _tr( secName ), true );
379 if ( nullptr != nt ) {
380 const INTuple::ItemContainer& items = nt->items();
381 ostringstream os;
382 size_t item_no;
383 string desc;
384 os << nt->title() << ';' << pObj->clID() << ';' << items.size() << ';';
385 map<string, TBranch*> branches;
386 TBranch* b = nullptr;
387 for ( item_no = 0; item_no < items.size(); ++item_no ) {
388 INTupleItem* it = items[item_no];
389 if ( it->hasIndex() ) {
390 INTupleItem* itm = it->indexItem();
391 const string& n = itm->name();
392 switch ( itm->type() ) {
394 desc = n + "/b";
395 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
396 break;
398 desc = n + "/s";
399 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
400 break;
402 desc = n + "/i";
403 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
404 break;
406 desc = n + "/l";
407 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
408 break;
410 desc = n + "/B";
411 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
412 break;
414 desc = n + "/S";
415 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
416 break;
418 desc = n + "/I";
419 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
420 break;
422 desc = n + "/L";
423 b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
424 break;
425 default:
426 return makeError( "Column " + it->index() + " is not a valid index column!" );
427 }
428 branches[n] = b;
429 }
430 }
431 for ( item_no = 0; item_no < items.size(); ++item_no ) {
432 INTupleItem* it = items[item_no];
433 const string& n = it->name();
434 os << '{' << n << ';' << it->type() << ';' << it->length() << ';' << it->ndim() << ';' << it->hasIndex() << ';';
435 if ( it->hasIndex() ) {
436 os << it->index() << ';';
437 INTupleItem* itm = it->indexItem();
438 switch ( itm->type() ) {
440 putRange( os, dynamic_cast<NTuple::_Data<unsigned char>*>( itm ) );
441 break;
443 putRange( os, dynamic_cast<NTuple::_Data<unsigned short>*>( itm ) );
444 break;
446 putRange( os, dynamic_cast<NTuple::_Data<unsigned int>*>( itm ) );
447 break;
449 putRange( os, dynamic_cast<NTuple::_Data<unsigned long>*>( itm ) );
450 break;
452 putRange( os, dynamic_cast<NTuple::_Data<char>*>( itm ) );
453 break;
455 putRange( os, dynamic_cast<NTuple::_Data<short>*>( itm ) );
456 break;
458 putRange( os, dynamic_cast<NTuple::_Data<int>*>( itm ) );
459 break;
461 putRange( os, dynamic_cast<NTuple::_Data<long>*>( itm ) );
462 break;
463 default:
464 return makeError( "NTuple:" + pRegistry->name() + " Column " + it->index() +
465 " is not a valid index column!" );
466 }
467 }
468 for ( long k = 0; k < it->ndim(); k++ ) { os << it->dim( k ) << ';'; }
469 desc = n;
470 TClass* cl = nullptr;
471 switch ( it->type() ) {
473 desc = "/C";
474 os << 0 << ';' << 0 << ';';
475 break;
477 desc = "/C";
478 os << 0 << ';' << 0 << ';';
479 break;
481 if ( it->length() == 1 ) {
482 desc = System::typeinfoName( typeid( RootRef ) );
483 os << 0 << ';' << 0 << ';';
484 cl = TClass::GetClass( desc.c_str(), kTRUE );
485 }
486 break;
488 if ( it->length() == 1 ) {
489 os << 0 << ';' << 0 << ';';
490 cl = TClass::GetClass( it->typeID(), kTRUE );
491 }
492 break;
494 desc = "/b";
495 putRange( os, dynamic_cast<NTuple::_Data<unsigned char>*>( it ) );
496 break;
498 desc = "/s";
499 putRange( os, dynamic_cast<NTuple::_Data<unsigned short>*>( it ) );
500 break;
502 desc = "/i";
503 putRange( os, dynamic_cast<NTuple::_Data<unsigned int>*>( it ) );
504 break;
506 desc = "/l";
507 putRange( os, dynamic_cast<NTuple::_Data<unsigned long>*>( it ) );
508 break;
510 desc = "/B";
511 putRange( os, dynamic_cast<NTuple::_Data<char>*>( it ) );
512 break;
514 desc = "/S";
515 putRange( os, dynamic_cast<NTuple::_Data<short>*>( it ) );
516 break;
518 desc = "/I";
519 putRange( os, dynamic_cast<NTuple::_Data<int>*>( it ) );
520 break;
522 desc = "/L";
523 putRange( os, dynamic_cast<NTuple::_Data<long>*>( it ) );
524 break;
526 desc = "/b";
527 putRange( os, dynamic_cast<NTuple::_Data<bool>*>( it ) );
528 break;
530 desc = "/F";
531 putRange( os, dynamic_cast<NTuple::_Data<float>*>( it ) );
532 break;
534 desc = "/D";
535 putRange( os, dynamic_cast<NTuple::_Data<double>*>( it ) );
536 break;
538 default:
539 return makeError( "Create item[FAIL]: " + it->name() );
540 }
541 os << '}';
542 if ( branches.find( n ) == branches.end() ) {
543 string tmp;
544 char text[32];
545 switch ( it->ndim() ) {
546 case 0:
547 desc = n + desc;
548 break;
549 case 2:
550 sprintf( text, "[%ld]", it->dim( 0 ) );
551 tmp = text;
552 [[fallthrough]];
553 case 1:
554 if ( it->hasIndex() ) {
555 INTupleItem* itm = it->indexItem();
556 desc = n + tmp + "[" + itm->name() + "]" + desc;
557 } else {
558 sprintf( text, "[%ld]", it->dim( 0 ) );
559 desc = n + tmp + text + desc;
560 }
561 }
562 log() << MSG::DEBUG << "Create branch:" << n << " Desc:" << desc << " of type:" << it->type() << endmsg;
563 switch ( it->type() ) {
565 branches[n] = tree->Branch( n.c_str(), cl->GetName(), const_cast<void*>( it->buffer() ) );
566 break;
568 branches[n] = tree->Branch( n.c_str(), cl->GetName(), const_cast<void*>( it->buffer() ) );
569 break;
570 default:
571 branches[n] = tree->Branch( n.c_str(), const_cast<void*>( it->buffer() ), desc.c_str() );
572 break;
573 }
574 }
575 }
576
577 log() << MSG::DEBUG << "Save description:" << path << " -> " << cntName << endmsg << os.str() << endmsg;
578 status = saveDescription( path, cntName, os.str(), "", pObj->clID() );
579 if ( status.isSuccess() ) {
580 status = m_dbMgr->commitOutput( path, true );
581 if ( status.isSuccess() ) {
582 string spar[] = { path, cntName };
583 unsigned long ipar[] = { (unsigned long)con, ~0x0u };
584 status = m_dbMgr->createAddress( repSvcType(), pObj->clID(), spar, ipar, pAddr );
585 if ( status.isSuccess() ) {
586 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
587 if ( rpA ) {
588 ( (unsigned long*)rpA->ipar() )[0] = (unsigned long)con;
589 rpA->section = tree;
590 } else {
591 log() << MSG::ERROR << "cannot dynamic cast to RootAddress" << endmsg;
592 }
593
594 } else {
595 pAddr->release();
596 pAddr = nullptr;
597 }
598 }
599 }
600 return status;
601 }
602 }
603 return S_FAIL;
604}
#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 607 of file RootNTupleCnv.cpp.

607 {
608 typedef INTuple::ItemContainer Cont;
609 INTuple* tupl = dynamic_cast<INTuple*>( pObj );
610 IRegistry* pReg = pObj->registry();
611 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
612 if ( tupl && pReg && rpA ) {
613 string cntName = containerName( pReg );
614 unsigned long* ipar = const_cast<unsigned long*>( pAddr->ipar() );
615 RootDataConnection* con = reinterpret_cast<RootDataConnection*>( rpA->ipar()[0] );
616 if ( con ) {
617 TTree* tree = rpA->section;
618 if ( tree ) {
619 Cont& it = tupl->items();
620 size_t k, n = it.size();
621 vector<RootRef*> paddr( n );
622 vector<RootRef> addr( n );
623 for ( k = 0; k < n; ++k ) {
624 IOpaqueAddress* pA = nullptr;
625 Cont::value_type j = it[k];
626 switch ( j->type() ) {
628 pA = ( *(IOpaqueAddress**)j->buffer() );
629 paddr[k] = &addr[k];
630 addr[k].reset();
631 if ( pA ) {
632 con->makeRef( *pA->registry(), addr[k] );
633 addr[k].entry = pA->ipar()[1];
634 }
635 tree->SetBranchAddress( j->name().c_str(), &paddr[k] );
636 break;
637 default:
638 break;
639 }
640 }
641 int nb = tree->Fill();
642 if ( nb > 1 ) ++ipar[1];
643 for ( k = 0; k < n; ++k ) it[k]->reset();
645 }
646 return makeError( "fillRepRefs> Failed to access data tree:" + cntName );
647 }
648 return makeError( "fillRepRefs> Failed to access data source!" );
649 }
650 return makeError( "fillRepRefs> Invalid Tuple reference." );
651}
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 266 of file RootNTupleCnv.cpp.

266 {
267 typedef INTuple::ItemContainer Cont;
268 const string* par = rpA->par();
269 unsigned long* ipar = const_cast<unsigned long*>( rpA->ipar() );
270 ++ipar[1];
271 if ( Long64_t( ipar[1] ) <= tree->GetEntries() ) {
272 GenericAddress* pA = nullptr;
273 Cont& it = tupl->items();
274 size_t k, n = it.size();
275 vector<RootRef*> paddr( n );
276 vector<RootRef> addr( n );
277 for ( k = 0; k < n; ++k ) {
278 Cont::value_type j = it[k];
279 switch ( j->type() ) {
281 paddr[k] = &addr[k];
282 tree->SetBranchAddress( j->name().c_str(), &paddr[k] );
283 break;
284 default:
285 break;
286 }
287 }
288
289 ULong64_t last = tree->GetEntries();
290 ISelectStatement* sel = tupl->selector();
291 if ( sel ) {
292 string criteria = ( sel && ( sel->type() & ISelectStatement::STRING ) ) ? sel->criteria() : string( "" );
293 if ( !( criteria.length() == 0 || criteria == "*" ) ) {
294 if ( rpA->select == nullptr ) {
295 log() << MSG::DEBUG << "Selection criteria: " << criteria << " " << ipar[1] << endmsg;
296 rpA->select = new TTreeFormula( tree->GetName(), criteria.c_str(), tree );
297 }
298 rpA->select->SetTree( tree );
299 for ( ; ipar[1] < last; ++ipar[1] ) { // loop on all selected entries
300 tree->LoadTree( ipar[1] );
301 rpA->select->GetNdata();
302 if ( fabs( rpA->select->EvalInstance( 0 ) ) > std::numeric_limits<double>::epsilon() ) { break; }
303 log() << MSG::DEBUG << par[0] << "/" << par[1] << " SKIP Entry: " << ipar[1] << endmsg;
304 }
305 }
306 }
307 if ( ipar[1] < last ) {
308 unsigned long entry = ipar[1];
309 if ( tree->GetEntry( entry ) > 1 ) {
310 RootRef* r = nullptr;
311 string* spar = nullptr;
312 for ( k = 0; k < n; ++k ) {
313 Cont::value_type j = it[k];
314 switch ( j->type() ) {
316 r = paddr[k];
317 pA = ( *(GenericAddress**)j->buffer() );
318 if ( pA ) { // Fill only if item is connected!
319 spar = (string*)pA->par();
320 ipar = (unsigned long*)pA->ipar();
321 log() << MSG::DEBUG;
322 pair<const RootRef*, const RootDataConnection::ContainerSection*> ls =
323 con->getMergeSection( tree->GetName(), entry );
324 if ( ls.first ) {
325 if ( ls.first->dbase >= 0 ) {
326 // Now patch the references and links 'en block' to be efficient
327 // First the leafs from the TES
328
329 r->dbase += ls.first->dbase;
330 r->container += ls.first->container;
331 r->link += ls.first->link;
332
333 if ( log().isActive() ) {
334 log() << "Refs: LS [" << entry << "] -> " << ls.first->dbase << "," << ls.first->container << ","
335 << ls.first->link << "," << ls.first->entry << " DB:" << con->getDb( r->dbase ) << endmsg;
336 }
337 }
338 }
339 spar[0] = con->getDb( r->dbase );
340 spar[1] = con->getCont( r->container );
341 spar[2] = con->getLink( r->link );
342 ipar[0] = 0;
343 ipar[1] = r->entry;
344 pA->setClID( r->clid );
345 pA->setSvcType( r->svc );
346 break;
347 }
348 break;
349 default:
350 break;
351 }
352 }
353 return StatusCode::SUCCESS;
354 }
355 log() << MSG::ERROR << "Failed to read data from NTuple tree." << endmsg;
356 return StatusCode::FAILURE;
357 }
358 log() << MSG::INFO << "End of input Ntuple." << endmsg;
359 return StatusCode::FAILURE;
360 }
361 return StatusCode::FAILURE;
362}
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 247 of file RootNTupleCnv.cpp.

247 {
248 INTuple* tupl = dynamic_cast<INTuple*>( pObj );
249 RootAddress* rpA = dynamic_cast<RootAddress*>( pAddr );
250 if ( !tupl || !rpA ) return makeError( "updateObj> Invalid Tuple reference." );
251 RootDataConnection* con = reinterpret_cast<RootDataConnection*>( rpA->ipar()[0] );
252 if ( !con ) return makeError( "updateObj> Failed to access data source!" );
253 TTree* tree = rpA->section;
254 if ( !tree ) return makeError( "Failed to access data tree:" + pAddr->par()[1] );
255 con->resetAge();
256 if ( con->tool()->refs() ) return i__updateObjRoot( rpA, tupl, tree, con );
257#ifdef __POOL_COMPATIBILITY
258 // POOL compatibility mode:
259 return i__updateObjPool( rpA, tupl, tree, con );
260#else
261 return makeError( "Failed to access reference branch for data tree:" + rpA->par()[1] );
262#endif
263}
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: