ROOT logo
// --- Get a single histogram ----------------------------------------
TH1*
GetOne(const TList* list, const char* which, bool mirror)
{
  if (!list) { 
    Error("GetOne", "No list passed");
    return 0;
  }
  TString n(Form("dndeta%s_rebin05", which));
  if (mirror) n.Append("_mirror");
  
  TObject* o = list->FindObject(n);
  if (!o) { 
    Error("GetOne", "Object %s not found in %s", n.Data(), list->GetName());
    return 0;
  }
  TH1* ret = static_cast<TH1*>(o);
  ret->SetLineColor(ret->GetMarkerColor());
  ret->SetDirectory(0);
  return ret;
}

// --- Make point-to-point systematic errors -------------------------
TH1*
MakeSysError(TH1* h, Double_t sysErr)
{
  TString n(h->GetName());
  n.Append("_syserr");
  TH1* ret = static_cast<TH1*>(h->Clone(n));
  ret->SetMarkerStyle(1);
  ret->SetMarkerSize(0);
  ret->SetMarkerColor(kBlue-10);
  ret->SetFillColor(kBlue-10);
  ret->SetFillStyle(1001);
  ret->SetLineColor(kBlue-10);
  ret->SetLineWidth(0);
  ret->SetDirectory(0);
  
  for (Int_t i = 1; i <= ret->GetNbinsX(); i++) { 
    Double_t c = ret->GetBinContent(i);
    if (c < 0.001) { 
      ret->SetBinContent(i,0);
      ret->SetBinError(i,0);
    }
    Double_t e = c * sysErr/100;
    ret->SetBinError(i,e);
  }
  
  return ret;
}

// --- Turn a TGraphAsymmErrors into a histogram ---------------------
TH1* Graph2Hist(const TGraphAsymmErrors* g)
{
  Int_t    nBins = g->GetN();
  TArrayF  bins(nBins+1);
  TArrayF  y(nBins);
  TArrayF  ey(nBins);
  Double_t dx = 0;
  Double_t xmin = 10000;
  Double_t xmax = -10000;
  for (Int_t i = 0; i < nBins; i++) { 
    Double_t x   = g->GetX()[i];
    Double_t exl = g->GetEXlow()[i];
    Double_t exh = g->GetEXhigh()[i];
    xmin             = TMath::Min(x-exl, xmin);
    xmax             = TMath::Max(x+exh, xmax);
    bins.fArray[i]   = x-exl;
    bins.fArray[i+1] = x+exh;
    Double_t dxi = exh+exl;
    if (dxi == 0 && i != 0) dxi = bins.fArray[i]-bins.fArray[i-1];
    if (dx == 0) dx  = dxi;
    else if (dxi != dx) dx = 0;
    
    y.fArray[i]  = g->GetY()[i];
    ey.fArray[i] = TMath::Max(g->GetEYlow()[i],g->GetEYhigh()[i]);

  }
  TString name(g->GetName());
  TString title(g->GetTitle());
  TH1D* h = 0;
  if (dx != 0) {
    h = new TH1D(name.Data(), title.Data(), nBins, 
		 bins[0]-dx/2, bins[nBins]+dx/2);
  }
  else {
    h = new TH1D(name.Data(), title.Data(), nBins, bins.fArray);
  }
  for (Int_t i = 1; i <= nBins; i++) { 
    h->SetBinContent(i, y.fArray[i-1]);
    h->SetBinError(i, ey.fArray[i-1]);
  }
  h->SetMarkerStyle(g->GetMarkerStyle());
  h->SetMarkerColor(g->GetMarkerColor());
  h->SetMarkerSize(g->GetMarkerSize());
  h->SetDirectory(0);
    
  return h;
}

// --- Set Histogram properties --------------------------------------
void SetAttributes(TH1* h, UShort_t sNN, Int_t which, Bool_t mirror)
{
  Int_t marker = (sNN == 900 ? 20     : 21) + (mirror ? 4 : 0);
  Int_t color  = (which == 0 ? kRed+2  :
		  which == 1 ? kMagenta+2 : 
		  kBlue + 2);
  h->SetMarkerColor(color);
  h->SetLineColor(color);
  h->SetMarkerStyle(marker);
}

  
// --- Get publlished data via script --------------------------------
TH1* GetPublished(UShort_t sNN, Bool_t isNSD)
{
  Long_t ptr = 0;
  Int_t  typ = (isNSD ? 4 : 1);

  ptr = gROOT->ProcessLine(Form("GetSingle(2,1,%d,%d)", sNN, typ));
  if (!ptr) return 0;

  TGraphAsymmErrors* g = reinterpret_cast<TGraphAsymmErrors*>(ptr);
  TH1* h = Graph2Hist(g);
  h->SetLineColor(h->GetMarkerColor());
  
  return h;
}

// --- Add points to stack -------------------------------------------
Double_t
AddToStack(THStack* stack, UShort_t sNN, Bool_t isNSD, 
	   TList* forward, TList* central, 
	   Double_t fwdSysErr, Double_t cenSysErr,
	   Double_t strangeCorr)
{
  TH1* fd1 = GetOne(forward, "Forward", false);
  TH1* fd2 = GetOne(forward, "Forward", true);
  fd1->Scale(1-strangeCorr/100);
  fd2->Scale(1-strangeCorr/100);
  TH1* fs1 = MakeSysError(fd1, fwdSysErr);
  TH1* fs2 = MakeSysError(fd2, fwdSysErr);

  TH1* cd  = 0;
  TH1* cs  = 0;
  if (central) { 
    cd = GetOne(central, "Central", false);
    cs = MakeSysError(cd, cenSysErr);
  }
  else {
    cd = GetPublished(sNN, isNSD);
  }
  SetAttributes(fd1, sNN, 0, false);
  SetAttributes(fd2, sNN, 0, true);
  if (cd) SetAttributes(cd,  sNN, central ? 1 : 2, false);

  if (cs) stack->Add(cs,  "e2");
  stack->Add(fs1, "e2");
  stack->Add(fs2, "e2");
  if (cd) stack->Add(cd,  "ep");
  stack->Add(fd1, "ep");
  stack->Add(fd2, "ep");

  Double_t mcd = (cd ? cd->GetMaximum() : 0);
  Double_t mfs = fs1->GetMaximum();
  
  return TMath::Max(mcd, mfs);
}

// --- Find a list in directory --------------------------------------
TList*
GetList(const TDirectory* d, const char* what)
{
  if (!d) { 
    Error("GetList", "No diretory passed");
    return 0;
  }
  TList* p = static_cast<TList*>(d->Get(Form("%sResults", what)));
  if (!p) { 
    Error("GetList", "%sResults not found in %s", what, d->GetName());
    return 0;
  }
  TList* r = static_cast<TList*>(p->FindObject("all"));
  if (!r) { 
    Error("GetList", "all not found in %s", p->GetName());
    return 0;
  }
  return r;
}

void
AdjustAxis(TAxis* a)
{
  a->SetTitleFont(132);
  a->SetLabelFont(132);
  a->SetTitleSize(0.08);
  a->SetLabelSize(0.08);
  a->SetTitleOffset(0.5);
  a->SetNdivisions(10);
}
  
// --- Make a stack for a single plot --------------------------------
THStack*
MakeStack(Bool_t isNSD,  Bool_t showClusters, 
	  Double_t strangeCorr, Double_t maxFactor=1.1)
{
  const char* trg = isNSD ? "nsd" : "inel";
  TFile* f0900 =TFile::Open(Form("forward_dndeta_%s%04d.root",trg,900, "READ"));
  TFile* f7000 =TFile::Open(Form("forward_dndeta_%s%04d.root",trg,7000,"READ"));
  if (!f0900 || !f7000) { 
    Error("MakeStack", "Failed to open one or more files (%p, %p)", 
	  f0900, f7000);
    return 0;
  }
  TList* forward0900 = GetList(f0900, "Forward");
  TList* forward7000 = GetList(f7000, "Forward");
  TList* central0900 = 0;
  TList* central7000 = showClusters ? GetList(f7000, "Central") : 0;

  THStack* stack = new THStack("stack", "Stack");
  Double_t sysDen = 5;
  Double_t sysPt  = 2;
  Double_t sysMix = 2;
  Double_t sysNch = 5;
  Double_t sysNor = 2;
  Double_t fwdSys = TMath::Sqrt(sysDen * sysDen +
				sysPt  * sysPt  + 
				sysMix * sysMix + 
				sysNch * sysNch + 
				sysNor * sysNor);
  Info("", "Forward systematic error: %4.1f", fwdSys);
  Double_t m0900 = 
    AddToStack(stack, 900,  isNSD, forward0900, central0900, 
	       fwdSys, 5, strangeCorr);
  Double_t m7000 = 
    AddToStack(stack, 7000, isNSD, forward7000, central7000, 
	       fwdSys, 5, strangeCorr);

  stack->SetMaximum(maxFactor * TMath::Max(m0900, m7000));

  f0900->Close();
  f7000->Close();

  return stack;
}

// --- Draw one stack ------------------------------------------------
Double_t 
DrawStack(Bool_t isNSD, Bool_t showClusters, 
	  Double_t strangeCorr, Double_t maxFactor=1.1)
{
  THStack* stack = MakeStack(isNSD, showClusters, strangeCorr, maxFactor);
  stack->Draw("nostack ep");
  stack->GetHistogram()->SetXTitle("#eta");
  if (!isNSD) 
    stack->GetHistogram()->SetYTitle("#frac{1}{N} #frac{dN_{ch}}{d#eta}");
  if (!isNSD) 
    stack->SetMinimum(.0001);
  AdjustAxis(stack->GetHistogram()->GetXaxis());
  AdjustAxis(stack->GetHistogram()->GetYaxis());
  stack->GetHistogram()->GetXaxis()->SetTitleOffset(1);
  gPad->Clear();
  stack->Draw("nostack ep");

  TLatex* title = new TLatex(1-gPad->GetRightMargin()-.01, 
			     1-gPad->GetTopMargin()-.01, 
			     (isNSD ? "NSD" : "INEL"));
  title->SetNDC();
  title->SetTextSize(0.1);
  title->SetTextFont(132);
  title->SetTextAlign(33);
  title->SetTextColor(kBlue+2);
  title->Draw();

  return stack->GetMaximum();
}

// --- Draw one stack ------------------------------------------------
void
ExtractData(Bool_t showClusters = true)
{
  gROOT->LoadMacro("OtherData.C");
  gStyle->SetOptTitle(0);
  gStyle->SetGridColor(kGray);
  TCanvas* c = new TCanvas("c", "C", 1200, 850);
  c->SetRightMargin(0.01);
  c->SetLeftMargin(0.1);
  c->SetTopMargin(0.02);
  c->SetBottomMargin(0.15);
  c->SetFillColor(0);
  c->SetBorderSize(0);
  c->SetBorderMode(0);
  c->cd();

  c->Divide(1, 2, 0, 0);

  TVirtualPad* p = c->cd(1);
  p->SetFillColor(0);
  p->SetRightMargin(0.02);
  p->SetGridx();
  p->SetGridy();
  DrawStack(false, showClusters, 1.5);

  Double_t ms = 1.2;

  TLegend* l = new TLegend(.33, .01, .53, .35);
  l->SetBorderSize(0);
  l->SetFillColor(0);
  l->SetTextFont(132);
  l->SetFillStyle(0);
  TLegendEntry* e = l->AddEntry("", "900GeV", "p");
  e->SetMarkerStyle(20);
  e->SetMarkerSize(ms+.1);
  e = l->AddEntry("", "    7TeV", "p");
  e->SetMarkerStyle(21);
  e->SetMarkerSize(ms);
  e = l->AddEntry("", "Mirrored data", "p");
  e->SetMarkerStyle(24);
  e->SetMarkerSize(ms);
  l->Draw();

  TLegend* l2 = new TLegend(.5, .01, .8, .35);
  l2->SetBorderSize(0);
  l2->SetFillColor(0);
  l2->SetTextFont(132);
  l2->SetFillStyle(0);
  l2->SetColumnSeperation(-.05);
  e = l2->AddEntry("", "Forward", "p");
  e->SetMarkerStyle(20);
  e->SetMarkerColor(kRed+2);
  e->SetLineColor(kRed+2);
  e->SetMarkerSize(ms);
  if (showClusters) {
    e = l2->AddEntry("", "Central", "p");
    e->SetMarkerStyle(20);
    e->SetMarkerColor(kMagenta+2);
    e->SetLineColor(kMagenta+2);
    e->SetMarkerSize(ms);
  }
  e = l2->AddEntry("", "#splitline{Eur.Phys.J.#font[22]{C68}:89-108}"
		   "{Eur.Phys.J.#font[22]{C68}:345--354}", "p");
  e->SetMarkerStyle(20);
  e->SetMarkerColor(kBlue+2);
  e->SetLineColor(kBlue+2);
  e->SetMarkerSize(ms);
  l2->Draw();


  p = c->cd(2);
  p->SetGridx();
  p->SetGridy();
  p->SetFillColor(0);
  p->SetRightMargin(0.02);
  DrawStack(true, showClusters, 1.5);

  // TPad, x1, y1, x2, y2, ts, t1, t2, prel
  gROOT->LoadMacro("AddLogo.C");
  AddLogo((TPad*)p, .4, p->GetBottomMargin()+.05, 
	  .5, .44, 0.08, "", "pp data", true);
  
  c->cd();
  TString out("dndeta_pp_forward");
  if (!showClusters) out.Append("_noclusters");
  c->SaveAs(Form("%s.png", out.Data()));
  c->SaveAs(Form("%s.eps", out.Data()));
}



  
 ExtractData.C:1
 ExtractData.C:2
 ExtractData.C:3
 ExtractData.C:4
 ExtractData.C:5
 ExtractData.C:6
 ExtractData.C:7
 ExtractData.C:8
 ExtractData.C:9
 ExtractData.C:10
 ExtractData.C:11
 ExtractData.C:12
 ExtractData.C:13
 ExtractData.C:14
 ExtractData.C:15
 ExtractData.C:16
 ExtractData.C:17
 ExtractData.C:18
 ExtractData.C:19
 ExtractData.C:20
 ExtractData.C:21
 ExtractData.C:22
 ExtractData.C:23
 ExtractData.C:24
 ExtractData.C:25
 ExtractData.C:26
 ExtractData.C:27
 ExtractData.C:28
 ExtractData.C:29
 ExtractData.C:30
 ExtractData.C:31
 ExtractData.C:32
 ExtractData.C:33
 ExtractData.C:34
 ExtractData.C:35
 ExtractData.C:36
 ExtractData.C:37
 ExtractData.C:38
 ExtractData.C:39
 ExtractData.C:40
 ExtractData.C:41
 ExtractData.C:42
 ExtractData.C:43
 ExtractData.C:44
 ExtractData.C:45
 ExtractData.C:46
 ExtractData.C:47
 ExtractData.C:48
 ExtractData.C:49
 ExtractData.C:50
 ExtractData.C:51
 ExtractData.C:52
 ExtractData.C:53
 ExtractData.C:54
 ExtractData.C:55
 ExtractData.C:56
 ExtractData.C:57
 ExtractData.C:58
 ExtractData.C:59
 ExtractData.C:60
 ExtractData.C:61
 ExtractData.C:62
 ExtractData.C:63
 ExtractData.C:64
 ExtractData.C:65
 ExtractData.C:66
 ExtractData.C:67
 ExtractData.C:68
 ExtractData.C:69
 ExtractData.C:70
 ExtractData.C:71
 ExtractData.C:72
 ExtractData.C:73
 ExtractData.C:74
 ExtractData.C:75
 ExtractData.C:76
 ExtractData.C:77
 ExtractData.C:78
 ExtractData.C:79
 ExtractData.C:80
 ExtractData.C:81
 ExtractData.C:82
 ExtractData.C:83
 ExtractData.C:84
 ExtractData.C:85
 ExtractData.C:86
 ExtractData.C:87
 ExtractData.C:88
 ExtractData.C:89
 ExtractData.C:90
 ExtractData.C:91
 ExtractData.C:92
 ExtractData.C:93
 ExtractData.C:94
 ExtractData.C:95
 ExtractData.C:96
 ExtractData.C:97
 ExtractData.C:98
 ExtractData.C:99
 ExtractData.C:100
 ExtractData.C:101
 ExtractData.C:102
 ExtractData.C:103
 ExtractData.C:104
 ExtractData.C:105
 ExtractData.C:106
 ExtractData.C:107
 ExtractData.C:108
 ExtractData.C:109
 ExtractData.C:110
 ExtractData.C:111
 ExtractData.C:112
 ExtractData.C:113
 ExtractData.C:114
 ExtractData.C:115
 ExtractData.C:116
 ExtractData.C:117
 ExtractData.C:118
 ExtractData.C:119
 ExtractData.C:120
 ExtractData.C:121
 ExtractData.C:122
 ExtractData.C:123
 ExtractData.C:124
 ExtractData.C:125
 ExtractData.C:126
 ExtractData.C:127
 ExtractData.C:128
 ExtractData.C:129
 ExtractData.C:130
 ExtractData.C:131
 ExtractData.C:132
 ExtractData.C:133
 ExtractData.C:134
 ExtractData.C:135
 ExtractData.C:136
 ExtractData.C:137
 ExtractData.C:138
 ExtractData.C:139
 ExtractData.C:140
 ExtractData.C:141
 ExtractData.C:142
 ExtractData.C:143
 ExtractData.C:144
 ExtractData.C:145
 ExtractData.C:146
 ExtractData.C:147
 ExtractData.C:148
 ExtractData.C:149
 ExtractData.C:150
 ExtractData.C:151
 ExtractData.C:152
 ExtractData.C:153
 ExtractData.C:154
 ExtractData.C:155
 ExtractData.C:156
 ExtractData.C:157
 ExtractData.C:158
 ExtractData.C:159
 ExtractData.C:160
 ExtractData.C:161
 ExtractData.C:162
 ExtractData.C:163
 ExtractData.C:164
 ExtractData.C:165
 ExtractData.C:166
 ExtractData.C:167
 ExtractData.C:168
 ExtractData.C:169
 ExtractData.C:170
 ExtractData.C:171
 ExtractData.C:172
 ExtractData.C:173
 ExtractData.C:174
 ExtractData.C:175
 ExtractData.C:176
 ExtractData.C:177
 ExtractData.C:178
 ExtractData.C:179
 ExtractData.C:180
 ExtractData.C:181
 ExtractData.C:182
 ExtractData.C:183
 ExtractData.C:184
 ExtractData.C:185
 ExtractData.C:186
 ExtractData.C:187
 ExtractData.C:188
 ExtractData.C:189
 ExtractData.C:190
 ExtractData.C:191
 ExtractData.C:192
 ExtractData.C:193
 ExtractData.C:194
 ExtractData.C:195
 ExtractData.C:196
 ExtractData.C:197
 ExtractData.C:198
 ExtractData.C:199
 ExtractData.C:200
 ExtractData.C:201
 ExtractData.C:202
 ExtractData.C:203
 ExtractData.C:204
 ExtractData.C:205
 ExtractData.C:206
 ExtractData.C:207
 ExtractData.C:208
 ExtractData.C:209
 ExtractData.C:210
 ExtractData.C:211
 ExtractData.C:212
 ExtractData.C:213
 ExtractData.C:214
 ExtractData.C:215
 ExtractData.C:216
 ExtractData.C:217
 ExtractData.C:218
 ExtractData.C:219
 ExtractData.C:220
 ExtractData.C:221
 ExtractData.C:222
 ExtractData.C:223
 ExtractData.C:224
 ExtractData.C:225
 ExtractData.C:226
 ExtractData.C:227
 ExtractData.C:228
 ExtractData.C:229
 ExtractData.C:230
 ExtractData.C:231
 ExtractData.C:232
 ExtractData.C:233
 ExtractData.C:234
 ExtractData.C:235
 ExtractData.C:236
 ExtractData.C:237
 ExtractData.C:238
 ExtractData.C:239
 ExtractData.C:240
 ExtractData.C:241
 ExtractData.C:242
 ExtractData.C:243
 ExtractData.C:244
 ExtractData.C:245
 ExtractData.C:246
 ExtractData.C:247
 ExtractData.C:248
 ExtractData.C:249
 ExtractData.C:250
 ExtractData.C:251
 ExtractData.C:252
 ExtractData.C:253
 ExtractData.C:254
 ExtractData.C:255
 ExtractData.C:256
 ExtractData.C:257
 ExtractData.C:258
 ExtractData.C:259
 ExtractData.C:260
 ExtractData.C:261
 ExtractData.C:262
 ExtractData.C:263
 ExtractData.C:264
 ExtractData.C:265
 ExtractData.C:266
 ExtractData.C:267
 ExtractData.C:268
 ExtractData.C:269
 ExtractData.C:270
 ExtractData.C:271
 ExtractData.C:272
 ExtractData.C:273
 ExtractData.C:274
 ExtractData.C:275
 ExtractData.C:276
 ExtractData.C:277
 ExtractData.C:278
 ExtractData.C:279
 ExtractData.C:280
 ExtractData.C:281
 ExtractData.C:282
 ExtractData.C:283
 ExtractData.C:284
 ExtractData.C:285
 ExtractData.C:286
 ExtractData.C:287
 ExtractData.C:288
 ExtractData.C:289
 ExtractData.C:290
 ExtractData.C:291
 ExtractData.C:292
 ExtractData.C:293
 ExtractData.C:294
 ExtractData.C:295
 ExtractData.C:296
 ExtractData.C:297
 ExtractData.C:298
 ExtractData.C:299
 ExtractData.C:300
 ExtractData.C:301
 ExtractData.C:302
 ExtractData.C:303
 ExtractData.C:304
 ExtractData.C:305
 ExtractData.C:306
 ExtractData.C:307
 ExtractData.C:308
 ExtractData.C:309
 ExtractData.C:310
 ExtractData.C:311
 ExtractData.C:312
 ExtractData.C:313
 ExtractData.C:314
 ExtractData.C:315
 ExtractData.C:316
 ExtractData.C:317
 ExtractData.C:318
 ExtractData.C:319
 ExtractData.C:320
 ExtractData.C:321
 ExtractData.C:322
 ExtractData.C:323
 ExtractData.C:324
 ExtractData.C:325
 ExtractData.C:326
 ExtractData.C:327
 ExtractData.C:328
 ExtractData.C:329
 ExtractData.C:330
 ExtractData.C:331
 ExtractData.C:332
 ExtractData.C:333
 ExtractData.C:334
 ExtractData.C:335
 ExtractData.C:336
 ExtractData.C:337
 ExtractData.C:338
 ExtractData.C:339
 ExtractData.C:340
 ExtractData.C:341
 ExtractData.C:342
 ExtractData.C:343
 ExtractData.C:344
 ExtractData.C:345
 ExtractData.C:346
 ExtractData.C:347
 ExtractData.C:348
 ExtractData.C:349
 ExtractData.C:350
 ExtractData.C:351
 ExtractData.C:352
 ExtractData.C:353
 ExtractData.C:354
 ExtractData.C:355
 ExtractData.C:356
 ExtractData.C:357
 ExtractData.C:358
 ExtractData.C:359
 ExtractData.C:360
 ExtractData.C:361
 ExtractData.C:362
 ExtractData.C:363
 ExtractData.C:364
 ExtractData.C:365
 ExtractData.C:366
 ExtractData.C:367
 ExtractData.C:368
 ExtractData.C:369
 ExtractData.C:370
 ExtractData.C:371