ROOT logo
#include "SummaryDrawer.C"
#include <TPaveText.h>
#include <TMultiGraph.h>

class SummaryMultDistsDrawer : public SummaryDrawer
{
public:
  enum { 
    kNormal    = 0xF
  };
  SummaryMultDistsDrawer() 
    : SummaryDrawer()
  {}
  //____________________________________________________________________
  void Run(const char* fname="forward_multdists.root", UShort_t flags=kNormal)
  {
    // --- Open the file -----------------------------------------------
    TString filename(fname);
    TFile* file = TFile::Open(filename.Data(), "READ");
    if (!file) { 
      Error("Run", "Failed to open \"%s\"", filename.Data());
      return;
    }
    fPause         = flags & kPause;
    
    // --- Make our canvas ---------------------------------------------
    TString pdfName(filename);
    pdfName.ReplaceAll(".root", ".pdf");
    CreateCanvas(pdfName, flags & kLandscape);

    // --- Force MB for pp ---------------------------------------------
    TCollection* c   = GetCollection(file, "ForwardMultSums");

    // --- Make a Title page -------------------------------------------
    DrawTitlePage(c);

    // --- Overview plots ----------------------------------------------
    fBody->Divide(1,3);
    DrawInPad(fBody, 1, GetH1(c, "triggers"),   "hist text30");
    DrawInPad(fBody, 2, GetH1(c, "status"),     "hist text30");
    DrawInPad(fBody, 3, GetH1(c, "diagnostics"),"colz text");
    PrintCanvas("Overview");

    DrawSumCollection(c, "symmetric");
    DrawSumCollection(c, "negative");
    DrawSumCollection(c, "positive");
    DrawSumCollection(c, "other");

    c   = GetCollection(file, "ForwardMultResults");
    if (!c) {
      CloseCanvas();
      return;
    }
    
    DrawResCollection(c, "symmetric");
    DrawResCollection(c, "negative");
    DrawResCollection(c, "positive");
    DrawResCollection(c, "other");

    CloseCanvas();
  }

protected:
  TCollection* GetEtaBin(TObject* o, Double_t& etaMin, Double_t& etaMax)
  {
    const char* re = "[pm][0-9]*d[0-9]*_[pm][0-9]*d[0-9]*";
    TRegexp     check(re);

    if (!o->IsA()->InheritsFrom(TCollection::Class())) {
      // Warning("GetEtaBin", "Don't know how to deal with %s - a %s",
      //         o->GetName(), o->ClassName());
      return 0;
    }
    TString oN(o->GetName());
    if (oN.Index(check) == kNPOS) { 
      // Warning("GetEtaBin", "Collection %s does not match %s",
      //         oN.Data(), re);
      return 0;
    }
    Int_t    ul     = oN.Index("_");
    TString  sMin   = oN(0, ul);
    TString  sMax   = oN(ul+1, oN.Length()-ul-1);
    sMin.ReplaceAll("p", "+");
    sMin.ReplaceAll("m", "-");
    sMin.ReplaceAll("d", ".");
    sMax.ReplaceAll("p", "+");
    sMax.ReplaceAll("m", "-");
    sMax.ReplaceAll("d", ".");
    etaMin = sMin.Atof();
    etaMax = sMax.Atof();

    return static_cast<TCollection*>(o);
  }
  //____________________________________________________________________
  void DrawSumCollection(TCollection* top, const TString& name)
  {
    TCollection* c = GetCollection(top, name, false);
    if (!c) return;

    PrintCanvas(Form("Sums - %s", name.Data()));
    
    TIter       next(c);
    TObject*    o = 0;
    while ((o = next())) { 
      Double_t etaMin = 999;
      Double_t etaMax = 999;
      TCollection* bin = GetEtaBin(o, etaMin, etaMax);
      if (!bin) continue;

      fBody->Divide(2,2);
      DrawInPad(fBody, 1, GetH1(bin, "rawDist"), "",          kLogy);
      DrawInPad(fBody, 1, GetH1(bin, "truthAccepted",false),"same", 
		kLogy|kSilent);
      DrawInPad(fBody, 1, GetH1(bin, "truth",false),   "same", 
		kLogy|kLegend|kSilent);
      DrawInPad(fBody, 2, GetH1(bin, "coverage"));
      DrawInPad(fBody, 3, GetH2(bin, "corr"),     "colz");
      DrawInPad(fBody, 4, GetH2(bin, "response",false), "colz",kLogz|kSilent);
      
      PrintCanvas(Form("%+5.1f < #eta < %+5.1f", etaMin, etaMax));
    }
  }
  //____________________________________________________________________
  void DrawResCollection(TCollection* top, const TString& name)
  {
    TCollection* c = GetCollection(top, name, false);
    if (!c) return;

    THStack* s = GetStack(c, "all");
    s->SetTitle("");
    DrawInPad(fBody, 0, s, "nostack", kLogy);
    TLegend* l = new TLegend(.5, .75, .98, .98, "P(#it{N}_{ch})");
    l->SetBorderSize(0);
    // l->SetBorderMode(0);
    l->SetFillColor(0);
    l->SetFillStyle(0);
    TIter next(s->GetHists());
    TH1*  h = 0;
    Bool_t hasTrue = false;
    while ((h = static_cast<TH1*>(next()))) { 
      TString n(h->GetTitle());
      if (n.BeginsWith("True")) { hasTrue = true; continue; }
      n.ReplaceAll("Raw P(#it{N}_{ch}) in ", "");
      TLegendEntry* e = l->AddEntry("dummy", n, "p");
      e->SetMarkerStyle(h->GetMarkerStyle());
    }
    if (hasTrue) {
      TLegendEntry* e = l->AddEntry("dummy", "Raw", "p");
      e->SetMarkerStyle(20);
      e->SetMarkerColor(kRed+1);
      e = l->AddEntry("dummy", "MC truth", "p");
      e->SetMarkerStyle(24);
      e->SetMarkerColor(kBlue+1);
      e = l->AddEntry("dummy", "MC truth selected", "p");
      e->SetMarkerStyle(24);
      e->SetMarkerColor(kOrange+1);
    }
    fBody->cd();
    l->Draw();
    
    PrintCanvas(Form("%s results", name.Data()));

    // return;

    TIter       nextO(c);
    TObject*    o = 0;
    while ((o = nextO())) { 
      Double_t etaMin = 999;
      Double_t etaMax = 999;
      TCollection* bin = GetEtaBin(o, etaMin, etaMax);
      if (!bin) continue;

      fBody->Divide(2,3);
      DrawInPad(fBody, 1, GetH1(bin, "rawDist"),      "",     kLogy);
      DrawInPad(fBody, 1, GetH1(bin, "truthAccepted", false),
		"same", kSilent);
      DrawInPad(fBody, 1, GetH1(bin, "truth", false),"same", kSilent|kLegend);
      DrawInPad(fBody, 2, GetH1(bin, "coverage"));
      DrawInPad(fBody, 3, GetH2(bin, "corr"),            "colz");
      DrawInPad(fBody, 4, GetH2(bin, "response", false), "colz", kLogz|kSilent);
      DrawInPad(fBody, 5, GetH1(bin, "triggerVertex", false), "", kSilent);
      
      PrintCanvas(Form("%+5.1f < #eta < %+5.1f", etaMin, etaMax));
    }
  }
  //____________________________________________________________________
  void DrawTitlePage(const TCollection* c)
  {
    fBody->cd();
    
    Double_t y = .7;
    TLatex* ltx = new TLatex(.5, y, "AOD #rightarrow P(#it{N}_{ch} )");
    ltx->SetTextSize(0.07);
    ltx->SetTextFont(62);
    ltx->SetTextAlign(22);
    ltx->SetNDC();
    ltx->Draw();

    Bool_t mc = GetObject(c, "mcVertex", false) != 0;
    if (mc) { 
      y -= 0.05;
      TLatex* sub = new TLatex(.5, y, "(Simulation input)");
      sub->SetTextSize(0.04);
      sub->SetTextFont(42);
      sub->SetTextAlign(22);
      sub->SetNDC();
      sub->Draw();
    }

    Double_t save = fParName->GetTextSize();
    fParName->SetTextSize(0.03);
    fParVal->SetTextSize(0.03);
    y = .6;
    
    UShort_t sys;
    UShort_t sNN;
    ULong_t  trig;
    Double_t minIpZ;
    Double_t maxIpZ;
    GetParameter(c, "sys",     sys);
    GetParameter(c, "sNN",     sNN);
    GetParameter(c, "trigger", trig);
    GetParameter(c, "minIpZ",  minIpZ);
    GetParameter(c, "maxIpZ",  maxIpZ);
    
    TString tT; TriggerString(trig, tT); DrawParameter(y, "Trigger", tT);
    TString tS; SysString(sys, tS);      DrawParameter(y, "System", tS);
    TString tE; SNNString(sNN, tE);      DrawParameter(y, "#sqrt{s_{NN}}", tE);
    DrawParameter(y, "IP_{z} range", Form("%+5.2fcm - %+5.2fcm", 
					  minIpZ, maxIpZ));
						       
    PrintCanvas("Title page");
    fParName->SetTextSize(save);
    fParVal->SetTextSize(save);

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