Gaudi Framework, version v22r4

Home   Generated: Fri Sep 2 2011
Public Member Functions | Protected Member Functions | Protected Attributes

PoolDbBaseCnv Class Reference

Description: Definition of the generic Db data converter. More...

#include <PoolDb/PoolDbBaseCnv.h>

Inheritance diagram for PoolDbBaseCnv:
Inheritance graph
[legend]
Collaboration diagram for PoolDbBaseCnv:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 PoolDbBaseCnv (long typ, const CLID &clid, ISvcLocator *svc)
 Initializing Constructor.
virtual ~PoolDbBaseCnv ()
 Standard Destructor.
virtual StatusCode initialize ()
 Converter overrides: Initialize the Db converter.
virtual StatusCode finalize ()
 Converter overrides: Finalize the Db data converter.
virtual long repSvcType () const
 Retrieve the class type of the data store the converter uses.
virtual StatusCode createObj (IOpaqueAddress *pAddr, DataObject *&refpObj)
 Converter overrides: Create transient object from persistent data.
virtual StatusCode fillObjRefs (IOpaqueAddress *pAddr, DataObject *pObj)
 Converter overrides: Resolve the references of the created transient object.
virtual StatusCode updateObj (IOpaqueAddress *pAddr, DataObject *pObj)
 Converter overrides: Update transient object from persistent data.
virtual StatusCode updateObjRefs (IOpaqueAddress *pAddr, DataObject *pObj)
 Converter overrides: Update the references of an updated transient object.
virtual StatusCode createRep (DataObject *pObj, IOpaqueAddress *&refpAddr)
 Converter overrides: Convert the transient object to the requested representation.
virtual StatusCode fillRepRefs (IOpaqueAddress *pAddr, DataObject *pObj)
 Converter overrides: Resolve the references of the converted object.
virtual StatusCode updateRep (IOpaqueAddress *pAddr, DataObject *pObj)
 Converter overrides: Update the converted representation of a transient object.
virtual StatusCode updateRepRefs (IOpaqueAddress *pAddr, DataObject *pObj)
 Converter overrides: Update the references of an already converted object.
virtual PoolDbLinkManagercreateReferences (DataObject *pObj)
virtual StatusCode setReferences (PoolDbLinkManager *pMgr, LinkManager *pLinks, DataObject *pObj, IRegistry *pReg)
 Set the references of a DataObject when reading.
virtual StatusCode dumpReferences (PoolDbLinkManager *pMgr, LinkManager *pLinks, DataObject *pObj, IRegistry *pReg)
 Dump the references of a DataObject after writing.

Protected Member Functions

StatusCode makeError (const std::string &msg, bool rethrow=true)
 Standard way to print errors.
virtual const std::string containerName (IRegistry *pReg) const
 Retrieve the name of the container a given object is placed into.

Protected Attributes

IPoolDbMgrm_dbMgr
 Services needed for proper operation: POOL database manager.
IDataManagerSvcm_dataMgr
 Services needed for proper operation: Gaudi datastore manager.
pool::Guid m_objGuid
 Object Guid.
ROOT::Reflex::Type m_class
 Reference to seal reflection class.
pool::DataCallBackm_call
 Definition callback.
std::set< std::stringm_badFiles
 Set with bad files/tables.

Detailed Description

Description: Definition of the generic Db data converter.

The generic data converter provides the infrastructure of all data converters. The templated class takes two arguments: The Transient and the Persistent object type.

For a detailed description of the overridden function see the the base class.

Author:
M.Frank
Version:
1.0

Definition at line 45 of file PoolDbBaseCnv.h.


Constructor & Destructor Documentation

PoolDbBaseCnv::PoolDbBaseCnv ( long  typ,
const CLID clid,
ISvcLocator svc 
)

Initializing Constructor.

Standard Constructor.

Parameters:
typ[IN] Concrete storage type of the converter
clid[IN] Class identifier of the object
svc[IN] Pointer to service locator object
Returns:
Reference to PoolDbBaseCnv object

Definition at line 255 of file PoolDbBaseCnv.cpp.

  : Converter(typ, clid, svc), m_dbMgr(0), m_dataMgr(0), 
    m_objGuid(pool::Guid::null()), m_call(0)
{
  s_count->increment();
  m_objGuid.Data1 = clid;
}
PoolDbBaseCnv::~PoolDbBaseCnv (  ) [virtual]

Standard Destructor.

Definition at line 264 of file PoolDbBaseCnv.cpp.


Member Function Documentation

const std::string PoolDbBaseCnv::containerName ( IRegistry pReg ) const [protected, virtual]

Retrieve the name of the container a given object is placed into.

Parameters:
pReg[IN] Pointer to registry entry.
Returns:
Name of the container the object should be put to.

Reimplemented in PoolDbDatabaseCnv, and PoolDbStatCnv.

Definition at line 353 of file PoolDbBaseCnv.cpp.

                                                        {
  if ( 0 != pRegistry )   {
    return pRegistry->identifier();
  }
  return "";
}
StatusCode PoolDbBaseCnv::createObj ( IOpaqueAddress pAddr,
DataObject *&  refpObj 
) [virtual]

Converter overrides: Create transient object from persistent data.

Db specific implementation: Create an empty transient object: Default: DataObject.

Parameters:
pAddr[IN] Pointer to object address.
refpObj[OUT] Location to pointer to store data object
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbDatabaseCnv, PoolDbDirectoryCnv, and PoolDbNTupleCnv.

Definition at line 500 of file PoolDbBaseCnv.cpp.

{
  try   {
    PoolDbAddress* pA = dynamic_cast<PoolDbAddress*>(pAddress);
    if ( pA )  {
      PoolDbObjectContext ctxt(this, pAddress->registry());
      pool::DataCallBack* call = m_call->clone();
      StatusCode sc = m_dbMgr->read(call, pA);
      if ( sc.isSuccess() )  {
        refpObject = (DataObject*)call->object();
        call->release();
        return StatusCode::SUCCESS;
      }
      call->release();
      std::string tag = pA->par()[0]+":"+pA->par()[1];
      if ( sc.getCode() == IPoolDbMgr::BAD_DATA_CONNECTION )  {
        if ( m_badFiles.find(tag) != m_badFiles.end() ) {
          return sc;  // Let's save us the additional printout
        }
        m_badFiles.insert(tag);
      }
      MsgStream log(msgSvc(),"PoolDbBaseCnv");
      log << MSG::ERROR << "createObj> Cannot access the object:"+tag << endmsg;
      return StatusCode::FAILURE;
    }
    return makeError("createObj> Invalid object address.", false);
  }
  catch (std::exception& e)  {
    return makeError(std::string("createObj> Caught exception:")+e.what(), false);
  }
  catch(...)  {
  }
  return makeError("createObj> Unknown exception occurred.", false);
}
PoolDbLinkManager * PoolDbBaseCnv::createReferences ( DataObject pObj ) [virtual]

Definition at line 448 of file PoolDbBaseCnv.cpp.

{
  typedef std::vector<IRegistry*> Leaves;
  PoolDbLinkManager* refs = new PoolDbLinkManager;
  Leaves leaves;
  StatusCode status = m_dataMgr->objectLeaves(pObj, leaves);
  if ( status.isSuccess() )  {
    for(Leaves::iterator i=leaves.begin(), iend=leaves.end(); i != iend; ++i)  {
      IRegistry* pR = *i;
      IOpaqueAddress* pA = pR->address();
      if ( 0 != pA )  {
        PoolDbAddress*  pdbA = dynamic_cast<PoolDbAddress*>(pA);
        if ( 0 != pdbA )  {
          pool::Token* tok = const_cast<pool::Token*>(pdbA->token());
          if ( tok )  {
            tok->addRef();
            refs->references().push_back(tok);
            refs->links().push_back(pR->name());
          }
          else  {
            // What should we do here ?
            // Not so clear...
          }
        }
        else  {
          const std::string*   spar = pA->par();
          const unsigned long* ipar = pA->ipar();
          pool::Guid guid(pool::Guid::null());
          guid.Data1 = pA->clID();
          pool::Token* tok = new pool::Token();
          tok->setClassID(guid);
          tok->setTechnology(pA->svcType());
          tok->setDb(spar[0]).setCont(spar[1]);
          tok->oid().first  = ipar[0];
          tok->oid().second = ipar[1];
          refs->references().push_back(tok);
          refs->links().push_back(pR->name());
        }
      }
      else    {
        // This is not really an error, it only means that the object
        // pointed to is not persistent. Hence, this link cannot be followed
        // from the data written.
      }
    }
  }
  return refs;
}
StatusCode PoolDbBaseCnv::createRep ( DataObject pObj,
IOpaqueAddress *&  refpAddr 
) [virtual]

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

Create persistent representation of the object.

Parameters:
pObj[IN] Pointer to data object
refpAddr[OUT] Location to store pointer to object address.
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbDirectoryCnv, and PoolDbNTupleCnv.

Definition at line 584 of file PoolDbBaseCnv.cpp.

{
  try   {
    refpA = 0;
    if ( pObj )  {
      IRegistry* pReg = pObj->registry();
      if ( pReg )  {
        PoolDbAddress* pA = 0;
        std::string cnt = containerName(pReg);
        PoolDbObjectContext ctxt(this, pObj->registry());
        pool::DataCallBack* call = m_call->clone();
        call->setObject(pObj);
        StatusCode sc = m_dbMgr->markWrite(call, cnt, &pA);
        if ( sc.isSuccess() )  {
          refpA = pA;
          return sc;
        }
      }
      return makeError("createRep> Invalid object registry entry.");
    }
    return makeError("createRep> Invalid object reference.");
  }
  catch (std::exception& e)  {
    makeError(std::string("createRep> Caught exception:")+e.what());
  }
  catch (...)   {
    return makeError("createRep> Unknown Fatal Exception.");
  }
  return makeError("createRep> Fatal Error.");
}
StatusCode PoolDbBaseCnv::dumpReferences ( PoolDbLinkManager pMgr,
LinkManager pLinks,
DataObject pObj,
IRegistry pReg 
) [virtual]

Dump the references of a DataObject after writing.

Parameters:
pMgr[IN] Pointer to POOL Link manager object
pLinks[IN] Pointer to intermediate link manager
pObj[IN] Pointer to data object
pReg[IN] Pointer to registry entry
Returns:
Status code indicating success or failure.

Definition at line 374 of file PoolDbBaseCnv.cpp.

{
  if ( printLinks() )  {
    MsgStream log(msgSvc(), "dumpReferences");
    LinkManager* mgr = pObj->linkMgr();
    for ( int i = 0; i < mgr->size(); ++i)  {
      LinkManager::Link* lnk = mgr->link(i);
      log << MSG::ALWAYS << "PUT> " << pObj->registry()->identifier() << "[" << i << "] = " << lnk->path() << endmsg;
    }
  }
  return StatusCode::SUCCESS;
}
StatusCode PoolDbBaseCnv::fillObjRefs ( IOpaqueAddress pAddr,
DataObject pObj 
) [virtual]

Converter overrides: Resolve the references of the created transient object.

Resolve the references of the created transient object.

Parameters:
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbDirectoryCnv, and PoolDbNTupleCnv.

Definition at line 537 of file PoolDbBaseCnv.cpp.

{
  return updateObjRefs(pAddress, pObject);
}
StatusCode PoolDbBaseCnv::fillRepRefs ( IOpaqueAddress pAddr,
DataObject pObj 
) [virtual]

Converter overrides: Resolve the references of the converted object.

Resolve the references of the converted object.

Parameters:
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbNTupleCnv.

Definition at line 642 of file PoolDbBaseCnv.cpp.

{
  return updateRepRefs(pAddr, pObj);
}
StatusCode PoolDbBaseCnv::finalize ( void   ) [virtual]

Converter overrides: Finalize the Db data converter.

Finalize the Db converter.

Reimplemented from Converter.

Definition at line 339 of file PoolDbBaseCnv.cpp.

                                     {
  pool::DbTypeInfo* shapeH = 0;
  if ( m_call ) {
    shapeH = dynamic_cast<pool::DbTypeInfo*>((pool::Shape*)m_call->shape());
    if ( shapeH ) shapeH->deleteRef();
  }
  pool::releasePtr(m_call);
  pool::releasePtr(m_dbMgr);
  pool::releasePtr(m_dataMgr);
  return Converter::finalize();
}
StatusCode PoolDbBaseCnv::initialize ( void   ) [virtual]

Converter overrides: Initialize the Db converter.

Initialize the converter.

Reimplemented from Converter.

Definition at line 270 of file PoolDbBaseCnv.cpp.

                                       {
  StatusCode status = Converter::initialize();
  MsgStream log(msgSvc(),"PoolDbBaseCnv");
  if ( !status.isSuccess() )   {
    log << MSG::ERROR << "Cannot initialize base class \"Converter\"" << endmsg;
    return status;
  }
  IPoolDbMgr **ptr1 = &m_dbMgr;
  status = conversionSvc()->queryInterface(IPoolDbMgr::interfaceID(), (void**)ptr1);
  if ( !status.isSuccess() )    {
    log << MSG::ERROR << "Cannot connect to \"IPoolDbMgr\" interface." << endmsg;
    return status;
  }
  IDataManagerSvc **ptr2 = &m_dataMgr;
  status = dataProvider()->queryInterface(IDataManagerSvc::interfaceID(), (void**)ptr2);
  if ( !status.isSuccess() )    {
    log << MSG::ERROR << "Cannot connect to \"IDataManagerSvc\" interface." << endmsg;
    return status;
  }
  const pool::DbTypeInfo* shapeH = 0;
  const ROOT::Reflex::Type refH = ROOT::Reflex::Type::ByName("PoolDbLinkManager");
  if ( !refH )  {
    log << MSG::ERROR << "Dictionary for class \"PoolDbLinkManager\" missing." << endmsg;
    return StatusCode::FAILURE;
  }
  const ROOT::Reflex::Type lnkH = ROOT::Reflex::Type::ByName("LinkManager");
  if ( !lnkH )  {
    log << MSG::ERROR << "Dictionary for class \"LinkManager\" missing." << endmsg;
    return StatusCode::FAILURE;
  }
  m_class = pool::DbReflex::forGuid(m_objGuid);
  if ( !m_class )  {
    // This may fail if the dictionary is not yet loaded, therefore it is not going to report an ERROR
    log << MSG::DEBUG << "Dictionary for class with GUID:" << m_objGuid.toString()
        << " missing." << endmsg;
    return StatusCode::FAILURE;
  }
  if ( !pool::DbTransform::getShape(m_objGuid, shapeH).isSuccess() )  {
    std::vector<const pool::DbColumn*> c;
    c.push_back(new pool::DbColumn(m_class.Name(),
                m_class.Name(ROOT::Reflex::SCOPED),
                pool::DbColumn::POINTER,
                0));
    c.push_back(new pool::DbColumn("Links",
                lnkH.Name(ROOT::Reflex::SCOPED),
                pool::DbColumn::POINTER,
                0));
    c.push_back(new pool::DbColumn("Refs",
                refH.Name(ROOT::Reflex::SCOPED),
                pool::DbColumn::POINTER,
                0));
    shapeH = pool::DbTypeInfo::create(m_objGuid, c);
  }
  if ( shapeH ) {
    log << MSG::DEBUG << "Created object shape for class:"
        << m_class.Name(ROOT::Reflex::SCOPED) << endmsg
        << shapeH->toString() << endmsg;
    shapeH->addRef();
    m_call = new PoolDbDataObjectHandler(m_class);
    m_call->setShape(shapeH);
  }
  else  {
    return makeError("Failed to create POOL shape information for GUID:"+
                      m_objGuid.toString(),false);
  }
  return status;
}
StatusCode PoolDbBaseCnv::makeError ( const std::string msg,
bool  rethrow = true 
) [protected]

Standard way to print errors.

after the printout an exception is thrown.

Parameters:
msg[IN] Message string to be printed.
rethrow[IN] Flag to indicate if an exception must be thrown
Returns:
Status code returning failure.

Definition at line 360 of file PoolDbBaseCnv.cpp.

{
  MsgStream log(msgSvc(),"PoolDbBaseCnv");
  log << MSG::ERROR << "Trouble with class:" << m_objGuid.toString() << " ";
  if ( m_class ) log << "<" << m_class.Name(ROOT::Reflex::SCOPED) << "> ";
  log << endmsg;
  log << msg << endmsg;
  if ( rethrow )  {
    pool::debugBreak("Error:"+msg, "PoolDbBaseCnv", true);
  }
  return StatusCode::FAILURE;
}
virtual long PoolDbBaseCnv::repSvcType (  ) const [inline, virtual]

Retrieve the class type of the data store the converter uses.

Implements IConverter.

Definition at line 97 of file PoolDbBaseCnv.h.

                                   {
    return i_repSvcType();
  }
StatusCode PoolDbBaseCnv::setReferences ( PoolDbLinkManager pMgr,
LinkManager pLinks,
DataObject pObj,
IRegistry pReg 
) [virtual]

Set the references of a DataObject when reading.

Parameters:
pMgr[IN] Pointer to POOL Link manager object
pLinks[IN] Pointer to intermediate link manager
pObj[IN] Pointer to data object
pReg[IN] Pointer to registry entry
Returns:
Status code indicating success or failure.

Definition at line 391 of file PoolDbBaseCnv.cpp.

{
  std::string tmp;
  LinkManager* pmgr = pObj->linkMgr();
  for(int i = 0; i < pLinks->size(); ++i)  {
    LinkManager::Link* lnk = pLinks->link(i);
    pmgr->addLink(lnk->path(), 0);
  }
  size_t ref_size  = mgr->references().size();
  for(size_t j = 0; j < ref_size; ++j) {
    IOpaqueAddress* pA = 0;
    const pool::Token* token = mgr->references()[j];
    std::string& location = mgr->links()[j];
    long typ = token->technology();
    CLID clid = token->classID().Data1;
    std::string spar[]   = {token->dbID(),
                            token->contID()};
    unsigned long ipar[] = {token->oid().first,
                            token->oid().second};
    StatusCode sc = addressCreator()->createAddress(typ,clid,spar,ipar,pA);
    if ( sc.isSuccess() )  {
      // Temporary fix for all files written with previous release(s)
      // The fix should be removed when these files are obsolete
      if ( location.substr(0,7) == "/Event/" )  {
        size_t idx = location.rfind("/");
        tmp = (idx==std::string::npos) ? location : location.substr(idx);
        location = tmp;
      }
      sc = m_dataMgr->registerAddress(pReg, location, pA);
      if ( sc.isSuccess() )  {
        // MsgStream log(msgSvc(), "Reflection");
        // log << MSG::ALWAYS << "Registered:" << pReg->identifier() << " as " << location << endmsg;
        continue;
      }
      pA->release();
      ROOT::Reflex::Type classH = pool::DbReflex::forGuid(token->classID());
      MsgStream err(msgSvc(), "Reflection");
      if ( 0 == classH ) {
        err << MSG::ERROR << "No reflection information availible for class ID:"
            << token->classID().toString() << endmsg;
      }
      else {
        err << MSG::ERROR << "Reflection information availible for class ID:"
            << token->classID().toString() << endmsg
            << classH.Name(ROOT::Reflex::SCOPED) << endmsg;
      }
      makeError("setReferences> Failed to register opaque address:"+location+
                "\n"+token->toString());
    }
  }
  return StatusCode::SUCCESS;
}
StatusCode PoolDbBaseCnv::updateObj ( IOpaqueAddress pAddr,
DataObject pObj 
) [virtual]

Converter overrides: Update transient object from persistent data.

Db specific implementation: Update a transient object: Default: DataObject.

Parameters:
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbDirectoryCnv, and PoolDbNTupleCnv.

Definition at line 544 of file PoolDbBaseCnv.cpp.

{
  try  {
    PoolDbAddress* pA = dynamic_cast<PoolDbAddress*>(pAddr);
    if ( 0 != pA ) {
      return makeError("updateObj> Sorry folks, not yet implemented...");
    }
    return makeError("updateObj> Invalid opaque object address.");
  }
  catch (std::exception& e)  {
    return makeError(std::string("updateObj> Caught exception:")+e.what());
  }
  catch (...)  {
  }
  return makeError("updateObj> Unknown Error - exception was thrown.");
}
StatusCode PoolDbBaseCnv::updateObjRefs ( IOpaqueAddress pAddr,
DataObject pObj 
) [virtual]

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

Update the references of an updated transient object.

Parameters:
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbDirectoryCnv, and PoolDbNTupleCnv.

Definition at line 563 of file PoolDbBaseCnv.cpp.

{
  if ( 0 != pObj )  {
    // First call the reconfiguration callback
    StatusCode sc = pObj->update();
    if ( sc.isSuccess() && printLinks() )  {
      MsgStream log(msgSvc(), "updateObjRefs");
      LinkManager* mgr = pObj->linkMgr();
      std::string id = pObj->registry()->identifier();
      for ( int i = 0; i < mgr->size(); ++i)  {
        LinkManager::Link* lnk = mgr->link(i);
        log << MSG::ALWAYS << "GET> " << id << "[" << i << "] = " << lnk->path() << endmsg;
      }
    }
    return sc;
  }
  return makeError("updateObjRefs> Invalid object reference.");
}
StatusCode PoolDbBaseCnv::updateRep ( IOpaqueAddress pAddr,
DataObject pObj 
) [virtual]

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

Update the converted representation of a transient object.

Parameters:
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbDirectoryCnv, and PoolDbNTupleCnv.

Definition at line 617 of file PoolDbBaseCnv.cpp.

                                                                 {
  try   {
    PoolDbAddress* pA = dynamic_cast<PoolDbAddress*>(pAddr);
    if ( 0 != pA )  {
      if ( pObj )  {
        PoolDbObjectContext ctxt(this, pAddr->registry());
        pool::DataCallBack* call = m_call->clone();
        call->setObject(pObj);
        return m_dbMgr->markUpdate(call, pA);
      }
      return makeError("updateRep> Invalid object reference.");
    }
    return makeError("updateRep> Invalid opaque object address.");
  }
  catch (std::exception& e)  {
    makeError(std::string("updateRep> Caught exception:")+e.what());
  }
  catch (...)   {
    return makeError("updateRep> Unknown Fatal Exception.");
  }
  return makeError("updateRep> Fatal Error.");
}
StatusCode PoolDbBaseCnv::updateRepRefs ( IOpaqueAddress pAddr,
DataObject pObj 
) [virtual]

Converter overrides: Update the references of an already converted object.

Update the references of an already converted object.

Parameters:
pAddr[IN] Pointer to object address.
pObj[IN] Pointer to data object
Returns:
Status code indicating success or failure.

Reimplemented from Converter.

Reimplemented in PoolDbDirectoryCnv, and PoolDbNTupleCnv.

Definition at line 649 of file PoolDbBaseCnv.cpp.

{
  if ( pObj ) {
    return StatusCode::SUCCESS;
  }
  return makeError("updateRepRefs> Invalid object reference.");
}

Member Data Documentation

Set with bad files/tables.

Definition at line 58 of file PoolDbBaseCnv.h.

Definition callback.

Definition at line 56 of file PoolDbBaseCnv.h.

Reference to seal reflection class.

Definition at line 54 of file PoolDbBaseCnv.h.

Services needed for proper operation: Gaudi datastore manager.

Definition at line 50 of file PoolDbBaseCnv.h.

Services needed for proper operation: POOL database manager.

Definition at line 48 of file PoolDbBaseCnv.h.

Object Guid.

Definition at line 52 of file PoolDbBaseCnv.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Fri Sep 2 2011 16:25:41 for Gaudi Framework, version v22r4 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004