13 #include "TEventList.h"
14 #include "TDirectory.h"
18 #include "TObjArray.h"
27 typedef std::vector<pair<double, int> >
ValueMap;
58 TString leaftype = t->GetLeaf(varname)->GetTypeName();
60 if (leaftype==
"Float_t")
return 0;
61 else if (leaftype==
"Int_t")
return 1;
62 else if (leaftype==
"Bool_t")
return 2;
71 t->SetBranchAddress(
"ev",&
ev);
72 t->SetBranchAddress(
"run",&
run);
73 t->SetBranchAddress(
"mode",&
mode);
74 t->SetBranchAddress(
"recmode",&
rec);
76 TObjArray* branches = t->GetListOfBranches();
80 for(
int i=0;
i<=branches->GetLast(); ++
i)
82 TBranch* branch = (TBranch*)branches->UncheckedAt(
i);
85 if ( v==
"ev" || v==
"mode" || v==
"run" || v==
"nsig" )
continue;
86 if ( v==
"essumpt" || v==
"essumptc")
continue;
87 if ( v.Contains(
"pdg") || v.Contains(
"beam") || v.Contains(
"mct") )
continue;
88 if ( v.BeginsWith(
"t") && v!=
"thr")
continue;
89 if ( v.EndsWith(
"vx") || v.EndsWith(
"vy") || v.EndsWith(
"vz") || v.EndsWith(
"pocmag"))
continue;
93 if ( v.BeginsWith(
"es") || v==
"mmiss" || v.EndsWith(
"d0m") ) ok=
true;
94 if ( v.EndsWith(
"p") || v.EndsWith(
"tht") || v.EndsWith(
"pcm") || v.EndsWith(
"thtcm") || v.EndsWith(
"pt") ) ok=
true;
95 if ( ok || v.EndsWith(
"ang") || v.Contains(
"poc") ) ok=
true;
96 if ( ok || v.Contains(
"pid") || v.Contains(
"min") || v.Contains(
"max") || v.Contains(
"sum") || v.Contains(
"fw") ) ok=
true;
97 if ( ok || v.EndsWith(
"sph") || v.EndsWith(
"apl") || v.EndsWith(
"pla") || v.EndsWith(
"thr") || v.EndsWith(
"cir") ) ok=
true;
100 if ( v==
"xd0m" &&
dstarmode ) ok =
false;
108 case 1: t->SetBranchAddress(v, &(
ibranch[nbranch]));
break;
109 case 2: t->SetBranchAddress(v, &(
bbranch[nbranch]));
break;
128 int uid(
int lev,
int lrun,
int lmode)
130 return lev+10000*lrun+(((lmode/100)%10)*20+lmode%10)*100000;
137 t->SetBranchStatus(
"*",0);
138 t->SetBranchStatus(
"ev",1);
139 t->SetBranchStatus(
"run",1);
140 t->SetBranchStatus(
"mode",1);
141 t->SetBranchStatus(
"recmode",1);
144 for (
int j=0;j<10;++j)
evcntrec[j].clear();
146 for (
int i=0;
i<el.GetN();++
i)
148 t->GetEntry(el.GetEntry(
i));
152 t->SetBranchStatus(
"*",1);
162 t->SetBranchStatus(
"*",0);
163 t->SetBranchStatus(
"ev",1);
164 t->SetBranchStatus(
"mode",1);
165 t->SetBranchStatus(
"run",1);
166 t->SetBranchStatus(varname,1);
169 Int_t dtype=
gettype(t, varname);
173 double min = 1e9,
max=-1e9;
176 for (i=0;i<els.GetN();++
i)
178 t->GetEntry(els.GetEntry(i));
179 switch (dtype) {
case 2: var = (Float_t)
bbranch[
id];
break;
case 1: var = (Float_t)
ibranch[
id];
break;
default: var=
fbranch[id]; }
182 if (var>max) max = var;
183 if (var<min) min = var;
187 for (i=0;i<elb.GetN();++
i)
189 t->GetEntry(elb.GetEntry(i));
190 switch (dtype) {
case 2: var = (Float_t)
bbranch[
id];
break;
case 1: var = (Float_t)
ibranch[
id];
break;
default: var=
fbranch[id]; }
193 if (var>max) max = var;
194 if (var<min) min = var;
209 int Nbgval = elb.GetN();
210 int dtype =
gettype(t,varname);
212 makeMaps(t, varname, els, elb, sigvals, bgvals,
id);
216 sort(bgvals.begin(), bgvals.end());
221 while ( (bgcnt.size()/(double)
Nbgev)<(1-supr) && i<Nbgval ) bgcnt[bgvals[i++].second]+=1;
222 double leftcut = bgvals[
i].first;
227 while ( (bgcnt.size()/(double)
Nbgev)<(1-supr) && i>=0) bgcnt[bgvals[i--].second]+=1;
228 double rightcut = bgvals[
i].first;
233 for (i=0;i<(int)sigvals.size();++
i)
235 if (sigvals[i].first<leftcut) sigcnt[sigvals[
i].second]+=1;
236 if (sigvals[i].first>rightcut) sigcnt2[sigvals[
i].second]+=1;
239 t->SetBranchStatus(
"*",1);
241 double lefteff = sigcnt.size()/
Nsigev;
242 double righteff = sigcnt2.size()/
Nsigev;
244 cout <<varname<<
" "<<flush;
247 if (lefteff>righteff)
249 if (dtype==0)
cuts[id] = TString::Format(
"%s<%.3f",varname.Data(),leftcut);
250 else cuts[id] = TString::Format(
"%s<=%.0f",varname.Data(),leftcut);
256 if (dtype==0)
cuts[id] = TString::Format(
"%s>%.3f",varname.Data(),rightcut);
257 else cuts[id] = TString::Format(
"%s>=%.0f",varname.Data(),rightcut);
269 int Nsigval = els.GetN();
270 int dtype =
gettype(t,varname);
272 makeMaps(t, varname, els, elb, sigvals, bgvals,
id);
275 sort(sigvals.begin(), sigvals.end());
280 while ( (sigcnt.size()/(double)
Nsigev)<eff && i<Nsigval ) sigcnt[sigvals[i++].second]+=1;
281 double leftcut = sigvals[
i].first;
286 while ( (sigcnt.size()/(double)
Nsigev)<eff && i>=0) sigcnt[sigvals[i--].second]+=1;
287 double rightcut = sigvals[
i].first;
292 for (i=0;i<(int)bgvals.size();++
i)
294 if (bgvals[i].first<=leftcut) bgcnt[bgvals[
i].second];
295 if (bgvals[i].first>=rightcut) bgcnt2[bgvals[
i].second];
298 t->SetBranchStatus(
"*",1);
302 double rightsupr = (
Nbgev-bgcnt2.size())/
Nbgev;
304 cout <<varname<<
" "<<flush;
306 if (leftcut!=leftcut || rightcut!=rightcut)
return 0;
309 if (leftsupr>rightsupr)
311 if (dtype==0)
cuts[id] = TString::Format(
"%s<%.5f",varname.Data(),leftcut);
312 else cuts[id] = TString::Format(
"%s<=%.0f",varname.Data(),leftcut);
318 if (dtype==0)
cuts[id] = TString::Format(
"%s>%.5f",varname.Data(),rightcut);
319 else cuts[id] = TString::Format(
"%s>=%.0f",varname.Data(),rightcut);
327 CountMap bgcntl, bgcntr, sigcntl, sigcntr;
330 int dtype =
gettype(t,varname);
331 int Ns = els.GetN(),
Nb = elb.GetN();
333 makeMaps(t, varname, els, elb, sigvals, bgvals,
id);
336 sort(sigvals.begin(), sigvals.end());
337 sort(bgvals.begin(), bgvals.end());
341 int isigl=0, ibgl = 0, isigr = sigvals.size()-1, ibgr = bgvals.size()-1;
343 double leftcut = 0., rightcut = 0., qal = 1000., qar = 1000.;
344 cout <<varname<<
" "<<flush;
348 double lcut = (
i+1)*step +
minh[
id];
349 double rcut =
maxh[id] - (
i+1)*step;
351 while (sigvals[isigl].first<lcut && isigl<Ns) sigcntl[sigvals[isigl++].second]+=1;
352 while (bgvals[ibgl].first<lcut && ibgl<
Nb) bgcntl[bgvals[ibgl++].second]+=1;
354 while (sigvals[isigr].first>rcut && isigr>=0) sigcntr[sigvals[isigr--].second]+=1;
355 while (bgvals[ibgr].first>rcut && ibgr>=0) bgcntr[bgvals[ibgr--].second]+=1;
357 double effl = (double) sigcntl.size()/
Nsigev;
358 double effr = (double) sigcntr.size()/
Nsigev;
359 double supl = 1. - (double) bgcntl.size()/
Nbgev;
360 double supr = 1. - (double) bgcntr.size()/
Nbgev;
362 double distl =
sqrt((1.-effl)*(1.-effl) + (1.-supl)*(1.-supl));
363 double distr =
sqrt((1.-effr)*(1.-effr) + (1.-supr)*(1.-supr));
365 printf(
"%8s (%3d) : left(%5.3f / %5.3f : %5.3f) right(%5.3f / %5.3f : %5.3f)\n", varname.Data(),
i, effl, supl, distl, effr, supr, distr);
368 grl[id].SetPoint(
i, effl, supl);
369 grr[id].SetPoint(
i, effr, supr);
371 if (distl<qal) {qal=distl; leftcut=lcut;}
372 if (distr<qar) {qar=distr; rightcut=rcut;}
375 t->SetBranchStatus(
"*",1);
377 if (leftcut!=leftcut || rightcut!=rightcut)
return 0;
382 if (dtype==0)
cuts[id] = TString::Format(
"%s<%.5f",varname.Data(),leftcut);
383 else cuts[id] = TString::Format(
"%s<=%.0f",varname.Data(),leftcut);
389 if (dtype==0)
cuts[id] = TString::Format(
"%s>%.5f",varname.Data(),rightcut);
390 else cuts[id] = TString::Format(
"%s>=%.0f",varname.Data(),rightcut);
399 isbt = gROOT->IsBatch();
401 gStyle->SetTitleX(0.2);
402 gStyle->SetTitleY(0.993);
403 gStyle->SetTitleH(0.07);
404 gStyle->SetPadTopMargin(0.08);
405 gStyle->SetTitleBorderSize(0);
406 gStyle->SetOptStat(0);
410 TRegexp regntp(
"n[0-9]+");
411 TRegexp regS(
"[0-9]+S");
412 TRegexp regB(
"[0-9]+B");
415 s =
s(0,s.Length()-1);
417 b =
b(0,b.Length()-1);
420 TString smode = ntp(1,ntp.Length());
421 int mode = smode.Atoi();
422 dstarmode = (mode>=110 && mode<=119) || (mode>=130 && mode<=138) || (mode>=150 && mode<=151);
424 if (n0s<0) n0s = s.Atoi();
430 cout <<
"tree '"<<ntp.Data()<<
"' with N_sig = "<<
N0_sig<<
", N_bg = "<<
N0_bg<<endl;
434 TFile *
f=
new TFile(fname,
"READ");
435 TTree *
t=(TTree*)f->Get(ntp);
439 TEventList
els(
"els"), elsall(
"elsall"),
elb(
"elb"), elball(
"elball");
441 TCanvas *
c1=
new TCanvas(
"c1",
"c1",10,10,1800,550);
444 if (precut==
"") precut = tagcut;
445 else precut = tagcut+
"&&"+precut;
450 t->Draw(
">>elsall",tagcut+
"&&"+sigcut);
451 t->Draw(
">>elball",tagcut+
"&&"+bgcut);
459 cout <<sigcut <<
" "<<bgcut<<endl;
460 t->Draw(
">>els",sigcut);
461 t->Draw(
">>elb",bgcut);
468 cout <<
"SIG EVT: "<<
Nsigev<<
" ev "<<
els.GetN()<<
" cn BG: "<<
Nbgev<<
" ev "<<
elb.GetN()<<
" cn"<<endl;
486 std::vector<int> myidx (
idx,
idx+nbranch);
487 std::sort(myidx.begin(), myidx.end(),
mycompare);
492 cout <<
"\n\nBEST 20 vars:"<<endl<<endl;
499 lt.SetTextSize(0.06);
501 if (supr<0) target=
"eff";
502 if (supr==0) target=
"qa";
510 printf(
"%2d) %-15s : %4s = %5.3f cut = %.4f ( %s )\n",j,
vars[i].Data(), target.Data(),
signi[
i],
cut[
i],
cuts[
i].Data());
516 t->SetEventList(&
els);
517 t->Project(
"h1",
vars[i]);
518 t->SetEventList(&
elb);
519 t->Project(
"h2",
vars[i]);
521 h1.Scale(1.0/h1.Integral());
522 h2.Scale(1.0/h2.Integral());
523 h1.SetTitleSize(0.05);
526 double maxi = h1.GetMaximum();
527 if (h2.GetMaximum()>maxi ) maxi = h2.GetMaximum();
533 h2.DrawNormalized(
"same");
535 double axmin = h1.GetXaxis()->GetXmin(),axmax = h1.GetXaxis()->GetXmax();
537 l.DrawLine(cut[i],0, cut[i], maxi*0.9);
539 lt.DrawLatex(axmin+(axmax-axmin)*0.6,1.01*maxi,TString::Format(
"%s = %6.4f",target.Data(),
signi[
i]));
544 TH1F hr(
"hr",
"recmodes",10,0,10);
547 for (
int k=0;k<10;++k) hr.SetBinContent(k+1,(
double)
evcntrec[k].size()/evmult*norm);
559 cout <<
"\nCUT : "<<precut.Data()<<endl;
560 cout <<
"SIG EVT: "<<
Nsigev<<
" ev "<<
els.GetN()<<
" cn BG: "<<
Nbgev<<
" ev "<<
elb.GetN()<<
" cn"<<endl;
563 printf(
"SIG REL : %6.1f%% BG REL : %7.3f%%\n\n",
Nsigev/nsig*100.,
Nbgev/nbg*100.);
565 cout<<
"Recoil : ";
for (
int k=0;k<10;++k)
printf(
" %02d ",k);cout <<endl;
566 cout<<
"Eff : ";
for (
int k=0;k<10;++k)
printf(
"%6.1f%%",(
double)
evcntrec[k].size()/evmult*norm*100.);cout <<endl<<endl;
573 for (j=0;j<20;++j) cout <<
vars[myidx[j]].Data()<<
" ";
double bestEffEvt(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double supr, int id)
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
friend F32vec4 sqrt(const F32vec4 &a)
std::map< TString, TString > mctvar
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
std::map< int, int > CountMap
std::vector< pair< double, int > > ValueMap
std::vector< pair< double, int > > ValueMap
bool mycompare(int i, int j)
int gettype(TTree *t, TString varname)
int uid(int lev, int lrun, int lmode)
double bestCombiEvt(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double eff, int id)
double bestSuppressionEvt(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double eff, int id)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
int countEvents(TTree *t, TEventList &el)
int cutfinderx(TString fname, TString precut="", double supr=0.95, int evmult=10000, double norm=1.0, int n0s=-1)
std::map< int, int > CountMap
void makeMaps(TTree *t, TString varname, TEventList &els, TEventList &elb, ValueMap &sig, ValueMap &bg, int id)