The Gaudi Framework  master (82fdf313)
Loading...
Searching...
No Matches
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\***********************************************************************************/
19
20// Output friend
22 return s << "Stream:" << obj.name() << " Def:" << obj.definition();
23}
24
25// Output friend
26std::ostream& operator<<( std::ostream& s, const EventSelectorDataStream& obj ) {
27 return s << "Stream:" << obj.name() << " Def:" << obj.definition();
28}
29
30// Standard Constructor
31EventSelectorDataStream::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
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;
62 } else {
63 cnt = eds->rootName();
64 }
66 m_properties.clear();
67
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}
MsgStream & operator<<(MsgStream &s, const EventSelectorDataStream &obj)
Output friend for MsgStream.
void toupper(std::string &s)
virtual StatusCode finalize()
Finalize stream and release resources.
std::string m_selectorType
Event selector type.
SmartIF< IEvtSelector > m_pSelector
Pointer to valid selector.
const std::string & name() const
Retrieve stream name.
EventSelectorDataStream(std::string nam, std::string def, ISvcLocator *svcloc)
Standard Constructor.
Properties m_properties
Properties vector.
const std::string & definition() const
Retrieve definition string.
std::string m_definition
Definition string.
virtual StatusCode initialize()
Parse input criteria.
std::string m_criteria
Criteria.
Gaudi::Property< std::string > * property(const std::string &nam)
Allow access to individual properties by name.
virtual void setSelector(IEvtSelector *pSelector)
Attach event selector object.
ISvcLocator * m_pSvcLocator
Reference to service locator.
std::string m_dbName
String with name of the db as parsed.
bool m_initialized
Initialization state.
const std::string name() const
property name
Implementation of property with value of concrete type.
Definition PropertyFwd.h:27
Parse attribute strings allowing iteration over the various attributes.
The Event Selector Interface.
Data persistency service interface.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition ISvcLocator.h:42
Definition of the MsgStream class used to transmit messages.
Definition MsgStream.h:29
Small smart pointer class with automatic reference counting for IInterface.
Definition SmartIF.h:28
This class is used for returning status codes from appropriate routines.
Definition StatusCode.h:64
bool isSuccess() const
Definition StatusCode.h:314
constexpr static const auto SUCCESS
Definition StatusCode.h:99
constexpr static const auto FAILURE
Definition StatusCode.h:100
STL namespace.