Gaudi Framework, version v23r2

Home   Generated: Thu Jun 28 2012

RootStatCnv.cpp

Go to the documentation of this file.
00001 // $Id: RootStatCnv.cpp,v 1.6 2010-09-27 15:43:53 frankb Exp $
00002 //------------------------------------------------------------------------------
00003 //
00004 // Implementation of class :  RootStatCnv
00005 //
00006 // Author :                   Markus Frank
00007 //
00008 //------------------------------------------------------------------------------
00009 
00010 // Include files
00011 #include "RootCnv/RootRefs.h"
00012 #include "RootCnv/RootStatCnv.h"
00013 #include "RootCnv/RootDataConnection.h"
00014 #include "GaudiKernel/NTuple.h"
00015 #include "GaudiKernel/IRegistry.h"
00016 #include "GaudiKernel/IDataManagerSvc.h"
00017 #include "TROOT.h"
00018 #include "TBranch.h"
00019 #include <memory>
00020 
00021 using namespace std;
00022 using namespace Gaudi;
00023 
00024 // Standard Constructor
00025 RootStatCnv::RootStatCnv (long typ,const CLID& clid, ISvcLocator* svc, RootCnvSvc* mgr) 
00026 : RootConverter(typ, clid, svc, mgr), m_dataMgr(0), m_log(0)
00027 {
00028 }
00029 
00030 // Initialize converter object
00031 StatusCode RootStatCnv::initialize() {
00032   StatusCode sc = RootConverter::initialize();
00033   if ( sc.isSuccess() ) {
00034     sc = dataProvider()->queryInterface(IDataManagerSvc::interfaceID(),(void**)&m_dataMgr);
00035     if ( !sc.isSuccess() ) {
00036       return makeError("Failed to access IDataManagerSvc interface.");
00037     }
00038   }
00039   if ( m_log ) delete m_log;
00040   m_log = new MsgStream(msgSvc(),System::typeinfoName(typeid(*this)));
00041   return sc;
00042 }
00043 
00044 // Finalize converter object
00045 StatusCode RootStatCnv::finalize() {
00046   if ( m_log ) {
00047     delete m_log;
00048     m_log = 0;
00049   }
00050   if ( m_dataMgr ) {
00051     m_dataMgr->release();
00052     m_dataMgr = 0;
00053   }
00054   return RootConverter::finalize();
00055 }
00056 
00057 // Retrieve the name of the container a given object is placed into
00058 const string RootStatCnv::containerName(IRegistry* pReg) const {
00059   const string& path = pReg->identifier();
00060   long loc = path.find('/',1);
00061   string local = "<local>";
00062   //local = "";
00063   if ( loc > 0 )  {
00064     loc = path.find('/',++loc);
00065     if ( loc > 0 )  {
00066       local += path.substr(loc,path.length()-loc);
00067     }
00068   }
00069   //for(size_t i=0; i<local.length();++i)
00070   //  if ( !isalnum(local[i])) local[i] = '_';
00071   return local;
00072 }
00073 
00074 // Retrieve the name of the file a given object is placed into
00075 const string RootStatCnv::fileName(IRegistry* pReg) const {
00076   string path = topLevel(pReg);
00077   DataObject* pObj = 0;
00078   dataProvider()->retrieveObject(path, pObj);
00079   if ( pObj )  {
00080     NTuple::File* fptr = dynamic_cast<NTuple::File*>(pObj);
00081     if ( fptr )  {
00082       return fptr->name();
00083     }
00084   }
00085   return "";
00086 }
00087 
00088 // Retrieve the full path of the file a given object is placed into
00089 const string RootStatCnv::topLevel(IRegistry* pReg) const   {
00090   if ( pReg )    {
00091     string path = pReg->identifier();
00092     size_t idx = path.find('/', 1);
00093     if ( idx != string::npos )  {
00094       idx = path.find('/', idx+1);
00095       if ( idx != string::npos )  {
00096         path = path.substr(0, idx);
00097       }
00098       return path;
00099     }
00100   }
00101   return "";
00102 }
00103 
00104 // Helper method to issue error messages.
00105 StatusCode RootStatCnv::makeError(const std::string& msg, bool throw_exc)  const {
00106   if ( m_log )  {
00107     log() << MSG::ERROR << msg << endmsg;
00108   }
00109   else {
00110     MsgStream l(msgSvc(),"RootConverter");
00111     l << MSG::ERROR << msg << endmsg;    
00112   }
00113   if ( throw_exc ) {
00114   }
00115   return StatusCode::FAILURE;
00116 }
00117 
00118 // Save statistics object description.
00119 StatusCode 
00120 RootStatCnv::saveDescription(const string&  path, 
00121                              const string&  ident, 
00122                              const string&  desc,
00123                              const string&  opt,
00124                              const CLID&    clid)
00125 {
00126   RootDataConnection* con = 0;
00127   StatusCode status = m_dbMgr->connectDatabase(path, IDataConnection::UPDATE, &con);
00128   if ( status.isSuccess() )  {
00129     TClass* cl = gROOT->GetClass("Gaudi::RootNTupleDescriptor",kTRUE);
00130     if ( cl ) {
00131       RootNTupleDescriptor* ptr;
00132       auto_ptr<RootNTupleDescriptor> dsc(ptr=new RootNTupleDescriptor());
00133       TBranch* b = con->getBranch("##Descriptors","GaudiStatisticsDescription",cl,ptr);
00134       if ( b ) {
00135         dsc->description = desc;
00136         dsc->optional    = opt;
00137         dsc->container   = ident;
00138         dsc->clid        = clid;
00139         b->SetAddress(&ptr);
00140         int nb = b->Fill();
00141         if ( nb > 1 ) {
00142           log() << MSG::DEBUG << "Save description for " << ident << endmsg;
00143           return StatusCode::SUCCESS;
00144         }
00145       }
00146       return makeError("Failed to access ROOT branch GaudiStatisticsDescription");
00147     }
00148     return makeError("Failed to access TClass RootNTupleDescriptor");
00149   }
00150   return makeError("Failed to access Tuple file:"+path);
00151 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

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