Gaudi Framework, version v23r2

Home   Generated: Thu Jun 28 2012

NTupleSvc.cpp

Go to the documentation of this file.
00001 //====================================================================
00002 //  NTupleSvc.cpp
00003 //--------------------------------------------------------------------
00004 //
00005 //  Package   : GaudiSvc/NTupleSvc ( The LHCb Offline System)
00006 //
00007 //  Description: implementation of the NTuple service
00008 //
00009 //  Author    : M.Frank
00010 //  History   :
00011 // +---------+----------------------------------------------+---------
00012 // |    Date |                 Comment                      | Who
00013 // +---------+----------------------------------------------+---------
00014 // | 29/10/98| Initial version                              | MF
00015 // | 29/09/99| Added access to ICnvManager for missing      |
00016 // |         | converters                                   | MF
00017 // | 20/09/00| Connect dynamically to conversion service    |
00018 // |         | for N-tuple persistency                      | MF
00019 // +---------+----------------------------------------------+---------
00020 //
00021 //====================================================================
00022 #define  GAUDISVC_NTUPLESVC_CPP
00023 
00024 // Framework include files
00025 #include "GaudiKernel/xtoa.h"
00026 #include "GaudiKernel/SmartIF.h"
00027 #include "GaudiKernel/Tokenizer.h"
00028 #include "GaudiKernel/SvcFactory.h"
00029 #include "GaudiKernel/DataObject.h"
00030 #include "GaudiKernel/ObjectFactory.h"
00031 #include "GaudiKernel/GenericAddress.h"
00032 
00033 #include "GaudiKernel/IProperty.h"
00034 #include "GaudiKernel/ISvcLocator.h"
00035 #include "GaudiKernel/IDataSelector.h"
00036 
00037 #include "GaudiKernel/Property.h"
00038 #include "GaudiKernel/Selector.h"
00039 #include "GaudiKernel/MsgStream.h"
00040 #include "GaudiKernel/ConversionSvc.h"
00041 #include "GaudiKernel/DataSelectionAgent.h"
00042 #include "GaudiKernel/NTupleImplementation.h"
00043 
00044 #include "NTupleSvc.h"
00045 
00046 // Instantiation of a static factory class used by clients to create
00047 // instances of this service
00048 DECLARE_SERVICE_FACTORY(NTupleSvc)
00049 
00050 
00051 DECLARE_NAMESPACE_OBJECT_FACTORY(NTuple,Selector)
00052 
00053 #include <sstream>
00054 
00055 namespace {
00056   inline std::string toStr(long id) {
00057     std::ostringstream s; s << id;
00058     return s.str();
00059   }
00060 }
00061 
00063 NTupleSvc::NTupleSvc(const std::string& name, ISvcLocator* svc)
00064  : base_class(name, svc)
00065 {
00066   declareProperty("Input",  m_input);
00067   declareProperty("Output", m_output);
00068   m_rootName = "/NTUPLES";
00069   m_rootCLID = CLID_DataObject;
00070 }
00071 
00073 NTupleSvc::~NTupleSvc()   {
00074 }
00075 
00077 StatusCode NTupleSvc::initialize()     {
00078   StatusCode status = DataSvc::initialize();
00079   if ( status.isSuccess() )   {
00080     status = setProperties();
00081     if ( status.isSuccess() )   {
00082       StatusCode iret(StatusCode::SUCCESS,true);
00083       DataObject* root = new NTuple::Directory();
00084       status = setRoot(m_rootName, root);
00085       for ( DBaseEntries::iterator i = m_output.begin(); i != m_output.end(); ++i )    {
00086         iret = connect(*i);
00087         if ( !iret.isSuccess() )    {
00088           status = iret;
00089         }
00090       }
00091       for ( DBaseEntries::iterator j = m_input.begin(); j != m_input.end(); ++j )    {
00092         iret = connect(*j);
00093         if ( !iret.isSuccess() )    {
00094           status = iret;
00095         }
00096       }
00097     }
00098   }
00099   return status;
00100 }
00101 
00103 StatusCode NTupleSvc::reinitialize() {
00104   return StatusCode::SUCCESS;
00105 }
00106 
00107 // Check if a datasource is connected
00108 bool NTupleSvc::isConnected(const std::string& identifier) const    {
00109   Connections::const_iterator i = m_connections.find(identifier);
00110   return !(i==m_connections.end());
00111 }
00112 
00114 IConversionSvc* NTupleSvc::getDataLoader(IRegistry* pRegistry)    {
00115   if ( 0 != pRegistry )    {
00116     std::string full = pRegistry->identifier();
00117     size_t len = m_rootName.length();
00118     size_t idx = full.find(SEPARATOR,len+1);
00119     std::string path = (idx==std::string::npos) ? full : full.substr(0, idx);
00120     Connections::iterator i = m_connections.find(path);
00121     if ( i != m_connections.end() )   {
00122       return (*i).second.service;
00123     }
00124   }
00125   return 0;
00126 }
00127 
00128 StatusCode NTupleSvc::updateDirectories()   {
00129   typedef std::vector<IRegistry*> Leaves;
00130   long need_update = 0;
00131   DataObject* pO = 0;
00132   StatusCode iret = findObject(m_rootName, pO);
00133   MsgStream log ( msgSvc(), name() );
00134   //  log << MSG::DEBUG << "in finalize()" << endmsg;
00135   if ( iret.isSuccess() )   {
00136     Leaves leaves;
00137     iret = objectLeaves(pO, leaves);
00138     if ( iret.isSuccess() )    {
00139       // Only traverse the tree below the files
00140       for ( Leaves::iterator d = leaves.begin(); d != leaves.end(); d++ )    {
00141         if ( (*d)->object() )   {
00142           IOpaqueAddress* pA = (*d)->address();
00143           if ( pA )   {
00144             unsigned long typ = pA->ipar()[1];
00145             if ( typ == 'R' || typ == 'N' || typ == 'U' )   {
00146               // ...starting from the file entries: first save the directories/ntuples
00147               IConversionSvc* svc = getDataLoader(*d);
00148               if ( 0 != svc )   {
00149                 StatusCode status;
00150                 DataSelectionAgent agent;
00151                 IDataSelector*     sel = agent.selectedObjects();
00152                 traverseSubTree ( (*d)->object(), &agent ).ignore();
00153                 for(int i = sel->size()-1; i >= 0; i-- )    {
00154                   DataObject* o = (*sel)[i];
00155                   IRegistry*  r = o->registry();
00156                   status = svc->updateRep(r->address(), o);
00157                   if ( !status.isSuccess() )    {
00158                     iret = status;
00159                   }
00160                 }
00161                 for(int j = sel->size()-1; j >= 0; j-- )    {
00162                   DataObject* o = (*sel)[j];
00163                   IRegistry*  r = o->registry();
00164                   status = svc->updateRepRefs(r->address(), o);
00165                   if ( !status.isSuccess() )    {
00166                     iret = status;
00167                   }
00168                 }
00169                 if ( iret.isSuccess() ) need_update += sel->size();
00170               }
00171             }
00172           }
00173         }
00174       }
00175     }
00176   }
00177   if ( !iret.isSuccess() )    {
00178     log << MSG::ERROR << "ERROR while saving NTuples" << endmsg;
00179     return iret;
00180   }
00181   else if ( need_update > 0 )    {
00182     log << MSG::INFO << "NTuples saved successfully" << endmsg;
00183   }
00184   return iret;
00185 }
00186 
00187 // Finalize single service
00188 void NTupleSvc::releaseConnection(Connection& c)  {
00189   SmartIF<IService> isvc( c.service );
00190   if ( isvc.isValid( ) )   {
00191     isvc->finalize().ignore();
00192   }
00193   c.service->release();
00194   c.service = 0;
00195 }
00196 
00197 // Close all open connections
00198 StatusCode NTupleSvc::disconnect(const std::string& nam)      {
00199   Connections::iterator i = m_connections.find(nam);
00200   if ( i != m_connections.end() )    {
00201     releaseConnection((*i).second);
00202     m_connections.erase(i);
00203     return StatusCode::SUCCESS;
00204   }
00205   return StatusCode::FAILURE;
00206 }
00207 
00208 // Close all open connections
00209 StatusCode NTupleSvc::disconnectAll()      {
00210   for(Connections::iterator i = m_connections.begin(); i != m_connections.end(); ++i) {
00211     releaseConnection((*i).second);
00212   }
00213   m_connections.erase(m_connections.begin(), m_connections.end());
00214   return StatusCode::SUCCESS;
00215 }
00216 
00218 StatusCode NTupleSvc::finalize()      {
00219   StatusCode status = updateDirectories();
00220   status = clearStore();
00221   status = DataSvc::finalize();
00222   status = disconnectAll();
00223   return status;
00224 }
00225 
00226 StatusCode NTupleSvc::connect(const std::string& ident)    {
00227   std::string logName;
00228   return connect(ident, logName);
00229 }
00230 
00231 StatusCode NTupleSvc::connect(const std::string& ident, std::string& logname)    {
00232   MsgStream log ( msgSvc(), name() );
00233   DataObject* pO = 0;
00234   StatusCode status = findObject(m_rootName, pO);
00235   if ( status.isSuccess() )   {
00236     char typ=0;
00237     Tokenizer tok(true);
00238     std::vector<Prop> props;
00239     long loc = ident.find(" ");
00240     std::string filename, auth, svc = "", db_typ = "";
00241     logname = ident.substr(0,loc);
00242     tok.analyse(ident.substr(loc+1,ident.length()), " ", "", "", "=", "'", "'");
00243     for ( Tokenizer::Items::iterator i = tok.items().begin(); i != tok.items().end(); ++i)    {
00244       const std::string& tag = (*i).tag();
00245       switch( ::toupper(tag[0]) )   {
00246       case 'A':
00247         break;
00248       case 'F':   // FILE='<file name>'
00249       case 'D':   // DATAFILE='<file name>'
00250         filename = (*i).value();
00251         break;
00252       case 'O':   // OPT='<NEW<CREATE,WRITE>, UPDATE, READ>'
00253         switch( ::toupper((*i).value()[0]) )   {
00254         case 'C':
00255         case 'N':
00256         case 'W':
00257           typ = 'N';
00258           break;
00259         case 'U':
00260           typ = 'U';
00261           break;
00262         case 'O':
00263         case 'R':
00264           typ = 'O';
00265           break;
00266         default:
00267           typ = 0;
00268           break;
00269         }
00270         break;
00271       case 'T':   // TYP='<HBOOK,ROOT,OBJY,...>'
00272         db_typ = (*i).value();
00273         break;
00274       default:
00275         props.push_back( Prop((*i).tag(), (*i).value()));
00276         break;
00277       }
00278     }
00279     if ( 0 != typ )    {
00280       IConversionSvc* pSvc = 0;
00281       status = createService(name()+'.'+logname, db_typ, props, pSvc);
00282       if ( status.isSuccess() )   {
00283         status = attachTuple(filename, logname, typ, pSvc->repSvcType());
00284         if ( status.isSuccess() )    {
00285           m_connections.insert(Connections::value_type(m_rootName+'/'+logname,Connection(pSvc)));
00286           return StatusCode::SUCCESS;
00287         }
00288       }
00289     }
00290   }
00291   log << MSG::ERROR << "Cannot add " << ident << " invalid filename!" << endmsg;
00292   return StatusCode::FAILURE;
00293 }
00294 
00295 StatusCode NTupleSvc::createService(const std::string&       /* nam */,
00296                                     const std::string&          typ,
00297                                     const std::vector<Prop>& /* props */,
00298                                     IConversionSvc*&            pSvc)
00299 {
00300   MsgStream log ( msgSvc(), name() );
00302   // Get the value of the Stat persistancy mechanism from the AppMgr
00303   IProperty*   appPropMgr = 0;
00304   StatusCode sts = serviceLocator()->queryInterface(IProperty::interfaceID(), pp_cast<void>(&appPropMgr) );
00305   if( !sts.isSuccess() ) {
00306    // Report an error and return the FAILURE status code
00307    log << MSG::ERROR << "Could not get PropMgr" << endmsg;
00308    return sts;
00309   }
00310 
00311   StringProperty sp("HistogramPersistency","");
00312   sts = appPropMgr->getProperty( &sp );
00313   if ( !sts.isSuccess() ) {
00314    log << MSG::ERROR << "Could not get NTuple Persistency format"
00315        << " from ApplicationMgr properties" << endmsg;
00316    return sts;
00317   }
00318 
00319   long storage_typ = TEST_StorageType;
00320   if ( sp.value() == "HBOOK" ) {
00321     storage_typ = HBOOK_StorageType;
00322   }
00323   else if ( sp.value() == "ROOT" ) {
00324     storage_typ = ROOT_StorageType;
00325   }
00326   else {
00327     appPropMgr->release();
00328     log << MSG::ERROR << "Unknown NTuple Persistency format: " << sp.value() << endmsg;
00329     return StatusCode::FAILURE;
00330   }
00331   // Clean up
00332   appPropMgr->release();
00333 
00334   if ( typ.length() > 0 && typ != sp.value() )    {
00335     log << MSG::WARNING << "NTuple persistency type is "
00336         << sp.value() << "." << endmsg
00337         << "Type given by job option "
00338         << "NTupleSvc.Input/Output ignored!" << endmsg;
00339   }
00340 
00341   //      log << MSG::DEBUG << "storage type: " << m_storageType << endmsg;
00342 
00343   // FIXME: (MCl) why NTupleSvc has to directly create a ConversionSvc?
00344   IService* pService = 0;
00345   IInterface* iface = new ConversionSvc(name()+"Conversions", serviceLocator(), storage_typ);
00346   StatusCode status = iface->queryInterface(IService::interfaceID(), pp_cast<void>(&pService));
00347   if ( status.isSuccess() )   {
00348     status = iface->queryInterface(IConversionSvc::interfaceID(), pp_cast<void>(&pSvc));
00349     if ( !status.isSuccess() )   {
00350       pService->release();
00351       return status;
00352     }
00353   }
00354   status = pService->sysInitialize();
00355   if ( !status.isSuccess() )    {
00356     return status;
00357   }
00358   pService->release();
00359   status = pSvc->setDataProvider(this);
00360   if ( !status.isSuccess() )    {
00361     return status;
00362   }
00363   return status;
00364 }
00365 
00367 StatusCode NTupleSvc::create(const CLID& typ, const std::string& title, NTuple::Tuple*& refpTuple)     {
00368   NTuple::TupleImp* pTuple = 0;
00369   StatusCode status = StatusCode::FAILURE;
00370   if ( typ == CLID_ColumnWiseTuple )    {
00371     pTuple = new NTuple::ColumnWiseTuple( title );
00372   }
00373   else if ( typ == CLID_RowWiseTuple )    {
00374     pTuple = new NTuple::RowWiseTuple( title );
00375   }
00376   else    {
00378   }
00379   if ( 0 != pTuple )      {
00380     pTuple->setTupleService(this);
00381     status = StatusCode::SUCCESS;
00382   }
00383   refpTuple = pTuple;
00384   return status;
00385 }
00386 
00388 NTuple::Tuple* NTupleSvc::book (const std::string& fullPath, const CLID& type, const std::string& title)  {
00389   DataObject* pObj = 0;
00390   std::string path = fullPath;
00391   MsgStream log(msgSvc(), name());
00392   if ( path[0] != SEPARATOR )   {
00393     path = m_rootName;
00394     path += SEPARATOR;
00395     path += fullPath;
00396   }
00397   StatusCode status = retrieveObject(path, pObj);
00398   if ( !status.isSuccess() )    {
00399     int sep = path.rfind(SEPARATOR);
00400     if ( sep > 0 )    {
00401       std::string p_path (path, 0, sep);
00402       std::string o_path (path, sep, path.length());
00403       DataObject* dir = createDirectory(p_path);
00404       if ( 0 != dir )   {
00405         NTuple::Tuple* tup = book( dir, o_path, type, title);
00406         if ( 0 == tup )   {
00407           log << MSG::ERROR << "Cannot book N-tuple " << path << " (Unknown reason)" << endmsg;
00408         }
00409         return tup;
00410       }
00411       log << MSG::ERROR << "Cannot book N-tuple " << path << " (Invalid parent directory)" << endmsg;
00412       return 0;
00413     }
00414     log << MSG::ERROR << "Cannot book N-tuple " << path << " (Invalid path)" << endmsg;
00415     return 0;
00416   }
00417   log << MSG::ERROR << "Cannot book N-tuple " << path << " (Exists already)" << endmsg;
00418   return 0;
00419 }
00420 
00422 NTuple::Tuple* NTupleSvc::book (const std::string& dirPath, const std::string& relPath, const CLID& type, const std::string& title)  {
00423   std::string full = dirPath;
00424   if (relPath[0] != SEPARATOR) full += SEPARATOR;
00425   full += relPath;
00426   return book(full, type, title);
00427 }
00428 
00430 NTuple::Tuple* NTupleSvc::book (const std::string& dirPath, long id, const CLID& type, const std::string& title)  {
00431   return book( dirPath, toStr(id), type, title);
00432 }
00433 
00435 NTuple::Tuple* NTupleSvc::book (DataObject* pParent, const std::string& relPath, const CLID& type, const std::string& title)  {
00436   NTuple::Tuple* pObj = 0;
00437   // Check if object is already present
00438   StatusCode status = findObject(pParent, relPath, *pp_cast<DataObject>(&pObj));
00439   // No ? Then create it!
00440   if ( !status.isSuccess() )    {
00441     status = create( type, title, pObj);
00442     if ( status.isSuccess() )   {
00443       // Finally register the created N tuple with the store
00444       status = registerObject(pParent, relPath, pObj);
00445       if ( status.isSuccess() )    {
00446         return pObj;
00447       }
00448       pObj->release();
00449     }
00450   }
00451   return 0;
00452 }
00453 
00455 NTuple::Tuple* NTupleSvc::book (DataObject* pParent,
00456                                 long id,
00457                                 const CLID& type,
00458                                 const std::string& title)  {
00459   return book( pParent, toStr(id), type, title);
00460 }
00461 
00463 NTuple::Directory* NTupleSvc::createDirectory (DataObject* pParent,
00464                                                const std::string& relPath)   {
00465   if ( 0 != pParent )   {
00466     IRegistry* pDir = pParent->registry();
00467     if ( 0 != pDir )    {
00468       std::string full = pDir->identifier();
00469       full += (relPath[0]=='/') ? "" : "/";
00470       full += relPath;
00471       return createDirectory(full);
00472     }
00473   }
00474   return 0;
00475 }
00476 
00478 NTuple::Directory* NTupleSvc::createDirectory (DataObject* pParent, long id)    {
00479   return createDirectory( pParent, toStr(id) );
00480 }
00481 
00483 NTuple::Directory* NTupleSvc::createDirectory (const std::string& dirPath, long id)    {
00484   return createDirectory( dirPath, toStr(id) );
00485 }
00486 
00488 NTuple::Directory* NTupleSvc::createDirectory (const std::string& dirPath, const std::string& relPath )    {
00489   std::string full = dirPath;
00490   full += (relPath[0]=='/') ? "" : "/";
00491   full += relPath;
00492   return createDirectory(full);
00493 }
00494 
00495 StatusCode NTupleSvc::attachTuple(const std::string& filename, const std::string& logname, const char typ, const long t)   {
00496   MsgStream log(msgSvc(), name());
00497   DataObject* p;
00498   // First get the root object
00499   StatusCode status = retrieveObject(m_rootName, p);
00500   if ( status.isSuccess() )   {
00501     // Now add the registry entry to the store
00502     std::string entryname = m_rootName;
00503     entryname += '/';
00504     entryname += logname;
00505     GenericAddress* pA =
00506        new GenericAddress(t, CLID_NTupleFile, filename, entryname, 0, typ);
00507     status = registerAddress(p, logname, pA);
00508     if ( status.isSuccess() )    {
00509       log << MSG::INFO << "Added stream file:" << filename << " as " << logname << endmsg;
00510       return status;
00511     }
00512     pA->release();
00513   }
00514   log << MSG::ERROR << "Cannot add file:" << filename << " as " << logname << endmsg;
00515   return status;
00516 }
00517 
00519 NTuple::Directory* NTupleSvc::createDirectory (const std::string& fullPath)   {
00520   NTuple::Directory* p = 0;
00521   StatusCode status = findObject(fullPath, *pp_cast<DataObject>(&p));
00522   if ( !status.isSuccess() )   {
00523     int sep2 = fullPath.rfind(SEPARATOR);
00524     if ( sep2 > 0 )   {
00525       std::string relPath = fullPath.substr(0, sep2);
00526       p = createDirectory(relPath);
00527       if ( 0 != p )    {
00528         p = new NTuple::Directory();
00529         // Finally register the created N tuple with the store
00530         status = registerObject(fullPath, p);
00531         if ( status.isSuccess() )    {
00532           // ...starting from the file entries
00533           IConversionSvc* svc = getDataLoader(p->registry());
00534           if ( 0 != svc )   {
00535             IOpaqueAddress* pAddr = 0;
00536             status = svc->createRep (p, pAddr);
00537             if ( status.isSuccess() )   {
00538               p->registry()->setAddress(pAddr);
00539               status = svc->fillRepRefs (pAddr, p);
00540               if ( status.isSuccess() )   {
00541                 return p;
00542               }
00543             }
00544           }
00545           unregisterObject(p);
00546         }
00547         p->release();
00548         p = 0;
00549       }
00550     }
00551   }
00552   try {
00553     p = dynamic_cast<NTuple::Directory*>(p);
00554     return p;
00555   }
00556   catch (...) {
00557   }
00558   return 0;
00559 }
00560 
00562 NTuple::Tuple* NTupleSvc::access(const std::string&, const std::string&)  {
00563   MsgStream log ( msgSvc(), name() );
00564   return 0;
00565 }
00566 
00568 StatusCode NTupleSvc::save(const std::string& fullPath)  {
00569   MsgStream log ( msgSvc(), name() );
00570   NTuple::Tuple* pObj = 0;
00571   StatusCode status = findObject(fullPath, *pp_cast<DataObject>(&pObj));  // Check if object is  present
00572   if ( status.isSuccess() )   {
00573     return save ( pObj );
00574   }
00575   return INVALID_OBJ_PATH;
00576 }
00577 
00579 StatusCode NTupleSvc::save(NTuple::Tuple* n_tuple)  {
00580   NTuple::TupleImp* tuple = (NTuple::TupleImp*)n_tuple;
00581   if ( 0 != tuple )   {
00582     try   {
00583       IConversionSvc* pSvc = tuple->conversionService();
00584       IRegistry*      pReg = tuple->registry();
00585       if ( 0 != pSvc && 0 != pReg )    {
00586         IOpaqueAddress* pAddr = pReg->address();
00587         StatusCode status = pSvc->updateRep(pAddr, n_tuple);
00588         if ( status.isSuccess() )   {
00589           status = pSvc->updateRepRefs(pAddr, n_tuple);
00590         }
00591         return status;
00592       }
00593       return IDataProviderSvc::NO_DATA_LOADER;
00594     }
00595     catch(...)    {
00596     }
00597   }
00598   return INVALID_OBJECT;
00599 }
00600 
00602 StatusCode NTupleSvc::save(DataObject* pParent, const std::string& relPath)  {
00603   NTuple::Tuple* pObj = 0;
00604   StatusCode status = findObject(pParent, relPath, *pp_cast<DataObject>(&pObj));  // Check if object is  present
00605   if ( status.isSuccess() )   {
00606     return save ( pObj );
00607   }
00608   return INVALID_OBJ_PATH;
00609 }
00610 
00612 StatusCode NTupleSvc::writeRecord( NTuple::Tuple* n_tuple )   {
00613   NTuple::TupleImp* tuple = (NTuple::TupleImp*)n_tuple;
00614   if ( 0 != tuple )   {
00615     try   {
00616       IConversionSvc* pSvc = tuple->conversionService();
00617       if ( 0 == pSvc )    {
00618         pSvc = getDataLoader(n_tuple->registry());
00619         tuple->setConversionService(pSvc);
00620       }
00621       if ( 0 != pSvc )    {
00622         IRegistry* pReg = n_tuple->registry();
00623         IOpaqueAddress* pAddr = pReg->address();
00624         StatusCode status = pSvc->createRep(n_tuple, pAddr);
00625         if ( status.isSuccess() )   {
00626           pReg->setAddress(pAddr);
00627           status = pSvc->fillRepRefs(pAddr, n_tuple);
00628         }
00629         return status;
00630       }
00631       return IDataProviderSvc::NO_DATA_LOADER;
00632     }
00633     catch(...)    {
00634     }
00635   }
00636   return INVALID_OBJECT;
00637 }
00638 
00640 StatusCode NTupleSvc::writeRecord(const std::string& fullPath )   {
00641   NTuple::Tuple* pObj = 0;
00642   StatusCode status = findObject(fullPath, *pp_cast<DataObject>(&pObj));  // Check if object is  present
00643   if ( status.isSuccess() )   {
00644     return writeRecord ( pObj );
00645   }
00646   return INVALID_OBJ_PATH;
00647 }
00648 
00650 StatusCode NTupleSvc::writeRecord( DataObject* pParent, const std::string& relPath)   {
00651   NTuple::Tuple* pObj = 0;
00652   StatusCode status = findObject(pParent, relPath, *pp_cast<DataObject>(&pObj));  // Check if object is  present
00653   if ( status.isSuccess() )   {
00654     return writeRecord ( pObj );
00655   }
00656   return INVALID_OBJ_PATH;
00657 }
00658 
00660 StatusCode NTupleSvc::readRecord( NTuple::Tuple* n_tuple )  {
00661   StatusCode status = INVALID_OBJECT;
00662   NTuple::TupleImp* tuple = (NTuple::TupleImp*)n_tuple;
00663   if ( 0 != tuple )   {
00664     try   {
00665       IConversionSvc* pSvc = tuple->conversionService();
00666       if ( 0 == pSvc )    {
00667         pSvc = getDataLoader(n_tuple->registry());
00668         tuple->setConversionService(pSvc);
00669       }
00670       if ( 0 != pSvc )    {
00671         IRegistry*      pReg  = n_tuple->registry();
00672         IOpaqueAddress* pAddr = pReg->address();
00673         status = pSvc->updateObj(pAddr, n_tuple);
00674         if ( status.isSuccess() )   {
00675           status = pSvc->updateObjRefs(pAddr, n_tuple);
00676         }
00677         return status;
00678       }
00679       status = IDataProviderSvc::NO_DATA_LOADER;
00680     }
00681     catch(...)    {
00682       status = INVALID_OBJECT;
00683     }
00684   }
00685   return status;
00686 }
00687 
00689 StatusCode NTupleSvc::readRecord(const std::string& fullPath)  {
00690   NTuple::Tuple* pObj = 0;
00691   StatusCode status = findObject(fullPath, *pp_cast<DataObject>(&pObj));  // Check if object is  present
00692   if ( status.isSuccess() )   {
00693     return readRecord ( pObj );
00694   }
00695   return INVALID_OBJ_PATH;
00696 }
00697 
00699 StatusCode NTupleSvc::readRecord(DataObject* pParent, const std::string& relPath)  {
00700   NTuple::Tuple* pObj = 0;
00701   StatusCode status = findObject(pParent, relPath, *pp_cast<DataObject>(&pObj));  // Check if object is  present
00702   if ( status.isSuccess() )   {
00703     return readRecord ( pObj );
00704   }
00705   return INVALID_OBJ_PATH;
00706 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Thu Jun 28 2012 23:27:28 for Gaudi Framework, version v23r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004