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
GaudiKernel
src
Lib
DataStreamTool.cpp
Go to the documentation of this file.
1
// Include files
2
3
// from Gaudi
4
#include "
GaudiKernel/MsgStream.h
"
5
#include "
GaudiKernel/xtoa.h
"
6
#include "
GaudiKernel/SmartIF.h
"
7
#include "
GaudiKernel/Incident.h
"
8
#include "
GaudiKernel/Tokenizer.h
"
9
#include "
GaudiKernel/MsgStream.h
"
10
#include "
GaudiKernel/IIncidentSvc.h
"
11
#include "
GaudiKernel/ISvcLocator.h
"
12
#include "
GaudiKernel/ISvcManager.h
"
13
#include "
GaudiKernel/IAddressCreator.h
"
14
#include "
GaudiKernel/PropertyMgr.h
"
15
#include "
GaudiKernel/EventSelectorDataStream.h
"
16
#include "
GaudiKernel/DataStreamTool.h
"
17
#include "
GaudiKernel/ToolFactory.h
"
18
#include "
GaudiKernel/Service.h
"
19
20
#include <
sstream
>
21
22
//-----------------------------------------------------------------------------
23
// Implementation file for class : DataStreamTool
24
//
25
// 2006-09-21 : Andres Felipe Osorio Oliveros
26
//-----------------------------------------------------------------------------
27
28
//=============================================================================
29
// Standard constructor, initializes variables
30
//=============================================================================
31
DataStreamTool::DataStreamTool
(
const
std::string
&
type
,
32
const
std::string
& name,
33
const
IInterface
* parent )
34
:
base_class
( type, name , parent )
35
{
36
//declareInterface<IDataStreamTool>(this);
37
38
m_incidentSvc
= 0;
39
m_streamCount
= 0;
40
m_streamID
= 0;
41
42
}
43
//=============================================================================
44
// Destructor
45
//=============================================================================
46
DataStreamTool::~DataStreamTool
() {
47
}
48
49
//=============================================================================
50
StatusCode
DataStreamTool::initialize
() {
51
52
MsgStream
logger
(
msgSvc
(),
name
());
53
54
StatusCode
status =
AlgTool::initialize
();
55
if
( !status.
isSuccess
() ) {
56
logger <<
MSG::FATAL
<<
"Error. Cannot initialize base class."
<<
endmsg
;
57
return
status;
58
}
59
60
// Get the references to the services that are needed by the ApplicationMgr itself
61
m_incidentSvc
=
serviceLocator
()->
service
(
"IncidentSvc"
);
62
if
( !
m_incidentSvc
.
isValid
() ) {
63
logger <<
MSG::FATAL
<<
"Error retrieving IncidentSvc."
<<
endmsg
;
64
return
StatusCode::FAILURE
;
65
}
66
67
return
StatusCode::SUCCESS
;
68
69
}
70
71
StatusCode
DataStreamTool::addStream
(
const
std::string
& input) {
72
73
if
( NULL !=
getStream
(input) ) {
74
MsgStream
log
(
msgSvc
(),
name
());
75
log <<
MSG::WARNING
<<
"Input stream "
<< input <<
"already in use"
<<
endmsg
;
76
}
77
78
m_streamSpecs
.
push_back
(input);
79
80
std::ostringstream
strname;
81
strname <<
name
() <<
'_'
<< ++
m_streamCount
;
82
83
EventSelectorDataStream
*
s
= 0;
84
85
StatusCode
status =
createStream
(strname.str(), input ,
s
);
86
87
if
( status.
isSuccess
() && 0 !=
s
) {
88
s->
addRef
();
89
m_streams
.
push_back
(s);
90
status =
StatusCode::SUCCESS
;
91
}
92
else
{
93
MsgStream
log
(
msgSvc
(),
name
());
94
if
(s) {
95
s->
release
();
96
log <<
MSG::ERROR
<<
"Error connecting/creating Stream: "
<< s <<
endmsg
;
97
}
98
log <<
MSG::ERROR
<<
"Error connecting/creating Stream: "
<< input <<
endmsg
;
99
status =
StatusCode::FAILURE
;
100
}
101
102
return
status;
103
104
}
105
106
StatusCode
DataStreamTool::addStreams
(
const
StreamSpecs
& inputs) {
107
108
StatusCode
status =
StatusCode::SUCCESS
;
109
110
for
(
StreamSpecs::const_iterator
itr = inputs.
begin
(); itr != inputs.
end
() && status.
isSuccess
(); ++itr ) {
111
112
status =
addStream
(*itr);
113
114
}
115
116
return
status;
117
118
}
119
120
StatusCode
DataStreamTool::finalize
() {
121
clear
().
ignore
();
122
m_incidentSvc
= 0;
// release
123
124
return
AlgTool::finalize
();
125
}
126
127
StatusCode
DataStreamTool::initializeStream
(
EventSelectorDataStream
*
s
) {
128
IEvtSelector
*
sel
= 0;
129
StatusCode
status = s->
initialize
();
130
if
( status.
isSuccess
() ) {
131
status =
createSelector
(s->
name
(), s->
selectorType
(),
sel
);
132
if
( status.
isSuccess
() ) {
133
SmartIF<IProperty>
prop(sel);
//Att: IProperty, IService used to point to EventSelector
134
SmartIF<IService>
isvc(sel);
135
s->
setSelector
(sel);
136
sel->
release
();
// No need of this interface anymore, it is passed to the stream
137
if
( prop.
isValid
( ) && isvc.
isValid
( ) ) {
138
const
Properties
& p = s->
properties
();
139
for
(
Properties::const_iterator
i
=p.
begin
();
i
!=p.
end
();
i
++) {
140
prop->setProperty((*
i
)).ignore();
141
}
142
int
output_level = this->
outputLevel
();
143
prop->setProperty(
IntegerProperty
(
"OutputLevel"
,output_level)).ignore();
144
// FIXME: (MCl) Why do we have to initialize the selector here?
145
return
isvc->sysInitialize();
146
}
147
}
148
}
149
return
StatusCode::FAILURE
;
150
}
151
152
// Create (sub-) Event selector service
153
StatusCode
DataStreamTool::createSelector
(
const
std::string
& nam,
const
std::string
& typ,
IEvtSelector
*&
sel
) {
154
IService
* isvc = Service::Factory::create(typ, nam,
serviceLocator
());
155
if
( isvc ) {
156
StatusCode
status = isvc->
queryInterface
(
IEvtSelector::interfaceID
(), (
void
**)&sel);
157
if
( status.
isSuccess
() ) {
158
return
status;
159
}
160
sel = 0;
161
isvc->
release
();
162
}
163
MsgStream
log
(
msgSvc
(),
name
());
164
log <<
MSG::ERROR
<<
"Failed to create IEvtSelector "
<< typ <<
"/"
<< nam <<
endmsg
;
165
return
StatusCode::FAILURE
;
166
}
167
168
169
StatusCode
DataStreamTool::finalizeStream
(
EventSelectorDataStream
*
s
) {
170
if
( s ) {
171
IEvtSelector
*
sel
=
const_cast<
IEvtSelector
*
>
(s->
selector
());
172
if
( sel ) {
173
SmartIF<IService>
isvc(sel);
174
if
( isvc.
isValid
() ) {
175
isvc->finalize().ignore();
176
s->
finalize
().
ignore
();
177
// Fire EndStream "Incident"
178
m_incidentSvc
->fireIncident(
Incident
(
name
(),
IncidentType::EndStream
));
179
return
StatusCode::SUCCESS
;
180
}
181
// Failed to get service interface of sub-event selector
182
return
StatusCode::FAILURE
;
183
}
184
// No selector (yet) attached - no need to finalize it!
185
return
StatusCode::SUCCESS
;
186
}
187
return
StatusCode::FAILURE
;
188
}
189
190
191
StatusCode
DataStreamTool::eraseStream
(
const
std::string
& info ) {
192
193
Streams::iterator
i
=
getStreamIterator
(info);
194
195
if
(
m_streams
.
end
() !=
i
) {
196
(*i)->release();
197
m_streams
.
erase
(i);
198
return
StatusCode::SUCCESS
;
199
}
200
201
return
StatusCode::FAILURE
;
202
}
203
204
StatusCode
DataStreamTool::createStream
(
const
std::string
& nam,
const
std::string
& info,
205
EventSelectorDataStream
*& stream) {
206
stream =
new
EventSelectorDataStream
(nam, info,
serviceLocator
());
207
208
return
StatusCode::SUCCESS
;
209
}
210
211
212
EventSelectorDataStream
*
DataStreamTool::getStream
(
const
std::string
& info ) {
213
Streams::iterator
i
=
getStreamIterator
(info);
214
if
(
m_streams
.
end
() ==
i
)
return
NULL;
215
return
*
i
;
216
}
217
218
DataStreamTool::Streams::iterator
DataStreamTool::getStreamIterator
(
const
std::string
& info ) {
219
for
(
Streams::iterator
i
=
m_streams
.
begin
();
i
!=
m_streams
.
end
();
i
++ ) {
220
if
( (*i)->definition() == info ) {
221
return
i
;
222
}
223
}
224
return
m_streams
.
end
();
225
}
226
227
EventSelectorDataStream
*
DataStreamTool::getStream
(
size_type
pos ) {
228
if
( (pos >= 0) && ((
size_t
)pos <
m_streams
.
size
()) )
// pos has to point inside the vector
229
return
m_streams
[pos];
230
else
231
return
0;
232
}
233
234
EventSelectorDataStream
*
DataStreamTool::lastStream
()
235
{
236
if
(
m_streams
.
size
() > 1 )
237
return
*(--
m_streams
.
end
());
238
else
return
*
m_streams
.
begin
();
239
240
}
241
242
243
244
StatusCode
DataStreamTool::clear
()
245
{
246
247
StatusCode
iret, status =
StatusCode::SUCCESS
;
248
iret.
ignore
();
249
250
MsgStream
log
(
msgSvc
(),
name
());
251
252
// disconnect the streams
253
for
(
StreamSpecs::const_iterator
il =
m_streamSpecs
.
begin
(); il !=
m_streamSpecs
.
end
(); il++ ) {
254
EventSelectorDataStream
*
s
=
getStream
(*il);
255
if
( NULL != s ) {
256
if
( s->
isInitialized
() ) {
257
iret =
finalizeStream
(s);
258
if
( !iret.
isSuccess
() ) {
259
log <<
MSG::ERROR
<<
"Error finalizing Stream"
<< *il <<
endmsg
;
260
status = iret;
261
}
262
}
263
iret =
eraseStream
( *il );
264
if
( !iret.
isSuccess
() ) {
265
log <<
MSG::ERROR
<<
"Error diconnecting Stream"
<< *il <<
endmsg
;
266
status = iret;
267
}
268
}
269
}
270
271
m_streamSpecs
.
clear
();
272
273
return
status;
274
}
275
276
277
StatusCode
DataStreamTool::connectStream
(
EventSelectorDataStream
*
s
)
278
{
279
280
if
( 0 != s ) {
281
s->
addRef
();
282
m_streams
.
push_back
(s);
283
return
StatusCode::SUCCESS
;
284
}
285
286
return
StatusCode::FAILURE
;
287
288
}
289
290
StatusCode
DataStreamTool::connectStream
(
const
std::string
& info )
291
{
292
293
if
( NULL !=
getStream
(info) ) {
294
MsgStream
log
(
msgSvc
(),
name
());
295
log <<
MSG::WARNING
<<
"Input stream "
<< info <<
"already in use"
<<
endmsg
;
296
}
297
std::ostringstream
nam;
298
nam <<
name
() <<
'_'
<< ++
m_streamCount
;
299
EventSelectorDataStream
*
s
= 0;
300
StatusCode
status =
createStream
(nam.str(), info,
s
);
301
if
( status.
isSuccess
() ) {
302
return
connectStream
(s);
303
}
304
s->
release
();
305
return
status;
306
307
308
}
309
310
/*
311
312
Taking control over Streams and return them to EventSelector
313
314
*/
315
316
317
StatusCode
DataStreamTool::getNextStream
(
const
EventSelectorDataStream
* & esds,
size_type
& dsid )
318
{
319
320
EventSelectorDataStream
* nextStream =
getStream
(dsid);
321
if
( NULL == nextStream )
return
StatusCode::FAILURE
;
//<-end of streams reached
322
323
esds = nextStream;
324
++
m_streamID
;
325
326
return
StatusCode::SUCCESS
;
327
328
}
329
330
StatusCode
DataStreamTool::getPreviousStream
(
const
EventSelectorDataStream
* & esds,
size_type
& dsid )
331
{
332
333
EventSelectorDataStream
* previousStream =
getStream
(dsid);
334
if
( NULL == previousStream )
return
StatusCode::FAILURE
;
//<-begin of streams reached
335
336
esds = previousStream;
337
--
m_streamID
;
338
339
return
StatusCode::SUCCESS
;
340
341
}
342
343
344
Generated at Mon Feb 17 2014 14:37:45 for Gaudi Framework, version v25r0 by
Doxygen
version 1.8.2 written by
Dimitri van Heesch
, © 1997-2004