ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
DataQuality
GoodRunsLists
Root
TGoodRun.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
6
#include "
GoodRunsLists/TGoodRun.h
"
7
#include "
GoodRunsLists/TMsgLogger.h
"
8
9
#include <algorithm>
10
11
ClassImp
(
Root::TGoodRun
)
12
13
14
Root::TGoodRun::TGoodRun
( )
15
:
std
::
vector
<TLumiBlockRange>()
16
, TObject()
17
, m_runnr(-1)
18
{
19
}
20
21
22
Root::TGoodRun::TGoodRun
(
const
Int_t& runnr )
23
:
std
::
vector
<
TLumiBlockRange
>()
24
, TObject()
25
,
m_runnr
(runnr)
26
{
27
}
28
29
30
Root::TGoodRun::~TGoodRun
()
31
{
32
}
33
34
35
Root::TGoodRun::TGoodRun
(
const
Root::TGoodRun
& other)
36
:
std
::
vector
<
TLumiBlockRange
>(other)
37
, TObject(other)
38
,
m_runnr
(other.
m_runnr
)
39
{
40
}
41
42
43
Root::TGoodRun
&
44
Root::TGoodRun::operator=
(
const
Root::TGoodRun
& other)
45
{
46
if
(&other==
this
) {
47
return
*this ;
48
}
49
std::vector<TLumiBlockRange>::operator=(other);
50
m_runnr
= other.m_runnr;
51
52
return
*this ;
53
}
54
55
56
const
Root::TGoodRun
57
Root::TGoodRun::GetOverlapWith
(
const
Root::TGoodRun
& other)
const
58
{
59
Int_t runnr = ( this->
GetRunNumber
()==other.GetRunNumber() ? this->
GetRunNumber
() : -1 ) ;
60
61
Root::TGoodRun
overlaprun(runnr);
62
if
(runnr==-1)
return
overlaprun;
// no overlap -> empty overlap
63
64
std::vector<Root::TLumiBlockRange>::const_iterator itr1 = this->begin();
65
std::vector<Root::TLumiBlockRange>::const_iterator itr2 = other.begin();
66
67
for
(; itr1!=this->end(); ++itr1) {
68
for
(itr2=other.begin(); itr2!=other.end(); ++itr2) {
69
const
Root::TLumiBlockRange
lbr = itr1->GetOverlapWith(*itr2) ;
70
if
(!lbr.
IsEmpty
()) overlaprun.push_back(lbr);
71
}
72
}
73
74
return
overlaprun;
75
}
76
77
78
const
Root::TGoodRun
79
Root::TGoodRun::GetSumWith
(
const
Root::TGoodRun
& other)
const
80
{
81
Int_t runnr = ( this->
GetRunNumber
()==other.GetRunNumber() ? this->
GetRunNumber
() : -1 ) ;
82
83
Root::TGoodRun
sumrun(runnr);
84
if
(runnr==-1)
return
sumrun;
// only add runs with same runnumber
85
86
Root::TGoodRun
overlap = this->
GetOverlapWith
(other);
87
Root::TGoodRun
onlyinother = this->
GetPartOnlyIn
(other);
88
Root::TGoodRun
notinother = this->
GetPartNotIn
(other);
89
90
std::vector<Root::TLumiBlockRange>::const_iterator itr;
91
for
(itr=overlap.begin(); itr!=overlap.end(); ++itr) sumrun.push_back(*itr);
92
for
(itr=onlyinother.begin(); itr!=onlyinother.end(); ++itr) sumrun.push_back(*itr);
93
for
(itr=notinother.begin(); itr!=notinother.end(); ++itr) sumrun.push_back(*itr);
94
sumrun.
Sort
();
// sort lb ranges
95
96
return
sumrun;
97
}
98
99
100
const
Root::TGoodRun
101
Root::TGoodRun::GetPartOnlyIn
(
const
Root::TGoodRun
& other)
const
102
{
103
return
other.GetPartNotIn(*
this
);
104
}
105
106
107
const
Root::TGoodRun
108
Root::TGoodRun::GetPartNotIn
(
const
Root::TGoodRun
& other)
const
109
{
110
Root::TGoodRun
notinother(*
this
);
111
112
if
(this->
GetRunNumber
()==other.GetRunNumber()) {
113
114
Root::TGoodRun
tmprun(this->
GetRunNumber
());
115
std::vector<Root::TLumiBlockRange>::const_iterator itro,itrt,lbvecitr;
116
117
for
(itro=other.begin(); itro!=other.end(); ++itro) {
118
tmprun.clear();
119
for
(itrt=notinother.begin(); itrt!=notinother.end(); ++itrt) {
120
std::vector<Root::TLumiBlockRange> lbvec = itrt->GetPartNotIn(*itro);
121
for
(lbvecitr=lbvec.begin(); lbvecitr!=lbvec.end(); ++lbvecitr)
122
tmprun.push_back(*lbvecitr);
123
}
124
notinother=tmprun;
125
}
126
}
127
128
return
notinother;
129
}
130
131
132
Bool_t
133
Root::TGoodRun::HasLB
(
const
Int_t& lumiblocknr )
const
134
{
135
std::vector<TLumiBlockRange>::const_iterator itr = this->begin();
136
std::vector<TLumiBlockRange>::const_iterator end = this->end();
137
138
Bool_t pass(kFALSE);
139
for
(; itr!=end; ++itr) {
140
pass = pass || itr->Contains(lumiblocknr) ;
141
if
(pass)
break
;
142
}
143
144
return
pass;
145
}
146
147
148
std::vector< Root::TLumiBlockRange >::iterator
149
Root::TGoodRun::Find
(
const
Int_t& lumiblocknr )
150
{
151
std::vector<TLumiBlockRange>::iterator itr = this->begin();
152
153
Bool_t pass(kFALSE);
154
for
(; itr!=this->end(); ++itr) {
155
pass = itr->Contains(lumiblocknr) ;
156
if
(pass)
break
;
157
}
158
159
return
itr;
160
}
161
162
163
std::vector< Root::TLumiBlockRange >::const_iterator
164
Root::TGoodRun::Find
(
const
Int_t& lumiblocknr )
const
165
{
166
std::vector<TLumiBlockRange>::const_iterator itr = this->begin();
167
168
Bool_t pass(kFALSE);
169
for
(; itr!=this->end(); ++itr) {
170
pass = itr->Contains(lumiblocknr) ;
171
if
(pass)
break
;
172
}
173
174
return
itr;
175
}
176
177
178
void
179
Root::TGoodRun::Summary
()
const
180
{
181
Root::TMsgLogger
m_logger(
"TGoodRun"
);
182
m_logger <<
kINFO
<<
"Run: "
<<
m_runnr
<<
GEndl
;
183
184
std::vector<TLumiBlockRange>::const_iterator itr = this->begin();
185
std::vector<TLumiBlockRange>::const_iterator end = this->end();
186
187
for
(; itr!=end; ++itr)
188
itr->Summary() ;
189
}
190
191
192
void
193
Root::TGoodRun::Sort
()
194
{
195
std::sort
(this->begin(),this->end(),
SorterL2H
());
196
}
197
198
199
void
200
Root::TGoodRun::Compress
()
201
{
202
// this function throws away redundant lb ranges.
203
204
// need to be sure goodrun is sorted in lumiblock ranges
205
this->
Sort
();
206
207
std::vector<TLumiBlockRange>::iterator itr, cbegin, cend;
208
int
fbegin(-1),
/* fend(-1), */
tbegin(-1), tend(-1), lbegin(-1), lend(-1);
209
210
for
(itr=this->begin(); itr!=this->end();) {
211
cbegin = itr;
212
cend = itr;
213
214
// first lumiblock of merge
215
fbegin = cbegin->Begin();
216
//fend = cbegin->End();
217
218
// search all connecting lumi ranges
219
bool
go_on(
true
);
220
for
(++itr; itr!=this->end() && go_on; ++itr) {
221
tbegin = cend->Begin();
222
tend = cend->End();
223
lbegin = itr->Begin();
224
lend = itr->End();
225
if
( lbegin>=tbegin && lend>=tend ) {
// should always be true
226
if
(tend+1<lbegin) { go_on=
false
; }
227
else
{ cend = itr; }
228
}
229
}
230
231
// reset iterator
232
itr=cend; ++itr;
233
234
if
(cbegin!=cend) {
235
// first lumiblock of merge
236
fbegin = cbegin->Begin();
237
// last lumiblock of merge
238
lend = cend->End();
239
// remove [cbegin,itr)
240
itr = this->erase(cbegin,itr);
241
// insert merge lbrange before itr
242
this->insert(itr,
Root::TLumiBlockRange
(fbegin,lend));
243
}
244
}
245
}
246
247
248
Bool_t
249
Root::TGoodRun::IsEmpty
()
const
250
{
251
if
(this->
GetRunNumber
()<0)
return
kTRUE;
252
if
(this->
empty
())
return
kTRUE;
253
254
Bool_t isEmpty(kTRUE);
255
std::vector< TLumiBlockRange >::const_iterator litr = this->begin();
256
for
(; litr!=this->end() && isEmpty; ++litr)
257
isEmpty = isEmpty && litr->IsEmpty();
258
259
return
isEmpty;
260
}
261
262
263
void
264
Root::TGoodRun::AddLB
(
const
Int_t& lumiblocknr )
265
{
266
if
( lumiblocknr<0 )
return
;
267
if
( this->
HasLB
(lumiblocknr) )
return
;
268
269
// add at end
270
std::vector< TLumiBlockRange >::iterator eitr = this->
Find
(lumiblocknr-1);
271
if
(eitr!=this->end()) {
272
eitr->SetEnd(lumiblocknr);
273
this->
Compress
();
274
return
;
275
}
276
// add at beginning
277
std::vector< TLumiBlockRange >::iterator bitr = this->
Find
(lumiblocknr+1);
278
if
(bitr!=this->end()) {
279
bitr->SetBegin(lumiblocknr);
280
this->
Compress
();
281
return
;
282
}
283
// add as new range
284
this->push_back(
Root::TLumiBlockRange
(lumiblocknr,lumiblocknr));
285
this->
Sort
();
286
return
;
287
}
288
ClassImp
ClassImp(Root::TGoodRun) Root
Definition
TGoodRun.cxx:11
TGoodRun.h
TMsgLogger.h
GEndl
#define GEndl
Definition
TMsgLogger.h:147
empty
static const Attributes_t empty
Definition
XmlStreamer.cxx:16
Root::TGoodRun
Definition
TGoodRun.h:22
Root::TGoodRun::IsEmpty
Bool_t IsEmpty() const
Definition
TGoodRun.cxx:249
Root::TGoodRun::TGoodRun
TGoodRun()
Root::TGoodRun::m_runnr
Int_t m_runnr
Definition
TGoodRun.h:53
Root::TGoodRun::operator=
TGoodRun & operator=(const TGoodRun &other)
Definition
TGoodRun.cxx:44
Root::TGoodRun::AddLB
void AddLB(const Int_t &lumiblocknr)
Definition
TGoodRun.cxx:264
Root::TGoodRun::GetPartNotIn
const Root::TGoodRun GetPartNotIn(const TGoodRun &other) const
Definition
TGoodRun.cxx:108
Root::TGoodRun::Find
std::vector< Root::TLumiBlockRange >::iterator Find(const Int_t &lumiblocknr)
Definition
TGoodRun.cxx:149
Root::TGoodRun::Sort
void Sort()
Definition
TGoodRun.cxx:193
Root::TGoodRun::GetSumWith
const Root::TGoodRun GetSumWith(const TGoodRun &other) const
Definition
TGoodRun.cxx:79
Root::TGoodRun::~TGoodRun
virtual ~TGoodRun()
Definition
TGoodRun.cxx:30
Root::TGoodRun::HasLB
Bool_t HasLB(const Int_t &lumiblocknr) const
Definition
TGoodRun.cxx:133
Root::TGoodRun::GetRunNumber
Int_t GetRunNumber() const
Definition
TGoodRun.h:42
Root::TGoodRun::Summary
void Summary() const
Definition
TGoodRun.cxx:179
Root::TGoodRun::GetOverlapWith
const Root::TGoodRun GetOverlapWith(const TGoodRun &other) const
Definition
TGoodRun.cxx:57
Root::TGoodRun::GetPartOnlyIn
const Root::TGoodRun GetPartOnlyIn(const TGoodRun &other) const
Definition
TGoodRun.cxx:101
Root::TGoodRun::Compress
void Compress()
Definition
TGoodRun.cxx:200
Root::TLumiBlockRange
Definition
TLumiBlockRange.h:21
Root::TLumiBlockRange::IsEmpty
Bool_t IsEmpty() const
Definition
TLumiBlockRange.h:40
Root::TMsgLogger
Definition
TMsgLogger.h:47
vector
Definition
MultiHisto.h:13
Root::kINFO
@ kINFO
Definition
TMsgLogger.h:40
std
STL namespace.
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
Root::TGoodRun::SorterL2H
Definition
TGoodRun.h:56
Generated on
for ATLAS Offline Software by
1.17.0