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)
bool mycompare(int i, int j)
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)
void findLimits(TTree *t, TString var, TString ccut, double &low, double &high, double frac=0.98)
int countEvents(TTree *t, TEventList &el)
double bestEffEvt(TTree *t, TString varname, TEventList &els, TEventList &elb, double &bestcut, double supr, int id)