ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
graphics
VP1
VP1Gui
src
VP1Prioritiser.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
6
// //
7
// Implementation of class VP1Prioritiser //
8
// //
9
// Author: Thomas Kittelmann <Thomas.Kittelmann@cern.ch> //
10
// //
11
// Initial version: April 2007 //
12
// //
14
15
#include "
VP1Gui/VP1Prioritiser.h
"
16
#include "
VP1Base/IVP1ChannelWidget.h
"
17
#include "
VP1Base/IVP1System.h
"
18
#include <QTime>
19
#include <QElapsedTimer>
20
#include <QQueue>
21
#include <QSet>
22
#include <map>
23
#include <cassert>
24
28
29
//____________________________________________________________________
30
class
VP1Prioritiser::Imp
{
31
public
:
32
33
class
SystemInfo
{
34
public
:
35
enum
VisibilityState
{
NOTVISIBLE
,
VISIBLE
,
SOONVISIBLE
};
36
SystemInfo
(
IVP1System
*,
Imp
*,
IVP1ChannelWidget
*,
const
VisibilityState
& );
37
~SystemInfo
();
38
IVP1System
*
system
{};
39
void
setVisibilityState
(
const
VisibilityState
&);
40
void
addTimeMeasurement
(
const
double
&);
41
double
refreshtime
()
const
{
return
m_timing
; }
42
private
:
43
double
m_timing
{};
44
double
m_priority
{};
45
const
bool
m_accumulator
;
46
VisibilityState
m_vs
;
47
void
calcPriority
();
48
Imp
*
m_d
{};
49
void
removeFromPriMap
();
50
QQueue<double>
m_timemeasurements
;
51
};
52
53
VP1Prioritiser
*
prioritiser
{};
54
//The following map is for prioritising the order of system refreshes:
55
typedef
std::multimap<double,IVP1System*>
Pri2SysMap
;
56
Pri2SysMap
priority2sys
;
//This map is kept updated automatically by the SystemInfo objects.
57
58
QSet<IVP1ChannelWidget*>
visiblechannels
,
soonvisiblechannels
;
59
double
soonvisbonus
{};
60
61
QHash<IVP1System*,SystemInfo*>
sys2info
;
62
63
QElapsedTimer *
stopwatch
{};
64
IVP1System
*
currenttimedsystem
{};
65
66
void
updateSysinfoWithVisibilityState
(
const
QSet<IVP1ChannelWidget*>& channels,
67
const
SystemInfo::VisibilityState
&vs);
68
69
70
// cppcheck-suppress uninitMemberVarNoCtor
71
std::set<IVP1System *>::const_iterator
itsys
;
72
// cppcheck-suppress uninitMemberVarNoCtor
73
std::set<IVP1System *>::const_iterator
itsysE
;
74
};
75
79
80
//____________________________________________________________________
81
inline
VP1Prioritiser::Imp::SystemInfo::SystemInfo
(
IVP1System
*s,
Imp
*d,
IVP1ChannelWidget
* cw,
const
VisibilityState
& vs )
82
:
system
(s),
m_priority
(117117.117),
83
m_accumulator
(cw->isAccumulator()),
m_vs
(vs),
m_d
(d)
84
{
85
//If another system with the same name exists already, we use that
86
//timing as a reasonable guess. Otherwise we use the average of the
87
//other channels. Failing that we use a default of 500ms.:
88
double
tmp(0);
89
bool
found(
false
);
90
QHash<IVP1System*,Imp::SystemInfo*>::iterator itE =
m_d
->sys2info.end();
91
for
(QHash<IVP1System*,Imp::SystemInfo*>::iterator it=
m_d
->sys2info.begin();it!=itE;++it) {
92
if
( it.key()->name() == s->name() ) {
93
m_timing
=it.value()->refreshtime();
94
found=
true
;
95
break
;
96
}
97
tmp +=
m_timing
=it.value()->refreshtime();
98
}
99
if
(!found&&!
m_d
->sys2info.empty())
100
m_timing
= tmp/
m_d
->sys2info.count();
101
else
102
m_timing
=500;
103
104
calcPriority
();
105
}
106
107
//____________________________________________________________________
108
inline
VP1Prioritiser::Imp::SystemInfo::~SystemInfo
()
109
{
110
removeFromPriMap
();
111
}
112
113
//____________________________________________________________________
114
inline
void
VP1Prioritiser::Imp::SystemInfo::setVisibilityState
(
const
VisibilityState
& vs )
115
{
116
//Fixme: When do we get tabmanager setVisible signals? At startup? When channels are added?
117
//Fixme: Do not emit these during file loading!!
118
if
(
m_vs
==vs)
119
return
;
120
m_vs
= vs;
121
calcPriority
();
122
}
123
124
//____________________________________________________________________
125
inline
void
VP1Prioritiser::Imp::SystemInfo::addTimeMeasurement
(
const
double
&t)
126
{
127
//Keep the seven latest measurements, and use a truncated mean as
128
//final estimate.
129
130
m_timemeasurements
.enqueue(t);
131
if
(
m_timemeasurements
.count()==8)
132
m_timemeasurements
.dequeue();
133
134
QList<double> tmplist =
m_timemeasurements
;
135
std::sort
(tmplist.begin(), tmplist.end());
136
137
switch
(tmplist.count()) {
138
case
1:
m_timing
= tmplist.at(0);
break
;
139
case
2:
m_timing
= 0.5*(tmplist.at(0)+tmplist.at(1));
break
;
140
case
3:
m_timing
= tmplist.at(1);
break
;
141
case
4:
m_timing
= 0.5*(tmplist.at(1)+tmplist.at(2));
break
;
142
case
5:
m_timing
= (tmplist.at(1)+tmplist.at(2)+tmplist.at(3))/3.0;
break
;
143
case
6:
m_timing
= 0.5*(tmplist.at(2)+tmplist.at(3));
break
;
144
case
7:
m_timing
= (tmplist.at(2)+tmplist.at(3)+tmplist.at(4))/3.0;
break
;
145
default
: assert(0&&
"Should never happen"
);
break
;
146
}
147
148
calcPriority
();
149
}
150
151
//____________________________________________________________________
152
inline
void
VP1Prioritiser::Imp::SystemInfo::calcPriority
()
153
{
154
//1) Remove from m_d->priority2sys map
155
156
if
(
m_priority
!=117117.117)
157
removeFromPriMap
();
158
159
//2) Calculate new priority
160
161
//Priority is based on how long the systems take to refresh (the
162
//fastest gets refreshed first). In order to ensure that visible,
163
//soonvisible, and accumulators gets priority they get a bonus of
164
//30s, XXXms, and 100ms respectively (where XXX depends on the scenario):
165
166
m_priority
=
m_timing
+ (
m_vs
==
VISIBLE
?-30000.0:(
m_vs
==
SOONVISIBLE
?-
m_d
->soonvisbonus:0.0)) + (
m_accumulator
?-100.0:0.0);
167
168
//3) Add to m_d->priority2sys map
169
170
std::pair<double,IVP1System*>
a
(
m_priority
,
system
);
171
m_d
->priority2sys.insert(
a
);
172
}
173
174
//____________________________________________________________________
175
inline
void
VP1Prioritiser::Imp::SystemInfo::removeFromPriMap
()
176
{
177
//Fixme: Cache itp and it (in class Imp even?)!
178
std::pair<Pri2SysMap::iterator, Pri2SysMap::iterator> itp(
m_d
->priority2sys.equal_range(
m_priority
));
179
Pri2SysMap::iterator it = itp.first;
180
for
(;it!=itp.second;++it) {
181
if
(it->second==
system
) {
182
m_d
->priority2sys.erase(it);
183
break
;
184
}
185
}
186
assert(it != itp.second);
187
}
188
192
193
//____________________________________________________________________
194
VP1Prioritiser::VP1Prioritiser
(QObject*parent)
195
: QObject(parent),
m_d
(new
Imp
)
196
{
197
m_d
->prioritiser=
this
;
198
m_d
->stopwatch =
new
QElapsedTimer();
199
m_d
->currenttimedsystem=0;
200
m_d
->soonvisbonus=0;
201
}
202
203
//____________________________________________________________________
204
VP1Prioritiser::~VP1Prioritiser
()
205
{
206
delete
m_d
->stopwatch;
207
delete
m_d
;
m_d
=0;
208
}
209
210
//___________________________________________________________________
211
IVP1System
*
VP1Prioritiser::nextErasedActiveSystemByPriority
() {
212
Imp::Pri2SysMap::iterator itE =
m_d
->priority2sys.end();
213
for
(Imp::Pri2SysMap::iterator it=
m_d
->priority2sys.begin();it!=itE;++it) {
214
if
( it->second->state()==
IVP1System::ERASED
&&it->second->activeState()==
IVP1System::ON
)
215
return
it->second;
216
}
217
return
0;
218
}
219
220
//___________________________________________________________________
221
QList<IVP1System*>
VP1Prioritiser::getSystemsToEraseByPriority
() {
222
QList<IVP1System*> tmp;
223
Imp::Pri2SysMap::iterator itE =
m_d
->priority2sys.end();
224
for
(Imp::Pri2SysMap::iterator it=
m_d
->priority2sys.begin();it!=itE;++it) {
225
if
( it->second->state()==
IVP1System::REFRESHED
)
226
tmp << it->second;
227
}
228
return
tmp;
229
}
230
231
232
//___________________________________________________________________
233
double
VP1Prioritiser::estimateRemainingCalcTime
()
const
234
{
235
double
tmp(0);
236
QHash<IVP1System*,Imp::SystemInfo*>::iterator itE =
m_d
->sys2info.end();
237
for
(QHash<IVP1System*,Imp::SystemInfo*>::iterator it=
m_d
->sys2info.begin();it!=itE;++it) {
238
if
( it.key()->state()==
IVP1System::ERASED
&&it.key()->activeState()==
IVP1System::ON
)
239
tmp += it.value()->refreshtime();
240
}
241
return
tmp;
242
}
243
244
//___________________________________________________________________
245
double
VP1Prioritiser::beginTiming_Refresh
(
IVP1System
*s)
246
{
247
assert(!
m_d
->currenttimedsystem);
248
m_d
->stopwatch->start();
249
m_d
->currenttimedsystem=s;
250
assert(
m_d
->sys2info.contains(s));
251
return
m_d
->sys2info[s]->refreshtime();
252
}
253
254
255
//___________________________________________________________________
256
double
VP1Prioritiser::elapsedTiming_Refresh
()
257
{
258
return
static_cast<
double
>
(
m_d
->stopwatch->elapsed());
259
}
260
261
//___________________________________________________________________
262
double
VP1Prioritiser::endTiming_Refresh
()
263
{
264
assert(
m_d
->currenttimedsystem);
265
double
timing =
static_cast<
double
>
(
m_d
->stopwatch->elapsed());
266
if
(
m_d
->sys2info.contains(
m_d
->currenttimedsystem)) {
//This check, since the corresponding channel might have become uncreated in the meantime.
267
m_d
->sys2info[
m_d
->currenttimedsystem]->addTimeMeasurement(timing);
268
}
269
m_d
->currenttimedsystem=0;
270
return
timing;
271
}
272
273
//____________________________________________________________________
274
void
VP1Prioritiser::setupSysItr
(
IVP1ChannelWidget
*cw) {
275
m_d
->itsys = cw->
systems
().begin();
276
m_d
->itsysE = cw->
systems
().end();
277
}
278
279
//___________________________________________________________________
280
void
VP1Prioritiser::Imp::updateSysinfoWithVisibilityState
(
const
QSet<IVP1ChannelWidget*>& channels,
281
const
SystemInfo::VisibilityState
&vs) {
282
for
(
IVP1ChannelWidget
*cw : channels) {
283
for
(
prioritiser
->setupSysItr(cw);
itsys
!=
itsysE
;++
itsys
) {
284
assert(
sys2info
.contains(*
itsys
));
285
//if (sys2info.contains(*itsys))//This check since channel deletion might have triggered this update.
286
sys2info
[*
itsys
]->setVisibilityState(vs);
287
}
288
}
289
}
290
291
//___________________________________________________________________
292
void
VP1Prioritiser::visibleChannelsChanged
(
const
QSet<IVP1ChannelWidget*>&newvis,
293
const
QSet<IVP1ChannelWidget*>&newsoonvis,
294
const
double
& soonvisbonus)
295
{
296
if
(
m_d
->visiblechannels==newvis&&
m_d
->soonvisiblechannels==newsoonvis&&
m_d
->soonvisbonus==soonvisbonus)
297
return
;
298
m_d
->updateSysinfoWithVisibilityState(
m_d
->visiblechannels,
Imp::SystemInfo::NOTVISIBLE
);
299
m_d
->updateSysinfoWithVisibilityState(
m_d
->soonvisiblechannels,
Imp::SystemInfo::NOTVISIBLE
);
300
m_d
->updateSysinfoWithVisibilityState(newvis,
Imp::SystemInfo::VISIBLE
);
301
m_d
->updateSysinfoWithVisibilityState(newsoonvis,
Imp::SystemInfo::SOONVISIBLE
);
302
m_d
->visiblechannels = newvis;
303
m_d
->soonvisiblechannels = newsoonvis;
304
m_d
->soonvisbonus = soonvisbonus;
305
}
306
307
//___________________________________________________________________
308
void
VP1Prioritiser::channelCreated
(
IVP1ChannelWidget
* cw)
309
{
310
bool
visible =
m_d
->visiblechannels.contains(cw);
311
bool
soonvisible =
m_d
->soonvisiblechannels.contains(cw);
312
assert(!(visible&&soonvisible));
313
for
(
setupSysItr
(cw);
m_d
->itsys!=
m_d
->itsysE;++
m_d
->itsys) {
314
assert(!
m_d
->sys2info.contains(*(
m_d
->itsys)));
315
Imp::SystemInfo
* info =
new
Imp::SystemInfo
(*(
m_d
->itsys),
m_d
,cw,
316
(visible?
Imp::SystemInfo::VISIBLE
:(soonvisible?
Imp::SystemInfo::SOONVISIBLE
:
Imp::SystemInfo::NOTVISIBLE
)));
317
m_d
->sys2info.insert(*(
m_d
->itsys),info);
318
}
319
}
320
321
//___________________________________________________________________
322
void
VP1Prioritiser::channelUncreated
(
IVP1ChannelWidget
* cw)
323
{
324
for
(
setupSysItr
(cw);
m_d
->itsys!=
m_d
->itsysE;++
m_d
->itsys) {
325
assert(
m_d
->sys2info.contains(*(
m_d
->itsys)));
326
delete
m_d
->sys2info[*(
m_d
->itsys)];
327
m_d
->sys2info.remove(*(
m_d
->itsys));
328
}
329
if
(
m_d
->visiblechannels.contains(cw))
330
m_d
->visiblechannels.remove(cw);
331
if
(
m_d
->soonvisiblechannels.contains(cw))
332
m_d
->soonvisiblechannels.remove(cw);
333
}
IVP1ChannelWidget.h
IVP1System.h
a
static Double_t a
Definition
LArPhysWaveHECTool.cxx:38
VP1Prioritiser.h
IVP1ChannelWidget
Definition
IVP1ChannelWidget.h:34
IVP1ChannelWidget::systems
const std::set< IVP1System * > & systems()
Definition
IVP1ChannelWidget.cxx:231
IVP1System
Definition
IVP1System.h:36
IVP1System::ON
@ ON
Definition
IVP1System.h:144
IVP1System::ERASED
@ ERASED
Definition
IVP1System.h:143
IVP1System::REFRESHED
@ REFRESHED
Definition
IVP1System.h:143
VP1Prioritiser::Imp::SystemInfo
Definition
VP1Prioritiser.cxx:33
VP1Prioritiser::Imp::SystemInfo::m_accumulator
const bool m_accumulator
Definition
VP1Prioritiser.cxx:45
VP1Prioritiser::Imp::SystemInfo::calcPriority
void calcPriority()
Definition
VP1Prioritiser.cxx:152
VP1Prioritiser::Imp::SystemInfo::m_timemeasurements
QQueue< double > m_timemeasurements
Definition
VP1Prioritiser.cxx:50
VP1Prioritiser::Imp::SystemInfo::m_priority
double m_priority
Definition
VP1Prioritiser.cxx:44
VP1Prioritiser::Imp::SystemInfo::setVisibilityState
void setVisibilityState(const VisibilityState &)
Definition
VP1Prioritiser.cxx:114
VP1Prioritiser::Imp::SystemInfo::m_d
Imp * m_d
Definition
VP1Prioritiser.cxx:48
VP1Prioritiser::Imp::SystemInfo::m_timing
double m_timing
Definition
VP1Prioritiser.cxx:43
VP1Prioritiser::Imp::SystemInfo::system
IVP1System * system
Definition
VP1Prioritiser.cxx:38
VP1Prioritiser::Imp::SystemInfo::m_vs
VisibilityState m_vs
Definition
VP1Prioritiser.cxx:46
VP1Prioritiser::Imp::SystemInfo::~SystemInfo
~SystemInfo()
Definition
VP1Prioritiser.cxx:108
VP1Prioritiser::Imp::SystemInfo::addTimeMeasurement
void addTimeMeasurement(const double &)
Definition
VP1Prioritiser.cxx:125
VP1Prioritiser::Imp::SystemInfo::refreshtime
double refreshtime() const
Definition
VP1Prioritiser.cxx:41
VP1Prioritiser::Imp::SystemInfo::removeFromPriMap
void removeFromPriMap()
Definition
VP1Prioritiser.cxx:175
VP1Prioritiser::Imp::SystemInfo::SystemInfo
SystemInfo(IVP1System *, Imp *, IVP1ChannelWidget *, const VisibilityState &)
Definition
VP1Prioritiser.cxx:81
VP1Prioritiser::Imp::SystemInfo::VisibilityState
VisibilityState
Definition
VP1Prioritiser.cxx:35
VP1Prioritiser::Imp::SystemInfo::VISIBLE
@ VISIBLE
Definition
VP1Prioritiser.cxx:35
VP1Prioritiser::Imp::SystemInfo::SOONVISIBLE
@ SOONVISIBLE
Definition
VP1Prioritiser.cxx:35
VP1Prioritiser::Imp::SystemInfo::NOTVISIBLE
@ NOTVISIBLE
Definition
VP1Prioritiser.cxx:35
VP1Prioritiser::Imp
Definition
VP1Prioritiser.cxx:30
VP1Prioritiser::Imp::itsys
std::set< IVP1System * >::const_iterator itsys
Definition
VP1Prioritiser.cxx:71
VP1Prioritiser::Imp::priority2sys
Pri2SysMap priority2sys
Definition
VP1Prioritiser.cxx:56
VP1Prioritiser::Imp::updateSysinfoWithVisibilityState
void updateSysinfoWithVisibilityState(const QSet< IVP1ChannelWidget * > &channels, const SystemInfo::VisibilityState &vs)
Definition
VP1Prioritiser.cxx:280
VP1Prioritiser::Imp::prioritiser
VP1Prioritiser * prioritiser
Definition
VP1Prioritiser.cxx:53
VP1Prioritiser::Imp::stopwatch
QElapsedTimer * stopwatch
Definition
VP1Prioritiser.cxx:63
VP1Prioritiser::Imp::soonvisbonus
double soonvisbonus
Definition
VP1Prioritiser.cxx:59
VP1Prioritiser::Imp::soonvisiblechannels
QSet< IVP1ChannelWidget * > soonvisiblechannels
Definition
VP1Prioritiser.cxx:58
VP1Prioritiser::Imp::visiblechannels
QSet< IVP1ChannelWidget * > visiblechannels
Definition
VP1Prioritiser.cxx:58
VP1Prioritiser::Imp::itsysE
std::set< IVP1System * >::const_iterator itsysE
Definition
VP1Prioritiser.cxx:73
VP1Prioritiser::Imp::sys2info
QHash< IVP1System *, SystemInfo * > sys2info
Definition
VP1Prioritiser.cxx:61
VP1Prioritiser::Imp::currenttimedsystem
IVP1System * currenttimedsystem
Definition
VP1Prioritiser.cxx:64
VP1Prioritiser::Imp::Pri2SysMap
std::multimap< double, IVP1System * > Pri2SysMap
Definition
VP1Prioritiser.cxx:55
VP1Prioritiser::~VP1Prioritiser
virtual ~VP1Prioritiser()
Definition
VP1Prioritiser.cxx:204
VP1Prioritiser::setupSysItr
void setupSysItr(IVP1ChannelWidget *cw)
Definition
VP1Prioritiser.cxx:274
VP1Prioritiser::estimateRemainingCalcTime
double estimateRemainingCalcTime() const
Definition
VP1Prioritiser.cxx:233
VP1Prioritiser::elapsedTiming_Refresh
double elapsedTiming_Refresh()
Definition
VP1Prioritiser.cxx:256
VP1Prioritiser::visibleChannelsChanged
void visibleChannelsChanged(const QSet< IVP1ChannelWidget * > &vis, const QSet< IVP1ChannelWidget * > &soonvis, const double &soonvisbonus)
Definition
VP1Prioritiser.cxx:292
VP1Prioritiser::nextErasedActiveSystemByPriority
IVP1System * nextErasedActiveSystemByPriority()
Definition
VP1Prioritiser.cxx:211
VP1Prioritiser::endTiming_Refresh
double endTiming_Refresh()
Definition
VP1Prioritiser.cxx:262
VP1Prioritiser::getSystemsToEraseByPriority
QList< IVP1System * > getSystemsToEraseByPriority()
Definition
VP1Prioritiser.cxx:221
VP1Prioritiser::m_d
Imp * m_d
Definition
VP1Prioritiser.h:46
VP1Prioritiser::VP1Prioritiser
VP1Prioritiser(QObject *parent)
Definition
VP1Prioritiser.cxx:194
VP1Prioritiser::channelCreated
void channelCreated(IVP1ChannelWidget *)
Definition
VP1Prioritiser.cxx:308
VP1Prioritiser::beginTiming_Refresh
double beginTiming_Refresh(IVP1System *)
Definition
VP1Prioritiser.cxx:245
VP1Prioritiser::channelUncreated
void channelUncreated(IVP1ChannelWidget *)
Definition
VP1Prioritiser.cxx:322
std::sort
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Definition
DVL_algorithms.h:554
Generated on
for ATLAS Offline Software by
1.17.0