The Gaudi Framework  master (da3d77e1)
Gaudi::RootNTupleCnv Class Reference

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

Protected Member Functions

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

Additional Inherited Members

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

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 45 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 64 of file RootNTupleCnv.h.

65  : RootStatCnv( typ, clid, svc, mgr ) {}

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() );
133  if ( status.isSuccess() ) {
134  string par_val, par_guid;
135  TBranch* b = con->getBranch( "##Descriptors", "GaudiStatisticsDescription" );
136  if ( b ) {
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 ) {
168  case DataTypeInfo::UCHAR:
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;
174  case DataTypeInfo::UINT:
175  status = createItem( tree, nt, is, title, true, 0u );
176  break;
177  case DataTypeInfo::ULONG:
178  status = createItem( tree, nt, is, title, true, 0ul );
179  break;
180  case DataTypeInfo::CHAR:
181  status = createItem( tree, nt, is, title, true, char( 0 ) );
182  break;
183  case DataTypeInfo::SHORT:
184  status = createItem( tree, nt, is, title, true, short( 0 ) );
185  break;
186  case DataTypeInfo::INT:
187  status = createItem( tree, nt, is, title, true, 0 );
188  break;
189  case DataTypeInfo::LONG:
190  status = createItem( tree, nt, is, title, true, 0l );
191  break;
192  case DataTypeInfo::BOOL:
193  status = createItem( tree, nt, is, title, true, false );
194  break;
195  case DataTypeInfo::FLOAT:
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 }

◆ 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 );
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() ) {
393  case DataTypeInfo::UCHAR:
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;
401  case DataTypeInfo::UINT:
402  desc = n + "/i";
403  b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
404  break;
405  case DataTypeInfo::ULONG:
406  desc = n + "/l";
407  b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
408  break;
409  case DataTypeInfo::CHAR:
410  desc = n + "/B";
411  b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
412  break;
413  case DataTypeInfo::SHORT:
414  desc = n + "/S";
415  b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
416  break;
417  case DataTypeInfo::INT:
418  desc = n + "/I";
419  b = tree->Branch( n.c_str(), const_cast<void*>( itm->buffer() ), desc.c_str() );
420  break;
421  case DataTypeInfo::LONG:
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() ) {
439  case DataTypeInfo::UCHAR:
440  putRange( os, dynamic_cast<NTuple::_Data<unsigned char>*>( itm ) );
441  break;
443  putRange( os, dynamic_cast<NTuple::_Data<unsigned short>*>( itm ) );
444  break;
445  case DataTypeInfo::UINT:
446  putRange( os, dynamic_cast<NTuple::_Data<unsigned int>*>( itm ) );
447  break;
448  case DataTypeInfo::ULONG:
449  putRange( os, dynamic_cast<NTuple::_Data<unsigned long>*>( itm ) );
450  break;
451  case DataTypeInfo::CHAR:
452  putRange( os, dynamic_cast<NTuple::_Data<char>*>( itm ) );
453  break;
454  case DataTypeInfo::SHORT:
455  putRange( os, dynamic_cast<NTuple::_Data<short>*>( itm ) );
456  break;
457  case DataTypeInfo::INT:
458  putRange( os, dynamic_cast<NTuple::_Data<int>*>( itm ) );
459  break;
460  case DataTypeInfo::LONG:
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;
493  case DataTypeInfo::UCHAR:
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;
501  case DataTypeInfo::UINT:
502  desc = "/i";
503  putRange( os, dynamic_cast<NTuple::_Data<unsigned int>*>( it ) );
504  break;
505  case DataTypeInfo::ULONG:
506  desc = "/l";
507  putRange( os, dynamic_cast<NTuple::_Data<unsigned long>*>( it ) );
508  break;
509  case DataTypeInfo::CHAR:
510  desc = "/B";
511  putRange( os, dynamic_cast<NTuple::_Data<char>*>( it ) );
512  break;
513  case DataTypeInfo::SHORT:
514  desc = "/S";
515  putRange( os, dynamic_cast<NTuple::_Data<short>*>( it ) );
516  break;
517  case DataTypeInfo::INT:
518  desc = "/I";
519  putRange( os, dynamic_cast<NTuple::_Data<int>*>( it ) );
520  break;
521  case DataTypeInfo::LONG:
522  desc = "/L";
523  putRange( os, dynamic_cast<NTuple::_Data<long>*>( it ) );
524  break;
525  case DataTypeInfo::BOOL:
526  desc = "/b";
527  putRange( os, dynamic_cast<NTuple::_Data<bool>*>( it ) );
528  break;
529  case DataTypeInfo::FLOAT:
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 }

◆ 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 105 of file RootNTupleCnv.h.

105  {
106  return StatusCode::SUCCESS;
107  }

◆ 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();
644  return nb > 1 ? StatusCode::SUCCESS : StatusCode::FAILURE;
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 }

◆ 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;
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 }

◆ 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 }

◆ 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 126 of file RootNTupleCnv.h.

126  {
127  return StatusCode::SUCCESS;
128  }

◆ 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 138 of file RootNTupleCnv.h.

138  {
139  return StatusCode::SUCCESS;
140  }

◆ 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 150 of file RootNTupleCnv.h.

150  {
151  return StatusCode::SUCCESS;
152  }

The documentation for this class was generated from the following files:
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
Converter::dataProvider
SmartIF< IDataProviderSvc > & dataProvider() const override
Get Data provider service.
Definition: Converter.cpp:78
INTupleItem::type
virtual long type() const =0
Type information of the item.
std::string
STL class.
INTupleItem::index
virtual const std::string & index() const =0
Access the index _Item.
DataTypeInfo::STRING
@ STRING
Definition: DataTypeInfo.h:46
INTupleItem::length
virtual long length() const =0
Access the buffer length.
std::fabs
T fabs(T... args)
Gaudi::RootAddress::select
TTreeFormula * select
Pointer to ROOT select statement (filled for N-tuples only)
Definition: RootAddress.h:49
AtlasMCRecoFullPrecedenceDump.path
path
Definition: AtlasMCRecoFullPrecedenceDump.py:49
Gaudi::RootRef::clid
int clid
Definition: RootRefs.h:42
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
MSG::INFO
@ INFO
Definition: IMessageSvc.h:25
Gaudi::RootCnvSvc::connectDatabase
StatusCode connectDatabase(const std::string &dataset, int mode, RootDataConnection **con)
Connect the output file to the service with open mode.
Definition: RootCnvSvc.cpp:210
Gaudi::RootConverter::m_dbMgr
RootCnvSvc * m_dbMgr
Conversion service needed for proper operation to forward requests.
Definition: RootConverter.h:45
std::pair
Gaudi::RootNTupleDescriptor
Definition: RootRefs.h:87
IOpaqueAddress
Definition: IOpaqueAddress.h:33
std::vector
STL class.
std::map::find
T find(T... args)
std::vector::size
T size(T... args)
DataObject::release
virtual unsigned long release()
release reference to object
Definition: DataObject.cpp:56
Gaudi::RootDataConnection::getLink
const std::string & getLink(int which) const
Access link name from saved index.
Definition: RootDataConnection.h:351
DataTypeInfo::NTCHAR
@ NTCHAR
Definition: DataTypeInfo.h:47
Gaudi::RootRef::dbase
int dbase
Data members to define object location in the persistent world.
Definition: RootRefs.h:42
GenericAddress::setSvcType
void setSvcType(long typ)
Access : set the storage type of the class id.
Definition: GenericAddress.h:87
Gaudi::IDataConnection::resetAge
void resetAge()
Reset age.
Definition: IIODataManager.h:71
DataTypeInfo::POINTER
@ POINTER
Definition: DataTypeInfo.h:50
std::istringstream
STL class.
ISelectStatement
Definition: ISelectStatement.h:42
INTupleItem::ndim
virtual long ndim() const =0
Dimension.
INTupleItem::typeID
virtual const std::type_info & typeID() const =0
Compiler type ID.
Gaudi::RootDataConnection::tool
Tool * tool() const
Access tool.
Definition: RootDataConnection.h:270
gaudirun.c
c
Definition: gaudirun.py:525
IRegistry
Definition: IRegistry.h:32
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:315
Gaudi::RootAddress::section
TTree * section
Pointer to ROOT TTree (filled for N-tuples only)
Definition: RootAddress.h:51
DataTypeInfo::USHORT
@ USHORT
Definition: DataTypeInfo.h:36
S_FAIL
#define S_FAIL
Definition: RootNTupleCnv.cpp:44
Gaudi::RootDataConnection
Definition: RootDataConnection.h:112
DataTypeInfo::ULONG
@ ULONG
Definition: DataTypeInfo.h:38
compareOutputFiles.par
par
Definition: compareOutputFiles.py:477
GenericAddress::setClID
void setClID(const CLID &clid)
Access : Set class ID of the link.
Definition: GenericAddress.h:83
DataTypeInfo::LONG
@ LONG
Definition: DataTypeInfo.h:42
NTuple::_Data
Abstract class describing basic data in an Ntuple.
Definition: NTuple.h:48
DataTypeInfo::DOUBLE
@ DOUBLE
Definition: DataTypeInfo.h:45
INTuple::items
virtual ItemContainer & items()=0
Access item container.
INTupleItem::hasIndex
virtual bool hasIndex() const =0
Is the tuple have an index item?
Gaudi::RootRef::link
int link
Definition: RootRefs.h:42
GenericAddress
Definition: GenericAddress.h:30
IRegistry::name
virtual const name_type & name() const =0
Name of the directory (or key)
Gaudi::RootCnvSvc::createAddress
StatusCode createAddress(long svc_type, const CLID &clid, const std::string *par, const unsigned long *ip, IOpaqueAddress *&refpAddress) override
IAddressCreator implementation: Address creation.
Definition: RootCnvSvc.cpp:357
Gaudi::RootDataConnection::getDb
const std::string & getDb(int which) const
Access database/file name from saved index.
Definition: RootDataConnection.cpp:486
Gaudi::RootRef::svc
int svc
Definition: RootRefs.h:42
Gaudi::RootStatCnv::containerName
virtual const std::string containerName(IRegistry *pDir) const
Retrieve the name of the container a given object is placed into.
Definition: RootStatCnv.cpp:56
StatusCode
Definition: StatusCode.h:65
std::sprintf
T sprintf(T... args)
DataTypeInfo::SHORT
@ SHORT
Definition: DataTypeInfo.h:40
DataTypeInfo::UNKNOWN
@ UNKNOWN
Definition: DataTypeInfo.h:34
ProduceConsume.j
j
Definition: ProduceConsume.py:104
INTupleItem::buffer
virtual const void * buffer() const =0
Access data buffer (CONST)
Gaudi::RootStatCnv::saveDescription
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.
Definition: RootStatCnv.cpp:109
Gaudi::RootCnvSvc::commitOutput
StatusCode commitOutput(const std::string &outputFile, bool do_commit) override
Commit pending output.
Definition: RootCnvSvc.cpp:311
Gaudi::RootStatCnv::makeError
StatusCode makeError(const std::string &msg, bool throw_exception=false) const
Helper method to issue error messages.
Definition: RootStatCnv.cpp:97
std::string::c_str
T c_str(T... args)
Gaudi::RootDataConnection::getCont
const std::string & getCont(int which) const
Access container name from saved index.
Definition: RootDataConnection.h:346
Gaudi::IDataConnection::UPDATE
@ UPDATE
Definition: IIODataManager.h:49
Gaudi::IDataConnection::READ
@ READ
Definition: IIODataManager.h:49
Gaudi::RootNTupleDescriptor::description
std::string description
Description string.
Definition: RootRefs.h:89
Gaudi::RootRef::container
int container
Definition: RootRefs.h:42
Gaudi::RootRef
Definition: RootRefs.h:40
INTuple
Definition: INTuple.h:91
Gaudi::RootConverter::repSvcType
long repSvcType() const override
Retrieve the class type of the data store the converter uses.
Definition: RootConverter.h:59
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
std::uintptr_t
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
Gaudi::RootDataConnection::makeRef
void makeRef(const IRegistry &pA, RootRef &ref)
Create reference object from registry entry.
Definition: RootDataConnection.cpp:646
Gaudi::RootStatCnv::RootStatCnv
RootStatCnv(long typ, const CLID &clid, ISvcLocator *svc, RootCnvSvc *mgr)
Initializing Constructor.
Definition: RootStatCnv.cpp:34
std::map
STL class.
INTupleItem
Definition: INTuple.h:37
IOpaqueAddress::registry
virtual IRegistry * registry() const =0
Update branch name.
MSG::FATAL
@ FATAL
Definition: IMessageSvc.h:25
Gaudi::RootRef::entry
int entry
Definition: RootRefs.h:42
IOTest.sel
sel
Definition: IOTest.py:106
INTupleItem::dim
virtual long dim(long i) const =0
Access individual dimensions.
cpluginsvc.n
n
Definition: cpluginsvc.py:234
DataTypeInfo::FLOAT
@ FLOAT
Definition: DataTypeInfo.h:44
Gaudi::RootStatCnv::log
MsgStream & log() const
Helper to use mesage logger.
Definition: RootStatCnv.h:48
INTuple::selector
virtual ISelectStatement * selector()=0
Access selector.
SmartIF::as
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition: SmartIF.h:117
std::ostringstream
STL class.
IRegistry::address
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
DataTypeInfo::UCHAR
@ UCHAR
Definition: DataTypeInfo.h:35
DataTypeInfo::UINT
@ UINT
Definition: DataTypeInfo.h:37
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
std::endl
T endl(T... args)
Gaudi::RootDataConnection::Tool::refs
TTree * refs() const
Definition: RootDataConnection.h:226
DataTypeInfo::BOOL
@ BOOL
Definition: DataTypeInfo.h:43
gaudirun.l
dictionary l
Definition: gaudirun.py:583
S_OK
#define S_OK
Definition: RootNTupleCnv.cpp:43
NTuple::Tuple
Abstract base class which allows the user to interact with the actual N tuple implementation.
Definition: NTuple.h:388
std::getline
T getline(T... args)
Gaudi::RootDataConnection::getSection
TTree * getSection(std::string_view sect, bool create=false)
Access TTree section from section name. The section is created if required.
Definition: RootDataConnection.cpp:387
GenericAddress::par
const std::string * par() const override
Retrieve string parameters.
Definition: GenericAddress.h:89
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:25
INTuple::title
virtual const std::string & title() const =0
Object title.
Gaudi::RootDataConnection::getMergeSection
std::pair< const RootRef *, const ContainerSection * > getMergeSection(std::string_view container, int entry) const
Access link section for single container and entry.
Definition: RootDataConnection.cpp:620
std::string::empty
T empty(T... args)
ISelectStatement::STRING
@ STRING
Definition: ISelectStatement.h:48
std::ostringstream::str
T str(T... args)
Gaudi::RootStatCnv::fileName
virtual const std::string fileName(IRegistry *pReg) const
Retrieve the name of the file a given object is placed into.
Definition: RootStatCnv.cpp:71
DataTypeInfo::OBJECT_ADDR
@ OBJECT_ADDR
Definition: DataTypeInfo.h:51
std::map::end
T end(T... args)
INTupleSvc
Definition: INTupleSvc.h:46
INTupleItem::name
virtual const std::string & name() const =0
Access _Item name.
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Gaudi::RootNTupleDescriptor::container
std::string container
Identifier of description.
Definition: RootRefs.h:93
Gaudi::RootDataConnection::getBranch
TBranch * getBranch(std::string_view section, std::string_view branch_name)
Access data branch by name: Get existing branch in read only mode.
Definition: RootDataConnection.h:326
DataObject::clID
virtual const CLID & clID() const
Retrieve reference to class definition structure.
Definition: DataObject.cpp:66
std::unique_ptr
STL class.
std::numeric_limits
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:78
GenericAddress::ipar
const unsigned long * ipar() const override
Retrieve integer parameters.
Definition: GenericAddress.h:91
DataTypeInfo::INT
@ INT
Definition: DataTypeInfo.h:41
Gaudi::RootNTupleCnv::i__updateObjRoot
StatusCode i__updateObjRoot(RootAddress *rpA, INTuple *tupl, TTree *tree, RootDataConnection *con)
Update the transient object: NTuples end here when reading records.
Definition: RootNTupleCnv.cpp:266
DataTypeInfo::CHAR
@ CHAR
Definition: DataTypeInfo.h:39
INTupleItem::indexItem
virtual INTupleItem * indexItem()=0
Pointer to index column (if present, 0 else)
IOpaqueAddress::ipar
virtual const unsigned long * ipar() const =0
Access to generic link parameters.
Gaudi::RootAddress
Definition: RootAddress.h:46