ROOT logo
/** 
 * 
 * 
 * @param nBins 
 * @param min 
 * @param max 
 *
 * @ingroup pwglf_forward_scripts_tests
 */
void
MakeIntegerAxis(Int_t& nBins, Double_t& min, Double_t& max)
{
  if (nBins <= 0) return;
  if (max <= 0)   max = nBins;
  
  Double_t dBin = max / nBins;
  min   = - dBin / 2;
  max   = max + dBin / 2;
  nBins = nBins + 1;
}

/** 
 * 
 * 
 * @param o 
 * @param useWeights 
 *
 * @ingroup pwglf_forward_scripts_tests
 */
void
TestPoisson(Double_t o=.3, bool useWeights=false, bool correct=true)
{
  const char* load = "$ALICE_ROOT/PWGLF/FORWARD/analysis2/scripts/LoadLibs.C";
  if (!gROOT->GetClass("AliAODForwardMult")) {
    gROOT->Macro(load);
    gROOT->GetInterpreter()->UnloadFile(gSystem->ExpandPathName(load));
  }
  
  // --- Parameters of this script -----------------------------------
  Int_t      nBin =  5;  // Our detector matrix size 
  Int_t      nMax = TMath::Max(Int_t(nBin * nBin * o + .5)+nBin/2,nBin);  
  Int_t      nEv  = 10000; // Number of events
  Double_t   mp   = o;   // The 'hit' probability 


  TH2D* base = new TH2D("base", "Basic histogram", 
			nBin,-.5, nBin-.5, nBin, -.5, nBin-.5);
  base->SetXTitle("#eta");
  base->SetYTitle("#varphi");
  base->SetDirectory(0);
  base->SetOption("colz");

  Int_t tN1=nMax;    Double_t tMin1; Double_t tMax1;
  Int_t tN2=nMax*10; Double_t tMin2; Double_t tMax2=nMax;
  MakeIntegerAxis(tN1, tMin1, tMax1);
  MakeIntegerAxis(tN2, tMin2, tMax2);
  TH2D* corr = new TH2D("comp", "Comparison", 
			tN1, tMin1, tMax1, tN2, tMin2, tMax2);
  corr->SetXTitle("Input");
  corr->SetYTitle("Poisson");
  corr->SetDirectory(0);
  corr->SetOption("colz");
  corr->SetStats(0);
  TLine* lcorr = new TLine(0, 0, tMax2, tMax2);

  Int_t mm = TMath::Max(Int_t(nBin * o + .5),nBin/2);
  tN2=mm*10; tMax2 = mm;
  MakeIntegerAxis(tN2, tMin2, tMax2);
  Info("", "Making mean w/nbins=%d,range=[%f,%f]", tN2, tMin2, tMax2);
  TH2D* mean = new TH2D("mean", "Mean comparison", 
			tN2, tMin2, tMax2, tN2, tMin2, tMax2);
  mean->SetXTitle("Input");
  mean->SetYTitle("Poisson");
  mean->SetDirectory(0);
  mean->SetOption("colz");
  mean->SetStats(0);
  TLine* lmean = new TLine(tMin2, tMin2, tMax2, tMax2);

  TH1D* dist = new TH1D("dist", "Distribution of hits", tN1, tMin1, tMax1);
  dist->SetXTitle("s");
  dist->SetYTitle("P(s)");
  dist->SetFillColor(kRed+1);
  dist->SetFillStyle(3001);
  dist->SetDirectory(0);

  TH1D* diff = new TH1D("diff", "P-T", 100, -25, 25);
  diff->SetXTitle("Difference");
  diff->SetFillColor(kRed+1);
  diff->SetFillStyle(3001);
  diff->SetYTitle("Prob");

  AliPoissonCalculator* c = new AliPoissonCalculator("ignored");
  c->Init(nBin ,nBin);

  for (Int_t i = 0; i < nEv; i++) { 
    c->Reset(base);
    base->Reset();

    for (Int_t iEta = 0; iEta < nBin; iEta++) { 
      for (Int_t iPhi = 0; iPhi < nBin; iPhi++) { 
	// Throw a die 
	Int_t m = gRandom->Poisson(mp);
	dist->Fill(m);

	// Fill into our base histogram 
	base->Fill(iEta, iPhi, m);

	// Fill into poisson calculator 
	c->Fill(iEta, iPhi, m > 0, (useWeights ? m : 1));
      }
    }
    // Calculate the result 
    TH2D* res = c->Result(correct);
    
    // Now loop and compare 
    Double_t mBase = 0;
    Double_t mPois = 0;
    for (Int_t iEta = 0; iEta < nBin; iEta++) { 
      for (Int_t iPhi = 0; iPhi < nBin; iPhi++) { 
	Double_t p = res->GetBinContent(iEta, iPhi);
	Double_t t = base->GetBinContent(iEta, iPhi);

	mBase += t;
	mPois += p;
	corr->Fill(t, p);
	diff->Fill(p-t);
      }
    }
    Int_t nn = nBin * nBin;
    mean->Fill(mBase / nn, mPois / nn);
  }

  TCanvas* cc = new TCanvas("c", "c", 900, 900);
  cc->SetFillColor(0);
  cc->SetFillStyle(0);
  cc->SetBorderMode(0);
  cc->SetRightMargin(0.02);
  cc->SetTopMargin(0.02);
  cc->Divide(2,2);
  
  TVirtualPad* pp = cc->cd(1);
  pp->SetFillColor(0);
  pp->SetFillStyle(0);
  pp->SetBorderMode(0);
  pp->SetRightMargin(0.15);
  pp->SetTopMargin(0.02);
  pp->SetLogz();
  pp->SetGridx();
  pp->SetGridy();
  corr->Draw();
  lcorr->Draw();

  pp = cc->cd(2);
  pp->SetFillColor(0);
  pp->SetFillStyle(0);
  pp->SetBorderMode(0);
  pp->SetRightMargin(0.02);
  pp->SetTopMargin(0.02);
#if 0
  c->GetMean()->Draw();
#elif 1 
  pp->SetLogy();
  diff->Draw();
#elif 1
  c->GetOccupancy()->Draw();
#else
  pp->SetLogy();
  dist->SetStats(0);
  dist->Scale(1. / dist->Integral());
  dist->Draw();
  TH1D* m1 = c->GetMean();
  m1->Scale(1. / m1->Integral());
  m1->Draw("same");
  Double_t eI;
  Double_t ii = 100 * dist->Integral(2, 0);
  TLatex* ll = new TLatex(.97, .85, 
			  Form("Input #bar{m}: %5.3f", mp));
  ll->SetNDC();
  ll->SetTextFont(132);
  ll->SetTextAlign(31);
  ll->Draw();
  ll->DrawLatex(.97, .75, Form("Result #bar{m}: %5.3f", dist->GetMean()));
  ll->DrawLatex(.97, .65, Form("Occupancy: #int_{1}^{#infty}P(s)ds = %6.2f%%",
			       ii));
			 
#endif

  pp = cc->cd(3);
  pp->SetFillColor(0);
  pp->SetFillStyle(0);
  pp->SetBorderMode(0);
  pp->SetRightMargin(0.15);
  pp->SetTopMargin(0.02);
  pp->SetGridx();
  pp->SetGridy();
  c->GetCorrection()->Draw();

  pp = cc->cd(4);
  pp->SetFillColor(0);
  pp->SetFillStyle(0);
  pp->SetBorderMode(0);
  pp->SetRightMargin(0.15);
  pp->SetTopMargin(0.02);
  pp->SetLogz();
  pp->SetGridx();
  pp->SetGridy();
  mean->Draw();
  lmean->Draw();

  cc->cd();
}

//
// EOF
//


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