void NCIdeogram::addTree(TTree *tree, const char *mu, const char *sigma) { TLeaf *leafMu = tree->FindLeaf(mu); TLeaf *leafSigma = tree->FindLeaf(sigma); TEventList *elist = tree->GetEventList(); Long64_t j,ix,nbr; nbr = elist ? elist->GetN() : tree->GetEntries(); for (j = 0; j < nbr; j++) { ix = elist ? elist->GetEntry(j) : j; tree->GetEntry(ix); addPoint(leafMu->GetValue(), leafSigma->GetValue()); } } // addTree()
////////////////////////// // Return all of the events as a big vector SEXP getEntries(SEXP eventList) { TEventList* el = checkForEventListWrapper(eventList); unsigned int l = el->GetN(); SEXP e; PROTECT( e = NEW_INTEGER(l) ); for ( unsigned int i = 0; i < l; ++i) { INTEGER(e)[i] = el->GetEntry(i); } UNPROTECT(1); return e; }
void listMatchedEvents(std::string fullPath, bool matchesonly = false) { // Essentially a sort of diff for reco and gen tree // May get slow for large trees as the search for the matching entry in the second tree // traverses the whole tree. This is because for merged trees the order is not guaranteed const int fVerbose(1); // Open file TFile *f = TFile::Open(fullPath.c_str()); if (f==0) { cout << "File " << fullPath << " not found -- exiting" << endl; return; } if(fVerbose>0) cout << "Succesfully opened file " << fullPath << endl; // Get TTree with GenEvents TTree* tgen = (TTree*) f->Get("genevents"); if(fVerbose>0) cout << "Got TTree with " << tgen->GetEntries() << " entries" << endl; // Do a cut, if needed //tgen->Draw(">>lst","ptmu1>3&&ptmu2>3&&TMath::Abs(etamu1)<2.5&&TMath::Abs(etamu2)<2.5"); tgen->Draw(">>lst",""); TEventList *lst; lst = (TEventList*)gDirectory->Get("lst"); tgen->SetEventList(lst); if(fVerbose>0) cout << " After cuts: " << lst->GetN() << " entries" << endl; // Get TTree with iRecoEvents TTree* treco = (TTree*) f->Get("events"); if(fVerbose>0) cout << "Got TTree with " << treco->GetEntries() << " entries" << endl; // set branch addresses int genrun, genls, genevt; tgen->SetBranchAddress("run",&genrun); tgen->SetBranchAddress("LS",&genls); tgen->SetBranchAddress("event",&genevt); int recorun, recols, recoevt; treco->SetBranchAddress("run",&recorun); treco->SetBranchAddress("LS",&recols); treco->SetBranchAddress("event",&recoevt); int mcmatch; treco->SetBranchAddress("isMCmatch",&mcmatch); double ptmu1, ptmu2, ptpr, ptpi; tgen->SetBranchAddress("ptmu1",&ptmu1); tgen->SetBranchAddress("ptmu2",&ptmu2); tgen->SetBranchAddress("ptpr",&ptpr); tgen->SetBranchAddress("ptpi",&ptpi); double etamu1, etamu2, etapr, etapi; tgen->SetBranchAddress("etamu1",&etamu1); tgen->SetBranchAddress("etamu2",&etamu2); tgen->SetBranchAddress("etapr",&etapr); tgen->SetBranchAddress("etapi",&etapi); double phimu1, phimu2, phipr, phipi; tgen->SetBranchAddress("phimu1",&phimu1); tgen->SetBranchAddress("phimu2",&phimu2); tgen->SetBranchAddress("phipr",&phipr); tgen->SetBranchAddress("phipi",&phipi); cout << "# run LS event genidx recoidx" << endl; cout << "---------- ---------- ---------- ---------- ----------" << endl; TLorentzVector tlvmu1, tlvmu2, tlvpr, tlvpi; tmph1 = new TH1F ("tmph1","tmphisto",20,3.096,3.098); tmph2 = new TH1F ("tmph2","tmphisto",20,1.112,1.120); tmph3 = new TH1F ("tmph3","tmphisto",20,5.61,5.64); tmph4 = new TH2F ("tmph4","tmphisto",20,0,5,20,-2,8); // outer loop on gen events for (int i=0; i!=lst->GetN(); i++) { tgen->GetEntry(lst->GetEntry(i)); tlvmu1.SetPtEtaPhiM(ptmu1,etamu1,phimu1,0.105658367); tlvmu2.SetPtEtaPhiM(ptmu2,etamu2,phimu2,0.105658367); tlvpr.SetPtEtaPhiM( ptpr, etapr, phipr ,0.938272013); tlvpi.SetPtEtaPhiM( ptpi, etapi, phipi ,0.13957018); tmph1->Fill((tlvmu1+tlvmu2).M()); tmph2->Fill((tlvpr+tlvpi).M()); tmph3->Fill((tlvmu1+tlvmu2+tlvpr+tlvpi).M()); tmph4->Fill((tlvpr+tlvpi).P(),tlvpr.P()-tlvpi.P()); //cout << (tlvmu1+tlvmu2).M() << " " << (tlvpr+tlvpi).M() << " " << (tlvmu1+tlvmu2+tlvpr+tlvpi).M() << endl; if (!matchesonly) cout << setw(10) << genrun << " " << setw(10) << genls << " " << setw(10) << genevt << " " << setw(10) << lst->GetEntry(i) << " "; // inner loop on reco events int nfound(0); for (int j=0; j!=treco->GetEntries(); j++) { treco->GetEntry(j); if(genrun==recorun && genls==recols && genevt==recoevt) { nfound++; if (matchesonly && nfound==1) cout << setw(10) << genrun << " " << setw(10) << genls << " " << setw(10) << genevt << " " << setw(10) << lst->GetEntry(i) << " "; if(nfound>1) cout << " " << setw(10) << lst->GetEntry(i) << " "; cout << setw(10) << j << " match: " << mcmatch << endl; } } if (!matchesonly && nfound==0) cout << " -" << endl; } c2 = new TCanvas(); c2->Divide(2,2); c2->cd(1); tmph1->Draw(); c2->cd(2); tmph2->Draw(); c2->cd(3); tmph3->Draw(); c2->cd(4); tmph4->Draw(); }
//this file stores the data events in our signal regions in several histograms //that are used by MT2Results_PlotsAndTables.C //can also choose to store files in control region or MC events //additionally it creates a log file with run:lumisection:eventnumber for all those events. void MakeDataFile(){ fLogStream = new std::ostringstream(); bool poisson = false;//set poissonian uncertainties, works from next root version on //decide on filename histograms are stored, also define the samples.dat gROOT->ProcessLine(".x SetStyle_PRD.C"); TString fOutDir = "../Results/Filtered/"; TString outputname = "NewDataNumbers.root"; if(ourfilter ) outputname = "NewDataNumbersOurFilter.root"; if(calometfilter) outputname = "NewDataNumbersOurFilterCaloMETfilter.root"; if(tobtecfilter ) outputname = "NewDataNumbersOurFilterCaloMETfilterTOBTECFilter.root"; if(poisson) outputname = "NewDataNumbersPoisson.root"; TString samples = "samples/samples_HTandMET_filter.dat"; //definition of the histograms map<string, TH1D*> histos; for(int i2 = 0; i2<signalregionsize; ++i2){ for(int i3 = 0; i3<HTbinsize; ++i3){ int NMT2bins; if(i3==0){ if(signal_region[i2]=="2j0b") NMT2bins = gNMT2bins_2j0b_lHT; if(signal_region[i2]=="2j1to2b") NMT2bins = gNMT2bins_2j1b_lHT; if(signal_region[i2]=="3to5j0b") NMT2bins = gNMT2bins_3j0b_lHT; if(signal_region[i2]=="3to5j1b") NMT2bins = gNMT2bins_3j1b_lHT; if(signal_region[i2]=="3to5j2b") NMT2bins = gNMT2bins_3j2b_lHT; if(signal_region[i2]=="6j0b") NMT2bins = gNMT2bins_6j0b_lHT; if(signal_region[i2]=="6j1b") NMT2bins = gNMT2bins_6j1b_lHT; if(signal_region[i2]=="6j2b") NMT2bins = gNMT2bins_6j2b_lHT; if(signal_region[i2]=="3b") NMT2bins = gNMT2bins_3b_lHT; } if(i3==1){ if(signal_region[i2]=="2j0b") NMT2bins = gNMT2bins_2j0b_mHT; if(signal_region[i2]=="2j1to2b") NMT2bins = gNMT2bins_2j1b_mHT; if(signal_region[i2]=="3to5j0b") NMT2bins = gNMT2bins_3j0b_mHT; if(signal_region[i2]=="3to5j1b") NMT2bins = gNMT2bins_3j1b_mHT; if(signal_region[i2]=="3to5j2b") NMT2bins = gNMT2bins_3j2b_mHT; if(signal_region[i2]=="6j0b") NMT2bins = gNMT2bins_6j0b_mHT; if(signal_region[i2]=="6j1b") NMT2bins = gNMT2bins_6j1b_mHT; if(signal_region[i2]=="6j2b") NMT2bins = gNMT2bins_6j2b_mHT; if(signal_region[i2]=="3b") NMT2bins = gNMT2bins_3b_mHT; } if(i3==2){ if(signal_region[i2]=="2j0b") NMT2bins = gNMT2bins_2j0b_hHT; if(signal_region[i2]=="2j1to2b") NMT2bins = gNMT2bins_2j1b_hHT; if(signal_region[i2]=="3to5j0b") NMT2bins = gNMT2bins_3j0b_hHT; if(signal_region[i2]=="3to5j1b") NMT2bins = gNMT2bins_3j1b_hHT; if(signal_region[i2]=="3to5j2b") NMT2bins = gNMT2bins_3j2b_hHT; if(signal_region[i2]=="6j0b") NMT2bins = gNMT2bins_6j0b_hHT; if(signal_region[i2]=="6j1b") NMT2bins = gNMT2bins_6j1b_hHT; if(signal_region[i2]=="6j2b") NMT2bins = gNMT2bins_6j2b_hHT; if(signal_region[i2]=="3b") NMT2bins = gNMT2bins_3b_hHT; } double MT2bins[NMT2bins+1]; if(i3==0){ if(signal_region[i2]=="2j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_2j0b_lHT[i0]; } if(signal_region[i2]=="2j1to2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_2j1b_lHT[i0]; } if(signal_region[i2]=="3to5j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j0b_lHT[i0]; } if(signal_region[i2]=="3to5j1b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j1b_lHT[i0]; } if(signal_region[i2]=="3to5j2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j2b_lHT[i0]; } if(signal_region[i2]=="6j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j0b_lHT[i0]; } if(signal_region[i2]=="6j1b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j1b_lHT[i0]; } if(signal_region[i2]=="6j2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j2b_lHT[i0]; } if(signal_region[i2]=="3b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3b_lHT[i0]; } } if(i3==1){ if(signal_region[i2]=="2j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_2j0b_mHT[i0]; } if(signal_region[i2]=="2j1to2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_2j1b_mHT[i0]; } if(signal_region[i2]=="3to5j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j0b_mHT[i0]; } if(signal_region[i2]=="3to5j1b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j1b_mHT[i0]; } if(signal_region[i2]=="3to5j2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j2b_mHT[i0]; } if(signal_region[i2]=="6j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j0b_mHT[i0]; } if(signal_region[i2]=="6j1b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j1b_mHT[i0]; } if(signal_region[i2]=="6j2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j2b_mHT[i0]; } if(signal_region[i2]=="3b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3b_mHT[i0]; } } if(i3==2){ if(signal_region[i2]=="2j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_2j0b_hHT[i0]; } if(signal_region[i2]=="2j1to2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_2j1b_hHT[i0]; } if(signal_region[i2]=="3to5j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j0b_hHT[i0]; } if(signal_region[i2]=="3to5j1b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j1b_hHT[i0]; } if(signal_region[i2]=="3to5j2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3j2b_hHT[i0]; } if(signal_region[i2]=="6j0b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j0b_hHT[i0]; } if(signal_region[i2]=="6j1b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j1b_hHT[i0]; } if(signal_region[i2]=="6j2b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_6j2b_hHT[i0]; } if(signal_region[i2]=="3b") { for(int i0 = 0; i0<=NMT2bins; ++i0) MT2bins[i0] = gMT2bins_3b_hHT[i0]; } } string hs = string("_") + HT_bin[i3] + string("_") + signal_region[i2]; string mapname = "MT2" + hs; if(histos.count(mapname) == 0 ) histos[mapname] = new TH1D(mapname.c_str(), "", NMT2bins, MT2bins); // if(poisson) histos[mapname]->SetBinErrorOption((TH1::EBinErrorOpt)1);//store already here the poissonian errors, works from next root version on }} for(map<string,TH1D*>::iterator h=histos.begin(); h!=histos.end();++h){ h->second->Sumw2();} //signal selection cuts std::ostringstream fCutStreamSignal; fCutStreamSignal << " " << "misc.MT2>=100" << "&&" << "misc.MET>=30" << "&&" << "misc.HT >=450" << "&&" << "NEles==0" << "&&" << "NMuons==0" << "&&" << "NTausIDLoose3Hits==0" << "&&" << "misc.Jet0Pass ==1" << "&&" << "misc.Jet1Pass ==1" << "&&" << "misc.PassJet40ID ==1" << "&&" << "NJetsIDLoose40 >=2" << "&&" << "misc.MinMetJetDPhi4Pt40 >0.3" << "&&" << "misc.Vectorsumpt < 70" << "&&" // Noise << "(misc.HBHENoiseFlag == 0 || misc.ProcessID==10)" << "&&" // for rare SM samples << "misc.CSCTightHaloIDFlag == 0" << "&&" << "misc.trackingFailureFlag==0" << "&&" << "misc.eeBadScFlag==0" << "&&" << "misc.EcalDeadCellTriggerPrimitiveFlag==0" << "&&" << "misc.TrackingManyStripClusFlag==0" << "&&" << "misc.TrackingTooManyStripClusFlag==0" << "&&" << "misc.TrackingLogErrorTooManyClustersFlag==0" << "&&" << "misc.CrazyHCAL==0"; fCutStreamSignal << "&&((misc.MET>=200&&misc.MT2>=200&&misc.HT<750)||(misc.HT>750))"; fCutStreamSignal << "&&NJetsIDLoose40>=2"; fCutStreamSignal << "&&misc.MET/misc.CaloMETRaw<=2."; TString cuts = fCutStreamSignal.str().c_str(); std::ostringstream triggerStream; triggerStream << "( ( ( " << "trigger.HLT_PFHT650_v5 == 1 || trigger.HLT_PFHT650_v6 == 1 || trigger.HLT_PFHT650_v7 == 1 || trigger.HLT_PFHT650_v8 == 1 || trigger.HLT_PFHT650_v9 == 1 || " << "trigger.HLT_PFNoPUHT650_v1 == 1 || trigger.HLT_PFNoPUHT650_v3 == 1 || trigger.HLT_PFNoPUHT650_v4 == 1) ||"; triggerStream << "( ( " << "trigger.HLT_PFMET150_v2 == 1 || trigger.HLT_PFMET150_v3 == 1 || trigger.HLT_PFMET150_v4 == 1 || " << "trigger.HLT_PFMET150_v5 == 1 || trigger.HLT_PFMET150_v6 == 1 || trigger.HLT_PFMET150_v7 == 1 )" << "||(" << "trigger.HLT_PFHT350_PFMET100_v3==1 || trigger.HLT_PFHT350_PFMET100_v4==1 || trigger.HLT_PFHT350_PFMET100_v5==1 || " << "trigger.HLT_PFHT350_PFMET100_v6==1 || trigger.HLT_PFHT350_PFMET100_v7==1 || trigger.HLT_PFNoPUHT350_PFMET100_v1==1 || " << "trigger.HLT_PFNoPUHT350_PFMET100_v3==1 || trigger.HLT_PFNoPUHT350_PFMET100_v4==1 ) ) )&&TOBTECTagger<=8&&ExtraBeamHaloFilter==0)"; TString trigger = triggerStream.str().c_str(); load(samples.Data()); int counterAll = 0; for(size_t i = 0; i < fSamples.size(); ++i){ string sampletype = (string)fSamples[i].type; if(sampletype!="data") continue;//run only over data - extendable to MC Double_t sample_weight = fSamples[i].xsection * fSamples[i].kfact * fSamples[i].lumi / (fSamples[i].nevents*fSamples[i].PU_avg_weight); if(fVerbose>2) cout << "ZnunuNumbers: looping over " << fSamples[i].name << " added in " << sampletype << endl; if(fVerbose>2) cout << " sample has weight " << sample_weight << " and " << fSamples[i].tree->GetEntries() << " entries" << endl; if(fVerbose>2 && fSamples[i].tree->GetEntries()==0) cout << "skip sample, has no entries" << endl; if(fSamples[i].tree->GetEntries()==0) continue; MT2tree* fMT2tree = new MT2tree(); fSamples[i].tree->SetBranchAddress("MT2tree", &fMT2tree); Long64_t nentries = fSamples[i].tree->GetEntries(); Long64_t nbytes = 0, nb = 0; int nev =0; TString myCuts = cuts;// + "&&" + basecuts; if( fSamples[i].type=="data") myCuts += " && " + trigger; //cuts to be aplied only on data cout << "Cuts for Flow: " << myCuts << endl; fSamples[i].tree->Draw(">>selList", myCuts); TEventList *myEvtList = (TEventList*)gDirectory->Get("selList"); fSamples[i].tree->SetEventList(myEvtList); int counter=0; cout << "Filtering done, size=" <<myEvtList->GetN() << endl; if(myEvtList->GetSize()==0) continue; *fLogStream << "Sample " << fSamples[i].name << endl; //run over all selected events while(myEvtList->GetEntry(counter++) !=-1){ int jentry = myEvtList->GetEntry(counter-1); nb = fSamples[i].tree->GetEntry(jentry); nbytes += nb; fSamples[i].tree->SetBranchAddress("MT2tree", &fMT2tree); if ( fVerbose>2 && counter % 5000 == 0 ) cout << "+++ Proccessing event " << counter << endl; string sHT;//HT region if(fMT2tree->misc.HT<450.) sHT = "_HTge0"; else if(fMT2tree->misc.HT<750.) sHT = "_lowHT"; else if(fMT2tree->misc.HT<1200.)sHT = "_mediumHT"; else sHT = "_highHT"; string ssignal;//topological region if(fMT2tree->NJetsIDLoose40 == 2 && fMT2tree->NBJets40CSVM == 0) ssignal = "_2j0b"; if(fMT2tree->NJetsIDLoose40 == 2 && fMT2tree->NBJets40CSVM >= 1) ssignal = "_2j1to2b"; if(fMT2tree->NJetsIDLoose40 >= 3 && fMT2tree->NJetsIDLoose40 <= 5 && fMT2tree->NBJets40CSVM == 0) ssignal = "_3to5j0b"; if(fMT2tree->NJetsIDLoose40 >= 3 && fMT2tree->NJetsIDLoose40 <= 5 && fMT2tree->NBJets40CSVM == 1) ssignal = "_3to5j1b"; if(fMT2tree->NJetsIDLoose40 >= 3 && fMT2tree->NJetsIDLoose40 <= 5 && fMT2tree->NBJets40CSVM == 2) ssignal = "_3to5j2b"; if( fMT2tree->NBJets40CSVM >= 3) ssignal = "_3b"; if(fMT2tree->NJetsIDLoose40 >= 6 && fMT2tree->NBJets40CSVM == 0) ssignal = "_6j0b"; if(fMT2tree->NJetsIDLoose40 >= 6 && fMT2tree->NBJets40CSVM == 1) ssignal = "_6j1b"; if(fMT2tree->NJetsIDLoose40 >= 6 && fMT2tree->NBJets40CSVM == 2) ssignal = "_6j2b"; string hh = sHT + ssignal; histos[(string)"MT2" + hh]->Fill(fMT2tree->misc.MT2);//fill histogram if(fMT2tree->misc.MT2>histos[(string)"MT2" + hh]->GetBinLowEdge(1)){ if(sHT=="_lowHT" && (fMT2tree->trigger.HLT_PFHT350_PFMET100_v3==1||fMT2tree->trigger.HLT_PFHT350_PFMET100_v4==1||fMT2tree->trigger.HLT_PFHT350_PFMET100_v5==1||fMT2tree->trigger.HLT_PFHT350_PFMET100_v6==1||fMT2tree->trigger.HLT_PFHT350_PFMET100_v7==1 || fMT2tree->trigger.HLT_PFNoPUHT350_PFMET100_v1==1 || fMT2tree->trigger.HLT_PFNoPUHT350_PFMET100_v3==1 || fMT2tree->trigger.HLT_PFNoPUHT350_PFMET100_v4==1 ) ) *fLogStream << "HTMHT "; else if(sHT=="_lowHT") *fLogStream << "MET "; else *fLogStream << "JetHT "; *fLogStream << int(fMT2tree->misc.Run) << ":" << int(fMT2tree->misc.LumiSection) << ":" << int(fMT2tree->misc.Event) << endl;//file log file (including trigger stream ++counterAll; } }//while delete fMT2tree; delete fSamples[i].tree; }//for samples cout << "add overflow to last bin" << endl; for(map<string,TH1D*>::iterator h=histos.begin(); h!=histos.end();++h){ h->second->SetBinContent(h->second->GetNbinsX(), h->second->GetBinContent(h->second->GetNbinsX() )+ h->second->GetBinContent(h->second->GetNbinsX()+1) ); h->second->SetBinError( h->second->GetNbinsX(), sqrt(h->second->GetBinError(h->second->GetNbinsX() )* h->second->GetBinError(h->second->GetNbinsX() )+ h->second->GetBinError(h->second->GetNbinsX()+1)* h->second->GetBinError(h->second->GetNbinsX()+1) )); } cout << "Saving." << endl; TFile *fsavefile = new TFile(fOutDir + outputname,"RECREATE"); fsavefile->cd(); for(map<string,TH1D*>::iterator h=histos.begin(); h!=histos.end();++h){ h->second->Write(); } fsavefile->Close(); cout << "Saved histograms in " << fOutDir << outputname << endl; TString logname ="eventlistMT2inclusive.log"; cout << counterAll << " events in " << logname.Data() << endl; ofstream f_log (logname.Data(), ios::trunc); f_log << fLogStream->str(); }
void Plot(Char_t *filen = "jsf.root") { //gROOT->Reset(); gSystem->Load("libS4Utils.so"); gSystem->Load("libAnlib.so"); Int_t nZoneX = 4; Int_t nZoneY = 3; TCanvas *c1 = new TCanvas("c1","",0,0, 300*nZoneX, 300*nZoneY); c1->SetHighLightColor(5); c1->SetFillColor(19); c1->Divide(nZoneX,nZoneY); gStyle->SetOptFit(); cerr << filen << endl; TFile *filep = new TFile(filen); TNtupleD *tup = (TNtupleD *)gROOT->FindObject("hEvt"); //-- // Preselection //-- #if 0 TString sel("evis>0."); #else TString sel("pt<20.&&abs(pl)<30.&&ycut>0.0015"); #endif tup->Draw(">>elist",sel.Data(),"goff"); TEventList *elist = static_cast<TEventList*>(gROOT->FindObject("elist")); Int_t nlist = elist->GetN(); cerr << "Nevent = " << nlist << endl; //-- // Loop over preselected events //-- Double_t kToDeg = 180./TMath::Pi(); for (Int_t i=0; i<nlist; i++) { #if 0 Int_t event = elist->GetEntry(i); cerr << "i = " << i << " event = " << event << endl; #else Int_t event = i; #endif Double_t ntracks; Double_t evis; Double_t pt; Double_t pl; Double_t ycut; Double_t chi2; Double_t mh; Double_t mw1; Double_t mw2; Double_t mt1; Double_t mt2; Double_t mtt; tup->SetBranchAddress("ntracks",&ntracks); tup->SetBranchAddress("evis",&evis); tup->SetBranchAddress("pt",&pt); tup->SetBranchAddress("pl",&pl); tup->SetBranchAddress("ycut",&ycut); tup->SetBranchAddress("chi2",&chi2); tup->SetBranchAddress("mh",&mh); tup->SetBranchAddress("mw1",&mw1); tup->SetBranchAddress("mw2",&mw2); tup->SetBranchAddress("mt1",&mt1); tup->SetBranchAddress("mt2",&mt2); tup->SetBranchAddress("mtt",&mtt); tup->GetEntry(event); hMhMw->Fill(mh, mw1, 1.); hMwMw->Fill(mw1, mw2, 1.); hMtMt->Fill(mt1, mt2, 1.); hEvis->Fill(evis, 1.); hPtPl->Fill(pt, pl, 1.); hMttMh->Fill(mtt, mh, 1.); } Int_t id = 0; id++; c1->cd(id); hStat->Draw(); id++; c1->cd(id); hMhMw->Draw(); id++; c1->cd(id); hMhMw->ProjectionX()->Draw(); id++; c1->cd(id); hMhMw->ProjectionY()->Draw(); id++; c1->cd(id); hEvis->Draw(); id++; c1->cd(id); hMwMw->Draw(); id++; c1->cd(id); hMwMw->ProjectionX()->Draw(); id++; c1->cd(id); hMwMw->ProjectionY()->Draw(); id++; c1->cd(id); hMtMt->Draw(); id++; c1->cd(id); hMtMt->ProjectionX()->Draw(); id++; c1->cd(id); hMtMt->ProjectionY()->Draw(); id++; c1->cd(id); hMttMh->ProjectionX()->Draw(); }
//call this macro via root -l -b -q AddBranchEventsMT2tree.C++ //This code takes a text file containing run:lumisection:event:taggervalue (tagger value is a new filter you want to add to your tree), //an old MT2tree file that does not contain that tagger // and creates a new MT2tree file, which is a copy of the old one and contains additionally that tagger. void AddBranchEventsMT2tree() { // Example of Root macro to copy a subset of a Tree to a new Tree // Only selected entries are copied to the new Tree. // The input file has been generated by the program in $ROOTSYS/test/Event // with Event 1000 1 99 1 //Author: Rene Brun //modified: Hannsjoerg Weber, 28/08/2013 //make cleaning // get eventlist to clean // vector contains <run, < <lumisection, event>, taggervalue > > vector<pair<pair<int,pair<int,int> >,float> > rls; rls.clear(); char buffer[200]; ifstream filterdat("/shome/haweber/AODFiles_MT2SR/taggerlist/ControlRegionSinglePhotonPart1.dat"); while( filterdat.getline(buffer, 200, '\n') ){ int rrun(-1), lls(-1), eevent(-1), d1(-1); float ttagger(-1); sscanf(buffer, "*\t%d\t*\t%d\t*\t%d\t*\t%d\t*\t%f", &d1, &eevent, &lls, &rrun, &ttagger); pair<int,int> t1(lls,eevent); pair<int,pair<int,int> > t2(rrun,t1); pair<pair<int,pair<int,int> >, float> t3(t2,ttagger); rls.push_back(t3); } cout << "Events for filtering " << rls.size() << endl; // get the old rootfile including events that should be tagged and define new event file including tagger variable TString oldfilename = "/shome/haweber/MT2Analysis/MT2trees/MT2_V02-03-02/20130914_8TeV_1g_removed/lowHT/SinglePhoton-Run2012C-PromptReco-v2-2.root"; TString newfilename = "/shome/haweber/MT2Analysis/MT2trees/MT2_V02-03-02/20130914_8TeV_1g_removed/lowHT/SinglePhoton-Run2012C-PromptReco-v2-2_Filter.root"; // if you want to apply an additional event selection, define cuts here std::ostringstream cutStream; std::ostringstream cutStreamBase; cutStream << " " << "NTausIDLoose3Hits+NMuons+NEles==0" << "&&" << "misc.Jet0Pass==1&&misc.Jet1Pass==1" << "&&" << "misc.Vectorsumpt<70&& misc.MinMetJetDPhi4Pt40 >0.3"; cutStream << "&&((misc.MET>200&&misc.HT<=750&&misc.HT>=450&&misc.MT2>200)||(misc.HT>750&&misc.MET>30&&misc.MT2>=100))"; cutStreamBase << " " << "misc.PassJet40ID ==1" << "&&" << "(misc.HBHENoiseFlag == 0 || misc.ProcessID==10)" << "&&" // not there for fastsim (i.e. signal) << "misc.CSCTightHaloIDFlag == 0" << "&&" << "misc.trackingFailureFlag==0" << "&&" << "misc.eeBadScFlag==0" << "&&" << "misc.EcalDeadCellTriggerPrimitiveFlag==0" << "&&" << "misc.TrackingManyStripClusFlag==0" << "&&" << "misc.TrackingTooManyStripClusFlag==0" << "&&" << "misc.TrackingLogErrorTooManyClustersFlag==0" << "&&" << "misc.CrazyHCAL==0"; TString cuts = cutStream.str().c_str(); TString basecuts = cutStreamBase.str().c_str(); // TString myCuts = cuts + "&&" + basecuts;// if cuts should be applied DO NOT comment this line TString myCuts = "";// if no cuts should be applied DO NOT comment this line //Get old file, old tree and set top branch address TFile *oldfile = new TFile(oldfilename.Data()); TTree *oldtree = (TTree*)oldfile->Get("MassTree"); MT2tree* fMT2tree = new MT2tree(); oldtree->SetBranchAddress("MT2tree", &fMT2tree); Long64_t nentries = oldtree->GetEntries(); Long64_t nbytes = 0, nb = 0; int nev =0; //Create a new file + a clone of old tree in new file Float_t TOBTECTagger(-1); Float_t HOTagger(-1); Bool_t ExtraBeamHaloFilter(false); TFile *newfile = new TFile(newfilename.Data(),"RECREATE"); TTree *newtree = oldtree->CloneTree(0);//clone all branches, but no event TBranch *newBranch = newtree->Branch("TOBTECTagger", &TOBTECTagger, "TOBTECTagger/F"); TBranch *newBranch2 = newtree->Branch("ExtraBeamHaloFilter", &ExtraBeamHaloFilter, "ExtraBeamHaloFilter/O"); TBranch *newBranch3 = newtree->Branch("HOTagger", &HOTagger, "HOTagger/F"); oldtree->Draw(">>selList", myCuts); TEventList *myEvtList = (TEventList*)gDirectory->Get("selList"); oldtree->SetEventList(myEvtList); int counter=0; int numEvt = myEvtList->GetN(); int printEvt = 100000; if(myEvtList->GetN()<1000000) printEvt = myEvtList->GetN()/25; cout << "Filtering done, size=" <<myEvtList->GetN() << endl; while(myEvtList->GetEntry(counter++) !=-1){ int jentry = myEvtList->GetEntry(counter-1); nb = oldtree->GetEntry(jentry); nbytes += nb; oldtree->SetBranchAddress("MT2tree", &fMT2tree); if(counter%printEvt==0) cout << "Process event " << counter << endl; //make cleaning bool keep = true; int p=-1; for(int nn=0; nn<rls.size();++nn){ if((rls[nn].first).first!=fMT2tree->misc.Run) continue; // --> run over matching if(((rls[nn].first).second).first!=fMT2tree->misc.LumiSection) continue; // --> LS over matching if(fMT2tree->misc.Event>0){ if(((rls[nn].first).second).second==fMT2tree->misc.Event) { TOBTECTagger = rls[nn].second; keep=false; p=nn; break; } } else{ //if event > INT_MAX correct overflow back. int evtt = ((rls[nn].first).second).second + INT_MAX; evtt = evtt - INT_MAX; if(evtt==fMT2tree->misc.Event) {keep=false; p=nn; break;} } } //two additional taggers bool beamhalo = false; float ho = fMT2tree->misc.MET/fMT2tree->misc.CaloMETRaw; if(fMT2tree->misc.CaloMETRaw<=0) ho=999.; HOTagger = ho; if(fMT2tree->jet[0].lv.DeltaPhi(fMT2tree->jet[1].lv)<0.2 && !(fMT2tree->jet[0].isPFIDMedium)) beamhalo = true; ExtraBeamHaloFilter = beamhalo; if(keep) TOBTECTagger = -1; newtree->Fill(); if(!keep){ //remove event from rls vector --> increases speed. int tt = p; rls.erase(rls.begin()+p); } } newtree->Print(); newtree->AutoSave(); delete oldfile; delete newfile; }
//GetBEfficiency input histograms for pt binned only (1d), pt and eta binned (2d), pt binned in eta slices (1d) void GetBEfficiency_InputHistograms(){ gROOT->ProcessLine(".x SetStyle_PRD.C"); gROOT->SetStyle("Plain"); gStyle->SetOptStat(0); bool runQCD = false;//set false if want to save some time //useful if look at high MT2 bool onlyQCD = false;//set false if want to save some time //useful if look at high MT2 bool calcsusy = true;//at the moment has no genflavour // skip it bool runData = false;//set false if want to save some time //at the moment not used, only for xchecks bool fHT = true;//to change htskim bool fMET = false; //to change metskim bool fChange = true; //use this only if you want to change the skims by hand //not implemented here, yet bool ttbarxsecup = false; bool ttbarxsecdown = false; bool wjetsxsecup = false; bool wjetsxsecdown = false; // TString samples = "/shome/haweber/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samples_Stop_53X_0bMET30_corr.dat";//Dileptons // TString samples = "/shome/haweber/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samples_type1MET_CHS_53X_MET.dat";//MET // TString samples = "/shome/haweber/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samples_type1MET_CHS_53X_HT.dat";//HT // TString samples = "/shome/haweber/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samples_type1MET_CHS_53X_MET_newTTbar.dat";//MET TString samples = "/dataLOCAL/paktinat/Projects/MT2/MT2_V02-03-02/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samplesMine.dat";//HT // TString samples = "/shome/haweber/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samples_type1MET_CHS_53X_METorHT.dat";//HT TString outputdir = "/dataLOCAL/paktinat/Projects/MT2/MT2_V02-03-02/MT2Analysis/Code/Efficiencies/InputHistos/";//if not empty end with slash // TString outputdir = "/shome/haweber/MT2Analysis_8TeV/Code/Efficiencies/test/InputHistos/";//if not empty end with slash Util::MakeOutputDir(outputdir); // TString outputname = "BEfficiencies_histos_DileptonicStop_CSVM.root"; // TString outputname = "BEfficiencies_histos_ge2jets_0l_CSVM_HT750orMET200_MinDPhiPt40_noQCD.root"; // TString outputname = "BEfficiencies_histos_ge2jets_0l_CSVM_HT750orMET200_MinDPhi4_noQCD.root"; // TString outputname = "BEfficiencies_histos_ge2jets_CSVM_HT750orMET200_MinDPhiPt40_noQCD.root"; // TString outputname = "BEfficiencies_histos_ge2jets_CSVM_HT750orMET200_MinDPhi4.root"; // TString outputname = "BEfficiencies_histos_ge2jets_CSVM_HT450andMET200_MinDPhi4_newTTbar.root"; TString outputname = "BEfficiencies_histos_ge2jets_CSVM_HT750andMET30_MinDPhi4_newTTbar_noQCD.root"; // TString outputname = "BEfficiencies_histos_HT_ge3jets_0l_CSVM_allMT2_MinDPhi40.root"; // TString outputname = "BEfficiencies_histos_HT_ge3jets_0l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_HT_ge3jets_ge1l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_HT_ge6jets_0l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_HT_ge6jets_ge1l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_HT_eq2jets_0l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_HT_eq2jets_ge1l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_HT_ge3jets_0l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_HT_ge3jets_ge1l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_HT_ge6jets_0l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_HT_ge6jets_ge1l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_HT_eq2jets_0l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_HT_eq2jets_ge1l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_HT_ge3jets_0l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_HT_ge3jets_ge1l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_HT_ge6jets_0l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_HT_ge6jets_ge1l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_HT_eq2jets_0l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_HT_eq2jets_ge1l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_MET_ge3jets_0l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_MET_ge3jets_ge1l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_MET_ge6jets_0l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_MET_ge6jets_ge1l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_MET_eq2jets_0l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_MET_eq2jets_ge1l_CSVM_allMT2.root"; // TString outputname = "BEfficiencies_histos_MET_ge3jets_0l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_MET_ge3jets_ge1l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_MET_ge6jets_0l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_MET_ge6jets_ge1l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_MET_eq2jets_0l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_MET_eq2jets_ge1l_CSVM_MT2lt125.root"; // TString outputname = "BEfficiencies_histos_MET_ge3jets_0l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_MET_ge3jets_ge1l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_MET_ge6jets_0l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_MET_ge6jets_ge1l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_MET_eq2jets_0l_CSVM_MT2ge125.root"; // TString outputname = "BEfficiencies_histos_MET_eq2jets_ge1l_CSVM_MT2ge125.root"; int btaggername = 4; //0: TCHE, 1: TCHP, 2: SSVHE, 3: SSVHP, 4: CSV, 5: JP //CSV: L: 0.244, M: 0.679, T: 0.898 //JP: L: 0.275, M: 0.545, T: 0.790 //TCHPT: 3.41, SSVHEM: 1.74, SSVHPT: 2.00 double bdiscr_value = 0.679; int WP = 1;// WP: 0: loose, 1: medium, 2: tight double bpt = 20.; double beta = 2.4; const int Nptbins = 17; double ptbins[Nptbins+1] = {20, 30, 40, 50, 60, 70, 80, 100, 120, 160, 210, 260, 320, 400, 500, 600, 800, 1000}; // const int Nptbins = 16; double ptbins[Nptbins+1] = {20, 30, 40, 50, 60, 70, 80, 100, 120, 160, 210, 260, 320, 400, 500, 670, 750}; const int NetabinsL = 4; double etabinsL[NetabinsL+1] = {0.0, 0.5, 1.0, 1.5, 2.4}; const int NetabinsM = 3; double etabinsM[NetabinsM+1] = {0.0, 0.8, 1.6, 2.4}; const int NetabinsT = 1; double etabinsT[NetabinsT+1] = {0.0, 2.4}; map<string, TH2D*> histos2d; map<string, TH1D*> histospt; const int sampletypesize = 10; string sample_type[sampletypesize] = {"QCD", "WJets", "ZJets", "TTbar", "SingleTop", "Other", "mc", "mcNOqcd", "susy", "data"};//same as type in samples.dat const int prefixsize = 10; string prefix[10] = {"B", "C", "L", "NonB", "All", "BTaggedB", "BTaggedC", "BTaggedL", "BTaggedNonB", "BTaggedAll"}; for(int is = 0; is<sampletypesize; ++is){ for(int js = 0; js<10; ++js){ string hs = string("_") + sample_type[is]; string mapname; mapname = prefix[js] + "Jet" + hs; if(WP==0 && histos2d.count(mapname) == 0 ) histos2d[mapname] = new TH2D((mapname+string("_2d")).c_str(), "eff", Nptbins, ptbins, NetabinsL, etabinsL); if(WP==1 && histos2d.count(mapname) == 0 ) histos2d[mapname] = new TH2D((mapname+string("_2d")).c_str(), "eff", Nptbins, ptbins, NetabinsM, etabinsM); if(WP==2 && histos2d.count(mapname) == 0 ) histos2d[mapname] = new TH2D((mapname+string("_2d")).c_str(), "eff", Nptbins, ptbins, NetabinsT, etabinsT); if( histospt.count(mapname) == 0 ) histospt[mapname] = new TH1D( mapname.c_str(), "eff", Nptbins, ptbins); } } for(map<string,TH2D*>::iterator h=histos2d.begin(); h!=histos2d.end();++h){ //cout << "Load " << h->first << endl; h->second->Sumw2();} for(map<string,TH1D*>::iterator h=histospt.begin(); h!=histospt.end();++h){ //cout << "Load " << h->first << endl; h->second->Sumw2();} cout << "Histograms loaded" << endl; std::ostringstream cutStream; cutStream << " " << "(misc.ProcessID!=6||(misc.Event!=1689009&&misc.Event!=2275452&&misc.Event!=1946785&&misc.Event!=1936763&&misc.Event!=1890738&&misc.Event!=1757319))" << "&&" //summer QCD 53X << "(misc.ProcessID!=10||(Susy.MassChi==350&&Susy.MassLSP==50))" << "&&" // T2bb M_stop = 350, M_lsp = 50 // << "(misc.ProcessID!=10||(Susy.MassChi==600&&Susy.MassLSP==50))" << "&&" // T2bb M_stop = 600, M_lsp = 50 // << "misc.MT2 >=0" << "&&" // << "misc.MT2 < 125" << "&&" // << "misc.MT2 >=125" << "&&" << "misc.MET>=30" << "&&" << "misc.HT>=450" << "&&" << "misc.Jet0Pass ==1" << "&&" << "misc.Jet1Pass ==1" << "&&" // << "misc.SecondJPt >100" << "&&" << "misc.PassJetID ==1" << "&&" << "misc.Vectorsumpt < 70" << "&&" // << "(NJetsIDLoose40 +NEles +NMuons)>=3" << "&&" << "misc.MinMetJetDPhi4>0.3" << "&&" // << "misc.MinMetJetDPhiPt40>0.3" << "&&" // << "NBJetsCSVM >=1" << "&&" // JetSkim << "NJetsIDLoose40 >=2" << "&&" // << "NJetsIDLoose40 >=3" << "&&" // << "NJetsIDLoose40 >=6" << "&&" // << "NJetsIDLoose40 ==2" << "&&" // HTskim // << "misc.HT >=750" << "&&" // METskim // << "misc.MET >=200" << "&&" // LeptonSkim // << "(NEles+NMuons) ==0" << "&&" // << "(NEles+NMuons) >=1" << "&&" // Stop Skim ------------------------- // << "NJetsIDLoose40 >=2" << "&&" // << "(NEles+NMuons) >=2" << "&&" // << "NBJetsCSVM >=1" << "&&" // << "NJetsIDLoose40 >=3" << "&&" // Noise -- first 6 are official filters << "( misc.ProcessID==10 || misc.HBHENoiseFlag == 0)" << "&&" << "misc.CSCTightHaloIDFlag == 0" << "&&" << "(misc.ProcessID==10||misc.hcalLaserEventFlag==0)" << "&&" // << "(misc.isFastSim || misc.HBHENoiseFlag == 0)" << "&&" // << "(misc.isFastSim || misc.CSCTightHaloIDFlag == 0)" << "&&" // << "(misc.isFastSim || misc.hcalLaserEventFlag == 0)" << "&&" << "misc.trackingFailureFlag == 0" << "&&" << "misc.eeBadScFlag == 0" << "&&" << "misc.EcalDeadCellTriggerPrimitiveFlag == 0"; TString cuts = cutStream.str().c_str(); /* std::ostringstream triggerStreamEE; triggerStreamEE << "( " << "(trigger.HLT_DiElectrons==1)" << " )"; TString triggerEE = triggerStreamEE.str().c_str(); std::ostringstream triggerStreamEMu; triggerStreamEMu << "( " << "(trigger.HLT_EMu==1)" << " )"; TString triggerEMu = triggerStreamEMu.str().c_str(); std::ostringstream triggerStreamMuMu; triggerStreamMuMu << "( " << "(trigger.HLT_DiMuons==1)" << " )"; TString triggerMuMu = triggerStreamMuMu.str().c_str(); *//* std::ostringstream triggerStream; triggerStream << "( " << "trigger.HLT_PFHT650_v5 == 1 || trigger.HLT_PFHT650_v6 == 1 || trigger.HLT_PFHT650_v7 == 1 || " << "trigger.HLT_PFHT650_v8 == 1 || trigger.HLT_PFHT650_v9 == 1 || " << "trigger.HLT_PFNoPUHT650_v1 == 1 || trigger.HLT_PFNoPUHT650_v3 == 1)"; TString trigger = triggerStream.str().c_str(); */ std::ostringstream triggerStream; triggerStream << "( " << "trigger.HLT_PFMET150_v2 == 1 || trigger.HLT_PFMET150_v3 == 1 || trigger.HLT_PFMET150_v4 == 1 || " << "trigger.HLT_PFMET150_v5 == 1 || trigger.HLT_PFMET150_v6 == 1 || trigger.HLT_PFMET150_v7 == 1 )"; TString trigger = triggerStream.str().c_str(); load(samples.Data()); for(size_t i = 0; i < fSamples.size(); ++i){ if(runData==false && fSamples[i].type=="data") continue; if(calcsusy==false && fSamples[i].type=="susy") continue; if(runQCD==false && fSamples[i].sname=="QCD") continue; if(onlyQCD==true && fSamples[i].sname!="QCD" && runQCD) continue; string sampletype = (string)fSamples[i].type; bool METskim = false; bool HTskim = false; TString path = fSamples[i].file->GetName(); if(path.Contains("METskim")) METskim = true; if(path.Contains("HTskim")) HTskim = true; if(fChange){ if(fHT) { HTskim = true; METskim = false; } if(fMET) { HTskim = false; METskim = true; } if(!(fMET || fHT)) { HTskim = false; METskim = false; } } // cout << true << " " << path << " " << METskim << " " << HTskim << endl; if(!(METskim || HTskim)) continue; if(sampletype==(string)"mc"){ if(fSamples[i].sname=="QCD") sampletype = (string)fSamples[i].sname; else if(fSamples[i].sname=="Wtolnu") sampletype = (string)"WJets"; else if(fSamples[i].sname=="DY") sampletype = (string)"ZJets"; else if(fSamples[i].name=="TTbar") sampletype = (string)"TTbar"; else if(fSamples[i].name=="TTbar_Had") sampletype = (string)"TTbar"; else if(fSamples[i].name=="TTbar_SemiLep") sampletype = (string)"TTbar"; else if(fSamples[i].name=="TTbar_FullyLep") sampletype = (string)"TTbar"; else if(fSamples[i].sname=="TTbarV") sampletype = (string)"TTbar"; else if(fSamples[i].sname=="Top") sampletype = (string)"SingleTop";//no ttbar //else if(fSamples[i].sname=="VV" || fSamples[i].sname=="VVV") sampletype = (string)"VV/VVV"; else sampletype = (string)"Other"; } // if(sampletype==(string)"susy") sampletype=(string)"Stop"; Double_t sample_weight = fSamples[i].xsection * fSamples[i].kfact * fSamples[i].lumi / (fSamples[i].nevents); if(fVerbose>2) cout << "B-Efficiency: looping over " << fSamples[i].name << endl; if(fVerbose>2) cout << " sample has weight " << sample_weight << " and " << fSamples[i].tree->GetEntries() << " entries" << endl; if(fVerbose>2 && fSamples[i].tree->GetEntries()==0) cout << "skip sample, has no entries" << endl; if(fSamples[i].tree->GetEntries()==0) continue; MT2tree* fMT2tree = new MT2tree(); fSamples[i].tree->SetBranchAddress("MT2tree", &fMT2tree); Long64_t nentries = fSamples[i].tree->GetEntries(); Long64_t nbytes = 0, nb = 0; int nev =0; TString myCuts = cuts; if(HTskim) myCuts = myCuts + " && misc.HT>750"; if(METskim) myCuts = myCuts + " && misc.HT<=750 && misc.MET>200";//METskim excluding HTskim /* if( fSamples[i].type=="data" && fSamples[i].sname=="EE-Data") { myCuts += " && " + triggerEE; }//cuts to be aplied only on data else if( fSamples[i].type=="data" && fSamples[i].sname=="EMu-Data") { myCuts += " && " + triggerEMu; }//cuts to be aplied only on data else if( fSamples[i].type=="data" && fSamples[i].sname=="MuMu-Data") { myCuts += " && " + triggerMuMu; } //cuts to be aplied only on data else if(fSamples[i].type=="data") {cout << "data not usuable" << " type " << fSamples[i].type << " Sname " << fSamples[i].sname << endl; continue; }//not */ if( fSamples[i].type=="data") { myCuts += " && " + trigger; } cout << "Cuts for Flow: " << myCuts << endl; fSamples[i].tree->Draw(">>selList", myCuts); TEventList *myEvtList = (TEventList*)gDirectory->Get("selList"); fSamples[i].tree->SetEventList(myEvtList); int counter=0; cout << "Filtering done, size=" <<myEvtList->GetN() << endl; if(myEvtList->GetSize()==0) continue; while(myEvtList->GetEntry(counter++) !=-1){ int jentry = myEvtList->GetEntry(counter-1); nb = fSamples[i].tree->GetEntry(jentry); nbytes += nb; fSamples[i].tree->SetBranchAddress("MT2tree", &fMT2tree); if ( fVerbose>2 && counter % 50000 == 0 ) cout << "+++ Proccessing event " << counter << endl; //if((fSamples[i].sname!="VVV"&&fSamples[i].sname!="TTbarV" && fSamples[i].type!="susy"&&sampletype!="Stop") && fMT2tree->misc.HBHENoiseFlag!=0 ) continue;//test //if((fSamples[i].sname!="VVV"&&fSamples[i].sname!="TTbarV" && fSamples[i].type!="susy"&&sampletype!="Stop") && fMT2tree->misc.hcalLaserEventFlag!=0) continue;//test Double_t weight = sample_weight; if (!fMT2tree->misc.isData ) weight = weight * fMT2tree->pileUp.Weight; // pile-up reweighting for MC /* Bool_t recoedee = false;// exact 2 ele, 0 muo Bool_t recoedemu = false;// exact 1 ele, 1 muo Bool_t recoedmumu = false;// exact 0 ele, 2 muo //change this - might have some inefficiencies - three leptons with one not passing IDMedium==1 //20-20 selection --> third lepton is 10 GeV if(fMT2tree->NEles>=2 &&fMT2tree->ele[0].lv.Pt()>20&&fMT2tree->ele[1].lv.Pt()>20&&fMT2tree->ele[2].lv.Pt()<20&&(fMT2tree->NMuons==0||fMT2tree->muo[0].lv.Pt()<10) && fMT2tree->ele[0].IDMedium==1 && fMT2tree->ele[1].IDMedium==1) recoedee = true; if(fMT2tree->NMuons>=2&&fMT2tree->muo[0].lv.Pt()>20&&fMT2tree->muo[1].lv.Pt()>20&&fMT2tree->muo[2].lv.Pt()<10&&(fMT2tree->NEles ==0||fMT2tree->ele[0].lv.Pt()<10)) recoedmumu = true; if(fMT2tree->NMuons>=1&&fMT2tree->muo[0].lv.Pt()>20&&fMT2tree->muo[1].lv.Pt()<10&&fMT2tree->NEles>=1 &&fMT2tree->ele[0].lv.Pt()>20&&fMT2tree->ele[1].lv.Pt()<10 && fMT2tree->ele[0].IDMedium==1) recoedemu = true;//XXX change emu to 20/20 selection, left ee,mumu at 20/10 for now //id cuts? Bool_t recoedosee = false;// opposite sign Bool_t recoedosemu = false;// opposite sign Bool_t recoedosmumu = false;// opposite sign if(recoedee && (fMT2tree->ele[0].Charge)*(fMT2tree->ele[1].Charge)==(-1)) recoedosee = true; if(recoedemu && (fMT2tree->ele[0].Charge)*(fMT2tree->muo[0].Charge)==(-1)) recoedosemu = true; if(recoedmumu && (fMT2tree->muo[0].Charge)*(fMT2tree->muo[1].Charge)==(-1)) recoedosmumu = true; Bool_t recoedeenZ = false;// off Z Bool_t recoedemunZ = false;// off Z -> is not requirement, so this variable should be useless Bool_t recoedmumunZ = false;// off Z if(recoedee && ((fMT2tree->ele[0].lv + fMT2tree->ele[1].lv).M()<81 || (fMT2tree->ele[0].lv + fMT2tree->ele[1].lv).M()>101) ) recoedeenZ = true; if(recoedemu && ((fMT2tree->ele[0].lv + fMT2tree->muo[0].lv).M()<81 || (fMT2tree->ele[0].lv + fMT2tree->muo[0].lv).M()>101) ) recoedemunZ = true; if(recoedmumu && ((fMT2tree->muo[0].lv + fMT2tree->muo[1].lv).M()<81 || (fMT2tree->muo[0].lv + fMT2tree->muo[1].lv).M()>101) ) recoedmumunZ = true; if(!(recoedee) && !(recoedemu) && !(recoedmumu) ) continue;//require dilepton if(!(recoedosee) && !(recoedosemu) && !(recoedosmumu) ) continue;//require os-dilepton, maybe comment this for background est. if(recoedee && !(fMT2tree->misc.isData) ) weight = 0.960 * weight * 0.953366;//from SSb Florida if(recoedemu && !(fMT2tree->misc.isData) ) weight = 0.934 * weight;//from SSb Florida if(recoedmumu && !(fMT2tree->misc.isData) ) weight = 0.875 * weight * 1.031213;//from SSb Florida */ if(wjetsxsecup ==true && fSamples[i].sname=="Wtolnu") weight = weight*0.7; if(wjetsxsecdown==true && fSamples[i].sname=="Wtolnu") weight = weight*1.3; if(ttbarxsecup ==true && fSamples[i].name== "TTbar" ) weight = weight*0.85; if(ttbarxsecdown==true && fSamples[i].name== "TTbar" ) weight = weight*1.15; for(int k = 0; k<fMT2tree->NJets; ++k){ if(fMT2tree->jet[k].isPFIDLoose==false) continue; if(fMT2tree->jet[k].Flavour<=-7777 && fMT2tree->misc.isData==false) continue;//MC sample veto if no btagging information if(abs(fMT2tree->jet[k].Flavour>100)) cout << "jet " << k << "has flavour " << fMT2tree->jet[k].Flavour << endl; float btagdiscr=-1; if(btaggername==0) btagdiscr = fMT2tree->jet[k].bTagProbTCHE; else if(btaggername==1) btagdiscr = fMT2tree->jet[k].bTagProbTCHP; else if(btaggername==2) btagdiscr = fMT2tree->jet[k].bTagProbSSVHE; else if(btaggername==3) btagdiscr = fMT2tree->jet[k].bTagProbSSVHP; else if(btaggername==4) btagdiscr = fMT2tree->jet[k].bTagProbCSV; else if(btaggername==5) btagdiscr = fMT2tree->jet[k].bTagProbJProb; else btagdiscr = fMT2tree->jet[k].bTagProbCSV; float jetpt = fMT2tree->jet[k].lv.Pt(); float jeteta= fabs(fMT2tree->jet[k].lv.Eta() ); //float jetMT2= fMT2tree->misc.MT2; int jetabsflavour = abs(fMT2tree->jet[k].Flavour); if(jetpt<bpt) continue; if(jeteta>beta) continue; histospt[string("AllJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("AllJet_") + sampletype]->Fill(jetpt, jeteta, weight ); if(jetabsflavour==5){ histospt[string("BJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("BJet_") + sampletype]->Fill(jetpt, jeteta, weight ); } else if(jetabsflavour==4){ histospt[string("CJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("CJet_") + sampletype]->Fill(jetpt, jeteta, weight ); } else{ histospt[string("LJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("LJet_") + sampletype]->Fill(jetpt, jeteta, weight ); } if(btagdiscr>=bdiscr_value){ histospt[string("BTaggedAllJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("BTaggedAllJet_") + sampletype]->Fill(jetpt, jeteta, weight ); if(jetabsflavour==5){ histospt[string("BTaggedBJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("BTaggedBJet_") + sampletype]->Fill(jetpt, jeteta, weight ); } else if(jetabsflavour==4){ histospt[string("BTaggedCJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("BTaggedCJet_") + sampletype]->Fill(jetpt, jeteta, weight ); } else{ histospt[string("BTaggedLJet_") + sampletype]->Fill(jetpt, weight ); histos2d[string("BTaggedLJet_") + sampletype]->Fill(jetpt, jeteta, weight ); } } }//for(int k = 0; k<fMT2tree->NJets; ++k) } delete fMT2tree; }//for(size_t i = 0; i < fSamples.size(); ++i) cout << "add overflow bins" << endl; for(map<string,TH2D*>::iterator h=histos2d.begin(); h!=histos2d.end();++h){ //there should not be any underflow, just look at overflow int nbinsx = h->second->GetNbinsX(); int nbinsy = h->second->GetNbinsY(); for(int ix = 1; ix<= nbinsx;++ix){ h->second->SetBinContent(ix, nbinsy, h->second->GetBinContent(ix,nbinsy) + h->second->GetBinContent(ix, nbinsy+1)); h->second->SetBinError(ix, nbinsy, sqrt(h->second->GetBinError(ix,nbinsy)*h->second->GetBinError(ix,nbinsy) + h->second->GetBinError(ix, nbinsy+1)*h->second->GetBinError(ix, nbinsy+1)) ); } for(int iy = 1; iy<= nbinsy;++iy){ h->second->SetBinContent(nbinsx, iy, h->second->GetBinContent(nbinsx,iy) + h->second->GetBinContent(nbinsx+1, iy)); h->second->SetBinError(nbinsx, iy, sqrt(h->second->GetBinError(nbinsx,iy)*h->second->GetBinError(nbinsx,iy) + h->second->GetBinError(nbinsx+1, iy)*h->second->GetBinError(nbinsx+1, iy)) ); } h->second->SetBinContent(nbinsx, nbinsy, h->second->GetBinContent(nbinsx,nbinsy) + h->second->GetBinContent(nbinsx+1, nbinsy+1)); h->second->SetBinError(nbinsx, nbinsy, sqrt(h->second->GetBinError(nbinsx,nbinsy)*h->second->GetBinError(nbinsx,nbinsy) + h->second->GetBinError(nbinsx+1, nbinsy+1)*h->second->GetBinError(nbinsx+1, nbinsy+1)) ); } for(map<string,TH1D*>::iterator h=histospt.begin(); h!=histospt.end();++h){ //there should not be any underflow, just look at overflow int nbinsx = h->second->GetNbinsX(); h->second->SetBinContent(nbinsx, h->second->GetBinContent(nbinsx) + h->second->GetBinContent(nbinsx+1)); h->second->SetBinError( nbinsx, h->second->GetBinError(nbinsx )*h->second->GetBinError(nbinsx ) + h->second->GetBinError(nbinsx+1)*h->second->GetBinError(nbinsx+1) ); } cout << "merge mc histograms into one" << endl; //fill mc histogram from the samples histograms for(int ists = 0; ists<sampletypesize; ++ists){ if((sample_type[ists])==("data")) continue; if((sample_type[ists])==("susy")) continue; if((sample_type[ists])==("mc") ) continue;//have all mc subsamples only string helptype = string("_") + sample_type[ists]; string helpmc = "_mc"; string helpmcnoqcd = "_mcNOqcd"; histospt[string("BJet") + helpmc]->Add(histospt[string("BJet") + helptype], 1.); histospt[string("CJet") + helpmc]->Add(histospt[string("CJet") + helptype], 1.); histospt[string("LJet") + helpmc]->Add(histospt[string("LJet") + helptype], 1.); histospt[string("AllJet") + helpmc]->Add(histospt[string("AllJet") + helptype], 1.); histos2d[string("BJet") + helpmc]->Add(histos2d[string("BJet") + helptype], 1.); histos2d[string("CJet") + helpmc]->Add(histos2d[string("CJet") + helptype], 1.); histos2d[string("LJet") + helpmc]->Add(histos2d[string("LJet") + helptype], 1.); histos2d[string("AllJet") + helpmc]->Add(histos2d[string("AllJet") + helptype], 1.); histospt[string("BTaggedBJet") + helpmc]->Add(histospt[string("BTaggedBJet") + helptype], 1.); histospt[string("BTaggedCJet") + helpmc]->Add(histospt[string("BTaggedCJet") + helptype], 1.); histospt[string("BTaggedLJet") + helpmc]->Add(histospt[string("BTaggedLJet") + helptype], 1.); histospt[string("BTaggedAllJet") + helpmc]->Add(histospt[string("BTaggedAllJet") + helptype], 1.); histos2d[string("BTaggedBJet") + helpmc]->Add(histos2d[string("BTaggedBJet") + helptype], 1.); histos2d[string("BTaggedCJet") + helpmc]->Add(histos2d[string("BTaggedCJet") + helptype], 1.); histos2d[string("BTaggedLJet") + helpmc]->Add(histos2d[string("BTaggedLJet") + helptype], 1.); histos2d[string("BTaggedAllJet") + helpmc]->Add(histos2d[string("BTaggedAllJet") + helptype], 1.); if(sample_type[ists]==string("QCD")) continue; histospt[string("BJet") + helpmcnoqcd]->Add(histospt[string("BJet") + helptype], 1.); histospt[string("CJet") + helpmcnoqcd]->Add(histospt[string("CJet") + helptype], 1.); histospt[string("LJet") + helpmcnoqcd]->Add(histospt[string("LJet") + helptype], 1.); histospt[string("AllJet") + helpmcnoqcd]->Add(histospt[string("AllJet") + helptype], 1.); histos2d[string("BJet") + helpmcnoqcd]->Add(histos2d[string("BJet") + helptype], 1.); histos2d[string("CJet") + helpmcnoqcd]->Add(histos2d[string("CJet") + helptype], 1.); histos2d[string("LJet") + helpmcnoqcd]->Add(histos2d[string("LJet") + helptype], 1.); histos2d[string("AllJet") + helpmcnoqcd]->Add(histos2d[string("AllJet") + helptype], 1.); histospt[string("BTaggedBJet") + helpmcnoqcd]->Add(histospt[string("BTaggedBJet") + helptype], 1.); histospt[string("BTaggedCJet") + helpmcnoqcd]->Add(histospt[string("BTaggedCJet") + helptype], 1.); histospt[string("BTaggedLJet") + helpmcnoqcd]->Add(histospt[string("BTaggedLJet") + helptype], 1.); histospt[string("BTaggedAllJet") + helpmcnoqcd]->Add(histospt[string("BTaggedAllJet") + helptype], 1.); histos2d[string("BTaggedBJet") + helpmcnoqcd]->Add(histos2d[string("BTaggedBJet") + helptype], 1.); histos2d[string("BTaggedCJet") + helpmcnoqcd]->Add(histos2d[string("BTaggedCJet") + helptype], 1.); histos2d[string("BTaggedLJet") + helpmcnoqcd]->Add(histos2d[string("BTaggedLJet") + helptype], 1.); histos2d[string("BTaggedAllJet") + helpmcnoqcd]->Add(histos2d[string("BTaggedAllJet") + helptype], 1.); } cout << "merge C and L histograms to NonB" << endl; for(int ists = 0; ists<sampletypesize; ++ists){ string helptype = string("_") + sample_type[ists]; histospt[string("NonBJet") + helptype]->Add(histospt[string("CJet") + helptype], 1.); histospt[string("NonBJet") + helptype]->Add(histospt[string("LJet") + helptype], 1.); histos2d[string("NonBJet") + helptype]->Add(histos2d[string("CJet") + helptype], 1.); histos2d[string("NonBJet") + helptype]->Add(histos2d[string("LJet") + helptype], 1.); histospt[string("BTaggedNonBJet") + helptype]->Add(histospt[string("BTaggedCJet") + helptype], 1.); histospt[string("BTaggedNonBJet") + helptype]->Add(histospt[string("BTaggedLJet") + helptype], 1.); histos2d[string("BTaggedNonBJet") + helptype]->Add(histos2d[string("BTaggedCJet") + helptype], 1.); histos2d[string("BTaggedNonBJet") + helptype]->Add(histos2d[string("BTaggedLJet") + helptype], 1.); } cout << "save histogram" << endl; TFile *fsavefile = new TFile(outputdir+outputname,"RECREATE"); fsavefile->cd(); for(map<string,TH2D*>::iterator h=histos2d.begin(); h!=histos2d.end();++h){ h->second->Write();} for(map<string,TH1D*>::iterator h=histospt.begin(); h!=histospt.end();++h){ h->second->Write();} fsavefile->Close(); cout << "Saved histograms in " << outputdir << outputname << endl; }//void GetBEfficiency_InputHistograms()
//this code create the so-called 'PrintOuts' as done with the MT2tree::PrintOut() function void PrintOutEvents(){ bool savetofile = true;//save the printout to the file PrintOut.log, default = true bool onlyData = true; //run only over data, default = true // TString samples = "/shome/haweber/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samples_MET_filter.dat";//only dummy // TString samples = "/shome/haweber/MT2Analysis_8TeV/Code/MT2AnalysisCode/RootMacros/samples/samples_HT_filter.dat";//only dummy TString samples = "samples/samples_HTandMET_filter.dat"; //event selection for which you want to have the printout - complicated stuff can also be done later std::ostringstream cutStream; std::ostringstream cutStreamBase; cutStream << " " // << "NBJets40CSVM >= 3" << "&&" << "NJetsIDLoose40 >= 2" << "&&" << "NEles+NMuons+NTausIDLoose3Hits ==0"<< "&&" // << "misc.MT2>=250" << "&&" << "misc.Jet0Pass ==1" << "&&" << "misc.Jet1Pass ==1" << "&&" << "misc.Vectorsumpt < 70"; cutStream << "&& misc.MinMetJetDPhi4Pt40 >0.3"; // cutStream << "&&misc.HT<750&&misc.HT>=450&&misc.MET>200"; // cutStream << "&&misc.HT>=750&&misc.MET>30"; cutStream << "&&((misc.HT<750&&misc.HT>=450&&misc.MET>200)||(misc.HT>=750&&misc.MET>30))"; //Higgs // cutStream <<"&&NJetsIDLoose40 >= 4"<<"&&" // <<"NBJetsCSVM>=2"<<"&&" // <<"GetSelBBMinv()>250"; cutStreamBase << " " << "misc.PassJet40ID ==1" << "&&" << "(misc.HBHENoiseFlag == 0 || misc.ProcessID==10)" << "&&" // for rare SM samples << "misc.CSCTightHaloIDFlag == 0" << "&&" << "misc.trackingFailureFlag==0" << "&&" << "misc.eeBadScFlag==0" << "&&" << "misc.EcalDeadCellTriggerPrimitiveFlag==0" << "&&" << "misc.TrackingManyStripClusFlag==0" << "&&" << "misc.TrackingTooManyStripClusFlag==0" << "&&" << "misc.TrackingLogErrorTooManyClustersFlag==0" << "&&" << "misc.CrazyHCAL==0"; cutStreamBase << "&&misc.MET/misc.CaloMETRaw<=2."; cutStreamBase << "&&TOBTECTagger<=8&&ExtraBeamHaloFilter==0";// ONLY ON DATA TString cuts = cutStream.str().c_str(); TString basecuts = cutStreamBase.str().c_str(); load(samples.Data()); //if have extremely many events can only select a random subset of those TRandom3 *random = new TRandom3(0);//somehow truly random with this seed vector<int> randvec; randvec.clear(); for(int i =0; i<40;++i) randvec.push_back(random->Integer(7750)); delete random; sort(randvec.begin(), randvec.end()); //for(int i=0; i<randvec.size();++i) cout << "randvec["<<i<<"]="<<randvec[i] << endl; int counter1 = 0; int counter2 = 0; //don't run events twice - this vector makes that sure (in case event is in both MET and HT trigger stream) vector<pair<int,pair<int,int> > > rls; rls.clear(); for(size_t i = 0; i < fSamples.size(); ++i){ if(onlyData && fSamples[i].type!="data") continue; MT2tree* fMT2tree = new MT2tree(); fSamples[i].tree->SetBranchAddress("MT2tree", &fMT2tree); Long64_t nentries = fSamples[i].tree->GetEntries(); Long64_t nbytes = 0, nb = 0; int nev =0; TString myCuts = cuts + "&&" + basecuts; //if( fSamples[i].type=="data") myCuts += " && " + trigger; //cuts to be aplied only on data cout << "sample " << fSamples[i].name << endl; cout << "Cuts for Flow: " << myCuts << endl; fSamples[i].tree->Draw(">>selList", myCuts); TEventList *myEvtList = (TEventList*)gDirectory->Get("selList"); fSamples[i].tree->SetEventList(myEvtList); int counter=0; cout << "Filtering done, size=" <<myEvtList->GetN() << endl; if(myEvtList->GetSize()==0) continue; //run over selected events while(myEvtList->GetEntry(counter++) !=-1){ int jentry = myEvtList->GetEntry(counter-1); nb = fSamples[i].tree->GetEntry(jentry); nbytes += nb; fSamples[i].tree->SetBranchAddress("MT2tree", &fMT2tree); //implementation of running over random subset // if(counter1==randvec[counter2]){ // ++counter2; // fMT2tree->PrintOut(savetofile); // } pair <int,int> dummy1(fMT2tree->misc.LumiSection,fMT2tree->misc.Event); pair <int,pair<int,int> > dummy(fMT2tree->misc.Run, dummy1); bool newevt = true; for(int nn = 0; nn<rls.size(); ++nn){ if(rls[nn].first==dummy.first && rls[nn].second.first==dummy.second.first && rls[nn].second.second==dummy.second.second) {newevt = false; break;} } if(newevt){ rls.push_back(dummy); fMT2tree->PrintOut(savetofile);//safe the printout ++counter1; } } delete fMT2tree; delete fSamples[i].tree; } cout << "Printed out " << counter1 << " events." << endl; }
void TMVAClassificationApplication( TString myMethodList = "" ) { #ifdef __CINT__ gROOT->ProcessLine( ".O0" ); // turn off optimization in CINT #endif //--------------------------------------------------------------- // This loads the library TMVA::Tools::Instance(); // set verbosity //TMVA::Tools::Instance().Log().SetMinType(kINFO); // Default MVA methods to be trained + tested std::map<std::string,int> Use; Use["BDT"] = 1; // uses Adaptive Boost Use["Category"] = 1; std::cout << std::endl; std::cout << "==> Start TMVAClassificationApplication" << std::endl; // Select methods (don't look at this code - not of interest) if (myMethodList != "") { for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) it->second = 0; std::vector<TString> mlist = gTools().SplitString( myMethodList, ',' ); for (UInt_t i=0; i<mlist.size(); i++) { std::string regMethod(mlist[i]); if (Use.find(regMethod) == Use.end()) { std::cout << "Method \"" << regMethod << "\" not known in TMVA under this name. Choose among the following:" << std::endl; for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { std::cout << it->first << " "; } std::cout << std::endl; return; } Use[regMethod] = 1; } } // -------------------------------------------------------------------------------------------------- // --- Create the Reader object TMVA::Reader *reader = new TMVA::Reader( "Color:!Silent" ); reader->SetMsgType(kINFO); // CMS STATS: // // Create a set of variables and declare them to the reader // - the variable names MUST corresponds in name and type to those given in the weight file(s) used Float_t met; Float_t HT; Float_t minMLB; Float_t leptonJetsMETSum; reader->AddVariable( "met", &met ); reader->AddVariable( "HT", &HT ); reader->AddVariable( "minMLB", &minMLB ); reader->AddVariable( "leptonJetsMETSum", &leptonJetsMETSum ); // CMS STATS: // *** VERY IMPORTANT! *** // TMVA notoriously has problems with integer and other non-float branches. // Better not to use them at all and convert them to Float_t. If you happen // to have integer branches that you need, as in this example, you should create // corresponding float spectator variables and assign them in the event loop. // // Spectator variables declared in the training have to be added to the reader, too // // Note that the corresponding branches are integer, so we create floats too! Int_t nBTag; Int_t nJets; Int_t nLeptons; Int_t isMuon1; Int_t isMuon2; Int_t isMuon3; Int_t isMuon4; Float_t nBTagFloat; Float_t nJetsFloat; Float_t nLeptonsFloat; Float_t isMuon1Float; Float_t isMuon2Float; Float_t isMuon3Float; Float_t isMuon4Float; Float_t leptonSumMass; reader->AddSpectator( "nBTag", &nBTagFloat ); reader->AddSpectator( "nJets", &nJetsFloat ); reader->AddSpectator( "nLeptons", &nLeptonsFloat ); reader->AddSpectator( "isMuon1", &isMuon1Float ); reader->AddSpectator( "isMuon2", &isMuon2Float ); reader->AddSpectator( "isMuon3", &isMuon3Float ); reader->AddSpectator( "isMuon4", &isMuon4Float ); reader->AddSpectator( "leptonSumMass", &leptonSumMass ); // CMS STATS: // cut definitions. Define categories and overall selection. #include "TMVA_tprime_cuts.C" // Add artificial spectators for distinguishing categories Float_t Category_mycat1, Category_mycat2, Category_mycat3, Category_mycat4; TString sCat1("Category_cat1:="); TString sCat2("Category_cat2:="); TString sCat3("Category_cat3:="); TString sCat4("Category_cat4:="); sCat1.Append(cut_os_cat1); sCat2.Append(cut_os_cat2); sCat3.Append(cut_ss); sCat4.Append(cut_tri); reader->AddSpectator( sCat1, &Category_mycat1 ); reader->AddSpectator( sCat2, &Category_mycat2 ); reader->AddSpectator( sCat3, &Category_mycat3 ); reader->AddSpectator( sCat4, &Category_mycat4 ); // --- Book the MVA methods TString dir = "weights/"; TString prefix = "TMVAClassification"; // Book method(s) for (std::map<std::string,int>::iterator it = Use.begin(); it != Use.end(); it++) { if (it->second) { TString methodName = TString(it->first) + TString(" method"); TString weightfile = dir + prefix + TString("_") + TString(it->first) + TString(".weights.xml"); reader->BookMVA( methodName, weightfile ); } } // Book output histograms UInt_t nbin = 100; TH1F * histBdt(0); TH1F * histCat(0); if (Use["BDT"]) histBdt = new TH1F( "MVA_BDT", "MVA_BDT", nbin, -0.8, 0.8 ); if (Use["Category"]) histCat = new TH1F( "MVA_Category", "MVA_Category", nbin, -2., 2. ); // Prepare input tree (this must be replaced by your data source) // in this example, there is a toy tree with signal and one with background events // we'll later on use only the "signal" events for the test in this example. // TFile *input(0); // CMS STATS: // Specify files with data, for which you want to compute the classifier values TString fname = "./data/pass7_OS_test1/TTbar_MuMu/all.root"; //TString fname = "./data/pass7_TRI_test1/TTbar_MuMu/all.root"; if (!gSystem->AccessPathName( fname )) input = TFile::Open( fname ); // check if file in local directory exists if (!input) { std::cout << "ERROR: could not open data file" << std::endl; exit(1); } std::cout << "--- TMVAClassificationApp : Using input file: " << input->GetName() << std::endl; // --- Event loop // Prepare the event tree // - here the variable names have to corresponds to your tree // - you can use the same variables as above which is slightly faster, // but of course you can use different ones and copy the values inside the event loop // std::cout << "--- Select signal sample" << std::endl; TTree* theTree = (TTree*)input->Get("MVA"); //Float_t userVar1, userVar2; theTree->SetBranchAddress( "met", &met ); theTree->SetBranchAddress( "HT", &HT ); theTree->SetBranchAddress( "minMLB", &minMLB ); theTree->SetBranchAddress( "leptonJetsMETSum", &leptonJetsMETSum ); // spectators theTree->SetBranchAddress( "leptonSumMass", &leptonSumMass ); theTree->SetBranchAddress( "nJets", &nJets ); theTree->SetBranchAddress( "nBTag", &nBTag ); theTree->SetBranchAddress( "nLeptons", &nLeptons ); theTree->SetBranchAddress( "isMuon1", &isMuon1 ); theTree->SetBranchAddress( "isMuon2", &isMuon2 ); theTree->SetBranchAddress( "isMuon3", &isMuon3 ); theTree->SetBranchAddress( "isMuon4", &isMuon4 ); std::vector<Float_t> vecVar(4); // vector for EvaluateMVA tests // CMS STATS: // // A little trick: loop over only selected events // make event list theTree->Draw(">>EvtList", mycut); TEventList * pEvtList = (TEventList *)gROOT->FindObject("EvtList"); long int nEvents = pEvtList->GetN(); //std::cout << "--- Processing: " << theTree->GetEntries() << " events" << std::endl; std::cout << "--- Processing: " << nEvents << " events" << std::endl; TStopwatch sw; sw.Start(); //for (Long64_t ievt=0; ievt<theTree->GetEntries();ievt++) { for (Long64_t ievt=0; ievt<nEvents; ++ievt) { if (ievt%1000 == 0) std::cout << "--- ... Processing event: " << ievt << std::endl; //theTree->GetEntry(ievt); theTree->GetEntry(pEvtList->GetEntry(ievt)); // CMS STATS: // *** HERE we assign integer branches' values to float spectator variables // Otherwise our category cuts would fail // nBTagFloat=(Float_t)nBTag; nJetsFloat=(Float_t)nJets; nLeptonsFloat=(Float_t)nLeptons; isMuon1Float = (Float_t)isMuon1; isMuon2Float = (Float_t)isMuon2; isMuon3Float = (Float_t)isMuon3; isMuon4Float = (Float_t)isMuon4; // --- Return the MVA outputs and fill into histograms if (Use["BDT" ]) histBdt ->Fill( reader->EvaluateMVA( "BDT method" ) ); if (Use["Category" ]) histCat ->Fill( reader->EvaluateMVA( "Category method" ) ); } // Get elapsed time sw.Stop(); std::cout << "--- End of event loop: "; sw.Print(); // --- Write histograms TFile *target = new TFile( "TMVApp.root","RECREATE" ); if (Use["BDT" ]) histBdt ->Write(); if (Use["Category" ]) histCat ->Write(); target->Close(); std::cout << "--- Created root file: \"TMVApp.root\" containing the MVA output histograms" << std::endl; delete reader; std::cout << "==> TMVAClassificationApplication is done!" << endl << std::endl; }