8 #include "TEventList.h"
9 #include "TDirectory.h"
14 #include "TObjArray.h"
44 t->SetBranchStatus(
"*",1);
46 t->SetBranchStatus(
"*",0);
47 t->SetBranchStatus(
"evt",1);
49 TEventList *el=(TEventList*)gDirectory->Get(
"el");
52 t->SetBranchAddress(
"evt",&ev);
56 for (
int i=0;
i<el->GetN();++
i)
58 t->GetEntry(el->GetEntry(
i));
61 t->SetBranchStatus(
"*",1);
68 t->SetBranchStatus(
"*",0);
69 t->SetBranchStatus(
"evt",1);
72 t->SetBranchAddress(
"evt",&ev);
76 for (
int i=0;
i<el.GetN();++
i)
78 t->GetEntry(el.GetEntry(
i));
81 t->SetBranchStatus(
"*",1);
89 t->SetBranchStatus(
"*",0);
90 t->SetBranchStatus(
"evt",1);
91 t->SetBranchStatus(varname,1);
94 t->SetBranchAddress(
"evt",&ev);
95 t->SetBranchAddress(varname,&var);
97 std::map<int, int> sigcnt;
98 std::map<int, int> bgcnt;
99 std::map<int, int> bgcnt2;
101 std::vector<pair<double, int> > sigvals;
102 std::vector<pair<double, int> > bgvals;
104 int Nsigval = els.GetN(), Nbgval = elb.GetN();
105 double min = 1e9,
max=-1e9;
108 for (i=0;i<els.GetN();++
i)
110 t->GetEntry(els.GetEntry(i));
111 sigvals.push_back(std::make_pair(var, ev));
112 if (var>max) max = var;
113 if (var<min) min = var;
117 for (i=0;i<elb.GetN();++
i)
119 t->GetEntry(elb.GetEntry(i));
120 bgvals.push_back(std::make_pair(var, ev));
121 if (var>max) max = var;
122 if (var<min) min = var;
128 sort(sigvals.begin(), sigvals.end());
129 sort(bgvals.begin(), bgvals.end());
131 double pos=
min, step = (max-
min)/500., bestqal=0, bestcutl=0, bestqar=0, bestcutr=0;
132 int bestsig=0, bestbg=0;
138 for (pos=min+step; pos<
max; pos+=step)
140 while ( sigvals[i].first<=pos && i<Nsigval) sigcnt[sigvals[i++].second]+=1;
141 while ( bgvals[j].first<=pos && j<Nbgval) bgcnt[bgvals[j++].second]+=1;
148 bestsig = sigcnt.size();
149 bestbg = bgcnt.size();
153 cout <<varname<<
" qa(l)="<<bestqal<<
" S="<<bestsig <<
" B="<<bestbg;
155 i=sigvals.size()-1, j=bgvals.size()-1;
159 for (pos=max-step; pos>
min; pos-=step)
161 while ( sigvals[i].first>=pos && i>=0) sigcnt[sigvals[i--].second]+=1;
162 while ( bgvals[j].first>=pos && j>=0) bgcnt[bgvals[j--].second]+=1;
169 bestsig = sigcnt.size();
170 bestbg = bgcnt.size();
173 cout <<
" qa(r)="<<bestqar<<
" S="<<bestsig <<
" B="<<bestbg<<endl;
176 t->SetBranchStatus(
"*",1);
192 t->SetBranchStatus(
"*",0);
193 t->SetBranchStatus(
"evt",1);
194 t->SetBranchStatus(varname,1);
197 t->SetBranchAddress(
"evt",&ev);
198 t->SetBranchAddress(varname,&var);
200 std::map<int, int> sigcnt;
201 std::map<int, int> bgcnt;
202 std::map<int, int> bgcnt2;
204 std::vector<pair<double, int> > sigvals;
205 std::vector<pair<double, int> > bgvals;
207 int Nsigval = els.GetN(), Nbgval = elb.GetN();
208 double min = 1e9,
max=-1e9;
211 for (i=0;i<els.GetN();++
i)
213 t->GetEntry(els.GetEntry(i));
214 sigvals.push_back(std::make_pair(var, ev));
215 if (var>max) max = var;
216 if (var<min) min = var;
220 for (i=0;i<elb.GetN();++
i)
222 t->GetEntry(elb.GetEntry(i));
223 bgvals.push_back(std::make_pair(var, ev));
224 if (var>max) max = var;
225 if (var<min) min = var;
229 sort(sigvals.begin(), sigvals.end());
234 while ( (sigcnt.size()/(double)
Nsigev)<eff && i<Nsigval ) sigcnt[sigvals[i++].second]+=1;
235 double leftcut = sigvals[
i].first;
240 while ( (sigcnt.size()/(double)
Nsigev)<eff && i>=0) sigcnt[sigvals[i--].second]+=1;
241 double rightcut = sigvals[
i].first;
246 for (i=0;i<bgvals.size();++
i)
248 if (bgvals[i].first<=leftcut) bgcnt[bgvals[
i].second];
249 if (bgvals[i].first>=rightcut) bgcnt2[bgvals[
i].second];
254 t->SetBranchStatus(
"*",1);
258 double rightsupr = (
Nbgev-bgcnt2.size())/
Nbgev;
260 cout <<varname<<
"(S="<<sigcnt.size()<<
") l:"<<leftcut<<
"("<<bgcnt.size()<<
"/"<<leftsupr<<
") r:"<<rightcut<<
"("<<bgcnt2.size()<<
"/"<<rightsupr<<
")"<<endl;
263 if (leftsupr>rightsupr)
274 t->SetBranchStatus(
"*",0);
275 t->SetBranchStatus(
"evt",1);
276 t->SetBranchStatus(varname,1);
279 t->SetBranchAddress(
"evt",&ev);
280 t->SetBranchAddress(varname,&var);
282 std::map<int, int> sigcnt;
283 std::map<int, int> bgcnt;
284 std::map<int, int> sigcnt2;
286 std::vector<pair<double, int> > sigvals;
287 std::vector<pair<double, int> > bgvals;
289 int Nsigval = els.GetN(), Nbgval = elb.GetN();
290 double min = 1e9,
max=-1e9;
293 for (i=0;i<els.GetN();++
i)
295 t->GetEntry(els.GetEntry(i));
296 sigvals.push_back(std::make_pair(var, ev));
297 if (var>max) max = var;
298 if (var<min) min = var;
302 for (i=0;i<elb.GetN();++
i)
304 t->GetEntry(elb.GetEntry(i));
305 bgvals.push_back(std::make_pair(var, ev));
306 if (var>max) max = var;
307 if (var<min) min = var;
311 sort(bgvals.begin(), bgvals.end());
316 while ( (bgcnt.size()/(double)
Nbgev)<(1-supr) && i<Nbgval ) bgcnt[bgvals[i++].second]+=1;
317 double leftcut = bgvals[
i].first;
322 while ( (bgcnt.size()/(double)
Nbgev)<(1-supr) && i>=0) bgcnt[bgvals[i--].second]+=1;
323 double rightcut = bgvals[
i].first;
328 for (i=0;i<sigvals.size();++
i)
330 if (sigvals[i].first<leftcut) sigcnt[sigvals[
i].second]+=1;
331 if (sigvals[i].first>rightcut) sigcnt2[sigvals[
i].second]+=1;
336 t->SetBranchStatus(
"*",1);
338 double lefteff = sigcnt.size()/
Nsigev;
339 double righteff = sigcnt2.size()/
Nsigev;
341 cout <<varname<<
"(B="<<bgcnt.size()<<
") l:"<<leftcut<<
"("<<sigcnt.size()<<
"/"<<lefteff<<
") r:"<<rightcut<<
"("<<sigcnt2.size()<<
"/"<<righteff<<
")"<<endl;
344 if (lefteff>righteff)
354 low = t->GetMinimum(var);
355 high = t->GetMaximum(var);
358 double miss = (1.-frac)/2;
362 t->Draw(
">>el",ccut);
363 t->SetEventList(&el);
365 double llow = t->GetMinimum(var);
366 double lhigh = t->GetMaximum(var);
368 TH1F
htemp(
"htemp",
"",500,llow, lhigh);
369 t->Project(
"htemp",var);
372 double integ = htemp.Integral();
376 while (sum<miss) sum+=htemp.GetBinContent(i++)/integ;
377 low = htemp.GetBinCenter(i-2);
380 while (sum<miss) sum+=htemp.GetBinContent(i--)/integ;
381 high = htemp.GetBinCenter(i+2);
388 gStyle->SetTitleY(0.993);
389 gStyle->SetTitleH(0.07);
390 gStyle->SetPadTopMargin(0.08);
391 gStyle->SetTitleBorderSize(0);
392 gStyle->SetOptStat(0);
399 double sigl, sigh, bgl, bgh;
401 TFile *
f=
new TFile(
"data/M"+pre+
"_"+ntp+
".root",
"READ");
403 TTree *
t=(TTree*)f->Get(ntp);
405 TEventList
els(
"els");
406 TEventList elsall(
"elsall");
407 TEventList
elb(
"elb");
409 TCanvas *
c1=
new TCanvas(
"c1",
"c1",10,10,1500,900);
412 TObjArray* branches = t->GetListOfBranches();
414 TString bgcut =
"!("+sigcut+
")";
422 cout <<sigcut <<
" "<<bgcut<<endl;
423 t->Draw(
">>elsall",sigcut);
424 t->Draw(
">>els",sigcut+
"&&mct");
425 t->Draw(
">>elb",bgcut);
430 cout <<
"SIG:"<<
Nsigev<<
" ev "<<els.GetN()<<
" cn BG:"<<
Nbgev<<
" ev "<<elb.GetN()<<
" cn"<<endl;
436 for(i=0; i<=branches->GetLast(); ++
i)
439 TBranch* branch = (TBranch*)branches->UncheckedAt(i);
440 vars[
i]=branch->GetName();
443 if (
vars[i]==
"evt")
continue;
444 if (
vars[i]==
"mode")
continue;
445 if (
vars[i].Contains(
"pdg"))
continue;
446 if (
vars[i].Contains(
"mct"))
continue;
447 if (
vars[i].Contains(
"dec"))
continue;
448 if (
vars[i].BeginsWith(
"t") &&
vars[i]!=
"thr")
continue;
460 cout <<
"\n\nBEST 12 vars:"<<endl<<endl;
462 std::vector<int> myidx (
idx,
idx+MAX);
464 std::sort(myidx.begin(), myidx.end(),
mycompare);
471 lt.SetTextSize(0.06);
473 if (supr<0) target=
"eff";
491 t->SetEventList(&els);
492 t->Project(
"h1",
vars[i]);
493 t->SetEventList(&elb);
494 t->Project(
"h2",
vars[i]);
496 h1.Scale(1.0/h1.Integral());
497 h2.Scale(1.0/h2.Integral());
498 h1.SetTitleSize(0.05);
501 double maxi = h1.GetMaximum();
502 if (h2.GetMaximum()>maxi ) maxi = h2.GetMaximum();
508 h2.DrawNormalized(
"same");
510 double axmin = h1.GetXaxis()->GetXmin(),axmax = h1.GetXaxis()->GetXmax();
512 l.DrawLine(
cut[i],0,
cut[i], maxi*0.9);
514 lt.DrawLatex(axmin+(axmax-axmin)*0.6,1.01*maxi,TString::Format(
"%s = %6.4f",target.Data(),
signi[
i]));
526 cout <<
"SIG EVT : "<<nsig<<
" "<<
"BG EVT : "<<nbg<<endl;
527 cout <<
"SIG EFF : "<<nsig/
N0_sig<<
" "<<
"BG EFF : "<< nbg/
N0_bg<<endl;
int cutfinder_toyev(TString pre, TString ntp, TString sigcut, TString precut="", double n0s=50., double n0b=500., double supr=0.9)
double bestSepEvt(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double eff, int idx)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
std::map< int, int > evcnt
void findLimits(TTree *t, TString var, TString ccut, double &low, double &high, double frac=0.98)
double bestSuppressionEvt(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double eff, int idx)
double bestEffEvt(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double supr, int idx)
int countEvents(TTree *t, TString ccut)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
bool mycompare(int i, int j)