| # Gaudi Framework, version v20r4
Generated: 8 Jan 2009

# DetDataSvc.cpp

Go to the documentation of this file.

    00001 // $Id: DetDataSvc.cpp,v 1.24 2008/10/27 19:22:21 marcocle Exp $
    00002 #define  DETECTORDATASVC_DETDATASVC_CPP
    00003
    00004 // Include files
    00005 #include "DetDataSvc.h"
    00006 #include "GaudiKernel/IAddressCreator.h"
    00007 #include "GaudiKernel/IConversionSvc.h"
    00008 #include "GaudiKernel/IOpaqueAddress.h"
    00009 #include "GaudiKernel/ISvcLocator.h"
    00010 #include "GaudiKernel/IValidity.h"
    00011 #include "GaudiKernel/DataObject.h"
    00012 #include "GaudiKernel/MsgStream.h"
    00013 #include "GaudiKernel/SvcFactory.h"
    00014
    00015 // Instantiation of a static factory class used by clients to create
    00016 // instances of this service
    00017 DECLARE_SERVICE_FACTORY(DetDataSvc)
    00018
    00019 // Service initialisation
    00020 StatusCode DetDataSvc::initialize()   {
    00021   MsgStream log(msgSvc(), name());
    00022
    00023   // Call base class initialisation
    00024   StatusCode sc  = DataSvc::initialize();
    00025   if( sc.isFailure() ) return sc;
    00026
    00027   // Set Data Loader
    00028   IConversionSvc* cnv_svc;
    00029   sc = serviceLocator()->service(m_persistencySvcName, cnv_svc, true);
    00030   if( sc .isFailure() ) {
    00031     log << MSG::ERROR << "Unable to retrieve " << m_persistencySvcName << endreq;
    00032     return sc;
    00033   }
    00034
    00035   sc = setDataLoader( cnv_svc );
    00036   cnv_svc->release();
    00037   if( sc .isFailure() ) {
    00038     log << MSG::ERROR << "Unable to set DataLoader" << endreq;
    00039     return sc;
    00040   }
    00041
    00042   // Get address creator fron the DetectorPersistencySvc
    00043   sc = cnv_svc->queryInterface(IID_IAddressCreator, pp_cast<void>(&m_addrCreator));
    00044   if (sc.isFailure()) {
    00045     log << MSG::ERROR << "Unable to get AddressCreator." << endreq;
    00046     return StatusCode::FAILURE;
    00047   }
    00048
    00049   return setupDetectorDescription();
    00050 }
    00051
    00052 StatusCode DetDataSvc::setupDetectorDescription() {
    00053   // Now you can use the MsgSvc
    00054   MsgStream log(msgSvc(), name());
    00055
    00056   // Initialize the detector data transient store
    00057   log << MSG::DEBUG << "Storage type used is: " << m_detStorageType << endreq;
    00058   log << MSG::DEBUG << "Setting DetectorDataSvc root node... " << endreq;
    00059
    00060   if( m_usePersistency ) {
    00061
    00062     IOpaqueAddress* rootAddr;
    00063     if( m_detDbLocation.empty() || "empty" == m_detDbLocation ) {
    00064
    00065       // if the name of DBlocation is not given - construct it!
    00066             // by retrieving the value of XMLDDBROOT
    00067
    00068       if ( 0 != getenv("XMLDDDBROOT") ) {
    00069         m_detDbLocation  = getenv("XMLDDDBROOT");
    00070         m_detDbLocation += "/DDDB/lhcb.xml";
    00071       }
    00072     }
    00073     if( m_detDbLocation.empty() || "empty" == m_detDbLocation ) {
    00074       log << MSG::ERROR
    00075           << "Detector data location name not set. Detector data will "
    00076           << "not be found." << endreq;
    00077       return StatusCode::FAILURE;
    00078     }
    00079     else {
    00080       // Create address
    00081       unsigned long iargs[]={0,0};
    00082       const std::string args[] = {m_detDbLocation, m_detDbRootName};
    00083       StatusCode sc = m_addrCreator->createAddress (m_detStorageType,
    00084                                                     CLID_Catalog,
    00085                                                     args,
    00086                                                     iargs,
    00087                                                     rootAddr);
    00088       if( sc.isSuccess() ) {
    00089         std::string dbrName = "/" + m_detDbRootName;
    00090         sc = i_setRoot( dbrName, rootAddr );
    00091         if( sc.isFailure() ) {
    00092           log << MSG::ERROR << "Unable to set detector data store root"
    00093               << endreq;
    00094           return sc;
    00095         }
    00096       }
    00097       else {
    00098         log << MSG::ERROR << "Unable to create address for  /dd" << endreq;
    00099         return sc;
    00100       }
    00101     }
    00102     // Writing the description file in the output log file [bugs #2854]
    00103     log << MSG::ALWAYS << "Detector description database: " << m_detDbLocation << endreq;
    00104   }
    00105   else {
    00106     log << MSG::INFO << "Detector description not requested to be loaded"
    00107         << endreq;
    00108   }
    00109
    00110   return StatusCode::SUCCESS;
    00111 }
    00112
    00113 // Service initialisation
    00114 StatusCode DetDataSvc::reinitialize()   {
    00115   MsgStream log(msgSvc(), name());
    00116
    00117   // The DetectorDataSvc does not need to be re-initialized. If it is done
    00118   // all the Algorithms having references to DetectorElements will become
    00119   // invalid and crash the program.  (Pere Mato)
    00120
    00121   // Call base class reinitialization
    00122   //StatusCode sc  = DataSvc::reinitialize();
    00123   //if( sc.isFailure() ) return sc;
    00124
    00125   // Delete the associated event time
    00126   //if( 0 != m_eventTime ) delete m_eventTime;
    00127   //m_eventTimeDefined = false;
    00128
    00129   //return setupDetectorDescription();
    00130   return StatusCode::SUCCESS;
    00131 }
    00132
    00134 StatusCode DetDataSvc::finalize()
    00135 {
    00136   MsgStream log(msgSvc(), name());
    00137   log << MSG::DEBUG << "Finalizing" << endreq;
    00138
    00139   // clears the store
    00140   m_usePersistency = false; // avoid creation of an empty store when clearing
    00141   clearStore().ignore();
    00142
    00143   // Releases the address creator
    00144   if (0 != m_addrCreator) {
    00145     m_addrCreator->release();
    00146   }
    00147
    00148   // Releases the DataLoader
    00149   setDataLoader(0).ignore();
    00150
    00151   // Finalize the base class
    00152   return DataSvc::finalize();
    00153 }
    00154
    00156 StatusCode DetDataSvc::queryInterface(const InterfaceID& riid,
    00157                                       void** ppvInterface)
    00158 {
    00159   // With the highest priority return the specific interfaces
    00160   // If interfaces are not directly available, try out a base class
    00161   if ( IID_IDetDataSvc.versionMatch(riid) ) {
    00162     *ppvInterface = (IDetDataSvc*)this;
    00163   } else if ( IID_IIncidentListener.versionMatch(riid) ) {
    00164     *ppvInterface = (IIncidentListener*)this;
    00165   } else {
    00166     return DataSvc::queryInterface(riid, ppvInterface);
    00167   }
    00168   addRef();
    00169   return StatusCode::SUCCESS;
    00170 }
    00171
    00173 StatusCode DetDataSvc::clearStore()   {
    00174
    00175   MsgStream log(msgSvc(), name());
    00176
    00177   DataSvc::clearStore().ignore();
    00178
    00179   if( m_usePersistency ) {
    00180     // Create root address
    00181     unsigned long iargs[]    = {0,0};
    00182     const std::string args[] = {m_detDbLocation, m_detDbRootName};
    00183     IOpaqueAddress*   rootAddr;
    00184     StatusCode sc = m_addrCreator->createAddress (m_detStorageType,
    00185                                                   CLID_Catalog,
    00186                                                   args,
    00187                                                   iargs,
    00188                                                   rootAddr);
    00189     // Set detector data store root
    00190     if( sc.isSuccess() ) {
    00191       std::string dbrName = "/" + m_detDbRootName;
    00192       sc = i_setRoot( dbrName, rootAddr );
    00193       if( sc.isFailure() ) {
    00194         log << MSG::ERROR
    00195             << "Unable to set detector data store root" << endreq;
    00196       }
    00197     } else {
    00198       log << MSG::ERROR << "Unable to create address for  /dd" << endreq;
    00199     }
    00200     return sc;
    00201
    00202   }
    00203   return StatusCode::SUCCESS;
    00204
    00205 }
    00206
    00208 DetDataSvc::DetDataSvc(const std::string& name,ISvcLocator* svc) :
    00209   DataSvc(name,svc), m_eventTime(0)  {
    00210   declareProperty("DetStorageType",  m_detStorageType = XML_StorageType );
    00211   declareProperty("DetDbLocation",   m_detDbLocation  = "empty" );
    00212   declareProperty("DetDbRootName",   m_detDbRootName  = "dd" );
    00213   declareProperty("UsePersistency",  m_usePersistency = false );
    00214   declareProperty("PersistencySvc",  m_persistencySvcName = "DetectorPersistencySvc" );
    00215   m_rootName = "/dd";
    00216   m_rootCLID = CLID_Catalog;
    00217   m_addrCreator = 0;
    00218 }
    00219
    00221 DetDataSvc::~DetDataSvc()  {
    00222 }
    00223
    00225 void DetDataSvc::setEventTime ( const Gaudi::Time& time ) {
    00226   // m_eventTime = TimePoint( time );
    00227   m_eventTime = time;
    00228   if ( msgSvc()->outputLevel() <= MSG::DEBUG) {
    00229     MsgStream log( msgSvc(), name() );
    00230     log << MSG::DEBUG << "Event Time set to " << eventTime() << endmsg;
    00231   }
    00232 }
    00233
    00235 bool DetDataSvc::validEventTime ( ) const {
    00236   return true;
    00237 }
    00238
    00240 const Gaudi::Time& DetDataSvc::eventTime ( ) const {
    00241   return m_eventTime;
    00242 }
    00243
    00245 void DetDataSvc::handle ( const Incident& inc ) {
    00246   MsgStream log( msgSvc(), name() );
    00247   log << MSG::DEBUG << "New incident received" << endreq;
    00248   log << MSG::DEBUG << "Incident source: " << inc.source() << endreq;
    00249   log << MSG::DEBUG << "Incident type: " << inc.type() << endreq;
    00250   return;
    00251 }
    00252
    00255 StatusCode DetDataSvc::updateObject( DataObject* toUpdate ) {
    00256
    00257   MsgStream log( msgSvc(), name() );
    00258   log << MSG::DEBUG << "Method updateObject starting" << endreq;
    00259
    00260   // Check that object to update exists
    00261   if ( 0 == toUpdate ) {
    00262     log << MSG::ERROR
    00263         << "There is no DataObject to update" << endreq;
    00264     return INVALID_OBJECT;
    00265   }
    00266
    00267   // Retrieve IValidity interface of object to update
    00268   IValidity* condition = dynamic_cast<IValidity*>( toUpdate );
    00269   if ( 0 == condition ) {
    00270     log << MSG::WARNING
    00271         << "Cannot update DataObject: DataObject does not implement IValidity"
    00272         << endreq;
    00273     return StatusCode::SUCCESS;
    00274   }
    00275
    00276   // Check that the event time has been defined
    00277   if ( !validEventTime() ) {
    00278     log << MSG::WARNING
    00279         << "Cannot update DataObject: event time undefined"
    00280         << endreq;
    00281     return StatusCode::SUCCESS;
    00282   }
    00283
    00284   // No need to update if condition is valid
    00285   if ( condition->isValid( eventTime() ) ) {
    00286     log << MSG::DEBUG
    00287         << "DataObject is valid: no need to update" << endreq;
    00288     return StatusCode::SUCCESS;
    00289   } else {
    00290     log << MSG::DEBUG
    00291         << "DataObject is invalid: update it" << endreq;
    00292   }
    00293
    00294   // TODO: before loading updated object, update HERE its parent in data store
    00295
    00296   // Now delegate update to the conversion service by calling the base class
    00297   log << MSG::DEBUG
    00298       << "Delegate update to relevant conversion service" << endreq;
    00299   StatusCode status = DataSvc::updateObject(toUpdate);
    00300   if ( !status.isSuccess() ) {
    00301     log << MSG::ERROR
    00302         << "Could not update DataObject" << endreq;
    00303     if ( status == NO_DATA_LOADER )
    00304       log << MSG::ERROR << "There is no data loader" << endreq;
    00305     return status;
    00306   }
    00307
    00308   // Now cross-check that the new condition is valid
    00309   condition = dynamic_cast<IValidity*>(toUpdate);
    00310   if ( 0 == condition ) {
    00311     log << MSG::ERROR
    00312         << "Updated DataObject does not implement IValidity" << endreq;
    00313     return StatusCode::FAILURE;
    00314   }
    00315   if ( !condition->isValid( eventTime() ) ) {
    00316     log << MSG::ERROR
    00317         << "Updated DataObject is not valid" << endreq;
    00318     log << MSG::ERROR
    00319         << "Are you sure the conversion service has updated it?" << endreq;
    00320     return StatusCode::FAILURE;
    00321   }
    00322
    00323   // DataObject was successfully updated
    00324   log << MSG::DEBUG << "Method updateObject exiting successfully" << endreq;
    00325   return StatusCode::SUCCESS;
    00326
    00327 }
    00328