ATLAS Offline Software
Loading...
Searching...
No Matches
computils.cxx
Go to the documentation of this file.
1
9
10// cppcheck-suppress-file stlIfStrFind; cannot use C++20 starts_with in this standalone code
11
12#include <stdlib.h>
13#include <sys/time.h>
14#include <sys/stat.h>
15#include <sys/types.h>
16#include <glob.h>
17#include <stdint.h>
18
19#include <iostream>
20#include <string>
21#include <vector>
22
23#include "label.h"
24#include "DrawLabel.h"
25
26#include "TFile.h"
27#include "TKey.h"
28#include "TTree.h"
29#include "TList.h"
30#include "TObject.h"
31#include "TDirectory.h"
32#include "TH1D.h"
33
34#include "TLegend.h"
35#include "TColor.h"
36
37#include "computils.h"
38
39
40bool LINEF = true;
41bool LINES = false;
42
43
44bool Plots::s_watermark = true;
45
46int colours[6] = { 1, 2, kBlue-4, 6, kCyan-2, kMagenta+2 };
47int markers[6] = { 20, 24, 25, 26, 25, 22 };
48double msizes[6] = { 0.85, 1, 1, 1, 1, 1 };
49
50
51
52double Entries( TH1* h ) {
53 double n = 0;
54 for ( int i=h->GetNbinsX()+1 ; --i ; ) n += h->GetBinContent(i);
55 return n;
56}
57
58
59double integral( TH1* h ) {
60 double n=0;
61 for ( int i=h->GetNbinsX() ; i>0 ; i-- ) n += h->GetBinContent(i);
62 return n;
63}
64
65
66
67void Norm( TH1* h, double scale ) {
68 double n = 0;
69 for ( int i=h->GetNbinsX()+2 ; --i ; ) n += h->GetBinContent(i);
70 if ( n!=0 ) {
71 double in=scale/n;
72 for ( int i=h->GetNbinsX()+2 ; --i ; ) {
73 h->SetBinContent(i, h->GetBinContent(i)*in );
74 h->SetBinError(i, h->GetBinError(i)*in );
75 }
76 }
77
78}
79
80
81
83 m_mean(0), m_error(0) {
84
85 double f = 0;
86 double fx = 0;
87 double fx2 = 0;
88
89 for ( int i=0 ; i<h->GetNbinsX() ; i++ ) {
90 double w = h->GetBinLowEdge(i+2)-h->GetBinLowEdge(i+1);
91 f += h->GetBinContent(i+1)*w;
92 fx += h->GetBinContent(i+1)*w*h->GetBinCenter(i+1);
93 fx2 += h->GetBinContent(i+1)*w*h->GetBinCenter(i+1)*h->GetBinCenter(i+1);
94 }
95
96 if ( f!=0 ) {
97 m_mean = fx/f;
98 m_error = std::sqrt( (fx2/f - m_mean*m_mean )/f );
99 }
100
101}
102
103
104
105
106
107
108
109union floaty_t {
110 floaty_t( float n = 0.0f ) : f(n) {}
111
114 bool negative() const { return i < 0; }
115
117 int32_t raw_mantissa() const { return i & ((1 << 23) - 1); }
119 int32_t raw_exponent() const { return (i >> 23) & 0xff; }
120
121 int32_t i;
122 float f;
123};
124
125
126bool almost_equal( floaty_t a, floaty_t b, int max_diff ) {
127
128 // Check for trivial equality to make sure +0==-0
129 if ( a.f == b.f ) return true;
130
131 // Different signs means they do not match.
132 if ( a.negative() != b.negative() ) return false;
133
134 // Find the difference in last place units
135 int ulps_diff = std::abs( a.i - b.i );
136 if (ulps_diff <= max_diff) return true;
137
138 return false;
139}
140
141
142bool almost_equal( float a, float b, int max_diff ) {
143 return almost_equal( floaty_t(a), floaty_t(b), max_diff );
144}
145
146
149 return almost_equal( a, b, 5 );
150}
151
152
153void trim_tgraph( TH1* h, TGraphAsymmErrors* t ) {
154
155 double ylo = h->GetMinimum();
156
157 int ih=1;
158
159 for ( int i=0 ; i<t->GetN() && ih<=h->GetNbinsX() ; i++, ih++ ) {
160
161 double yt = 0;
162 double xt = 0;
163 double ye = 0;
164
165 t->GetPoint( i, xt, yt );
166 ye = t->GetErrorYlow( i );
167
168 double yh = h->GetBinContent(ih);
169 double xh = h->GetBinCenter(ih);
170
171 while( !almost_equal( xh, xt, 5 ) && ih<=h->GetNbinsX() ) {
172 ih++;
173 yh = h->GetBinContent(ih);
174 xh = h->GetBinCenter(ih);
175 }
176
177 if ( !almost_equal( yh, yt, 5 ) ) throw data_mismatch(std::string("for histogram ")+h->GetName());
178
179 if ( (yt-ye) < ylo ) {
180 h->SetBinContent(ih, ylo-100 );
181 t->SetPoint( i, xt, ylo-100 );
182 }
183
184 }
185}
186
187
188void ATLASFORAPP_LABEL( double x, double y, int color, double size )
189{
190 TLatex* lat = new TLatex(); //lat.SetTextAlign(12); lat.SetTextSize(tsize);
191 lat->SetNDC();
192 lat->SetTextFont(72);
193 lat->SetTextColor(color);
194 lat->SetTextSize(size);
195 lat->DrawLatex(x,y,"ATLAS");
196
197 TLatex* lat2 = new TLatex(); //lat.SetTextAlign(12); lat.SetTextSize(tsize);
198 lat2->SetNDC();
199 lat2->SetTextFont(52);
200 lat2->SetTextColor(color);
201 lat2->SetTextSize(size); // this 0.13 should really be calculated as a ratio of the width of the canvas
202 lat2->DrawLatex(x+0.13,y,"For Approval");
203}
204
205void myText( Double_t x, Double_t y, Color_t color, const std::string& text, Double_t tsize) {
206
207 //Double_t tsize=0.05;
208 TLatex lat; lat.SetTextAlign(12); lat.SetTextSize(tsize);
209 lat.SetNDC();
210 lat.SetTextColor(color);
211 lat.DrawLatex(x,y,text.c_str());
212}
213
214
215std::string stime() {
216 time_t t;
217 time(&t);
218 return label("%s", ctime(&t) );
219}
220
221
223bool contains( const std::string& s, const std::string& p) {
224 return (s.find(p)!=std::string::npos);
225}
226
227
228bool contains( const std::string& s, char p) noexcept {
229 return (s.find(p)!=std::string::npos);
230}
231
232
234bool fcontains( const std::string& s, const std::string& p) {
235 return (s.find(p)==0);
236}
237
238
239double plotable( TH1* h ) { // , double xlo, double xhi ) {
240 double n = 0;
241
242 double xlo = h->GetBinLowEdge(1);
243 double xhi = h->GetBinLowEdge(h->GetNbinsX()+1);
244
245 // if ( xlo!=-999 ) _xlo = xlo;
246 // if ( xhi!=-999 ) _xhi = xhi;
247
248 for ( int i=h->GetNbinsX()+1 ; --i ; ) {
249 if ( h->GetBinCenter(i)>xlo && h->GetBinCenter(i)<xhi ) n += h->GetBinContent(i);
250 }
251 return n;
252}
253
254
255
256bool exists( const std::string& filename ) {
257 struct stat sb;
258 if ( stat( filename.c_str(), &sb)==0 ) return true; // && S_ISREG(sb.st_mode ))
259 else return false;
260}
261
262
263
264std::string globbed( const std::string& s ) {
267
268 glob_t glob_result;
269 glob( s.c_str(), GLOB_TILDE, 0, &glob_result );
270
271 std::vector<std::string> ret;
272 for( unsigned i=0 ; i<glob_result.gl_pathc ; i++ ){
273 ret.push_back( std::string(glob_result.gl_pathv[i]) );
274 }
275 globfree(&glob_result);
276
277
278 if ( ret.empty() ) {
279 std::cerr << "no matching file: " << s << std::endl;
280 return "";
281 }
282
283 if ( ret.size()>1 ) {
284 for ( unsigned i=0 ; i<ret.size() ; i++ ) {
285 std::cout << "matched " << ret[i] << std::endl;
286 }
287 }
288
289 return ret[0];
290}
291
292
293
294
295
296bool empty( TH1* h ) {
297 for ( int i=h->GetNbinsX() ; i>0 ; i-- ) if ( h->GetBinContent(i)!=0 ) return false;
298 return true;
299}
300
301
302std::string tail( std::string s, const std::string& pattern ) {
303 size_t pos = s.find(pattern);
304 while ( pos != std::string::npos ) {
305 s.erase( 0, pos+1 );
306 pos = s.find(pattern);
307 }
308 return s;
309}
310
311
312std::string head( std::string s, const std::string& pattern ) {
313 size_t pos = s.find_last_of(pattern);
314 if ( pos != std::string::npos ) {
315 s.erase( pos, s.size() );
316 }
317 return s;
318}
319
320
321void contents( std::vector<std::string>& keys, TDirectory* td,
322 const std::string& directory, const std::string& pattern, const std::string& path ) {
323 std::vector<std::string> patterns;
324 patterns.push_back(pattern);
325 contents( keys, td, directory, patterns, path );
326}
327
328
329
330
331void contents( std::vector<std::string>& keys, TDirectory* td,
332 const std::string& directory, const std::vector<std::string>& patterns, const std::string& path ) {
333
334 bool print = false;
335
336 TList* tl = td->GetListOfKeys();
337
338 for ( int i=tl->GetSize() ; i-- ; ) {
339
340 TKey* tobj = (TKey*)tl->At(i);
341
342 if ( tobj==0 ) continue;
343
344 if ( std::string(tobj->GetClassName()).find("TDirectory")!=std::string::npos ) {
345
346 TDirectory* tnd = (TDirectory*)tobj->ReadObj();
347
349 std::string dname = tnd->GetName();
350
351 std::string newpath = path+dname+"/";
352 contents( keys, tnd, directory, patterns, newpath );
353
354 }
355 else {
358 if ( directory == "" || contains( path, directory ) ) {
359
360
361 bool matched = true;
362 for ( size_t i=patterns.size() ; i-- ; ) {
363 const std::string& pattern = patterns[i];
364 if ( contains(std::string(tobj->GetName()), pattern ) ) matched &=true;
365 else matched = false;
366 }
367 if ( matched ) {
368 if ( print ) std::cout << "will process " << td->GetName() << " \t:: " << tobj->GetName() << "\tpatterns: " << patterns.size() << std::endl;
369 print = false;
370 keys.push_back( path+tobj->GetName() );
371 }
372 }
373 }
374 }
375}
376
377
378
379
380
381double realmax( TH1* h, bool include_error, double lo, double hi ) {
382 double rm = 0;
383 if ( h->GetNbinsX()==0 ) return 0;
384
385 bool first = true;
386 for ( int i=1 ; i<=h->GetNbinsX() ; i++ ) {
387
388 if ( lo!=hi ) {
389 double c = h->GetBinCenter(i);
390 if ( lo>c || hi<c ) continue;
391 }
392
393 double re = h->GetBinContent(i);
394 if ( include_error ) re += h->GetBinError(i);
395 if ( re!=0 ) {
396 if ( first || rm<re ) {
397 rm = re;
398 first = false;
399 }
400 }
401 }
402
403 return rm;
404}
405
406
407// double realmin( TH1* h, bool include_error, double lo, double hi ) {
408double realmin( TH1* h, bool , double lo, double hi ) {
409
410 if ( h->GetNbinsX()==0 ) return 0;
411
412 double rm = 0;
413
414 bool first = true;
415 for ( int i=1 ; i<=h->GetNbinsX() ; i++ ) {
416
417 if ( lo!=hi ) {
418 double c = h->GetBinCenter(i);
419 if ( lo>c || hi<c ) continue;
420 }
421
422 double re = h->GetBinContent(i);
423
424 if ( re!=0 ) {
425 // if ( include_error ) re -= h->GetBinError(i);
426 if ( first || rm>re ) rm = re;
427 first = false;
428 }
429 }
430
431 return rm;
432}
433
434
435double hmean( TH1* h ) {
436 double N = integral(h);
437 double n=0;
438 for ( int i=h->GetNbinsX() ; i>0 ; i-- ) {
439 n += h->GetBinContent(i);
440 if ( 2*n>N ) return h->GetBinCenter(i);
441 }
442 return 0;
443}
444
445
446
447
448std::vector<int> findxrange(TH1* h, bool symmetric ) {
449
450 int ilo = 1;
451 int ihi = h->GetNbinsX();
452
453 h->GetXaxis()->SetRange( ilo, ihi );
454
455 std::vector<int> limits(2,0);
456 limits[0] = ilo;
457 limits[1] = ihi;
458
459 if ( empty(h) ) return limits;
460
461#if 1
462
464 for ( ; ilo<=ihi ; ilo++ ) if ( h->GetBinContent(ilo)!=0 ) break;
465 for ( ; ihi>=ilo ; ihi-- ) if ( h->GetBinContent(ihi)!=0 ) break;
466
467#else
468
470
472
473 double icont = 1/content;
474
475 double flo = 0;
476 double fhi = 0;
477 for ( ; ilo<=ihi ; ilo++ ) {
478 flo += h->GetBinContent(ilo);
479 if ( (flo*icont)>0.0005 ) break;
480 }
481
482 for ( ; ihi>=ilo ; ihi-- ) {
483 fhi += h->GetBinContent(ihi);
484 if ( (fhi*icont)>0.0005 ) break;
485 }
486
487#endif
488
489 int delta_lo = ilo-1;
490 int delta_hi = h->GetNbinsX()-ihi;
491
492 if ( symmetric ) {
493 if ( delta_hi<delta_lo ) {
494 limits[0] = 1+delta_hi;
495 limits[1] = ihi;
496 }
497 else {
498 limits[0] = 1+delta_lo;
499 limits[1] = h->GetNbinsX()-delta_lo;
500 }
501 }
502 else {
503
504 if ( ilo>1 ) ilo--;
505 if ( ihi<h->GetNbinsX() ) ihi++;
506
507 limits[0] = ilo;
508 limits[1] = ihi;
509 }
510
511 return limits;
512
513}
514
515
516
517void xrange(TH1* h, bool symmetric ) {
518 std::vector<int> limits = findxrange( h, symmetric );
519 h->GetXaxis()->SetRange( limits[0], limits[1] );
520}
521
522
523
524
525std::vector<double> findxrangeuser(TH1* h, bool symmetric ) {
526
527 std::vector<int> limits = findxrange( h, symmetric );
528
529 std::vector<double> dlimits(2,0);
530
531 double dx = h->GetBinLowEdge(limits[1]+1)-h->GetBinLowEdge(limits[1]);
532
533 dlimits[0] = h->GetBinLowEdge(limits[0]);
534 dlimits[1] = h->GetBinLowEdge(limits[1]+1)-dx*1e-11;
535
536 return dlimits;
537}
538
539
540void xrangeuser(TH1* h, bool symmetric ) {
541 std::vector<double> limits = findxrangeuser( h, symmetric );
542 h->GetXaxis()->SetRangeUser( limits[0], limits[1] );
543}
544
545
546
547std::string findcell( std::string name, const std::string& regex, const std::string& splitex ) {
548
549 size_t posex = name.find( regex );
550
551 if ( posex==std::string::npos ) return "";
552
553 size_t pos = name.find_last_of( splitex );
554
555 std::string duff = name;
556
557 while ( pos!=std::string::npos && pos>posex+regex.size() ) {
558 name.resize(pos); //pos must be <=string length
559 pos = name.find_last_of( splitex );
560 }
561
562 pos = name.find( regex );
563
564 name = name.substr( pos, name.size() );
565
566 pos = name.find( splitex );
567
568 if ( pos!=std::string::npos ) return name.substr( 0, pos );
569
570 return name;
571}
572
573
574
575std::string findrun( TFile* f ) {
576
577 TDirectory* here = gDirectory;
578
579 f->cd();
580
581 std::cout << "gDirectory::GetName() " << gDirectory->GetName() << std::endl;
582
583 // gDirectory->pwd();
584
585 // gDirectory->ls();
586
587 TList* tl = gDirectory->GetListOfKeys();
588
590
591 for ( int i=0 ; i<tl->GetSize() ; i++ ) {
592
593 TKey* tobj = (TKey*)tl->At(i);
594
595 if ( tobj==0 ) continue;
596
597 if ( std::string(tobj->GetClassName()).find("TDirectory")!=std::string::npos ) {
598
599 TDirectory* tnd = (TDirectory*)tobj->ReadObj();
600
601 std::string name = tnd->GetName();
602
603 if ( name.find( "run_" )==0 ) {
604 here->cd();
605 return name;
606 }
607 }
608 }
609
610 here->cd();
611
612 return "";
613}
614
615
616
617
619
620void copyReleaseInfo( TFile* finput, TFile* foutdir ) {
621
622 std::vector<std::string> release_data;
623
624 if ( finput && foutdir ) {
625
626 TTree* tree = (TTree*)finput->Get("dataTree");
627 TTree* clone = tree->CloneTree();
628
629 foutdir->cd();
630 clone->Write("", TObject::kOverwrite);
631
632 delete clone;
633
634 }
635
636}
const boost::regex re(r_e)
static Double_t a
void print(char *figname, TCanvas *c1)
#define y
#define xt
#define yt
#define x
static const Attributes_t empty
Header file for AthHistogramAlgorithm.
static bool s_watermark
Definition computils.h:1250
true_mean(TH1F *h)
Definition computils.cxx:82
double m_mean
Definition computils.h:141
double m_error
Definition computils.h:142
bool LINES
Definition computils.cxx:41
int markers[6]
Definition computils.cxx:47
bool LINEF
Definition computils.cxx:40
int colours[6]
Definition computils.cxx:46
double plotable(TH1 *h)
void Norm(TH1 *h, double scale)
Definition computils.cxx:67
std::string findcell(std::string name, const std::string &regex, const std::string &splitex)
bool contains(const std::string &s, const std::string &p)
contains a string
void copyReleaseInfo(TFile *finput, TFile *foutdir)
copy the release info TTree
std::vector< double > findxrangeuser(TH1 *h, bool symmetric)
void xrange(TH1 *h, bool symmetric)
std::string stime()
return the current data and time
void contents(std::vector< std::string > &keys, TDirectory *td, const std::string &directory, const std::string &pattern, const std::string &path)
double hmean(TH1 *h)
void xrangeuser(TH1 *h, bool symmetric)
bool operator==(floaty_t a, floaty_t b)
std::string globbed(const std::string &s)
match a file name
double realmax(TH1 *h, bool include_error, double lo, double hi)
double Entries(TH1 *h)
Definition computils.cxx:52
std::string findrun(TFile *f)
bool exists(const std::string &filename)
does a file exist
std::string tail(std::string s, const std::string &pattern)
tail of a string
std::vector< int > findxrange(TH1 *h, bool symmetric)
automatically set the xrange on a histogram
double realmin(TH1 *h, bool, double lo, double hi)
double msizes[6]
Definition computils.cxx:48
void ATLASFORAPP_LABEL(double x, double y, int color, double size)
double integral(TH1 *h)
Definition computils.cxx:59
void trim_tgraph(TH1 *h, TGraphAsymmErrors *t)
void myText(Double_t x, Double_t y, Color_t color, const std::string &text, Double_t tsize)
std::string head(std::string s, const std::string &pattern)
head of a string
bool almost_equal(floaty_t a, floaty_t b, int max_diff)
bool fcontains(const std::string &s, const std::string &p)
contains a string at the beginning of the string
std::string label(const std::string &format, int i)
Definition label.h:19
std::vector< std::string > patterns
Definition listroot.cxx:187
TChain * tree
int32_t raw_mantissa() const
float has 23 bit mentissa
floaty_t(float n=0.0f)
bool negative() const
portable extraction of components sign
int32_t i
int32_t raw_exponent() const
and an 8 bit exponent