1 #if !defined(__CINT__) || defined(__MAKECINT__)
16 #include "TPaletteAxis.h"
18 #include "TGraphErrors.h"
24 TH2 *hMCAccTr,*hMCAccClsS,*hMCAccCls,*hMCGen,*hzvMC2;
25 TH2 *hDtAccTr,*hDtAccClsS,*hDtAccCls,*hzvDt2;
26 TH1 *hzvMC,*hzvDt,*hMCTrue;
28 TH2 *hTrAcceptance,*hTrDtAccNrm,*hTrDtCorr2D;
29 TH2 *hClAcceptance,*hClDtAccNrm,*hClDtCorr2D;
30 TH1 *hTrDtCorr1D,*hClDtCorr1D;
32 // for test of MC on MC only
36 TH1* GetHisto(TList* lst, const char* name, const char* pref="");
37 void CorrectMult(TH2* hMCAcc, TH2* hMCGn,
38 TH2* hDtAcc, TH1* hzDt,
41 TH2 *&hDtAccNrm, // raw data normalized per Z bin
42 TH2 *&hAcceptance, // 2D acceptance
43 TH2 *&hDtCorr2D, // 2D corrected dN/dEta per Z bin (norm up to bin width)
44 TH1 *&hDtCorr1D // 1D corrected dN/dEta
48 const double minZStat = 50;
50 void ppcor(const char* flMC, const char* flDt)
52 TFile *fileMC = TFile::Open(flMC);
53 TList* clistMC = (TList*)fileMC->Get("clist");
54 TFile *fileDt = TFile::Open(flDt);
55 TList* clistDt = (TList*)fileDt->Get("clist");
57 hMCAccTr = (TH2*)GetHisto(clistMC,"b0_TrData_ZvEtaCutT","_mc");
58 hMCAccClsS = (TH2*)GetHisto(clistMC,"b0_TrData_ZvEtaSPD1","_mc");
59 hMCAccCls = (TH2*)hMCAccClsS->Clone( Form("MCClusSPD_%s","_mc") );
60 hMCAccCls->Add(hMCAccTr);
61 hMCGen = (TH2*)GetHisto(clistMC,"b0_zvEtaPrimMC","_mc");
62 hzvMC2 = (TH2*)GetHisto(clistMC,"zv","_mc");
63 hzvMC = hzvMC2->ProjectionX("zvgenMC");
65 hMCTrue = hMCGen->ProjectionX("MCTrue");
66 if (hzvMC2->Integral()>0) hMCTrue->Scale(1./hzvMC2->Integral());
67 hMCTrue->Scale(1./hMCTrue->GetBinWidth(1));
69 hDtAccTr = (TH2*)GetHisto(clistDt,"b0_TrData_ZvEtaCutT","_dt");
70 hDtAccClsS = (TH2*)GetHisto(clistDt,"b0_TrData_ZvEtaSPD1","_dt");
71 hDtAccCls = (TH2*)hDtAccClsS->Clone( Form("DtClusSPD_%s","_dt") );
72 hDtAccCls->Add(hDtAccTr);
73 hzvDt2 = (TH2*)GetHisto(clistDt,"zv","_dt");
74 hzvDt = hzvDt2->ProjectionX("zvDt");
76 hMCGenData = (TH2*)GetHisto(clistDt,"b0_zvEtaPrimMC","_data");
78 hMCTrueData = hMCGenData->ProjectionX("MCTrueData");
79 if (hzvDt2->Integral()>0) hMCTrueData->Scale(1./hzvDt2->Integral());
80 hMCTrueData->Scale(1./hMCTrueData->GetBinWidth(1));
83 CorrectMult(hMCAccTr,hMCGen,
84 hDtAccTr,hzvDt, "trc",
85 hTrDtAccNrm,hTrAcceptance,hTrDtCorr2D,hTrDtCorr1D);
87 CorrectMult(hMCAccCls,hMCGen,
88 hDtAccCls,hzvDt, "cls",
89 hClDtAccNrm,hClAcceptance,hClDtCorr2D,hClDtCorr1D);
92 hTrDtCorr1D->Draw(); // dndeta from tracklets
93 hClDtCorr1D->Draw(); // dndeta from clusters
97 TH1* GetHisto(TList* lst, const char* name, const char* pref)
99 TH1* hst = (TH1*)lst->FindObject(name);
101 TH1* hcl = (TH1*) hst->Clone( Form("%s%ss",hst->GetName(),pref) );
105 void CorrectMult(TH2* hMCAcc, TH2* hMCGn,
106 TH2* hDtAcc, TH1* hzDt,
109 TH2 *&hDtAccNrm, // raw data normalized per Z bin
110 TH2 *&hAcceptance, // 2D acceptance
111 TH2 *&hDtCorr2D, // 2D corrected dN/dEta per Z bin (norm up to bin width)
112 TH1 *&hDtCorr1D // 1D corrected dN/dEta
116 int neta = hDtAcc->GetXaxis()->GetNbins();
117 int nz = hDtAcc->GetYaxis()->GetNbins();
119 hDtAccNrm = (TH2*) hDtAcc->Clone( Form("rawDataNormZ_%s",pref) );
121 for (int iz=1;iz<=nz;iz++) { // normalize data histo per Z bin
122 double zv = hDtAcc->GetYaxis()->GetBinCenter(iz);
123 int iz0 = hzDt->FindBin(zv);
124 double zst = hzDt->GetBinContent(iz0);
125 double zstE = hzDt->GetBinError(iz0);
126 if (zst<minZStat) continue;
127 for (int ix=1;ix<=neta;ix++) {
128 double vl = hDtAcc->GetBinContent(ix,iz);
129 double er = hDtAcc->GetBinError(ix,iz);
130 if (vl<1e-9 || er<1e-6) continue;
132 double ratE = rat*TMath::Sqrt( er*er/(vl*vl) + (zstE*zstE)/(zst*zst) );
133 //printf("%2d %2d %+e(%+e) -> %+e(%+e)\n",ix,iz,vl,er,rat,ratE);
134 hDtAccNrm->SetBinContent(ix,iz,rat);
135 hDtAccNrm->SetBinError(ix,iz,ratE);
139 hAcceptance = (TH2*)hMCAcc->Clone( Form("Acceptance_%s",pref) );
140 hAcceptance->Divide(hMCGn);
142 hDtCorr2D = (TH2*)hDtAccNrm->Clone( Form("dNdEtaCor2D_%s",pref) );
143 hDtCorr2D->Divide(hAcceptance);
145 hDtCorr1D = hDtCorr2D->ProjectionX( Form("dNdEtaCor1D_%s",pref) );
148 for (int ix=1;ix<=neta;ix++) { // get weighted average
150 double bw = hDtCorr1D->GetBinWidth(ix);
151 for (int iz=1;iz<=nz;iz++) {
152 double vl = hDtCorr2D->GetBinContent(ix,iz);
153 double er = hDtCorr2D->GetBinError(ix,iz);
154 if (vl<1e-6 || er<1e-12) continue;
158 if (sme<1e-6) continue;
160 sme = 1./TMath::Sqrt(sme);
161 hDtCorr1D->SetBinContent(ix,sm/bw);
162 hDtCorr1D->SetBinError(ix,sme/bw);