ATLAS Offline Software
Loading...
Searching...
No Matches
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
8
9#include <algorithm>
10
12
13
15 : std::vector<TLumiBlockRange>()
16 , TObject()
17 , m_runnr(-1)
18{
19}
20
21
22Root::TGoodRun::TGoodRun( const Int_t& runnr )
24 , TObject()
25 , m_runnr(runnr)
26{
27}
28
29
33
34
36 : std::vector<TLumiBlockRange>(other)
37 , TObject(other)
38 , m_runnr(other.m_runnr)
39{
40}
41
42
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
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
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
100const Root::TGoodRun
102{
103 return other.GetPartNotIn(*this);
104}
105
106
107const Root::TGoodRun
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
132Bool_t
133Root::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
148std::vector< Root::TLumiBlockRange >::iterator
149Root::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
163std::vector< Root::TLumiBlockRange >::const_iterator
164Root::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
178void
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
192void
194{
195 std::sort(this->begin(),this->end(),SorterL2H());
196}
197
198
199void
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
248Bool_t
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
263void
264Root::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(Root::TGoodRun) Root
Definition TGoodRun.cxx:11
#define GEndl
Definition TMsgLogger.h:147
static const Attributes_t empty
Bool_t IsEmpty() const
Definition TGoodRun.cxx:249
Int_t m_runnr
Definition TGoodRun.h:53
TGoodRun & operator=(const TGoodRun &other)
Definition TGoodRun.cxx:44
void AddLB(const Int_t &lumiblocknr)
Definition TGoodRun.cxx:264
const Root::TGoodRun GetPartNotIn(const TGoodRun &other) const
Definition TGoodRun.cxx:108
std::vector< Root::TLumiBlockRange >::iterator Find(const Int_t &lumiblocknr)
Definition TGoodRun.cxx:149
const Root::TGoodRun GetSumWith(const TGoodRun &other) const
Definition TGoodRun.cxx:79
virtual ~TGoodRun()
Definition TGoodRun.cxx:30
Bool_t HasLB(const Int_t &lumiblocknr) const
Definition TGoodRun.cxx:133
Int_t GetRunNumber() const
Definition TGoodRun.h:42
void Summary() const
Definition TGoodRun.cxx:179
const Root::TGoodRun GetOverlapWith(const TGoodRun &other) const
Definition TGoodRun.cxx:57
const Root::TGoodRun GetPartOnlyIn(const TGoodRun &other) const
Definition TGoodRun.cxx:101
@ kINFO
Definition TMsgLogger.h:40
STL namespace.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.