ROOT logo
void
TestSPD(const TString& which, Double_t nVar=2)
{
  TFile* file = TFile::Open("forward.root", "READ");
  if (!file) return;

  Bool_t spd = which.EqualTo("spd", TString::kIgnoreCase);
  
  TList* l = 0;
  if (spd) l = static_cast<TList*>(file->Get("CentralSums"));
  else     l = static_cast<TList*>(file->Get("ForwardSums"));
  if (!l) { 
    Warning("", "%sSums not found", spd ? "Central" : "Forward");
    return;
  }

  TList* ei = static_cast<TList*>(l->FindObject("fmdEventInspector"));
  if (!l) { 
    Warning("", "fmdEventInspector not found");
    return;
  }
  
  TObject* run = ei->FindObject("runNo");
  if (!run) 
    Warning("", "No run number found");
  ULong_t runNo = run ? run->GetUniqueID() : 0;

  TH2* h = 0;
  if (spd) h = static_cast<TH2*>(l->FindObject("nClusterVsnTracklet"));
  else { 
    TList* den = static_cast<TList*>(l->FindObject("fmdDensityCalculator"));
    if (!den) { 
      Error("", "fmdDensityCalculator not found");
      return;
    }
    TList* rng = static_cast<TList*>(den->FindObject(which));
    if (!rng) { 
      Error("", "%s not found", which.Data());
      return;
    }
    h = static_cast<TH2*>(rng->FindObject("elossVsPoisson"));
  }
  if (!h) { 
    Warning("", "%s not found", spd ? nClusterVsnTracklet : "elossVsPoisson");
    return;
  }

  gStyle->SetOptFit(1111);
  gStyle->SetOptStat(0);
  TCanvas* c = new TCanvas("c", Form("Run %u", runNo));
  c->Divide(2,2);
  
  TVirtualPad* p = c->cd(1);
  if (spd) {
    p->SetLogx();
    p->SetLogy();
  }
  p->SetLogz();
  h->Draw("colz");

  TObjArray* fits = new TObjArray;
  h->FitSlicesY(0, 1, -1, 0, "QN", fits);

  TF1* mean = new TF1("mean", "pol1");
  TF1* var  = new TF1("var", "pol1");
  // mean->FixParameter(0, 0);
  // var->FixParameter(0, 0);
  for (Int_t i = 0; i < 3; i++) { 
    p = c->cd(2+i);
    if (spd) { 
      p->SetLogx();
      p->SetLogy();
    }
    TH1* hh = static_cast<TH1*>(fits->At(i));
    hh->Draw();

    if (i == 0) continue;
    
    hh->Fit((i == 1? mean : var), "+Q");
    
  }

  TGraphErrors* g1 = new TGraphErrors(h->GetNbinsX());
  g1->SetFillColor(kBlue-10);
  g1->SetFillStyle(3001);
  g1->SetLineStyle(1);
  TGraph* u1 = new TGraph(h->GetNbinsX());
  TGraph* l1 = new TGraph(h->GetNbinsX());
  u1->SetLineColor(kBlue+1);
  l1->SetLineColor(kBlue+1);
  u1->SetName("u1");
  l1->SetName("l1");
  TGraphErrors* g2 = new TGraphErrors(h->GetNbinsX());
  g2->SetFillColor(kRed-10);
  g2->SetFillStyle(3001);
  g2->SetLineStyle(2);
  TGraph* u2 = new TGraph(h->GetNbinsX());
  TGraph* l2 = new TGraph(h->GetNbinsX());
  u2->SetLineColor(kRed+1);
  l2->SetLineColor(kRed+1);
  u2->SetName("u2");
  l2->SetName("l2");
  for (Int_t i = 1; i <= h->GetNbinsX(); i++) {
    Double_t x  = hh->GetXaxis()->GetBinCenter(i);
    Double_t y  = mean->Eval(x);
    Double_t e  = var->Eval(y);
    Double_t e1 = nVar * e;
    if (spd) e1 *= TMath::Log10(e);
    // Printf("%10e -> %10e +/- %10e", x, y, ee);
    g1->SetPoint(i-1, x, y);
    g1->SetPointError(i-1, 0, e1);
    u1->SetPoint(i-1, x, y+e1);
    l1->SetPoint(i-1, x, y-e1);
    // Printf("%3d: %f -> %f +/- %f", i, x, y, ee);

    Double_t e2 = nVar*0.05*x;
    g2->SetPoint(i-1, x, x);
    g2->SetPointError(i-1, 0, e2);
    u2->SetPoint(i-1, x, x+e2);
    l2->SetPoint(i-1, x, x-e2);
  }

  p = c->cd(1);
  c->Clear();
  c->cd();
  c->SetLogz();
  h->Draw("colz");
  g1->Draw("3 same");
  u1->Draw("l same");
  l1->Draw("l same");
  g2->Draw("3 same");
  u2->Draw("l same");
  l2->Draw("l same");

  Double_t ly = 0.9;
  Double_t dy = 0.06;
  TLatex* ltx = new TLatex(0.15, ly, Form("#LTy#GT = %f + %f x",
					   mean->GetParameter(0),
					   mean->GetParameter(1)));
  ltx->SetNDC();
  ltx->SetTextSize(dy);
  ltx->SetTextAlign(13);
  ltx->Draw();

  ly -= dy + 0.01;
  ltx->DrawLatex(0.15, ly, Form("#sigma_{y} = %f + %f x", 
				var->GetParameter(0),
				var->GetParameter(1)));
  
  ly -= dy + 0.01;
  ltx->DrawLatex(0.15, ly, Form("#delta = %f #sigma %s", 
				nVar, (spd ? "log_{10}(#sigma" : "")));
	    
					   
}

   
  
 Outliers.C:1
 Outliers.C:2
 Outliers.C:3
 Outliers.C:4
 Outliers.C:5
 Outliers.C:6
 Outliers.C:7
 Outliers.C:8
 Outliers.C:9
 Outliers.C:10
 Outliers.C:11
 Outliers.C:12
 Outliers.C:13
 Outliers.C:14
 Outliers.C:15
 Outliers.C:16
 Outliers.C:17
 Outliers.C:18
 Outliers.C:19
 Outliers.C:20
 Outliers.C:21
 Outliers.C:22
 Outliers.C:23
 Outliers.C:24
 Outliers.C:25
 Outliers.C:26
 Outliers.C:27
 Outliers.C:28
 Outliers.C:29
 Outliers.C:30
 Outliers.C:31
 Outliers.C:32
 Outliers.C:33
 Outliers.C:34
 Outliers.C:35
 Outliers.C:36
 Outliers.C:37
 Outliers.C:38
 Outliers.C:39
 Outliers.C:40
 Outliers.C:41
 Outliers.C:42
 Outliers.C:43
 Outliers.C:44
 Outliers.C:45
 Outliers.C:46
 Outliers.C:47
 Outliers.C:48
 Outliers.C:49
 Outliers.C:50
 Outliers.C:51
 Outliers.C:52
 Outliers.C:53
 Outliers.C:54
 Outliers.C:55
 Outliers.C:56
 Outliers.C:57
 Outliers.C:58
 Outliers.C:59
 Outliers.C:60
 Outliers.C:61
 Outliers.C:62
 Outliers.C:63
 Outliers.C:64
 Outliers.C:65
 Outliers.C:66
 Outliers.C:67
 Outliers.C:68
 Outliers.C:69
 Outliers.C:70
 Outliers.C:71
 Outliers.C:72
 Outliers.C:73
 Outliers.C:74
 Outliers.C:75
 Outliers.C:76
 Outliers.C:77
 Outliers.C:78
 Outliers.C:79
 Outliers.C:80
 Outliers.C:81
 Outliers.C:82
 Outliers.C:83
 Outliers.C:84
 Outliers.C:85
 Outliers.C:86
 Outliers.C:87
 Outliers.C:88
 Outliers.C:89
 Outliers.C:90
 Outliers.C:91
 Outliers.C:92
 Outliers.C:93
 Outliers.C:94
 Outliers.C:95
 Outliers.C:96
 Outliers.C:97
 Outliers.C:98
 Outliers.C:99
 Outliers.C:100
 Outliers.C:101
 Outliers.C:102
 Outliers.C:103
 Outliers.C:104
 Outliers.C:105
 Outliers.C:106
 Outliers.C:107
 Outliers.C:108
 Outliers.C:109
 Outliers.C:110
 Outliers.C:111
 Outliers.C:112
 Outliers.C:113
 Outliers.C:114
 Outliers.C:115
 Outliers.C:116
 Outliers.C:117
 Outliers.C:118
 Outliers.C:119
 Outliers.C:120
 Outliers.C:121
 Outliers.C:122
 Outliers.C:123
 Outliers.C:124
 Outliers.C:125
 Outliers.C:126
 Outliers.C:127
 Outliers.C:128
 Outliers.C:129
 Outliers.C:130
 Outliers.C:131
 Outliers.C:132
 Outliers.C:133
 Outliers.C:134
 Outliers.C:135
 Outliers.C:136
 Outliers.C:137
 Outliers.C:138
 Outliers.C:139
 Outliers.C:140
 Outliers.C:141
 Outliers.C:142
 Outliers.C:143
 Outliers.C:144
 Outliers.C:145
 Outliers.C:146
 Outliers.C:147
 Outliers.C:148
 Outliers.C:149
 Outliers.C:150
 Outliers.C:151
 Outliers.C:152
 Outliers.C:153
 Outliers.C:154
 Outliers.C:155
 Outliers.C:156
 Outliers.C:157
 Outliers.C:158
 Outliers.C:159