Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  master (d98a2936)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
EventSelectorDataStream.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
16 #include <GaudiKernel/IService.h>
18 #include <GaudiKernel/MsgStream.h>
19 
20 // Output friend
22  return s << "Stream:" << obj.name() << " Def:" << obj.definition();
23 }
24 
25 // Output friend
26 std::ostream& operator<<( std::ostream& s, const EventSelectorDataStream& obj ) {
27  return s << "Stream:" << obj.name() << " Def:" << obj.definition();
28 }
29 
30 // Standard Constructor
31 EventSelectorDataStream::EventSelectorDataStream( std::string nam, std::string def, ISvcLocator* svcloc )
32  : m_name{ std::move( nam ) }, m_definition{ std::move( def ) }, m_pSvcLocator( svcloc ) {}
33 
34 // Set selector
36 
37 // Allow access to individual properties by name
39  auto i = std::find_if( std::begin( m_properties ), std::end( m_properties ),
40  [&]( const Gaudi::Property<std::string>& j ) { return j.name() == nam; } );
41  return i != std::end( m_properties ) ? &( *i ) : nullptr;
42 }
43 
44 // Allow access to individual properties by name
45 const Gaudi::Property<std::string>* EventSelectorDataStream::property( const std::string& nam ) const {
46  auto i = std::find_if( std::begin( m_properties ), std::end( m_properties ),
47  [&]( const Gaudi::Property<std::string>& j ) { return j.name() == nam; } );
48  return i != std::end( m_properties ) ? &( *i ) : nullptr;
49 }
50 
51 // Parse input criteria
53  bool isData = true;
54  std::string auth, dbtyp, collsvc, item, crit, sel, svc, stmt;
55  std::string cnt = "/Event";
56  std::string db = "<Unknown>";
57 
58  auto eds = m_pSvcLocator->service<IDataManagerSvc>( "EventDataSvc" );
59  if ( !eds ) {
60  std::cout << "ERROR: Unable to localize interface IDataManagerSvc from service EventDataSvc" << std::endl;
61  return StatusCode::FAILURE;
62  } else {
63  cnt = eds->rootName();
64  }
66  m_properties.clear();
67 
68  using Parser = Gaudi::Utils::AttribStringParser;
69  for ( auto attrib : Parser( m_definition ) ) {
70  long hash = -1;
71  switch ( ::toupper( attrib.tag[0] ) ) {
72  case 'A':
73  auth = std::move( attrib.value );
74  break;
75  case 'C':
76  svc = "EvtTupleSvc";
77  isData = false;
78  [[fallthrough]];
79  case 'E':
80  hash = attrib.value.find( '#' );
81  if ( hash > 0 ) {
82  cnt = attrib.value.substr( 0, hash );
83  item = attrib.value.substr( hash + 1 );
84  } else {
85  cnt = std::move( attrib.value );
86  item = "Address";
87  }
88  break;
89  case 'D':
90  m_criteria = "FILE " + attrib.value;
91  m_dbName = std::move( attrib.value );
92  break;
93  case 'F':
94  switch ( ::toupper( attrib.tag[1] ) ) {
95  case 'I':
96  m_criteria = "FILE " + attrib.value;
97  m_dbName = std::move( attrib.value );
98  break;
99  case 'U':
100  stmt = std::move( attrib.value );
101  break;
102  default:
103  break;
104  }
105  break;
106  case 'J':
107  m_criteria = "JOBID " + attrib.value;
108  m_dbName = std::move( attrib.value );
109  dbtyp = "SICB";
110  break;
111  case 'T':
112  switch ( ::toupper( attrib.tag[1] ) ) {
113  case 'Y':
114  dbtyp = std::move( attrib.value );
115  break;
116  default:
117  break;
118  }
119  break;
120  case 'S':
121  switch ( ::toupper( attrib.tag[1] ) ) {
122  case 'E':
123  sel = std::move( attrib.value );
124  break;
125  case 'V':
126  svc = std::move( attrib.value );
127  collsvc = svc;
128  break;
129  default:
130  break;
131  }
132  break;
133  default:
134  m_properties.emplace_back( attrib.tag, attrib.value );
135  break;
136  }
137  }
138  if ( !isData ) { // Unfortunately options do not come in order...
139  m_selectorType = "EventCollectionSelector";
140  svc = "EvtTupleSvc";
141  } else if ( dbtyp.compare( 0, 4, "POOL" ) == 0 ) {
142  m_selectorType = "PoolDbEvtSelector";
143  } else if ( svc.empty() ) {
144  m_selectorType = "DbEvtSelector";
145  } else {
146  m_selectorType = svc;
147  }
149  if ( svc.empty() && !dbtyp.empty() ) {
150  auto ipers = m_pSvcLocator->service<IPersistencySvc>( "EventPersistencySvc" );
151  if ( ipers ) {
152  IConversionSvc* icnvSvc = nullptr;
153  status = ipers->getService( dbtyp, icnvSvc );
154  if ( status.isSuccess() ) {
155  auto isvc = SmartIF<INamedInterface>{ icnvSvc };
156  if ( isvc ) svc = isvc->name();
157  }
158  }
159  }
160  m_properties.emplace_back( "Function", stmt );
161  m_properties.emplace_back( "CnvService", svc );
162  m_properties.emplace_back( "Authentication", auth );
163  m_properties.emplace_back( "Container", cnt );
164  m_properties.emplace_back( "Item", item );
165  m_properties.emplace_back( "Criteria", sel );
166  m_properties.emplace_back( "DbType", dbtyp );
167  m_properties.emplace_back( "DB", m_criteria );
168  if ( !isData && !collsvc.empty() ) { m_properties.emplace_back( "DbService", collsvc ); }
169 
170  m_initialized = status.isSuccess();
171  return status;
172 }
173 
174 // Parse input criteria
176  setSelector( nullptr );
177  m_properties.clear();
178  m_initialized = false;
179  return StatusCode::SUCCESS;
180 }
EventSelectorDataStream::m_definition
std::string m_definition
Definition string.
Definition: EventSelectorDataStream.h:52
toupper
void toupper(std::string &s)
Definition: ExceptionSvc.cpp:36
IService.h
EventSelectorDataStream.h
IDataManagerSvc
Definition: IDataManagerSvc.h:47
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
gaudirun.s
string s
Definition: gaudirun.py:346
IPersistencySvc.h
ISvcLocator
Definition: ISvcLocator.h:42
EventSelectorDataStream::definition
const std::string & definition() const
Retrieve definition string.
Definition: EventSelectorDataStream.h:94
IEvtSelector
Definition: IEvtSelector.h:26
EventSelectorDataStream::m_selectorType
std::string m_selectorType
Event selector type.
Definition: EventSelectorDataStream.h:58
EventSelectorDataStream::m_pSvcLocator
ISvcLocator * m_pSvcLocator
Reference to service locator.
Definition: EventSelectorDataStream.h:62
ISvcLocator::service
virtual SmartIF< IService > & service(const Gaudi::Utils::TypeNameString &typeName, const bool createIf=true)=0
Returns a smart pointer to a service.
EventSelectorDataStream::property
Gaudi::Property< std::string > * property(const std::string &nam)
Allow access to individual properties by name.
Definition: EventSelectorDataStream.cpp:38
operator<<
MsgStream & operator<<(MsgStream &s, const EventSelectorDataStream &obj)
Output friend for MsgStream.
Definition: EventSelectorDataStream.cpp:21
Gaudi::Utils::begin
AttribStringParser::Iterator begin(const AttribStringParser &parser)
Definition: AttribStringParser.h:135
EventSelectorDataStream::setSelector
virtual void setSelector(IEvtSelector *pSelector)
Attach event selector object.
Definition: EventSelectorDataStream.cpp:35
StatusCode
Definition: StatusCode.h:64
ProduceConsume.j
j
Definition: ProduceConsume.py:104
AttribStringParser.h
SmartIF
Definition: IConverter.h:22
MsgStream
Definition: MsgStream.h:29
IOTest.sel
sel
Definition: IOTest.py:106
EventSelectorDataStream::m_properties
Properties m_properties
Properties vector.
Definition: EventSelectorDataStream.h:64
EventSelectorDataStream::finalize
virtual StatusCode finalize()
Finalize stream and release resources.
Definition: EventSelectorDataStream.cpp:175
EventSelectorDataStream::m_criteria
std::string m_criteria
Criteria.
Definition: EventSelectorDataStream.h:54
IPersistencySvc
Definition: IPersistencySvc.h:25
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:99
EventSelectorDataStream::name
const std::string & name() const
Retrieve stream name.
Definition: EventSelectorDataStream.h:86
EventSelectorDataStream::EventSelectorDataStream
EventSelectorDataStream(std::string nam, std::string def, ISvcLocator *svcloc)
Standard Constructor.
Definition: EventSelectorDataStream.cpp:31
EventSelectorDataStream::m_dbName
std::string m_dbName
String with name of the db as parsed.
Definition: EventSelectorDataStream.h:56
EventSelectorDataStream
Definition of class EventSelectorDataStream.
Definition: EventSelectorDataStream.h:39
EventSelectorDataStream::m_pSelector
SmartIF< IEvtSelector > m_pSelector
Pointer to valid selector.
Definition: EventSelectorDataStream.h:60
IOTest.end
end
Definition: IOTest.py:125
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
IConversionSvc.h
ISvcLocator.h
Gaudi::Utils::AttribStringParser
Parse attribute strings allowing iteration over the various attributes.
Definition: AttribStringParser.h:39
Gaudi::Property< std::string >
IDataManagerSvc.h
MsgStream.h
EventSelectorDataStream::m_initialized
bool m_initialized
Initialization state.
Definition: EventSelectorDataStream.h:66
IConversionSvc
Definition: IConversionSvc.h:43
EventSelectorDataStream::initialize
virtual StatusCode initialize()
Parse input criteria.
Definition: EventSelectorDataStream.cpp:52