Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
OutputStream.cpp
Go to the documentation of this file.
1 // Framework include files
11 #include "GaudiKernel/Incident.h"
12 
14 #include "GaudiKernel/DataObject.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
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
37 
38  // Reset the number of events written
39  m_events = 0;
40  // Get access to the DataManagerSvc
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
54  if ( !m_pDataProvider ) {
55  fatal() << "Unable to locate IDataProviderSvc interface of " << m_storeName << endmsg;
56  return StatusCode::FAILURE;
57  }
58  if ( hasInput() ) {
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
70  // Clear the item list
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
124  info() << "Events output: " << m_events << endmsg;
125  if ( m_fireIncidents ) m_incidentSvc->fireIncident( Incident( m_outputName, IncidentType::EndOutputFile ) );
132  return StatusCode::SUCCESS;
133 }
134 
135 // Work entry point
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
156  // Connect the output file to the service
157  StatusCode status = collectObjects();
158  if ( status.isSuccess() ) {
160  if ( sel->begin() != sel->end() ) {
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 {
200  }
201  }
202  }
203  }
204  return status;
205 }
206 
207 // Place holder to create configurable data store agent
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 
228 
229  // Traverse the tree and collect the requested objects
230  for ( auto& i : m_itemList ) {
231  DataObject* obj = nullptr;
232  m_currentItem = i;
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;
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;
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
298 
299 // Remove all items from the output streamer list;
301  for ( auto& i : itms ) delete i;
302  itms.clear();
303 }
304 
305 // Find single item identified by its path (exact match)
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
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 
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 
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 
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 
489  return !( m_itemNames.empty() && m_optItemNames.empty() && m_algDependentItemList.empty() );
490 }
491 
493  return m_pDataManager->traverseSubTree( pObj,
494  [this]( IRegistry* r, int level ) { return this->collect( r, level ); } );
495 }
Gaudi::Property< std::vector< std::string > > m_acceptNames
Definition: OutputStream.h:59
Parse attribute strings allowing iteration over the various attributes.
bool isEventAccepted() const
Test whether this event should be output.
void clearItems(Items &itms)
Clear item list.
virtual bool hasInput() const
Tell if the instance has been configured with input items or not.
T empty(T...args)
Gaudi::Property< std::vector< std::string > > m_vetoNames
Definition: OutputStream.h:71
IDataSelector m_objects
Collection of objects being selected.
Definition: OutputStream.h:105
StatusCode finalize() override
Terminate OutputStream.
int m_events
Number of events written to this output stream.
Definition: OutputStream.h:107
Implementation of property with value of concrete type.
Definition: Property.h:352
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
virtual StatusCode addPreLoadItem(const DataStoreItem &item)=0
Add an item to the preload list.
std::string m_outputType
Output type: NEW(NEW,CREATE,WRITE,RECREATE), UPDATE)
Definition: OutputStream.h:89
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:309
Gaudi::Property< bool > m_verifyItems
Definition: OutputStream.h:77
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:635
std::vector< Gaudi::Algorithm * > m_requireAlgs
Vector of Algorithms that this stream requires.
Definition: OutputStream.h:112
DataStoreItem * m_currentItem
Keep track of the current item.
Definition: OutputStream.h:97
bool isSuccess() const
Definition: StatusCode.h:267
Gaudi::Property< std::string > m_output
Definition: OutputStream.h:53
T rfind(T...args)
Gaudi::Property< std::string > m_outputName
Definition: OutputStream.h:54
sel
Definition: IOTest.py:93
The IAlgManager is the interface implemented by the Algorithm Factory in the Application Manager to s...
Definition: IAlgManager.h:27
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
T end(T...args)
Gaudi::Property< ItemNames > m_optItemNames
Definition: OutputStream.h:41
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
IDataSelector * selectedObjects()
Return the list of selected objects.
Definition: OutputStream.h:153
SmartIF< IFace > as()
Definition: ISvcLocator.h:103
SmartIF< IDataProviderSvc > m_pDataProvider
Keep reference to the data provider service.
Definition: OutputStream.h:91
Description of the DataStoreItem class.
Definition: DataStoreItem.h:17
Gaudi::Property< bool > m_doPreLoad
Definition: OutputStream.h:49
virtual StatusCode traverseSubTree(boost::string_ref sub_tree_path, IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects below the sub tree identified by its full path name...
const std::string & path() const
Accessor: Retrieve load path.
Definition: DataStoreItem.h:55
A small to stream Data I/O.
Definition: OutputStream.h:28
STL class.
#define DECLARE_COMPONENT(type)
AlgExecState & execState(const EventContext &ctx) const override
reference to AlgExecState of Alg
Definition: Algorithm.cpp:647
virtual bool collect(IRegistry *dir, int level)
Store agent&#39;s classback.
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:76
DataStoreItem * findItem(const std::string &path)
Find single item identified by its path (exact match)
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:76
virtual StatusCode writeObjects()
Select the different objects and write them to file.
T push_back(T...args)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
SmartIF< IConversionSvc > m_pConversionSvc
Keep reference to the data conversion service.
Definition: OutputStream.h:95
virtual StatusCode connectOutput(const std::string &outputFile)=0
Connect the output file to the service.
StatusCode initialize() override
Initialize OutputStream.
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
virtual StatusCode connectConversionSvc()
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
AlgDependentItems m_algDependentItems
Items to be saved for specific algorithms.
Definition: OutputStream.h:103
virtual StatusCode commitOutput(const std::string &outputFile, bool do_commit)=0
Commit pending output.
T what(T...args)
std::vector< Gaudi::Algorithm * > m_vetoAlgs
Vector of Algorithms that this stream is vetoed by.
Definition: OutputStream.h:114
Gaudi::Property< std::vector< std::string > > m_requireNames
Definition: OutputStream.h:65
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
Items m_itemList
Vector of items to be saved to this stream.
Definition: OutputStream.h:99
void addItem(Items &itms, const std::string &descriptor)
Add item to output streamer list.
GAUDI_API const EventContext & currentContext()
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
Gaudi::Property< AlgDependentItemNames > m_algDependentItemList
Definition: OutputStream.h:43
SmartIF< IDataManagerSvc > m_pDataManager
Keep reference to the data manager service.
Definition: OutputStream.h:93
virtual StatusCode retrieveObject(IRegistry *pDirectory, boost::string_ref path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
T clear(T...args)
void clearSelection()
Clear list of selected objects.
SmartIF< IIncidentSvc > m_incidentSvc
Reference to the incident service.
Definition: OutputStream.h:86
STL class.
virtual DataObject * object() const =0
Retrieve object behind the link.
T count(T...args)
StatusCode execute() override
Working entry point.
T insert(T...args)
T find_if(T...args)
T size(T...args)
STL class.
Gaudi::Property< std::string > m_storeName
Definition: OutputStream.h:55
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
T begin(T...args)
virtual void setAddress(IOpaqueAddress *pAddress)=0
Set/Update Opaque storage address.
T any_of(T...args)
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
T c_str(T...args)
Base class for all Incidents (computing events).
Definition: Incident.h:17
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:79
T back(T...args)
Gaudi::Property< bool > m_doPreLoadOpt
Definition: OutputStream.h:51
constexpr static const auto FAILURE
Definition: StatusCode.h:86
#define ON_DEBUG
T substr(T...args)
SmartIF< ISvcLocator > & serviceLocator() const override
The standard service locator.
Definition: Algorithm.cpp:679
Data persistency service interface.
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:86
StatusCode collectFromSubTree(DataObject *)
void decodeAlgorithms(Gaudi::Property< std::vector< std::string >> &theNames, std::vector< Gaudi::Algorithm * > &theAlgs)
Decode specified list of Algorithms.
Opaque address interface definition.
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
Gaudi::Property< std::string > m_persName
Definition: OutputStream.h:57
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
Gaudi::Algorithm * decodeAlgorithm(const std::string &theName)
Decode a single algorithm name.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
Gaudi::Property< ItemNames > m_itemNames
Definition: OutputStream.h:40
virtual StatusCode collectObjects()
Collect all objects to be written to the output stream.
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the converted object.
State state() const
T stoi(T...args)
void toupper(std::string &s)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
std::vector< Gaudi::Algorithm * > m_acceptAlgs
Vector of Algorithms that this stream accepts.
Definition: OutputStream.h:110
bool m_fireIncidents
should I fire incidents for writing opening/closing etc? in the baseclass, always fire the incidents ...
Definition: OutputStream.h:83
T reserve(T...args)
Items m_optItemList
Vector of optional items to be saved to this stream.
Definition: OutputStream.h:101