| # Gaudi Framework, version v25r0 |

Home |  | Generated: Mon Feb 17 2014

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

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"
5 #include "GaudiKernel/IAddressCreator.h"
6 #include "GaudiKernel/IConversionSvc.h"
7 #include "GaudiKernel/IOpaqueAddress.h"
8 #include "GaudiKernel/ISvcLocator.h"
9 #include "GaudiKernel/IValidity.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
24 DECLARE_COMPONENT(DetDataSvc)
25
26 // Service initialization
27 StatusCode DetDataSvc::initialize() {
28 // Call base class initialization
29 StatusCode sc = DataSvc::initialize();
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
55 StatusCode DetDataSvc::setupDetectorDescription() {
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,
86 CLID_Catalog,
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
114 StatusCode DetDataSvc::reinitialize() {
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
132 StatusCode DetDataSvc::finalize()
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
151 StatusCode DetDataSvc::clearStore() {
152
153 MsgStream log(msgSvc(), name());
154
155 DataSvc::clearStore().ignore();
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";
193 m_rootCLID = CLID_Catalog;
194 m_addrCreator = 0;
195 }
196
198 DetDataSvc::~DetDataSvc() {
199 }
200
202 void DetDataSvc::setEventTime ( const Gaudi::Time& time ) {
203 m_eventTime = time;
204 DEBMSG << "Event Time set to " << eventTime() << endmsg;
205 }
206
208 bool DetDataSvc::validEventTime ( ) const {
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
229 StatusCode DetDataSvc::updateObject( DataObject* toUpdate ) {
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 }
282 if ( FSMState() == Gaudi::StateMachine::RUNNING &&
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 }