Gaudi Framework, version v25r2

Home   Generated: Wed Jun 4 2014
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DetDataSvc.cpp
Go to the documentation of this file.
1 #define DETECTORDATASVC_DETDATASVC_CPP
2 
3 // Include files
4 #include "DetDataSvc.h"
10 #include "GaudiKernel/DataObject.h"
11 #include "GaudiKernel/MsgStream.h"
12 #include "GaudiKernel/System.h"
13 using System::isEnvSet;
14 using System::getEnv;
15 
16 #define ON_DEBUG if (UNLIKELY(outputLevel() <= MSG::DEBUG))
17 #define ON_VERBOSE if (UNLIKELY(outputLevel() <= MSG::VERBOSE))
18 
19 #define DEBMSG ON_DEBUG debug()
20 #define VERMSG ON_VERBOSE verbose()
21 
22 // Instantiation of a static factory class used by clients to create
23 // instances of this service
25 
26 // Service initialization
28  // Call base class initialization
30  if( UNLIKELY(sc.isFailure()) ) return sc;
31 
32  // Set Data Loader
33  SmartIF<IConversionSvc> cnv_svc(serviceLocator()->service(m_persistencySvcName));
34  if( UNLIKELY(!cnv_svc.isValid()) ) {
35  error() << "Unable to retrieve " << m_persistencySvcName << endmsg;
36  return StatusCode::FAILURE;
37  }
38 
39  sc = setDataLoader(cnv_svc);
40  if( UNLIKELY(sc.isFailure()) ) {
41  error() << "Unable to set DataLoader" << endmsg;
42  return sc;
43  }
44 
45  // Get address creator from the DetectorPersistencySvc
46  m_addrCreator = cnv_svc;
47  if ( UNLIKELY(!m_addrCreator.isValid()) ) {
48  error() << "Unable to get AddressCreator." << endmsg;
49  return StatusCode::FAILURE;
50  }
51 
52  return setupDetectorDescription();
53 }
54 
56  // Initialize the detector data transient store
57  ON_DEBUG {
58  debug() << "Storage type used is: " << m_detStorageType << endmsg;
59  debug() << "Setting DetectorDataSvc root node... " << endmsg;
60  }
61 
62  if( m_usePersistency ) {
63 
64  IOpaqueAddress* rootAddr;
65  if( m_detDbLocation.empty() || "empty" == m_detDbLocation ) {
66 
67  // if the name of DBlocation is not given - construct it!
68  // by retrieving the value of XMLDDBROOT
69 
71  if ( isEnvSet("XMLDDDBROOT") ) {
72  m_detDbLocation = getEnv("XMLDDDBROOT");
73  m_detDbLocation += "/DDDB/lhcb.xml";
74  }
75  }
76  if( m_detDbLocation.empty() || "empty" == m_detDbLocation ) {
77  error() << "Detector data location name not set. Detector data will "
78  "not be found." << endmsg;
79  return StatusCode::FAILURE;
80  }
81  else {
82  // Create address
83  unsigned long iargs[]={0,0};
84  const std::string args[] = {m_detDbLocation, m_detDbRootName};
85  StatusCode sc = m_addrCreator->createAddress (m_detStorageType,
87  args,
88  iargs,
89  rootAddr);
90  if( sc.isSuccess() ) {
91  std::string dbrName = "/" + m_detDbRootName;
92  sc = i_setRoot( dbrName, rootAddr );
93  if( sc.isFailure() ) {
94  error() << "Unable to set detector data store root" << endmsg;
95  return sc;
96  }
97  }
98  else {
99  error() << "Unable to create address for /dd" << endmsg;
100  return sc;
101  }
102  }
103  // Writing the description file in the output log file [bugs #2854]
104  always() << "Detector description database: " << m_detDbLocation << endmsg;
105  }
106  else {
107  info() << "Detector description not requested to be loaded" << endmsg;
108  }
109 
110  return StatusCode::SUCCESS;
111 }
112 
113 // Service initialisation
115  // The DetectorDataSvc does not need to be re-initialized. If it is done
116  // all the Algorithms having references to DetectorElements will become
117  // invalid and crash the program. (Pere Mato)
118 
119  // Call base class reinitialization
120  //StatusCode sc = DataSvc::reinitialize();
121  //if( sc.isFailure() ) return sc;
122 
123  // Delete the associated event time
124  //if( 0 != m_eventTime ) delete m_eventTime;
125  //m_eventTimeDefined = false;
126 
127  //return setupDetectorDescription();
128  return StatusCode::SUCCESS;
129 }
130 
133 {
134  DEBMSG << "Finalizing" << endmsg;
135 
136  // clears the store
137  m_usePersistency = false; // avoid creation of an empty store when clearing
138  clearStore().ignore();
139 
140  // Releases the address creator
141  m_addrCreator = 0;
142 
143  // Releases the DataLoader
144  setDataLoader(0).ignore();
145 
146  // Finalize the base class
147  return DataSvc::finalize();
148 }
149 
152 
153  MsgStream log(msgSvc(), name());
154 
156 
157  if( m_usePersistency ) {
158  // Create root address
159  unsigned long iargs[] = {0,0};
160  const std::string args[] = {m_detDbLocation, m_detDbRootName};
161  IOpaqueAddress* rootAddr;
162  StatusCode sc = m_addrCreator->createAddress (m_detStorageType,
163  CLID_Catalog,
164  args,
165  iargs,
166  rootAddr);
167  // Set detector data store root
168  if( sc.isSuccess() ) {
169  std::string dbrName = "/" + m_detDbRootName;
170  sc = i_setRoot( dbrName, rootAddr );
171  if( sc.isFailure() ) {
172  error() << "Unable to set detector data store root" << endmsg;
173  }
174  } else {
175  error() << "Unable to create address for /dd" << endmsg;
176  }
177  return sc;
178 
179  }
180  return StatusCode::SUCCESS;
181 
182 }
183 
185 DetDataSvc::DetDataSvc(const std::string& name,ISvcLocator* svc) :
186  base_class(name,svc), m_eventTime(0) {
187  declareProperty("DetStorageType", m_detStorageType = XML_StorageType );
188  declareProperty("DetDbLocation", m_detDbLocation = "empty" );
189  declareProperty("DetDbRootName", m_detDbRootName = "dd" );
190  declareProperty("UsePersistency", m_usePersistency = false );
191  declareProperty("PersistencySvc", m_persistencySvcName = "DetectorPersistencySvc" );
192  m_rootName = "/dd";
194  m_addrCreator = 0;
195 }
196 
199 }
200 
202 void DetDataSvc::setEventTime ( const Gaudi::Time& time ) {
203  m_eventTime = time;
204  DEBMSG << "Event Time set to " << eventTime() << endmsg;
205 }
206 
209  return true;
210 }
211 
213 const Gaudi::Time& DetDataSvc::eventTime ( ) const {
214  return m_eventTime;
215 }
216 
218 void DetDataSvc::handle ( const Incident& inc ) {
219  ON_DEBUG {
220  debug() << "New incident received" << endmsg;
221  debug() << "Incident source: " << inc.source() << endmsg;
222  debug() << "Incident type: " << inc.type() << endmsg;
223  }
224  return;
225 }
226 
230 
231  DEBMSG << "Method updateObject starting" << endmsg;
232 
233  // Check that object to update exists
234  if ( 0 == toUpdate ) {
235  error() << "There is no DataObject to update" << endmsg;
236  return INVALID_OBJECT;
237  }
238 
239  // Retrieve IValidity interface of object to update
240  IValidity* condition = dynamic_cast<IValidity*>( toUpdate );
241  if ( 0 == condition ) {
242  warning()
243  << "Cannot update DataObject: DataObject does not implement IValidity"
244  << endmsg;
245  return StatusCode::SUCCESS;
246  }
247 
248  // Check that the event time has been defined
249  if ( !validEventTime() ) {
250  warning()
251  << "Cannot update DataObject: event time undefined"
252  << endmsg;
253  return StatusCode::SUCCESS;
254  }
255 
256  // No need to update if condition is valid
257  if ( condition->isValid( eventTime() ) ) {
258  DEBMSG << "DataObject is valid: no need to update" << endmsg;
259  return StatusCode::SUCCESS;
260  } else {
261  DEBMSG << "DataObject is invalid: update it" << endmsg;
262  }
263 
264  // TODO: before loading updated object, update HERE its parent in data store
265 
266  // Now delegate update to the conversion service by calling the base class
267  DEBMSG << "Delegate update to relevant conversion service" << endmsg;
268  StatusCode status = DataSvc::updateObject(toUpdate);
269  if ( !status.isSuccess() ) {
270  error() << "Could not update DataObject" << endmsg;
271  if ( status == NO_DATA_LOADER )
272  error() << "There is no data loader" << endmsg;
273  return status;
274  }
275 
276  // Now cross-check that the new condition is valid
277  condition = dynamic_cast<IValidity*>(toUpdate);
278  if ( 0 == condition ) {
279  error() << "Updated DataObject does not implement IValidity" << endmsg;
280  return StatusCode::FAILURE;
281  }
283  !condition->isValid( eventTime() ) ) {
284  error() << "Updated DataObject is not valid" << endmsg;
285  error() << "Are you sure the conversion service has updated it?" << endmsg;
286  return StatusCode::FAILURE;
287  }
288 
289  // DataObject was successfully updated
290  DEBMSG << "Method updateObject exiting successfully" << endmsg;
291  return StatusCode::SUCCESS;
292 
293 }

Generated at Wed Jun 4 2014 14:48:58 for Gaudi Framework, version v25r2 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004