ATLAS Offline Software
rootspy.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 //Preload library for spying on (typical) calls to ROOT histograms.
6 //Author: Thomas Kittelmann
7 //First version: June 2010
8 //
9 //Compile with the command:
10 //
11 // g++ -Wall -fPIC -c rootspy.cxx && g++ -shared -Wl,-soname,librootspy.so rootspy.o -ldl -o librootspy.so
12 //
13 //And preload to a command <mycommand> by doing:
14 //
15 //LD_PRELOAD=/path/to/lib/librootspy.so <mycommand>
16 //
17 //At some point inside your code (near the end), you should trigger a
18 //report by a magic call exactly like:
19 //
20 //TH1F * hreport = new TH1F("rootspy","",1,0,1);
21 //hreport->Fill("rootspy_producereport",0.123456);
22 //delete hreport;
23 //
24 //And if you provide a method, "unsigned roothiststatGetSize(TH1* h)",
25 //you can get more info collected about the memory footprint of ROOT
26 //histograms (this is not included here since the preload lib does not
27 //(can not) include root headers.
28 //
29 //When running in an athena job with LWHists loaded, these two last
30 //points are taken care off, and all you need to do is to compile
31 //librootspy.so and run:
32 //
33 //LD_PRELOAD=/path/to/lib/librootspy.so athena.py <args>
34 //
35 
36 #include "dlfcn.h"
37 #include <execinfo.h>
38 #include <cstring>
39 #include <map>
40 #include <iostream>
41 
42 class TH1;
43 unsigned roothiststatGetSize(TH1* h);
44 
45 namespace RootSpy {
46 
47  static std::map<const void*,std::pair<std::string,std::string> > s_getsymbol_cache;
48  const std::pair<std::string,std::string>& getSymbol(const void* address)//returns ("/path/to/libSomething.so","_ZSomeSymbol")
49  {
50  if (!address) {
51  static std::pair<std::string,std::string> np("/libnothing.so","nullptr");
52  return np;
53  }
54  std::map<const void*,std::pair<std::string,std::string> >::const_iterator it=s_getsymbol_cache.find(address);
55  if (it!=s_getsymbol_cache.end())
56  return it->second;
57 
58  void *array[1];
59  array[0]=const_cast<void*>(address);
60  char **strings = backtrace_symbols (array,1);
61  std::string s(strings[0]);
62  size_t n = s.find('+');
63  if (n!=std::string::npos) s.resize(n);
64  n=s.find('(');
65  std::string cleansymb = &(s.c_str()[(n==std::string::npos?0:n+1)]);
66  std::string libname(s);
67  if (n!=std::string::npos)
68  libname.resize(n);
69  s_getsymbol_cache[address]=std::pair<std::string,std::string>(libname,cleansymb);
70  return s_getsymbol_cache[address];
71  }
72 
73  bool endsWith(const std::string&s,const char *pat,size_t npat) {
74  return s.size()>=npat && strncmp(&(s[s.size()-npat]),pat,npat)==0;
75  }
76  bool ignoreLib(const std::string&libname)
77  {
78  return endsWith(libname,"libHist.so",10)||endsWith(libname,"libAthenaMonitoringLib.so",25);
79  }
80 
81  //Utilities for book-keeping calls to root objects:
82  const char * getROOTName(void* tobject) {
83  // cppcheck-suppress nullPointerRedundantCheck; false positive
84  static const char* (*real)(void*) = 0;
85  if (!real) {
86  real = (const char* (*)(void*))dlsym(RTLD_NEXT, "_ZNK6TNamed7GetNameEv");//Fixme: avoid this symbol hardcoding.
87  if (!real) {
88  std::cout<<"ROOTSPY ERROR: Could not find symbol for TNamed::GetName() through hardcoded mangling."<<std::endl;
89  return nullptr;
90  }
91  }
92  return real(tobject);
93  }
94 
95  const char * getROOTClass(void* tobject) {
96  // cppcheck-suppress nullPointerRedundantCheck; false positive
97  static const char* (*real)(void*) = 0;
98  if (!real) {
99  real = (const char* (*)(void*))dlsym(RTLD_NEXT, "_ZNK7TObject9ClassNameEv");//Fixme: avoid this symbol hardcoding.
100  if (!real) {
101  std::cout<<"ROOTSPY ERROR: Could not find symbol for TObject::GetName() through hardcoded mangling."<<std::endl;
102  return nullptr;
103  }
104  }
105  return real(tobject);
106  }
107 
108  struct logitem {
109  explicit logitem(bool indirect):hash(0),ntrace(0),trace(),traceoffset(indirect?1:0){}
110  unsigned hash;
111  static const unsigned ntracemax=8;
112  unsigned ntrace;
113  void * trace[ntracemax];
114  unsigned traceoffset;
115  std::string name;//root class and name
116  void calchash() {
117  hash=ntrace;
118  for(unsigned i=0;i<ntrace;++i)
119  hash += *((unsigned*)(trace[i]));
120  if (traceoffset) hash += 1;
121  return;//fixme
122  size_t l(name.length());
123  if (l>=sizeof(unsigned)) {
124  const size_t l2(l-l%sizeof(unsigned));
125  for (size_t i=0;i<l2;i+=sizeof(unsigned))
126  hash+=*((unsigned*)(&(name.at(0))));
127  hash+=*((unsigned*)(&(name.at(l-sizeof(unsigned)))));//last bytes
128  }
129  }
130  bool operator<(const logitem&o) const {
131  if (hash!=o.hash) return hash<o.hash;
132  if (ntrace!=o.ntrace) return ntrace<o.ntrace;
133  for(unsigned i=0;i<ntrace;++i)
134  if (trace[i]!=o.trace[i]) return trace[i]<o.trace[i];
135  //Not really necessary: same trace should have same offset:
137  return name<o.name;
138  }
139  };
140  static std::map<logitem,unsigned> s_logcalls;
141  static std::map<void*,std::pair<logitem,unsigned> > s_loghists;//histaddress->(first logitem,maxsize).
142  static int loglvl=0;
143  void logcall(const void* cthisptr,void *& realaddr,bool indirect=false)//if addr==0, look up and set address
144  {
145  if (realaddr&&loglvl>1)
146  return;
147  logitem item(indirect);
148  item.ntrace=backtrace(item.trace, logitem::ntracemax);
149  if (!realaddr)
150  realaddr=dlsym(RTLD_NEXT, getSymbol(item.trace[1+item.traceoffset]).second.c_str());
151  if (loglvl>1)
152  return;
153  //Add the non-trace info and calc hash:
154  void* thisptr=const_cast<void*>(cthisptr);
155  const char* rc=thisptr?getROOTClass(thisptr):0;
156  const char* rn=thisptr?getROOTName(thisptr):0;
157  if (!rc) rc="NULL";
158  if (!rn) rn="NULL";
159  size_t nrc(strlen(rc));
160  size_t nrn(strlen(rn));
161  item.name.reserve(nrc+nrn+1);
162  item.name.append(rc,nrc);
163  item.name.push_back(':');
164  item.name.append(rn,nrn);
165  item.calchash();
166  //Log this trace and root item:
168  if (it==s_logcalls.end()) {
169  s_logcalls[item]=1;
170  } else {
171  ++(it->second);
172  }
173  //Log this histogram and its size:
174  unsigned thesize = roothiststatGetSize(static_cast<TH1*>(thisptr));//TK: Really update every single time?
175  std::map<void*,std::pair<logitem,unsigned> >::iterator it2=s_loghists.find(thisptr);//histaddress->(first logitem,maxsize).
176  if (it2==s_loghists.end()) {
177  s_loghists.insert(std::pair<void*,std::pair<logitem,unsigned> >(thisptr,std::pair<logitem,unsigned>(item,thesize)));
178  } else {
179  it2->second.second=std::max<unsigned>(it2->second.second,thesize);
180  }
181  }
182 
183  void logcall(const void* cthisptr,const void *& realaddr)
184  {
185  void* ra = const_cast<void*>(realaddr);
186  logcall(cthisptr,ra,true);
187  realaddr=ra;
188  };
189 
190  const std::pair<std::string,std::string>& getUserSymbol(const logitem&item) {
191  unsigned depth=2+item.traceoffset;
192  for (;depth<item.ntrace;++depth) {
193  const std::pair<std::string,std::string>& s=getSymbol(item.trace[depth]);
194  if (!ignoreLib(s.first)) {
195  return s;
196  }
197  }
198  std::cout<<"ROOTSPY WARNING: Could not find user symbol in trace"<<std::endl;
199  return getSymbol(item.trace[item.ntrace-1]);
200  }
201 
202  void reportcall(const logitem& item, unsigned ncalls) {
203  const std::pair<std::string,std::string>& s = getUserSymbol(item);
204  std::cout<<ncalls<<" calls to "<<getSymbol(item.trace[1+item.traceoffset]).second
205  <<" by "<<s.second <<" : "<<s.first <<" : "<<item.name<<std::endl;
206  }
207  void reporthist(const logitem& item, unsigned thesize) {
208  std::cout<<thesize<<" bytes in "<<item.name<<" from "<<getUserSymbol(item).first<<std::endl;
209  }
210  void producereport() {
211  std::cout<<"============= rootspy: Producing report [begin]"<<std::endl;
212  std::cout<<"============= Calls"<<std::endl;
213  std::map<logitem,unsigned>::iterator it(s_logcalls.begin()),itE(s_logcalls.end());
214  for (;it!=itE;++it)
215  reportcall(it->first,it->second);
216  std::cout<<"============= Sizes"<<std::endl;
217  std::map<void*,std::pair<logitem,unsigned> >::iterator it2(s_loghists.begin()),it2E(s_loghists.end());
218  for (;it2!=it2E;++it2)
219  reporthist(it2->second.first,it2->second.second);
220  std::cout<<"============= rootspy: Producing report [end]"<<std::endl;
221  }
222 
223 }//End namespace RootSpy
224 
226 {
227  if (!h)
228  return 0;
229  //Since we are not linking with ROOT in this little spy lib, this
230  //particular method has to be implemented elsewhere (but if it is
231  //not, we simply return 0):
232  static bool needsinit = true;
233  static unsigned (*real)(TH1*) = 0;
234  if (needsinit) {
235  needsinit=false;
236  //Find our own signature:
237  void *array[1];
238  backtrace(array, 1);
239  real = (unsigned (*)(TH1*))dlsym(RTLD_NEXT,RootSpy::getSymbol(array[0]).second.c_str());
240  if (!real)
241  std::cout<<"ROOTSPY WARNING: Could not find roothiststatGetSize(..) symbol. Reduced functionality"<<std::endl;
242  }
243  return real ? real(h) : 0;
244 }
245 
246 #define LOGCALL static void * realaddr=0;++RootSpy::loglvl;RootSpy::logcall(this,realaddr);
247 #define LOGCALLC static const void * realaddr=0;++RootSpy::loglvl;RootSpy::logcall(this,realaddr);
248 //Now, implement all the root methods we want to monitor (all similar
249 //apart from one magic method used to trigger the report). All must be
250 //implemented without implicit inlining, or it won't work. The list of
251 //methods might have to evolve to adapt to changes in ROOT (this works
252 //for 5.22/00h).
253 
254 //NB: We only need to monitor the Get/SetBinContent methods taking one
255 //parameter, due to internal root mappings.
256 
257 /*********************** TH1 ***********************/
258 
259 template <typename T>
260 T ret(T t) {
261  --RootSpy::loglvl;
262  return t;
263 }
264 void ret(void) {
265  --RootSpy::loglvl;
266 }
267 
268 class TH1 {
269 public:
270  int Fill(double);
271  int Fill(double,double);
272  int Fill(const char *, double);
273  double GetBinContent(int) const;
274  double GetBinContent(int,int) const;
275  double GetBinContent(int,int,int) const;
276  void SetBinContent(int,double);
277  void SetBinContent(int,int,double);
278  void SetBinContent(int,int,int,double);
279  void SetBinError(int, double);
280  void SetBinError(int, int, double);
281  void SetBinError(int, int, int, double);
282  void Sumw2();
283 };
284 void TH1::Sumw2() { LOGCALL; ((void (*)(void*))realaddr)(this);ret(); }
285 int TH1::Fill(double d) { LOGCALL; return ret(((int (*)(void*,double))realaddr)(this,d)); }
286 int TH1::Fill(double d1,double d2) { LOGCALL; return ret(((int (*)(void*,double,double))realaddr)(this,d1,d2)); }
287 int TH1::Fill(const char*c,double d)
288 {
289  //This is the magic way we can trigger a report from elsewhere in the code. I.e. do:
290  //(new TH1F("rootspy","",1,0,1))->Fill("rootspy_producereport",0.123456);
291  if (d==0.123456&&std::string(c)=="rootspy_producereport") {
293  return 0;
294  } else {
295  LOGCALL; return ret(((int (*)(void*,const char*,double))realaddr)(this,c,d));
296  }
297 }
298 double TH1::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
299 double TH1::GetBinContent(int i1,int i2) const { LOGCALLC; return ret(((double(*)(const void*,int,int))realaddr)(this,i1,i2)); }
300 double TH1::GetBinContent(int i1,int i2, int i3) const { LOGCALLC; return ret(((double(*)(const void*,int,int,int))realaddr)(this,i1,i2,i3)); }
301 void TH1::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
302 void TH1::SetBinContent(int i1,int i2,double d) { LOGCALL; ((void(*)(void*,int,int,double))realaddr)(this,i1,i2,d);ret(); }
303 void TH1::SetBinContent(int i1,int i2,int i3,double d) { LOGCALL; ((void(*)(void*,int,int,int,double))realaddr)(this,i1,i2,i3,d);ret(); }
304 void TH1::SetBinError(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
305 void TH1::SetBinError(int i1,int i2,double d) { LOGCALL; ((void(*)(void*,int,int,double))realaddr)(this,i1,i2,d);ret(); }
306 void TH1::SetBinError(int i1,int i2,int i3,double d) { LOGCALL; ((void(*)(void*,int,int,int,double))realaddr)(this,i1,i2,i3,d);ret(); }
307 
308 /*********************** TH1K ***********************/
309 
310 class TH1K {
311 public:
312  double GetBinContent(int) const;
313  int Fill(double);
314 };
315 int TH1K::Fill(double d) { LOGCALL; return ret(((int(*)(void*,double))realaddr)(this,d)); }
316 double TH1K::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
317 
318 /*********************** TH1F ***********************/
319 
320 class TH1F {
321 public:
322  double GetBinContent(int) const;
323  void SetBinContent(int,double);
324  ~TH1F();
325 };
326 double TH1F::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
327 void TH1F::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
328 
329 
330 /*********************** TH1I ***********************/
331 
332 class TH1I {
333 public:
334  double GetBinContent(int) const;
335  void SetBinContent(int,double);
336 };
337 double TH1I::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
338 void TH1I::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
339 
340 /*********************** TH1D ***********************/
341 
342 class TH1D {
343 public:
344  double GetBinContent(int) const;
345  void SetBinContent(int,double);
346 };
347 double TH1D::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
348 void TH1D::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
349 
350 /*********************** TH1C ***********************/
351 
352 class TH1C {
353 public:
354  double GetBinContent(int) const;
355  void SetBinContent(int,double);
356 };
357 double TH1C::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
358 void TH1C::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
359 
360 /*********************** TH1S ***********************/
361 
362 class TH1S {
363 public:
364  double GetBinContent(int) const;
365  void SetBinContent(int,double);
366 };
367 double TH1S::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
368 void TH1S::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
369 
370 
371 /*********************** TH2 ***********************/
372 
373 class TH2 {
374 public:
375  int Fill(double,double);
376  int Fill(double,double,double);
377  int Fill(const char*,const char*,double);
378  int Fill(const char*,double,double);
379  int Fill(double, const char*,double);
380 };
381 
382 int TH2::Fill(double d1,double d2) { LOGCALL; return ret(((int(*)(void*,double,double))realaddr)(this,d1,d2)); }
383 int TH2::Fill(double d1,double d2,double d3) { LOGCALL; return ret(((int(*)(void*,double,double,double))realaddr)(this,d1,d2,d3)); }
384 int TH2::Fill(const char*c1,const char*c2,double d) { LOGCALL; return ret(((int(*)(void*,const char*,const char*,double))realaddr)(this,c1,c2,d)); }
385 int TH2::Fill(const char* c,double d1,double d2) { LOGCALL; return ret(((int(*)(void*,const char*,double,double))realaddr)(this,c,d1,d2)); }
386 int TH2::Fill(double d1, const char* c,double d2) { LOGCALL; return ret(((int(*)(void*,double,const char*,double))realaddr)(this,d1,c,d2)); }
387 
388 /*********************** TH2C ***********************/
389 
390 class TH2C {
391 public:
392  double GetBinContent(int) const;
393  void SetBinContent(int,double);
394 };
395 double TH2C::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
396 void TH2C::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
397 
398 /*********************** TH2S ***********************/
399 
400 class TH2S {
401 public:
402  double GetBinContent(int) const;
403  void SetBinContent(int,double);
404 };
405 double TH2S::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
406 void TH2S::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
407 
408 /*********************** TH2I ***********************/
409 
410 class TH2I {
411 public:
412  double GetBinContent(int) const;
413  void SetBinContent(int,double);
414 };
415 double TH2I::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
416 void TH2I::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
417 
418 /*********************** TH2F ***********************/
419 
420 class TH2F {
421 public:
422  double GetBinContent(int) const;
423  void SetBinContent(int,double);
424 };
425 double TH2F::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
426 void TH2F::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
427 
428 /*********************** TH2D ***********************/
429 
430 class TH2D {
431 public:
432  double GetBinContent(int) const;
433  void SetBinContent(int,double);
434 };
435 double TH2D::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
436 void TH2D::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
437 
438 /*********************** TH3 ***********************/
439 
440 class TH3 {
441 public:
442  int Fill(double, double, double);
443  int Fill(double, double, double, double);
444  int Fill(const char *, const char *, const char *, double);
445  int Fill(const char *, double, const char *, double);
446  int Fill(const char *, const char *, double, double);
447  int Fill(double, const char *, const char *, double);
448  int Fill(double, const char *, double, double);
449  int Fill(double, double, const char *, double);
450 };
451 
452 
453 int TH3::Fill(double d1, double d2, double d3) { LOGCALL; return ret(((int(*)(void*,double,double,double))realaddr)(this,d1,d2,d3)); }
454 int TH3::Fill(double d1, double d2, double d3, double d4) { LOGCALL; return ret(((int(*)(void*,double,double,double,double))realaddr)(this,d1,d2,d3,d4)); }
455 int TH3::Fill(const char * c1, const char * c2, const char * c3, double d) { LOGCALL; return ret(((int(*)(void*,const char*,const char*,const char*,double))realaddr)(this,c1,c2,c3,d)); }
456 int TH3::Fill(const char * c1, double d1, const char * c2, double d2) { LOGCALL; return ret(((int(*)(void*,const char*,double,const char*,double))realaddr)(this,c1,d1,c2,d2)); }
457 int TH3::Fill(const char * c1, const char * c2, double d1, double d2) { LOGCALL; return ret(((int(*)(void*,const char*,const char*,double,double))realaddr)(this,c1,c2,d1,d2)); }
458 int TH3::Fill(double d1, const char *c1, const char *c2, double d2) { LOGCALL; return ret(((int(*)(void*,double,const char*,const char*,double))realaddr)(this,d1,c1,c2,d2)); }
459 int TH3::Fill(double d1, const char *c, double d2, double d3) { LOGCALL; return ret(((int(*)(void*,double,const char*,double,double))realaddr)(this,d1,c,d2,d3)); }
460 int TH3::Fill(double d1, double d2, const char *c, double d3) { LOGCALL; return ret(((int(*)(void*,double,double,const char*,double))realaddr)(this,d1,d2,c,d3)); }
461 
462 
463 /*********************** TH3C ***********************/
464 
465 class TH3C {
466 public:
467  double GetBinContent(int) const;
468  void SetBinContent(int,double);
469 };
470 double TH3C::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
471 void TH3C::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
472 
473 /*********************** TH3S ***********************/
474 
475 class TH3S {
476 public:
477  double GetBinContent(int) const;
478  void SetBinContent(int,double);
479 };
480 double TH3S::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
481 void TH3S::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
482 
483 /*********************** TH3I ***********************/
484 
485 class TH3I {
486 public:
487  double GetBinContent(int) const;
488  void SetBinContent(int,double);
489 };
490 double TH3I::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
491 void TH3I::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
492 
493 /*********************** TH3F ***********************/
494 
495 class TH3F {
496 public:
497  double GetBinContent(int) const;
498  void SetBinContent(int,double);
499 };
500 double TH3F::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
501 void TH3F::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
502 
503 /*********************** TH3D ***********************/
504 
505 class TH3D {
506 public:
507  double GetBinContent(int) const;
508  void SetBinContent(int,double);
509 };
510 double TH3D::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
511 void TH3D::SetBinContent(int i,double d) { LOGCALL; ((void(*)(void*,int,double))realaddr)(this,i,d);ret(); }
512 
513 /*********************** TProfile ***********************/
514 
515 class TProfile {
516 public:
517  int Fill(double,double);
518  int Fill(const char *,double);
519  int Fill(double,double,double);
520  int Fill(const char *,double,double);
521  double GetBinContent(int) const;
522 };
523 int TProfile::Fill(double d1,double d2) { LOGCALL; return ret(((int(*)(void*,double,double))realaddr)(this,d1,d2)); }
524 int TProfile::Fill(const char *c,double d) { LOGCALL; return ret(((int(*)(void*,const char*,double))realaddr)(this,c,d)); }
525 int TProfile::Fill(double d1,double d2,double d3) { LOGCALL; return ret(((int(*)(void*,double,double,double))realaddr)(this,d1,d2,d3)); }
526 int TProfile::Fill(const char *c,double d1,double d2) { LOGCALL; return ret(((int(*)(void*,const char*,double,double))realaddr)(this,c,d1,d2)); }
527 double TProfile::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
528 
529 
530 /*********************** TProfile2D ***********************/
531 class TProfile2D {
532 public:
533  int Fill(double,double,double);
534  int Fill(double,const char *,double);
535  int Fill(const char *,const char *,double);
536  int Fill(const char *,double,double);
537  int Fill(double,double,double,double);
538  double GetBinContent(int) const;
539 };
540 
541 int TProfile2D::Fill(double d1,double d2,double d3) { LOGCALL; return ret(((int(*)(void*,double,double,double))realaddr)(this,d1,d2,d3)); }
542 int TProfile2D::Fill(double d1,const char *c,double d2) { LOGCALL; return ret(((int(*)(void*,double,const char*,double))realaddr)(this,d1,c,d2)); }
543 int TProfile2D::Fill(const char *c1,const char *c2,double d) { LOGCALL; return ret(((int(*)(void*,const char*,const char*,double))realaddr)(this,c1,c2,d)); }
544 int TProfile2D::Fill(const char *c,double d1,double d2) { LOGCALL; return ret(((int(*)(void*,const char*,double,double))realaddr)(this,c,d1,d2)); }
545 int TProfile2D::Fill(double d1,double d2,double d3,double d4) { LOGCALL; return ret(((int(*)(void*,double,double,double,double))realaddr)(this,d1,d2,d3,d4)); }
546 double TProfile2D::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
547 
548 
549 /*********************** TProfile3D ***********************/
550 class TProfile3D {
551 public:
552  int Fill(double,double,double,double);
553  int Fill(double,double,double,double,double);
554  double GetBinContent(int) const;
555 };
556 int TProfile3D::Fill(double d1,double d2,double d3,double d4) { LOGCALL; return ret(((int(*)(void*,double,double,double,double))realaddr)(this,d1,d2,d3,d4)); }
557 int TProfile3D::Fill(double d1,double d2,double d3,double d4,double d5) { LOGCALL; return ret(((int(*)(void*,double,double,double,double,double))realaddr)(this,d1,d2,d3,d4,d5)); }
558 double TProfile3D::GetBinContent(int i) const { LOGCALLC; return ret(((double(*)(const void*,int))realaddr)(this,i)); }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
TH1S::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:368
TH2::Fill
int Fill(double, double)
Definition: rootspy.cxx:382
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
TH2D::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:435
RootSpy::logitem::trace
void * trace[ntracemax]
Definition: rootspy.cxx:113
RootSpy::producereport
void producereport()
Definition: rootspy.cxx:210
TH3I
Definition: rootspy.cxx:485
egammaParameters::depth
@ depth
pointing depth of the shower as calculated in egammaqgcld
Definition: egammaParamDefs.h:276
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
TH3S
Definition: rootspy.cxx:475
RootSpy::getROOTName
const char * getROOTName(void *tobject)
Definition: rootspy.cxx:82
TH1F::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:326
TH2I::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:416
RootSpy::logcall
void logcall(const void *cthisptr, void *&realaddr, bool indirect=false)
Definition: rootspy.cxx:143
TH3D
Definition: rootspy.cxx:505
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
TH1I
Definition: rootspy.cxx:332
TH2F
Definition: rootspy.cxx:420
TH2S::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:406
TH3I::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:491
hist_file_dump.d
d
Definition: hist_file_dump.py:137
TH2D::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:436
extractSporadic.c1
c1
Definition: extractSporadic.py:134
TH3D::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:511
skel.it
it
Definition: skel.GENtoEVGEN.py:423
TProfile2D
Definition: rootspy.cxx:531
TH1D
Definition: rootspy.cxx:342
RootSpy::logitem
Definition: rootspy.cxx:108
RootSpy
Definition: rootspy.cxx:45
dq_defect_virtual_defect_validation.d1
d1
Definition: dq_defect_virtual_defect_validation.py:79
TH3D::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:510
RootSpy::logitem::logitem
logitem(bool indirect)
Definition: rootspy.cxx:109
TH1K
Definition: rootspy.cxx:310
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
PlotPulseshapeFromCool.np
np
Definition: PlotPulseshapeFromCool.py:64
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:662
TH3C
Definition: rootspy.cxx:465
TH2S
Definition: rootspy.cxx:400
TruthTest.itE
itE
Definition: TruthTest.py:25
TProfile3D::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:558
RootSpy::getUserSymbol
const std::pair< std::string, std::string > & getUserSymbol(const logitem &item)
Definition: rootspy.cxx:190
RootSpy::endsWith
bool endsWith(const std::string &s, const char *pat, size_t npat)
Definition: rootspy.cxx:73
TH1C::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:358
compileRPVLLRates_emergingFilterTest.c3
c3
Definition: compileRPVLLRates_emergingFilterTest.py:559
TH1D::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:347
PyPoolBrowser.item
item
Definition: PyPoolBrowser.py:129
TH3C::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:470
skel.l2
l2
Definition: skel.GENtoEVGEN.py:426
TH1C
Definition: rootspy.cxx:352
TH3::Fill
int Fill(double, double, double)
Definition: rootspy.cxx:453
TH1::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:301
RootSpy::getROOTClass
const char * getROOTClass(void *tobject)
Definition: rootspy.cxx:95
lumiFormat.i
int i
Definition: lumiFormat.py:92
RootSpy::logitem::calchash
void calchash()
Definition: rootspy.cxx:116
ret
T ret(T t)
Definition: rootspy.cxx:260
beamspotman.n
n
Definition: beamspotman.py:731
roothiststatGetSize
unsigned roothiststatGetSize(TH1 *h)
Definition: rootspy.cxx:225
TH2I
Definition: rootspy.cxx:410
LOGCALLC
#define LOGCALLC
Definition: rootspy.cxx:247
TH2I::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:415
TH1K::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:316
RootSpy::logitem::ntrace
unsigned ntrace
Definition: rootspy.cxx:112
TH3
Definition: rootspy.cxx:440
TH2C::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:396
python.BunchSpacingUtils.rn
rn
Definition: BunchSpacingUtils.py:87
TProfile2D::Fill
int Fill(double, double, double)
Definition: rootspy.cxx:541
TH1F::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:327
TH2D
Definition: rootspy.cxx:430
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
TH3S::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:481
TH1::Fill
int Fill(double)
Definition: rootspy.cxx:285
LOGCALL
#define LOGCALL
Definition: rootspy.cxx:246
TH1K::Fill
int Fill(double)
Definition: rootspy.cxx:315
TH3I::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:490
TH2
Definition: rootspy.cxx:373
TH2F::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:425
TH1::SetBinError
void SetBinError(int, double)
Definition: rootspy.cxx:304
TH2F::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:426
lumiFormat.array
array
Definition: lumiFormat.py:98
dso-stats.pat
pat
Definition: dso-stats.py:39
TH2C::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:395
RootSpy::logitem::operator<
bool operator<(const logitem &o) const
Definition: rootspy.cxx:130
TProfile3D::Fill
int Fill(double, double, double, double)
Definition: rootspy.cxx:556
TH3F::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:500
TH1S::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:367
TProfile3D
Definition: rootspy.cxx:550
RootSpy::reporthist
void reporthist(const logitem &item, unsigned thesize)
Definition: rootspy.cxx:207
TH2S::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:405
TH3S::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:480
TH3C::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:471
compileRPVLLRates.c2
c2
Definition: compileRPVLLRates.py:361
TH3F
Definition: rootspy.cxx:495
TH1D::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:348
TProfile
Definition: rootspy.cxx:515
TProfile2D::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:546
TH1::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:298
item
Definition: ItemListSvc.h:43
TH1::Sumw2
void Sumw2()
Definition: rootspy.cxx:284
TH1F::~TH1F
~TH1F()
RTTAlgmain.address
address
Definition: RTTAlgmain.py:55
TH1C::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:357
RootSpy::getSymbol
const std::pair< std::string, std::string > & getSymbol(const void *address)
Definition: rootspy.cxx:48
TH3F::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:501
h
TProfile::Fill
int Fill(double, double)
Definition: rootspy.cxx:523
TH1F
Definition: rootspy.cxx:320
TH2C
Definition: rootspy.cxx:390
TH1S
Definition: rootspy.cxx:362
TH1I::SetBinContent
void SetBinContent(int, double)
Definition: rootspy.cxx:338
TH1
Definition: rootspy.cxx:268
dq_defect_virtual_defect_validation.d2
d2
Definition: dq_defect_virtual_defect_validation.py:81
RootSpy::logitem::ntracemax
static const unsigned ntracemax
Definition: rootspy.cxx:111
RootSpy::reportcall
void reportcall(const logitem &item, unsigned ncalls)
Definition: rootspy.cxx:202
RootSpy::logitem::traceoffset
unsigned traceoffset
Definition: rootspy.cxx:114
TH1I::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:337
check_log.backtrace
backtrace
Definition: check_log.py:58
python.compressB64.c
def c
Definition: compressB64.py:93
RootSpy::logitem::name
std::string name
Definition: rootspy.cxx:115
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
RootSpy::ignoreLib
bool ignoreLib(const std::string &libname)
Definition: rootspy.cxx:76
TProfile::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:527
RootSpy::logitem::hash
unsigned hash
Definition: rootspy.cxx:110