ROOT logo
/**
 * @file   DrawELossPoisson.C
 * @author Christian Holm Christensen <cholm@dalsgaard.hehi.nbi.dk>
 * @date   Thu Jul  7 10:24:58 2011
 * 
 * @brief  A script to draw the Poisson vs Energy Loss correlation 
 * 
 *
 * @deprecated Use QATrender instead 
 * @ingroup pwglf_forward_scripts_qa
 * 
 */
#ifndef __CINT__
# include <TH1.h>
# include <TH2.h>
# include <TList.h>
# include <TFile.h>
# include <TString.h>
# include <TError.h>
# include <TPad.h>
# include <TCanvas.h>
# include <TMath.h>
# include <TF1.h>
# include <TLine.h>
# include <TLatex.h>
# include <TLinearFitter.h>
# include <TStyle.h>
#else
class TList;
#endif

/** 
 * Draw the poisson @f$N_{ch}@f$ estimate against the @f$\Delta@f$
 * @f$N_{ch}@f$ estimate and do a regression line between the two 
 * 
 * @param p            List 
 * @param d            Detector
 * @param r            Ring
 * @param xmin         Minimum
 * @param xmax         Maximum
 * 
 * @return The regression coefficient 
 *
 * @deprecated Use QATrender instead 
 * @ingroup pwglf_forward_scripts_qa
 */
Double_t
DrawRingELossPoisson(TList* p, UShort_t d, Char_t r, 
		     Double_t xmin, Double_t xmax)
{
  if (!p) return 0;

  TList* ring = static_cast<TList*>(p->FindObject(Form("FMD%d%c",d,r)));
  if (!ring) { 
    Error("DrawELossPoisson", "List FMD%d%c not found in %s",d,r,p->GetName());
    return 0;
  }
  
  TH2* corr = static_cast<TH2D*>(ring->FindObject("elossVsPoisson"));
  if (!corr) { 
    Error("DrawRingELossPoisson", "Histogram esdEloss not found in FMD%d%c",
	  d, r);
    return 0;
  }
  TPad* pad = static_cast<TPad*>(gPad);
  pad->SetGridy();
  pad->SetGridx();
  pad->SetLogz();
  if (d == 3) { 
    pad->SetPad(pad->GetXlowNDC(), pad->GetYlowNDC(), .99, 
		 pad->GetYlowNDC()+pad->GetHNDC());
    pad->SetRightMargin(0.15);
  }
  pad->SetFillColor(0);
  if (xmax < 0) xmax = corr->GetXaxis()->GetXmax();
  corr->GetXaxis()->SetRangeUser(xmin,xmax);
  corr->GetYaxis()->SetRangeUser(xmin,xmax);
  corr->SetTitle(Form("FMD%d%c",d,r));
  // Info("", "Entries: %d, integral: %f", 
  //      int(corr->GetEntries()), corr->Integral()); 
  corr->Draw("colz");
  if (corr->GetEntries() <= 0) return 0;

  // Calculate the linear regression 
  // Double_t dx    = (xmax-xmin);
  Double_t rxy   = corr->GetCorrelationFactor();
  Double_t sx    = corr->GetRMS(1);
  Double_t sy    = corr->GetRMS(2);
  Double_t sx2   = sx*sx;
  Double_t sy2   = sy*sy;
  Double_t cxy   = corr->GetCovariance();
  Double_t mx    = corr->GetMean(1);
  Double_t my    = corr->GetMean(2);
  Double_t delta = 1;
#if 0
  Double_t beta  = rxy * sy / sx;
#else
  if (TMath::Abs(cxy) < 1e-6) return 0;
  Double_t beta  = ((sy2 - delta*sx2 + 
		     TMath::Sqrt(TMath::Power(sy2-delta*sx2,2) + 
				 4*delta*cxy*cxy))
		    / 2 / cxy);
#endif
  Double_t alpha = my - beta * mx;
  TF1* f = new TF1("f", "[0]+[1]*x", xmin, xmax);
  f->SetParameters(alpha, beta);
  f->SetLineWidth(1);
  f->SetLineStyle(1);
  f->Draw("same");

  TLine* l = new TLine(xmin,xmin,xmax,xmax);
  l->SetLineWidth(1);
  l->SetLineStyle(2);
  l->SetLineColor(kBlack);
  l->Draw();
  // corr->GetXaxis()->SetRangeUser(0, 2);

#if 0
  Info("", "FMD%d%c correlation coefficient: %9.5f%% "
       "line y = %f + %f * x", d, r, 100*rxy, alpha, beta);
#endif

  Double_t x = pad->GetLeftMargin()+.01;
  Double_t y = 1-pad->GetTopMargin()-.01;
  TLatex* ltx = new TLatex(x, y, Form("FMD%d%c", d, r));
  ltx->SetNDC();
  ltx->SetTextAlign(13);
  ltx->SetTextSize(0.08);
  ltx->Draw();
  y -= 0.12;
  ltx->SetTextSize(0.06);
  ltx->DrawLatex(x,y,"Deming regression: y=#alpha+#beta x");
  x += .02;
  y -= .06;
  ltx->SetTextSize(0.05);
  ltx->DrawLatex(x, y, Form("#alpha=%5.3f", alpha));
  y -= .06;
  ltx->DrawLatex(x, y, Form("#beta= %5.3f", beta));

  TLinearFitter* fitter = new TLinearFitter(1);
  fitter->SetFormula("1 ++ x");
  for (Int_t i = 1; i <= corr->GetNbinsX(); i++) { 
    x = corr->GetXaxis()->GetBinCenter(i);
    if (x < xmin || x > xmax) continue;
    for (Int_t j = 1; j <= corr->GetNbinsY(); j++) {
      y = corr->GetYaxis()->GetBinCenter(j);
      if (y < xmin || y > xmax) continue;
      Double_t c = corr->GetBinContent(i,j);
      if (c < .1) continue;
      fitter->AddPoint(&x, y, c);
    }
  }
  Bool_t robust = false;
  if (robust)
    fitter->EvalRobust();
  else 
    fitter->Eval();
#if 0
  for (Int_t i = 0; i < 2; i++) { 
    std::cout << i << "\t" 
	      << fitter->GetParName(i) << "\t"
	      << fitter->GetParameter(i) << "\t";
    if (!robust) 
      std::cout << fitter->GetParError(i); 
    std::cout << std::endl;
  }
  Double_t chi2 = fitter->GetChisquare();
  Int_t    ndf  = (fitter->GetNpoints() - 
		   fitter->GetNumberFreeParameters() );
  std::cout << "chi2/ndf: " << chi2 << '/' << ndf 
	    << '=' << chi2 / ndf << std::endl;
#endif

  // corr->Scale(1. / corr->GetMaximum());
  pad->cd();
  return corr->GetCorrelationFactor();
}

/** 
 * Draw the correlation between the Poisson @f$N_{ch}@f$ estimate
 * and the @f$\Delta@f$ @f$N_{ch}@f$ estimate and do a regression
 * line between the two for each ring
 * 
 * @param filename File to read
 * @param folder   Folder in file
 * @param xmax     Minimum X
 * @param xmin     Maximum X 
 *
 * @deprecated Use QATrender instead 
 * @ingroup pwglf_forward_scripts_qa
 */
void
DrawELossPoisson(const char* filename="forward.root", 
		 const char* folder="ForwardResults",
		 Double_t xmax=-1,
		 Double_t xmin=-1)
{
  gStyle->SetPalette(1);
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptTitle(0);
  gStyle->SetTitleW(.4);
  gStyle->SetTitleH(.1);
  gStyle->SetTitleX(.4);
  // gStyle->SetTitleY(.1);
  gStyle->SetTitleColor(0);
  gStyle->SetTitleStyle(0);
  gStyle->SetTitleBorderSize(0);
  
  TFile* file = TFile::Open(filename, "READ");
  if (!file) { 
    Error("DrawELossPoisson", "failed to open %s", filename);
    return;
  }

  TList* forward = static_cast<TList*>(file->Get(folder));
  if (!forward) { 
    Error("DrawELossPoisson", "List %s not found in %s", folder, filename);
    return;
  }

  TList* dc = static_cast<TList*>(forward->FindObject("fmdDensityCalculator"));
  if (!dc) { 
    Error("DrawELossPoisson", "List fmdDensityCalculator not found in Forward");
    return;
  }
  
  TCanvas* c = new TCanvas("elossVsPoisson", 
			   "N_ch from ELoss versus from Poisson", 900, 700);
  c->SetFillColor(0);
  c->SetBorderSize(0);
  c->SetBorderMode(0);
  c->SetHighLightColor(0);
  c->Divide(3, 2, 0, 0);

  Double_t corrs[5];
  c->cd(1); corrs[0] = DrawRingELossPoisson(dc, 1, 'I', xmin, xmax);
  c->cd(2); corrs[1] = DrawRingELossPoisson(dc, 2, 'I', xmin, xmax);
  c->cd(5); corrs[2] = DrawRingELossPoisson(dc, 2, 'O', xmin, xmax);
  c->cd(3); corrs[3] = DrawRingELossPoisson(dc, 3, 'I', xmin, xmax);
  c->cd(6); corrs[4] = DrawRingELossPoisson(dc, 3, 'O', xmin, xmax);

  TVirtualPad* p = c->cd(4);
  p->SetTopMargin(0.05);
  p->SetRightMargin(0.10);
  p->SetLeftMargin(0.15);
  p->SetBottomMargin(0.15);
  p->SetFillColor(0);

  TH1D* hc = new TH1D("corrs", "Correlation factors", 5, .5, 5.5);
  hc->SetFillColor(kRed+1);
  hc->SetFillStyle(3001);
  hc->SetMinimum(0.0);
  hc->SetMaximum(1.3);
  hc->GetXaxis()->SetBinLabel(1,"FMD1i"); hc->SetBinContent(1,corrs[0]);
  hc->GetXaxis()->SetBinLabel(2,"FMD2i"); hc->SetBinContent(2,corrs[1]);
  hc->GetXaxis()->SetBinLabel(3,"FMD2o"); hc->SetBinContent(3,corrs[2]);
  hc->GetXaxis()->SetBinLabel(4,"FMD3i"); hc->SetBinContent(4,corrs[3]);
  hc->GetXaxis()->SetBinLabel(5,"FMD3o"); hc->SetBinContent(5,corrs[4]);
  hc->GetXaxis()->SetLabelSize(0.08);
  hc->GetYaxis()->SetTitle("r");
  hc->SetMarkerSize(1.5);
  hc->Draw("text hist");

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