| The Gaudi Framework v32r1 (f65d50dc)

OutputStream.cpp
Go to the documentation of this file.
1 // Framework include files
2 #include "GaudiKernel/IAlgManager.h"
3 #include "GaudiKernel/IConversionSvc.h"
4 #include "GaudiKernel/IDataManagerSvc.h"
5 #include "GaudiKernel/IDataProviderSvc.h"
6 #include "GaudiKernel/IIncidentSvc.h"
7 #include "GaudiKernel/IOpaqueAddress.h"
8 #include "GaudiKernel/IPersistencySvc.h"
9 #include "GaudiKernel/IRegistry.h"
10 #include "GaudiKernel/ISvcLocator.h"
11 #include "GaudiKernel/Incident.h"
12
13 #include "GaudiKernel/AttribStringParser.h"
14 #include "GaudiKernel/DataObject.h"
15 #include "GaudiKernel/DataStoreItem.h"
16 #include "GaudiKernel/MsgStream.h"
17 #include "GaudiKernel/strcasecmp.h"
18
19 #include "OutputStream.h"
20
21 #include <set>
22
23 // Define the algorithm factory for the standard output data writer
24 DECLARE_COMPONENT( OutputStream )
25
26 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) )
27
28 namespace {
29 bool passed( const Gaudi::Algorithm* alg ) {
30 const auto& algState = alg->execState( Gaudi::Hive::currentContext() );
31 return algState.state() == AlgExecState::State::Done && algState.filterPassed();
32 }
33 } // namespace
34
35 // initialize data writer
36 StatusCode OutputStream::initialize() {
37
38 // Reset the number of events written
39 m_events = 0;
40 // Get access to the DataManagerSvc
41 m_pDataManager = serviceLocator()->service( m_storeName );
42 if ( !m_pDataManager ) {
43 fatal() << "Unable to locate IDataManagerSvc interface" << endmsg;
44 return StatusCode::FAILURE;
45 }
46 // Get access to the IncidentService
47 m_incidentSvc = serviceLocator()->service( "IncidentSvc" );
48 if ( !m_incidentSvc ) {
49 warning() << "Error retrieving IncidentSvc." << endmsg;
50 return StatusCode::FAILURE;
51 }
52 // Get access to the assigned data service
53 m_pDataProvider = serviceLocator()->service( m_storeName );
54 if ( !m_pDataProvider ) {
55 fatal() << "Unable to locate IDataProviderSvc interface of " << m_storeName << endmsg;
56 return StatusCode::FAILURE;
57 }
58 if ( hasInput() ) {
59 StatusCode status = connectConversionSvc();
60 if ( !status.isSuccess() ) {
61 fatal() << "Unable to connect to conversion service." << endmsg;
62 if ( m_outputName != "" && m_fireIncidents )
63 m_incidentSvc->fireIncident( Incident( m_outputName, IncidentType::FailOutputFile ) );
64 return status;
65 }
66 }
67
68 // Clear the list with optional items
69 clearItems( m_optItemList );
70 // Clear the item list
71 clearItems( m_itemList );
72
73 // Take the new item list from the properties.
74 ON_DEBUG debug() << "ItemList : " << m_itemNames.value() << endmsg;
75 for ( const auto& i : m_itemNames ) addItem( m_itemList, i );
76
77 // Take the new item list from the properties.
78 ON_DEBUG debug() << "OptItemList : " << m_optItemNames.value() << endmsg;
79 for ( const auto& i : m_optItemNames ) addItem( m_optItemList, i );
80
81 // prepare the algorithm selected dependent locations
82 ON_DEBUG debug() << "AlgDependentItemList : " << m_algDependentItemList.value() << endmsg;
83 for ( const auto& a : m_algDependentItemList ) {
84 // Get the algorithm pointer
85 auto theAlgorithm = decodeAlgorithm( a.first );
86 if ( theAlgorithm ) {
87 // Get the item list for this alg
88 auto& items = m_algDependentItems[theAlgorithm];
89 // Clear the list for this alg
90 clearItems( items );
91 // fill the list again
92 for ( const auto& i : a.second ) addItem( items, i );
93 }
94 }
95
96 // Take the item list to the data service preload list.
97 if ( m_doPreLoad ) {
98 for ( auto& j : m_itemList ) m_pDataProvider->addPreLoadItem( *j ).ignore();
99 // Not working: bad reference counting! pdataSvc->release();
100 }
101
102 if ( m_doPreLoadOpt ) {
103 for ( auto& j : m_optItemList ) m_pDataProvider->addPreLoadItem( *j ).ignore();
104 }
105 info() << "Data source: " << m_storeName.value() << " output: " << m_output.value() << endmsg;
106
107 // Decode the accept, required and veto Algorithms. The logic is the following:
108 // a. The event is accepted if all lists are empty.
109 // b. The event is provisionally accepted if any Algorithm in the accept list
110 // has been executed and has indicated that its filter is passed. This
111 // provisional acceptance can be overridden by the other lists.
112 // c. The event is rejected unless all Algorithms in the required list have
113 // been executed and have indicated that their filter passed.
114 // d. The event is rejected if any Algorithm in the veto list has been
115 // executed and has indicated that its filter has passed.
116 m_acceptNames.useUpdateHandler();
117 m_requireNames.useUpdateHandler();
118 m_vetoNames.useUpdateHandler();
119 return StatusCode::SUCCESS;
120 }
121
122 // terminate data writer
123 StatusCode OutputStream::finalize() {
124 info() << "Events output: " << m_events << endmsg;
125 if ( m_fireIncidents ) m_incidentSvc->fireIncident( Incident( m_outputName, IncidentType::EndOutputFile ) );
126 m_incidentSvc.reset();
127 m_pDataProvider.reset();
128 m_pDataManager.reset();
129 m_pConversionSvc.reset();
130 clearItems( m_optItemList );
131 clearItems( m_itemList );
132 return StatusCode::SUCCESS;
133 }
134
135 // Work entry point
136 StatusCode OutputStream::execute() {
137 // Clear any previously existing item list
138 clearSelection();
139 // Test whether this event should be output
140 if ( isEventAccepted() ) {
141 const StatusCode sc = writeObjects();
142 clearSelection();
143 ++m_events;
144 if ( sc.isSuccess() && m_fireIncidents ) {
145 m_incidentSvc->fireIncident( Incident( m_outputName, IncidentType::WroteToOutputFile ) );
146 } else if ( m_fireIncidents ) {
147 m_incidentSvc->fireIncident( Incident( m_outputName, IncidentType::FailOutputFile ) );
148 }
149 return sc;
150 }
151 return StatusCode::SUCCESS;
152 }
153
154 // Select the different objects and write them to file
155 StatusCode OutputStream::writeObjects() {
156 // Connect the output file to the service
157 StatusCode status = collectObjects();
158 if ( status.isSuccess() ) {
159 IDataSelector* sel = selectedObjects();
160 if ( sel->begin() != sel->end() ) {
161 status = m_pConversionSvc->connectOutput( m_outputName, m_outputType );
162 if ( status.isSuccess() ) {
163 // Now pass the collection to the persistency service
164 IOpaqueAddress* pAddress = nullptr;
165 for ( auto& j : *sel ) {
166 try {
167 const StatusCode iret = m_pConversionSvc->createRep( j, pAddress );
168 if ( !iret.isSuccess() ) {
169 status = iret;
170 continue;
171 }
172 IRegistry* pReg = j->registry();
173 pReg->setAddress( pAddress );
174 } catch ( const std::exception& excpt ) {
175 const std::string loc = ( j->registry() ? j->registry()->identifier() : "UnRegistered" );
176 fatal() << "std::exception during createRep for '" << loc << "' " << System::typeinfoName( typeid( *j ) )
177 << endmsg;
178 fatal() << excpt.what() << endmsg;
179 throw;
180 }
181 }
182 for ( auto& j : *sel ) {
183 try {
184 IRegistry* pReg = j->registry();
185 const StatusCode iret = m_pConversionSvc->fillRepRefs( pReg->address(), j );
186 if ( !iret.isSuccess() ) status = iret;
187 } catch ( const std::exception& excpt ) {
188 const std::string loc = ( j->registry() ? j->registry()->identifier() : "UnRegistered" );
189 fatal() << "std::exception during fillRepRefs for '" << loc << "'" << System::typeinfoName( typeid( *j ) )
190 << endmsg;
191 fatal() << excpt.what() << endmsg;
192 throw;
193 }
194 }
195 // Commit the data if there was no error; otherwise possibly discard
196 if ( status.isSuccess() ) {
197 status = m_pConversionSvc->commitOutput( m_outputName, true );
198 } else {
199 m_pConversionSvc->commitOutput( m_outputName, false ).ignore();
200 }
201 }
202 }
203 }
204 return status;
205 }
206
207 // Place holder to create configurable data store agent
208 bool OutputStream::collect( IRegistry* dir, int level ) {
209 if ( level < m_currentItem->depth() ) {
210 if ( dir->object() ) {
211 /*
212 std::cout << "Analysing ("
213 << dir->name()
214 << ") Object:"
215 << ((dir->object()==0) ? "UNLOADED" : "LOADED")
216 << std::endl;
217 */
218 m_objects.push_back( dir->object() );
219 return true;
220 }
221 }
222 return false;
223 }
224
226 StatusCode OutputStream::collectObjects() {
227 StatusCode status = StatusCode::SUCCESS;
228
229 // Traverse the tree and collect the requested objects
230 for ( auto& i : m_itemList ) {
231 DataObject* obj = nullptr;
232 m_currentItem = i;
233 StatusCode iret = m_pDataProvider->retrieveObject( m_currentItem->path(), obj );
234 if ( iret.isSuccess() ) {
235 iret = collectFromSubTree( obj );
236 if ( !iret.isSuccess() ) status = iret;
237 } else {
238 error() << "Cannot write mandatory object(s) (Not found) " << m_currentItem->path() << endmsg;
239 status = iret;
240 }
241 }
242
243 // Traverse the tree and collect the requested objects (tolerate missing items here)
244 for ( auto& i : m_optItemList ) {
245 DataObject* obj = nullptr;
246 m_currentItem = i;
247 StatusCode iret = m_pDataProvider->retrieveObject( m_currentItem->path(), obj );
248 if ( iret.isSuccess() ) iret = collectFromSubTree( obj );
249 if ( !iret.isSuccess() ) {
250 ON_DEBUG
251 debug() << "Ignore request to write non-mandatory object(s) " << m_currentItem->path() << endmsg;
252 }
253 }
254
255 // Collect objects dependent on particular algorithms
256 for ( const auto& iAlgItems : m_algDependentItems ) {
257 auto alg = iAlgItems.first;
258 const Items& items = iAlgItems.second;
259 if ( passed( alg ) ) {
260 ON_DEBUG
261 debug() << "Algorithm '" << alg->name() << "' fired. Adding " << items << endmsg;
262 for ( const auto& i : items ) {
263 DataObject* obj = nullptr;
264 m_currentItem = i;
265 StatusCode iret = m_pDataProvider->retrieveObject( m_currentItem->path(), obj );
266 if ( iret.isSuccess() ) {
267 iret = collectFromSubTree( obj );
268 if ( !iret.isSuccess() ) status = iret;
269 } else {
270 error() << "Cannot write mandatory (algorithm dependent) object(s) (Not found) " << m_currentItem->path()
271 << endmsg;
272 status = iret;
273 }
274 }
275 }
276 }
277
278 if ( status.isSuccess() ) {
279 // Remove duplicates from the list of objects, preserving the order in the list
280 std::set<DataObject*> unique;
281 std::vector<DataObject*> tmp; // temporary vector with the reduced list
282 tmp.reserve( m_objects.size() );
283 for ( auto& o : m_objects ) {
284 if ( !unique.count( o ) ) {
285 // if the pointer is not in the set, add it to both the set and the temporary vector
286 unique.insert( o );
287 tmp.push_back( o );
288 }
289 }
290 m_objects.swap( tmp ); // swap the data of the two vectors
291 }
292
293 return status;
294 }
295
296 // Clear collected object list
297 void OutputStream::clearSelection() { m_objects.clear(); }
298
299 // Remove all items from the output streamer list;
300 void OutputStream::clearItems( Items& itms ) {
301 for ( auto& i : itms ) delete i;
302 itms.clear();
303 }
304
305 // Find single item identified by its path (exact match)
306 DataStoreItem* OutputStream::findItem( const std::string& path ) {
307 auto matchPath = [&]( const DataStoreItem* i ) { return i->path() == path; };
308 auto i = std::find_if( m_itemList.begin(), m_itemList.end(), matchPath );
309 if ( i == m_itemList.end() ) {
310 i = std::find_if( m_optItemList.begin(), m_optItemList.end(), matchPath );
311 if ( i == m_optItemList.end() ) return nullptr;
312 }
313 return *i;
314 }
315
316 // Add item to output streamer list
317 void OutputStream::addItem( Items& itms, const std::string& descriptor ) {
318 int level = 0;
319 auto sep = descriptor.rfind( "#" );
320 std::string obj_path = descriptor.substr( 0, sep );
321 if ( sep != std::string::npos ) {
322 std::string slevel = descriptor.substr( sep + 1 );
323 level = ( slevel == "*" ) ? 9999999 : std::stoi( slevel );
324 }
325 if ( m_verifyItems ) {
326 size_t idx = obj_path.find( "/", 1 );
327 while ( idx != std::string::npos ) {
328 std::string sub_item = obj_path.substr( 0, idx );
329 if ( !findItem( sub_item ) ) addItem( itms, sub_item + "#1" );
330 idx = obj_path.find( "/", idx + 1 );
331 }
332 }
333 itms.push_back( new DataStoreItem( obj_path, level ) );
334 const auto& item = itms.back();
335 ON_DEBUG
336 debug() << "Adding OutputStream item " << item->path() << " with " << item->depth() << " level(s)." << endmsg;
337 }
338
339 // Connect to proper conversion service
340 StatusCode OutputStream::connectConversionSvc() {
341 StatusCode status = StatusCode( StatusCode::FAILURE, true );
342 // Get output file from input
343 std::string dbType, svc, shr;
344 for ( auto attrib : Gaudi::Utils::AttribStringParser( m_output ) ) {
345 const std::string& tag = attrib.tag;
346 const std::string& val = attrib.value;
347 switch ( ::toupper( tag[0] ) ) {
348 case 'D':
349 m_outputName = val;
350 break;
351 case 'T':
352 dbType = val;
353 break;
354 case 'S':
355 switch ( ::toupper( tag[1] ) ) {
356 case 'V':
357 svc = val;
358 break;
359 case 'H':
360 shr = "YES";
361 break;
362 }
363 break;
364 case 'O': // OPT='<NEW<CREATE,WRITE,RECREATE>, UPDATE>'
365 switch ( ::toupper( val[0] ) ) {
366 case 'R':
367 if ( ::strncasecmp( val.c_str(), "RECREATE", 3 ) == 0 )
368 m_outputType = "RECREATE";
369 else if ( ::strncasecmp( val.c_str(), "READ", 3 ) == 0 )
370 m_outputType = "READ";
371 break;
372 case 'C':
373 case 'N':
374 case 'W':
375 m_outputType = "NEW";
376 break;
377 case 'U':
378 m_outputType = "UPDATE";
379 break;
380 default:
381 m_outputType = "???";
382 break;
383 }
384 break;
385 default:
386 break;
387 }
388 }
389 if ( !shr.empty() ) m_outputType += "|SHARED";
390 // Get access to the default Persistency service
391 // The default service is the same for input as for output.
392 // If this is not desired, then a specialized OutputStream must overwrite
393 // this value.
394 if ( !dbType.empty() || !svc.empty() ) {
395 std::string typ = !dbType.empty() ? dbType : svc;
396 auto ipers = serviceLocator()->service<IPersistencySvc>( m_persName );
397 if ( !ipers ) {
398 fatal() << "Unable to locate IPersistencySvc interface of " << m_persName << endmsg;
399 return StatusCode::FAILURE;
400 }
401 IConversionSvc* cnvSvc = nullptr;
402 status = ipers->getService( typ, cnvSvc );
403 if ( !status.isSuccess() ) {
404 fatal() << "Unable to locate IConversionSvc interface of database type " << typ << endmsg;
405 return status;
406 }
407 // Increase reference count and keep service.
408 m_pConversionSvc = cnvSvc;
409 } else {
410 fatal() << "Unable to locate IConversionSvc interface (Unknown technology) " << endmsg
411 << "You either have to specify a technology name or a service name!" << endmsg
412 << "Please correct the job option \"" << name() << ".Output\" !" << endmsg;
413 return StatusCode::FAILURE;
414 }
415 return StatusCode::SUCCESS;
416 }
417
418 Gaudi::Algorithm* OutputStream::decodeAlgorithm( const std::string& theName ) {
419 Gaudi::Algorithm* theAlgorithm = nullptr;
420
421 auto theAlgMgr = serviceLocator()->as<IAlgManager>();
422 if ( theAlgMgr ) {
423 // Check whether the supplied name corresponds to an existing
424 // Algorithm object.
425 SmartIF<IAlgorithm>& theIAlg = theAlgMgr->algorithm( theName );
426 if ( theIAlg ) {
427 try {
428 theAlgorithm = dynamic_cast<Gaudi::Algorithm*>( theIAlg.get() );
429 } catch ( ... ) {
430 // do nothing
431 }
432 }
433 } else {
434 fatal() << "Can't locate ApplicationMgr!!!" << endmsg;
435 }
436
437 if ( !theAlgorithm ) { warning() << "Failed to decode Algorithm name " << theName << endmsg; }
438
439 return theAlgorithm;
440 }
441
442 void OutputStream::decodeAlgorithms( Gaudi::Property<std::vector<std::string>>& theNames,
443 std::vector<Gaudi::Algorithm*>& theAlgs ) {
444 // Reset the list of Algorithms
445 theAlgs.clear();
446
447 // Build the list of Algorithms from the names list
448 for ( const auto& it : theNames.value() ) {
449
450 auto theAlgorithm = decodeAlgorithm( it );
451 if ( theAlgorithm ) {
452 // Check that the specified algorithm doesn't already exist in the list
453 if ( std::find( std::begin( theAlgs ), std::end( theAlgs ), theAlgorithm ) == std::end( theAlgs ) ) {
454 theAlgorithm->addRef();
455 theAlgs.push_back( theAlgorithm );
456 }
457 } else {
458 info() << it << " doesn't exist - ignored" << endmsg;
459 }
460 }
461 }
462
463 bool OutputStream::isEventAccepted() const {
464 // Loop over all Algorithms in the accept list to see
465 // whether any have been executed and have their filter
466 // passed flag set. Any match causes the event to be
467 // provisionally accepted.
468 bool result = m_acceptAlgs.empty() || std::any_of( std::begin( m_acceptAlgs ), std::end( m_acceptAlgs ), passed );
469
470 // Loop over all Algorithms in the required list to see
471 // whether all have been executed and have their filter
472 // passed flag set. Any mismatch causes the event to be
473 // rejected.
474 if ( result && !m_requireAlgs.empty() ) {
475 result = std::all_of( std::begin( m_requireAlgs ), std::end( m_requireAlgs ), passed );
476 }
477
478 // Loop over all Algorithms in the veto list to see
479 // whether any have been executed and have their filter
480 // passed flag set. Any match causes the event to be
481 // rejected.
482 if ( result && !m_vetoAlgs.empty() ) {
483 result = std::none_of( std::begin( m_vetoAlgs ), std::end( m_vetoAlgs ), passed );
484 }
485 return result;
486 }
487
488 bool OutputStream::hasInput() const {
489 return !( m_itemNames.empty() && m_optItemNames.empty() && m_algDependentItemList.empty() );
490 }
491
492 StatusCode OutputStream::collectFromSubTree( DataObject* pObj ) {
493 return m_pDataManager->traverseSubTree( pObj,
494 [this]( IRegistry* r, int level ) { return this->collect( r, level ); } );
495 }
OutputStream::m_acceptNames
Gaudi::Property< std::vector< std::string > > m_acceptNames
Definition: OutputStream.h:59
Gaudi::Utils::AttribStringParser
Parse attribute strings allowing iteration over the various attributes.
Definition: AttribStringParser.h:30
OutputStream::clearItems
void clearItems(Items &itms)
Clear item list.
Definition: OutputStream.cpp:300
SmartIF< IAlgorithm >
std::string::empty
T empty(T... args)
OutputStream::m_vetoNames
Gaudi::Property< std::vector< std::string > > m_vetoNames
Definition: OutputStream.h:71
OutputStream::m_objects
IDataSelector m_objects
Collection of objects being selected.
Definition: OutputStream.h:105
OutputStream::finalize
StatusCode finalize() override
Terminate OutputStream.
Definition: OutputStream.cpp:123
ManySmallAlgs.alg
alg
Definition: ManySmallAlgs.py:69
GaudiPython.HistoUtils.path
path
Definition: HistoUtils.py:932
IConversionSvc
Definition: IConversionSvc.h:37
OutputStream::m_events
int m_events
Number of events written to this output stream.
Definition: OutputStream.h:107
Gaudi::Property
Implementation of property with value of concrete type.
Definition: Property.h:352
MsgStream.h
IDataManagerSvc::traverseSubTree
virtual StatusCode traverseSubTree(std::string_view sub_tree_path, IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects below the sub tree identified by its full path name.
IDataProviderSvc::addPreLoadItem
virtual StatusCode addPreLoadItem(const DataStoreItem &item)=0
Add an item to the preload list.
CommonMessagingBase::warning
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
Definition: CommonMessaging.h:101
OutputStream::m_outputType
std::string m_outputType
Output type: NEW(NEW,CREATE,WRITE,RECREATE), UPDATE)
Definition: OutputStream.h:89
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:298
OutputStream::m_verifyItems
Gaudi::Property< bool > m_verifyItems
Definition: OutputStream.h:77
OutputStream::m_requireAlgs
std::vector< Gaudi::Algorithm * > m_requireAlgs
Vector of Algorithms that this stream requires.
Definition: OutputStream.h:112
std::vector::swap
T swap(T... args)
OutputStream::m_currentItem
DataStoreItem * m_currentItem
Keep track of the current item.
Definition: OutputStream.h:97
OutputStream::m_output
Gaudi::Property< std::string > m_output
Definition: OutputStream.h:53
std::string::rfind
T rfind(T... args)
OutputStream::m_outputName
Gaudi::Property< std::string > m_outputName
Definition: OutputStream.h:54
IOTest.sel
sel
Definition: IOTest.py:93
IAlgManager
The IAlgManager is the interface implemented by the Algorithm Factory in the Application Manager to s...
Definition: IAlgManager.h:27
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
std::vector::end
T end(T... args)
OutputStream::m_optItemNames
Gaudi::Property< ItemNames > m_optItemNames
Definition: OutputStream.h:41
IConverter::createRep
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
OutputStream::selectedObjects
IDataSelector * selectedObjects()
Return the list of selected objects.
Definition: OutputStream.h:153
Gaudi::Algorithm::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
The standard service locator.
Definition: Algorithm.cpp:689
ISvcLocator::as
SmartIF< IFace > as()
Definition: ISvcLocator.h:103
CommonMessagingBase::info
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
Definition: CommonMessaging.h:104
OutputStream::m_pDataProvider
SmartIF< IDataProviderSvc > m_pDataProvider
Keep reference to the data provider service.
Definition: OutputStream.h:91
DataStoreItem
Description of the DataStoreItem class.
Definition: DataStoreItem.h:17
OutputStream::m_doPreLoad
Gaudi::Property< bool > m_doPreLoad
Definition: OutputStream.h:49
SmartIF::get
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:76
OutputStream
A small to stream Data I/O.
Definition: OutputStream.h:28
std::string
STL class.
Incident.h
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
IPersistencySvc.h
OutputStream::collect
virtual bool collect(IRegistry *dir, int level)
Store agent's classback.
Definition: OutputStream.cpp:208
OutputStream::findItem
DataStoreItem * findItem(const std::string &path)
Find single item identified by its path (exact match)
Definition: OutputStream.cpp:306
ISvcLocator::service
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:76
OutputStream::hasInput
virtual bool hasInput() const
Tell if the instance has been configured with input items or not.
Definition: OutputStream.cpp:488
OutputStream::writeObjects
virtual StatusCode writeObjects()
Select the different objects and write them to file.
Definition: OutputStream.cpp:155
std::vector::push_back
T push_back(T... args)
OutputStream::m_pConversionSvc
SmartIF< IConversionSvc > m_pConversionSvc
Keep reference to the data conversion service.
Definition: OutputStream.h:95
IConversionSvc::connectOutput
virtual StatusCode connectOutput(const std::string &outputFile)=0
Connect the output file to the service.
OutputStream::initialize
StatusCode initialize() override
Initialize OutputStream.
Definition: OutputStream.cpp:36
CommonMessagingBase::error
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Definition: CommonMessaging.h:98
DataStoreItem.h
IIncidentSvc::fireIncident
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
IDataManagerSvc.h
IDataProviderSvc.h
OutputStream::connectConversionSvc
virtual StatusCode connectConversionSvc()
Definition: OutputStream.cpp:340
OutputStream::m_algDependentItems
AlgDependentItems m_algDependentItems
Items to be saved for specific algorithms.
Definition: OutputStream.h:103
IConversionSvc::commitOutput
virtual StatusCode commitOutput(const std::string &outputFile, bool do_commit)=0
Commit pending output.
std::exception::what
T what(T... args)
OutputStream::m_vetoAlgs
std::vector< Gaudi::Algorithm * > m_vetoAlgs
Vector of Algorithms that this stream is vetoed by.
Definition: OutputStream.h:114
IIncidentSvc.h
OutputStream::m_requireNames
Gaudi::Property< std::vector< std::string > > m_requireNames
Definition: OutputStream.h:65
StatusCode
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
OutputStream::m_itemList
Items m_itemList
Vector of items to be saved to this stream.
Definition: OutputStream.h:99
OutputStream::addItem
void addItem(Items &itms, const std::string &descriptor)
Add item to output streamer list.
Definition: OutputStream.cpp:317
Gaudi::Hive::currentContext
GAUDI_API const EventContext & currentContext()
Definition: ThreadLocalContext.cpp:20
IRegistry.h
IRegistry
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
CommonMessagingBase::debug
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
Definition: CommonMessaging.h:107
OutputStream::m_algDependentItemList
Gaudi::Property< AlgDependentItemNames > m_algDependentItemList
Definition: OutputStream.h:43
OutputStream::m_pDataManager
SmartIF< IDataManagerSvc > m_pDataManager
Keep reference to the data manager service.
Definition: OutputStream.h:93
std::vector::clear
T clear(T... args)
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:267
OutputStream::clearSelection
void clearSelection()
Clear list of selected objects.
Definition: OutputStream.cpp:297
OutputStream::m_incidentSvc
SmartIF< IIncidentSvc > m_incidentSvc
Reference to the incident service.
Definition: OutputStream.h:86
std::exception
STL class.
IRegistry::address
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
IRegistry::object
virtual DataObject * object() const =0
Retrieve object behind the link.
IOpaqueAddress.h
OutputStream::execute
StatusCode execute() override
Working entry point.
Definition: OutputStream.cpp:136
std::find_if
T find_if(T... args)
std::vector::size
T size(T... args)
StatusCode::ignore
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
std::set
STL class.
OutputStream::m_storeName
Gaudi::Property< std::string > m_storeName
Definition: OutputStream.h:55
std::vector< DataObject * >
IDataProviderSvc::retrieveObject
virtual StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
IConversionSvc.h
std::vector::begin
T begin(T... args)
IRegistry::setAddress
virtual void setAddress(IOpaqueAddress *pAddress)=0
Set/Update Opaque storage address.
std::any_of
T any_of(T... args)
std::string::c_str
T c_str(T... args)
Incident
Base class for all Incidents (computing events).
Definition: Incident.h:17
Gaudi::Algorithm
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:79
std::vector::back
T back(T... args)
AttribStringParser.h
OutputStream::m_doPreLoadOpt
Gaudi::Property< bool > m_doPreLoadOpt
Definition: OutputStream.h:51
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:86
ON_DEBUG
#define ON_DEBUG
Definition: OutputStream.cpp:26
std::string::substr
T substr(T... args)
IAlgManager.h
OutputStream::isEventAccepted
bool isEventAccepted() const
Test whether this event should be output.
Definition: OutputStream.cpp:463
IPersistencySvc
Data persistency service interface.
Definition: IPersistencySvc.h:19
gaudirun.level
level
Definition: gaudirun.py:334
SmartIF::reset
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:86
OutputStream::collectFromSubTree
StatusCode collectFromSubTree(DataObject *)
Definition: OutputStream.cpp:492
OutputStream::decodeAlgorithms
void decodeAlgorithms(Gaudi::Property< std::vector< std::string >> &theNames, std::vector< Gaudi::Algorithm * > &theAlgs)
Decode specified list of Algorithms.
Definition: OutputStream.cpp:442
IOpaqueAddress
Opaque address interface definition.
Definition: IOpaqueAddress.h:23
OutputStream::m_persName
Gaudi::Property< std::string > m_persName
Definition: OutputStream.h:57
OutputStream::decodeAlgorithm
Gaudi::Algorithm * decodeAlgorithm(const std::string &theName)
Decode a single algorithm name.
Definition: OutputStream.cpp:418
DataObject
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
OutputStream::m_itemNames
Gaudi::Property< ItemNames > m_itemNames
Definition: OutputStream.h:40
OutputStream.h
OutputStream::collectObjects
virtual StatusCode collectObjects()
Collect all objects to be written to the output stream.
Definition: OutputStream.cpp:226
IConverter::fillRepRefs
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the converted object.
std::stoi
T stoi(T... args)
ISvcLocator.h
toupper
void toupper(std::string &s)
Definition: StatusCodeSvc.cpp:7
CommonMessagingBase::fatal
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
Definition: CommonMessaging.h:92
strcasecmp.h
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
OutputStream::m_acceptAlgs
std::vector< Gaudi::Algorithm * > m_acceptAlgs
Vector of Algorithms that this stream accepts.
Definition: OutputStream.h:110
OutputStream::m_fireIncidents
bool m_fireIncidents
should I fire incidents for writing opening/closing etc? in the baseclass, always fire the incidents ...
Definition: OutputStream.h:83
Gaudi::Algorithm::name
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:645
DataStoreItem::path
const std::string & path() const
Accessor: Retrieve load path.
Definition: DataStoreItem.h:55
std::vector::reserve
T reserve(T... args)
DataObject.h
OutputStream::m_optItemList
Items m_optItemList
Vector of optional items to be saved to this stream.
Definition: OutputStream.h:101