Gaudi Framework, version v20r2

Generated: 18 Jul 2008

DetDataSvc Class Reference

#include <DetectorDataSvc/DetDataSvc.h>

Inheritance diagram for DetDataSvc:

Inheritance graph
[legend]
Collaboration diagram for DetDataSvc:

Collaboration graph
[legend]
List of all members.

Detailed Description

A DataSvc specialised in detector data.

Author:
Marco Clemencic (previous author unknown)

Definition at line 24 of file DetDataSvc.h.

Public Member Functions

virtual StatusCode initialize ()
 Initialize the service.
virtual StatusCode reinitialize ()
 Initialize the service.
virtual StatusCode finalize ()
 Finalize the service.
virtual StatusCode clearStore ()
 Remove all data objects in the data store.
virtual StatusCode updateObject (DataObject *toUpdate)
 Update object.
 DetDataSvc (const std::string &name, ISvcLocator *svc)
 Standard Constructor.
virtual ~DetDataSvc ()
 Standard Destructor.
virtual StatusCode queryInterface (const InterfaceID &riid, void **ppvInterface)
 Query the interface of the service.
virtual const bool validEventTime () const
 Check if the event time has been set.
virtual const Gaudi::Time & eventTime () const
 Get the event time.
virtual void setEventTime (const Gaudi::Time &time)
 Set the new event time.
virtual void handle (const Incident &)
 Inform that a new incident has occured.

Private Member Functions

StatusCode setupDetectorDescription ()
 Deal with Detector Description initialization.

Private Attributes

int m_detStorageType
 Detector Data Persistency Storage type.
std::string m_detDbLocation
 Location of detector Db (filename,URL).
std::string m_detDbRootName
 Name of the root node of the detector.
std::string m_persistencySvcName
 Name of the persistency service.
bool m_usePersistency
 Flag to control if the persistency is required.
Gaudi::Time m_eventTime
 Current event time.
IAddressCreatorm_addrCreator
 Address Creator to be used.

Friends

class SvcFactory< DetDataSvc >


Constructor & Destructor Documentation

DetDataSvc::DetDataSvc ( const std::string name,
ISvcLocator svc 
)

Standard Constructor.

Definition at line 208 of file DetDataSvc.cpp.

References CLID_Catalog, Service::declareProperty(), m_addrCreator, m_detDbLocation, m_detDbRootName, m_detStorageType, m_persistencySvcName, DataSvc::m_rootCLID, DataSvc::m_rootName, m_usePersistency, and XML_StorageType.

00208                                                              :
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 }

DetDataSvc::~DetDataSvc (  )  [virtual]

Standard Destructor.

Definition at line 221 of file DetDataSvc.cpp.

00221                          {
00222 }


Member Function Documentation

StatusCode DetDataSvc::initialize (  )  [virtual]

Initialize the service.

Reimplemented from DataSvc.

Definition at line 20 of file DetDataSvc.cpp.

References endreq(), MSG::ERROR, StatusCode::FAILURE, IID_IAddressCreator, DataSvc::initialize(), StatusCode::isFailure(), name, IInterface::queryInterface(), and IInterface::release().

00020                                     {
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 }

StatusCode DetDataSvc::reinitialize (  )  [virtual]

Initialize the service.

Reimplemented from DataSvc.

Definition at line 114 of file DetDataSvc.cpp.

References Service::msgSvc(), Service::name(), and StatusCode::SUCCESS.

00114                                       {
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 }

StatusCode DetDataSvc::finalize (  )  [virtual]

Finalize the service.

Reimplemented from DataSvc.

Definition at line 134 of file DetDataSvc.cpp.

References clearStore(), MSG::DEBUG, endreq(), DataSvc::finalize(), StatusCode::ignore(), m_addrCreator, m_usePersistency, Service::msgSvc(), Service::name(), IInterface::release(), and DataSvc::setDataLoader().

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 }

StatusCode DetDataSvc::clearStore (  )  [virtual]

Remove all data objects in the data store.

Reimplemented from DataSvc.

Definition at line 173 of file DetDataSvc.cpp.

References DataSvc::clearStore(), CLID_Catalog, IAddressCreator::createAddress(), endreq(), MSG::ERROR, DataSvc::i_setRoot(), StatusCode::ignore(), StatusCode::isFailure(), StatusCode::isSuccess(), m_addrCreator, m_detDbLocation, m_detDbRootName, m_detStorageType, m_usePersistency, Service::msgSvc(), Service::name(), and StatusCode::SUCCESS.

Referenced by finalize().

00173                                     {
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 }

StatusCode DetDataSvc::updateObject ( DataObject toUpdate  )  [virtual]

Update object.

Todo:
update also its ancestors in the data store if necessary

Reimplemented from DataSvc.

Definition at line 255 of file DetDataSvc.cpp.

References MSG::DEBUG, endreq(), MSG::ERROR, eventTime(), StatusCode::FAILURE, IDataProviderSvc::INVALID_OBJECT, StatusCode::isSuccess(), IValidity::isValid(), Service::msgSvc(), Service::name(), IDataProviderSvc::NO_DATA_LOADER, StatusCode::SUCCESS, DataSvc::updateObject(), validEventTime(), and MSG::WARNING.

00255                                                           {
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 }

StatusCode DetDataSvc::setupDetectorDescription (  )  [private]

Deal with Detector Description initialization.

Definition at line 52 of file DetDataSvc.cpp.

References MSG::ALWAYS, CLID_Catalog, IAddressCreator::createAddress(), MSG::DEBUG, std::basic_string< _CharT, _Traits, _Alloc >::empty(), endreq(), MSG::ERROR, StatusCode::FAILURE, DataSvc::i_setRoot(), MSG::INFO, StatusCode::isFailure(), StatusCode::isSuccess(), m_addrCreator, m_detDbLocation, m_detDbRootName, m_detStorageType, m_usePersistency, Service::msgSvc(), Service::name(), and StatusCode::SUCCESS.

00052                                                 {
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 }

StatusCode DetDataSvc::queryInterface ( const InterfaceID riid,
void **  ppvInterface 
) [virtual]

Query the interface of the service.

Reimplemented from DataSvc.

Definition at line 156 of file DetDataSvc.cpp.

References IInterface::addRef(), IID_IDetDataSvc, IID_IIncidentListener, DataSvc::queryInterface(), StatusCode::SUCCESS, and InterfaceID::versionMatch().

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 }

const bool DetDataSvc::validEventTime (  )  const [virtual]

Check if the event time has been set.

Kept for backward compatibility, returns always true.

Implements IDetDataSvc.

Definition at line 235 of file DetDataSvc.cpp.

Referenced by updateObject().

00235                                               { 
00236   return true; 
00237 }

const Gaudi::Time & DetDataSvc::eventTime (  )  const [virtual]

Get the event time.

Implements IDetDataSvc.

Definition at line 240 of file DetDataSvc.cpp.

References m_eventTime.

Referenced by setEventTime(), and updateObject().

00240                                                { 
00241   return m_eventTime; 
00242 }

void DetDataSvc::setEventTime ( const Gaudi::Time &  time  )  [virtual]

Set the new event time.

Implements IDetDataSvc.

Definition at line 225 of file DetDataSvc.cpp.

References MSG::DEBUG, endmsg(), eventTime(), m_eventTime, Service::msgSvc(), Service::name(), and Service::outputLevel().

00225                                                       {
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 }

void DetDataSvc::handle ( const Incident  )  [virtual]

Inform that a new incident has occured.

Implements IIncidentListener.

Definition at line 245 of file DetDataSvc.cpp.

References MSG::DEBUG, endreq(), Service::msgSvc(), Service::name(), Incident::source(), and Incident::type().

00245                                               { 
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 }


Friends And Related Function Documentation

friend class SvcFactory< DetDataSvc > [friend]

Definition at line 29 of file DetDataSvc.h.


Member Data Documentation

int DetDataSvc::m_detStorageType [private]

Detector Data Persistency Storage type.

Definition at line 95 of file DetDataSvc.h.

Referenced by clearStore(), DetDataSvc(), and setupDetectorDescription().

std::string DetDataSvc::m_detDbLocation [private]

Location of detector Db (filename,URL).

Definition at line 98 of file DetDataSvc.h.

Referenced by clearStore(), DetDataSvc(), and setupDetectorDescription().

std::string DetDataSvc::m_detDbRootName [private]

Name of the root node of the detector.

Definition at line 101 of file DetDataSvc.h.

Referenced by clearStore(), DetDataSvc(), and setupDetectorDescription().

std::string DetDataSvc::m_persistencySvcName [private]

Name of the persistency service.

Definition at line 104 of file DetDataSvc.h.

Referenced by DetDataSvc().

bool DetDataSvc::m_usePersistency [private]

Flag to control if the persistency is required.

Definition at line 107 of file DetDataSvc.h.

Referenced by clearStore(), DetDataSvc(), finalize(), and setupDetectorDescription().

Gaudi::Time DetDataSvc::m_eventTime [private]

Current event time.

Definition at line 110 of file DetDataSvc.h.

Referenced by eventTime(), and setEventTime().

IAddressCreator* DetDataSvc::m_addrCreator [private]

Address Creator to be used.

Definition at line 113 of file DetDataSvc.h.

Referenced by clearStore(), DetDataSvc(), finalize(), and setupDetectorDescription().


The documentation for this class was generated from the following files:
Generated at Fri Jul 18 12:07:05 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004