#include "TMVA/Reader.h" #include "TFile.h" #include "TTree.h" #include "TString.h" #include "TRegexp.h" #include "TEventList.h" #include "TLeaf.h" #include #include #include #include #include #define MAX 1000 Float_t fbranch[MAX], freader[MAX]; Int_t ibranch[MAX], types[MAX]; Bool_t bbranch[MAX]; Int_t ev, run, mode, rec, nbranch; typedef std::map CountMap; typedef std::vector > ValueMap; // --------------------------------------------------------------- int gettype(TTree *t, TString varname) { if (t->GetBranch(varname)==0) return -1; TString leaftype = t->GetLeaf(varname)->GetTypeName(); if (leaftype=="Float_t") return 0; else if (leaftype=="Int_t") return 1; else if (leaftype=="Bool_t") return 2; return -1; } // --------------------------------------------------------------- int SplitString(TString s, TString delim, TString *toks, int maxtoks) { TObjArray *tok = s.Tokenize(delim); int N = tok->GetEntries(); for (int i=0;iAt(i))->String(); toks[i].ReplaceAll("\t",""); toks[i] = toks[i].Strip(TString::kBoth); } return N; } // --------------------------------------------------------------- int init(TTree *t, TString vars) { t->SetBranchAddress("ev",&ev); t->SetBranchAddress("run",&run); t->SetBranchAddress("mode",&mode); t->SetBranchAddress("recmode",&rec); TString toks[30]; int N = SplitString(vars," ",toks,30); for (int i=0;iSetBranchAddress(v, &(fbranch[i])); break; case 1: t->SetBranchAddress(v, &(ibranch[i])); break; case 2: t->SetBranchAddress(v, &(bbranch[i])); break; } //cout <SetBranchStatus("*",0); t->SetBranchStatus("ev",1); t->SetBranchStatus("run",1); t->SetBranchStatus("mode",1); t->SetBranchStatus("recmode",1); CountMap evcnt; for (int i=0;iGetEntry(el.GetEntry(i)); evcnt[uid(ev,run,mode)]+=1; } t->SetBranchStatus("*",1); return evcnt.size(); } // --------------------------------------------------------------- TString getFromCut(TString vars) { TString toks[50]; int n=SplitString(vars, "&&", toks, 50); TRegexp rvar("[_a-zA-Z][_a-zA-Z0-9]*"); TString res=" "; for (int i=0;iGet(treename); // prepare variables and branch mapping int Nbr = init(t,vars); TString varname[30]; SplitString(vars," ",varname,30); // prepare TMVA reader TMVA::Reader *reader = new TMVA::Reader("Silent"); for (int i=0;iAddVariable(varname[i], &freader[i]); reader->BookMVA("BDT",wfile); // initial number of S and B events TEventList elsall("elsall"), elball("elball"); t->Draw(">>elsall",sigcut); t->Draw(">>elball",bkgcut); float nsig = countEvents(t,elsall); float nbkg = countEvents(t,elball); // apply tag cut TString tagcut="tag"; if (precut!="") tagcut+="&&"+precut; t->Draw(">>el",tagcut); TEventList *el=(TEventList*)gDirectory->Get("el"); int N = el->GetN(); CountMap sigcnt, bkgcnt; ValueMap sigvals, bkgvals; // loop through TTree for (int i=0;iGetEntry(el->GetEntry(i)); if (i%10000==0) cout <<"#"<EvaluateMVA("BDT"); if (mode%1000==900) bkgvals.push_back( std::make_pair(mvares, uid(ev,run,mode) )); else sigvals.push_back( std::make_pair(mvares, uid(ev,run,mode) )); } sort(bkgvals.begin(), bkgvals.end()); int nbgmax = bglevel*n0b, i = bkgvals.size()-1; while ((int)bkgcnt.size()=0) bkgcnt[bkgvals[i--].second]+=1; double cut = bkgvals[i].first; for (i=0;i<(int)sigvals.size();++i) if (sigvals[i].first>cut) sigcnt[sigvals[i].second]+=1; cout < "<