| # Gaudi Framework, version v22r2 |

Home |  | Generated: Tue May 10 2011

Public Member Functions | Private Member Functions | Private Attributes | Friends

# DetDataSvc Class Reference

--------------------------------------------------------------------------- More...

`#include <DetectorDataSvc/DetDataSvc.h>`

Inheritance diagram for DetDataSvc:
[legend]
Collaboration diagram for DetDataSvc:
[legend]

List of all members.

## 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 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.
SmartIF< IAddressCreator > | m_addrCreator
| Address Creator to be used.
## Friends
class | SvcFactory< DetDataSvc >

## Detailed Description

---------------------------------------------------------------------------

A DataSvc specialized in detector data.

Author:
  Marco Clemencic (previous author unknown)

Definition at line 24 of file DetDataSvc.h.

## Constructor & Destructor Documentation

DetDataSvc::DetDataSvc | ( | const std::string & | name,
|  | ISvcLocator * | svc
| ) |  |

Standard Constructor.

Definition at line 191 of file DetDataSvc.cpp.

                                                                 :
      base_class(name,svc), m_eventTime(0)  {
      declareProperty("DetStorageType",  m_detStorageType = XML_StorageType );
      declareProperty("DetDbLocation",   m_detDbLocation  = "empty" );
      declareProperty("DetDbRootName",   m_detDbRootName  = "dd" );
      declareProperty("UsePersistency",  m_usePersistency = false );
      declareProperty("PersistencySvc",  m_persistencySvcName = "DetectorPersistencySvc" );
      m_rootName = "/dd";
      m_rootCLID = CLID_Catalog;
      m_addrCreator = 0;
    }

DetDataSvc::~DetDataSvc | ( | ) | `[virtual]`

Standard Destructor.

Definition at line 204 of file DetDataSvc.cpp.

                             {
    }

## Member Function Documentation

StatusCode DetDataSvc::clearStore | ( | ) | `[virtual]`

Remove all data objects in the data store.

Reimplemented from DataSvc.

Definition at line 156 of file DetDataSvc.cpp.

                                        {

      MsgStream log(msgSvc(), name());

      DataSvc::clearStore().ignore();

      if( m_usePersistency ) {
        // Create root address
        unsigned long iargs[]    = {0,0};
        const std::string args[] = {m_detDbLocation, m_detDbRootName};
        IOpaqueAddress*   rootAddr;
        StatusCode sc = m_addrCreator->createAddress (m_detStorageType,
                                                      CLID_Catalog,
                                                      args,
                                                      iargs,
                                                      rootAddr);
        // Set detector data store root
        if( sc.isSuccess() ) {
          std::string dbrName = "/" + m_detDbRootName;
          sc = i_setRoot( dbrName, rootAddr );
          if( sc.isFailure() ) {
            log << MSG::ERROR
                << "Unable to set detector data store root" << endmsg;
          }
        } else {
          log << MSG::ERROR << "Unable to create address for  /dd" << endmsg;
        }
        return sc;

      }
      return StatusCode::SUCCESS;

    }

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

Get the event time.

Definition at line 222 of file DetDataSvc.cpp.

                                                   {
      return m_eventTime;
    }

StatusCode DetDataSvc::finalize | ( | void | ) | `[virtual]`

Finalize the service.

Reimplemented from DataSvc.

Definition at line 136 of file DetDataSvc.cpp.

    {
      MsgStream log(msgSvc(), name());
      log << MSG::DEBUG << "Finalizing" << endmsg;

      // clears the store
      m_usePersistency = false; // avoid creation of an empty store when clearing
      clearStore().ignore();

      // Releases the address creator
      m_addrCreator = 0;

      // Releases the DataLoader
      setDataLoader(0).ignore();

      // Finalize the base class
      return DataSvc::finalize();
    }

void DetDataSvc::handle | ( | const Incident & | inc ) | `[virtual]`

Inform that a new incident has occured.

Definition at line 227 of file DetDataSvc.cpp.

                                                  {
      MsgStream log( msgSvc(), name() );
      log << MSG::DEBUG << "New incident received" << endmsg;
      log << MSG::DEBUG << "Incident source: " << inc.source() << endmsg;
      log << MSG::DEBUG << "Incident type: " << inc.type() << endmsg;
      return;
    }

StatusCode DetDataSvc::initialize | ( | ) | `[virtual]`

Initialize the service.

Reimplemented from DataSvc.

Definition at line 23 of file DetDataSvc.cpp.

                                        {
      MsgStream log(msgSvc(), name());

      // Call base class initialization
      StatusCode sc  = DataSvc::initialize();
      if( sc.isFailure() ) return sc;

      // Set Data Loader
      SmartIF<IConversionSvc> cnv_svc(serviceLocator()->service(m_persistencySvcName));
      if( !cnv_svc.isValid() ) {
        log << MSG::ERROR << "Unable to retrieve " << m_persistencySvcName << endmsg;
        return StatusCode::FAILURE;
      }

      sc = setDataLoader(cnv_svc);
      if( sc.isFailure() ) {
        log << MSG::ERROR << "Unable to set DataLoader" << endmsg;
        return sc;
      }

      // Get address creator from the DetectorPersistencySvc
      m_addrCreator = cnv_svc;
      if (!m_addrCreator.isValid()) {
        log << MSG::ERROR << "Unable to get AddressCreator." << endmsg;
        return StatusCode::FAILURE;
      }

      return setupDetectorDescription();
    }

StatusCode DetDataSvc::reinitialize | ( | ) | `[virtual]`

Initialize the service.

Reimplemented from DataSvc.

Definition at line 116 of file DetDataSvc.cpp.

                                          {
      MsgStream log(msgSvc(), name());

      // The DetectorDataSvc does not need to be re-initialized. If it is done
      // all the Algorithms having references to DetectorElements will become
      // invalid and crash the program.  (Pere Mato)

      // Call base class reinitialization
      //StatusCode sc  = DataSvc::reinitialize();
      //if( sc.isFailure() ) return sc;

      // Delete the associated event time
      //if( 0 != m_eventTime ) delete m_eventTime;
      //m_eventTimeDefined = false;

      //return setupDetectorDescription();
      return StatusCode::SUCCESS;
    }

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

Set the new event time.

Definition at line 208 of file DetDataSvc.cpp.

                                                          {
      m_eventTime = time;
      if ( msgSvc()->outputLevel() <= MSG::DEBUG) {
        MsgStream log( msgSvc(), name() );
        log << MSG::DEBUG << "Event Time set to " << eventTime() << endmsg;
      }
    }

StatusCode DetDataSvc::setupDetectorDescription | ( | ) | `[private]`

Deal with Detector Description initialization.

Todo:
  : remove references to obsolete package XMLDDDBROOT

Definition at line 53 of file DetDataSvc.cpp.

                                                    {
      // Now you can use the MsgSvc
      MsgStream log(msgSvc(), name());

      // Initialize the detector data transient store
      log << MSG::DEBUG << "Storage type used is: " << m_detStorageType << endmsg;
      log << MSG::DEBUG << "Setting DetectorDataSvc root node... " << endmsg;

      if( m_usePersistency ) {

        IOpaqueAddress* rootAddr;
        if( m_detDbLocation.empty() || "empty" == m_detDbLocation ) {

          // if the name of DBlocation is not given - construct it!
              // by retrieving the value of XMLDDBROOT

          if ( isEnvSet("XMLDDDBROOT") ) {
            m_detDbLocation  = getEnv("XMLDDDBROOT");
            m_detDbLocation += "/DDDB/lhcb.xml";
          }
        }
        if( m_detDbLocation.empty() || "empty" == m_detDbLocation ) {
          log << MSG::ERROR
              << "Detector data location name not set. Detector data will "
              << "not be found." << endmsg;
          return StatusCode::FAILURE;
        }
        else {
          // Create address
          unsigned long iargs[]={0,0};
          const std::string args[] = {m_detDbLocation, m_detDbRootName};
          StatusCode sc = m_addrCreator->createAddress (m_detStorageType,
                                                        CLID_Catalog,
                                                        args,
                                                        iargs,
                                                        rootAddr);
          if( sc.isSuccess() ) {
            std::string dbrName = "/" + m_detDbRootName;
            sc = i_setRoot( dbrName, rootAddr );
            if( sc.isFailure() ) {
              log << MSG::ERROR << "Unable to set detector data store root"
                  << endmsg;
              return sc;
            }
          }
          else {
            log << MSG::ERROR << "Unable to create address for  /dd" << endmsg;
            return sc;
          }
        }
        // Writing the description file in the output log file [bugs #2854]
        log << MSG::ALWAYS << "Detector description database: " << m_detDbLocation << endmsg;
      }
      else {
        log << MSG::INFO << "Detector description not requested to be loaded"
            << endmsg;
      }

      return StatusCode::SUCCESS;
    }

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 237 of file DetDataSvc.cpp.

                                                              {

      MsgStream log( msgSvc(), name() );
      log << MSG::DEBUG << "Method updateObject starting" << endmsg;

      // Check that object to update exists
      if ( 0 == toUpdate ) {
        log << MSG::ERROR
            << "There is no DataObject to update" << endmsg;
        return INVALID_OBJECT;
      }

      // Retrieve IValidity interface of object to update
      IValidity* condition = dynamic_cast<IValidity*>( toUpdate );
      if ( 0 == condition ) {
        log << MSG::WARNING
            << "Cannot update DataObject: DataObject does not implement IValidity"
            << endmsg;
        return StatusCode::SUCCESS;
      }

      // Check that the event time has been defined
      if ( !validEventTime() ) {
        log << MSG::WARNING
            << "Cannot update DataObject: event time undefined"
            << endmsg;
        return StatusCode::SUCCESS;
      }

      // No need to update if condition is valid
      if ( condition->isValid( eventTime() ) ) {
        log << MSG::DEBUG
            << "DataObject is valid: no need to update" << endmsg;
        return StatusCode::SUCCESS;
      } else {
        log << MSG::DEBUG
            << "DataObject is invalid: update it" << endmsg;
      }

      // TODO: before loading updated object, update HERE its parent in data store

      // Now delegate update to the conversion service by calling the base class
      log << MSG::DEBUG
          << "Delegate update to relevant conversion service" << endmsg;
      StatusCode status = DataSvc::updateObject(toUpdate);
      if ( !status.isSuccess() ) {
        log << MSG::ERROR
            << "Could not update DataObject" << endmsg;
        if ( status == NO_DATA_LOADER )
          log << MSG::ERROR << "There is no data loader" << endmsg;
        return status;
      }

      // Now cross-check that the new condition is valid
      condition = dynamic_cast<IValidity*>(toUpdate);
      if ( 0 == condition ) {
        log << MSG::ERROR
            << "Updated DataObject does not implement IValidity" << endmsg;
        return StatusCode::FAILURE;
      }
      if ( FSMState() == Gaudi::StateMachine::RUNNING &&
           !condition->isValid( eventTime() ) ) {
        log << MSG::ERROR
            << "Updated DataObject is not valid" << endmsg;
        log << MSG::ERROR
            << "Are you sure the conversion service has updated it?" << endmsg;
        return StatusCode::FAILURE;
      }

      // DataObject was successfully updated
      log << MSG::DEBUG << "Method updateObject exiting successfully" << endmsg;
      return StatusCode::SUCCESS;

    }

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

Check if the event time has been set.

Kept for backward compatibility, returns always true.

Definition at line 217 of file DetDataSvc.cpp.

                                            {
      return true;
    }

## Friends And Related Function Documentation

friend class SvcFactory< DetDataSvc >`[friend]`

Definition at line 27 of file DetDataSvc.h.

## Member Data Documentation

SmartIF<IAddressCreator> DetDataSvc::m_addrCreator`[private]`

Address Creator to be used.

Definition at line 103 of file DetDataSvc.h.

std::string DetDataSvc::m_detDbLocation`[private]`

Location of detector Db (filename,URL)

Definition at line 88 of file DetDataSvc.h.

std::string DetDataSvc::m_detDbRootName`[private]`

Name of the root node of the detector.

Definition at line 91 of file DetDataSvc.h.

int DetDataSvc::m_detStorageType`[private]`

Detector Data Persistency Storage type.

Definition at line 85 of file DetDataSvc.h.

Gaudi::Time DetDataSvc::m_eventTime`[private]`

Current event time.

Definition at line 100 of file DetDataSvc.h.

std::string DetDataSvc::m_persistencySvcName`[private]`

Name of the persistency service.

Definition at line 94 of file DetDataSvc.h.

bool DetDataSvc::m_usePersistency`[private]`

Flag to control if the persistency is required.

Definition at line 97 of file DetDataSvc.h.

The documentation for this class was generated from the following files:

- /afs/.cern.ch/sw/Gaudi/releases/GAUDI/GAUDI_v22r2/GaudiSvc/src/DetectorDataSvc/DetDataSvc.h
- /afs/.cern.ch/sw/Gaudi/releases/GAUDI/GAUDI_v22r2/GaudiSvc/src/DetectorDataSvc/DetDataSvc.cpp

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines