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:
Inheritance graph
[legend]
Collaboration diagram for DetDataSvc:
Collaboration graph
[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< IAddressCreatorm_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

Address Creator to be used.

Definition at line 103 of file DetDataSvc.h.

Location of detector Db (filename,URL)

Definition at line 88 of file DetDataSvc.h.

Name of the root node of the detector.

Definition at line 91 of file DetDataSvc.h.

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.

Name of the persistency service.

Definition at line 94 of file DetDataSvc.h.

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:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Tue May 10 2011 18:54:39 for Gaudi Framework, version v22r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004