8 #include "TEventList.h"
9 #include "TDirectory.h"
14 #include "TObjArray.h"
43 int n=h1->GetNbinsX();
44 double sum1=0, sum2=0;
45 double bestr=0, bestl=0;
46 double int1 = h1->Integral();
47 double int2 = h2->Integral();
48 double bestcutl=-999.;
55 double cur1 = h1->GetBinContent(
i)/int1;
56 double cur2 = h2->GetBinContent(
i)/int2;
60 double vall = 0, valr=0;
62 if ((sum1+fac2*sum2)>0) vall=sum1/
sqrt(fac2*sum2+sum1);
63 if ((1.-sum1+fac2*(1.-sum2))>0) valr=(1.-sum1)/
sqrt(1.-sum1+fac2*(1.-sum2));
65 if (valr>bestr) { bestr=valr; bestcutr = h1->GetBinCenter(
i);}
66 if (vall>bestl) { bestl=vall; bestcutl = h1->GetBinCenter(
i);}
82 t->SetBranchStatus(
"*",1);
84 t->SetBranchStatus(
"*",0);
85 t->SetBranchStatus(
"evt",1);
86 t->SetBranchStatus(
"run",1);
88 TEventList *el=(TEventList*)gDirectory->Get(
"el");
91 t->SetBranchAddress(
"ev",&ev);
92 t->SetBranchAddress(
"run",&run);
96 for (
int i=0;
i<el->GetN();++
i)
98 t->GetEntry(el->GetEntry(
i));
99 evcnt[ev+run*2000]+=1;
101 t->SetBranchStatus(
"*",1);
107 t->SetEventList(&el);
108 t->SetBranchStatus(
"*",0);
109 t->SetBranchStatus(
"ev",1);
110 t->SetBranchStatus(
"run",1);
113 t->SetBranchAddress(
"ev",&ev);
114 t->SetBranchAddress(
"run",&run);
118 for (
int i=0;
i<el.GetN();++
i)
120 t->GetEntry(el.GetEntry(
i));
123 t->SetBranchStatus(
"*",1);
130 int n=ht1.GetNbinsX();
133 h1.Scale(1.0/h1.Integral());
134 h2.Scale(1.0/h2.Integral());
139 for (
int i=1;
i<=
n;++
i)
141 sum+=
fabs(h1.GetBinContent(
i));
147 double bestEff(TH1*
h1, TH1*
h2,
double &bestcut,
double supr2=0.8,
double fac2=1.)
149 int n=h1->GetNbinsX();
150 double sum1=0, sum2=0;
151 double bestr=0, bestl=0;
152 double int1 = h1->Integral();
153 double int2 = h2->Integral();
154 double bestcutl=-999.;
155 double bestcutr=999.;
162 sum1 += h1->GetBinContent(i)/int1;
163 sum2 += h2->GetBinContent(i++)/int2;
166 bestcutr = h1->GetBinCenter(i-1);
174 sum1 += h1->GetBinContent(i)/int1;
175 sum2 += h2->GetBinContent(i--)/int2;
179 bestcutl = h1->GetBinCenter(i-1);
193 int n=h1->GetNbinsX();
194 double sum1=0, sum2=0;
195 double bestr=0, bestl=0;
196 double int1 = h1->Integral();
197 double int2 = h2->Integral();
198 double bestcutl=-999.;
199 double bestcutr=999.;
206 sum1 += h1->GetBinContent(i)/int1;
207 sum2 += h2->GetBinContent(i++)/int2;
210 bestcutr = h1->GetBinCenter(i-1);
218 sum1 += h1->GetBinContent(i)/int1;
219 sum2 += h2->GetBinContent(i--)/int2;
223 bestcutl = h1->GetBinCenter(i-1);
239 t->SetBranchStatus(
"*",1);
241 TEventList
els(
"els"),
elb(
"elb");
242 t->Draw(
">>els",precut+
"&&"+sigcut);
243 t->Draw(
">>elb",precut+
"&&"+bgcut);
245 t->SetBranchStatus(
"*",0);
246 t->SetBranchStatus(
"ev",1);
247 t->SetBranchStatus(
"run",1);
248 t->SetBranchStatus(varname,1);
250 Float_t
ev, var,
run;
251 t->SetBranchAddress(
"ev",&ev);
252 t->SetBranchAddress(
"run",&run);
253 t->SetBranchAddress(varname,&var);
255 std::map<int, int> sigcnt;
256 std::map<int, int> bgcnt;
257 std::map<int, int> bgcnt2;
259 std::vector<pair<double, int> > sigvals;
260 std::vector<pair<double, int> > bgvals;
262 int Nsigval =
els.GetN(), Nbgval = elb.GetN();
263 double min = 1e9,
max=-1e9;
266 for (i=0;i<
els.GetN();++
i)
268 t->GetEntry(
els.GetEntry(i));
269 sigvals.push_back(std::make_pair(var, ev+run*2000));
270 if (var>max) max = var;
271 if (var<min) min = var;
275 for (i=0;i<elb.GetN();++
i)
277 t->GetEntry(elb.GetEntry(i));
278 bgvals.push_back(std::make_pair(var, ev+run*2000));
282 sort(sigvals.begin(), sigvals.end());
287 while ( (sigcnt.size()/(double)
Nsigev)<eff && i<Nsigval ) sigcnt[sigvals[i++].second]+=1;
288 double leftcut = sigvals[
i].first;
293 while ( (sigcnt.size()/(double)
Nsigev)<eff && i>=0) sigcnt[sigvals[i--].second]+=1;
294 double rightcut = sigvals[
i].first;
299 for (i=0;i<bgvals.size();++
i)
301 if (bgvals[i].first<=leftcut) bgcnt[bgvals[
i].second];
302 if (bgvals[i].first>=rightcut) bgcnt2[bgvals[
i].second];
303 if (bgvals[i].first>max) max = bgvals[
i].first;
304 if (bgvals[i].first<min) min = bgvals[
i].first;
309 t->SetBranchStatus(
"*",1);
313 double rightsupr = (
Nbgev-bgcnt2.size())/
Nbgev;
315 cout <<varname<<
" l:"<<leftcut<<
"("<<leftsupr<<
") r:"<<rightcut<<
"("<<rightsupr<<
")"<<endl;
318 if (leftsupr>rightsupr)
329 t->SetBranchStatus(
"*",0);
330 t->SetBranchStatus(
"ev",1);
331 t->SetBranchStatus(
"run",1);
332 t->SetBranchStatus(varname,1);
334 Float_t
ev, var,
run;
335 t->SetBranchAddress(
"ev",&ev);
336 t->SetBranchAddress(
"run",&run);
337 t->SetBranchAddress(varname,&var);
339 std::map<int, int> sigcnt;
340 std::map<int, int> bgcnt;
341 std::map<int, int> bgcnt2;
343 std::vector<pair<double, int> > sigvals;
344 std::vector<pair<double, int> > bgvals;
346 int Nsigval = els.GetN(), Nbgval = elb.GetN();
347 double min = 1e9,
max=-1e9;
350 for (i=0;i<els.GetN();++
i)
352 t->GetEntry(els.GetEntry(i));
353 sigvals.push_back(std::make_pair(var, ev+run*2000));
354 if (var>max) max = var;
355 if (var<min) min = var;
359 for (i=0;i<elb.GetN();++
i)
361 t->GetEntry(elb.GetEntry(i));
362 bgvals.push_back(std::make_pair(var, ev+run*2000));
366 sort(sigvals.begin(), sigvals.end());
371 while ( (sigcnt.size()/(double)
Nsigev)<eff && i<Nsigval ) sigcnt[sigvals[i++].second]+=1;
372 double leftcut = sigvals[
i].first;
377 while ( (sigcnt.size()/(double)
Nsigev)<eff && i>=0) sigcnt[sigvals[i--].second]+=1;
378 double rightcut = sigvals[
i].first;
383 for (i=0;i<bgvals.size();++
i)
385 if (bgvals[i].first<=leftcut) bgcnt[bgvals[
i].second];
386 if (bgvals[i].first>=rightcut) bgcnt2[bgvals[
i].second];
387 if (bgvals[i].first>max) max = bgvals[
i].first;
388 if (bgvals[i].first<min) min = bgvals[
i].first;
393 t->SetBranchStatus(
"*",1);
397 double rightsupr = (
Nbgev-bgcnt2.size())/
Nbgev;
399 cout <<varname<<
" l:"<<leftcut<<
"("<<leftsupr<<
") r:"<<rightcut<<
"("<<rightsupr<<
")"<<endl;
401 if (leftcut!=leftcut || rightcut!=rightcut)
return 0;
404 if (leftsupr>rightsupr)
417 t->SetBranchStatus(
"*",0);
418 t->SetBranchStatus(
"ev",1);
419 t->SetBranchStatus(
"run",1);
420 t->SetBranchStatus(varname,1);
422 Float_t
ev, var,
run;
423 t->SetBranchAddress(
"ev",&ev);
424 t->SetBranchAddress(
"run",&run);
425 t->SetBranchAddress(varname,&var);
427 std::map<int, int> sigcnt;
428 std::map<int, int> bgcnt;
429 std::map<int, int> bgcnt2;
431 std::vector<pair<double, int> > sigvals;
432 std::vector<pair<double, int> > bgvals;
434 int Nsigval = els.GetN(), Nbgval = elb.GetN();
435 double min = 1e9,
max=-1e9;
438 for (i=0;i<els.GetN();++
i)
440 t->GetEntry(els.GetEntry(i));
441 sigvals.push_back(std::make_pair(var, ev+run*2000));
442 if (var>max) max = var;
443 if (var<min) min = var;
447 for (i=0;i<elb.GetN();++
i)
449 t->GetEntry(elb.GetEntry(i));
450 bgvals.push_back(std::make_pair(var, ev+run*2000));
454 sort(sigvals.begin(), sigvals.end());
459 while ( (sigcnt.size()/(double)
Nsigev)<eff && i<Nsigval ) sigcnt[sigvals[i++].second]+=1;
460 double leftcut = sigvals[
i].first;
465 while ( (sigcnt.size()/(double)
Nsigev)<eff && i>=0) sigcnt[sigvals[i--].second]+=1;
466 double rightcut = sigvals[
i].first;
471 for (i=0;i<bgvals.size();++
i)
473 if (bgvals[i].first<=leftcut) bgcnt[bgvals[
i].second];
474 if (bgvals[i].first>=rightcut) bgcnt2[bgvals[
i].second];
475 if (bgvals[i].first>max) max = bgvals[
i].first;
476 if (bgvals[i].first<min) min = bgvals[
i].first;
481 t->SetBranchStatus(
"*",1);
485 double rightsupr = (
Nbgev-bgcnt2.size())/
Nbgev;
487 cout <<varname<<
" l:"<<leftcut<<
"("<<leftsupr<<
") r:"<<rightcut<<
"("<<rightsupr<<
")"<<endl;
489 if (leftcut!=leftcut || rightcut!=rightcut)
return 0;
492 if (leftsupr>rightsupr)
502 low = t->GetMinimum(var);
503 high = t->GetMaximum(var);
506 double miss = (1.-frac)/2;
510 t->Draw(
">>el",ccut);
511 t->SetEventList(&el);
513 double llow = t->GetMinimum(var);
514 double lhigh = t->GetMaximum(var);
516 TH1F
htemp(
"htemp",
"",500,llow, lhigh);
517 t->Project(
"htemp",var);
520 double integ = htemp.Integral();
524 while (sum<miss) sum+=htemp.GetBinContent(i++)/integ;
525 low = htemp.GetBinCenter(i-2);
528 while (sum<miss) sum+=htemp.GetBinContent(i--)/integ;
529 high = htemp.GetBinCenter(i+2);
536 gStyle->SetTitleY(0.993);
537 gStyle->SetTitleH(0.07);
538 gStyle->SetPadTopMargin(0.08);
539 gStyle->SetTitleBorderSize(0);
540 gStyle->SetOptStat(0);
547 double sigl, sigh, bgl, bgh;
549 TFile *
f=
new TFile(
"datafull/M"+pre+
"_"+ntp+
".root",
"READ");
551 TTree *
t=(TTree*)f->Get(ntp);
553 TEventList
els(
"els");
554 TEventList
elb(
"elb");
556 TCanvas *
c1=
new TCanvas(
"c1",
"c1",10,10,1800,600);
559 TObjArray* branches = t->GetListOfBranches();
561 TString bgcut =
"!("+sigcut+
")";
563 TString bstring = precut+
" "+sigcut;
569 cout <<sigcut <<
" "<<bgcut<<endl;
570 t->Draw(
">>els",sigcut);
571 t->Draw(
">>elb",bgcut);
576 cout <<
"SIG:"<<
Nsigev<<
" ev "<<els.GetN()<<
" cn BG:"<<
Nbgev<<
" ev "<<elb.GetN()<<
" cn"<<endl;
582 for(i=0; i<=branches->GetLast(); ++
i)
585 TBranch* branch = (TBranch*)branches->UncheckedAt(i);
586 vars[
i]=branch->GetName();
589 if (
vars[i]==
"ev")
continue;
590 if (
vars[i]==
"mode")
continue;
591 if (
vars[i]==
"run")
continue;
592 if (
vars[i].Contains(
"pdg"))
continue;
593 if (
vars[i].Contains(
"beam"))
continue;
594 if (
vars[i].Contains(
"mct"))
continue;
595 if (
vars[i].BeginsWith(
"t") &&
vars[i]!=
"thr")
continue;
603 cout <<
"\n\nBEST 12 vars:"<<endl<<endl;
605 std::vector<int> myidx (
idx,
idx+MAX);
607 std::sort(myidx.begin(), myidx.end(),
mycompare);
614 lt.SetTextSize(0.06);
632 t->SetEventList(&els);
633 t->Project(
"h1",
vars[i]);
634 t->SetEventList(&elb);
635 t->Project(
"h2",
vars[i]);
637 h1.Scale(1.0/h1.Integral());
638 h2.Scale(1.0/h2.Integral());
639 h1.SetTitleSize(0.05);
642 double maxi = h1.GetMaximum();
643 if (h2.GetMaximum()>maxi ) maxi = h2.GetMaximum();
649 h2.DrawNormalized(
"same");
651 double axmin = h1.GetXaxis()->GetXmin(),axmax = h1.GetXaxis()->GetXmax();
653 l.DrawLine(
cut[i],0,
cut[i], maxi*0.9);
655 lt.DrawLatex(axmin+(axmax-axmin)*0.6,1.01*maxi,TString::Format(
"sig = %6.4f",
signi[i]));
667 cout <<
"SIG EVT : "<<nsig<<
" "<<
"BG EVT : "<<nbg<<endl;
668 cout <<
"SIG EFF : "<<nsig/
N0_sig<<
" "<<
"BG EFF : "<< nbg/
N0_bg<<endl;
friend F32vec4 sqrt(const F32vec4 &a)
double bestSeparation(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double eff, int idx)
double bestEff(TH1 *h1, TH1 *h2, double &bestcut, double supr2=0.8, double fac2=1.)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
std::map< int, int > evcnt
double bestSuppression(TH1 *h1, TH1 *h2, double &bestcut, double eff=0.9)
int countEvents(TTree *t, TString ccut)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
friend F32vec4 fabs(const F32vec4 &a)
bool mycompare(int i, int j)
void findLimits(TTree *t, TString var, TString ccut, double &low, double &high, double frac=0.98)
double bestSignificance(TH1 *h1, TH1 *h2, double &bestcut, double fac2=1.)
double diffQA(TH1F &ht1, TH1F &ht2)
double bestSuppressionEvt(TTree *t, TString precut, TString varname, TString sigcut, TString bgcut, double &bestcut, double eff, int idx)
int cutfinder_fullev(TString pre, TString ntp, TString sigcut, TString precut="", double n0s=50., double n0b=500., double supr=0.9)