ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TCanvas.h>
#include <TString.h>
#include <TLatex.h>
#include <TMath.h>
#include <TPad.h>
#include <TList.h>
#include <TH1.h>
#include <TGraph.h>
#include <TF1.h>
#include <TStyle.h>
#include <TFrame.h>
#include <TPaveStats.h>
#endif

TH1* GetBaseHisto(TPad* pad=0);
TFrame* GetFrame(TPad* pad=0);
void SetStatPad(TH1* hst,float x1,float x2,float y1,float y2);
TPaveStats* GetStatPad(TH1* hst);
void SetHStyle(TH1* hst,int col=kRed,int mark=20,float mrsize=0.7);
void SetGStyle(TGraph* hst,int col=kRed,int mark=20,float mrsize=0.7);
TH1* Cumulate(TH1* histo, Bool_t doErr=kTRUE, const char* copyName=0);
TLatex* AddLabel(const char*txt,float x=0.1,float y=0.9,int color=kBlack,float size=0.04);
void wAv(double v1,double v2, double err1=0,double err2=0, double* wv=0,double *we=0);
void wSum(double v1,double v2, double err1=0,double err2=0, double* wv=0,double *we=0);

void SaveCanvas(TCanvas* canv,const char* path="canv",const Option_t *option="ecg")
{
  TString name;
  TString opt = option; opt.ToLower();
  //
  TString name0 = path;
  if (name0.IsNull()) name0 = "defCanv";
  //
  TFrame* fr = GetFrame();
  if (fr) fr->SetBorderMode(0);
  if (opt.Contains("c")) {
    name = name0; name+=".C";
    canv->Print(name.Data());
  }
  //
  if (opt.Contains("e")) {
    name = name0; name+=".eps";
    canv->Print(name.Data());
  }
  //
  if (opt.Contains("g")) {
    name = name0; name+=".gif";
    canv->Print(name.Data());
  }
  //
  if (opt.Contains("p")) {
    name = name0; name+=".ps";
    canv->Print(name.Data());
  }
  //
}


TLatex* AddLabel(const char*txt,float x,float y,int color,float size)
{
  TLatex* lt = new TLatex(x,y,txt); 
  lt->SetNDC(); 
  lt->SetTextColor(color);
  lt->SetTextSize(size);
  lt->Draw();
  return lt;
}

TH1* GetBaseHisto(TPad* pad)
{
  if (!pad) pad = (TPad*)gPad;
  if (!pad) return 0;
  TList* lst = pad->GetListOfPrimitives();
  int size = lst->GetSize();
  TH1* hst=0;
  for (int i=0;i<size;i++) {
    TObject* obj = lst->At(i);
    if (!obj) continue;
    if (obj->InheritsFrom("TH1")) {hst = (TH1*)obj; break;}
  }
  return hst;
}

TFrame* GetFrame(TPad* pad)
{
  if (!pad) pad = (TPad*)gPad;
  if (!pad) return 0;
  TList* lst = pad->GetListOfPrimitives();
  int size = lst->GetSize();
  TFrame* frm=0;
  for (int i=0;i<size;i++) {
    TObject* obj = lst->At(i);
    if (!obj) continue;
    if (obj->InheritsFrom("TFrame")) {frm = (TFrame*)obj; break;}
  }
  return frm;
}

TPaveStats* GetStatPad(TH1* hst)
{
  TList *lst = hst->GetListOfFunctions();
  if (!lst) return 0;
  int nf = lst->GetSize();
  for (int i=0;i<nf;i++) {
    TPaveStats *fnc = (TPaveStats*) lst->At(i);
    if (fnc->InheritsFrom("TPaveStats")) return fnc;
  }
  return 0;
  //
}


void SetStatPad(TH1* hst,float x1,float x2,float y1,float y2)
{
  TPaveStats* pad = GetStatPad(hst);
  if (!pad) return;
  pad->SetX1NDC( x1 );
  pad->SetX2NDC( x2 );
  pad->SetY1NDC( y1 );
  pad->SetY2NDC( y2 );
  //
  gPad->Modified();
}

void SetHStyle(TH1* hst,int col,int mark,float mrsize)
{
  hst->SetLineColor(col);
  hst->SetMarkerColor(col);
  hst->SetFillColor(col);
  hst->SetMarkerStyle(mark);
  hst->SetMarkerSize(mrsize);
  TList *lst = hst->GetListOfFunctions();
  if (lst) {
    int nf = lst->GetSize();
    for (int i=0;i<nf;i++) {
      TObject *fnc = lst->At(i);
      if (fnc->InheritsFrom("TF1")) {
	((TF1*)fnc)->SetLineColor(col);
	((TF1*)fnc)->SetLineWidth(1);
	((TF1*)fnc)->ResetBit(TF1::kNotDraw);
      }
      else if (fnc->InheritsFrom("TPaveStats")) {
	((TPaveStats*)fnc)->SetTextColor(col);
      }
    }
  }
}

void SetGStyle(TGraph* hst,int col,int mark,float mrsize)
{
  hst->SetLineColor(col);
  hst->SetMarkerColor(col);
  hst->SetFillColor(col);
  hst->SetMarkerStyle(mark);
  hst->SetMarkerSize(mrsize);
  TList *lst = hst->GetListOfFunctions();
  if (lst) {
    int nf = lst->GetSize();
    for (int i=0;i<nf;i++) {
      TObject *fnc = lst->At(i);
      if (fnc->InheritsFrom("TF1")) {
	((TF1*)fnc)->SetLineColor(col);
	((TF1*)fnc)->SetLineWidth(1);
	((TF1*)fnc)->ResetBit(TF1::kNotDraw);
      }
      else if (fnc->InheritsFrom("TPaveStats")) {
	((TPaveStats*)fnc)->SetTextColor(col);
      }
    }
  }
}

TH1* Cumulate(TH1* histo, Bool_t doErr, const char* copyName)
{
  // create cumulative histo
  TString nname = copyName;
  if (nname.IsNull()) {
    nname = histo->GetName();
    nname += "_cml";
  }
  TH1* cml = (TH1*) histo->Clone(nname.Data());
  int nb = histo->GetNbinsX();
  double sm = 0;
  double sme = 0;
  //
  for (int i=1;i<=nb;i++) {
    sm += histo->GetBinContent(i);
    cml->SetBinContent(i,sm);
    if (!doErr) continue;
    double ee = histo->GetBinError(i);
    sme += ee*ee;
    cml->SetBinError(i, sme>0 ? TMath::Sqrt(sme):0.);
  }
  return cml;
}


void wAv(double v1,double v2, double err1,double err2, double* wv,double *we)
{
  // weighted average
  double sum=0,err=0;
  if (err1<=0 || err2<=0) {
    sum = v1+v2;
  }
  else {
    sum = v1/(err1*err1) + v2/(err2*err2);
    err = 1./(err1*err1) + 1./(err2*err2);
    sum /= err;
    err = 1./TMath::Sqrt(err);
  }
  printf("wAv %+e(%+e) | %+e(%+e) -> %+e +- %e\n",v1,err1,v2,err2,sum,err);
  if (wv) *wv = sum;
  if (we) *we = err;
}


void wSum(double v1,double v2, double err1,double err2, double* wv,double *we)
{
  // sum with errors
  double sum=0,err=0;
  sum = v1+v2;
  if (err1>0 && err2>0) err = TMath::Sqrt(err1*err1 + err2*err2);
  printf("wSum %+e(%+e) + %+e(%+e) -> %+e +- %e\n",v1,err1,v2,err2,sum,err);
  if (wv) *wv = sum;
  if (we) *we = err;
}
 SaveCanvas.C:1
 SaveCanvas.C:2
 SaveCanvas.C:3
 SaveCanvas.C:4
 SaveCanvas.C:5
 SaveCanvas.C:6
 SaveCanvas.C:7
 SaveCanvas.C:8
 SaveCanvas.C:9
 SaveCanvas.C:10
 SaveCanvas.C:11
 SaveCanvas.C:12
 SaveCanvas.C:13
 SaveCanvas.C:14
 SaveCanvas.C:15
 SaveCanvas.C:16
 SaveCanvas.C:17
 SaveCanvas.C:18
 SaveCanvas.C:19
 SaveCanvas.C:20
 SaveCanvas.C:21
 SaveCanvas.C:22
 SaveCanvas.C:23
 SaveCanvas.C:24
 SaveCanvas.C:25
 SaveCanvas.C:26
 SaveCanvas.C:27
 SaveCanvas.C:28
 SaveCanvas.C:29
 SaveCanvas.C:30
 SaveCanvas.C:31
 SaveCanvas.C:32
 SaveCanvas.C:33
 SaveCanvas.C:34
 SaveCanvas.C:35
 SaveCanvas.C:36
 SaveCanvas.C:37
 SaveCanvas.C:38
 SaveCanvas.C:39
 SaveCanvas.C:40
 SaveCanvas.C:41
 SaveCanvas.C:42
 SaveCanvas.C:43
 SaveCanvas.C:44
 SaveCanvas.C:45
 SaveCanvas.C:46
 SaveCanvas.C:47
 SaveCanvas.C:48
 SaveCanvas.C:49
 SaveCanvas.C:50
 SaveCanvas.C:51
 SaveCanvas.C:52
 SaveCanvas.C:53
 SaveCanvas.C:54
 SaveCanvas.C:55
 SaveCanvas.C:56
 SaveCanvas.C:57
 SaveCanvas.C:58
 SaveCanvas.C:59
 SaveCanvas.C:60
 SaveCanvas.C:61
 SaveCanvas.C:62
 SaveCanvas.C:63
 SaveCanvas.C:64
 SaveCanvas.C:65
 SaveCanvas.C:66
 SaveCanvas.C:67
 SaveCanvas.C:68
 SaveCanvas.C:69
 SaveCanvas.C:70
 SaveCanvas.C:71
 SaveCanvas.C:72
 SaveCanvas.C:73
 SaveCanvas.C:74
 SaveCanvas.C:75
 SaveCanvas.C:76
 SaveCanvas.C:77
 SaveCanvas.C:78
 SaveCanvas.C:79
 SaveCanvas.C:80
 SaveCanvas.C:81
 SaveCanvas.C:82
 SaveCanvas.C:83
 SaveCanvas.C:84
 SaveCanvas.C:85
 SaveCanvas.C:86
 SaveCanvas.C:87
 SaveCanvas.C:88
 SaveCanvas.C:89
 SaveCanvas.C:90
 SaveCanvas.C:91
 SaveCanvas.C:92
 SaveCanvas.C:93
 SaveCanvas.C:94
 SaveCanvas.C:95
 SaveCanvas.C:96
 SaveCanvas.C:97
 SaveCanvas.C:98
 SaveCanvas.C:99
 SaveCanvas.C:100
 SaveCanvas.C:101
 SaveCanvas.C:102
 SaveCanvas.C:103
 SaveCanvas.C:104
 SaveCanvas.C:105
 SaveCanvas.C:106
 SaveCanvas.C:107
 SaveCanvas.C:108
 SaveCanvas.C:109
 SaveCanvas.C:110
 SaveCanvas.C:111
 SaveCanvas.C:112
 SaveCanvas.C:113
 SaveCanvas.C:114
 SaveCanvas.C:115
 SaveCanvas.C:116
 SaveCanvas.C:117
 SaveCanvas.C:118
 SaveCanvas.C:119
 SaveCanvas.C:120
 SaveCanvas.C:121
 SaveCanvas.C:122
 SaveCanvas.C:123
 SaveCanvas.C:124
 SaveCanvas.C:125
 SaveCanvas.C:126
 SaveCanvas.C:127
 SaveCanvas.C:128
 SaveCanvas.C:129
 SaveCanvas.C:130
 SaveCanvas.C:131
 SaveCanvas.C:132
 SaveCanvas.C:133
 SaveCanvas.C:134
 SaveCanvas.C:135
 SaveCanvas.C:136
 SaveCanvas.C:137
 SaveCanvas.C:138
 SaveCanvas.C:139
 SaveCanvas.C:140
 SaveCanvas.C:141
 SaveCanvas.C:142
 SaveCanvas.C:143
 SaveCanvas.C:144
 SaveCanvas.C:145
 SaveCanvas.C:146
 SaveCanvas.C:147
 SaveCanvas.C:148
 SaveCanvas.C:149
 SaveCanvas.C:150
 SaveCanvas.C:151
 SaveCanvas.C:152
 SaveCanvas.C:153
 SaveCanvas.C:154
 SaveCanvas.C:155
 SaveCanvas.C:156
 SaveCanvas.C:157
 SaveCanvas.C:158
 SaveCanvas.C:159
 SaveCanvas.C:160
 SaveCanvas.C:161
 SaveCanvas.C:162
 SaveCanvas.C:163
 SaveCanvas.C:164
 SaveCanvas.C:165
 SaveCanvas.C:166
 SaveCanvas.C:167
 SaveCanvas.C:168
 SaveCanvas.C:169
 SaveCanvas.C:170
 SaveCanvas.C:171
 SaveCanvas.C:172
 SaveCanvas.C:173
 SaveCanvas.C:174
 SaveCanvas.C:175
 SaveCanvas.C:176
 SaveCanvas.C:177
 SaveCanvas.C:178
 SaveCanvas.C:179
 SaveCanvas.C:180
 SaveCanvas.C:181
 SaveCanvas.C:182
 SaveCanvas.C:183
 SaveCanvas.C:184
 SaveCanvas.C:185
 SaveCanvas.C:186
 SaveCanvas.C:187
 SaveCanvas.C:188
 SaveCanvas.C:189
 SaveCanvas.C:190
 SaveCanvas.C:191
 SaveCanvas.C:192
 SaveCanvas.C:193
 SaveCanvas.C:194
 SaveCanvas.C:195
 SaveCanvas.C:196
 SaveCanvas.C:197
 SaveCanvas.C:198
 SaveCanvas.C:199
 SaveCanvas.C:200
 SaveCanvas.C:201
 SaveCanvas.C:202
 SaveCanvas.C:203
 SaveCanvas.C:204
 SaveCanvas.C:205
 SaveCanvas.C:206
 SaveCanvas.C:207
 SaveCanvas.C:208
 SaveCanvas.C:209
 SaveCanvas.C:210
 SaveCanvas.C:211
 SaveCanvas.C:212
 SaveCanvas.C:213
 SaveCanvas.C:214
 SaveCanvas.C:215
 SaveCanvas.C:216
 SaveCanvas.C:217
 SaveCanvas.C:218
 SaveCanvas.C:219
 SaveCanvas.C:220
 SaveCanvas.C:221
 SaveCanvas.C:222
 SaveCanvas.C:223
 SaveCanvas.C:224
 SaveCanvas.C:225
 SaveCanvas.C:226
 SaveCanvas.C:227
 SaveCanvas.C:228