7 #include "TDirectory.h"
9 #include "TEfficiency.h"
24 int n1 = h->GetXaxis()->GetNbins();
25 int n2 = h->GetYaxis()->GetNbins();
27 int nfilled=0, N = h->GetEntries();
32 for (
int i=1;
i<n1+1;++
i)
33 for (
int j=1;j<n2+1;++j)
35 double cont = h->GetBinContent(
i,j);
36 double cont2 = h2->GetBinContent(
i,j);
38 if (cont>(0.001*N) && cont2>0.)
40 x[nfilled] = cont2/cont;
50 TH1 *
h = (TH1*)gDirectory->Get(name);
79 TColor::CreateGradientColorTable(3,stp,red,grn,blu,100) ;
80 gStyle->SetNumberContours(100);
103 void config_pad(TVirtualPad*
p,
double b=0.1,
double r=0.12,
double t=0.08,
double l=0.1)
106 p->SetBottomMargin(
b);
108 p->SetRightMargin(
r);
117 double globeff = h2->GetEntries()/h1->GetEntries();
120 int nx=h1->GetNbinsX();
121 int ny=h1->GetNbinsX();
124 double coverage1=0, coverage2=0;
126 for (
int i=1;
i<=nx;++
i)
127 for (
int j=1;j<=ny;++j)
129 if (h1->GetBinContent(
i,j)>0) coverage1+=1.;
130 if (h2->GetBinContent(
i,j)>0) coverage2+=1.;
132 double c1 = h1->GetBinContent(
i,j);
133 double c2 = h2->GetBinContent(
i,j);
138 double efferr =
sqrt(2.)*eff/
sqrt(c1);
139 if (eff>0.0001) hpull->Fill((eff-globeff)/efferr);
144 f1.SetParameters(hpull->GetMaximum(), hpull->GetMean(), hpull->GetRMS());
147 double mean = f1.GetParameter(1);
148 double sigma = f1.GetParameter(2);
149 double chindf = f1.GetChisquare()/f1.GetNDF();
150 if (chindf<1.) chindf=1.;
152 cout <<
"m="<<mean<<
" sigma="<<sigma<<
" chi/ndf="<<chindf<<
" emtpyfrac="<<
fabs(1.0 - coverage2/coverage1)<<endl;
153 return (
fabs(sigma-1.) +
fabs(mean) +
fabs(1.0-chindf) +
fabs(1.0 - coverage2/coverage1));
159 int nx=h1->GetNbinsX();
160 int ny=h1->GetNbinsX();
162 double N = h1->GetEntries();
164 double coverage1=0, coverage2=0;
165 for (
int i=1;
i<=nx;++
i)
166 for (
int j=1;j<=ny;++j)
168 if (h1->GetBinContent(
i,j)>0.0001*N) coverage1+=1.;
169 if (h1->GetBinContent(
i,j)>0.0001*N && h2->GetBinContent(
i,j)>0) coverage2+=1.;
172 if (coverage2==0 || h1->GetEntries()<10 || h2->GetEntries()<10)
return 10;
174 double globeff =
Median(h1,h2);
176 cout <<
"c1="<<coverage1<<
" c2="<<coverage2<<
" geff="<<globeff<<endl;
180 TEfficiency teff(*h2, *h1);
181 teff.SetStatisticOption(TEfficiency::kFNormal);
185 for (
int i=1;
i<=nx;++
i)
186 for (
int j=1;j<=ny;++j)
188 double c1 = h1->GetBinContent(
i,j);
189 double c2 = h2->GetBinContent(
i,j);
193 int gbin = teff.GetGlobalBin(
i,j);
195 double eff = teff.GetEfficiency(gbin);
196 double efferr = teff.GetEfficiencyErrorUp(gbin);
197 if (eff>0.0001 && efferr>0)
199 hpull->Fill((eff-globeff)/efferr);
200 heff->SetBinContent(
i,j,(eff-globeff)/efferr);
202 if (eff>0.99999) perfbins+=1.;
206 h1->SetBinContent(
i,j,0);
207 h2->SetBinContent(
i,j,0);
211 if (hpull->GetEntries()<5)
return 0.001;
214 f1.SetParameters(hpull->GetMaximum(), hpull->GetMean(), hpull->GetRMS());
215 f1.SetParLimits(1,-8,8);
216 f1.SetParLimits(2,0,20);
218 hpull->Fit(
"f1",
"q");
220 frmean = f1.GetParameter(1);
221 frsig = f1.GetParameter(2);
222 frchi = f1.GetChisquare()/f1.GetNDF();
224 double facperf =
fabs(1.0 - perfbins/coverage1);
228 cout <<
"m="<<
frmean<<
" sigma="<<
frsig<<
" chi/ndf="<<
frchi<<
" emtpyfrac="<<
fremp<<
" not perf="<<facperf<<endl;
239 TCanvas *
c2=
new TCanvas(
"c2",
"c2",1000,10,800,600);
240 gStyle->SetOptStat(0);
241 gStyle->SetTitleH(0.07);
245 TRegexp reg(
"MI[0-9][0-9][0-9]");
246 TRegexp regn(
"ntp[0-9]");
253 TChain *
n=
new TChain(ntp);
254 if (filepatt.EndsWith(
".root")) filepatt.ReplaceAll(
".root",
"");
255 n->Add(filepatt+
"*.root");
258 double minE = int(n->GetMinimum(
"beamm")*10+0.1)/10.;
260 int bins = int((maxE-minE+0.05)/step)+1;
262 cout <<
"minE="<<minE<<
" maxE="<<maxE<<
" bins="<<bins<<endl;
264 TH1F *hqa =
new TH1F(
"hqa",
"Phsp QA for M"+mname, bins, minE-step/2., maxE+step/2.);
265 hqa->SetMarkerStyle(8);
266 hqa->SetMarkerSize(1.5);
267 hqa->SetMarkerColor(2);
269 hqa->SetYTitle(
"QA [AU]");
270 hqa->SetXTitle(
"E_{cm} [GeV]");
271 hqa->GetYaxis()->SetTitleOffset(1.2);
276 TH1F *htsten =
new TH1F(
"htsten",
"tst", bins, minE-step/2., maxE+step/2.);
277 n->Draw(
"beamm>>htsten",
cut,
"");
280 for (
int j=0;j<bins;++j)
if (htsten->GetBinContent(j+1)>0) Npoints++;
283 TCanvas *
c1=
new TCanvas(
"c1",
"c1",10,10,wid*Npoints,wid*4);
284 c1->Divide(Npoints,4);
288 for (
int j=0;j<bins;++j)
291 if (htsten->GetBinContent(j+1)<1)
continue;
293 double ecm = hqa->GetBinCenter(j+1);
294 cout <<mname<<
" Ecm:"<<ecm<<endl;
295 TString ecut =
cut+TString::Format(
"&&abs(beamm-%f)<0.01",ecm);
298 int nsel = n->Draw(
"xdal02:xdal12>>hhh",ecut,
"goff");
299 if (nsel>500000) nsel=500000;
300 TH2F *
h = (TH2F*)gDirectory->Get(
"hhh");
301 if (h->GetEntries()==0)
continue;
303 double xmin=1000., ymin=1000.,
xmax=0., ymax=0.;
304 double *x02=n->GetV2(), *x12 = n->GetV1();
305 for (
int i=0;
i<nsel;++
i)
308 if (x02[
i]<xmin) xmin=x02[
i];
309 if (x12[
i]>ymax) ymax=x12[
i];
310 if (x12[
i]<ymin) ymin=x12[
i];
313 TH2F *
h1 =
new TH2F(
"h1",TString::Format(
"M%s @ %3.1f GeV",mname.Data(),ecm),20,xmin,
xmax,20,ymin,ymax);
314 TH2F *
h2 =
new TH2F(
"h2",TString::Format(
"M%s @ %3.1f GeV triggered",mname.Data(),ecm),20,xmin,
xmax,20,ymin,ymax);
315 TH2F *heff =
new TH2F(
"heff",TString::Format(
"rel eff. M%s @ %3.1f GeV ",mname.Data(),ecm),20,xmin,
xmax,20,ymin,ymax);
316 TH1F *hp =
new TH1F(
"hp",TString::Format(
"M%s @ %3.1f GeV pull",mname.Data(),ecm),50,-8,8);
321 int N=n->GetEntries();
322 n->Project(
"h1",
"xdal02:xdal12",ecut);
323 n->Project(
"h2",
"xdal02:xdal12",ecut+
"&&trig");
331 c1->cd(cnt);
config_pad(gPad); h1->DrawCopy(
"colz");
333 c1->cd(cnt+Npoints);
config_pad(gPad); h2->DrawCopy(
"colz");
338 heff->SetMinimum(-8);
341 c1->cd(cnt+Npoints*2);
config_pad(gPad); heff->DrawCopy(
"colz");
342 c1->cd(cnt+Npoints*3); gPad->SetTopMargin(0.08);
346 lat.DrawLatex(-7.5,hp->GetMaximum()*0.9,TString::Format(
"QA = %4.2f",qa));
347 cout <<
"QA = "<<qa<<endl;
350 if (qa!=qa || qa>20) qa=20;
352 hqa->SetBinContent(j+1,qa);
355 gPad->SetGridx();gPad->SetGridy();
363 c1->SaveAs(
"QA_plots_M"+mname+
".gif");
364 c2->SaveAs(
"QA_value_M"+mname+
".gif");
friend F32vec4 sqrt(const F32vec4 &a)
double qadalitz2(TH2F *h1, TH2F *h2, TH1F *hpull, TH2F *heff)
void delete_histo(TString name)
double qadalitz(TH2F *h1, TH2F *h2, TH1F *hpull)
int checkphsp2_2(TString filepatt, double step=.1, TString cut="")
friend F32vec4 fabs(const F32vec4 &a)
void config_pad(TVirtualPad *p, double b=0.1, double r=0.12, double t=0.08, double l=0.1)
double Median(const TH2F *h, const TH2F *h2)