diff --git a/environment.sh b/environment.sh index 455d25ae..b88c1d5b 100644 --- a/environment.sh +++ b/environment.sh @@ -12,9 +12,11 @@ if [ -z $CONDOR_ID ]; then fi #Is the analysis blinded? -export blind='YES' +export blind='NO' #'YES' export TARGET_LUMI_8TeV=19.4 export TARGET_LUMI_7TeV=4.9 +export MEGAPATH='/scratch/mverzett/data':$hdfs + #check if dev area is up to date check_git_updates.sh diff --git a/wh/ChargeFlipProbabilityEE.py b/wh/ChargeFlipProbabilityEE.py index 2eb0d82e..8ad26532 100755 --- a/wh/ChargeFlipProbabilityEE.py +++ b/wh/ChargeFlipProbabilityEE.py @@ -100,8 +100,8 @@ def preselection(row): continue evt_weight = pucorrector(row.nTruePU) * \ - mcCorrectors.get_electron_corrections(row,'e1','e2') - + mcCorrectors.get_electron_corrections(row,'e1','e2') *\ + mcCorrectors.double_electron_trigger(row) for iso_label in lep_id: if not selections.lepton_id_iso(row, 'e1', iso_label): continue diff --git a/wh/ControlEM.py b/wh/ControlEM.py index 65c4a8de..48d734c6 100644 --- a/wh/ControlEM.py +++ b/wh/ControlEM.py @@ -74,6 +74,11 @@ def begin(self): 5, -0.5, 4.5) self.book('em' + folder, 'eVetoCicTightIso', 'Number of extra CiC tight electrons', 5, -0.5, 4.5) + self.book('em' + folder, "trig_weight" , "mva_metEt", 200, 0, 2) + self.book('em' + folder, "PU_weight" , "mva_metEt", 200, 0, 2) + self.book('em' + folder, "idIso_weight", "mva_metEt", 200, 0, 2) + self.book('em' + folder, "emMass_noweight", "m_{e#mu} (GeV)", 240, 0, 240) + def correction(self, row): return self.pucorrector(row.nTruePU) * \ @@ -100,12 +105,20 @@ def fill_folder(x, w): histos[x + '/eJetBtag'].Fill(row.eJetBtag, w) histos[x + '/mJetBtag'].Fill(row.mJetBtag, w) histos[x + '/emMass'].Fill(row.e_m_Mass, w) + histos[x + '/emMass_noweight'].Fill(row.e_m_Mass) histos[x + '/bjetVeto'].Fill(row.bjetVeto, w) histos[x + '/bjetCSVVeto'].Fill(row.bjetCSVVeto, w) histos[x + '/muVetoPt5'].Fill(row.muVetoPt5, w) histos[x + '/tauVetoPt20'].Fill(row.tauVetoPt20, w) histos[x + '/eVetoCicTightIso'].Fill(row.eVetoCicTightIso, w) + if row.run < 2: + histos[x + "/trig_weight" ].Fill(mcCorrectors.correct_mueg_mu(row.mPt, row.mAbsEta)* + mcCorrectors.correct_mueg_e(row.ePt, row.eAbsEta) ) + histos[x + "/PU_weight" ].Fill(self.pucorrector(row.nTruePU)) + histos[x + "/idIso_weight"].Fill(mcCorrectors.get_muon_corrections(row,'m') * + mcCorrectors.get_electron_corrections(row,'e') ) + passes_e_id_iso = self.obj2_id(row) if row.e_m_SS and passes_e_id_iso: @@ -122,11 +135,15 @@ def preselection(self, row): Excludes FR object IDs and sign cut. ''' mu17e8 = (row.mu17ele8isoPass and row.mPt >= 20) if use_iso_trigger else (row.mu17ele8Pass and row.mPt >= 20) - mu8e17 = (row.mu8ele17isoPass and row.ePt >= 20) #if use_iso_trigger else (row.mu17ele8Pass and row.mPt < 20) + mu8e17 = (row.mu8ele17isoPass and row.ePt >= 20) if use_iso_trigger else (row.mu8ele17Pass and row.mPt < 20) if not (mu17e8 or mu8e17): return False if not selections.muSelection(row, 'm'): return False #applies basic selection (eta, pt > 10, DZ, pixHits, jetBTag) if not selections.eSelection(row, 'e'): return False #applies basic selection (eta, pt > 10, DZ, missingHits, jetBTag, HasConversion and chargedIdTight) - if not selections.vetos(row): return False #applies mu bjet e additional tau vetoes + #if not selections.vetos(row): return False #applies mu bjet e additional tau vetoes + if row.muVetoPt5IsoIdVtx: return False + if row.eVetoMVAIsoVtx: return False + if row.tauVetoPt20Loose3HitsVtx: return False + return True def obj1_id(self, row): @@ -145,9 +162,9 @@ def obj2_weight(self, row): mu17e8 = (row.mu17ele8isoPass and row.mPt >= 20) if use_iso_trigger else (row.mu17ele8Pass and row.mPt >= 20) fr = 0. if mu17e8: - fr = frfits.lowpt_e_fr[subleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt) + fr = frfits.lowpt_e_fr[subleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt, numJets20=row.jetVeto20) else: - fr = frfits.highpt_e_fr[subleptonId](electronJetPt=max(row.eJetPt, row.ePt),electronPt=row.ePt) + fr = frfits.highpt_e_fr[subleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt, numJets20=row.jetVeto20) return fr / (1. - fr) def process(self): diff --git a/wh/ControlZEE.py b/wh/ControlZEE.py index 9aca6433..a5a83d1f 100644 --- a/wh/ControlZEE.py +++ b/wh/ControlZEE.py @@ -47,9 +47,9 @@ def f_(*args,**kargs): leading_e_fr_wjets = make_weight(frfits.highpt_ee_fr[leading_iso] ) -leading_e_fr_qcd = make_weight(frfits.highpt_ee_qcd_fr[leading_iso] ) +leading_e_fr_qcd = None #make_weight(frfits.highpt_ee_qcd_fr[leading_iso] ) subleading_e_fr_wjets = make_weight(frfits.lowpt_ee_fr[subleading_iso] ) -subleading_e_fr_qcd = make_weight(frfits.lowpt_ee_qcd_fr[subleading_iso] ) +subleading_e_fr_qcd = None #make_weight(frfits.lowpt_ee_qcd_fr[subleading_iso] ) def assign_charge_weight_one_maps(dir_, row): if "charge_weightSysUp" in dir_: return charge_flip_up_lead(row.e1AbsEta,row.e1Pt) + charge_flip_up_sub(row.e2AbsEta,row.e2Pt) @@ -65,9 +65,10 @@ def assign_id_weight(dir_, row): return 1 leading_fr = leading_e_fr_wjets if 'wjet_w' in dir_ else leading_e_fr_qcd sublead_fr = subleading_e_fr_wjets if 'wjet_w' in dir_ else subleading_e_fr_qcd - if "f1f2" in dir_: return leading_fr( electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt) * sublead_fr( electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt ) - if "f2" in dir_: return sublead_fr( electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt) - if "f1" in dir_: return leading_fr( electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt) + if "f1f2" in dir_: return leading_fr( electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt, numJets20=row.jetVeto20) *\ + sublead_fr( electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt, numJets20=row.jetVeto20) + if "f2" in dir_: return sublead_fr( electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt, numJets20=row.jetVeto20) + if "f1" in dir_: return leading_fr( electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt, numJets20=row.jetVeto20) class ControlZEE(MegaBase): tree = 'ee/final/Ntuple' @@ -88,6 +89,9 @@ def book_(dirname): self.book(dirname, 'SCEnergy', 'electron Super Cluster energy', 500, 0, 1000) self.book(dirname, 'SCDPhi' , 'electron Super Cluster DeltaPhi', 180, 0, math.Pi()) self.book(dirname, 'TrkMass' , 'Dielectrons invariant mass; M_{ee} [GeV];counts', 110, 40, 150) + self.book(dirname, 'TrkMass_low' , 'Dielectrons invariant mass; M_{ee} [GeV];counts', 110, 40, 150) + self.book(dirname, 'TrkMass_high', 'Dielectrons invariant mass; M_{ee} [GeV];counts', 110, 40, 150) + self.book(dirname, 'TrkMass_NoWeight', 'Dielectrons invariant mass; M_{ee} [GeV];counts', 110, 40, 150) self.book(dirname, 'TrkMass_NOSCALE' , 'Dielectrons invariant mass; M_{ee} [GeV];counts', 110, 40, 150) self.book(dirname, 'SCMass' , 'Dielectrons Super Cluster invariant mass; M_{ee} [GeV];counts', 110, 40, 150) self.book(dirname, "e1Pt" , "electron 1 Pt", 400, 0, 800) @@ -96,10 +100,14 @@ def book_(dirname): self.book(dirname, "e2AbsEta", "electron 2 abseta", 100, 0., 2.5) self.book(dirname, "type1_pfMetEt", "metEt" , 300, 0, 300) self.book(dirname, "mva_metEt", "mva_metEt", 300, 0, 300) + self.book(dirname, "trig_weight" , "mva_metEt", 200, 0, 2) + self.book(dirname, "PU_weight" , "mva_metEt", 200, 0, 2) + self.book(dirname, "idIso_weight", "mva_metEt", 200, 0, 2) + self.dirs = ['/'.join([sign,id_,weight,ch_weight]) for sign in ['os','ss'] for id_ in [h+k for h in ['p1','f1'] for k in ['p2','f2'] ] - for weight in ['','wjet_w','qcd_w'] + for weight in ['','wjet_w'] #,'qcd_w'] for ch_weight in ["","charge_weight","charge_weightSysUp","charge_weightSysDwn"] if 'f' in id_ or weight == '' if ch_weight == '' or sign == 'os' @@ -118,14 +126,6 @@ def book_(dirname): self.dir_based_histograms[location] = {} self.dir_based_histograms[location][name] = hist - def evt_weight(self, row): - if row.run > 2: - return 1. - else: - return self.pucorrector(row.nTruePU) * \ - mcCorrectors.get_electron_corrections(row,'e1','e2') - - def preselection(self, row): ''' Preselection applied to events. @@ -137,13 +137,16 @@ def preselection(self, row): if row.e1Pt < 20: return False if not selections.eSelection(row, 'e1'): return False if not selections.eSelection(row, 'e2'): return False - if not selections.vetos(row): return False + if row.muVetoPt5IsoIdVtx: return False + if row.eVetoMVAIsoVtx: return False + if row.tauVetoPt20Loose3HitsVtx: return False + #if not selections.vetos(row): return False if row.e1_e2_Mass < 40: return False if not (row.jetVeto40 >= 1): return False return True def obj1_id(self, row): - return selections.lepton_id_iso(row, 'e1', subleading_iso) + return selections.lepton_id_iso(row, 'e1', leading_iso) def obj2_id(self, row): return selections.lepton_id_iso(row, 'e2', subleading_iso) @@ -151,15 +154,21 @@ def obj2_id(self, row): def mc_weight(self, row): if row.run > 2: return 1. - return self.pucorrector(row.nTruePU) * \ - mcCorrectors.get_electron_corrections(row,'e1','e2') - + else: + return self.pucorrector(row.nTruePU) * \ + mcCorrectors.get_electron_corrections(row,'e2') *\ + mcCorrectors.electron_tight_corrections(row.e1Pt, row.e1AbsEta) *\ + mcCorrectors.double_electron_trigger(row) + #'e1', def process(self): histos = self.dir_based_histograms mc_weight = self.mc_weight def fill_histos(dirname, row, weight): - mass = frfits.mass_scaler[leading_iso](row.e1_e2_Mass) if "charge_weight" in dirname else row.e1_e2_Mass + mass = frfits.default_scaler(row.e1_e2_Mass) if "charge_weight" in dirname else row.e1_e2_Mass + mass_up = frfits.default_scaler_up(row.e1_e2_Mass) if "charge_weight" in dirname else row.e1_e2_Mass + mass_dw = frfits.default_scaler_down(row.e1_e2_Mass) if "charge_weight" in dirname else row.e1_e2_Mass + histos[dirname]['ePt' ].Fill(row.e1Pt,weight) histos[dirname]['eAbsEta' ].Fill(row.e1AbsEta,weight) histos[dirname]['SCEnergy'].Fill(row.e1SCEnergy,weight) @@ -167,14 +176,21 @@ def fill_histos(dirname, row, weight): histos[dirname]['eAbsEta' ].Fill(row.e2AbsEta,weight) histos[dirname]['SCEnergy'].Fill(row.e2SCEnergy,weight) histos[dirname]['TrkMass' ].Fill(mass, weight) + histos[dirname]['TrkMass_low' ].Fill(mass_dw, weight) + histos[dirname]['TrkMass_high' ].Fill(mass_up, weight) #histos[dirname]['SCMass' ].Fill(sc_inv_mass(row),weight) histos[dirname]["e1Pt" ].Fill(row.e1Pt,weight) histos[dirname]["e2Pt" ].Fill(row.e2Pt,weight) histos[dirname]["e1AbsEta"].Fill(row.e1AbsEta,weight) histos[dirname]["e2AbsEta"].Fill(row.e2AbsEta,weight) histos[dirname]['TrkMass_NOSCALE'].Fill(row.e1_e2_Mass, weight) + histos[dirname]['TrkMass_NoWeight'].Fill(row.e1_e2_Mass) histos[dirname]['type1_pfMetEt'].Fill(row.type1_pfMetEt, weight) histos[dirname]['mva_metEt'].Fill(row.mva_metEt, weight) + if row.run < 2: + histos[dirname]["trig_weight" ].Fill( self.pucorrector(row.nTruePU) ) + histos[dirname]["PU_weight" ].Fill( mcCorrectors.get_electron_corrections(row,'e1','e2') ) + histos[dirname]["idIso_weight"].Fill( mcCorrectors.double_electron_trigger(row) ) for row in self.tree: if not self.preselection(row): diff --git a/wh/ControlZMM.py b/wh/ControlZMM.py index b7afea45..d2d9b706 100644 --- a/wh/ControlZMM.py +++ b/wh/ControlZMM.py @@ -112,6 +112,9 @@ def preselection(self, row): if row.m1_m2_Mass > 120: return False if not selections.muSelection(row, 'm1'): return False #applies basic selection (eta, pt > 10, DZ, pixHits, jetBTag) if not selections.muSelection(row, 'm2'): return False #applies basic selection (eta, pt > 10, DZ, pixHits, jetBTag) + if row.muVetoPt5IsoIdVtx: return False + if row.eVetoMVAIsoVtx: return False + if row.tauVetoPt20Loose3HitsVtx: return False return True def obj1_id(self, row): diff --git a/wh/FakeRatesEE.py b/wh/FakeRatesEE.py index abfc4f04..05199c66 100755 --- a/wh/FakeRatesEE.py +++ b/wh/FakeRatesEE.py @@ -28,9 +28,32 @@ from array import array from pprint import pprint import ROOT - +import FinalStateAnalysis.PlotTools.pytree as pytree +from cutflowtracker import cut_flow_tracker +import math + +def inv_mass(pt1,eta1,phi1,pt2,eta2,phi2): + return math.sqrt( + 2*pt1*pt2*(math.cosh(eta1 - eta2) - math.cos(phi1 - phi2)) + ) + +cut_flow_step = ['bare', 'trigger', 'e1_e2_DR', + 'e1 presel', 'e2 presel', 'jet requirement', + 'muon veto', 'bjet veto', 'electron veto', 'tau veto', + 'region assignment', +] + + +region_for_event_list = os.environ.get('EVTLIST_REGION','') +zMassCut = 'NoZmass' in region_for_event_list +if zMassCut: + cut_flow_step.append('zMassCut') +region_for_event_list = region_for_event_list.replace('NoZmass','') +SYNC = ('SYNC' in os.environ) and eval(os.environ['SYNC']) +print region_for_event_list + class FakeRatesEE(MegaBase): - tree = 'ee/final/Ntuple' + tree = 'ee/final/Ntuple' if not SYNC else 'Ntuple' def __init__(self, tree, outfile, **kwargs): super(FakeRatesEE, self).__init__(tree, outfile, **kwargs) # Use the cython wrapper @@ -47,7 +70,13 @@ def __init__(self, tree, outfile, **kwargs): for j in self.iso_points] def begin(self): - for region in ['wjets', 'qcd', 'wjetsNoZmass', 'qcdNoZmass']: + self.book('', "CUT_FLOW", "Cut Flow", len(cut_flow_step), 0, len(cut_flow_step)) + xaxis = self.histograms['CUT_FLOW'].GetXaxis() + self.cut_flow_histo = self.histograms['CUT_FLOW'] + for i, name in enumerate(cut_flow_step): + xaxis.SetBinLabel(i+1, name) + + for region in ['wjetsLtLow', 'qcd', 'wjetsNoZmass', 'wjetsLtLowNoZmass', 'qcdNoZmass']: for denom in ['pt10', 'pt20']: denom_key = (region, denom) denom_histos = {} @@ -57,9 +86,17 @@ def begin(self): denom_histos['electronInfo'] = self.book( os.path.join(region, denom), 'electronInfo', "electronInfo", - 'electronPt:electronJetPt:weight:'+':'.join(self.lepIds), + 'electronPt:electronJetPt:electronJetCSVBtag:electronJetMass:numJets20:numJets40:weight:'+':'.join(self.lepIds), type=ROOT.TNtuple) + denom_histos['evtInfo'] = self.book( + os.path.join(region, denom), + 'evtInfo', 'evtInfo', + 'run/l:lumi/l:evt/l:e1Pt/D:e1Eta/D:e1Phi/D:e2Pt/D:e2Eta/D:e2Phi/D:e1ChargeIdTight/D' +\ + ':e2ChargeIdTight/D:e2RelPFIsoDB/D:e2MtToMET/D:e1MtToMET/D:bjetCSVVetoZHLike/D'+\ + ':e1RelPFIsoDB/D:e2MVAIDH2TauWP/D:e1MVAIDH2TauWP/D:e1_e2_SS/D:e1MVANonTrig/D:e2MVANonTrig/D', + type=pytree.PyTree) + for numerator in self.lepIds: num_key = (region, denom, numerator) num_histos = {} @@ -94,17 +131,32 @@ def book_histo(name, *args, **kwargs): def process(self): + cut_flow_histo = self.cut_flow_histo + cut_flow_trk = cut_flow_tracker(cut_flow_histo) - def preselection(row): + def preselection(row, cut_flow_trk): if not row.doubleEPass: return False if not (row.e1MatchesDoubleEPath > 0 and \ row.e2MatchesDoubleEPath > 0): return False + cut_flow_trk.Fill('trigger') + + if row.e1_e2_DR < 0.5: return False + cut_flow_trk.Fill('e1_e2_DR') + if not row.e1Pt > 20: return False if not selections.eSelection(row, 'e1'): return False if not row.e1MVAIDH2TauWP: return False + cut_flow_trk.Fill('e1 presel') + if not selections.eSelection(row, 'e2'): return False - if not (row.jetVeto40_DR05 >= 1): return False - if not selections.vetos(row): return False + cut_flow_trk.Fill('e2 presel') + + #if not (row.jetVeto40_DR05 >= 1): return False + if row.jetVeto20 == 0: return False + cut_flow_trk.Fill('jet requirement') + + if not selections.vetos(row, cut_flow_trk): return False + return True def fill(the_histos, row, fillNtuple=False): @@ -135,13 +187,20 @@ def fill(the_histos, row, fillNtuple=False): #print id_iso_vals #print self.lepIds id_iso_vals = [float( i ) for i in id_iso_vals ] - the_histos['electronInfo'].Fill( array("f", [row.e2Pt, row.e2JetPt, weight]+id_iso_vals) ) + electron_jet_mass = -1 #inv_mass(row.e2Pt, row.e2Eta, row.e2Phi, row.leadingJetPt, row.leadingJetEta, row.leadingJetPhi) + + the_histos['electronInfo'].Fill( array("f", [row.e2Pt, max(row.e2Pt, row.e2JetPt), max(0, row.e2JetCSVBtag), + electron_jet_mass, row.jetVeto20, row.jetVeto40_DR05, weight]+id_iso_vals) ) + the_histos['evtInfo'].Fill( row ) histos = self.histograms #pprint( histos) for row in self.tree: - if not preselection(row): + cut_flow_trk.new_row(row.run,row.lumi,row.evt) + cut_flow_trk.Fill('bare') + + if not preselection(row, cut_flow_trk): continue region = selections.control_region_ee(row) @@ -150,7 +209,18 @@ def fill(the_histos, row, fillNtuple=False): if region == 'zee': continue + + if region_for_event_list and region == region_for_event_list: + cut_flow_trk.Fill('region assignment') + if zMassCut and not (60 < row.e1_e2_Mass < 120): + cut_flow_trk.Fill('zMassCut') + # This is a QCD or Wjets + if region_for_event_list and region == region_for_event_list\ + and (not zMassCut or not (60 < row.e1_e2_Mass < 120)) \ + and not SYNC: + print '%i:%i:%i' % (row.run, row.lumi, row.evt) + continue def make_region_plots(full_region): fill(histos[full_region], row, True) @@ -169,11 +239,15 @@ def make_region_plots(full_region): make_region_plots((region, 'pt10')) if not (row.e1_e2_Mass > 60 and row.e1_e2_Mass < 120): make_region_plots((region+'NoZmass', 'pt10')) - + if region == 'wjetsLtLow' and row.e1MtToMET > 55: + make_region_plots(('wjetsNoZmass', 'pt10')) + if row.e2Pt > 20: make_region_plots((region, 'pt20')) if not (row.e1_e2_Mass > 60 and row.e1_e2_Mass < 120): make_region_plots((region+'NoZmass', 'pt20')) + if region == 'wjetsLtLow' and row.e1MtToMET > 55: + make_region_plots(('wjetsNoZmass', 'pt20')) def finish(self): diff --git a/wh/FakeRatesEM.py b/wh/FakeRatesEM.py index 3597fa16..90038564 100644 --- a/wh/FakeRatesEM.py +++ b/wh/FakeRatesEM.py @@ -21,11 +21,32 @@ import mcCorrectors import os from array import array +import FinalStateAnalysis.PlotTools.pytree as pytree +from cutflowtracker import cut_flow_tracker +import math + +def inv_mass(pt1,eta1,phi1,pt2,eta2,phi2): + return math.sqrt( + 2*pt1*pt2*(math.cosh(eta1 - eta2) - math.cos(phi1 - phi2)) + ) + +cut_flow_step = ['bare', #'trigger', + 'e_m_SS', 'e_m_DR', #'e_m_Mass', + 'mu presel', 'e presel', 'jet presence', + 'muon veto', 'bjet veto', 'electron veto', 'tau veto', + 'trigger', 'tag ID ISO', 'tag MT', 'probe MT' +] + +REGION = os.environ['REGION'] if ('REGION' in os.environ) else '' +env_lepton = REGION[0] if REGION else '' +env_region = REGION[1:] if REGION else '' def control_region(row): # Figure out what control region we are in. - if row.mPFIDTight and row.mRelPFIsoDB < 0.15 and row.mMtToMET > 35 and row.eMtToMET < 35: - return 'wjets' + if row.mPFIDTight and row.mRelPFIsoDB < 0.15 and row.mMtToMET > 35 and row.eMtToMET < 35 and row.bjetCSVVetoZHLike == 0: + return 'wjetsLtLow' + elif row.mPFIDTight and row.mRelPFIsoDB < 0.15 and row.mMtToMET > 35 and row.eMtToMET < 35 and row.bjetCSVVetoZHLike > 0: + return 'ttbar' elif row.mPFIDTight and row.mRelPFIsoDB > 0.3 and row.type1_pfMetEt < 25: return 'qcd' else: @@ -33,8 +54,10 @@ def control_region(row): def control_region_muon(row): # Figure out what control region we are in. - if selections.lepton_id_iso(row, 'e', 'eid12Medium_h2taucuts') and row.eMtToMET > 35 and row.mMtToMET < 35: - return 'Mwjets' + if selections.lepton_id_iso(row, 'e', 'eid12Medium_h2taucuts') and row.eMtToMET > 35 and row.mMtToMET < 35 and row.bjetCSVVetoZHLike == 0: + return 'MwjetsLtLow' + elif selections.lepton_id_iso(row, 'e', 'eid12Medium_h2taucuts') and row.eMtToMET > 35 and row.mMtToMET < 35 and row.bjetCSVVetoZHLike > 0: + return 'Mttbar' elif row.eRelPFIsoDB > 0.3 and row.type1_pfMetEt < 25: # selections.electronIds['eid12Medium'](row, 'e') and return 'Mqcd' else: @@ -42,11 +65,11 @@ def control_region_muon(row): class FakeRatesEM(MegaBase): - tree = 'em/final/Ntuple' + tree = 'em/final/Ntuple' if 'SYNC' not in os.environ else 'Ntuple' def __init__(self, tree, outfile, **kwargs): super(FakeRatesEM, self).__init__(tree, outfile, **kwargs) # Use the cython wrapper - self.tree = EMuTree.EMuTree(tree) + self.tree = tree #EMuTree.EMuTree(tree) self.out = outfile # Histograms for each category self.histograms = {} @@ -61,7 +84,13 @@ def __init__(self, tree, outfile, **kwargs): def begin(self): #Electron Fake Rates - for region in ['wjets', 'qcd']: + self.book('', "CUT_FLOW", "Cut Flow", len(cut_flow_step), 0, len(cut_flow_step)) + xaxis = self.histograms['CUT_FLOW'].GetXaxis() + self.cut_flow_histo = self.histograms['CUT_FLOW'] + for i, name in enumerate(cut_flow_step): + xaxis.SetBinLabel(i+1, name) + + for region in ['wjets', 'wjetsLtLow', 'qcd', 'ttbar']: for denom in ['pt10','pt20']: denom_key = (region, denom) denom_histos = {} @@ -71,9 +100,20 @@ def begin(self): denom_histos['electronInfo'] = self.book( os.path.join(region, denom), 'electronInfo', "electronInfo", - 'electronPt:electronJetPt:weight:'+':'.join(self.lepIds), + 'electronPt:electronJetPt:electronJetCSVBtag:electronJetMass:numJets20:numJets40:weight:'+':'.join(self.lepIds), type=ROOT.TNtuple) + denom_histos['evtInfo'] = self.book( + os.path.join(region, denom), + 'evtInfo', 'evtInfo', + 'run/l:lumi/l:evt/l' +\ + ':ePt/D:eEta/D:ePhi/D:mPt/D:mEta/D:mPhi/D' +\ + ':eChargeIdTight/D:mPFIDTight/D:mRelPFIsoDB/D' +\ + ':mMtToMET/D:eMtToMET/D:bjetCSVVetoZHLike/D' +\ + ':eRelPFIsoDB/D:eMVAIDH2TauWP/D:e_m_SS/D', + type=pytree.PyTree) + + for numerator in self.lepIds: num_key = (region, denom, numerator) num_histos = {} @@ -99,8 +139,8 @@ def book_histo(name, *args, **kwargs): book_histo('eJetptDvseJetPt', '' , 200, 0, 200, 200, 0, 1,type=ROOT.TH2F) #Muon Fake Rates - for region in ['Mwjets', 'Mqcd']: - for denom in ['pt10', 'pt20']: #, 'pt10b', 'pt10t', 'pt10f']: + for region in ['Mwjets', 'MwjetsLtLow', 'Mqcd', 'Mttbar']: + for denom in ['pt10', 'pt20']: denom_key = (region, denom) denom_histos = {} self.histograms[denom_key] = denom_histos @@ -109,9 +149,20 @@ def book_histo(name, *args, **kwargs): denom_histos['muonInfo'] = self.book( os.path.join(region, denom), 'muonInfo', "muonInfo", - 'muonPt:muonJetPt:muonJetBtag:weight:'+':'.join(self.muon_lepIds), + 'muonPt:muonJetPt:muonJetCSVBtag:muonJetMass:numJets20:numJets40:weight:'+':'.join(self.muon_lepIds), type=ROOT.TNtuple) + denom_histos['evtInfo'] = self.book( + os.path.join(region, denom), + 'evtInfo', 'evtInfo', + 'run/l:lumi/l:evt/l' +\ + ':ePt/D:eEta/D:ePhi/D' +\ + ':mPt/D:mEta/D:mPhi/D' +\ + ':eChargeIdTight/D:mPFIDTight/D:mRelPFIsoDB/D' +\ + ':mMtToMET/D:eMtToMET/D:bjetCSVVetoZHLike/D' +\ + ':eRelPFIsoDB/D:eMVAIDH2TauWP/D:e_m_SS/D', + type=pytree.PyTree) + for numerator in self.muon_lepIds: num_key = (region, denom, numerator) num_histos = {} @@ -138,17 +189,34 @@ def book_histo(name, *args, **kwargs): book_histo('muonAbsEta', 'Muon Abs Eta', 100, -2.5, 2.5) book_histo('muonPtRatio', 'Muon Pt', 100, 0., 1.) book_histo('muonPtDiff', 'Muon Pt', 200, 0., 200.) + book_histo('eMtToMET', 'e MT', 100, 0, 200) + def process(self): + cut_flow_histo = self.cut_flow_histo + cut_flow_trk = cut_flow_tracker(cut_flow_histo) def preselection(row): if not row.e_m_SS: return False + cut_flow_trk.Fill('e_m_SS') + + if row.e_m_DR < 0.5: return False + cut_flow_trk.Fill('e_m_DR') + if not selections.muSelection(row, 'm'): return False #applies basic selection (eta, pt > 10, DZ, pixHits, jetBTag) + cut_flow_trk.Fill('mu presel') + if not selections.eSelection(row, 'e'): return False #applies basic selection (eta, pt > 10, DZ, missingHits, jetBTag, HasConversion and chargedIdTight) if not row.eChargeIdTight: return False - if not (row.jetVeto40_DR05 >= 1): return False - if not selections.vetos(row): return False #applies mu bjet e additional tau vetoes + cut_flow_trk.Fill('e presel') + + #if not (row.jetVeto40_DR05 >= 1): return False + if row.jetVeto20 == 0: return False + cut_flow_trk.Fill('jet presence') + + if not selections.vetos(row, cut_flow_trk, False): return False #applies mu bjet e additional tau vetoes + #DO NOT APPLY BJet veto. It is used for ttbar CR return True #if self.is7TeV: #base_selection = 'mu17ele8Pass && ' + base_selection @@ -171,17 +239,22 @@ def fill(the_histos, row, fillNtuple=False): the_histos['eJetptDvseJetPt'].Fill(max(row.eJetPt, row.ePt),row.eJetptD) if fillNtuple: id_iso_vals = [ float( selections.lepton_id_iso(row, 'e', label) ) for label in self.lepIds] - the_histos['electronInfo'].Fill( array("f", [row.ePt, row.eJetPt, weight]+id_iso_vals) ) + electron_jet_mass = -1. #inv_mass(row.ePt, row.eEta, row.ePhi, row.leadingJetPt, row.leadingJetEta, row.leadingJetPhi) + + the_histos['electronInfo'].Fill( array("f", [row.ePt, max(row.eJetPt, row.ePt), max(0, row.eJetCSVBtag), + electron_jet_mass, row.jetVeto20, row.jetVeto40_DR05, weight]+id_iso_vals) ) + the_histos['evtInfo'].Fill(row) def fill_muon(the_histos, row, fillNtuple=False): - weight = 1 + weight = 1. if row.run == 1: weight = self.pucorrector(row.nTruePU) *\ mcCorrectors.correct_mueg_mu(row.mPt, row.mAbsEta) * \ mcCorrectors.correct_mueg_e(row.ePt, row.eAbsEta) the_histos['muonPt'].Fill(row.mPt, weight) + the_histos['eMtToMET'].Fill(row.eMtToMET) the_histos['muonJetPt'].Fill(max(row.mJetPt, row.mPt), weight) the_histos['muonAbsEta'].Fill(row.mAbsEta, weight) the_histos['muonPtRatio'].Fill(row.mPt/max(row.mJetPt, row.mPt), weight) @@ -190,11 +263,17 @@ def fill_muon(the_histos, row, fillNtuple=False): pfidiso02 = float( row.mPFIDTight and row.mRelPFIsoDB < 0.2) h2taucuts = float( row.mPFIDTight and ((row.mRelPFIsoDB < 0.15 and row.mAbsEta < 1.479) or row.mRelPFIsoDB < 0.1 )) h2taucuts020 = float( row.mPFIDTight and ((row.mRelPFIsoDB < 0.20 and row.mAbsEta < 1.479) or row.mRelPFIsoDB < 0.15)) - the_histos['muonInfo'].Fill( array("f", [row.mPt, row.mJetPt, row.mJetBtag, weight, pfidiso02, h2taucuts, h2taucuts020] ) ) - + muon_jet_mass = -1. #inv_mass(row.mPt, row.mEta, row.mPhi, row.leadingJetPt, row.leadingJetEta, row.leadingJetPhi) + + the_histos['muonInfo'].Fill( array("f", [row.mPt, max(row.mJetPt, row.mPt), max(0, row.mJetCSVBtag), + muon_jet_mass, row.jetVeto20, row.jetVeto40_DR05, weight, + pfidiso02, h2taucuts, h2taucuts020] ) ) + the_histos['evtInfo'].Fill(row) def fill_region(region,pt_cut): + if region is None: + return None fill(histos[(region, pt_cut)], row, True) for idlabel, idfcn in selections.electronIds.iteritems(): @@ -211,6 +290,8 @@ def fill_region(region,pt_cut): fill(histos[(region, pt_cut, idlabel+'_h2taucuts020')], row) def fill_muon_region(region, tag): + if region is None: + return None # This is a QCD or Wjets fill_muon(histos[(region, tag)], row, True) @@ -227,25 +308,56 @@ def fill_muon_region(region, tag): histos = self.histograms for row in self.tree: + cut_flow_trk.new_row(row.run,row.lumi,row.evt) + cut_flow_trk.Fill('bare') if not preselection(row): continue region = control_region(row) - if region is None: - continue - # This is a QCD or Wjets + muon_region = control_region_muon(row) + is7TeV = bool('7TeV' in os.environ['jobid']) use_iso_trigger = not is7TeV mu17e8 = (row.mu17ele8isoPass and row.mPt >= 20) if use_iso_trigger else (row.mu17ele8Pass and row.mPt >= 20) - mu8e17 = (row.mu8ele17isoPass and row.ePt >= 20) #if use_iso_trigger else (row.mu17ele8Pass and row.mPt < 20) + mu8e17 = (row.mu8ele17isoPass and row.ePt >= 20) if use_iso_trigger else (row.mu8ele17Pass and row.ePt >= 20) + + if env_lepton and env_lepton == 'e': + if mu17e8: + cut_flow_trk.Fill('trigger') + if row.mPFIDTight and row.mRelPFIsoDB < 0.15: + cut_flow_trk.Fill('tag ID ISO') + if row.mMtToMET > 35: + cut_flow_trk.Fill('tag MT') + if row.eMtToMET < 35: + cut_flow_trk.Fill('probe MT') + + elif env_lepton and env_lepton == 'm': + if mu8e17: + cut_flow_trk.Fill('trigger') + if selections.lepton_id_iso(row, 'e', 'eid12Medium_h2taucuts'): + cut_flow_trk.Fill('tag ID ISO') + if row.eMtToMET > 35: + cut_flow_trk.Fill('tag MT') + if row.mMtToMET < 35: + cut_flow_trk.Fill('probe MT') + + cut_flow_trk.flush() + if mu17e8: fill_region(region,'pt10') + if region == 'wjetsLtLow' and row.mMtToMET > 55: + fill_region('wjets', 'pt10') if mu8e17: fill_region(region,'pt20') - muon_region = control_region_muon(row) + if region == 'wjetsLtLow' and row.mMtToMET > 55: + fill_region('wjets', 'pt20') if muon_region: fill_muon_region(muon_region, 'pt10') + if muon_region == 'MwjetsLtLow' and row.eMtToMET > 55: + fill_muon_region('Mwjets', 'pt10') if row.mPt > 20: fill_muon_region(muon_region, 'pt20') + if muon_region == 'MwjetsLtLow' and row.eMtToMET > 55: + fill_muon_region('Mwjets', 'pt20') def finish(self): self.write_histos() diff --git a/wh/FakeRatesMM.py b/wh/FakeRatesMM.py index 86808db5..3846c97c 100755 --- a/wh/FakeRatesMM.py +++ b/wh/FakeRatesMM.py @@ -22,19 +22,39 @@ import baseSelections as selections import os import ROOT +from cutflowtracker import cut_flow_tracker +import math + +def inv_mass(pt1,eta1,phi1,pt2,eta2,phi2): + return math.sqrt( + 2*pt1*pt2*(math.cosh(eta1 - eta2) - math.cos(phi1 - phi2)) + ) + +#Makes the cut flow histogram +cut_flow_step = ['bare', 'trigger', + 'm1_m2_SS', 'm1_m2_DR', 'm1_m2_Mass', + 'muon Pt', 'muon AbsEta', 'muon PixHits', + 'muon JetCSVBtag', 'muon DZ', #'lead mu preselection', + 'lead mu pt', 'm1PFIDTight', 'sublead mu preselection', + 'muon veto', 'bjet veto', 'electron veto', + 'Jet presence', 'muon isolation', 'MET', 'region assignment' +] + def control_region(row): # Figure out what control region we are in. if row.m1RelPFIsoDB < 0.15 and row.m1MtToMET > 35 and row.m2MtToMET < 35: - return 'wjets' + return 'wjetsLtLow' elif row.m1RelPFIsoDB > 0.3 and row.type1_pfMetEt < 25: return 'qcd' else: return None +region_for_event_list = os.environ.get('EVTLIST_REGION','') +SYNC = ('SYNC' in os.environ) and eval(os.environ['SYNC']) class FakeRatesMM(MegaBase): - tree = 'mm/final/Ntuple' + tree = 'mm/final/Ntuple' if not SYNC else 'Ntuple' def __init__(self, tree, outfile, **kwargs): super(FakeRatesMM, self).__init__(tree, outfile, **kwargs) # Use the cython wrapper @@ -47,8 +67,14 @@ def __init__(self, tree, outfile, **kwargs): self.pucorrector = mcCorrectors.make_puCorrector('doublemu') def begin(self): - for region in ['wjets', 'qcd']:#, 'all']: - for denom in ['pt10', 'pt20']: #, 'pt10b', 'pt10t', 'pt10f']: + self.book('', "CUT_FLOW", "Cut Flow", len(cut_flow_step), 0, len(cut_flow_step)) + xaxis = self.histograms['CUT_FLOW'].GetXaxis() + self.cut_flow_histo = self.histograms['CUT_FLOW'] + for i, name in enumerate(cut_flow_step): + xaxis.SetBinLabel(i+1, name) + + for region in ['wjets', 'wjetsLtLow', 'qcd']:#, 'all']: + for denom in ['pt10', 'pt20']: denom_key = (region, denom) denom_histos = {} self.histograms[denom_key] = denom_histos @@ -57,7 +83,7 @@ def begin(self): denom_histos['muonInfo'] = self.book( os.path.join(region, denom), 'muonInfo', "muonInfo", - 'muonPt:muonJetPt:muonJetCSVBtag:muonPVDXY:weight:'+':'.join(self.lepIds), + 'muonPt:muonJetPt:muonAbsEta:muonJetCSVBtag:muonPVDXY:muonJetMass:numJets20:numJets40:weight:'+':'.join(self.lepIds), type=ROOT.TNtuple) for numerator in self.lepIds: @@ -99,24 +125,45 @@ def book_histo(name, *args, **kwargs): def process(self): - def preselection(row): + cut_flow_histo = self.cut_flow_histo + cut_flow_trk = cut_flow_tracker(cut_flow_histo) + cut_flow_trk.Fill('bare') + + def preselection(row, cut_flow_trk): double_mu_pass = row.doubleMuPass and \ row.m1MatchesDoubleMuPaths > 0 and \ row.m2MatchesDoubleMuPaths > 0 double_muTrk_pass = row.doubleMuTrkPass and \ - row.m1MatchesDoubleMuTrkPaths > 0 and \ - row.m2MatchesDoubleMuTrkPaths > 0 + row.m1MatchesMu17TrkMu8Path > 0 and \ + row.m2MatchesMu17TrkMu8Path > 0 if not ( double_mu_pass or double_muTrk_pass ): return False + cut_flow_trk.Fill('trigger') if not row.m1_m2_SS: return False + cut_flow_trk.Fill('m1_m2_SS') + + if row.m1_m2_DR < 0.5: return False + cut_flow_trk.Fill('m1_m2_DR') + if row.m2Pt > row.m1Pt: return False if row.m1_m2_Mass < 20: return False + cut_flow_trk.Fill('m1_m2_Mass') + + if not selections.muSelection(row, 'm1', cut_flow_trk): return False if not row.m1Pt > 20: return False + cut_flow_trk.Fill('lead mu pt') if not row.m1PFIDTight: return False - if not selections.muSelection(row, 'm1'): return False + cut_flow_trk.Fill('m1PFIDTight') + #cut_flow_trk.Fill('lead mu preselection') + if not selections.muSelection(row, 'm2'): return False - if not selections.vetos(row): return False #applies mu bjet e additional tau vetoes - if not (row.jetVeto40_DR05 >= 1): return False + cut_flow_trk.Fill('sublead mu preselection') + + if not selections.vetos(row, cut_flow_trk): return False #applies mu bjet e additional tau vetoes + #if not (row.jetVeto40_DR05 >= 1): return False + if row.jetVeto20 == 0: return False + cut_flow_trk.Fill('Jet presence') + return True def fill(the_histos, row, fillNtuple=False): @@ -145,39 +192,55 @@ def fill(the_histos, row, fillNtuple=False): pfidiso02 = float( row.m2PFIDTight and row.m2RelPFIsoDB < 0.2) h2taucuts = float( row.m2PFIDTight and ((row.m2RelPFIsoDB < 0.15 and row.m2AbsEta < 1.479) or row.m2RelPFIsoDB < 0.1 )) h2taucuts020 = float( row.m2PFIDTight and ((row.m2RelPFIsoDB < 0.20 and row.m2AbsEta < 1.479) or row.m2RelPFIsoDB < 0.15)) - the_histos['muonInfo'].Fill( array("f", [row.m2Pt, row.m2JetPt, max(0, row.m2JetCSVBtag), abs(row.m2PVDXY), weight, pfidiso02, h2taucuts, h2taucuts020] ) ) - + muon_jet_mass = -1. #inv_mass(row.m1Pt, row.m1Eta, row.m1Phi, row.leadingJetPt, row.leadingJetEta, row.leadingJetPhi) + + the_histos['muonInfo'].Fill( array("f", [row.m2Pt, max(row.m2JetPt, row.m2Pt), row.m2AbsEta, max(0, row.m2JetCSVBtag), + abs(row.m2PVDXY), muon_jet_mass, row.jetVeto20, row.jetVeto40_DR05, weight, + pfidiso02, h2taucuts, h2taucuts020] ) ) + + def fill_region(region, tag): + # This is a QCD or Wjets + fill(histos[(region, tag)], row, True) + + if row.m2PFIDTight: + if row.m2RelPFIsoDB < 0.2: + fill(histos[(region, tag, 'pfidiso02')], row) + + if (row.m2RelPFIsoDB < 0.15 and row.m2AbsEta < 1.479) or row.m2RelPFIsoDB < 0.1: + fill(histos[(region, tag, 'h2taucuts')], row) + + if (row.m2RelPFIsoDB < 0.20 and row.m2AbsEta < 1.479) or row.m2RelPFIsoDB < 0.15: + fill(histos[(region, tag, 'h2taucuts020')], row) + histos = self.histograms for row in self.tree: - if not preselection(row): + cut_flow_trk.new_row(row.run,row.lumi,row.evt) + cut_flow_trk.Fill('bare') + if not preselection(row, cut_flow_trk): continue + region = control_region(row) + if row.m1RelPFIsoDB > 0.3: + cut_flow_trk.Fill('muon isolation') + if row.type1_pfMetEt < 25: + cut_flow_trk.Fill('MET') + if region is None: continue + cut_flow_trk.Fill('region assignment') - def fill_region(region, tag): - # This is a QCD or Wjets - fill(histos[(region, tag)], row, True) - - if row.m2PFIDTight: - if row.m2RelPFIsoDB < 0.2: - fill(histos[(region, tag, 'pfidiso02')], row) - - if (row.m2RelPFIsoDB < 0.15 and row.m2AbsEta < 1.479) or row.m2RelPFIsoDB < 0.1: - fill(histos[(region, tag, 'h2taucuts')], row) + if region_for_event_list and region == region_for_event_list: + print '%i:%i:%i' % (row.run, row.lumi, row.evt) + continue - if (row.m2RelPFIsoDB < 0.20 and row.m2AbsEta < 1.479) or row.m2RelPFIsoDB < 0.15: - fill(histos[(region, tag, 'h2taucuts020')], row) - - #if (row.m2RelPFIsoDB < 0.25 and row.m2AbsEta < 1.479) or row.m2RelPFIsoDB < 0.20: - # fill(histos[(region, tag, 'h2taucuts025')], row) - fill_region(region, 'pt10') - #fill_region('all', 'pt10') + if region == 'wjetsLtLow' and row.m1MtToMET > 55: + fill_region('wjets', 'pt10') if row.m2Pt > 20: fill_region(region, 'pt20') - #fill_region('all', 'pt20') + if region == 'wjetsLtLow' and row.m1MtToMET > 55: + fill_region('wjets', 'pt20') def finish(self): self.write_histos() diff --git a/wh/PlotControlEM.py b/wh/PlotControlEM.py index c4ef81c1..78901e67 100644 --- a/wh/PlotControlEM.py +++ b/wh/PlotControlEM.py @@ -8,6 +8,9 @@ import glob from FinalStateAnalysis.PlotTools.Plotter import Plotter from FinalStateAnalysis.MetaData.data_styles import data_styles +import logging +import sys +logging.basicConfig(stream=sys.stderr, level=logging.INFO) jobid = os.environ['jobid'] @@ -92,7 +95,6 @@ def correct_for_contrib_in_fakes(x, fudge_factor=1.0): 0.95 if sqrts == 7 else 1.0) } -print plotter.views.keys() ww_name = 'WWJetsTo2L2Nu' if sqrts == 7 else 'WWJetsTo2L2Nu_TuneZ2_8TeV' plotter.views['WWJetsTo2L2Nu-no-fakes'] = { 'view': correct_for_contrib_in_fakes(plotter.views[ww_name]['view']) @@ -129,31 +131,32 @@ def correct_for_contrib_in_fakes(x, fudge_factor=1.0): for suffix, samples in [('', os_ss_samples), ('-fakes', fakes_samples)]: plotter.mc_samples = samples + #from pdb import set_trace; set_trace() plotter.plot_mc_vs_data('em', 'emMass', rebin=5, leftside=False, - xaxis='m_{e#mu} (GeV)') + xaxis='m_{e#mu} (GeV)')#, show_ratio=True) plotter.add_cms_blurb(sqrts) plotter.save('mass' + suffix) plotter.plot_mc_vs_data('em', 'emMass', rebin=10, leftside=False, - xaxis='m_{e#mu} (GeV)') + xaxis='m_{e#mu} (GeV)')#, show_ratio=True) plotter.add_cms_blurb(sqrts) plotter.save('mass_rebin' + suffix) - plotter.plot_mc_vs_data('em', 'mPt', rebin=10) + plotter.plot_mc_vs_data('em', 'mPt', rebin=10, show_ratio=True) plotter.save('mPt' + suffix) - plotter.plot_mc_vs_data('em', 'ePt', rebin=10) + plotter.plot_mc_vs_data('em', 'ePt', rebin=10, show_ratio=True) plotter.save('ePt' + suffix) - plotter.plot_mc_vs_data('em', 'mAbsEta', rebin=5) + plotter.plot_mc_vs_data('em', 'mAbsEta', rebin=5, show_ratio=True) plotter.save('mAbsEta' + suffix) - plotter.plot_mc_vs_data('em', 'eAbsEta', rebin=5) + plotter.plot_mc_vs_data('em', 'eAbsEta', rebin=5, show_ratio=True) plotter.save('eAbsEta' + suffix) - plotter.plot_mc_vs_data('em', 'nvtx') + plotter.plot_mc_vs_data('em', 'nvtx', show_ratio=True) plotter.save('nvtx' + suffix) - plotter.plot_mc_vs_data('em', 'bjetCSVVeto') + plotter.plot_mc_vs_data('em', 'bjetCSVVeto', show_ratio=True) plotter.save('bjetCSVVeto' + suffix) - plotter.plot_mc_vs_data('em', 'bjetVeto') + plotter.plot_mc_vs_data('em', 'bjetVeto', show_ratio=True) plotter.save('bjetVeto' + suffix) diff --git a/wh/PlotControlZEE.py b/wh/PlotControlZEE.py index b758adae..54c1feeb 100644 --- a/wh/PlotControlZEE.py +++ b/wh/PlotControlZEE.py @@ -8,13 +8,19 @@ import glob from FinalStateAnalysis.PlotTools.Plotter import Plotter from FinalStateAnalysis.PlotTools.MedianView import MedianView +from FinalStateAnalysis.PlotTools.DifferentialView import DifferentialView import rootpy.plotting.views as views +import rootpy.plotting as plotting from FinalStateAnalysis.PlotTools.HistToTGRaphErrors import HistStackToTGRaphErrors from FinalStateAnalysis.MetaData.data_styles import data_styles, colors import ROOT +import logging +import sys +logging.basicConfig(stream=sys.stderr, level=logging.INFO) ROOT.gROOT.SetBatch(True) - +ROOT.gStyle.SetOptStat(0) +ROOT.gStyle.SetOptTitle(0) class ControlZEEPlotter(Plotter): def __init__(self): @@ -22,11 +28,11 @@ def __init__(self): self.output_dir = os.path.join('results', self.jobid, 'plots', 'zee') samples = [ 'Zjets_M50', - #'WZ*', - #'ZZ*', - #'WW*', + 'WZ*', + 'ZZ*', + 'WW*', 'TT*', - #'WplusJets*', + 'WplusJets*', "data_DoubleE*", ] files = [] @@ -36,7 +42,19 @@ def __init__(self): files.extend(glob.glob('results/%s/ControlZEE/%s.root' % (self.jobid, x))) lumifiles.extend(glob.glob('inputs/%s/%s.lumicalc.sum' % (self.jobid, x))) super(ControlZEEPlotter, self).__init__(files, lumifiles, self.output_dir) - self.mc_samples = ['Zjets_M50'] + self.mc_samples = filter(lambda x: 'data' not in x, samples) + + def make_fakes_view(self, data_view, sign, weight_type): + # View of weighted obj1-fails data + obj1_view = views.SubdirectoryView(data_view, '%s/f1p2/%s' % (sign, weight_type)) + # View of weighted obj2-fails data + obj2_view = views.SubdirectoryView(data_view, '%s/p1f2/%s' % (sign, weight_type)) + # View of weighted obj1&2-fails data + obj12_view = views.SubdirectoryView(data_view, '%s/f1f2/%s' % (sign, weight_type)) + # Give the individual object views nice colors + subtract_obj12_view = views.ScaleView(obj12_view, -1) + return obj1_view, obj2_view, subtract_obj12_view + def get_flip_data(self, rebin=1, xaxis='', data_type='data'): data_view = self.get_view(data_type) @@ -45,57 +63,54 @@ def get_flip_data(self, rebin=1, xaxis='', data_type='data'): ss_p1p2_view = views.SubdirectoryView( data_view, 'ss/p1p2') ss_p1p2_view = views.TitleView( views.StyleView(ss_p1p2_view, **data_styles['data*']), 'observed;%s' % xaxis) - def make_fakes_view(sign, weight_type): - # View of weighted obj1-fails data - obj1_view = views.SubdirectoryView(data_view, '%s/f1p2/%s' % (sign, weight_type)) - # View of weighted obj2-fails data - obj2_view = views.SubdirectoryView(data_view, '%s/p1f2/%s' % (sign, weight_type)) - # View of weighted obj1&2-fails data - obj12_view = views.SubdirectoryView(data_view, '%s/f1f2/%s' % (sign, weight_type)) - # Give the individual object views nice colors - subtract_obj12_view = views.ScaleView(obj12_view, -1) - return obj1_view, obj2_view, subtract_obj12_view + #def make_fakes_view(sign, weight_type): + # # View of weighted obj1-fails data + # obj1_view = views.SubdirectoryView(data_view, '%s/f1p2/%s' % (sign, weight_type)) + # # View of weighted obj2-fails data + # obj2_view = views.SubdirectoryView(data_view, '%s/p1f2/%s' % (sign, weight_type)) + # # View of weighted obj1&2-fails data + # obj12_view = views.SubdirectoryView(data_view, '%s/f1f2/%s' % (sign, weight_type)) + # # Give the individual object views nice colors + # subtract_obj12_view = views.ScaleView(obj12_view, -1) + # return obj1_view, obj2_view, subtract_obj12_view #Get fakes according to WJets or QCD - ss_f1p2_qcd_view, ss_p1f2_qcd_view, ss_f1f2_qcd_view = make_fakes_view('ss','qcd_w') - ss_f1p2_wje_view, ss_p1f2_wje_view, ss_f1f2_wje_view = make_fakes_view('ss','wjet_w') + #ss_f1p2_qcd_view, ss_p1f2_qcd_view, ss_f1f2_qcd_view = self.make_fakes_view(data_view, 'ss','qcd_w') + ss_f1p2_wje_view, ss_p1f2_wje_view, ss_f1f2_wje_view = self.make_fakes_view(data_view, 'ss','wjet_w') - ss_fakes_1 = MedianView(ss_f1p2_qcd_view, ss_f1p2_wje_view) - ss_fakes_2 = MedianView(ss_p1f2_qcd_view, ss_p1f2_wje_view) - ss_fakes_12 = MedianView(ss_f1f2_qcd_view, ss_f1f2_wje_view) + ss_fakes_1 = ss_f1p2_wje_view #MedianView(lowv=ss_f1p2_qcd_view, highv=ss_f1p2_wje_view) + ss_fakes_2 = ss_p1f2_wje_view #MedianView(lowv=ss_p1f2_qcd_view, highv=ss_p1f2_wje_view) + ss_fakes_12 = ss_f1f2_wje_view #MedianView(lowv=ss_f1f2_qcd_view, highv=ss_f1f2_wje_view) ss_fakes_est = views.SumView(ss_fakes_1, ss_fakes_2, ss_fakes_12) ss_fakes_est = views.TitleView( views.StyleView(ss_fakes_est, **data_styles['Zjets*']), 'Fakes;%s' % xaxis) - ## os_f1p2_qcd_views, os_p1f2_qcd_views, os_f1f2_qcd_views = zip(make_fakes_view('os', 'qcd_w/charge_weightSysUp'), make_fakes_view('os', 'qcd_w/charge_weightSysDwn')) - ## os_f1p2_wje_views, os_p1f2_wje_views, os_f1f2_wje_views = zip(make_fakes_view('os', 'wjet_w/charge_weightSysUp'),make_fakes_view('os', 'wjet_w/charge_weightSysDwn')) - - ## os_f1p2_qcd_view = MedianView( *os_f1p2_qcd_views ) - ## os_p1f2_qcd_view = MedianView( *os_p1f2_qcd_views ) - ## os_f1f2_qcd_view = MedianView( *os_f1f2_qcd_views ) - - ## os_f1p2_wje_view = MedianView( *os_f1p2_wje_views ) - ## os_p1f2_wje_view = MedianView( *os_p1f2_wje_views ) - ## os_f1f2_wje_view = MedianView( *os_f1f2_wje_views ) - - ## os_fakes_1 = MedianView(os_f1p2_qcd_view, os_f1p2_wje_view) - ## os_fakes_2 = MedianView(os_p1f2_qcd_view, os_p1f2_wje_view) - ## os_fakes_12 = MedianView(os_f1f2_qcd_view, os_f1f2_wje_view) - ## os_fakes_est = views.SumView(os_fakes_1, os_fakes_2, os_fakes_12) - ## neg_os_fakes = views.ScaleView(os_fakes_est, -1) - os_flip_est_up = views.SubdirectoryView( data_view, 'os/p1p2/charge_weightSysUp') os_flip_est = views.SubdirectoryView( data_view, 'os/p1p2/charge_weight') - os_flip_est = MedianView(highv=os_flip_est_up, centv=os_flip_est) + #os_flip_est = MedianView(highv=os_flip_est_up, centv=os_flip_est) os_flip_est_nofake = os_flip_est#views.SumView(os_flip_est, neg_os_fakes) os_flip_est_nofake = views.TitleView( views.StyleView(os_flip_est_nofake, **data_styles['WZ*']), 'charge-fakes;%s' % xaxis) return ss_p1p2_view, ss_fakes_est, os_flip_est_nofake - def make_charge_flip_control_plot(self, variable, xaxis='', rebin=1, legend_on_the_left=False, data_type='data', x_range=None): - ss_p1p2_view, ss_fakes_est, os_flip_est_nofake = self.get_flip_data(rebin,xaxis,data_type) - events_estimate = views.StackView( ss_fakes_est,os_flip_est_nofake) + def make_charge_flip_control_plot(self, variable, xaxis='', rebin=1, legend_on_the_left=False, + data_type='data', x_range=None, apply_scale='', show_ratio=False, + differential=False): + ss_p1p2_view, ss_fakes_est, os_flip_est_nofake = self.get_flip_data(rebin, xaxis, data_type) + + if differential: + ss_p1p2_view = DifferentialView(ss_p1p2_view ) + ss_fakes_est = DifferentialView(ss_fakes_est ) + os_flip_est_nofake = DifferentialView(os_flip_est_nofake) + + fakes_hist = ss_fakes_est.Get(variable) + flip_hist = os_flip_est_nofake.Get(variable) + if apply_scale: + flip_hist = MedianView.apply_view(flip_hist, os_flip_est_nofake.Get(variable+apply_scale)) obs_hist = ss_p1p2_view.Get(variable) - estimate_hist = events_estimate.Get(variable) + estimate_hist = plotting.HistStack() + estimate_hist.Add(fakes_hist) + estimate_hist.Add(flip_hist) + estimate_error = HistStackToTGRaphErrors( estimate_hist ) estimate_error.SetFillStyle(3013) estimate_error.SetFillColor(ROOT.EColor.kBlack) @@ -127,17 +142,80 @@ def make_charge_flip_control_plot(self, variable, xaxis='', rebin=1, legend_on_t #legend.AddEntry(estimate_error,'f') legend.Draw() self.add_cms_blurb(self.sqrts) + if show_ratio: + self.add_ratio_plot(obs_hist, estimate_hist, x_range, ratio_range=0.2) + + + def plot_zee_control(self, variable, xaxis='', rebin=1, legend_on_the_left=False, + x_range=None, show_ratio=False, logscale=False): + data_view = self.get_view('data') + data_view = self.rebin_view(data_view, rebin) if rebin != 1 else data_view + mc_views = [self.get_view(i) for i in [ 'ZZ*', 'WZ*', 'WW*', 'TT*', 'Zjets_M50' ] ] + if rebin != 1: + mc_views = [self.rebin_view(i, rebin) for i in mc_views] + + zee_data = views.SubdirectoryView( data_view, 'os/p1p2/') + zee_mcs = [ views.SubdirectoryView( i, 'os/p1p2/') for i in mc_views] + + #os_f1p2_qcd_view, os_p1f2_qcd_view, os_f1f2_qcd_view = self.make_fakes_view(data_view, 'os','qcd_w') + os_f1p2_wje_view, os_p1f2_wje_view, os_f1f2_wje_view = self.make_fakes_view(data_view, 'os','wjet_w') + os_fakes_1 = os_f1p2_wje_view #MedianView(lowv=os_f1p2_qcd_view, highv=os_f1p2_wje_view) + os_fakes_2 = os_p1f2_wje_view #MedianView(lowv=os_p1f2_qcd_view, highv=os_p1f2_wje_view) + os_fakes_12 = os_f1f2_wje_view #MedianView(lowv=os_f1f2_qcd_view, highv=os_f1f2_wje_view) + os_fakes_est = views.SumView(os_fakes_1, os_fakes_2, os_fakes_12) + os_fakes_est = views.TitleView( views.StyleView(os_fakes_est, **data_styles['WplusJets*']), 'Fakes;%s' % xaxis) + + zee_mcs = zee_mcs[:-1]+[os_fakes_est]+zee_mcs[-1:] + events_estimate = views.StackView( *zee_mcs) + estimate_hist = events_estimate.Get(variable) + obs_hist = zee_data.Get(variable) + hmax = max( [ estimate_hist.GetMaximum(), max(list(obs_hist)) ] ) + if logscale: + obs_hist.GetYaxis().SetRangeUser(10**-2,hmax*10**4) + self.pad.SetLogy(True) + else: + obs_hist.GetYaxis().SetRangeUser(0.,hmax*1.3) + + if x_range: + obs_hist.GetXaxis().SetRangeUser(x_range[0],x_range[1]) + + obs_hist.Draw() + estimate_hist.Draw('same') + obs_hist.Draw('same') + self.canvas.Update() + self.keep.extend([ + estimate_hist, + obs_hist + ]) + + legend = self.add_legend([obs_hist], leftside=legend_on_the_left, entries=len(zee_mcs)+1) + legend.AddEntry(estimate_hist,'f') + #legend.AddEntry(estimate_error,'f') + legend.Draw() + if show_ratio: + self.add_ratio_plot(obs_hist, estimate_hist, x_range, ratio_range=0.2) + self.add_cms_blurb(self.sqrts) plotter = ControlZEEPlotter() +########################################################################### +## CHARGE FLIP CONTROL PLOTS ######################################### +########################################################################### + #Charge flip control plots -plotter.make_charge_flip_control_plot('TrkMass','Tracker Inv Mass (GeV)',2) +plotter.make_charge_flip_control_plot('TrkMass','Tracker Inv Mass (GeV)', + [40,50,60,70,75,80]+[80+i for i in range(1,21,2)]+[105,110,120,130,140], + apply_scale='_high', show_ratio=True, differential=True) plotter.save('EE_Charge_Flip_xcheck_trk_invMass') plotter.canvas.SaveAs('test.root') #plotter.save('EE_Charge_Flip_xcheck_trk_invMass_log') +plotter.make_charge_flip_control_plot('TrkMass','Tracker Inv Mass (GeV)',[40, 150],apply_scale='_high', + show_ratio=True) +plotter.save('EE_Charge_Flip_xcheck_trk_invMass_counting') + plotter.make_charge_flip_control_plot('TrkMass_NOSCALE','Tracker Inv Mass (GeV)',2) plotter.save('EE_Charge_Flip_xcheck_trk_invMass_NoScale') @@ -176,3 +254,93 @@ def make_charge_flip_control_plot(self, variable, xaxis='', rebin=1, legend_on_t plotter.make_charge_flip_control_plot('ePt','electron p_{T}',2,x_range=[0,200], data_type='Zjets_M50') plotter.save('EE_Charge_Flip_closure_ePt') + +########################################################################### +## DATA/MC PLOTS ######################################### +########################################################################### + +#plotter.plot_mc_vs_data('os/p1p2/', 'TrkMass', rebin=2, xaxis='m_{#mu#mu} (GeV)', +# leftside=False, show_ratio=True) +#plotter.add_cms_blurb(plotter.sqrts) +#for obj in plotter.keep: +# if obj.ClassName().startswith('TH1F'): +# print obj.GetTitle(), obj.Integral() +# if obj.ClassName().startswith('THStack'): +# for histo in obj.GetHists(): +# print histo.GetTitle(), histo.Integral() +# +#plotter.save('mass') +# +# +#plotter.plot_mc_vs_data('os/p1p2/', 'TrkMass', rebin=2, xaxis='m_{#mu#mu} (GeV)', +# leftside=False, show_ratio=True) +#plotter.add_cms_blurb(plotter.sqrts) +#plotter.pad.SetLogy(True) +#plotter.save('mass_log') +# +#plotter.plot_mc_vs_data('os/p1p2/', 'TrkMass', rebin=10, xaxis='m_{#mu#mu} (GeV)', +# leftside=False, show_ratio=True) +#plotter.add_cms_blurb(plotter.sqrts) +#plotter.save('mass_rebin') +# +#plotter.plot_mc_vs_data('os/p1p2/', 'e1Pt', leftside=False, show_ratio=True) +#plotter.save('e1Pt') +#plotter.plot_mc_vs_data('os/p1p2/', 'e1Pt', 5, leftside=False, show_ratio=True) +#plotter.save('e1Pt_rebin') +#plotter.plot_mc_vs_data('os/p1p2/', 'e2Pt', leftside=False, show_ratio=True) +#plotter.save('e2Pt') +#plotter.plot_mc_vs_data('os/p1p2/', 'e2Pt', 5, leftside=False, show_ratio=True) +#plotter.save('e2Pt_rebin') +# +#plotter.plot_mc_vs_data('os/p1p2/', 'e1AbsEta', leftside=False, show_ratio=True) +#plotter.save('e1AbsEta') +#plotter.plot_mc_vs_data('os/p1p2/', 'e2AbsEta', leftside=False, show_ratio=True) +#plotter.save('e2AbsEta') +# +#plotter.plot_mc_vs_data('os/p1p2/', 'e1AbsEta', 5, leftside=False, show_ratio=True) +#plotter.save('e1AbsEta_rebin') +#plotter.plot_mc_vs_data('os/p1p2/', 'e2AbsEta', 5, leftside=False, show_ratio=True) +#plotter.save('e2AbsEta_rebin') +# +# +#plotter.plot_mc_vs_data('os/p1p2/', "trig_weight" , 5, leftside=False, show_ratio=True) +#plotter.save('trig_weight') +# +#plotter.plot_mc_vs_data('os/p1p2/', "PU_weight" , 5, leftside=False, show_ratio=True) +#plotter.save('PU_weight') +# +#plotter.plot_mc_vs_data('os/p1p2/', "idIso_weight", 5, leftside=False, show_ratio=True) +#plotter.save('idIso_weight') + + +#plotter.plot_mc_vs_data('os/p1p2/', 'nvtx', show_ratio=True) +#plotter.save('nvtx') + +########################################################################### +## DATA/MC+FAKES PLOTS ######################################### +########################################################################### + +plotter.plot_zee_control('TrkMass', rebin=2, xaxis='m_{#mu#mu} (GeV)', + legend_on_the_left=False, show_ratio=True, logscale=True) +plotter.save('mass_wfakes_log') + +#print data_styles.keys() +plotter.plot_zee_control('TrkMass', rebin=2, xaxis='m_{#mu#mu} (GeV)', + legend_on_the_left=False, show_ratio=True) +plotter.save('mass_wfakes') + +plotter.plot_zee_control('e1Pt', rebin=5, xaxis='p_{T}^{#mu1} (GeV)', + legend_on_the_left=False, show_ratio=True, x_range=[0,200]) +plotter.save('e1Pt_wfakes') + +plotter.plot_zee_control('e2Pt', rebin=5, xaxis='p_{T}^{#mu2} (GeV)', + legend_on_the_left=False, show_ratio=True, x_range=[0,200]) +plotter.save('e2Pt_wfakes') + +plotter.plot_zee_control('e1AbsEta', rebin=5, xaxis='|#eta|^{#mu1}', + legend_on_the_left=False, show_ratio=True) +plotter.save('e1AbsEta_wfakes') + +plotter.plot_zee_control('e2AbsEta', rebin=5, xaxis='|#eta|^{#mu2}', + legend_on_the_left=False, show_ratio=True) +plotter.save('e2AbsEta_wfakes') diff --git a/wh/PlotControlZMM.py b/wh/PlotControlZMM.py index 237004e3..a9affcf7 100644 --- a/wh/PlotControlZMM.py +++ b/wh/PlotControlZMM.py @@ -7,6 +7,9 @@ import os import glob from FinalStateAnalysis.PlotTools.Plotter import Plotter +import logging +import sys +logging.basicConfig(stream=sys.stderr, level=logging.INFO) jobid = os.environ['jobid'] @@ -14,11 +17,11 @@ samples = [ 'Zjets_M50', - #'WZ*', - #'ZZ*', - #'WW*', + 'WZ*', + 'ZZ*', + 'WW*', 'TT*', - #'WplusJets*', + 'WplusJets*', "data_DoubleMu*", ] @@ -30,36 +33,36 @@ lumifiles.extend(glob.glob('inputs/%s/%s.lumicalc.sum' % (jobid, x))) plotter = Plotter(files, lumifiles, output_dir) -plotter.mc_samples = ['Zjets_M50'] +plotter.mc_samples = filter(lambda x: 'data' not in x.lower(), samples) #['Zjets_M50'] sqrts = 7 if '7TeV' in jobid else 8 -plotter.plot_mc_vs_data('zmm', 'm1m2Mass', rebin=2, xaxis='m_{#mu#mu} (GeV)') +plotter.plot_mc_vs_data('zmm', 'm1m2Mass', rebin=2, xaxis='m_{#mu#mu} (GeV)')#, show_ratio=True) plotter.add_cms_blurb(sqrts) plotter.save('mass') -plotter.plot_mc_vs_data('zmm', 'm1m2Mass', rebin=6, xaxis='m_{#mu#mu} (GeV)') +plotter.plot_mc_vs_data('zmm', 'm1m2Mass', rebin=6, xaxis='m_{#mu#mu} (GeV)')#, show_ratio=True) plotter.add_cms_blurb(sqrts) plotter.save('mass_rebin') -plotter.plot_mc_vs_data('zmm', 'm1Pt') +plotter.plot_mc_vs_data('zmm', 'm1Pt', show_ratio=True) plotter.save('m1Pt') -plotter.plot_mc_vs_data('zmm', 'm1Pt', 5) +plotter.plot_mc_vs_data('zmm', 'm1Pt', 5, show_ratio=True) plotter.save('m1Pt_rebin') -plotter.plot_mc_vs_data('zmm', 'm2Pt') +plotter.plot_mc_vs_data('zmm', 'm2Pt', show_ratio=True) plotter.save('m2Pt') -plotter.plot_mc_vs_data('zmm', 'm2Pt', 5) +plotter.plot_mc_vs_data('zmm', 'm2Pt', 5, show_ratio=True) plotter.save('m2Pt_rebin') -plotter.plot_mc_vs_data('zmm', 'm1AbsEta') +plotter.plot_mc_vs_data('zmm', 'm1AbsEta', show_ratio=True) plotter.save('m1AbsEta') -plotter.plot_mc_vs_data('zmm', 'm2AbsEta') +plotter.plot_mc_vs_data('zmm', 'm2AbsEta', show_ratio=True) plotter.save('m2AbsEta') -plotter.plot_mc_vs_data('zmm', 'm1AbsEta', 5) +plotter.plot_mc_vs_data('zmm', 'm1AbsEta', 5, show_ratio=True) plotter.save('m1AbsEta_rebin') -plotter.plot_mc_vs_data('zmm', 'm2AbsEta', 5) +plotter.plot_mc_vs_data('zmm', 'm2AbsEta', 5, show_ratio=True) plotter.save('m2AbsEta_rebin') -plotter.plot_mc_vs_data('zmm', 'nvtx') +plotter.plot_mc_vs_data('zmm', 'nvtx', show_ratio=True) plotter.save('nvtx') diff --git a/wh/Rakefile b/wh/Rakefile index 7b4e87cd..190bcaff 100755 --- a/wh/Rakefile +++ b/wh/Rakefile @@ -2,6 +2,7 @@ recipes = ENV['CMSSW_BASE'] + '/src/FinalStateAnalysis/PlotTools/rake/recipes.rake' import recipes require ENV['CMSSW_BASE'] + '/src/FinalStateAnalysis/PlotTools/rake/tools.rb' +require 'pathname' $jobid = ENV['jobid'] $blind = ENV['blind'] @@ -12,7 +13,8 @@ if $jobid.include? '7TeV' $period = '7TeV' end -check_luminosity(['data_DoubleElectron', 'data_DoubleMu', 'data_MuEG'], $period, $jobid) +#check_luminosity(['data_DoubleElectron', 'data_DoubleMu', 'data_MuEG'], $period, $jobid) +check_luminosity(['data_DoubleMu'], $period, $jobid) task :getlumi, [:sample] do |t, args| puts get_lumi(args.sample, $jobid) @@ -33,10 +35,13 @@ end #puts get_sample_names('data_DoubleMu') samples = Hash[ - "ewk" => Array['Zjets_M50', 'WplusJets_madgraph', 'TTplusJets_madgraph'] + get_sample_names('WZ') + get_sample_names('WWJet')+ get_sample_names('ZZ'), #'ZZJetsTo4L_pythia', + "ewk" => Array['Zjets_M50', 'WplusJets_madgraph'] + get_sample_names('TTplusJets') + get_sample_names('WZ') + get_sample_names('WWJet')+ get_sample_names('ZZ'), #'ZZJetsTo4L_pythia', "wjets" => Array['WplusJets_madgraph'], + "ttbar" => get_sample_names('TTplusJets'), "zjets" => Array['Zjets_M50'], "diboson" => get_sample_names('ZZ')+get_sample_names('WZ') + get_sample_names('WWJet'), + "diboson4fakes" => get_sample_names('ZZ')+get_sample_names('WZJetsTo3LNu_ZToTauTau'), + "WZ" => get_sample_names('WZJetsTo3LNu_ZToTauTau'), "signal" => get_sample_names('VH') + get_sample_names('WH'), # Automagically figure out what data samples we have "data_m" => get_sample_names("data_SingleMu"), @@ -182,71 +187,95 @@ end def make_kNN(chan, datas) return Hash[ - "samples" => Array["diboson", "data_#{datas.downcase}"], + "samples" => Array["diboson4fakes", "data_#{datas.downcase}"], "analyzer" => "FakeRates#{chan.upcase}", 'fitter' => 'train_kNN.py', + #'neighbors' => neighbors, ] end -iso_points = ['idiso02', 'h2taucuts', 'h2taucuts020'] -electronIds = ['eid12Loose', 'eid12Medium', 'eid12Tight'] #, 'eid13Loose', 'eid13Tight'] +iso_points = ['h2taucuts', 'h2taucuts020'] #'idiso02', +electronIds = ['eid12Medium', 'eid12Tight'] #, 'eid13Loose', 'eid12Loose', 'eid13Tight'] elewps = electronIds.product(iso_points) elewps = elewps.map{|x,y| "#{x}_#{y}"} -pt_regions = ['pt10', 'pt20'] -muonwps = ['h2taucuts', 'h2taucuts020', 'pfidiso02'] +ee_wps = ['eid12Medium_h2taucuts020', 'eid12Tight_h2taucuts'] +em_wps = ['eid12Medium_h2taucuts'] + +pt_regions = ['pt10']#, 'pt20'] +muonwps = ['h2taucuts', 'h2taucuts020'] #, 'pfidiso02'] fr_fits = Hash.new kNN_trains = Hash.new -muon_kNN_vars= ['muonJetPt', 'muonPt', 'muonJetCSVBtag'] #'muonPVDXY'] -electron_kNN_vars= ['electronJetPt', 'electronPt'] - +muon_kNN_vars= ['muonJetPt', 'muonPt', 'numJets20'] +electron_kNN_vars= ['electronJetPt', 'electronPt', 'numJets20'] +neighbors = ['50'] # '100'] #, ] ############# # EM datas ############# -emcrs = ['qcd', 'wjets'] -elewps.each do |ele_wp| +emcrs = [ 'wjets', 'ttbar']#'qcd', +#elewps.select{|x| x.start_with?('eid12Medium')}.each do |ele_wp| +em_wps.each do |ele_wp| emcrs.each do |cr| - pt_regions.each do |ptr| - key = "e_#{cr}_#{ptr}_#{ele_wp}_eJetPt" - #fr_fits[key] = make_exponential('em', 'em') #fit EVERYTHING with exponential, in case change afterwards - - key = "e_#{cr}_#{ptr}_#{ele_wp}_electronInfo" - kNN_trains[key] = make_kNN('em', 'em') - kNN_trains[key]['vars'] = electron_kNN_vars + neighbors.each do |k| + pt_regions.each do |ptr| + key = "em_#{cr}_#{ptr}_#{ele_wp}_eJetPt" + #fr_fits[key] = make_exponential('em', 'em') #fit EVERYTHING with exponential, in case change afterwards + + key = "em_#{cr}_#{ptr}_#{ele_wp}_electronInfo_k#{k}" + kNN_trains[key] = make_kNN('em', 'em') + kNN_trains[key]['vars'] = electron_kNN_vars + + if cr == 'ttbar' + kNN_trains[key]['samples'] = Array['data_em'] + end + end end end end #muon fakes from em -#mmcrs = ['qcd', 'wjets'] +mmcrs = [ 'wjets', 'ttbar']#'qcd', #muonwps.each do |mu_wp| -# mmcrs.each do |cr| -# pt_regions.each do |ptr| -# key = "m_M#{cr}_#{ptr}_#{mu_wp}_muonInfo" -# kNN_trains[key] = make_kNN('em', 'em') -# kNN_trains[key]['vars'] = muon_kNN_vars -# end -# end -#end +['h2taucuts'].each do |mu_wp| + mmcrs.each do |cr| + neighbors.each do |k| + pt_regions.each do |ptr| + key = "em_M#{cr}_#{ptr}_#{mu_wp}_muonInfo_k#{k}" + kNN_trains[key] = make_kNN('em', 'em') + kNN_trains[key]['vars'] = muon_kNN_vars + + if cr == 'ttbar' + kNN_trains[key]['samples'] = Array['data_em'] + end + end + end + end +end ############# # EE datas ############# -eecrs = ['qcd', 'wjetsNoZmass'] -elewps.each do |ele_wp| - eecrs.each do |cr| - key = "ee_#{cr}_pt10_#{ele_wp}_electronJetPt" - #fr_fits[key] = make_landau('ee', 'ee') #fit pt10 with landau - key = "ee_#{cr}_pt20_#{ele_wp}_electronJetPt" - #fr_fits[key] = make_exponential('ee', 'ee') #fit pt20 with expo - - key = "ee_#{cr}_pt10_#{ele_wp}_electronInfo" - kNN_trains[key] = make_kNN('ee', 'ee') - kNN_trains[key]['vars'] = electron_kNN_vars - key = "ee_#{cr}_pt20_#{ele_wp}_electronInfo" - kNN_trains[key] = make_kNN('ee', 'ee') - kNN_trains[key]['vars'] = electron_kNN_vars +eecrs = [ 'wjetsNoZmass'] #['qcd', +#elewps.each do |ele_wp| +ee_wps.each do |ele_wp| + neighbors.each do |k| + eecrs.each do |cr| + pt_regions.each do |ptr| + key = "ee_#{cr}_#{ptr}_#{ele_wp}_electronJetPt" + #fr_fits[key] = make_landau('ee', 'ee') #fit pt10 with landau + + key = "ee_#{cr}_#{ptr}_#{ele_wp}_electronInfo_k#{k}" + kNN_trains[key] = make_kNN('ee', 'ee') + kNN_trains[key]['vars'] = electron_kNN_vars + #if ele_wp == 'eid12Tight_h2taucuts': + # kNN_trains[key]['samples'] = Array["WZ", 'data_ee'] + #end + if cr == 'qcd' + kNN_trains[key]['samples'] = Array['data_ee'] + end + end + end end end #fr_fits["ee_wjetsNoZmass_pt10_eid12Medium_h2taucuts020_electronJetPt"] = make_constant('ee', 'ee') @@ -254,21 +283,26 @@ end ############# # MM datas ############# -mmcrs = ['qcd', 'wjets'] +muon_kNN_vars= ['muonJetPt', 'muonPt', 'numJets20'] +mmcrs = [ 'wjets']#'qcd', muonwps.each do |mu_wp| mmcrs.each do |cr| - pt_regions.each do |ptr| - key = "m_#{cr}_#{ptr}_#{mu_wp}_muonJetPt" - #fr_fits[key] = make_landau('mm', 'mm') - - key = "m_#{cr}_#{ptr}_#{mu_wp}_muonInfo" - kNN_trains[key] = make_kNN('mm', 'mm') - kNN_trains[key]['vars'] = muon_kNN_vars + neighbors.each do |k| + pt_regions.each do |ptr| + key = "mm_#{cr}_#{ptr}_#{mu_wp}_muonJetPt" + #fr_fits[key] = make_landau('mm', 'mm') + + key = "mm_#{cr}_#{ptr}_#{mu_wp}_muonInfo_k#{k}" + kNN_trains[key] = make_kNN('mm', 'mm') + kNN_trains[key]['vars'] = muon_kNN_vars + + if cr == 'qcd' + kNN_trains[key]['samples'] = Array['data_mm'] + end + end end end end -#fr_fits["m_qcd_pt20_h2taucuts_muonJetPt"] = make_cruijff('mm', 'mm') -#fr_fits["m_qcd_pt20_h2taucuts020_muonJetPt"] = make_cruijff('mm', 'mm') #Tau stuff (by hand, they are just 2) @@ -359,19 +393,20 @@ kNN_trains.each do |kNN, info| cut = '' var = '' - if kNN_configuration.size() == 6 #check if we have an idIso with _ separation + if kNN_configuration.size() == 7 #check if we have an idIso with _ separation region = kNN_configuration[1] denom = kNN_configuration[2] cut = "#{kNN_configuration[3]}_#{kNN_configuration[4]}" var = kNN_configuration[5] + neigh = kNN_configuration[6].sub('k','') else #otherwise as usual region = kNN_configuration[1] denom = kNN_configuration[2] cut = kNN_configuration[3] var = kNN_configuration[4] + neigh = kNN_configuration[5].sub('k','') end - knn_output = $frfit_dir + "/#{kNN}.kNN.root" # Expand sample list subsample_inputs = [] @@ -379,18 +414,42 @@ kNN_trains.each do |kNN, info| subsample_inputs += samples[sample] end subsamples_inputs_result_list = subsample_inputs.map{|x| "results/#{$jobid}/#{info['analyzer']}/#{x}.root"} - subsample_input_list = subsamples_inputs_result_list.join(" ") + + data_list = subsamples_inputs_result_list.select{|x| x.include? 'data_'} + mc_list = subsamples_inputs_result_list.select{|x| not x.include? 'data_'} + #subsample_input_list = subsamples_inputs_result_list.join(" ") # Path to tree in root files tree_path = Array[region, denom, var].join("/") vars_str = info['vars'].join(" ") - file knn_output => subsamples_inputs_result_list + [info['analyzer'] + '.py',] do |t| + + knn_all_output = $frfit_dir + "/#{kNN}.ALL.kNN.root" + file knn_all_output => data_list + [info['analyzer'] + '.py',] do |t| + sh "mkdir -p #{$frfit_dir}" + sh "train_kNN.py --files #{data_list.join(' ')} #{mc_list.join(' ')} --outputfile #{t.name} --tree #{tree_path} --cut #{cut} --variables #{vars_str} --makePlots 1 --neighbors 100" #{neigh}" + end + task :kNN => knn_all_output + kNN_files << knn_all_output + + knn_data_output = $frfit_dir + "/#{kNN}.data.kNN.root" + file $frfit_dir + "/#{kNN}.data.kNN.root" => data_list + [info['analyzer'] + '.py',] do |t| sh "mkdir -p #{$frfit_dir}" - sh "train_kNN.py --files #{subsample_input_list} --outputfile #{knn_output} --tree #{tree_path} --cut #{cut} --variables #{vars_str} --makePlots 0" + sh "train_kNN.py --files #{data_list.join(' ')} --outputfile #{t.name} --tree #{tree_path} --cut #{cut} --variables #{vars_str} --makePlots 1 --neighbors #{neigh}" + end + task :kNN => knn_data_output + kNN_files << knn_data_output + + mc_list.each do |mc_input| + base = Pathname.new(mc_input).basename.sub('.root','') + kNN_mc_output = $frfit_dir + "/#{kNN}.#{base}.kNN.root" + file kNN_mc_output => [mc_input] + [info['analyzer'] + '.py',] do |t| + sh "mkdir -p #{$frfit_dir}" + sh "train_kNN.py --files #{mc_input} --outputfile #{t.name} --tree #{tree_path} --cut #{cut} --variables #{vars_str} --makePlots 0 --neighbors #{neigh} --forceLumi -1" + end + task :kNN => kNN_mc_output + kNN_files << kNN_mc_output end - task :kNN => knn_output - kNN_files << knn_output end #Rake.application.tasks.each do |t| @@ -423,17 +482,18 @@ task :fits => :charge_fakes fake_rate_files = fr_fits.keys.map{|x| "#{$frfit_dir}/#{x}.root"} # IF the FR fits change, make sure we re-run the analyses -file "WHAnalyzeEMT.py" => kNN_files.select{|x| x.start_with?("#{$frfit_dir}/e_")} + \ - kNN_files.select{|x| x.start_with?("#{$frfit_dir}/m_")} + \ +file "WHAnalyzeEMT.py" => kNN_files.select{|x| x.start_with?("#{$frfit_dir}/em_")} + \ + #kNN_files.select{|x| x.start_with?("#{$frfit_dir}/m_")} + \ fake_rate_files.select{|x| x.start_with?("#{$frfit_dir}/t_")} + \ Array["optimizer.py", 'WHAnalyzerBase.py', "fakerate_functions.py", "mcCorrectors.py"] do |t| + puts t.investigation sh "touch #{t.name}" end -file "WHAnalyzeMMT.py" => kNN_files.select{|x| x.start_with?("#{$frfit_dir}/m_")} + \ +file "WHAnalyzeMMT.py" => kNN_files.select{|x| x.start_with?("#{$frfit_dir}/mm_")} + \ fake_rate_files.select{|x| x.start_with?("#{$frfit_dir}/t_")} + \ ["optimizer.py", 'WHAnalyzerBase.py', @@ -452,9 +512,9 @@ file "WHAnalyzeEET.py" => kNN_files.select{|x| x.start_with?( "#{$frfit_dir}/ee_ sh "touch #{t.name}" end -mmt_results = get_analyzer_results("WHAnalyzeMMT.py", samples['ewk'] + samples['data_mm'] + samples['signal']) -emt_results = get_analyzer_results("WHAnalyzeEMT.py", samples['ewk'] + samples['data_em'] + samples['signal']) -eet_results = get_analyzer_results("WHAnalyzeEET.py", samples['ewk'] + samples['data_ee'] + samples['signal']) +mmt_results = get_analyzer_results("WHAnalyzeMMT.py", samples['diboson'] + samples['data_mm'] + samples['signal'] + samples["ttbar"] + samples['zjets']) +emt_results = get_analyzer_results("WHAnalyzeEMT.py", samples['diboson'] + samples['data_em'] + samples['signal'] + samples["ttbar"] + samples['zjets']) +eet_results = get_analyzer_results("WHAnalyzeEET.py", samples['diboson'] + samples['data_ee'] + samples['signal'] + samples["ttbar"] + samples['zjets']) mmt_debug = get_analyzer_results("WHAnalyzeMMT.py", Array['Zjets_M50'] ) task :mmt_dbg => mmt_debug @@ -467,7 +527,7 @@ task :eet => eet_results task :mmcontrol => get_analyzer_results("ControlZMM.py", samples['ewk'] + samples['data_mm']) task :emcontrol => get_analyzer_results("ControlEM.py", samples['ewk'] + samples['data_em']) -task :eecontrol => get_analyzer_results("ControlZEE.py", samples['data_ee'] + samples["zjets"]) + Dir.glob("#{$frfit_dir}/ee*h2taucuts_electronJetPt.root") #samples['ewk'] + +task :eecontrol => get_analyzer_results("ControlZEE.py", samples['data_ee'] + samples["ewk"]) + Dir.glob("#{$frfit_dir}/ee*h2taucuts_electronJetPt.root") #samples['ewk'] + task :mmt_signal => get_analyzer_results("WHAnalyzeMMT.py", samples['signal']) task :emt_signal => get_analyzer_results("WHAnalyzeEMT.py", samples['signal']) @@ -523,6 +583,7 @@ file "#{$zeedir}/.plot_timestamp" => Array["PlotControlZEE.py"]+get_analyzer_res end task :plot_zee => "#{$zeedir}/.plot_timestamp" + ################################################################################ # Recipes to make signal plots # targets: @@ -555,15 +616,14 @@ file "#{$eetdir}/eet_shapes_#{$period}.root" => ['WHPlotterEET.py', 'WHPlotterBa end task :plot_eet => "#{$eetdir}/eet_shapes_#{$period}.root" -################################################################################ -# Recipes to make data cards (plots come for free) -# targets: -# mmt_shapes -# emt_shapes -# eet_shapes -# cards -# copycards -> move cards to official HTT CVS area -################################################################################ + +################################################################################# +#### +#### HELPER FUNCTIONS TO COMPUTE LIMITS +#### +################################################################################# +$carddir = "FIXME" #TO BE CHANGED BY THE DIFFERENT PARTS + #categories $categories_map = Hash[ @@ -572,6 +632,7 @@ $categories_map = Hash[ 'mmt' => File.open("card_config/cgs.conf.mmt.#{$period}").select {|x| x.start_with? 'categories'}[0].split(':')[1].split(',').map{|x| x.strip}, ] + # Recipes for adding stat. error shapes. Makes a new file task: # input_file_stat_errors.root => input_file.root def add_fake_errors(input_file, channel, prefix) @@ -583,55 +644,6 @@ def add_fake_errors(input_file, channel, prefix) return output_file end -mmt_shape_file = "#{$mmtdir}/mmt_shapes_#{$period}.root" -$categories_map['mmt'].each do |category| - mmt_shape_file = add_fake_errors(mmt_shape_file, "mmt", category) -end -task :mmt_shapes => mmt_shape_file - -emt_shape_file = "#{$emtdir}/emt_shapes_#{$period}.root" -$categories_map['emt'].each do |category| - emt_shape_file = add_fake_errors(emt_shape_file, "emt", category) -end -task :emt_shapes => emt_shape_file - -eet_shape_file = "#{$eetdir}/eet_shapes_#{$period}.root" -$categories_map['eet'].each do |category| - eet_shape_file = add_fake_errors(eet_shape_file, "eet", category) -end -task :eet_shapes => eet_shape_file - -$carddir = "results/#{$jobid}/cards" - -cardmasses = get_sample_names('VH') #get all the VH samples available -cardmasses = cardmasses.select{|x| x.include? "H2Tau"} #get only the H2Tau, to avid repetition -cardmasses = cardmasses.map{|x| x.sub("VH_H2Tau_M-","")} #remove trailing name, the leftover is the mass (as a string) -cardmasses = cardmasses.map{|x| Integer(x)} #maps to integers (don't know if it's really needed but can't harm) -cardmasses = cardmasses.select{|x| x <= 140} #FIXME! to be removed! -#puts cardmasses - -$to_extrapolate = cardmasses.select{|x| x > 140} - -def make_morphing_task(channel, shapefile) - ret = "#{$carddir}/#{channel}/shapes.root" - file ret => [shapefile] do |t| - sh "mkdir -p `dirname #{t.name}`" - sh "cp #{t.prerequisites[0]} #{t.name}" - sh "horizontal-morphing.py --categories='#{$categories_map[channel].join(',')}' --samples='WH_hww{MASS}' --uncerts='' --masses='110,120,130,140' --step-size=5 -i #{t.name}"# --extrapolate=#{$to_extrapolate.join(",")} #{t.name}" #FIXME! to be removed! - end - return ret -end - -mmt_morphed_shape_file = make_morphing_task('mmt', mmt_shape_file) -task :mmt_morphed_shapes => mmt_morphed_shape_file - -emt_morphed_shape_file = make_morphing_task('emt', emt_shape_file) -task :emt_morphed_shapes => emt_morphed_shape_file - -eet_morphed_shape_file = make_morphing_task('eet', eet_shape_file) -task :eet_morphed_shapes => eet_morphed_shape_file - - def make_cgs_conf_task(channel) ret = "#{$carddir}/#{channel}/cgs.conf" file ret => ["card_config/cgs.conf.#{channel}.#{$period}"] do |t| @@ -659,10 +671,11 @@ def make_unc_conf_task(channel, opttag='') return ret end -def make_unc_vals_task(channel, opttag='') +def make_unc_vals_task(channel, opttag='', use_postfit=false) ret = "#{$carddir}/#{channel}/unc.vals" + additional = Array[] file ret => ["card_config/unc.vals.#{channel}.#{$period}", - "#{$carddir}/#{channel}/shapes.root"] do |t| #+ Dir.glob("results/#{$jobid}/plots/#{channel}/*_statshapes.root") shapes.root depends on statshapes, so are redundant + "#{$carddir}/#{channel}/shapes.root"] do |t| #+ Dir.glob("results/#{$jobid}/plots/#{channel}/*_statshapes.root") shapes.root depends on statshapes, so are redundant # Copy the basic template carddir_channel = File.dirname(t.name) sh "mkdir -p #{carddir_channel}" @@ -673,8 +686,13 @@ def make_unc_vals_task(channel, opttag='') Dir.glob("results/#{$jobid}/plots/#{channel}/#{channel}#{opttag}_shapes_*_statshapes.txt").each do |list| category = list.split('/')[-1].split('_')[-2] sh "cat #{list} | xargs -n 1 -I {} echo '#{category} fakes {} 1.0' >> #{t.name}" + #sh "python get_fake_systematic.py #{carddir_channel}/shapes.root #{$categories_map[channel].join(',')} CMS_vhtt_#{category}_fakes_#{$period} >> #{t.name}" + end + if !use_postfit + sh "echo #{$categories_map[channel].join(',')} fakes CMS_vhtt_#{channel}_fakes_#{$period} 1.50 >> #{t.name}" + else + sh "./get_fake_systematic.py results/#{$jobid}/plots/#{channel}/f3/postfit/#{channel}.pulls.all.raw_txt CMS_vhtt_#{channel}_fakes_#{$period} 1.50 '#{$categories_map[channel].join(',')} fakes' >> #{t.name}" end - sh "python get_fake_systematic.py #{carddir_channel}/shapes.root #{$categories_map[channel].join(',')} CMS_vhtt_#{channel}_fakes_#{$period} >> #{t.name}" end end @@ -721,21 +739,264 @@ def combine_channels(mass) return card end +def copy_file(source, target) + file target => [source] do |t| + sh "mkdir -p `dirname #{t.name}`" + sh "cp -v #{t.prerequisites[0]} #{t.name}" + end + return target +end + + + +################################################################################# +#### Background-only f3 pulls, to convince yourself and the others ############# +#### (but mostly the others) that the background estimation is fine ############# +################################################################################# + +$carddir = "results/#{$jobid}/bkg-only-pulls" #change global var so we can reuse the functions + +mmt_f3_shape_file = "#{$mmtdir}/mmt_f3_shapes_#{$period}.root" +$categories_map['mmt'].each do |category| + mmt_f3_shape_file = add_fake_errors(mmt_f3_shape_file, "mmt_f3", category) +end +task :mmt_f3_shapes => mmt_f3_shape_file + +emt_f3_shape_file = "#{$emtdir}/emt_f3_shapes_#{$period}.root" +$categories_map['emt'].each do |category| + emt_f3_shape_file = add_fake_errors(emt_f3_shape_file, "emt_f3", category) +end +task :emt_f3_shapes => emt_f3_shape_file + +eet_f3_shape_file = "#{$eetdir}/eet_f3_shapes_#{$period}.root" +$categories_map['eet'].each do |category| + eet_f3_shape_file = add_fake_errors(eet_f3_shape_file, "eet_f3", category) +end +task :eet_f3_shapes => eet_f3_shape_file + +def make_copy_task(channel, shapefile) + ret = "#{$carddir}/#{channel}/shapes.root" + file ret => [shapefile] do |t| + sh "mkdir -p `dirname #{t.name}`" + sh "cp #{t.prerequisites[0]} #{t.name}" + end + return ret +end + +task :mmt_copied_f3_shapes => copy_file(mmt_f3_shape_file, "#{$carddir}/mmt/shapes.root") +task :emt_copied_f3_shapes => copy_file(emt_f3_shape_file, "#{$carddir}/emt/shapes.root") +task :eet_copied_f3_shapes => copy_file(eet_f3_shape_file, "#{$carddir}/eet/shapes.root") + +def make_f3_timestamp_task(channel) + timestamp = "#{$carddir}/#{channel}/.creation_timestamp" + #creates the tasks + make_unc_conf_task(channel, '_f3') + make_unc_vals_task(channel, '_f3') + make_cgs_conf_task(channel) + file timestamp => make_datacard_task(120, channel) do |t| + sh "touch #{t.name}" + end +end + +file "#{$carddir}/llt/.creation_timestamp" => combine_channels(120) do |t| + sh "touch #{t.name}" +end + + +task :f3_cards_mmt => make_f3_timestamp_task('mmt') +task :f3_cards_emt => make_f3_timestamp_task('emt') +task :f3_cards_eet => make_f3_timestamp_task('eet') +task :f3_cards_llt => "#{$carddir}/llt/.creation_timestamp" + +task :f3_cards => [:f3_cards_mmt, + :f3_cards_emt, + :f3_cards_eet, + :f3_cards_llt + ] + + +def make_pulls_task(channel) + pulls_timestamp = "#{$carddir}/#{channel}/.pulls_computed" + carddir = $carddir #makes a copy so that if $cardir changes this does not + file pulls_timestamp => "#{$carddir}/#{channel}/.creation_timestamp" do |t| + chdir("#{carddir}/#{channel}") do + sh "limit.py --max-likelihood --stable --rMin 0 --rMax 0 120" + sh "python $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/diffNuisances.py 120/out/mlfit.root -f html > #{channel}.pulls.html" + sh "python $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/diffNuisances.py 120/out/mlfit.root -a -f html > #{channel}.pulls.all.html" + sh "python $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/diffNuisances.py 120/out/mlfit.root -a -f txt > #{channel}.pulls.all.raw_txt" + end + sh "touch #{t.name}" + end + return pulls_timestamp +end + +task :f3_pulls_mmt => make_pulls_task('mmt') +task :f3_pulls_emt => make_pulls_task('emt') +task :f3_pulls_eet => make_pulls_task('eet') +task :f3_pulls_llt => make_pulls_task('llt') +task :f3_pulls => Array[:f3_pulls_mmt, + :f3_pulls_emt, + :f3_pulls_eet, + :f3_pulls_llt] + + + + + +################################################################################# +#### Background-only f3 post-fit plots, to convince yourself and the ###### +#### others (but mostly the others) that the background estimation is fine ###### +################################################################################# + +def make_f3_postfit_shapes_task(channel) + shape_file = "results/#{$jobid}/plots/#{channel}/f3/postfit/#{channel}_f3_postfit_shapes.root" + carddir = $carddir #makes a copy so that if $cardir changes this does not + file shape_file => "#{carddir}/#{channel}/.pulls_computed" do |t| + sh "mkdir -p `dirname #{t.name}`" + sh "cp #{carddir}/#{channel}/shapes.root #{t.name}" #FIXME this may create to rake some problems if next command fails! + sh "#{ENV['CMSSW_BASE']}/src/HiggsAnalysis/HiggsToTauTau/test/postfit.py #{t.name} #{carddir}/#{channel}/120/vhtt_#{channel}.txt --verbose --bins #{$categories_map[channel].join(' ')} --fitresults #{carddir}/#{channel}/120/out/mlfit.txt" + end + return shape_file +end + +task :f3_postfit_shapes_mmt => make_f3_postfit_shapes_task('mmt') +task :f3_postfit_shapes_emt => make_f3_postfit_shapes_task('emt') +task :f3_postfit_shapes_eet => make_f3_postfit_shapes_task('eet') +#task :f3_postfit_shapes_llt => make_f3_postfit_shapes_task('llt') +task :f3_postfit_shapes => Array[:f3_postfit_shapes_mmt, + :f3_postfit_shapes_emt, + :f3_postfit_shapes_eet] + + +#categories +$xlabels_map = Hash[ + 'eet' => '"M_{e_{2}#tau} (GeV)"', + 'emt' => '"M_{l_{2}#tau} (GeV)"', + 'mmt' => '"M_{#mu_{2}#tau} (GeV)"', +] + + +def make_f3_postfit_plots_task(channel) + resultdir = "results/#{$jobid}/plots/#{channel}/f3/postfit" + shape_file = "#{resultdir}/#{channel}_f3_postfit_shapes.root" + plot_timestamp = "#{resultdir}/.postfit_plots_timestamp" + carddir = $carddir #makes a copy so that if $cardir changes this does not + file plot_timestamp => shape_file do |t| + sh "mkdir -p `dirname #{t.name}`" + $categories_map[channel].each do |category| + sh "shapes2hist.py #{resultdir}/#{channel}_f3_postfit_shapes.root #{category} -e 'WH*' -o #{resultdir}/#{category}.png -x #{$xlabels_map[channel]} -d 1 -y 'Events / GeV' --show-errors" + sh "shapes2hist.py #{resultdir}/#{channel}_f3_postfit_shapes.root #{category} -e 'WH*' -o #{resultdir}/#{category}.pdf -x #{$xlabels_map[channel]} -d 1 -y 'Events / GeV' --show-errors" + end + sh "cp -v #{carddir}/#{channel}/#{channel}.pulls* #{resultdir}/." + sh "shapes2hist.py #{resultdir}/#{channel}_f3_postfit_shapes.root #{$categories_map[channel].join(' ')} -e 'WH*' -o #{resultdir}/#{channel}_categories_summed.png -x #{$xlabels_map[channel]} -d 1 -y 'Events / GeV' --show-errors" + sh "shapes2hist.py #{resultdir}/#{channel}_f3_postfit_shapes.root #{$categories_map[channel].join(' ')} -e 'WH*' -o #{resultdir}/#{channel}_categories_summed.pdf -x #{$xlabels_map[channel]} -d 1 -y 'Events / GeV' --show-errors" + sh "touch #{t.name}" + end + return plot_timestamp +end + +task :f3_postfit_plots_mmt => make_f3_postfit_plots_task('mmt') +task :f3_postfit_plots_emt => make_f3_postfit_plots_task('emt') +task :f3_postfit_plots_eet => make_f3_postfit_plots_task('eet') +#task :f3_postfit_plots_llt => make_f3_postfit_plots_task('llt') +task :f3_postfit_plots => Array[:f3_postfit_plots_mmt, + :f3_postfit_plots_emt, + :f3_postfit_plots_eet] + + + + + + + + +################################################################################ +# Recipes to make data cards (plots come for free) +# targets: +# mmt_shapes +# emt_shapes +# eet_shapes +# cards +# copycards -> move cards to official HTT CVS area +################################################################################ + +$carddir = "results/#{$jobid}/cards" + +mmt_shape_file = "#{$mmtdir}/mmt_shapes_#{$period}.root" +$categories_map['mmt'].each do |category| + mmt_shape_file = add_fake_errors(mmt_shape_file, "mmt", category) +end +task :mmt_shapes => mmt_shape_file + +emt_shape_file = "#{$emtdir}/emt_shapes_#{$period}.root" +$categories_map['emt'].each do |category| + emt_shape_file = add_fake_errors(emt_shape_file, "emt", category) +end +task :emt_shapes => emt_shape_file + +eet_shape_file = "#{$eetdir}/eet_shapes_#{$period}.root" +$categories_map['eet'].each do |category| + eet_shape_file = add_fake_errors(eet_shape_file, "eet", category) +end +task :eet_shapes => eet_shape_file + +$carddir = "results/#{$jobid}/cards" + +cardmasses = get_sample_names('VH') #get all the VH samples available +cardmasses = cardmasses.select{|x| (not x.include? "HWW") and (not x.include? "lepdecay")} #get only the H2Tau, to avid repetition +if $period == '8TeV' + cardmasses = cardmasses.map{|x| x.sub("VH_H2Tau_M-","")} #remove trailing name, the leftover is the mass (as a string) +else + cardmasses = cardmasses.map{|x| x.sub("VH_","")} #remove trailing name, the leftover is the mass (as a string) +end +cardmasses = cardmasses.map{|x| Integer(x)} #maps to integers (don't know if it's really needed but can't harm) +cardmasses = cardmasses.select{|x| x <= 140} #FIXME! to be removed! +#puts cardmasses + +$to_extrapolate = cardmasses.select{|x| x > 140} + +def make_morphing_task(channel, shapefile) + ret = "#{$carddir}/#{channel}/shapes.root" + file ret => [shapefile] do |t| + sh "mkdir -p `dirname #{t.name}`" + sh "cp #{t.prerequisites[0]} #{t.name}" + sh "horizontal-morphing.py --categories='#{$categories_map[channel].join(',')}' --samples='WH_hww{MASS}' --uncerts='' --masses='110,120,130,140' --step-size=5 #{t.name}"# --extrapolate=#{$to_extrapolate.join(",")} #{t.name}" #FIXME! to be removed! + end + return ret +end + +mmt_morphed_shape_file = make_morphing_task('mmt', mmt_shape_file) +task :mmt_morphed_shapes => mmt_morphed_shape_file + +emt_morphed_shape_file = make_morphing_task('emt', emt_shape_file) +task :emt_morphed_shapes => emt_morphed_shape_file + +eet_morphed_shape_file = make_morphing_task('eet', eet_shape_file) +task :eet_morphed_shapes => eet_morphed_shape_file + + + def make_timestamp_task(cardmasses, channel) timestamp = "#{$carddir}/#{channel}/.creation_timestamp" #creates the tasks make_unc_conf_task(channel) - make_unc_vals_task(channel) + make_unc_vals_task(channel, '', true) make_cgs_conf_task(channel) file timestamp => cardmasses.map{|x| make_datacard_task(x, channel)} do |t| + sh "mkdir -p `dirname #{t.name}`" sh "touch #{t.name}" end end file "#{$carddir}/llt/.creation_timestamp" => cardmasses.map{|x| combine_channels(x)} do |t| + sh "mkdir -p `dirname #{t.name}`" sh "touch #{t.name}" end +task :cards_mmt => make_timestamp_task(cardmasses, 'mmt') +task :cards_emt => make_timestamp_task(cardmasses, 'emt') +task :cards_eet => make_timestamp_task(cardmasses, 'eet') + task :cards => [make_timestamp_task(cardmasses, 'mmt'), make_timestamp_task(cardmasses, 'emt'), make_timestamp_task(cardmasses, 'eet'), @@ -860,16 +1121,17 @@ end #### Copying card configuration to official place ############################### ################################################################################# $httcombodir = "#{ENV['CMSSW_BASE']}/src/HiggsAnalysis/HiggsToTauTau/setup/vhtt/" -$auxdir = "#{ENV['CMSSW_BASE']}/src/auxiliaries/datacards/collected/vhtt/" +$auxdir = "#{ENV['CMSSW_BASE']}/src/auxiliaries/shapes/VHTT/" -def copy_file(source, target) +def copy_and_trim_file(source, target) file target => [source] do |t| sh "mkdir -p `dirname #{t.name}`" - sh "cp -v #{t.prerequisites[0]} #{t.name}" + sh "grep -v -E 'CMS_vhtt_.*_bin_[0-9]+' #{source} > #{t.name}" end return target end + def copy_configs(channel, vhtt_number) dir = "#{$carddir}/#{channel}" htt_id = "sm-#{$period}-#{vhtt_number}" @@ -878,10 +1140,10 @@ def copy_configs(channel, vhtt_number) copy_file("#{dir}/cgs.conf", "#{$httcombodir}/cgs-#{htt_id}.conf") #copies unc.conf - copy_file("#{dir}/unc.conf", "#{$httcombodir}/unc-#{htt_id}.conf") + copy_and_trim_file("#{dir}/unc.conf", "#{$httcombodir}/unc-#{htt_id}.conf") #copies unc.vals - copy_file("#{dir}/unc.vals", "#{$httcombodir}/unc-#{htt_id}.vals") + copy_and_trim_file("#{dir}/unc.vals", "#{$httcombodir}/unc-#{htt_id}.vals") return ["#{$httcombodir}/cgs-#{htt_id}.conf", "#{$httcombodir}/unc-#{htt_id}.conf", "#{$httcombodir}/unc-#{htt_id}.vals"] end @@ -903,149 +1165,3 @@ task :copycards => ["#{$auxdir}/vhtt_llt.inputs-sm-#{$period}.root"] + end -################################################################################# -#### Background-only f3 pulls, to convince yourself and the others ############# -#### (but mostly the others) that the background estimation is fine ############# -################################################################################# - -$carddir = "results/#{$jobid}/bkg-only-pulls" #change global var so we can reuse the functions - -mmt_f3_shape_file = "#{$mmtdir}/mmt_f3_shapes_#{$period}.root" -$categories_map['mmt'].each do |category| - mmt_f3_shape_file = add_fake_errors(mmt_f3_shape_file, "mmt_f3", category) -end -task :mmt_f3_shapes => mmt_f3_shape_file - -emt_f3_shape_file = "#{$emtdir}/emt_f3_shapes_#{$period}.root" -$categories_map['emt'].each do |category| - emt_f3_shape_file = add_fake_errors(emt_f3_shape_file, "emt_f3", category) -end -task :emt_f3_shapes => emt_f3_shape_file - -eet_f3_shape_file = "#{$eetdir}/eet_f3_shapes_#{$period}.root" -$categories_map['eet'].each do |category| - eet_f3_shape_file = add_fake_errors(eet_f3_shape_file, "eet_f3", category) -end -task :eet_f3_shapes => eet_f3_shape_file - -def make_copy_task(channel, shapefile) - ret = "#{$carddir}/#{channel}/shapes.root" - file ret => [shapefile] do |t| - sh "mkdir -p `dirname #{t.name}`" - sh "cp #{t.prerequisites[0]} #{t.name}" - end - return ret -end - -task :mmt_copied_f3_shapes => copy_file(mmt_f3_shape_file, "#{$carddir}/mmt/shapes.root") -task :emt_copied_f3_shapes => copy_file(emt_f3_shape_file, "#{$carddir}/emt/shapes.root") -task :eet_copied_f3_shapes => copy_file(eet_f3_shape_file, "#{$carddir}/eet/shapes.root") - -def make_f3_timestamp_task(cardmasses, channel) - timestamp = "#{$carddir}/#{channel}/.creation_timestamp" - #creates the tasks - make_unc_conf_task(channel, '_f3') - make_unc_vals_task(channel, '_f3') - make_cgs_conf_task(channel) - file timestamp => cardmasses.map{|x| make_datacard_task(x, channel)} do |t| - sh "touch #{t.name}" - end -end - -file "#{$carddir}/llt/.creation_timestamp" => combine_channels(120) do |t| - sh "touch #{t.name}" -end - - -task :f3_cards_mmt => make_f3_timestamp_task([120], 'mmt') -task :f3_cards_emt => make_f3_timestamp_task([120], 'emt') -task :f3_cards_eet => make_f3_timestamp_task([120], 'eet') -task :f3_cards_llt => "#{$carddir}/llt/.creation_timestamp" - -task :f3_cards => [:f3_cards_mmt, - :f3_cards_emt, - :f3_cards_eet, - :f3_cards_llt - ] - - -def make_pulls_task(channel) - pulls_timestamp = "#{$carddir}/#{channel}/.pulls_computed" - carddir = $carddir #makes a copy so that if $cardir changes this does not - file pulls_timestamp => "#{$carddir}/#{channel}/.creation_timestamp" do |t| - chdir("#{carddir}/#{channel}") do - sh "limit.py --max-likelihood --stable --rMin 0 --rMax 0 120" - sh "python $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/diffNuisances.py 120/out/mlfit.root -f html > #{channel}.pulls.html" - sh "python $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/diffNuisances.py 120/out/mlfit.root -a -f html > #{channel}.pulls.all.html" - sh "python $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/diffNuisances.py 120/out/mlfit.root -a -f txt > #{channel}.pulls.all.raw_txt" - end - sh "touch #{t.name}" - end - return pulls_timestamp -end - -task :f3_pulls_mmt => make_pulls_task('mmt') -task :f3_pulls_emt => make_pulls_task('emt') -task :f3_pulls_eet => make_pulls_task('eet') -task :f3_pulls_llt => make_pulls_task('llt') -task :f3_pulls => Array[:f3_pulls_mmt, - :f3_pulls_emt, - :f3_pulls_eet, - :f3_pulls_llt] - -################################################################################# -#### Background-only f3 post-fit plots, to convince yourself and the ###### -#### others (but mostly the others) that the background estimation is fine ###### -################################################################################# - -def make_f3_postfit_shapes_task(channel) - shape_file = "results/#{$jobid}/plots/#{channel}/f3/postfit/#{channel}_f3_postfit_shapes.root" - carddir = $carddir #makes a copy so that if $cardir changes this does not - file shape_file => "#{$carddir}/#{channel}/.pulls_computed" do |t| - sh "mkdir -p `dirname #{t.name}`" - sh "cp #{carddir}/#{channel}/shapes.root #{t.name}" #FIXME this may create to rake some problems if next command fails! - sh "#{ENV['CMSSW_BASE']}/src/HiggsAnalysis/HiggsToTauTau/test/postfit.py #{t.name} #{$carddir}/#{channel}/120/vhtt_#{channel}.txt --verbose --bins #{$categories_map[channel].join(' ')} --fitresults #{$carddir}/#{channel}/120/out/mlfit.txt" - end - return shape_file -end - -task :f3_postfit_shapes_mmt => make_f3_postfit_shapes_task('mmt') -task :f3_postfit_shapes_emt => make_f3_postfit_shapes_task('emt') -task :f3_postfit_shapes_eet => make_f3_postfit_shapes_task('eet') -#task :f3_postfit_shapes_llt => make_f3_postfit_shapes_task('llt') -task :f3_postfit_shapes => Array[:f3_postfit_shapes_mmt, - :f3_postfit_shapes_emt, - :f3_postfit_shapes_eet] - - -#categories -$xlabels_map = Hash[ - 'eet' => '"M_{e_{2}#tau} (GeV)"', - 'emt' => '"M_{l_{2}#tau} (GeV)"', - 'mmt' => '"M_{#mu_{2}#tau} (GeV)"', -] - - -def make_f3_postfit_plots_task(channel) - resultdir = "results/#{$jobid}/plots/#{channel}/f3/postfit" - shape_file = "#{resultdir}/#{channel}_f3_postfit_shapes.root" - plot_timestamp = "#{resultdir}/.postfit_plots_timestamp" - file plot_timestamp => shape_file do |t| - sh "mkdir -p `dirname #{t.name}`" - $categories_map[channel].each do |category| - sh "shapes2hist.py #{resultdir}/#{channel}_f3_postfit_shapes.root #{category} -e 'WH*' -o #{resultdir}/#{category}.png -x #{$xlabels_map[channel]}" - sh "shapes2hist.py #{resultdir}/#{channel}_f3_postfit_shapes.root #{category} -e 'WH*' -o #{resultdir}/#{category}.pdf -x #{$xlabels_map[channel]}" - end - sh "shapes2hist.py #{resultdir}/#{channel}_f3_postfit_shapes.root #{$categories_map[channel].join(' ')} -e 'WH*' -o #{resultdir}/#{channel}_categories_summed.png -x #{$xlabels_map[channel]}" - sh "touch #{t.name}" - end - return plot_timestamp -end - -task :f3_postfit_plots_mmt => make_f3_postfit_plots_task('mmt') -task :f3_postfit_plots_emt => make_f3_postfit_plots_task('emt') -task :f3_postfit_plots_eet => make_f3_postfit_plots_task('eet') -#task :f3_postfit_plots_llt => make_f3_postfit_plots_task('llt') -task :f3_postfit_plots => Array[:f3_postfit_plots_mmt, - :f3_postfit_plots_emt, - :f3_postfit_plots_eet] diff --git a/wh/WHAnalyzeEET.py b/wh/WHAnalyzeEET.py index 7dc5a081..dd61b453 100755 --- a/wh/WHAnalyzeEET.py +++ b/wh/WHAnalyzeEET.py @@ -13,9 +13,27 @@ import fakerate_functions as frfits import optimizer import math -import array +from array import array from chargeflipcuts import charge_flip_funcs from FinalStateAnalysis.PlotTools.decorators import memo_last +import FinalStateAnalysis.PlotTools.pytree as pytree + +#initialize FRFits +optimizer_keys = [ i for i in optimizer.grid_search.keys() if i.startswith('EET') ] +grid_search = {} +if len(optimizer_keys) > 1: + grid_search[key] = optimizer.grid_search[key] + +NO_HISTO_FILL = ('NO_HISTO_FILL' in os.environ) and eval(os.environ['NO_HISTO_FILL']) + +if not NO_HISTO_FILL: + for key in optimizer_keys: + frfits.highpt_ee_fr.__activate__(optimizer.grid_search[key]['leading_iso']) + frfits.highpt_ee_qcd_fr.__activate__(optimizer.grid_search[key]['leading_iso']) + frfits.lowpt_ee_fr.__activate__(optimizer.grid_search[key]['subleading_iso']) + frfits.lowpt_ee_qcd_fr.__activate__(optimizer.grid_search[key]['subleading_iso']) + +SYNC = ('SYNC' in os.environ) and eval(os.environ['SYNC']) #mtr = frfits.mt_likelihood_ratio ################################################################################ @@ -23,7 +41,7 @@ ################################################################################ class WHAnalyzeEET(WHAnalyzerBase): - tree = 'eet/final/Ntuple' + tree = 'eet/final/Ntuple' if not SYNC else 'Ntuple' def __init__(self, tree, outfile, **kwargs): self.channel = 'EET' super(WHAnalyzeEET, self).__init__(tree, outfile, EETauTree, **kwargs) @@ -116,6 +134,7 @@ def log_prob(row, weight): self.hfunc["e*1_t_Mass" ] = mass_scaler( attr_getter('e1_t_Mass')) self.hfunc["e1_e*2_Mass"] = mass_scaler( attr_getter('e1_e2_Mass')) self.hfunc["e*2_t_Mass" ] = mass_scaler( attr_getter('e2_t_Mass')) + self.hfunc['SYNC'] = lambda row, weight: (row, None) #((row.run, row.lumi, row.evt, row.e1Pt, row.e1Eta, row.e1Phi, row.e2Pt, row.e2Eta, row.e2Phi, row.tPt, row.tEta, row.tPhi, weight), None) #self.hfunc['evt_info'] = lambda row, weight: (array.array("f", [row.e1Pt, row.e2Pt, row.tPt, row.LT, weight] ), None) self.pucorrector = mcCorrectors.make_puCorrector('doublee') @@ -127,14 +146,16 @@ def anti_charge_flip(row, rejection_power=80): def book_histos(self, folder): #PLOTS TO FILL IN ANY CASE + LTBinning = array('d',[0, 80, 100, 600]) + nLTBins = len(LTBinning) -1 for key in self.grid_search: prefix = key+'$' if key else '' self.book(folder, prefix+"LT", "L_T", 100, 0, 300) - self.book(folder, prefix+"e2_t_Mass", "subleadingMass", 200, 0, 200) + self.book(folder, prefix+"e2_t_Mass", "subleadingMass", 300, 0, 300) self.book(folder, prefix+"e2_t_Pt", "subleadingPt", 400, 0, 400) #Charge mis-id special histograms if 'c2' in folder: - self.book(folder, prefix+"e*2_t_Mass", "subleadingMass with misid sclaing correction", 200, 0, 200) + self.book(folder, prefix+"e*2_t_Mass", "subleadingMass with misid sclaing correction", 300, 0, 300) if len(self.grid_search.keys()) == 1: if 'c1' in folder: @@ -144,38 +165,43 @@ def book_histos(self, folder): self.book(folder, "e1_e*2_Mass", "E 1-2 Mass with misid sclaing correction", 120, 0, 120) #self.book(folder, "e*2_t_Mass#faking_prob", '', 200, 0, 200, 1100, 0., 1.1, type=ROOT.TH2F) #self.book(folder, "e*2_t_Mass#log_prob" , '', 200, 0, 200, 1000, -10, 1, type=ROOT.TH2F) - self.book(folder, "e*2_t_Mass#LT" , '', 200, 0, 200, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "e*2_t_Mass#tPt" , '', 200, 0, 200, 200, 0, 200, type=ROOT.TH2F) + self.book(folder, "e*2_t_Mass#LT" , '', 300, 0, 300, nLTBins, LTBinning, type=ROOT.TH2F) + + self.book(folder, prefix+"e2_t_Mass#LT" , "subleadingMass", 300, 0, 300, nLTBins, LTBinning, type=ROOT.TH2F) - self.book(folder, prefix+"e2_t_Mass#LT" , "subleadingMass", 200, 0, 200, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"e2_t_Mass#tPt", "subleadingMass", 200, 0, 200, 200, 0, 200, type=ROOT.TH2F) + self.book(folder, 'SYNC', 'SYNC', + 'run/l:lumi/l:evt/l' +\ + ':e1Pt/D:e1Eta/D:e1Phi/D:e1RelPFIsoDB/D:e1MVANonTrig/D' +\ + ':e2Pt/D:e2Eta/D:e2Phi/D:e2RelPFIsoDB/D:e2MVANonTrig/D' +\ + ':tPt/D:tEta/D:tPhi/D:tAntiMuonTight/D:tDecayMode/D:tLooseIso3Hits/D:tAntiElectronMVA3Loose/D' +\ + ':tAntiMuonLoose/D:tAntiElectronMVA3Medium/D:tAntiElectronMVA3Tight/D' +\ + ':e1_e2_Mass/D:e2_t_Mass/D:LT/D:e1_e2_SS/D:e1_t_SS/D', + type=pytree.PyTree) #Pt - self.book(folder, prefix+"e1Pt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"e2Pt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"tPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"e1JetPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"e2JetPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, prefix+"e1Pt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"e2Pt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"tPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"e1JetPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"e2JetPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) #eta - self.book(folder, prefix+"e1AbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"e2AbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"tAbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, prefix+"e1AbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"e2AbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"tAbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) #DR - self.book(folder, prefix+"e1_t_DR#LT" , "subleadingMass", 100, 0, 10, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"e2_t_DR#LT" , "subleadingMass", 100, 0, 10, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, prefix+"e1_t_DR#LT" , "subleadingMass", 100, 0, 10, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"e2_t_DR#LT" , "subleadingMass", 100, 0, 10, nLTBins, LTBinning, type=ROOT.TH2F) #Jet BTag self.book(folder, "e1JetBtag#LT", "Muon 2 Pt", 30, -10, 5, 60, 0, 600, type=ROOT.TH2F) self.book(folder, "e2JetBtag#LT", "Muon 2 Pt", 30, -10, 5, 60, 0, 600, type=ROOT.TH2F) - #self.book(folder, prefix+"e2_t_Mass#faking_prob" , "subleadingMass", 200, 0, 200, 1100, 0., 1.1, type=ROOT.TH2F) - #self.book(folder, prefix+"e2_t_Mass#log_prob" , "subleadingMass", 200, 0, 200, 1000, -10, 1, type=ROOT.TH2F) - # - #self.book(folder, prefix+'faking_prob' , "", 1100, 0., 1.1) - #self.book(folder, prefix+'log_prob' , "", 1000, -10, 1) + #tau ISO + self.book(folder, "tRawIso3Hits#LT", "Muon 2 Pt", 200, 0, 200, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "tRawIsoMVA2#LT", "Muon 2 Pt" , 200, -1, -1, nLTBins, LTBinning, type=ROOT.TH2F) self.book(folder, "e2RelPFIsoDB", "e2RelPFIsoDB", 30, 0, 0.3) self.book(folder, "e1RelPFIsoDB", "e1RelPFIsoDB", 30, 0, 0.3) @@ -216,6 +242,12 @@ def preselection(self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr = Excludes FR object IDs and sign cut. ''' + if row.e1_t_DR < 0.5 or row.e2_t_DR < 0.5 or row.e1_e2_DR < 0.5: return False + cut_flow_trk.Fill('DR separation') + + if row.e2_t_Mass < 20: return False + cut_flow_trk.Fill('sub mass cut') + if not row.doubleEPass: return False if not (row.e1MatchesDoubleEPath > 0 and \ row.e2MatchesDoubleEPath > 0): return False @@ -224,35 +256,9 @@ def preselection(self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr = if row.e1Pt < 20: return False if not selections.eSelection(row, 'e1'): return False cut_flow_trk.Fill('obj1 Presel') - #FIXME - #if row.e1Pt < 20: return False - #cut_flow_trk.Fill('pt requirements 1') - #if row.e1AbsEta > 2.5: return False - #cut_flow_trk.Fill('eta requirements 1') - #if row.e1MissingHits: return False - #cut_flow_trk.Fill('MissingHits 1') - #if row.e1HasConversion: return False - #cut_flow_trk.Fill('HasConversion 1') - #if row.e1JetBtag > 3.3: return False - #cut_flow_trk.Fill('JetBtag 1') - #if abs(row.e1DZ) > 0.2: return False - #cut_flow_trk.Fill('DZ 1') if not selections.eSelection(row, 'e2'): return False cut_flow_trk.Fill('obj2 Presel') - #FIXME - #if row.e2Pt < 10: return False - #cut_flow_trk.Fill('pt requirements 2') - #if row.e2AbsEta > 2.5: return False - #cut_flow_trk.Fill('eta requirements 2') - #if row.e2MissingHits: return False - #cut_flow_trk.Fill('MissingHits 2') - #if row.e2HasConversion: return False - #cut_flow_trk.Fill('HasConversion 2') - #if row.e2JetBtag > 3.3: return False - #cut_flow_trk.Fill('JetBtag 2') - #if abs(row.e2DZ) > 0.2: return False - #cut_flow_trk.Fill('DZ 2') if not selections.tauSelection(row, 't'): return False if row.tPt < taupt_thr: return False @@ -262,29 +268,11 @@ def preselection(self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr = if row.LT < LT_threshold: return False cut_flow_trk.Fill('LT') - if row.e1_e2_SS and row.e1_t_SS: return False #remove three SS leptons + #if row.e1_e2_SS and row.e1_t_SS: return False #remove three SS leptons if row.e1_e2_Mass < 20: return False - if not selections.vetos(row): return False #applies mu bjet e additional tau vetoes - cut_flow_trk.Fill('vetos') - - #REMOVE CHARGE FAKES! - #FIXME - #if not row.e1ChargeIdLoose: return False - #if not row.e2ChargeIdLoose: return False - #cut_flow_trk.Fill('ChargeIdLoose') - #cut_flow_trk.Fill('charge_fakes') - - #FIXME: ONLY FOR CUT-FLOW PRODUCTION - #if not selections.summer_2013_eid(row, 'e1'): return False - #cut_flow_trk.Fill('obj1 ID') - #if not selections.lepton_id_iso(row, 'e1', 'eid13Looseh2taucuts'): return False - #cut_flow_trk.Fill('obj1 Iso') - #if not selections.summer_2013_eid(row, 'e2'): return False - #cut_flow_trk.Fill('obj2 ID') - #if not selections.lepton_id_iso(row, 'e2', 'eid13Looseh2taucuts'): return False - #cut_flow_trk.Fill('obj2 Iso') - #if not row.tLooseIso3Hits: return False - #cut_flow_trk.Fill('obj3 IDIso') + cut_flow_trk.Fill('dilepton mass cut') + + if not selections.vetos(row, cut_flow_trk): return False #applies mu bjet e additional tau vetoes return True @@ -294,6 +282,11 @@ def sign_cut(row): ''' Returns true if muons are SS ''' return bool(row.e1_e2_SS) + @staticmethod + def tau_sign_cut(row): + ''' Returns true if muons are SS ''' + return not bool(row.e1_t_SS) + #There is no call to self, so just promote it to statucmethod, to allow usage by other dedicated analyzers @staticmethod def obj1_id(row, leadleptonId='eid13Looseh2taucuts', subleadleptonId=None): @@ -312,6 +305,18 @@ def obj3_id(row, tauId=None, LT_threshold = 80., taupt_thr = 0.): else: return bool( getattr(row, tauId) ) + @staticmethod + def obj1_matches_gen(row): + return row.e1GenPdgId == -1*row.e1Charge*11 + + @staticmethod + def obj2_matches_gen(row): + return row.e2GenPdgId == -1*row.e2Charge*11 + + @staticmethod + def obj3_matches_gen(row): + return t.genDecayMode != -2 + #There is no call to self, so just promote it to statucmethod, to allow usage by other dedicated analyzers @staticmethod def anti_wz(row): @@ -326,36 +331,33 @@ def anti_wz(row): def enhance_wz(self, row): # Require the "tau" to be a electron, and require the third electron # to have M_Z +- 20 - if self.anti_wz(row): - return False - # Make sure any Z is from e1 - e2_good_Z = bool(71 < row.e2_t_Mass < 111) - return not e2_good_Z + return row.tCiCTightElecOverlap def event_weight(self, row): - if row.run > 2: + if row.run > 2: #FIXME! add tight ID correction return 1. return self.pucorrector(row.nTruePU) * \ - mcCorrectors.get_electron_corrections(row,'e1','e2') - + mcCorrectors.get_electron_corrections(row,'e2') *\ + mcCorrectors.electron_tight_corrections(row.e1Pt, row.e1AbsEta) *\ + mcCorrectors.double_electron_trigger(row) def obj1_weight(self, row, leadleptonId='eid13Looseh2taucuts', subleadleptonId=None): - return frfits.highpt_ee_fr[leadleptonId](electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt) + return frfits.highpt_ee_fr[leadleptonId](electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt, numJets20=row.jetVeto20+1) def obj2_weight(self, row, leadleptonId=None, subleadleptonId='eid13Looseh2taucuts'): - return frfits.lowpt_ee_fr[subleadleptonId](electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt) + return frfits.lowpt_ee_fr[subleadleptonId](electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt, numJets20=row.jetVeto20+1) def obj3_weight(self, row, notUsed1=None, notUsed2=None): - return frfits.tau_fr(row.tPt) + return frfits.tau_fr(row.tPt, row.tAbsEta) def obj1_qcd_weight(self, row, leadleptonId='eid13Looseh2taucuts', subleadleptonId=None): - return frfits.highpt_ee_qcd_fr[leadleptonId](electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt) + return frfits.highpt_ee_qcd_fr[leadleptonId](electronJetPt=max(row.e1JetPt, row.e1Pt), electronPt=row.e1Pt, numJets20=row.jetVeto20+1) def obj2_qcd_weight(self, row, leadleptonId=None, subleadleptonId='eid13Looseh2taucuts'): - return frfits.lowpt_ee_qcd_fr[subleadleptonId](electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt) + return frfits.lowpt_ee_qcd_fr[subleadleptonId](electronJetPt=max(row.e2JetPt, row.e2Pt), electronPt=row.e2Pt, numJets20=row.jetVeto20+1) def obj3_qcd_weight(self, row, notUsed1=None, notUsed2=None): - return frfits.tau_qcd_fr(row.tPt) + return frfits.tau_qcd_fr(row.tPt, row.tAbsEta) # For measuring charge flip probability # Not really used in this channel diff --git a/wh/WHAnalyzeEMT.py b/wh/WHAnalyzeEMT.py index 9705b06d..fe0f9032 100644 --- a/wh/WHAnalyzeEMT.py +++ b/wh/WHAnalyzeEMT.py @@ -12,19 +12,52 @@ import mcCorrectors import baseSelections as selections import fakerate_functions as frfits +from array import array import ROOT import math import optimizer +import FinalStateAnalysis.PlotTools.pytree as pytree from FinalStateAnalysis.PlotTools.decorators import memo_last +#def make_bins(n, xlow, xhigh): +# step = float(xhigh - xlow) / float(n) +# ret = [] +# for i in xrange(n): +# ret.append(xlow + step*i) +# ret.append(xhigh) +# return array('d', ret) + +#initialize FRFits +optimizer_keys = [ i for i in optimizer.grid_search.keys() if i.startswith('EMT') ] +grid_search = {} +if len(optimizer_keys) > 1: + grid_search[key] = optimizer.grid_search[key] + +NO_HISTO_FILL = ('NO_HISTO_FILL' in os.environ) and eval(os.environ['NO_HISTO_FILL']) + +if not NO_HISTO_FILL: + for key in optimizer_keys: + frfits.highpt_mue_fr[optimizer.grid_search[key]['leading_iso']] + frfits.highpt_mue_qcd_fr[optimizer.grid_search[key]['leading_iso']] + frfits.lowpt_mue_fr[optimizer.grid_search[key]['leading_iso']] + frfits.lowpt_mue_qcd_fr[optimizer.grid_search[key]['leading_iso']] + frfits.highpt_e_fr[optimizer.grid_search[key]['subleading_iso']] + frfits.highpt_e_qcd_fr[optimizer.grid_search[key]['subleading_iso']] + frfits.lowpt_e_fr[optimizer.grid_search[key]['subleading_iso']] + frfits.lowpt_e_qcd_fr[optimizer.grid_search[key]['subleading_iso']] + +SYNC = ('SYNC' in os.environ) and eval(os.environ['SYNC']) + + ################################################################################ #### Analysis logic ############################################################ ################################################################################ is7TeV = bool('7TeV' in os.environ['jobid']) use_iso_trigger = not is7TeV +region_for_event_list = os.environ.get('EVTLIST_REGION','') class WHAnalyzeEMT(WHAnalyzerBase): - tree = 'emt/final/Ntuple' + tree = 'emt/final/Ntuple' if not SYNC else 'Ntuple' def __init__(self, tree, outfile, **kwargs): self.channel = 'EMT' @@ -58,27 +91,27 @@ def sub_mass(row, weight): lead_iso = self.grid_search['']['leading_iso'] sublead_iso = self.grid_search['']['subleading_iso'] - def f_prob(row, weight): - p_m = ( self.obj1_weight(row, lead_iso, sublead_iso) + \ - self.obj1_qcd_weight(row, lead_iso, sublead_iso))/2 - p_e = ( self.obj2_weight(row, lead_iso, sublead_iso) + \ - self.obj2_qcd_weight(row, lead_iso, sublead_iso))/2 - p_t = frfits.tau_fr(row.tPt) - return ((p_m + p_e*(1 - p_m) + p_t*(1 - p_m)*(1 - p_e)), weight) - - def log_prob(row, weight): - prob, weight = f_prob(row, weight) - return math.log(prob), weight + #def f_prob(row, weight): + # p_m = ( self.obj1_weight(row, lead_iso, sublead_iso) + \ + # self.obj1_qcd_weight(row, lead_iso, sublead_iso))/2 + # p_e = ( self.obj2_weight(row, lead_iso, sublead_iso) + \ + # self.obj2_qcd_weight(row, lead_iso, sublead_iso))/2 + # p_t = frfits.tau_fr(row.tPt) + # return ((p_m + p_e*(1 - p_m) + p_t*(1 - p_m)*(1 - p_e)), weight) + # + #def log_prob(row, weight): + # prob, weight = f_prob(row, weight) + # return math.log(prob), weight - self.hfunc['faking_prob'] = f_prob - self.hfunc['log_prob'] = log_prob - self.hfunc["subMass#faking_prob"] = merge_functions( sub_mass, f_prob ) - self.hfunc["subMass#log_prob" ] = merge_functions( sub_mass, log_prob) + #self.hfunc['faking_prob'] = f_prob + #self.hfunc['log_prob'] = log_prob + #self.hfunc["subMass#faking_prob"] = merge_functions( sub_mass, f_prob ) + #self.hfunc["subMass#log_prob" ] = merge_functions( sub_mass, log_prob) self.hfunc["subMass#LT" ] = merge_functions( sub_mass, attr_getter('LT')) self.hfunc["subMass#tPt"] = merge_functions( sub_mass, attr_getter('tPt')) - self.hfunc["subMass*#faking_prob"] = merge_functions( mass_scaler( sub_mass ), f_prob ) - self.hfunc["subMass*#log_prob" ] = merge_functions( mass_scaler( sub_mass ), log_prob) + #self.hfunc["subMass*#faking_prob"] = merge_functions( mass_scaler( sub_mass ), f_prob ) + #self.hfunc["subMass*#log_prob" ] = merge_functions( mass_scaler( sub_mass ), log_prob) self.hfunc["subMass*#LT" ] = merge_functions( mass_scaler( sub_mass ), attr_getter('LT')) self.hfunc["subMass*#tPt"] = merge_functions( mass_scaler( sub_mass ), attr_getter('tPt')) @@ -96,80 +129,78 @@ def log_prob(row, weight): self.hfunc["subMass*" ] = mass_scaler( sub_mass ) self.hfunc["_recoilDaught" ] = lambda row, weight: (math.sqrt(row.recoilDaught) , weight) self.hfunc["_recoilWithMet"] = lambda row, weight: (math.sqrt(row.recoilWithMet), weight) + self.hfunc['SYNC'] = lambda row, weight: (row, None) #((row.run, row.lumi, row.evt, row.mPt, row.mEta, row.mPhi, row.ePt, row.eEta, row.ePhi, row.tPt, row.tEta, row.tPhi, weight), None ) self.pucorrector = mcCorrectors.make_puCorrector('mueg') def book_histos(self, folder): + if region_for_event_list and region_for_event_list != folder: + return for key in self.grid_search: prefix = key+'$' if key else '' - self.book(folder, prefix+"subMass", "Subleading Mass", 200, 0, 200) + #self.book(folder, prefix+"subMass", "Subleading Mass", 200, 0, 200) self.book(folder, prefix+"LT", "L_T", 100, 0, 300) #Charge mis-id special histograms - if 'c2' in folder: - self.book(folder, prefix+"subMass*", "Subleading Mass", 200, 0, 200) + #if 'c2' in folder: + # self.book(folder, prefix+"subMass*", "Subleading Mass", 200, 0, 200) if len(self.grid_search.keys()) == 1: + LTBinning = array('d',[0, 80, 130, 600]) + nLTBins = len(LTBinning) -1 if 'c2' in folder: self.book(folder, "e*_t_Mass", "Electron-Tau Mass", 200, 0, 200) self.book(folder, "e*_m_Mass", "Electron-Muon Mass", 200, 0, 200) #self.book(folder, "subMass*#faking_prob", '', 200, 0, 200, 220, 0., 1.1, type=ROOT.TH2F) #self.book(folder, "subMass*#log_prob" , '', 200, 0, 200, 200, -2, 1, type=ROOT.TH2F) - self.book(folder, "subMass*#LT" , '', 200, 0, 200, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "subMass*#tPt" , '', 200, 0, 200, 200, 0, 200, type=ROOT.TH2F) - - - self.book(folder, prefix+"subMass#LT" , "subleadingMass", 200, 0, 200, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"subMass#tPt", "subleadingMass", 200, 0, 200, 200, 0, 200, type=ROOT.TH2F) + self.book(folder, "subMass*#LT" , '', 300, 0, 300, nLTBins, LTBinning, type=ROOT.TH2F) + + self.book(folder, 'SYNC', 'SYNC', + 'run/l:lumi/l:evt/l' +\ + ':mPt/D:mEta/D:mPhi/D:mPFIDTight/D:mRelPFIsoDB/D' +\ + ':ePt/D:eEta/D:ePhi/D:eRelPFIsoDB/D:eMVANonTrig/D' +\ + ':tPt/D:tEta/D:tPhi/D:tAntiMuonTight/D:tDecayMode/D:tLooseIso3Hits/D:tAntiElectronMVA3Loose/D' +\ + ':tAntiMuonLoose/D:tAntiElectronMVA3Medium/D' +\ + ':e_m_Mass/D:m_t_Mass/D:e_t_Mass/D:LT/D:e_m_SS/D:m_t_SS/D', + type=pytree.PyTree) + + self.book(folder, prefix+"subMass#LT" , "subleadingMass", 300, 0, 300, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "e_m_Mass#LT", "Electron-Muon Mass", 200, 0, 200, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m_t_Mass#LT", "Electron-Muon Mass", 200, 0, 200, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "e_t_Mass#LT", "Electron-Tau Mass" , 200, 0, 200, nLTBins, LTBinning, type=ROOT.TH2F) #Pt - self.book(folder, prefix+"mPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"ePt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"tPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"mJetPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"eJetPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, prefix+"mPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"ePt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"tPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"mJetPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"eJetPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) #eta - self.book(folder, prefix+"mAbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"eAbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"tAbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, prefix+"mAbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"eAbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"tAbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) #DR - self.book(folder, prefix+"m_t_DR#LT" , "subleadingMass", 100, 0, 10, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, prefix+"e_t_DR#LT" , "subleadingMass", 100, 0, 10, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, prefix+"m_t_DR#LT" , "subleadingMass", 100, 0, 10, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, prefix+"e_t_DR#LT" , "subleadingMass", 100, 0, 10, nLTBins, LTBinning, type=ROOT.TH2F) #Jet BTag - self.book(folder, "mJetBtag#LT", "Muon 2 Pt", 30, -10, 5, 60, 0, 600, type=ROOT.TH2F) - self.book(folder, "eJetBtag#LT", "Muon 2 Pt", 30, -10, 5, 60, 0, 600, type=ROOT.TH2F) + self.book(folder, "mJetBtag#LT", "Muon 2 Pt", 30, -10, 5, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "eJetBtag#LT", "Muon 2 Pt", 30, -10, 5, nLTBins, LTBinning, type=ROOT.TH2F) + + #tau ISO + self.book(folder, "tRawIso3Hits#LT", "Muon 2 Pt", 200, 0, 200, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "tRawIsoMVA2#LT", "Muon 2 Pt" , 200, -1, -1, nLTBins, LTBinning, type=ROOT.TH2F) self.book(folder, "subPt" , "SubLeading Pt", 100, 0, 100) self.book(folder, "leadPt" , "Leading Pt" , 100, 0, 100) self.book(folder, "subJetPt" , "SubLeading Pt", 100, 0, 100) self.book(folder, "leadJetPt" , "Leading Pt" , 100, 0, 100) - self.book(folder, "e_m_Mass", "Electron-Muon Mass", 200, 0, 200) - self.book(folder, "m_t_Mass", "Electron-Muon Mass", 200, 0, 200) - self.book(folder, "e_t_Mass", "Electron-Tau Mass", 200, 0, 200) self.book(folder, "nTruePU", "NPU", 62, -1.5, 60.5) - self.book(folder, "mPt", "Muon Pt", 100, 0, 100) - self.book(folder, "ePt", "Electron Pt", 100, 0, 100) - self.book(folder, "mJetPt", "Muon Pt", 100, 0, 100) - self.book(folder, "eJetPt", "Electron Pt", 100, 0, 100) - self.book(folder, "tPt", "Tau Pt", 100, 0, 100) - self.book(folder, "mAbsEta", "Muon AbsEta", 100, 0, 2.4) - self.book(folder, "eAbsEta", "Electron AbsEta", 100, 0, 2.5) - self.book(folder, "tAbsEta", "Tau AbsEta", 100, 0, 2.3) self.book(folder, "eChargeIdTight", "Elec charge ID tight", 2, -0.5, 1.5) self.book(folder, "tLeadDR", "DR between leading lepton and tau", 100, 0, 5) self.book(folder, "tSubDR", "DR between subleading lepton and tau", 100, 0, 5) self.book(folder, "e_m_DR", "", 200, 0, 5) - self.book(folder, "m_t_DR", "", 200, 0, 5) - self.book(folder, "e_t_DR", "", 200, 0, 5) - - - #let's look for osme other possible selections - self.book(folder, "Mass" , "mass" , 800, 0, 800 ) - self.book(folder, "pt_ratio" , "pt_ratio" , 100, 0, 1) - self.book(folder, "tToMETDPhi" , "tToMETDPhi" , 100, 0, 4) - self.book(folder, "type1_pfMetEt" , "metEt" , 300, 0, 2000) #There is no call to self, so just promote it to statucmethod, to allow usage by other dedicated analyzers @@ -178,6 +209,12 @@ def preselection( self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr Excludes FR object IDs and sign cut. ''' + if row.e_t_DR < 0.5 or row.m_t_DR < 0.5 or row.e_m_DR < 0.5: return False + cut_flow_trk.Fill('DR separation') + + if self.hfunc['subMass'](row, 1)[0] < 20: return False + cut_flow_trk.Fill('sub mass cut') + mu17e8, mu8e17 = False, False if use_iso_trigger: mu17e8 = row.mu17ele8isoPass and \ @@ -202,56 +239,24 @@ def preselection( self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr cut_flow_trk.Fill('trigger') if not selections.muSelection(row, 'm'): return False #applies basic selection (eta, pt > 10, DZ, pixHits, jetBTag) - #cut_flow_trk.Fill('pt requirements 1', 'eta requirements 1', 'MissingHits 1', 'HasConversion 1', 'JetBtag 1', 'DZ 1',) cut_flow_trk.Fill('obj1 Presel') if not selections.eSelection(row, 'e'): return False #applies basic selection (eta, pt > 10, DZ, missingHits, jetBTag, HasConversion and chargedIdTight) cut_flow_trk.Fill('obj2 Presel') - #FIXME - #if row.ePt < 10: return False - #cut_flow_trk.Fill('pt requirements 2') - #if row.eAbsEta > 2.5: return False - #cut_flow_trk.Fill('eta requirements 2') - #if row.eMissingHits: return False - #cut_flow_trk.Fill('MissingHits 2') - #if row.eHasConversion: return False - #cut_flow_trk.Fill('HasConversion 2') - #if row.eJetBtag > 3.3: return False - #cut_flow_trk.Fill('JetBtag 2') - #if abs(row.eDZ) > 0.2: return False - #cut_flow_trk.Fill('DZ 2') - if not selections.tauSelection(row, 't'): return False #applies basic selection (eta, pt > 20, DZ) if row.tPt < taupt_thr: return False - if row.tMuOverlap: return False - if not row.tAntiMuonTight: return False cut_flow_trk.Fill('obj3 Presel') if row.LT < LT_threshold: return False cut_flow_trk.Fill('LT') - if row.e_m_SS and row.e_t_SS: return False #remove three SS leptons - if not selections.vetos(row): return False #applies mu bjet e additional tau vetoes - cut_flow_trk.Fill('vetos') - #FIXME - if not row.eChargeIdTight: return False - #cut_flow_trk.Fill('ChargeIdTight') - - if e_m_Mass < 20: return False - cut_flow_trk.Fill('charge_fakes') #no charge fakes here + if row.e_m_Mass < 20: return False + cut_flow_trk.Fill('dilepton mass cut') - #FIXME: ONLY FOR CUT-FLOW PRODUCTION - #if not row.mPFIDTight: return False - #cut_flow_trk.Fill('obj1 ID') - #if not selections.lepton_id_iso(row, 'm', 'h2taucuts'): return False - #cut_flow_trk.Fill('obj1 Iso') - #if not selections.summer_2013_eid(row, 'e'): return False - #cut_flow_trk.Fill('obj2 ID') - #if not selections.lepton_id_iso(row, 'e', 'h2taucuts'): return False - #cut_flow_trk.Fill('obj2 Iso') - #if not row.tLooseIso3Hits: return False - #cut_flow_trk.Fill('obj3 IDIso') + if not selections.vetos(row, cut_flow_trk): return False #applies mu bjet e additional tau vetoes + + cut_flow_trk.Fill('charge_fakes') #no charge fakes here return True @@ -261,6 +266,11 @@ def sign_cut( row): ''' Returns true if muons are SS ''' return bool(row.e_m_SS) + @staticmethod + def tau_sign_cut(row): + ''' Returns true if muons are SS ''' + return not bool(row.m_t_SS) + #There is no call to self, so just promote it to statucmethod, to allow usage by other dedicated analyzers @staticmethod def obj1_id( row, ledleptonId='h2taucuts', subledleptonId='h2taucuts'): @@ -279,18 +289,33 @@ def obj3_id(row, tauId=None, LT_threshold = 80., taupt_thr = 0.): else: return bool( getattr(row, tauId) ) + @staticmethod + def obj1_matches_gen(row): + return row.mGenPdgId == -1*row.mCharge*13 + + @staticmethod + def obj2_matches_gen(row): + return row.eGenPdgId == -1*row.eCharge*11 + + @staticmethod + def obj3_matches_gen(row): + return t.genDecayMode != -2 + #There is no call to self, so just promote it to statucmethod, to allow usage by other dedicated analyzers @staticmethod def anti_wz( row): - if row.e_t_Zcompat < 20: - if not row.tAntiElectronMVA3Medium: - return False - elif not row.tAntiElectronMVA3Loose: + if not row.tAntiMuonLoose or not row.tAntiElectronMVA3Loose: + return False + if row.e_t_Zcompat < 20 and (not row.tAntiElectronMVA3Medium): return False + if row.m_t_Zcompat < 20 and not (row.tAntiMuonTight and \ + (( row.tDecayMode == 0 and row.tLeadChargeCandEMFraction > 0.2 ) \ + or row.tDecayMode <> 0)): + return False return True def enhance_wz(self, row): - if row.e_t_Zcompat < 15 and not row.tAntiElectronMVA: + if row.e_t_Zcompat < 15 and row.tCiCTightElecOverlap: return True return False @@ -306,36 +331,36 @@ def event_weight(self, row): def obj1_weight(self, row, ledleptonId='h2taucuts', subledleptonId='h2taucuts'): mu17e8 = (row.mu17ele8isoPass and row.mPt >= 20) if use_iso_trigger else (row.mu17ele8Pass and row.mPt >= 20) if mu17e8: - return frfits.highpt_mu_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, muonJetCSVBtag=max(0, row.mJetCSVBtag)) + return frfits.highpt_mue_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, numJets20=row.jetVeto20+1) # else: - return frfits.lowpt_mu_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, muonJetCSVBtag=max(0, row.mJetCSVBtag)) + return frfits.lowpt_mue_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, numJets20=row.jetVeto20+1) # def obj2_weight(self, row, ledleptonId='h2taucuts', subledleptonId='h2taucuts'): mu17e8 = (row.mu17ele8isoPass and row.mPt >= 20) if use_iso_trigger else (row.mu17ele8Pass and row.mPt >= 20) if mu17e8: - return frfits.lowpt_e_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt) + return frfits.lowpt_e_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt, numJets20=row.jetVeto20+1) else: - return frfits.highpt_e_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt) + return frfits.highpt_e_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt, numJets20=row.jetVeto20+1) def obj3_weight(self, row, notUsed1=None, notUsed2=None): - return frfits.tau_fr(row.tPt) + return frfits.tau_fr(row.tPt, row.tAbsEta) def obj1_qcd_weight(self, row, ledleptonId='h2taucuts', subledleptonId='h2taucuts'): mu17e8 = (row.mu17ele8isoPass and row.mPt >= 20) if use_iso_trigger else (row.mu17ele8Pass and row.mPt >= 20) if mu17e8: - return frfits.highpt_mu_qcd_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, muonJetCSVBtag=max(0, row.mJetCSVBtag)) + return frfits.highpt_mue_qcd_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, numJets20=row.jetVeto20+1) # else: - return frfits.lowpt_mu_qcd_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, muonJetCSVBtag=max(0, row.mJetCSVBtag)) + return frfits.lowpt_mue_qcd_fr[ledleptonId](muonJetPt=max(row.mJetPt, row.mPt), muonPt=row.mPt, numJets20=row.jetVeto20+1) # def obj2_qcd_weight(self, row, ledleptonId='h2taucuts', subledleptonId='h2taucuts'): mu17e8 = (row.mu17ele8isoPass and row.mPt >= 20) if use_iso_trigger else (row.mu17ele8Pass and row.mPt >= 20) if mu17e8: - return frfits.lowpt_e_qcd_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt) + return frfits.lowpt_e_qcd_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt, numJets20=row.jetVeto20+1) else: - return frfits.highpt_e_qcd_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt) + return frfits.highpt_e_qcd_fr[subledleptonId](electronJetPt=max(row.eJetPt, row.ePt), electronPt=row.ePt, numJets20=row.jetVeto20+1) def obj3_qcd_weight(self, row, notUsed1=None, notUsed2=None): - return frfits.tau_qcd_fr(row.tPt) + return frfits.tau_qcd_fr(row.tPt, row.tAbsEta) # For measuring charge flip probability # Not really used in this channel @@ -346,17 +371,11 @@ def obj1_obj3_SS(self, row): ## return 0 def obj2_charge_flip(self, row, ledleptonId='h2taucuts', subledleptonId='h2taucuts'): - if ledleptonId.startswith('lead4muon_'): - ledleptonId = subledleptonId - subledleptonId = subledleptonId return frfits.e_charge_flip[ledleptonId](row.eAbsEta,row.ePt) \ if row.ePt > row.mPt else \ frfits.e_charge_flip[subledleptonId](row.eAbsEta,row.ePt) def obj2_charge_flip_sysup(self, row, ledleptonId='h2taucuts', subledleptonId='h2taucuts'): - if ledleptonId.startswith('lead4muon_'): - ledleptonId = subledleptonId - subledleptonId = subledleptonId return frfits.e_charge_flip_up[ledleptonId](row.eAbsEta,row.ePt) \ if row.ePt > row.mPt else \ frfits.e_charge_flip_up[subledleptonId](row.eAbsEta,row.ePt) \ diff --git a/wh/WHAnalyzeMMT.py b/wh/WHAnalyzeMMT.py index 64272203..613b7825 100755 --- a/wh/WHAnalyzeMMT.py +++ b/wh/WHAnalyzeMMT.py @@ -12,14 +12,35 @@ import baseSelections as selections import fakerate_functions as frfits import math +from array import array from FinalStateAnalysis.PlotTools.decorators import memo_last import optimizer +import FinalStateAnalysis.PlotTools.pytree as pytree + +#initialize FRFits +optimizer_keys = [ i for i in optimizer.grid_search.keys() if i.startswith('MMT') ] +print optimizer_keys +grid_search = {} +if len(optimizer_keys) > 1: + grid_search[key] = optimizer.grid_search[key] + +NO_HISTO_FILL = ('NO_HISTO_FILL' in os.environ) and eval(os.environ['NO_HISTO_FILL']) + +if not NO_HISTO_FILL: + for key in optimizer_keys: + frfits.highpt_mu_fr.__activate__(optimizer.grid_search[key]['leading_iso']) + frfits.highpt_mu_qcd_fr.__activate__(optimizer.grid_search[key]['leading_iso']) + frfits.lowpt_mu_fr.__activate__(optimizer.grid_search[key]['subleading_iso']) + frfits.lowpt_mu_qcd_fr.__activate__(optimizer.grid_search[key]['subleading_iso']) + +SYNC = ('SYNC' in os.environ) and eval(os.environ['SYNC']) + ################################################################################ #### Analysis logic ############################################################ ################################################################################ class WHAnalyzeMMT(WHAnalyzerBase): - tree = 'mmt/final/Ntuple' + tree = 'mmt/final/Ntuple' if not SYNC else 'Ntuple' def __init__(self, tree, outfile, **kwargs): self.channel = 'MMT' super(WHAnalyzeMMT, self).__init__(tree, outfile, MuMuTauTree, **kwargs) @@ -40,123 +61,127 @@ def f(row, weight): lead_iso = self.grid_search['']['leading_iso'] sublead_iso = self.grid_search['']['subleading_iso'] - @memo_last - def f_par_prob(m1Pt, m1JetPt, - m2Pt, m2JetPt, - tPt): - p_m1 = (( frfits.highpt_mu_fr[lead_iso](muonJetPt=max(m1JetPt, m1Pt), muonPt=m1Pt) +\ - frfits.highpt_mu_qcd_fr[lead_iso](muonJetPt=max(m1JetPt, m1Pt), muonPt=m1Pt) )/2) - p_m2 = (( frfits.lowpt_mu_fr[sublead_iso](muonJetPt=max(m2JetPt, m2Pt), muonPt=m2Pt) + \ - frfits.lowpt_mu_qcd_fr[sublead_iso](muonJetPt=max(m2JetPt, m2Pt), muonPt=m2Pt))/2) - p_t = frfits.tau_fr(tPt) - return (p_m1 + p_m2*(1 - p_m1) + p_t*(1 - p_m1)*(1 - p_m2)) - - def f_prob(row, weight): - val = f_par_prob(row.m1Pt, row.m1JetPt, - row.m2Pt, row.m2JetPt, - row.tPt) - return val, weight - - def log_prob(row, weight): - prob, weight = f_prob(row, weight) - return ROOT.TMath.Log10(prob), weight + #@memo_last + #def f_par_prob(m1Pt, m1JetPt, + # m2Pt, m2JetPt, + # tPt): + # p_m1 = (( frfits.highpt_mu_fr[lead_iso](muonJetPt=max(m1JetPt, m1Pt), muonPt=m1Pt) +\ + # frfits.highpt_mu_qcd_fr[lead_iso](muonJetPt=max(m1JetPt, m1Pt), muonPt=m1Pt) )/2) + # p_m2 = (( frfits.lowpt_mu_fr[sublead_iso](muonJetPt=max(m2JetPt, m2Pt), muonPt=m2Pt) + \ + # frfits.lowpt_mu_qcd_fr[sublead_iso](muonJetPt=max(m2JetPt, m2Pt), muonPt=m2Pt))/2) + # p_t = frfits.tau_fr(tPt) + # return (p_m1 + p_m2*(1 - p_m1) + p_t*(1 - p_m1)*(1 - p_m2)) + # + #def f_prob(row, weight): + # val = f_par_prob(row.m1Pt, row.m1JetPt, + # row.m2Pt, row.m2JetPt, + # row.tPt) + # return val, weight + # + #def log_prob(row, weight): + # prob, weight = f_prob(row, weight) + # return ROOT.TMath.Log10(prob), weight - self.hfunc['faking_prob'] = f_prob - self.hfunc['log_prob'] = log_prob - self.hfunc["m2_t_Mass#faking_prob"] = merge_functions( attr_getter('m2_t_Mass'), f_prob ) - self.hfunc["m2_t_Mass#log_prob" ] = merge_functions( attr_getter('m2_t_Mass'), log_prob) + #self.hfunc['faking_prob'] = f_prob + #self.hfunc['log_prob'] = log_prob + #self.hfunc["m2_t_Mass#faking_prob"] = merge_functions( attr_getter('m2_t_Mass'), f_prob ) + #self.hfunc["m2_t_Mass#log_prob" ] = merge_functions( attr_getter('m2_t_Mass'), log_prob) self.hfunc['subMTMass'] = lambda row, weight: (row.m2_t_Mass, weight) if row.m1MtToMET > row.m2MtToMET else (row.m1_t_Mass, weight) #maps the name of non-trivial histograms to a function to get the proper value, the function MUST have two args (evt and weight). Used in WHAnalyzerBase.fill_histos later self.hfunc['pt_ratio' ] = lambda row, weight: (row.m2Pt/row.m1Pt, weight) + self.hfunc['SYNC'] = lambda row, weight: (row, None)#((row.run, row.lumi, row.evt, row.m1Pt, row.m1Eta, row.m1Phi, row.m2Pt, row.m2Eta, row.m2Phi, row.tPt, row.tEta, row.tPhi, weight), None) self.pucorrector = mcCorrectors.make_puCorrector('doublemu') def book_histos(self, folder): + LTBinning = array('d',[0, 80, 130, 600]) + nLTBins = len(LTBinning) -1 for key in self.grid_search: prefix = key+'$' if key else '' - self.book(folder, prefix+"m2_t_Mass", "subleadingMass", 200, 0, 200) + #self.book(folder, prefix+"m2_t_Mass", "subleadingMass", 200, 0, 200) self.book(folder, prefix+"LT" , "LT" , 100, 0., 500) self.book(folder, prefix+"m2_t_Pt", "subleadingPt", 400, 0, 400) if len(self.grid_search.keys()) == 1: - self.book(folder, "m2_t_Mass#LT" , "subleadingMass", 200, 0, 200, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "m2_t_Mass#tPt", "subleadingMass", 200, 0, 200, 200, 0, 200, type=ROOT.TH2F) - #self.book(folder, "m2_t_Mass#faking_prob" , "subleadingMass", 200, 0, 200, 1100, 0., 1.1, type=ROOT.TH2F) - #self.book(folder, "m2_t_Mass#log_prob" , "subleadingMass", 200, 0, 200, 1000, -10, 1, type=ROOT.TH2F) - #self.book(folder, 'faking_prob' , "", 1100, 0., 1.1) - #self.book(folder, 'log_prob' , "", 1000, -10, 1) - + self.book(folder, 'SYNC', 'SYNC', + 'run/l:lumi/l:evt/l' +\ + ':m1Pt/D:m1Eta/D:m1Phi/D:m1PFIDTight/D:m1RelPFIsoDB/D' +\ + ':m2Pt/D:m2Eta/D:m2Phi/D:m2PFIDTight/D:m2RelPFIsoDB/D' +\ + ':tPt/D:tEta/D:tPhi/D:tAntiMuonTight/D:tDecayMode/D:tLooseIso3Hits/D:tAntiElectronMVA3Loose/D' +\ + ':m1_m2_Mass/D:m2_t_Mass/D:LT/D:m1_m2_SS/D:m1_t_SS/D', + type=pytree.PyTree) + + self.book(folder, "m2_t_Mass#LT" , "subleadingMass", 300, 0, 300, nLTBins, LTBinning, type=ROOT.TH2F) + #self.book(folder, "Event_ID", "Event ID", 'run:lumi:evt1:evt2', type=ROOT.TNtuple) + #self.book(folder, "DEBUG", "DEBUG", 'run:lumi:m2_t_Mass:LT:m1Pt:m2Pt:tPt', type=ROOT.TNtuple) #Pt - self.book(folder, "m1Pt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "tPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "m2Pt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "m1JetPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "m2JetPt#LT" , "subleadingMass", 150, 0, 150, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, "m1Pt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "tPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m2Pt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m1JetPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m2JetPt#LT" , "subleadingMass", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) #eta - self.book(folder, "m1AbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "m2AbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "tAbsEta#LT" , "subleadingMass", 100, 0, 2.5, 120, 0, 600, type=ROOT.TH2F) + self.book(folder, "m1AbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m2AbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "tAbsEta#LT" , "subleadingMass", 100, 0, 2.5, nLTBins, LTBinning, type=ROOT.TH2F) #DR - self.book(folder, "m1_t_DR#LT" , "subleadingMass", 100, 0, 10, 120, 0, 600, type=ROOT.TH2F) - self.book(folder, "m2_t_DR#LT" , "subleadingMass", 100, 0, 10, 120, 0, 600, type=ROOT.TH2F) - + self.book(folder, "m1_t_DR#LT" , "subleadingMass", 100, 0, 10, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m2_t_DR#LT" , "subleadingMass", 100, 0, 10, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m1_m2_DR#LT", "subleadingMass", 100, 0, 10, nLTBins, LTBinning, type=ROOT.TH2F) + #Jet BTag - self.book(folder, "m2JetBtag#LT", "Muon 2 Pt", 100, -100, 100, 60, 0, 600, type=ROOT.TH2F) - self.book(folder, "m1JetBtag#LT", "Muon 2 Pt", 100, -100, 100, 60, 0, 600, type=ROOT.TH2F) - self.book(folder, "m1JetCSVBtag#LT", "Muon 2 Pt", 120, -5, 1, 60, 0, 600, type=ROOT.TH2F) - self.book(folder, "m2JetCSVBtag#LT", "Muon 2 Pt", 120, -5, 1, 60, 0, 600, type=ROOT.TH2F) - + self.book(folder, "m2JetBtag#LT", "Muon 2 Pt", 100, -100, 100, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m1JetBtag#LT", "Muon 2 Pt", 100, -100, 100, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m1JetCSVBtag#LT", "Muon 2 Pt", 120, -5, 1 , nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m2JetCSVBtag#LT", "Muon 2 Pt", 120, -5, 1 , nLTBins, LTBinning, type=ROOT.TH2F) #Mt To MET - self.book(folder, "m1MtToMET#LT", "Muon 2 Pt", 150, 0, 150, 60, 0, 600, type=ROOT.TH2F) - self.book(folder, "m2MtToMET#LT", "Muon 2 Pt", 150, 0, 150, 60, 0, 600, type=ROOT.TH2F) + self.book(folder, "m1MtToMET#LT", "Muon 2 Pt", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "m2MtToMET#LT", "Muon 2 Pt", 150, 0, 150, nLTBins, LTBinning, type=ROOT.TH2F) + + #tau ISO + self.book(folder, "tRawIso3Hits#LT", "Muon 2 Pt", 200, 0, 200, nLTBins, LTBinning, type=ROOT.TH2F) + self.book(folder, "tRawIsoMVA2#LT", "Muon 2 Pt" , 200, -1, -1, nLTBins, LTBinning, type=ROOT.TH2F) self.book(folder, "m2RelPFIsoDB", "m2Iso", 100, 0, 0.3) self.book(folder, "m1_t_Mass", "leadingMass", 200, 0, 200) self.book(folder, "m1_m2_Mass", "Muon 1-2 Mass", 120, 0, 120) - self.book(folder, "m2_t_DR", "m2_t_DR", 100, 0, 5) - self.book(folder, "m1_t_DR", "m1_t_DR", 100, 0, 5) - self.book(folder, "m1JetPt", "Muon 1 Jet Pt", 100, 0, 200) - self.book(folder, "m2JetPt", "Muon 2 Jet Pt", 100, 0, 200) # Rank muons by less MT to MET, for WZ control region self.book(folder, "weight", "Event weight", 100, 0, 5) self.book(folder, "rho", "Fastjet #rho", 100, 0, 25) self.book(folder, "nvtx", "Number of vertices", 31, -0.5, 30.5) - self.book(folder, "m1Pt", "Muon 1 Pt", 100, 0, 100) - self.book(folder, "m2Pt", "Muon 2 Pt", 100, 0, 100) - self.book(folder, "m1AbsEta", "Muon 1 AbsEta", 100, 0, 2.4) - self.book(folder, "m2AbsEta", "Muon 2 AbsEta", 100, 0, 2.4) - self.book(folder, "tPt", "Tau Pt", 100, 0, 100) - self.book(folder, "tAbsEta", "Tau AbsEta", 100, 0, 2.3) self.book(folder, "subMTMass", "subMTMass", 200, 0, 200) - #self.book(folder, "tDecayMode", "Tau AbsEta", 15, -0.5, 14.5) self.book(folder, "nTruePU", "NPU", 62, -1.5, 60.5) self.book(folder, "m1DZ", "m1DZ", 100, 0., 1) self.book(folder, "m2DZ", "m2DZ", 100, 0., 1) self.book(folder, "tDZ" , "tDZ" , 100, 0., 1) self.book(folder, "doubleMuPrescale", "HLT prescale", 26, -5.5, 20.5) - #let's look for osme other possible selections - self.book(folder, "pt_ratio" , "pt_ratio" , 100, 0, 1) - self.book(folder, "tToMETDPhi" , "tToMETDPhi" , 100, 0, 4) - self.book(folder, "Mass" , "mass" , 800, 0, 800 ) - self.book(folder, "type1_pfMetEt" , "metEt" , 300, 0, 2000) - def preselection(self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr = 0.): ''' Preselection applied to events. Excludes FR object IDs and sign cut. ''' + + # + # NEW EXPLICIT CUT, BEFORE IT WAS IMPLICIT AND MADE WHILE PLOTTING! + # + if row.m1_t_DR < 0.5 or row.m2_t_DR < 0.5 or row.m1_m2_DR < 0.5: return False + cut_flow_trk.Fill('DR separation') + + if row.m2_t_Mass < 20: return False + cut_flow_trk.Fill('sub mass cut') + double_mu_pass = row.doubleMuPass and \ row.m1MatchesDoubleMuPaths > 0 and \ row.m2MatchesDoubleMuPaths > 0 double_muTrk_pass = row.doubleMuTrkPass and \ - row.m1MatchesDoubleMuTrkPaths > 0 and \ - row.m2MatchesDoubleMuTrkPaths > 0 + row.m1MatchesMu17TrkMu8Path > 0 and \ + row.m2MatchesMu17TrkMu8Path > 0 if not ( double_mu_pass or double_muTrk_pass ): return False cut_flow_trk.Fill('trigger') @@ -164,12 +189,9 @@ def preselection(self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr = if row.m1Pt < 20: return False if not selections.muSelection(row, 'm1'): return False #applies basic selection (eta, pt > 10, DZ, pixHits, jetBTag) cut_flow_trk.Fill('obj1 Presel') - #cut_flow_trk.Fill('pt requirements 1', 'eta requirements 1', 'MissingHits 1', 'HasConversion 1', 'JetBtag 1', 'DZ 1',) - if not selections.muSelection(row, 'm2'): return False #applies basic selection (eta, pt > 10, DZ, pixHits, jetBTag) cut_flow_trk.Fill('obj2 Presel') - #cut_flow_trk.Fill('pt requirements 2', 'eta requirements 2', 'MissingHits 2', 'HasConversion 2', 'JetBtag 2', 'DZ 2',) if not selections.tauSelection(row, 't'): return False #applies basic selection (eta, pt > 20, DZ) if not row.tAntiElectronMVA3Loose: return False @@ -179,27 +201,18 @@ def preselection(self, row, cut_flow_trk = None, LT_threshold = 80., taupt_thr = if row.LT < LT_threshold: return False cut_flow_trk.Fill('LT') - if row.m1_m2_SS and row.m1_t_SS: return False #remove three SS leptons if row.m1_m2_Mass < 20: return False - if not selections.vetos(row): return False #applies mu bjet e additional tau vetoes - cut_flow_trk.Fill('vetos') - #cut_flow_trk.Fill('ChargeIdTight') - cut_flow_trk.Fill('charge_fakes') #no charge fakes here - - #FIXME: ONLY FOR CUT-FLOW PRODUCTION - #if not row.m1PFIDTight: return False - #cut_flow_trk.Fill('obj1 ID') - #if not selections.lepton_id_iso(row, 'm1', 'h2taucuts'): return False - #cut_flow_trk.Fill('obj1 Iso') - #if not row.m2PFIDTight: return False - #cut_flow_trk.Fill('obj2 ID') - #if not selections.lepton_id_iso(row, 'm2', 'h2taucuts'): return False - #cut_flow_trk.Fill('obj2 Iso') - #if not row.tLooseIso3Hits: return False - #cut_flow_trk.Fill('obj3 IDIso') + cut_flow_trk.Fill('dilepton mass cut') + + if not selections.vetos(row, cut_flow_trk): return False #applies mu bjet e additional tau vetoes return True + @staticmethod + def tau_sign_cut(row): + ''' Returns true if muons are SS ''' + return not bool(row.m1_t_SS) + @staticmethod def sign_cut(row): ''' Returns true if muons are SS ''' @@ -215,26 +228,37 @@ def obj2_id(row, leadleptonId=None, subleadleptonId='h2taucuts'): @staticmethod def obj3_id(row, tauId=None, LT_threshold = 80., taupt_thr = 0.): + retval = False if row.LT >= LT_threshold and row.tPt >= taupt_thr: - return bool(row.tLooseIso3Hits) + retval = bool(row.tLooseIso3Hits) else: - return bool( getattr(row, tauId) ) + retval = bool( getattr(row, tauId) ) + return retval + + @staticmethod + def obj1_matches_gen(row): + return row.m1GenPdgId == -1*row.m1Charge*13 + + @staticmethod + def obj2_matches_gen(row): + return row.m2GenPdgId == -1*row.m2Charge*13 + + @staticmethod + def obj3_matches_gen(row): + return t.genDecayMode != -2 @staticmethod def anti_wz(row): - return row.tAntiMuonTight # and not row.tMuOverlap + return bool(row.tAntiMuonTight and (( row.tDecayMode == 0 and row.tLeadChargeCandEMFraction > 0.2 ) or row.tDecayMode <> 0)) # and not row.tMuOverlap def enhance_wz(self, row): # Require the "tau" to be a muon, and require the third muon # to have M_Z +- 20 - if self.anti_wz(row): - return False # Cut on m2 PT > 20 #if row.m2Pt < 20: #return False # Make sure any Z is from m1 - m2_good_Z = bool(71 < row.m2_t_Mass < 111) - return not m2_good_Z + return row.tMuOverlap def event_weight(self, row): if row.run > 2: @@ -244,22 +268,22 @@ def event_weight(self, row): mcCorrectors.double_muon_trigger(row,'m1','m2') def obj1_weight(self, row, ledleptonId='h2taucuts', subledleptonId=None): - return frfits.highpt_mu_fr[ledleptonId](muonJetPt=max(row.m1JetPt, row.m1Pt), muonPt=row.m1Pt, muonJetCSVBtag=max(0, row.m1JetCSVBtag)) #muonPVDXY=row.m1PVDXY) #, muonJetBtag=row.m1JetBtag) + return frfits.highpt_mu_fr[ledleptonId](muonJetPt=max(row.m1JetPt, row.m1Pt), muonPt=row.m1Pt, numJets20=row.jetVeto20+1) # def obj2_weight(self, row, ledleptonId=None, subledleptonId='h2taucuts'): - return frfits.lowpt_mu_fr[subledleptonId](muonJetPt=max(row.m2JetPt, row.m2Pt), muonPt=row.m2Pt, muonJetCSVBtag=max(0, row.m2JetCSVBtag)) #, muonPVDXY=row.m2PVDXY) #, muonJetBtag=row.m2JetBtag) + return frfits.lowpt_mu_fr[subledleptonId](muonJetPt=max(row.m2JetPt, row.m2Pt), muonPt=row.m2Pt, numJets20=row.jetVeto20+1) # def obj3_weight(self, row, notUsed1=None, notUsed2=None): - return frfits.tau_fr(row.tPt) + return frfits.tau_fr(row.tPt, row.tAbsEta) def obj1_qcd_weight(self, row, ledleptonId='h2taucuts', subledleptonId=None): - return frfits.highpt_mu_qcd_fr[ledleptonId](muonJetPt=max(row.m1JetPt, row.m1Pt), muonPt=row.m1Pt, muonJetCSVBtag=max(0, row.m1JetCSVBtag)) #, muonPVDXY=row.m1PVDXY) #, muonJetBtag=row.m1JetBtag) + return frfits.highpt_mu_qcd_fr[ledleptonId](muonJetPt=max(row.m1JetPt, row.m1Pt), muonPt=row.m1Pt, numJets20=row.jetVeto20+1) # def obj2_qcd_weight(self, row, ledleptonId=None, subledleptonId='h2taucuts'): - return frfits.lowpt_mu_qcd_fr[subledleptonId](muonJetPt=max(row.m2JetPt, row.m2Pt), muonPt=row.m2Pt, muonJetCSVBtag=max(0, row.m2JetCSVBtag)) #, muonPVDXY=row.m2PVDXY) #, muonJetBtag=row.m2JetBtag) + return frfits.lowpt_mu_qcd_fr[subledleptonId](muonJetPt=max(row.m2JetPt, row.m2Pt), muonPt=row.m2Pt, numJets20=row.jetVeto20+1) # def obj3_qcd_weight(self, row, notUsed1=None, notUsed2=None): - return frfits.tau_qcd_fr(row.tPt) + return frfits.tau_qcd_fr(row.tPt, row.tAbsEta) # For measuring charge flip probability # Not really used in this channel diff --git a/wh/WHAnalyzerBase.py b/wh/WHAnalyzerBase.py index d176cb88..f3d10b4a 100644 --- a/wh/WHAnalyzerBase.py +++ b/wh/WHAnalyzerBase.py @@ -57,9 +57,23 @@ import os import ROOT import math +from pdb import set_trace import itertools +import array from FinalStateAnalysis.PlotTools.decorators import memo from FinalStateAnalysis.Utilities.struct import struct +from cutflowtracker import cut_flow_tracker +#Makes the cut flow histogram +cut_flow_step = ['bare', 'WH Event', + #'obj1 GenMatching', 'obj2 GenMatching', 'obj3 GenMatching', + 'DR separation', 'sub mass cut', 'trigger', + 'obj1 Presel', 'obj2 Presel', 'obj3 Presel', + 'LT', 'dilepton mass cut', 'muon veto', 'bjet veto', 'electron veto', + 'tau veto', 'sign cut', 'tau sign', 'anti WZ', + 'obj1 IDIso', 'obj2 IDIso', 'obj3 IDIso', + 'anti charge flip', +] + @memo def joinDirs(*args): @@ -75,40 +89,6 @@ def inv_mass(*args): v.SetPtEtaPhiM(*i) return sum(lorentz_vecs,ROOT.TLorentzVector()).M() #We need to give the staring point otherwise it starts from an int and it does not work -class cut_flow_tracker(object): - def __init__(self, hist): - self.labels = [hist.GetXaxis().GetBinLabel(i+1) for i in range(hist.GetNbinsX())] - self.cut_flow = dict([ (i, False) for i in self.labels]) - self.hist = hist - self.evt_info = [-1, -1, -1] - self.disabled = True #'CutFlow' not in os.environ - if not self.disabled: - print "running cut flow" - - def fill(self, label): - self.cut_flow[label] = True - - def Fill(self, *labels): - if self.disabled: - return - for label in labels: - self.fill(label) - - def flush(self): - if self.disabled: - return - for i, label in enumerate(self.labels): - val = self.cut_flow[label] - if val: - self.hist.Fill(i+0.5) - - def new_row(self, *args): - if self.disabled: - return - if self.evt_info != list(args): - self.flush() - self.evt_info = list(args) - self.cut_flow = dict([ (i, False) for i in self.labels]) class WHAnalyzerBase(MegaBase): def __init__(self, tree, outfile, wrapper, **kwargs): @@ -140,65 +120,68 @@ def build_wh_folder_structure(): #folders = [] flag_map = {} for sign in ['ss', 'os']: - for failing_objs in [(), (1,), (2,), (3,), (1,3), (2, 3), (1,2), (1,2,3)]: - cut_key = [sign == 'ss'] - region_label = '' - for i in range(1,4): - if i in failing_objs: - region_label += 'f' + str(i) - cut_key.append(False) - else: - region_label += 'p' + str(i) - cut_key.append(True) - # Figure out which objects to weight for FR - weights_to_apply = [] - # Single fake - if len(failing_objs) == 1: - weights_to_apply.append( - (failing_objs, "w%i" % failing_objs)) - # A version using the QCD fake rate - weights_to_apply.append( - (failing_objs, "q%i" % failing_objs)) - if len(failing_objs) == 2: - # in the 1-2 case, apply both. Otherwise, just apply the - # first (a light lepton) - if 3 not in failing_objs: - weights_to_apply.append( - (failing_objs, "w%i%i" % failing_objs)) - # Using QCD rate - weights_to_apply.append( - (failing_objs, "q%i%i" % failing_objs)) - else: + for tau_sign in ['tau_ss', 'tau_os']: + for failing_objs in [(), (1,), (2,), (3,), (1,3), (2, 3), (1,2), (1,2,3)]: + cut_key = [sign == 'ss'] + tau_sign_key = (tau_sign == 'tau_os') + cut_key.append( tau_sign_key ) + region_label = '' + for i in range(1,4): + if i in failing_objs: + region_label += 'f' + str(i) + cut_key.append(False) + else: + region_label += 'p' + str(i) + cut_key.append(True) + # Figure out which objects to weight for FR + weights_to_apply = [] + # Single fake + if len(failing_objs) == 1: weights_to_apply.append( - (failing_objs, "w%i" % failing_objs[0])) - # Using QCD rate + (failing_objs, "w%i" % failing_objs)) + # A version using the QCD fake rate weights_to_apply.append( - (failing_objs, "q%i" % failing_objs[0])) - - if len(failing_objs) == 3: - weights_to_apply.append( ((3,), "w3") ) - weights_to_apply.append( ((1,3,), "w13") ) - weights_to_apply.append( ((2,3,), "w23") ) - # QCD weight versions - weights_to_apply.append( ((1,3,), "q13") ) - weights_to_apply.append( ((2,3,), "q23") ) - # Needed for f3 CR - weights_to_apply.append( ((1,2), "w12")) - weights_to_apply.append( ((1,), "w1")) - weights_to_apply.append( ((2,), "w2")) - weights_to_apply.append( ((1,2), "q12")) - weights_to_apply.append( ((1,), "q1")) - weights_to_apply.append( ((2,), "q2")) - - #folders_to_add = [ (sign, region_label) ] - # Which objects to weight for each region - weights_to_add = [] - for failing_objs, weight_to_apply in weights_to_apply: - #folders_to_add.append( (sign, region_label, weight_to_apply) ) - weights_to_add.append(weight_to_apply) - - flag_map[tuple(cut_key)] = ((sign, region_label), tuple(weights_to_add)) - #folders.extend(folders_to_add) + (failing_objs, "q%i" % failing_objs)) + if len(failing_objs) == 2: + # in the 1-2 case, apply both. Otherwise, just apply the + # first (a light lepton) + if 3 not in failing_objs: + weights_to_apply.append( + (failing_objs, "w%i%i" % failing_objs)) + # Using QCD rate + weights_to_apply.append( + (failing_objs, "q%i%i" % failing_objs)) + else: + weights_to_apply.append( + (failing_objs, "w%i" % failing_objs[0])) + # Using QCD rate + weights_to_apply.append( + (failing_objs, "q%i" % failing_objs[0])) + + if len(failing_objs) == 3: + weights_to_apply.append( ((3,), "w3") ) + weights_to_apply.append( ((1,3,), "w13") ) + weights_to_apply.append( ((2,3,), "w23") ) + # QCD weight versions + weights_to_apply.append( ((1,3,), "q13") ) + weights_to_apply.append( ((2,3,), "q23") ) + # Needed for f3 CR + weights_to_apply.append( ((1,2), "w12")) + weights_to_apply.append( ((1,), "w1")) + weights_to_apply.append( ((2,), "w2")) + weights_to_apply.append( ((1,2), "q12")) + weights_to_apply.append( ((1,), "q1")) + weights_to_apply.append( ((2,), "q2")) + + #folders_to_add = [ (sign, region_label) ] + # Which objects to weight for each region + weights_to_add = [] + for failing_objs, weight_to_apply in weights_to_apply: + #folders_to_add.append( (sign, region_label, weight_to_apply) ) + weights_to_add.append(weight_to_apply) + + flag_map[tuple(cut_key)] = ((sign, tau_sign, region_label), tuple(weights_to_add)) + #folders.extend(folders_to_add) return flag_map @@ -207,6 +190,8 @@ def fill_histos(self, histos, folder_str, row, weight, filter_label = ''): #find all keys matching for attr in self.histo_locations[folder_str]: name = attr + #if attr=='DEBUG': + # set_trace() if filter_label: if not attr.startswith(filter_label+'$'): continue @@ -239,57 +224,43 @@ def fill_histos(self, histos, folder_str, row, weight, filter_label = ''): def begin(self): # Loop over regions, book histograms, book the minimal amount book_charge_flip_cr = hasattr(self, 'anti_charge_flip') - for _, folders in self.build_wh_folder_structure().iteritems(): - base_folder, weight_folders = folders - folder = "/".join(base_folder) - self.book_histos(folder) # in subclass - if book_charge_flip_cr: - self.book_histos(folder+'/charge_flip_CR') - # Each of the weight subfolders - for weight_folder in weight_folders: - hfolder = "/".join(base_folder + (weight_folder,)) - self.book_histos(hfolder) + no_histo_fill = ('NO_HISTO_FILL' in os.environ) and eval(os.environ['NO_HISTO_FILL']) + if not no_histo_fill: + for _, folders in self.build_wh_folder_structure().iteritems(): + base_folder, weight_folders = folders + folder = "/".join(base_folder) + self.book_histos(folder) # in subclass if book_charge_flip_cr: - self.book_histos(hfolder+'/charge_flip_CR') - - # Add WZ control region - self.book_histos('ss/p1p2p3_enhance_wz') - # Where second light lepton fails - self.book_histos('ss/p1f2p3_enhance_wz') - self.book_histos('ss/p1f2p3_enhance_wz/w2') - - # Add charge-fake control region - probability that obj1 will flip into - # ss/p1p2p3 - for i in itertools.product(['p3','f3'],['c1','c2','c1_sysup','c2_sysup']): - self.book_histos('os/p1p2%s/%s' % i) - self.book_histos('os/p1p2%s/%s/charge_flip_CR' % i) - - for key in self.histograms: - charpos = key.rfind('/') - location = key[ : charpos]+'/' - name = key[ charpos + 1 :] - if location in self.histo_locations: - self.histo_locations[location].append(name) - else: - self.histo_locations[location] = [name] - - #Makes the cut flow histogram - cut_flow_step = ['bare', 'WH Event', - #'obj1 GenMatching', 'obj2 GenMatching', 'obj3 GenMatching', - 'trigger', - 'obj1 Presel', 'obj2 Presel', -## 'pt requirements 1', 'eta requirements 1', -## 'MissingHits 1', 'HasConversion 1', 'JetBtag 1', 'DZ 1', -## 'pt requirements 2', 'eta requirements 2', -## 'MissingHits 2', 'HasConversion 2', 'JetBtag 2', 'DZ 2', - 'obj3 Presel', - 'LT', 'vetos', -## 'ChargeIdLoose', -## 'charge_fakes', - #'obj1 ID', 'obj1 Iso', 'obj2 ID', 'obj2 Iso', - 'obj1 IDIso', 'obj2 IDIso', 'obj3 IDIso', - 'sign cut', 'anti WZ', - ] + self.book_histos(folder+'/charge_flip_CR') + # Each of the weight subfolders + for weight_folder in weight_folders: + hfolder = "/".join(base_folder + (weight_folder,)) + self.book_histos(hfolder) + if book_charge_flip_cr: + self.book_histos(hfolder+'/charge_flip_CR') + + # Add WZ control region + self.book_histos('ss/tau_os/p1p2p3_enhance_wz') + # Where second light lepton fails + self.book_histos('ss/tau_os/p1f2p3_enhance_wz') + self.book_histos('ss/tau_os/p1f2p3_enhance_wz/w2') + + # Add charge-fake control region - probability that obj1 will flip into + # ss/p1p2p3 + for i in itertools.product(['tau_os','tau_ss'],['p3','f3'],['c1','c2','c1_sysup','c2_sysup']): + self.book_histos('os/%s/p1p2%s/%s' % i) + self.book_histos('os/%s/p1p2%s/%s/charge_flip_CR' % i) + + for key in self.histograms: + charpos = key.rfind('/') + location = key[ : charpos]+'/' + name = key[ charpos + 1 :] + if location in self.histo_locations: + self.histo_locations[location].append(name) + else: + self.histo_locations[location] = [name] + #END if not no_histo_fill: + self.book('ss', "CUT_FLOW", "Cut Flow", len(cut_flow_step), 0, len(cut_flow_step)) xaxis = self.histograms['ss/CUT_FLOW'].GetXaxis() self.cut_flow_histo = self.histograms['ss/CUT_FLOW'] @@ -303,14 +274,22 @@ def process(self): # string using a dictionary # key = (sign, obj1, obj2, obj3) cut_region_map = self.build_wh_folder_structure() + region_for_event_list = os.environ.get('EVTLIST_REGION','') + no_histo_fill = ('NO_HISTO_FILL' in os.environ) and eval(os.environ['NO_HISTO_FILL']) + print_region = ('PRINT_REGION' in os.environ) and eval(os.environ['PRINT_REGION']) + debug_mode = ('DEBUG_MODE' in os.environ) and eval(os.environ['DEBUG_MODE']) # Reduce number of self lookups and get the derived functions here histos = self.histograms preselection = self.preselection sign_cut = self.sign_cut + tau_sign_cut = self.tau_sign_cut obj1_id = self.obj1_id obj2_id = self.obj2_id obj3_id = self.obj3_id + obj1_matches_gen = self.obj1_matches_gen + obj2_matches_gen = self.obj2_matches_gen + obj3_matches_gen = self.obj3_matches_gen fill_histos = self.fill_histos anti_wz_cut = self.anti_wz anti_charge_flip_cut = self.anti_charge_flip if hasattr(self,'anti_charge_flip') else None @@ -361,19 +340,27 @@ def process(self): cut_flow_trk.Fill('bare') # Apply basic preselection # - if not cut_flow_trk.disabled: - if row.processID != 26: - continue + #if not cut_flow_trk.disabled: + # if row.processID != 26: + # continue + + #if row.lumi == 2348 and row.evt == 704038: + # print 'preselection', preselection(row, cut_flow_trk, cut_settings['LT'] if lt_tpt_in_presel else 0., cut_settings['tauPT'] if lt_tpt_in_presel else 0.) cut_flow_trk.Fill('WH Event') lt_tpt_in_presel = not bool(cut_settings['tauID']) if not preselection(row, cut_flow_trk, cut_settings['LT'] if lt_tpt_in_presel else 0., cut_settings['tauPT'] if lt_tpt_in_presel else 0.): continue + + if os.environ['megatarget'].startswith('Zjets') and not obj3_matches_gen(row): + continue + # Get the generic event weight event_weight = weight_func(row) # Get the cuts that define the region sign_result = sign_cut(row) + tau_sign_result = tau_sign_cut(row) obj1_id_result = obj1_id(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) obj2_id_result = obj2_id(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) obj3_id_result = obj3_id(row, cut_settings['tauID'], cut_settings['LT'], cut_settings['tauPT']) @@ -384,22 +371,36 @@ def process(self): to_fill = ('',) \ if not anti_charge_flip_cut else \ ('','charge_flip_CR/') if anti_charge_flip else ('charge_flip_CR/',) - - #if not cut_flow_trk.disabled: - if obj1_id_result: - cut_flow_trk.Fill('obj1 IDIso') - if obj2_id_result: - cut_flow_trk.Fill('obj2 IDIso') - if obj3_id_result: - cut_flow_trk.Fill('obj3 IDIso') - if sign_result: - cut_flow_trk.Fill('sign cut') - if anti_wz : - cut_flow_trk.Fill('anti WZ') + + if sign_result: + cut_flow_trk.Fill('sign cut') + if tau_sign_result: + cut_flow_trk.Fill('tau sign') + if anti_wz : + cut_flow_trk.Fill('anti WZ') + if obj1_id_result: + cut_flow_trk.Fill('obj1 IDIso') + if obj2_id_result: + cut_flow_trk.Fill('obj2 IDIso') + if obj3_id_result: + cut_flow_trk.Fill('obj3 IDIso') + if anti_charge_flip: + cut_flow_trk.Fill('anti charge flip') + + + if os.environ['megatarget'].startswith('Zjets'): + #remove matched but not id/Iso leptons + if obj1_matches_gen(row) and not obj1_id_result: + continue + if obj2_matches_gen(row) and not obj2_id_result: + continue # Figure out which folder/region we are in region_result = cut_region_map.get( - (sign_result, obj1_id_result, obj2_id_result, obj3_id_result)) + (sign_result, tau_sign_result, obj1_id_result, obj2_id_result, obj3_id_result)) + + if debug_mode: + set_trace() # Ignore stupid regions we don't care about if region_result is None: @@ -407,7 +408,22 @@ def process(self): if anti_wz: base_folder, weights = region_result + base_folder = joinDirs(*base_folder) + if print_region: + print 'event %i:%i:%i assigned to region(s) %s' % \ + (row.run, row.lumi, row.evt, \ + ', '.join( joinDirs(base_folder,i) for i in to_fill) ) + if region_for_event_list: + if base_folder == region_for_event_list and \ + '' in to_fill: + print '%i:%i:%i' % (row.run, row.lumi, row.evt) + else: + continue + if no_histo_fill: # and region_for_event_list and \ + #base_folder == region_for_event_list: + continue + # Fill the un-fr-weighted histograms for i in to_fill: folder = joinDirs(base_folder,i) @@ -430,32 +446,31 @@ def process(self): if not sign_result and obj1_id_result and obj2_id_result: # Object 1 can only flip if it is OS with the tau obj1_obj3_SS = self.obj1_obj3_SS(row) - if (obj1_obj3_SS and obj1_charge_flip) \ - or ( not obj1_obj3_SS and obj2_charge_flip): #there is the function --> we have to compute it, otherwise skip and save some precious filling time! - charge_flip_prob = obj1_charge_flip(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) \ - if obj1_obj3_SS else \ - obj2_charge_flip(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) - charge_flip_sysu = obj1_charge_flip_sysup(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) \ - if obj1_obj3_SS else \ - obj2_charge_flip_sysup(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) - directory = joinDirs(base_folder,'c1' if obj1_obj3_SS else 'c2') - directory_up = joinDirs(base_folder,'c1_sysup' if obj1_obj3_SS else 'c2_sysup') - charge_flip_prob = charge_flip_prob/(1. - charge_flip_prob) - for i in to_fill: - fill_histos(histos, joinDirs(directory,i), row, event_weight*charge_flip_prob, cut_label) - fill_histos(histos, joinDirs(directory_up,i), row, event_weight*charge_flip_sysu, cut_label) - - elif sign_result and obj1_id_result and obj3_id_result: + for flipfunc, flipfunc_sysup, dirname in [(obj1_charge_flip, obj1_charge_flip_sysup, 'c1'), (obj2_charge_flip, obj2_charge_flip_sysup, 'c2')]: + if flipfunc: + charge_flip_prob = flipfunc(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) + charge_flip_sysu = flipfunc_sysup(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) + directory = joinDirs(base_folder, dirname) + directory_up = joinDirs(base_folder, '%s_sysup' % dirname) + charge_flip_prob = charge_flip_prob/(1. - charge_flip_prob) + for i in to_fill: + fill_histos(histos, joinDirs(directory,i), row, event_weight*charge_flip_prob, cut_label) + fill_histos(histos, joinDirs(directory_up,i), row, event_weight*charge_flip_sysu, cut_label) + + elif sign_result and obj1_id_result and obj3_id_result and tau_sign_result: + if no_histo_fill or region_for_event_list: + continue + # WZ object topology fails. Check if we are in signal region. if self.enhance_wz(row): # Signal region if obj2_id_result: - fill_histos(histos, 'ss/p1p2p3_enhance_wz/', row, event_weight, cut_label) + fill_histos(histos, 'ss/tau_os/p1p2p3_enhance_wz/', row, event_weight, cut_label) else: - fill_histos(histos, 'ss/p1f2p3_enhance_wz/', row, event_weight, cut_label) + fill_histos(histos, 'ss/tau_os/p1f2p3_enhance_wz/', row, event_weight, cut_label) fake_rate_obj2 = self.obj2_weight(row, cut_settings['leading_iso'], cut_settings['subleading_iso']) fake_weight = fake_rate_obj2/(1.-fake_rate_obj2) - fill_histos(histos, 'ss/p1f2p3_enhance_wz/w2/', row, event_weight*fake_weight, cut_label) + fill_histos(histos, 'ss/tau_os/p1f2p3_enhance_wz/w2/', row, event_weight*fake_weight, cut_label) cut_flow_trk.flush() def finish(self): diff --git a/wh/WHPlotterBase.py b/wh/WHPlotterBase.py index 4e29d70b..e591b3d3 100644 --- a/wh/WHPlotterBase.py +++ b/wh/WHPlotterBase.py @@ -19,10 +19,14 @@ from FinalStateAnalysis.PlotTools.MedianView import MedianView from FinalStateAnalysis.PlotTools.ProjectionView import ProjectionView from FinalStateAnalysis.PlotTools.FixedIntegralView import FixedIntegralView +from FinalStateAnalysis.PlotTools.DifferentialView import DifferentialView +from FinalStateAnalysis.PlotTools.SubtractionView import SubtractionView, PositiveView from FinalStateAnalysis.PlotTools.RebinView import RebinView from FinalStateAnalysis.MetaData.data_styles import data_styles, colors from FinalStateAnalysis.PlotTools.decorators import memo from FinalStateAnalysis.MetaData.datacommon import br_w_leptons, br_z_leptons +from FinalStateAnalysis.Utilities.floatformatting import smart_float_format +from pdb import set_trace from optparse import OptionParser import os import ROOT @@ -30,16 +34,27 @@ import math import logging from fnmatch import fnmatch -from yellowhiggs import xs, br, xsbr + +ROOT.gStyle.SetOptTitle(0) +#ROOT.gROOT.SetStyle('Plain') parser = OptionParser(description=__doc__) parser.add_option('--dry-run', action='store_true', dest='dry_run', default = False, help='produces only shape file and minimal histograms') + +parser.add_option('--no-mc-data', action='store_true', dest='no_mc_data', default = False) +parser.add_option('--no-wz', action='store_true', dest='no_wz', default = False) +parser.add_option('--no-signal', action='store_true', dest='no_signal', default = False) +parser.add_option('--no-f3', action='store_true', dest='no_f3', default = False) +parser.add_option('--no-shapes', action='store_true', dest='no_shapes', default = False) + parser.add_option('--prefix', metavar='label', type=str, dest='prefix', default = '', help='prefix to eppend before histogram name o be used to make the shapes' ) parser.add_option('--prefixes', metavar='label', type=str, dest='prefixes', default = '', help='prefix to eppend before histogram name o be used to make the shapes' ) +project_x = lambda x: ProjectionView(x, 'X', [0, 650]) + def get_chi_square(hdata, hexp): chi2 = 0. nbins = 0. @@ -68,6 +83,81 @@ def _f(path): def remove_name_entry(dictionary): return dict( [ i for i in dictionary.iteritems() if i[0] != 'name'] ) +def fake_rate_estimate(histograms): #always, ALWAYS give as 1,2,0 + cat1 = histograms.next() + cat2 = histograms.next() + cat0 = histograms.next() + ret = cat0.Clone() + ret.Reset() + integral = sum( i.Integral() for i in [cat0, cat1, cat2]) + entries = sum( i.GetEntries() for i in [cat0, cat1, cat2]) + weight = integral / float(entries) + + for i in range(ret.GetNbinsX() + 2): + c1 = cat1.GetBinContent(i) + c2 = cat2.GetBinContent(i) + c0 = cat0.GetBinContent(i) + e1 = cat1.GetBinError(i) + e2 = cat2.GetBinError(i) + e0 = cat0.GetBinError(i) + content = c1+c2-c0 + #if content <= 0: + # print "bin [%.1f, %.1f]" % (cat0.GetBinLowEdge(i), cat0.GetBinLowEdge(i)+cat0.GetBinWidth(i)) + # print "content %s c0: %s c1: %s c2: %s" % (content, c0, c1, c2) + if content <= 0 and c0 > 0: + #print "setting content to %s +/- %s" % (c0, e0) + ret.SetBinContent(i,c0) + ret.SetBinError(i,e0) + elif content <= 0: + #print "setting content to 10**-5 +/- %s" % (1.8*weight) + ret.SetBinContent(i,10**-5) + ret.SetBinError(i,1.8*weight) + else: + ret.SetBinContent(i,c1+c2-c0) + ret.SetBinError(i,quad(e1,e2,e0)) + return ret + +def make_empty_bin_remover(weight): + def mc_empty_bin_remover(histogram): + ret = histogram.Clone() + for i in range(ret.GetNbinsX() + 2): + if ret.GetBinContent(i) <= 0: + ret.SetBinContent(i, 0.9200*weight) #MEAN WEIGHT + ret.SetBinError(i, 1.8*weight) + return ret + return mc_empty_bin_remover + +class MultyErrorView(object): #FIXME + '''takes a StackView and adds systematics''' + def __init__(self, stackview, systematics_map): + self.stack_view = stackview + self.systematics_map = systematics_map + + def Get(self, path): + stack_components = self.stack_view.Get(path).GetHists() + stack_sum = sum(stack_components) + + for bin in range(1, stack_sum.GetNbinsX() + 1): + #sys_errors = [ sum(hist.GetBinContent(bin)*value for hist in stack_components if fnmatch(hist.GetTitle(), key)) for key, value in self.systematics_map ] + sys_errors = [] + for key, value in self.systematics_map.iteritems(): + it = 0 + for hist in stack_components: + if fnmatch(hist.GetTitle(), key): + print '%s matches %s' % (hist.GetTitle(), key) + it += hist.GetBinContent(bin)*value + sys_errors.append(it) + + error = quad( stack_sum.GetBinError(bin), *sys_errors ) + stack_sum.SetBinError(bin, error) + + stack_sum.SetMarkerSize(0) + stack_sum.SetFillColor(1) + stack_sum.SetFillStyle(3013) + stack_sum.legendstyle = 'f' + return stack_sum + + class BackgroundErrorView(object): ''' Compute the total background error in each bin. ''' def __init__(self, fakes, wz, zz, charge_fake, wz_error=0.1, zz_error=0.04, @@ -183,7 +273,7 @@ def unsuck(x): class WHPlotterBase(Plotter): def __init__(self, channel, obj1_charge_mapper={}, obj2_charge_mapper={}): cwd = os.getcwd() - os.chdir( os.path.dirname(__file__) ) + #os.chdir( os.path.dirname(__file__) ) self.channel = channel jobid = os.environ['jobid'] print "\nPlotting %s for %s\n" % (channel, jobid) @@ -199,7 +289,7 @@ def __init__(self, channel, obj1_charge_mapper={}, obj2_charge_mapper={}): 'ZZ*', 'VH*', 'WW*', - 'TTplusJets_madgraph', + #'TTplusJets_madgraph', "data_*", ] @@ -223,17 +313,18 @@ def __init__(self, channel, obj1_charge_mapper={}, obj2_charge_mapper={}): self.obj2_charge_mapper=obj2_charge_mapper #maps scaled charge flip histograms to the ones of the normal categories if blind: # Don't look at the SS all pass region - blinder = lambda x: BlindView(x, "ss/p1p2p3/.*") + blinder = lambda x: BlindView(x, "ss/tau_os/p1p2p3/.*") super(WHPlotterBase, self).__init__(files, lumifiles, self.outputdir, blinder) self.defaults = {} #allows to set some options and avoid repeating them each function call - os.chdir( cwd ) + self.mc_samples = filter(lambda x: not x.startswith('data'), samples) + #os.chdir( cwd ) #create a fake wiew summing up all HWW - self.views['VH_hww_sum'] = { - 'unweighted_view' : views.SumView( - *[item['unweighted_view'] for name, item in self.views.iteritems() if fnmatch(name, 'VH_*_HWW*')] - ) - } + #self.views['VH_hww_sum'] = { + # 'unweighted_view' : views.SumView( + # *[item['unweighted_view'] for name, item in self.views.iteritems() if fnmatch(name, 'VH_*_HWW*')] + # ) + #} def set_subdir(self, folder): self.outputdir = '/'.join([self.base_out_dir, folder]) @@ -243,44 +334,91 @@ def apply_to_dict(self, dictionary, viewtype, *args, **kwargs): #project, projec for key, val in dictionary.iteritems(): if isinstance(val, dict): ret[key] = self.apply_to_dict(val, viewtype, *args, **kwargs) #project, project_axis, rebin) + elif val is None: + ret[key] = None else: ret[key] = viewtype(val, *args, **kwargs) # self.rebin_view( ProjectionView(val, project_axis, project), rebin ) return ret - @memo - def make_signal_views(self, unblinded=False, qcd_weight_fraction=0): + def make_additional_fakes_view(self, unblinded=False, rebin=1, + project=None, project_axis=None, tau_charge='tau_os' ): + other_tau_sign = 'tau_os' if tau_charge == 'tau_ss' else 'tau_ss' + def preprocess(view): + ret = view + if project and project_axis: + ret = ProjectionView(ret, project_axis, project) + return RebinView( ret, rebin ) + + zjets_view = preprocess( self.get_view('Zjets*') ) + all_data_view = preprocess( self.get_view('data') ) + zjets_fakes = views.SumView( + views.SubdirectoryView( zjets_view, 'ss/%s/f1p2p3/w1/' % tau_charge ), + views.SubdirectoryView( zjets_view, 'ss/%s/p1f2p3/w2/' % tau_charge ) + #,views.SubdirectoryView( zjets_view, 'ss/%s/f1f2p3/w12/' % tau_charge ) #FIXME: check that effect is small + ) + tau_fakes = views.SubdirectoryView(all_data_view, 'ss/%s/p1p2f3/w3/' % tau_charge) + full_fakes = views.SumView(tau_fakes, zjets_fakes) + + return { + 'fakes' : full_fakes, + 'zjet_fakes' : zjets_fakes, + 'tau_fakes' : tau_fakes, + } + + def make_signal_views(self, unblinded=False, qcd_weight_fraction=0, #MARK + rebin=1, project=None, project_axis=None, tau_charge='tau_os' ): ''' Make signal views with FR background estimation ''' + other_tau_sign = 'tau_os' if tau_charge == 'tau_ss' else 'tau_ss' + def preprocess(view): + ret = view + if project and project_axis: + ret = ProjectionView(ret, project_axis, project) + return RebinView( ret, rebin ) + + all_wz_view_tautau = preprocess( self.get_view('WZJetsTo3LNu*ZToTauTau*') ) wz_view_tautau = views.SubdirectoryView( - self.get_view('WZJetsTo3LNu*ZToTauTau*'), - 'ss/p1p2p3/' + all_wz_view_tautau, + 'ss/%s/p1p2p3/' % tau_charge ) + + tomatch = 'WZJetsTo3LNu' if self.sqrts == 7 else 'WZJetsTo3LNu_pythia' + all_wz_view_3l = preprocess( self.get_view(tomatch) ) wz_view_3l = views.SubdirectoryView( - self.get_view('WZJetsTo3LNu_pythia'), - 'ss/p1p2p3/' + all_wz_view_3l, + 'ss/%s/p1p2p3/' % tau_charge ) - zz_view = views.SubdirectoryView( - self.get_view('ZZJetsTo4L*'), - 'ss/p1p2p3/' + all_wz_view = views.SumView(all_wz_view_tautau, all_wz_view_3l) + + zz_view = preprocess( + views.SubdirectoryView( + self.get_view('ZZJetsTo4L*'), + 'ss/%s/p1p2p3/' % tau_charge + ) ) - all_data_view = self.get_view('data') - if unblinded: - all_data_view = self.get_view('data', 'unblinded_view') - data_view = views.SubdirectoryView(all_data_view, 'ss/p1p2p3/') + all_data_view = self.get_view('data') + #if unblinded: + # all_data_view = self.get_view('data', 'unblinded_view') + all_data_view = preprocess(all_data_view) + + data_view = views.SubdirectoryView(all_data_view, 'ss/%s/p1p2p3/' % tau_charge) def make_fakes(qcd_fraction): def make_fakes_view(weight_type, scale): - scaled_data = views.ScaleView(all_data_view, scale) + scaled_bare_data = views.ScaleView(all_data_view, scale) + scaled_wz_data = views.ScaleView(all_wz_view, scale) + scaled_data = SubtractionView(scaled_bare_data, scaled_wz_data, restrict_positive=True) + # View of weighted obj1-fails data obj1_view = views.SubdirectoryView( - scaled_data, 'ss/f1p2p3/%s1' % weight_type) + scaled_data, 'ss/%s/f1p2p3/%s1' % (tau_charge, weight_type)) # View of weighted obj2-fails data obj2_view = views.SubdirectoryView( - scaled_data, 'ss/p1f2p3/%s2' % weight_type) + scaled_data, 'ss/%s/p1f2p3/%s2' % (tau_charge, weight_type)) # View of weighted obj1&2-fails data obj12_view = views.SubdirectoryView( - scaled_data, 'ss/f1f2p3/%s12' % weight_type) + scaled_data, 'ss/%s/f1f2p3/%s12' % (tau_charge, weight_type)) # Give the individual object views nice colors obj1_view = views.TitleView( @@ -293,20 +431,18 @@ def make_fakes_view(weight_type, scale): views.StyleView(obj12_view, **remove_name_entry(data_styles['WW*'])), 'Reducible bkg. 12') - subtract_obj12_view = views.ScaleView(obj12_view, -1) - return obj1_view, obj2_view, obj12_view, subtract_obj12_view + return obj1_view, obj2_view, obj12_view - qcd1, qcd2, qcd12, negqcd12 = make_fakes_view('q', qcd_fraction) - wjet1, wjet2, wjet12, negwjet12 = make_fakes_view( + qcd1, qcd2, qcd12 = make_fakes_view('q', qcd_fraction) + wjet1, wjet2, wjet12 = make_fakes_view( 'w', 1 - qcd_fraction) obj1_view = views.SumView(qcd1, wjet1) obj2_view = views.SumView(qcd2, wjet2) obj12_view = views.SumView(qcd12, wjet12) - subtract_obj12_view = views.SumView(negqcd12, negwjet12) # Corrected fake view - fakes_view = views.SumView(obj1_view, obj2_view, subtract_obj12_view) + fakes_view = views.MultiFunctorView(fake_rate_estimate, obj1_view, obj2_view, obj12_view) fakes_view = views.TitleView( views.StyleView(fakes_view, **remove_name_entry(data_styles['Zjets*'])), 'Reducible bkg.') return obj1_view, obj2_view, obj12_view, fakes_view @@ -320,11 +456,11 @@ def make_fakes_view(weight_type, scale): views.StyleView( views.SumView( views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2p3/c1'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2p3/c1' % other_tau_sign), #FIXME: needs to be fixed for charge 3 region create_mapper(self.obj1_charge_mapper) ), views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2p3/c2'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2p3/c2' % tau_charge), create_mapper(self.obj2_charge_mapper) ), ), @@ -335,11 +471,11 @@ def make_fakes_view(weight_type, scale): views.StyleView( views.SumView( views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2p3/c1_sysup'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2p3/c1_sysup' % other_tau_sign), create_mapper(self.obj1_charge_mapper) ), views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2p3/c2_sysup'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2p3/c2_sysup' % tau_charge), create_mapper(self.obj2_charge_mapper) ), ), @@ -370,20 +506,36 @@ def make_fakes_view(weight_type, scale): # Add signal data_total_lumi = self.views['data']['intlumi'] - for mass in range(110, 165, 5): - vh_view = views.SubdirectoryView( - self.get_view('VH_*%i' % mass), - 'ss/p1p2p3/' - ) - output['vh%i' % mass] = vh_view + for mass in range(90, 165, 5): + try: + vh_base_name = 'VH_%s' % mass if self.sqrts == 7 else 'VH_H2Tau_M-%s' % mass + vh_base_name = 'VHtautau_lepdecay_%s' % mass \ + if 'VHtautau_lepdecay_%s' % mass in self.views else \ + vh_base_name + #print 'using %s' % vh_base_name + vh_base_view = self.views[vh_base_name]['view'] + + vh_view = views.SubdirectoryView( + vh_base_view, #self.get_view('VH_*%i' % mass), + 'ss/%s/p1p2p3/' % tau_charge + ) + output['vh%i' % mass] = preprocess(vh_view) + except KeyError: + #logging.warning('No sample found matching VH_*%i' % mass) + continue + if mass % 10 == 0 and mass < 150: # Only have 10 GeV steps for WW - ww_view = views.SubdirectoryView( - self.get_view('VH_%i_HWW*' % mass), - 'ss/p1p2p3/' - ) - output['vh%i_hww' % mass] = ww_view - output['signal%i' % mass] = views.SumView(ww_view, vh_view) + try: + ww_view = views.SubdirectoryView( + self.get_view('VH_%i_HWW*' % mass), + 'ss/%s/p1p2p3/' % tau_charge + ) + output['vh%i_hww' % mass] = preprocess(ww_view) + except KeyError: + #logging.warning('No sample found matching VH_%i_HWW*' % mass) + continue + #output['signal%i' % mass] = views.SumView(ww_view, vh_view) if ww_view else vh_view return output @@ -396,12 +548,12 @@ def make_qcd_proj_views(self, control_region, rebin): mapping = { 1: { - 'obs': 'ss/f1p2p3', - 'qcd': 'ss/f1f2f3/w23', + 'obs': 'ss/tau_os/f1p2p3', + 'qcd': 'ss/tau_os/f1f2f3/w23', }, 2: { - 'obs': 'ss/p1f2p3', - 'qcd': 'ss/f1f2f3/w13', + 'obs': 'ss/tau_os/p1f2p3', + 'qcd': 'ss/tau_os/f1f2f3/w13', }, } @@ -420,36 +572,47 @@ def make_qcd_proj_views(self, control_region, rebin): @memo def make_obj3_fail_cr_views(self, qcd_correction=False, - qcd_weight_fraction=0): + qcd_weight_fraction=0, tau_charge='tau_os'): ''' Make views when obj3 fails, estimating the bkg in obj1 pass using f1p2f3 ''' + other_tau_sign = 'tau_os' if tau_charge == 'tau_ss' else 'tau_ss' + + all_wz_ztt_view = self.get_view('WZJetsTo3LNu*ZToTauTau*') wz_view = views.SubdirectoryView( - self.get_view('WZJetsTo3LNu*ZToTauTau*'), - 'ss/p1p2f3/' + all_wz_ztt_view, + 'ss/%s/p1p2f3/' % tau_charge ) + + tomatch = 'WZJetsTo3LNu' if self.sqrts == 7 else 'WZJetsTo3LNu_pythia' + all_wz_3l_view = self.get_view(tomatch) wz_view_3l = views.SubdirectoryView( - self.get_view('WZJetsTo3LNu_pythia'), - 'ss/p1p2f3/' + all_wz_3l_view, + 'ss/%s/p1p2f3/' % tau_charge ) + + all_wz_view = views.SumView(all_wz_ztt_view, all_wz_3l_view) + zz_view = views.SubdirectoryView( self.get_view('ZZJetsTo4L*'), - 'ss/p1p2f3/' + 'ss/%s/p1p2f3/' % tau_charge ) all_data_view = self.get_view('data') - data_view = views.SubdirectoryView(all_data_view, 'ss/p1p2f3/') + data_view = views.SubdirectoryView(all_data_view, 'ss/%s/p1p2f3/' % tau_charge) def make_fakes(qcd_fraction): def make_fakes_view(weight_type, scale): - scaled_data = views.ScaleView(all_data_view, scale) + scaled_bare_data = views.ScaleView(all_data_view, scale) + scaled_wz_data = views.ScaleView(all_wz_view, scale) + scaled_data = SubtractionView(scaled_bare_data, scaled_wz_data, restrict_positive=True) # View of weighted obj1-fails data obj1_view = views.SubdirectoryView( - scaled_data, 'ss/f1p2f3/%s1' % weight_type) + scaled_data, 'ss/%s/f1p2f3/%s1' % (tau_charge, weight_type)) # View of weighted obj2-fails data obj2_view = views.SubdirectoryView( - scaled_data, 'ss/p1f2f3/%s2' % weight_type) + scaled_data, 'ss/%s/p1f2f3/%s2' % (tau_charge, weight_type)) # View of weighted obj1&2-fails data obj12_view = views.SubdirectoryView( - scaled_data, 'ss/f1f2f3/%s12' % weight_type) + scaled_data, 'ss/%s/f1f2f3/%s12' % (tau_charge, weight_type)) # Give the individual object views nice colors obj1_view = views.TitleView( @@ -486,15 +649,15 @@ def make_fakes_view(weight_type, scale): fakes_view_1 = make_fakes(1)[-1] style_dict_no_name = remove_name_entry(data_styles['TT*']) - charge_fakes = views.TitleView( + charge_fakes = views.TitleView( #FIXME views.StyleView( views.SumView( views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2f3/c1'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2f3/c1' % other_tau_sign), create_mapper(self.obj1_charge_mapper) ), views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2f3/c2'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2f3/c2' % tau_charge), create_mapper(self.obj2_charge_mapper) ), ), @@ -505,11 +668,11 @@ def make_fakes_view(weight_type, scale): views.StyleView( views.SumView( views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2f3/c1_sysup'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2f3/c1_sysup' % other_tau_sign), create_mapper(self.obj1_charge_mapper) ), views.PathModifierView( - views.SubdirectoryView(all_data_view, 'os/p1p2f3/c2_sysup'), + views.SubdirectoryView(all_data_view, 'os/%s/p1p2f3/c2_sysup' % tau_charge), create_mapper(self.obj2_charge_mapper) ), ), @@ -542,110 +705,148 @@ def make_fakes_view(weight_type, scale): mass = 120 vh_view = views.SubdirectoryView( self.get_view('VH_*%i' % mass), - 'ss/p1p2f3/' + 'ss/tau_os/p1p2f3/' ) output['vh%i' % mass] = vh_view - ww_view = views.SubdirectoryView( - self.get_view('VH_%i_HWW*' % mass), - 'ss/p1p2f3/' - ) + try: + ww_view = views.SubdirectoryView( + self.get_view('VH_%i_HWW*' % mass), + 'ss/tau_os/p1p2f3/' + ) + except KeyError: + #logging.warning('No sample found matching VH_%i_HWW*' % mass) + ww_view = None output['vh%i_hww' % mass] = ww_view - output['signal%i' % mass] = views.SumView(ww_view, vh_view) + output['signal%i' % mass] = views.SumView(ww_view, vh_view) if ww_view else vh_view return output - def make_wz_cr_views(self, rebin): + def make_wz_cr_views(self, rebin=1, project=None, project_axis=None): ''' Make WZ control region views with FR background estimation ''' - wz_view = views.SubdirectoryView( - self.rebin_view(self.get_view('WZJetsTo3LNu*'), rebin), - 'ss/p1p2p3_enhance_wz/' - ) - zz_view = views.SubdirectoryView( - self.rebin_view(self.get_view('ZZJetsTo4L*'), rebin), - 'ss/p1p2p3_enhance_wz/' - ) - all_data_view = self.rebin_view(self.get_view('data'), rebin) + def preprocess(view): + ret = view + if project and project_axis: + ret = ProjectionView(ret, project_axis, project) + return RebinView( ret, rebin ) + + wz_view_tautau_all = preprocess( self.get_view('WZJetsTo3LNu*ZToTauTau*') ) + wz_view_tautau = views.SubdirectoryView(wz_view_tautau_all, 'ss/tau_os/p1p2p3_enhance_wz/') + + tomatch = 'WZJetsTo3LNu' if self.sqrts == 7 else 'WZJetsTo3LNu_pythia' + wz_view_3l_all = preprocess( self.get_view(tomatch) ) + wz_view_3l = views.SubdirectoryView(wz_view_3l_all, 'ss/tau_os/p1p2p3_enhance_wz/') + wz_view_all = views.SumView(wz_view_tautau_all, wz_view_3l_all) + + zz_view_all = preprocess( self.get_view('ZZJetsTo4L*') ) + zz_view = views.SubdirectoryView(zz_view_all, 'ss/tau_os/p1p2p3_enhance_wz/') + + all_data_view = preprocess( self.get_view('data') ) data_view = views.SubdirectoryView( - all_data_view, 'ss/p1p2p3_enhance_wz/') + all_data_view, 'ss/tau_os/p1p2p3_enhance_wz/') # View of weighted obj2-fails data fakes_view = views.SubdirectoryView( - all_data_view, 'ss/p1f2p3_enhance_wz/w2') + all_data_view, 'ss/tau_os/p1f2p3_enhance_wz/w2') fakes_view = views.StyleView(fakes_view, **remove_name_entry(data_styles['Zjets*'])) # Correct - wz_in_fakes_view = views.SubdirectoryView( - self.rebin_view(self.get_view('WZJetsTo3LNu*'), rebin), - 'ss/p1f2p3_enhance_wz/w2' - ) - zz_in_fakes_view = views.SubdirectoryView( - self.rebin_view(self.get_view('ZZJetsTo4L*'), rebin), - 'ss/p1f2p3_enhance_wz/w2' - ) + wz_in_fakes_view = views.SubdirectoryView(wz_view_all, 'ss/tau_os/p1f2p3_enhance_wz/w2') + zz_in_fakes_view = views.SubdirectoryView(zz_view_all, 'ss/tau_os/p1f2p3_enhance_wz/w2') diboson_view = views.SumView(wz_in_fakes_view, zz_in_fakes_view) inverted_diboson_view = views.ScaleView(diboson_view, -1) fakes_view = views.SumView(fakes_view, inverted_diboson_view) - fakes_view = views.TitleView(fakes_view, 'Reducible bkg.') output = { - 'wz': wz_view, - 'zz': zz_view, - 'data': data_view, - 'fakes': fakes_view + 'wz_ztt': wz_view_tautau, + 'wz_3l' : wz_view_3l, + 'zz' : zz_view, + 'data' : data_view, + 'fakes' : fakes_view } - - # Add signal - for mass in [110, 120, 130, 140]: - vh_view = views.SubdirectoryView( - self.rebin_view(self.get_view('VH_*%i' % mass, 'unweighted_view'), rebin), - 'ss/p1p2p3/' - ) - output['vh%i' % mass] = vh_view - return output + # Add signal + #for mass in [110, 120, 130, 140]: + # vh_view = views.SubdirectoryView( + # self.rebin_view(self.get_view('VH_*%i' % mass, 'unweighted_view'), rebin), + # 'ss/tau_os/p1p2p3/' + # ) + # output['vh%i' % mass] = vh_view + # + #return output def write_shapes(self, variable, rebin, outdir, - qcd_fraction=0, show_charge_fakes=False, - project=None, project_axis=None): + qcd_fraction=0., #[1., 0., -1.], + show_charge_fakes=False, + project=None, project_axis=None, different_fakes=False): ''' Write final shapes for [variable] into a TDirectory [outputdir] ''' show_charge_fakes = show_charge_fakes if 'show_charge_fakes' not in self.defaults else self.defaults['show_charge_fakes'] sig_view = self.make_signal_views(unblinded=(not self.blind), - qcd_weight_fraction=qcd_fraction) - - if project and project_axis: - sig_view = self.apply_to_dict( sig_view, ProjectionView, project_axis, project ) - sig_view = self.apply_to_dict( sig_view, RebinView, rebin ) + qcd_weight_fraction=qcd_fraction, + rebin=rebin, project=project, project_axis=project_axis) + different_fakes_views = self.make_additional_fakes_view( unblinded=(not self.blind), rebin=rebin, + project=project, project_axis=project_axis) + + outdir.cd() - wz = views.SumView(sig_view['wz'], sig_view['wz_3l']).Get(variable) - zz = sig_view['zz'].Get(variable) + wz_weight = self.get_view('WZJetsTo3LNu*ZToTauTau*', 'weight') + zz_weight = self.get_view('ZZJetsTo4L*', 'weight') + print "wz_weight: %s" % wz_weight + print "zz_weight: %s" % zz_weight + + wz = views.FunctorView( views.SumView(sig_view['wz'], sig_view['wz_3l']), make_empty_bin_remover(wz_weight)).Get(variable) + zz = views.FunctorView( sig_view['zz'], make_empty_bin_remover(zz_weight)).Get(variable) obs = sig_view['data'].Get(variable) - fakes = sig_view['fakes'].Get(variable) + fakes = sig_view['fakes'].Get(variable) if not different_fakes else different_fakes_views['fakes'].Get(variable) + + fakes_down = different_fakes_views['fakes'].Get(variable) + fakes_up = PositiveView( + views.SumView( views.ScaleView(sig_view['fakes'], 2.), + views.ScaleView(different_fakes_views['fakes'], -1.) + ) + ).Get(variable) wz.SetName('wz') zz.SetName('zz') obs.SetName('data_obs') fakes.SetName('fakes') - + fakes_down.SetName('fakes_CMS_vhtt_%s_fakeshape_%sTeVDown' % (outdir.GetName(), self.sqrts)) + fakes_up.SetName('fakes_CMS_vhtt_%s_fakeshape_%sTeVUp' % (outdir.GetName(), self.sqrts)) #for mass in [110, 115, 120, 125, 130, 135, 140]: - for mass in range(110, 165, 5): - vh = sig_view['vh%i' % mass].Get(variable) - vh.SetName('WH%i' % mass) - vh.Write() + #set_trace() + for mass in range(90, 165, 5): + try: + vh = None + if mass == 90 and self.sqrts == 8: + vh = views.ScaleView(sig_view['vh100'], 1.3719).Get(variable) + elif mass == 95 and self.sqrts == 8: + vh = views.ScaleView(sig_view['vh100'], 1.1717).Get(variable) + else: + vh = sig_view['vh%i' % mass].Get(variable) + vh.SetName('WH%i' % mass) + vh.SetLineColor(0) + vh.Write() + except KeyError: + #logging.warning('No sample found matching VH_*%i' % mass) + continue + if mass % 10 == 0 and mass < 150: # Only have 10 GeV steps for WW - ww = sig_view['vh%i_hww' % mass].Get(variable) - ww.SetName('WH_hww%i' % mass) - ww.Write() + if 'vh%i_hww' % mass in sig_view: + ww = sig_view['vh%i_hww' % mass].Get(variable) + ww.SetName('WH_hww%i' % mass) + ww.Write() wz.Write() zz.Write() obs.Write() fakes.Write() + fakes_down.Write() + fakes_up.Write() #charge_fakes_CMS_vhtt_emt_chargeFlip_8TeVUpx if show_charge_fakes: logging.info('adding charge fakes shape errors') @@ -700,9 +901,10 @@ def write_f3_shapes(self, variable, rebin, outdir, vh.SetName('WH%i' % mass) vh.Write() # Only have 10 GeV steps for WW - ww = sig_view['vh%i_hww' % mass].Get(variable) - ww.SetName('WH_hww%i' % mass) - ww.Write() + if sig_view['vh%i_hww' % mass]: + ww = sig_view['vh%i_hww' % mass].Get(variable) + ww.SetName('WH_hww125') + ww.Write() #charge_fakes_CMS_vhtt_emt_chargeFlip_8TeVUpx if show_charge_fakes: @@ -719,20 +921,22 @@ def write_f3_shapes(self, variable, rebin, outdir, def plot_final(self, variable, rebin=1, xaxis='', maxy=24, show_error=False, qcd_correction=False, stack_higgs=True, - qcd_weight_fraction=0.5, x_range=None, show_charge_fakes=False, - leftside_legend=False, higgs_xsec_multiplier=5, project=None, - project_axis=None, **kwargs): + qcd_weight_fraction=0., x_range=None, show_charge_fakes=False, + leftside_legend=False, higgs_xsec_multiplier=1, project=None, + project_axis=None, differential=False, yaxis='Events', tau_charge='tau_os', **kwargs): ''' Plot the final output - with bkg. estimation ''' show_charge_fakes = show_charge_fakes if 'show_charge_fakes' not in self.defaults else self.defaults['show_charge_fakes'] sig_view = self.make_signal_views(unblinded=(not self.blind), - qcd_weight_fraction=qcd_weight_fraction) - if project and project_axis: - sig_view = self.apply_to_dict( sig_view, ProjectionView, project_axis, project ) - sig_view = self.apply_to_dict( sig_view, RebinView, rebin ) #Rebin + qcd_weight_fraction=qcd_weight_fraction, + rebin=rebin, project=project, + project_axis=project_axis, tau_charge=tau_charge) + + if differential: + sig_view = self.apply_to_dict(sig_view, DifferentialView) vh_10x = views.TitleView( views.StyleView( - views.ScaleView(sig_view['signal120'], higgs_xsec_multiplier), + views.ScaleView(sig_view['vh125'], higgs_xsec_multiplier), **remove_name_entry(data_styles['VH*']) ), "(%i#times) m_{H} = 125" % higgs_xsec_multiplier @@ -740,48 +944,53 @@ def plot_final(self, variable, rebin=1, xaxis='', maxy=24, charge_fakes_view = MedianView(highv=sig_view['charge_fakes']['sys_up'], centv=sig_view['charge_fakes']['central']) # Fudge factor to go from 120->125 - change in xsec*BR - vh_10x = views.ScaleView(vh_10x, .783) + #vh_10x = views.ScaleView(vh_10x), .783) tostack = [sig_view['wz_3l'], sig_view['zz'], sig_view['wz'], sig_view['fakes'], vh_10x] if stack_higgs else \ [sig_view['wz_3l'], sig_view['zz'], sig_view['wz'], sig_view['fakes']] if show_charge_fakes: tostack = tostack[:2]+[charge_fakes_view]+tostack[2:] + + vh_hww = views.ScaleView(sig_view['vh120_hww'], .783) if 'vh120_hww' in sig_view else None + if vh_hww: + tostack = tostack[:-1] + [vh_hww] + tostack[-1:] + stack = views.StackView( *tostack ) histo = stack.Get(variable) histo.Draw() histo.GetHistogram().GetXaxis().SetTitle(xaxis) + histo.GetHistogram().GetYaxis().SetTitle(yaxis) + if x_range: histo.GetHistogram().GetXaxis().SetRangeUser(x_range[0], x_range[1]) - if isinstance(maxy, (int, long, float)): - #print "setting maxy to %s" % maxy - histo.SetMaximum(maxy) - self.canvas.Update() - else: - histo.SetMaximum(sum(histo.GetHists()).GetMaximum()*1.2) self.keep.append(histo) # Add legend - legend = self.add_legend(histo, leftside=leftside_legend, entries=4) - + entries = len(tostack)+1 if show_error: - correct_qcd_view = None - if qcd_weight_fraction == 0: - fakes05 = sig_view['weighted_fakes'][0.5] - correct_qcd_view = MedianView(highv=fakes05, centv=sig_view['fakes']) - - elif qcd_weight_fraction == 0.5: - fakes1 = sig_view['weighted_fakes'][1.] - correct_qcd_view = MedianView(highv=fakes1, centv=sig_view['fakes']) + entries += 1 + legend = self.add_legend(histo, leftside=leftside_legend, entries=entries) - elif qcd_weight_fraction == 1: - fakes05 = sig_view['weighted_fakes'][0.5] - correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes']) + if show_error: + #correct_qcd_view = None + #if qcd_weight_fraction == 0: + # fakes05 = sig_view['weighted_fakes'][1.] + # correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes']) + # + #elif qcd_weight_fraction == 0.5: + # fakes1 = sig_view['weighted_fakes'][1.] + # correct_qcd_view = MedianView(highv=fakes1, centv=sig_view['fakes']) + # + #elif qcd_weight_fraction == 1: + # fakes05 = sig_view['weighted_fakes'][0.5] + # correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes']) bkg_error_view = BackgroundErrorView( - correct_qcd_view, #sig_view['fakes'], + sig_view['fakes'], #correct_qcd_view, #sig_view['fakes'], views.SumView( sig_view['wz'], sig_view['wz_3l']), sig_view['zz'], charge_fakes_view, + fake_error=0.3, **kwargs ) bkg_error = bkg_error_view.Get(variable) @@ -790,29 +999,40 @@ def plot_final(self, variable, rebin=1, xaxis='', maxy=24, legend.AddEntry(bkg_error) # Use poisson error bars on the data - sig_view['data'] = PoissonView(sig_view['data'], x_err=False) + sig_view['data'] = PoissonView(sig_view['data'], x_err=False, is_scaled=differential) #PoissonView(, x_err=False) data = sig_view['data'].Get(variable) - if not self.blind: + ymax = histo.GetMaximum() + if not self.blind or tau_charge != 'tau_os': + #print "drawing", data.Integral() data.Draw('pe,same') + legend.AddEntry(data) + ymax = max(ymax, data.GetMaximum()) self.keep.append(data) + if isinstance(maxy, (int, long, float)): + #print "setting maxy to %s" % maxy + histo.SetMaximum(maxy) + self.canvas.Update() + else: + histo.SetMaximum(ymax*1.2) + if not stack_higgs: higgs_plot = vh_10x.Get(variable) higgs_plot.Draw('same') self.keep.append(higgs_plot) - #legend.AddEntry(data) legend.Draw() - def plot_final_wz(self, variable, rebin=1, xaxis='', maxy=None): + def plot_final_wz(self, variable, rebin=1, xaxis='', maxy=None, project=None, project_axis=None): ''' Plot the final WZ control region - with bkg. estimation ''' - sig_view = self.make_wz_cr_views(rebin) - + sig_view = self.make_wz_cr_views(rebin, project, project_axis) + stack = views.StackView( - sig_view['fakes'], - sig_view['wz'], + sig_view['wz_ztt'], sig_view['zz'], + sig_view['fakes'], + sig_view['wz_3l'] ) histo = stack.Get(variable) histo.Draw() @@ -827,20 +1047,24 @@ def plot_final_wz(self, variable, rebin=1, xaxis='', maxy=None): self.keep.append(histo) # Add legend - self.add_legend(histo, leftside=False, entries=4) + self.add_legend(histo, leftside=False, entries=len(histo)) def plot_final_f3(self, variable, rebin=1, xaxis='', maxy=None, show_error=True, qcd_correction=False, - qcd_weight_fraction=0.5, x_range=None, #): + qcd_weight_fraction=0., x_range=None, #): show_chi2=False,project=None, - project_axis=None, **kwargs): + project_axis=None, differential=False, + yaxis='Events', tau_charge='tau_os', show_ratio=False, + ratio_range=None, fit=None, **kwargs): ''' Plot the final F3 control region - with bkg. estimation ''' - + show_chi2 = False #broken sig_view = self.make_obj3_fail_cr_views( - qcd_correction, qcd_weight_fraction) + qcd_correction, qcd_weight_fraction, tau_charge) if project and project_axis: sig_view = self.apply_to_dict( sig_view, ProjectionView, project_axis, project ) sig_view = self.apply_to_dict( sig_view, RebinView, rebin ) #Rebin + if differential: + sig_view = self.apply_to_dict(sig_view, DifferentialView) charge_fakes_view = MedianView(highv=sig_view['charge_fakes']['sys_up'], centv=sig_view['charge_fakes']['central']) @@ -854,6 +1078,8 @@ def plot_final_f3(self, variable, rebin=1, xaxis='', maxy=None, histo = stack.Get(variable) histo.Draw() histo.GetHistogram().GetXaxis().SetTitle(xaxis) + histo.GetHistogram().GetYaxis().SetTitle(yaxis) + if x_range: histo.GetHistogram().GetXaxis().SetRangeUser(x_range[0], x_range[1]) @@ -861,38 +1087,40 @@ def plot_final_f3(self, variable, rebin=1, xaxis='', maxy=None, # Add legend legend = self.add_legend(histo, leftside=False, entries=4) - latex = ROOT.TLatex(0.01, 0.9, "") - pad = ROOT.TPad('da','fuq',0.1,0.8,0.5,0.9) - self.canvas.cd() - latexit = '' + #latex = ROOT.TLatex(0.01, 0.9, "") + #pad = ROOT.TPad('da','fuq',0.1,0.8,0.5,0.9) + #self.canvas.cd() + #latexit = '' + bkg_error = None if show_error: - correct_qcd_view = None - if qcd_weight_fraction == 0: - fakes05 = sig_view['weighted_fakes'][0.5] - correct_qcd_view = MedianView(highv=fakes05, centv=sig_view['fakes']) - - elif qcd_weight_fraction == 0.5: - fakes1 = sig_view['weighted_fakes'][1.] - correct_qcd_view = MedianView(highv=fakes1, centv=sig_view['fakes']) - - elif qcd_weight_fraction == 1: - fakes05 = sig_view['weighted_fakes'][0.5] - correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes']) + #correct_qcd_view = None + #if qcd_weight_fraction == 0: + # fakes05 = sig_view['weighted_fakes'][1.] + # correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes']) + # + #elif qcd_weight_fraction == 0.5: + # fakes1 = sig_view['weighted_fakes'][1.] + # correct_qcd_view = MedianView(highv=fakes1, centv=sig_view['fakes']) + # + #elif qcd_weight_fraction == 1: + # fakes05 = sig_view['weighted_fakes'][0.5] + # correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes']) bkg_error_view = BackgroundErrorView( - correct_qcd_view, #sig_view['fakes'], + sig_view['fakes'], #correct_qcd_view, views.SumView(sig_view['wz'], sig_view['wz_3l']), sig_view['zz'], charge_fakes_view, + fake_error=0.3, **kwargs ) bkg_error = bkg_error_view.Get(variable) self.keep.append(bkg_error) bkg_error.Draw('pe2,same') legend.AddEntry(bkg_error) - if show_chi2: - chival = get_chi_square(data, bkg_error) - latexit = '#chi^{2}/#bins = %.2f / %i' % chival + #if show_chi2: + # chival = get_chi_square(data, bkg_error) + # latexit = '#chi^{2}/#bins = %.2f / %i' % chival data.Draw('same') if isinstance(maxy, (int, long, float)): @@ -903,15 +1131,30 @@ def plot_final_f3(self, variable, rebin=1, xaxis='', maxy=None, histo.SetMaximum(2 * max(data.GetMaximum(), histo.GetMaximum())) self.keep.append(data) self.keep.append(histo) - if latexit: - pad.cd() - latex.DrawLatex(0.01, 0.01, latexit) - self.canvas.cd() - pad.Draw() - self.keep.append(latex) - self.keep.append(pad) - #legend.AddEntry(data) legend.Draw() + if show_ratio: + ratio_plot = self.add_ratio_plot(data, bkg_error, x_range, ratio_range=ratio_range) + if fit: + #set_trace() + fitrange = fit.get('range', False) + if not fitrange: + nbins = ratio_plot.GetNbinsX() + fitrange = x_range if x_range else [ ratio_plot.GetBinLowEdge(1), + ratio_plot.GetBinLowEdge(nbins)+ratio_plot.GetBinWidth(nbins)] + self.lower_pad.cd() + function = self.fit_shape(ratio_plot, fit['model'], fitrange, fit.get('options','IRMENS')) + toprint = '#chi^{2} / DoF = %.2f / %i\n' % (function.GetChisquare() , function.GetNDF()) + for i in range(function.GetNpar()): + name = function.GetParName(i) + value = function.GetParameter(i) + error = function.GetParError(i) + toprint += '%s = %s\n' % (name, smart_float_format((value, error))) #%f #pm %f + + stat_box = self.make_text_box(toprint[:-1],fit.get('stat position','bottom-left')) + stat_box.Draw() + self.keep.append(stat_box) + #print toprint + self.pad.cd() def plot_final_f3_split(self, variable, rebin=1, xaxis='', maxy=None): ''' Plot the final F3 control region - with bkg. estimation ''' diff --git a/wh/WHPlotterEET.py b/wh/WHPlotterEET.py index 87a25111..6a37348d 100755 --- a/wh/WHPlotterEET.py +++ b/wh/WHPlotterEET.py @@ -12,7 +12,7 @@ import ROOT import sys import WHPlotterBase -from WHPlotterBase import make_styler, remove_name_entry, parser +from WHPlotterBase import make_styler, remove_name_entry, parser, project_x import rootpy.plotting.views as views from FinalStateAnalysis.MetaData.data_styles import data_styles, colors #from pudb import set_trace; set_trace() @@ -33,6 +33,14 @@ def __init__(self): super(WHPlotterEET, self).__init__('EET', obj1_charge_mapper, obj2_charge_mapper) +rebin_slim = range(20, 81, 10)+[100, 130, 300] +categories = { + 'LTCut' : [80, 650], + 'LTLow' : [0, 100], + 'LTHigh': [100, 650], + 'Full' : [0, 650], +} + if __name__ == "__main__": plotter = WHPlotterEET() sqrts = plotter.sqrts @@ -40,406 +48,420 @@ def __init__(self): options,NOTUSED = parser.parse_args() if not options.dry_run: - ########################################################################### - ## Zmm control plots ##################################################### - ########################################################################### - plotter.set_subdir('mc_data') - ## # Control Z->mumu + jet region - ## plotter.plot_mc_vs_data('os/p1p2f3', 'e1_e2_Mass', xaxis='m_{ee} (GeV)', xrange=(60, 120)) - ## plotter.add_cms_blurb(sqrts) - ## plotter.save('mcdata-os-p1p2f3-e1e2Mass') - - ## plotter.plot_mc_vs_data('os/p1p2f3/w3', 'e1_e2_Mass') - ## plotter.save('mcdata-os-p1p2f3-w3-e1e2Mass') - - ## plotter.plot_mc_vs_data('os/p1f2p3', 'e1_e2_Mass', xaxis='m_{ee} (GeV)', xrange=(60, 120)) - ## plotter.add_cms_blurb(sqrts) - ## plotter.save('mcdata-os-p1f2p3-e1e2Mass') - - ## # Check PU variables - ## plotter.plot_mc_vs_data('os/p1p2f3', 'rho') - ## plotter.save('mcdata-os-p1p2f3-rho') - - ## plotter.plot_mc_vs_data('os/p1p2f3', 'nvtx') - ## plotter.save('mcdata-os-p1p2f3-nvtx') - - ## # Lower stat but closer to signal region - ## plotter.plot_mc_vs_data('os/p1p2p3', 'rho') - ## plotter.save('mcdata-os-p1p2p3-rho') - - ## plotter.plot_mc_vs_data('os/p1p2p3', 'nvtx') - ## plotter.save('mcdata-os-p1p2p3-nvtx') - - ## # Make Z->mumu + tau jet control - - ## # - ## # Makes Tau fr control plot - ## # - ## zmm_weighted = plotter.plot('data', 'os/p1p2f3/w3/e1_e2_Mass', 'hist', styler=make_styler(2, 'hist'), xrange=(60, 120)) - ## zmm_weighted.SetTitle("Zee + fake #tau_{h} est.") - ## zmm_weighted.legendstyle='l' - ## zmm_weighted.GetXaxis().SetTitle("m_{ee} (GeV)") - - ## zmm_unweighted = plotter.plot('data', 'os/p1p2p3/e1_e2_Mass', 'same', styler=make_styler(1), xrange=(60, 120)) - ## zmm_unweighted.SetTitle("Zee observed") - ## zmm_unweighted.SetTitle("Zee + fake #tau_{h} obs.") - ## zmm_unweighted.legendstyle='pe' - - ## plotter.add_legend([zmm_weighted, zmm_unweighted]) - ## plotter.add_cms_blurb(sqrts) - ## plotter.save('zmm-os-fr-control') - - ## # - ## # Makes charge fr control plot - ## # - - ## zeet_os_weighted = plotter.plot('data', 'os/p1p2f3/c1/e1_e2_Mass', 'hist', styler=make_styler(2, 'hist'), xrange=(60, 120)) - ## zeet_os_weighted.SetTitle("Ze^{#pm}e^{#mp} + fake #tau_{h} charge flip est.") - ## zeet_os_weighted.legendstyle='l' - ## zeet_os_weighted.GetXaxis().SetTitle("M_{ee} (GeV)") - - ## zee_ss_unweighted = plotter.plot('data', 'ss/p1p2f3/e1_e2_Mass', 'same', styler=make_styler(1), xrange=(60, 120)) - ## zee_ss_unweighted.SetTitle("Ze^{#pm}e^{#pm} + fake #tau_{h} obs.") - ## zee_ss_unweighted.legendstyle='pe' - - ## plotter.add_legend([zeet_os_weighted, zee_ss_unweighted]) - ## plotter.add_cms_blurb(sqrts) - ## plotter.save('zee-os-ss-charge-flip-control') - - ## plotter.plot('Zjets_M50', 'os/p1p2f3/weight') - ## plotter.save('zee-mc-event-weights') - ## # Check MC weights - ## ## plotter.plot('Zjets_M50', 'os/p1p2f3/weight_nopu') - ## ## plotter.save('zee-mc-event-weight_nopu') - - - ## ########################################################################### - ## ## FR sideband MC-vs-Data ################################################ - ## ########################################################################### - - plotter.plot_mc_vs_data('ss/p1f2p3', 'e2_t_Mass', rebin=10, xaxis='m_{e2#tau} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-subMass') - - plotter.plot_mc_vs_data('ss/p1f2p3', 'LT', rebin=10, xaxis='LT (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-LT') - - ########################################################################### - ## Signal region plots ################################################ - ########################################################################### - plotter.set_subdir('') - rebin_slim = [0,20]+range(30, 81, 10)+[100, 200] - - plotter.plot_final('e2_t_Mass#LT', rebin_slim, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, project=[0, 130], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTLow') - - plotter.plot_final('e2_t_Mass#LT', rebin_slim, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, project=[130, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTHigh') - - plotter.plot_final('e2_t_Mass#LT', rebin_slim, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, project=[80, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTCut') - - plotter.plot_final('e2_t_Mass#LT', 20, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, project=[80, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTCut-flatbin') - - plotter.plot_final('e1Pt', 10, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-e1Pt') - - plotter.plot_final('e2Pt', 10, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-e2Pt') - - plotter.plot_final('tPt', 10, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-tPt') - - plotter.plot_final('e1AbsEta', 10, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-e1AbsEta') - - plotter.plot_final('e2AbsEta', 10, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-e2AbsEta') - - plotter.plot_final('tAbsEta', 10, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-tAbsEta') - - plotter.plot_final('e2_t_Mass', 20, xaxis='m_{e_{2}#tau} (GeV)', maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass') - - plotter.plot_final('e1_t_Mass', 20, xaxis='m_{e_{1}#tau} (GeV)', maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-e1tMass') - - plotter.plot_final('e1_e2_Mass', 20, xaxis='m_{ee} (GeV)', maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-e1e2Mass') - - plotter.plot_final('tAbsEta', 5, xaxis='|#eta_#tau|', maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-tAbsEta') - - plotter.plot_final('e2RelPFIsoDB', 10, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.save('final-e2Iso') - - ## plotter.plot_final('metSignificance', 5) - ## plotter.add_cms_blurb(sqrts) - ## plotter.save('final-metSig') - - plotter.plot_final('LT', 10, maxy='auto', xaxis='m_{e_{1}#tau} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-LT') - - plotter.plot_final('e2_t_Mass#LT', 20, xaxis='subleading mass from projection', maxy=None, project=[0, 600], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMassProj') - - plotter.plot_final('e2_t_Mass#LT', 20, xaxis='M_{e_{2}#tau} (GeV)', maxy=None, project=[0, 70], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTLo') - - plotter.plot_final('e2_t_Mass#LT', 20, xaxis='M_{e_{2}#tau} (GeV)', maxy=None, project=[70, 600], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTHi') - - ########################################################################### - ## f3 region plots ################################################ - ########################################################################### - categories = { - 'LTCut' : [80, 650], - 'LTLow' : [0, 130], - 'LTHigh': [130, 650], - } - - for label, proj_range in categories.iteritems(): - factor = 1.5 if label == 'LTHigh' else 1 - plotter.set_subdir('f3/%s' % label) - plotter.plot_final_f3('e2_t_Mass#LT', rebin_slim, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') + if not options.no_mc_data: + ########################################################################### + ## Zee control plots ##################################################### + ########################################################################### + ## # Control Z->ee + jet region + plotter.set_subdir('mc_data/zee') + + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'e1_e2_Mass', rebin=10, + xaxis='m_{#mu#mu} (GeV)', leftside=False) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-%s' % label) + plotter.save('mcdata-Zee-e1e2Mass') - plotter.plot_final_f3('e2_t_Mass#LT', 200, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'e1Pt#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-%s-counting' % label, dotc=True, dotroot=True) + plotter.save('mcdata-Zee-e1Pt') - #pt - plotter.plot_final_f3("e1Pt#LT" , int(factor*10), xaxis='p_{Te_{1}} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'e2Pt#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1Pt-%s' % label) + plotter.save('mcdata-Zee-e2Pt') - plotter.plot_final_f3("e2Pt#LT" , int(factor*10), xaxis='p_{Te_{2}} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'e1AbsEta#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2Pt-%s' % label) + plotter.save('mcdata-Zee-e1AbsEta') - plotter.plot_final_f3("e1JetPt#LT" , int(factor*10), xaxis='p_{T Jet e_{1}} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'e2AbsEta#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1JetPt-%s' % label) + plotter.save('mcdata-Zee-e2AbsEta') - plotter.plot_final_f3("e2JetPt#LT" , int(factor*10), xaxis='p_{T Jet e_{2}} (GeV)', maxy=None, project=proj_range, project_axis='X') + # Check PU variables + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'rho') + plotter.save('mcdata-Zee-rho') + + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'nvtx') + plotter.save('mcdata-Zee-nvtx') + + if not options.no_wz: + ########################################################################### + ## WZ control plots ##################################################### + ########################################################################### + plotter.set_subdir('mc_data/wz_enhanced') + + plotter.plot_mc_vs_data('ss/tau_os/p1p2p3_enhance_wz', 'e2_t_Mass#LT', xaxis='m_{#mu#mu} (GeV)', + xrange=(0, 120), rebin=10, leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2JetPt-%s' % label) - - #eta - plotter.plot_final_f3("e1AbsEta#LT", 10, xaxis='|#eta_{e_{1}}|', maxy=None, project=proj_range, project_axis='X') + plotter.save('mcdata-ss-p1p2p3-enhance_wz-subMass') + + plotter.plot_mc_vs_data('ss/tau_os/p1p2p3_enhance_wz', 'e1_t_Mass', xaxis='m_{#mu#mu} (GeV)', + xrange=(0, 120), rebin=10, leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1AbsEta-%s' % label) + plotter.save('mcdata-ss-p1p2p3-enhance_wz-leadMass') + + plotter.set_subdir('WZ_enhanced') - plotter.plot_final_f3("e2AbsEta#LT", 10, xaxis='|#eta_{e_{2}}|' , maxy=None, project=proj_range, project_axis='X') + plotter.plot_final_wz('e1_t_Mass', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2AbsEta-%s' % label) + plotter.save('final-wz-leadMass') - #DR - plotter.plot_final_f3("e1_t_DR#LT", 10, xaxis='#DeltaR_{e_{1}#tau}', maxy=None, project=proj_range, project_axis='X') + plotter.plot_final_wz('e2_t_Mass#LT', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1_t_DR-%s' % label) + plotter.save('final-wz-subMass') - plotter.plot_final_f3("e2_t_DR#LT", 10, xaxis='#DeltaR_{e_{2}#tau}' , maxy=None, project=proj_range, project_axis='X') + plotter.plot_final_wz('e2Pt#LT', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2_t_DR-%s' % label) - - - - plotter.set_subdir('f3') - plotter.plot_final_f3('e2_t_Mass', 20, xaxis='m_{e_{2}#tau} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass') - - plotter.plot_final_f3('e2_t_Mass', 200, xaxis='m_{e_{2}#tau} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-counting-like', dotc=True, dotroot=True) - - plotter.plot_final_f3('e2_t_Mass', 20, xaxis='m_{e_{2}#tau} (GeV)', qcd_weight_fraction=0, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-wjetfake-subMass') - - plotter.plot_final_f3('e2_t_Mass', 20, xaxis='m_{e_{2}#tau} (GeV)', qcd_weight_fraction=1, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-qcdfake-subMass') - - plotter.plot_final_f3('e1_t_Mass', 20, xaxis='m_{e_{1}#tau} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1tMass') - - plotter.plot_final_f3('e1_e2_Mass', 20, xaxis='m_{ee} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1e2Mass') - - plotter.plot_final_f3('e1Pt', 10, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1Pt') - - plotter.plot_final_f3('e2Pt', 10, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2Pt') - - plotter.plot_final_f3('e2JetPt', 10, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2JetPt') - - plotter.plot_final_f3('tPt', 10, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tPt') - - plotter.plot_final_f3('e1AbsEta', 10, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1AbsEta') - - plotter.plot_final_f3('e2AbsEta', 10, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2AbsEta') - - plotter.plot_final_f3('tAbsEta', 10, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tAbsEta') - - plotter.plot_final_f3('LT', 5, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-LT') - - plotter.plot_final_f3('e1_t_DR', 20, xaxis='#DeltaR_{e_{1}#tau}', x_range=[0,5]) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e1_t_DR') - - plotter.plot_final_f3('e2_t_DR', 20, xaxis='#DeltaR_{e_{2}#tau}', x_range=[0,5]) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e2_t_DR') - - plotter.plot_final_f3('e2_t_Mass#LT', 20, xaxis='subleading mass from projection', maxy=None, project=[0, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMassProj') - - plotter.plot_final_f3('e2_t_Mass#LT', 20, xaxis='M_{e_{2}#tau} (GeV)', maxy=None, project=[0, 70], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-LTLo') - - plotter.plot_final_f3('e2_t_Mass#LT', 20, xaxis='M_{e_{2}#tau} (GeV)', maxy=None, project=[70, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-LTHi') - - ########################################################################### - ## charge flip region plots ####################################### - ########################################################################### - plotter.set_subdir('charge_flip_CR_f3') - - plotter.plot_final_f3('charge_flip_CR/e2_t_Mass', 20, xaxis='m_{e_{2}#tau} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-chargeFlip-subMass') - - plotter.plot_final_f3('charge_flip_CR/e1_t_Mass', 20, xaxis='m_{e_{1}#tau} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-chargeFlip-e1tMass') - - plotter.plot_final_f3('charge_flip_CR/e1_e2_Mass', 5, xaxis='m_{ee} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-chargeFlip-e1e2Mass') - - #END OF if not options.dry_run: - ########################################################################### - ## Making shape file ################################################# - ########################################################################### - plotter.set_subdir('') - prefixes = [options.prefix+'$'] if options.prefix else [''] - prefixes = [i+'$' for i in options.prefixes.split(',') if i] if options.prefixes else prefixes - for prefix in prefixes: - shape_prefix = prefix if len(prefixes) > 1 else '' - shape_prefix = shape_prefix.replace(':','_').replace('$','_') - - plotter.plot_final_f3(prefix+'e2_t_Mass', 20, qcd_weight_fraction=0.5, xaxis='m_{e_{2}#tau} (GeV)', show_error=True, maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.canvas.SetGridx() - plotter.canvas.SetGridy() - plotter.save('final-%s-f3-subMass' % shape_prefix) - - plotter.plot_final(prefix+'e2_t_Mass', 20, qcd_weight_fraction=0.5, xaxis='m_{e_{2}#tau} (GeV)', maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.canvas.SetGridx() - plotter.canvas.SetGridy() - plotter.save('final-%s-subMass' % shape_prefix) - - plotter.plot_final(prefix+'LT', 10, qcd_weight_fraction=0.5, xaxis='m_{e_{2}#tau} (GeV)', maxy='auto') - plotter.add_cms_blurb(sqrts) - plotter.canvas.SetGridx() - plotter.canvas.SetGridy() - plotter.save('final-%s-LT' % shape_prefix) - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, 'LTCut_eet_shapes_%s.root' % ( plotter.period) ), 'RECREATE') - shape_dir = shape_file.mkdir('eetCatHigh') - plotter.write_shapes(prefix+'e2_t_Mass#LT', 20, shape_dir, qcd_fraction=0.5, project=[80, 650], project_axis='X') - shape_dir = shape_file.mkdir('eetCatHigh_w') - plotter.write_shapes(prefix+'e2_t_Mass#LT', 20, shape_dir, qcd_fraction=0.0, project=[80, 650], project_axis='X') - shape_dir = shape_file.mkdir('eetCatHigh_q') - plotter.write_shapes(prefix+'e2_t_Mass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') - logging.warning('shape file %s created' % shape_file.GetName()) - shape_file.Close() - - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, '%seet_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') - - shape_dir = shape_file.mkdir('eetCatLow') - plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0, 100], project_axis='X') - shape_dir = shape_file.mkdir('eetCatLow_w') - plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 100], project_axis='X') - shape_dir = shape_file.mkdir('eetCatLow_q') - plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 100], project_axis='X') + plotter.save('final-wz-e2Pt') - shape_dir = shape_file.mkdir('eetCatHigh') - plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[100, 650], project_axis='X') - shape_dir = shape_file.mkdir('eetCatHigh_w') - plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[100, 650], project_axis='X') - shape_dir = shape_file.mkdir('eetCatHigh_q') - plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[100, 650], project_axis='X') - - logging.warning('shape file %s created' % shape_file.GetName()) - shape_file.Close() - - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, '%seet_f3_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') - - shape_dir = shape_file.mkdir('eetCatLow') - plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('eetCatLow_w') - plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('eetCatLow_q') - plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') - - shape_dir = shape_file.mkdir('eetCatHigh') - plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('eetCatHigh_w') - plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('eetCatHigh_q') - plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + plotter.plot_final_wz('e2JetPt#LT', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') + plotter.add_cms_blurb(sqrts) + plotter.save('final-wz-e2JetPt') + + if not options.no_signal: + ########################################################################### + ## Signal region plots ################################################ + ########################################################################### + plotter.set_subdir('') + + for label, proj_range in categories.iteritems(): + factor = 1.5 if label == 'LTHigh' else 1 + for tau_charge in ['tau_os', 'tau_ss']: + if tau_charge == 'tau_os': + plotter.set_subdir('%s' % label) + else: + plotter.set_subdir('%s_charge3' % label) + + plotter.plot_final('e2_t_Mass#LT', rebin_slim, xaxis='m_{e_{2}#tau} (GeV)', + maxy=None, project=proj_range, project_axis='X', + differential=True, yaxis='Events / GeV', show_error=True, + tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-%s' % label) + + plotter.plot_final('e2_t_Mass#LT', rebin_slim, xaxis='m_{e_{2}#tau} (GeV)', + maxy=None, project=proj_range, project_axis='X', + differential=True, yaxis='Events / GeV', show_error=True, + tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.canvas.SetLogy(True) + plotter.save('final-subMass-logscale-%s' % label) + + plotter.plot_final('e2_t_Mass#LT', 300, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge, + show_error=True) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-%s-counting' % label, dotc=True, dotroot=True) + + #pt + plotter.plot_final("e1Pt#LT" , int(factor*10), xaxis='p_{Te_{1}} (GeV)', + maxy=None, project=proj_range, project_axis='X', + tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-e1Pt-%s' % label) + + plotter.plot_final("e2Pt#LT", int(factor*10), xaxis='p_{Te_{2}} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-e2Pt-%s' % label) + + plotter.plot_final("tPt#LT", int(factor*10), xaxis='p_{T#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-tPt-%s' % label) + + #plotter.plot_final("e1JetPt#LT", int(factor*10), xaxis='p_{T Jet e_{1}} (GeV)', + # maxy=None, project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e1JetPt-%s' % label) + # + #plotter.plot_final("e2JetPt#LT", int(factor*10), xaxis='p_{T Jet e_{2}} (GeV)', + # maxy=None, project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e2JetPt-%s' % label) + + #eta + plotter.plot_final("e1AbsEta#LT", 10, xaxis='|#eta_{e_{1}}|', maxy=None, project=proj_range, + project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-e1AbsEta-%s' % label) + + plotter.plot_final("e2AbsEta#LT", 10, xaxis='|#eta_{e_{2}}|', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-e2AbsEta-%s' % label) + + #DR + #plotter.plot_final("e1_t_DR#LT", 10, xaxis='#DeltaR_{e_{1}#tau}', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e1_t_DR-%s' % label) + # + #plotter.plot_final("e2_t_DR#LT", 10, xaxis='#DeltaR_{e_{2}#tau}', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e2_t_DR-%s' % label) + + #plotter.plot_final('e2RelPFIsoDB', 10, maxy='auto') + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e2Iso') + + ## plotter.plot_final('metSignificance', 5) + ## plotter.add_cms_blurb(sqrts) + ## plotter.save('final-metSig') + + plotter.plot_final('LT', 10, maxy='auto', xaxis='m_{e_{1}#tau} (GeV)') + plotter.add_cms_blurb(sqrts) + plotter.save('final-LT') + + if not options.no_f3: + ########################################################################### + ## f3 region plots ################################################ + ########################################################################### + + for label, proj_range in categories.iteritems(): + factor = 1.5 if label == 'LTHigh' else 1 + for tau_charge in ['tau_os', 'tau_ss']: + if tau_charge == 'tau_os': + plotter.set_subdir('f3/%s' % label) + else: + plotter.set_subdir('f3/%s_charge3' % label) + + plotter.plot_final_f3('e2_t_Mass#LT', rebin_slim, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', differential=True, + yaxis='Events / GeV', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-%s' % label) + + plotter.plot_final_f3('e2_t_Mass#LT', 300, xaxis='m_{e_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-%s-counting' % label, dotc=True, dotroot=True) + + #pt + plotter.plot_final_f3("e1Pt#LT", int(factor*10), xaxis='p_{Te_{1}} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-e1Pt-%s' % label) + + plotter.plot_final_f3("e2Pt#LT", int(factor*10), xaxis='p_{Te_{2}} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-e2Pt-%s' % label) + + plotter.plot_final_f3("tPt#LT", int(factor*10), xaxis='p_{T#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-tPt-%s' % label) + + #plotter.plot_final_f3("e1JetPt#LT", int(factor*10), xaxis='p_{T Jet e_{1}} (GeV)', + # maxy=None, project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-e1JetPt-%s' % label) + # + #plotter.plot_final_f3("e2JetPt#LT" , int(factor*10), xaxis='p_{T Jet e_{2}} (GeV)', + # maxy=None, project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-e2JetPt-%s' % label) + + #eta + plotter.plot_final_f3("e1AbsEta#LT", 10, xaxis='|#eta_{e_{1}}|', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-e1AbsEta-%s' % label) + + plotter.plot_final_f3("e2AbsEta#LT", 10, xaxis='|#eta_{e_{2}}|', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-e2AbsEta-%s' % label) + + #DR + #plotter.plot_final_f3("e1_t_DR#LT", 10, xaxis='#DeltaR_{e_{1}#tau}', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-e1_t_DR-%s' % label) + # + #plotter.plot_final_f3("e2_t_DR#LT", 10, xaxis='#DeltaR_{e_{2}#tau}', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-e2_t_DR-%s' % label) + + + + plotter.set_subdir('f3') + + plotter.plot_final_f3('LT', 5, show_error=True) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-LT') + + ########################################################################### + ## charge flip region plots ####################################### + ########################################################################### + #plotter.set_subdir('charge_flip_CR_f3') + # + #plotter.plot_final_f3('charge_flip_CR/e2_t_Mass', 20, xaxis='m_{e_{2}#tau} (GeV)', show_error=True) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-chargeFlip-subMass') + # + #plotter.plot_final_f3('charge_flip_CR/e1_t_Mass', 20, xaxis='m_{e_{1}#tau} (GeV)', show_error=True) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-chargeFlip-e1tMass') + # + #plotter.plot_final_f3('charge_flip_CR/e1_e2_Mass', 5, xaxis='m_{ee} (GeV)', show_error=True) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-chargeFlip-e1e2Mass') - logging.warning('shape file %s created' % shape_file.GetName()) - shape_file.Close() + #END OF if not options.dry_run: + if not options.no_shapes: + ########################################################################### + ## Making shape file ################################################# + ########################################################################### + plotter.set_subdir('') + prefixes = [options.prefix+'$'] if options.prefix else [''] + prefixes = [i+'$' for i in options.prefixes.split(',') if i] if options.prefixes else prefixes + for prefix in prefixes: + shape_prefix = prefix if len(prefixes) > 1 else '' + shape_prefix = shape_prefix.replace(':','_').replace('$','_') + binning_7TeV = [0,40,80,120,200] + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTCut_eet_shapes_%s.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('eetCatHigh') + plotter.write_shapes(prefix+'e2_t_Mass#LT', binning_7TeV, shape_dir, qcd_fraction=0., project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', 20, shape_dir, qcd_fraction=0.0, project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTCut_eet_shapes_%s_different_fakes.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('eetCatHigh') + plotter.write_shapes(prefix+'e2_t_Mass#LT', binning_7TeV, shape_dir, qcd_fraction=0., project=[80, 650], project_axis='X', different_fakes=True) + #shape_dir = shape_file.mkdir('eetCatHigh_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', 20, shape_dir, qcd_fraction=0.0, project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTAll_eet_shapes_%s.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('eet') + plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eet_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eet_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, '%seet_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + + shape_dir = shape_file.mkdir('eetCatLow') + plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0, 100], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatLow_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 100], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatLow_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 100], project_axis='X') + + shape_dir = shape_file.mkdir('eetCatHigh') + plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[100, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[100, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[100, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, '%seet_shapes_%s_different_fakes.root' % (shape_prefix, plotter.period) ), 'RECREATE') + + shape_dir = shape_file.mkdir('eetCatLow') + plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0, 100], project_axis='X', different_fakes=True) + #shape_dir = shape_file.mkdir('eetCatLow_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 100], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatLow_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 100], project_axis='X') + + shape_dir = shape_file.mkdir('eetCatHigh') + plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[100, 650], project_axis='X', different_fakes=True) + #shape_dir = shape_file.mkdir('eetCatHigh_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[100, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[100, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + #shape_file = ROOT.TFile( + # os.path.join(plotter.outputdir, '%seet_f3_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + # + #shape_dir = shape_file.mkdir('eetCatLow') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') + ##shape_dir = shape_file.mkdir('eetCatLow_w') + ##plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + ##shape_dir = shape_file.mkdir('eetCatLow_q') + ##plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('eetCatHigh') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') + ##shape_dir = shape_file.mkdir('eetCatHigh_w') + ##plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + ##shape_dir = shape_file.mkdir('eetCatHigh_q') + ##plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #logging.warning('shape file %s created' % shape_file.GetName()) + #shape_file.Close() + # + #shape_file = ROOT.TFile( + # os.path.join(plotter.outputdir, '%seet_f3_all_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + # + #shape_dir = shape_file.mkdir('eetCatLow') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatLow_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatLow_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('eetCatHigh') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_w') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHigh_q') + #plotter.write_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #shape_dir = shape_file.mkdir('eetCatLowf3') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatLowf3_w') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatLowf3_q') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('eetCatHighf3') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHighf3_w') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('eetCatHighf3_q') + #plotter.write_f3_shapes(prefix+'e2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #logging.warning('shape file %s created' % shape_file.GetName()) + #shape_file.Close() diff --git a/wh/WHPlotterEMT.py b/wh/WHPlotterEMT.py index 1d6787d3..f1e0b7c3 100644 --- a/wh/WHPlotterEMT.py +++ b/wh/WHPlotterEMT.py @@ -12,7 +12,7 @@ import ROOT import sys import WHPlotterBase -from WHPlotterBase import make_styler, parser +from WHPlotterBase import make_styler, parser, project_x import rootpy.plotting.views as views from FinalStateAnalysis.MetaData.data_styles import data_styles, colors @@ -28,455 +28,478 @@ def __init__(self): "subMass" : "subMass*" ,} super(WHPlotterEMT, self).__init__('EMT', {}, obj2_charge_mapper) +categories = { + 'LTCut' : [80, 650], + 'LTLow' : [0, 130], + 'LTHigh': [130, 650], + 'Full' : [0, 650], +} +rebin_slim = [20]+range(30, 81, 10)+[100,130,200] +binning_7TeV = [0,40,80,120,200] + if __name__ == "__main__": plotter = WHPlotterEMT() sqrts = plotter.sqrts plotter.defaults['show_charge_fakes'] = True options,NOTUSED = parser.parse_args() if not options.dry_run: - ########################################################################### - ## Zmm control plots ##################################################### - ########################################################################### - plotter.set_subdir('mc_data') - - # Control Z->tautau + jet region - plotter.plot_mc_vs_data('os/p1p2f3', 'e_m_Mass', rebin=10, xaxis='m_{e#mu} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-os-p1p2f3-emMass') - - plotter.plot_mc_vs_data('os/p1p2f3', 'nTruePU', rebin=1, xaxis='True PU') - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-os-p1p2f3-nTruePU') - - plotter.plot('Zjets_M50', 'os/p1p2f3/nTruePU', 'nTruePU', rebin=1, xaxis='True PU') - plotter.save('zjets-os-p1p2f3-nTruePU') - - - ## plotter.plot_mc_vs_data('os/p1p2f3', 'bCSVVeto', rebin=1, xaxis='bveto') - ## plotter.add_cms_blurb(sqrts) - ## plotter.save('mcdata-os-p1p2f3-bveto') - - plotter.plot_mc_vs_data('os/p1p2f3/w3', 'e_m_Mass', 10) - plotter.save('mcdata-os-p1p2f3-w3-emMass') - - plotter.plot_mc_vs_data('os/p1f2p3', 'e_m_Mass', 10) - plotter.save('mcdata-os-p1f2p3-emMass') - - plotter.plot_mc_vs_data('os/f1p2p3', 'e_m_Mass', 10) - plotter.save('mcdata-os-p1f2p3-emMass') - - # Check PU variables - #plotter.plot_mc_vs_data('os/p1p2f3', 'rho') - #plotter.save('mcdata-os-p1p2f3-rho') - - #plotter.plot_mc_vs_data('os/p1p2f3', 'nvtx') - #plotter.save('mcdata-os-p1p2f3-nvtx') - - # Lower stat but closer to signal region - #plotter.plot_mc_vs_data('os/p1p2p3', 'rho') - #plotter.save('mcdata-os-p1p2p3-rho') - - #plotter.plot_mc_vs_data('os/p1p2p3', 'nvtx') - #plotter.save('mcdata-os-p1p2p3-nvtx') - - # Make Z->mumu + tau jet control - - weighted = plotter.plot('data', 'os/p1p2f3/w3/e_m_Mass', 'hist', rebin=20, styler=make_styler(2, 'hist'), xaxis='m_{e#mu} (GeV)') - unweighted = plotter.plot('data', 'os/p1p2p3/e_m_Mass', 'same', rebin=20, styler=make_styler(1), xaxis='m_{e#mu} (GeV)') - weighted.SetTitle('e^{+}#mu^{-} + fake #tau_{h} est.') - weighted.legendstyle = 'l' - unweighted.SetTitle('e^{+}#mu^{-} + fake #tau_{h} obs.') - unweighted.legendstyle = 'pe' - plotter.add_legend([weighted, unweighted]) - plotter.add_cms_blurb(sqrts) - plotter.save('ztt-os-fr-control') - - #plotter.plot('data', 'os/p1p2p3/prescale', styler=make_styler(1)) - #plotter.save('ztt-os-prescale-check') - - #plotter.plot('Zjets_M50', 'os/p1p2f3/weight') - #plotter.save('ztt-mc-event-weights') - ## Check MC weights - #plotter.plot('Zjets_M50', 'os/p1p2f3/weight_nopu') - #plotter.save('ztt-mc-event-weight_nopu') - - - ########################################################################### - ## FR sideband MC-vs-Data ################################################ - ########################################################################### - - plotter.plot_mc_vs_data('ss/p1f2p3', 'mPt', 5, '#mu_{1} p_{T}', leftside=False) - plotter.save('mcdata-ss-p1f2p3-mPt') - - plotter.plot_mc_vs_data('ss/p1f2p3', 'subMass', 20, 'Subleading mass (GeV)', leftside=False) - plotter.save('mcdata-ss-p1f2p3-subMass') - - plotter.plot_mc_vs_data('ss/p1p2f3', 'subMass', 20, 'Subleading mass (GeV)', leftside=False) - plotter.save('mcdata-ss-p1p2f3-subMass') - - plotter.plot_mc_vs_data('ss/f1p2p3', 'subMass', 20, 'Subleading mass (GeV)', leftside=False) - plotter.save('mcdata-ss-f1p2p3-subMass') - - plotter.plot_mc_vs_data('ss/p1f2p3/w2', 'mPt', 5, '#mu_{1} p_{T}', leftside=False) - plotter.save('mcdata-ss-p1f2p3-w2-mPt') - - plotter.plot_mc_vs_data('ss/p1f2p3', 'ePt', 5, 'Electron p_{T}', leftside=False) - plotter.save('mcdata-ss-p1f2p3-ePt') - - plotter.plot_mc_vs_data('ss/p1f2p3/w2', 'ePt', 5, 'Electron p_{T}', leftside=False) - plotter.save('mcdata-ss-p1f2p3-w2-ePt') - - plotter.plot_mc_vs_data('ss/f1p2p3', 'ePt', 5, 'Electron p_{T}', leftside=False) - plotter.save('mcdata-ss-f1p2p3-ePt') - - plotter.plot_mc_vs_data('ss/f1p2p3/w1', 'ePt', 5, 'Electron p_{T}', leftside=False) - plotter.save('mcdata-ss-f1p2p3-w2-ePt') - - ########################################################################### - ## Signal region plots ################################################ - ########################################################################### - plotter.set_subdir('') - rebin_slim = [0,20]+range(30, 81, 10)+[100,130,200] - - plotter.plot_final('subMass#LT', rebin_slim, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, project=[0, 130], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTLow') - - plotter.plot_final('subMass#LT', rebin_slim, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, project=[130, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTHigh') - - plotter.plot_final('subMass#LT', rebin_slim, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, project=[80, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTCut') - - plotter.plot_final('subMass#LT', 20, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, project=[80, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTCut-flatbin') - - plotter.plot_final('LT', 5, xaxis='LT (GeV)', maxy=15) - plotter.add_cms_blurb(sqrts) - plotter.save('final-LT') - - plotter.plot_final('mPt', 10) - plotter.save('final-mPt') - - plotter.plot_final('ePt', 10) - plotter.save('final-ePt') - - plotter.plot_final('tPt', 10) - plotter.save('final-tPt') - - plotter.plot_final('mAbsEta', 10) - plotter.save('final-mAbsEta') - - plotter.plot_final('eAbsEta', 10) - plotter.save('final-eAbsEta') - - plotter.plot_final('tAbsEta', 10) - plotter.save('final-tAbsEta') - - plotter.plot_final('subMass', 20, xaxis='m_{l_{2}#tau} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass') - - plotter.plot_final('subMass', 20, xaxis='m_{l_{2}#tau} (GeV)', qcd_weight_fraction=0.5) - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-qweight05') - plotter.canvas.SetLogy(True) - plotter.save('final-subMass-qweight05-logscale') - - - plotter.plot_final('subMass', 20, xaxis='m_{l_{2}#tau} (GeV)', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-werror') - - # Shape only - plotter.plot_final('subMass', 20, xaxis='m_{l_{2}#tau} (GeV)', show_error=True, - fake_error=0, wz_error=0, zz_error=0) - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-wshapeerror') - - ## plotter.plot_final('metSig', 5) - ## plotter.save('final-metSig') - plotter.plot_final('tLeadDR', 10) - plotter.save('final-tLeadDR') - plotter.plot_final('tSubDR', 10) - plotter.save('final-tSubDR') - - plotter.plot_final('e_t_Mass', 10) - plotter.save('final-etMass') - - plotter.plot_final('subMass#LT', 20, xaxis='subleading mass from projection', maxy=None, project=[0, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMassProj') - - plotter.plot_final('subMass#LT', 20, xaxis='M_{l_{2}#tau} (GeV)', maxy=None, project=[0, 90], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTLo') - - plotter.plot_final('subMass#LT', 20, xaxis='M_{l_{2}#tau} (GeV)', maxy=None, project=[90, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTHi') - - ########################################################################### - ## WZ enhanced region plots ########################################### - ########################################################################### - plotter.set_subdir('WZ_enhanced') - - plotter.plot_final_wz('e_t_Mass', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-wz-etMass') - - plotter.plot_final_wz('mPt', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', maxy=20) - plotter.add_cms_blurb(sqrts) - plotter.save('final-wz-mPt') - - #plotter.plot_final_wz('mJetPt', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') - #plotter.add_cms_blurb(sqrts) - #plotter.save('final-wz-mJetPt') - - ########################################################################### - ## F3 enhanced region plots ########################################### - ########################################################################### - plotter.set_subdir('f3') - - categories = { - 'LTCut' : [80, 650], - 'LTLow' : [0, 130], - 'LTHigh': [130, 650], - } - - for label, proj_range in categories.iteritems(): - plotter.set_subdir('f3/%s' % label) - plotter.plot_final_f3('subMass#LT', rebin_slim, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') + if not options.no_mc_data: + ########################################################################### + ## Ztt control plots ##################################################### + ########################################################################### + plotter.set_subdir('mc_data/em') + + # Control Z->tautau + jet region + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'e_m_Mass#LT', rebin=10, xaxis='m_{e#mu} (GeV)', + leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-%s' % label) + plotter.save('mcdata-em-emMass') - plotter.plot_final_f3('subMass#LT', 200, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-%s-counting' % label, dotc=True, dotroot=True) - #pt - plotter.plot_final_f3("mPt#LT" , 10, xaxis='p_{T#mu} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'mPt#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-mPt-%s' % label) + plotter.save('mcdata-em-mPt') - plotter.plot_final_f3("ePt#LT" , 10, xaxis='p_{Te} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'ePt#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-ePt-%s' % label) + plotter.save('mcdata-em-ePt') - plotter.plot_final_f3("mJetPt#LT" , 10, xaxis='p_{T Jet#mu} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'mAbsEta#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-mJetPt-%s' % label) + plotter.save('mcdata-em-mAbsEta') - plotter.plot_final_f3("eJetPt#LT" , 10, xaxis='p_{T Jet e} (GeV)', maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'eAbsEta#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-eJetPt-%s' % label) + plotter.save('mcdata-em-eAbsEta') - plotter.plot_final_f3("tPt#LT" , 10, xaxis='p_{T#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') + if not options.no_wz: + ########################################################################### + ## WZ control plots ##################################################### + ########################################################################### + plotter.set_subdir('mc_data/wz_enhanced') + + plotter.plot_mc_vs_data('ss/tau_os/p1p2p3_enhance_wz', 'e_t_Mass#LT', xaxis='m_{e#tau} (GeV)', + xrange=(0, 120), rebin=10, leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tPt-%s' % label) - - #eta - plotter.plot_final_f3("mAbsEta#LT", 10, xaxis='|#eta_{#mu}|', maxy=None, project=proj_range, project_axis='X') + plotter.save('mcdata-ss-p1p2p3-enhance_wz-e_t_Mass') + + plotter.plot_mc_vs_data('ss/tau_os/p1p2p3_enhance_wz', 'm_t_Mass#LT', xaxis='m_{#mu#tau} (GeV)', + xrange=(0, 120), rebin=10, leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-mAbsEta-%s' % label) + plotter.save('mcdata-ss-p1p2p3-enhance_wz-leadMass') + + plotter.set_subdir('WZ_enhanced') - plotter.plot_final_f3("eAbsEta#LT", 10, xaxis='|#eta_{e}|' , maxy=None, project=proj_range, project_axis='X') + plotter.plot_final_wz('e_t_Mass#LT', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-eAbsEta-%s' % label) + plotter.save('final-wz-e_t_Mass') - plotter.plot_final_f3("tAbsEta#LT", 10, xaxis='|#eta_{#tau}|' , maxy=None, project=proj_range, project_axis='X') + plotter.plot_final_wz('m_t_Mass#LT', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tAbsEta-%s' % label) + plotter.save('final-wz-m_t_Mass') - #DR - plotter.plot_final_f3("m_t_DR#LT", 10, xaxis='#DeltaR_{#mu#tau}', maxy=None, project=proj_range, project_axis='X') + plotter.plot_final_wz('ePt#LT', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m_t_DR-%s' % label) - - plotter.plot_final_f3("e_t_DR#LT", 10, xaxis='#DeltaR_{e#tau}' , maxy=None, project=proj_range, project_axis='X') + plotter.save('final-wz-ePt') + + plotter.plot_final_wz('eJetPt#LT', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-e_t_DR-%s' % label) - - #Jet BTag - plotter.plot_final_f3("eJetBtag#LT", 2, xaxis='e Jet Btag' , maxy=None, project=proj_range, project_axis='X') + plotter.save('final-wz-eJetPt') + + if not options.no_signal: + ########################################################################### + ## Signal region plots ################################################ + ########################################################################### + plotter.set_subdir('') + + for label, proj_range in categories.iteritems(): + for tau_charge in ['tau_os', 'tau_ss']: + if tau_charge == 'tau_os': + plotter.set_subdir('%s' % label) + else: + plotter.set_subdir('%s_charge3' % label) + + plotter.plot_final('subMass#LT', rebin_slim, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', differential=True, + yaxis='Events / GeV', show_error=True, tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-%s' % label) + + plotter.plot_final('subMass#LT', binning_7TeV, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', differential=True, + yaxis='Events / GeV', show_error=True, tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-7TeVBin-%s' % label) + + + #plotter.plot_final("e_m_Mass#LT", 20, xaxis='m_{e#mu} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e_m_Mass-%s' % label) + # + #plotter.plot_final("m_t_Mass#LT", 20, xaxis='m_{#mu#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m_t_Mass-%s' % label) + # + #plotter.plot_final("e_t_Mass#LT", 20, xaxis='m_{e#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e_t_Mass-%s' % label) + + plotter.plot_final('subMass#LT', 300, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge, + show_error=True) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-%s-counting' % label, dotc=True, dotroot=True) + + #pt + #plotter.plot_final("mPt#LT" , 10, xaxis='p_{T#mu} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-mPt-%s' % label) + # + #plotter.plot_final("ePt#LT" , 10, xaxis='p_{Te} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-ePt-%s' % label) + # + #plotter.plot_final("tPt#LT" , 10, xaxis='p_{T#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-tPt-%s' % label) + + #plotter.plot_final("mJetPt#LT" , 10, xaxis='p_{T Jet#mu} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-mJetPt-%s' % label) + # + #plotter.plot_final("eJetPt#LT" , 10, xaxis='p_{T Jet e} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-eJetPt-%s' % label) + + #eta + #plotter.plot_final("mAbsEta#LT", 10, xaxis='|#eta_{#mu}|', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-mAbsEta-%s' % label) + # + #plotter.plot_final("eAbsEta#LT", 10, xaxis='|#eta_{e}|' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-eAbsEta-%s' % label) + # + #plotter.plot_final("tAbsEta#LT", 10, xaxis='|#eta_{#tau}|' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-tAbsEta-%s' % label) + + #DR + #plotter.plot_final("m_t_DR#LT", 10, xaxis='#DeltaR_{#mu#tau}', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m_t_DR-%s' % label) + # + #plotter.plot_final("e_t_DR#LT", 10, xaxis='#DeltaR_{e#tau}' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e_t_DR-%s' % label) + + #Jet BTag + #plotter.plot_final("eJetBtag#LT", 2, xaxis='e Jet Btag' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-eJetBtag-%s' % label) + # + #plotter.plot_final("mJetBtag#LT", 2, xaxis='#mu Jet Btag' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-mJetBtag-%s' % label) + + + plotter.plot_final('LT', 5, xaxis='LT (GeV)', maxy=15) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-eJetBtag-%s' % label) - - plotter.plot_final_f3("mJetBtag#LT", 2, xaxis='#mu Jet Btag' , maxy=None, project=proj_range, project_axis='X') + plotter.save('final-LT') + + if not options.no_f3: + ########################################################################### + ## F3 enhanced region plots ########################################### + ########################################################################### + plotter.set_subdir('f3') + + for label, proj_range in categories.iteritems(): + for tau_charge in ['tau_os', 'tau_ss']: + if tau_charge == 'tau_os': + plotter.set_subdir('f3/%s' % label) + else: + plotter.set_subdir('f3/%s_charge3' % label) + + plotter.plot_final_f3('subMass#LT', rebin_slim, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', differential=True, + yaxis='Events / GeV', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-%s' % label) + + plotter.plot_final_f3('subMass#LT', binning_7TeV, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', differential=True, + yaxis='Events / GeV', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-7TeVBin-%s' % label) + + #plotter.plot_final_f3('subMass#LT', [20, 40, 120, 300], xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', differential=True, + # yaxis='Events / GeV', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-subMass-widebin-%s' % label) + # + #plotter.plot_final_f3('subMass#LT', rebin_slim, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-subMass-%s-notDifferential' % label) + + #plotter.plot_final_f3("e_m_Mass#LT", 20, xaxis='m_{e#mu} (GeV)', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e_m_Mass-%s' % label) + # + #plotter.plot_final_f3("m_t_Mass#LT", 20, xaxis='m_{#mu#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m_t_Mass-%s' % label) + # + #plotter.plot_final_f3("e_t_Mass#LT", 20, xaxis='m_{e#tau} (GeV)' , maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-e_t_Mass-%s' % label) + + plotter.plot_final_f3('subMass#LT', 300, xaxis='m_{l_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-%s-counting' % label, dotc=True, dotroot=True) + + #pt + #plotter.plot_final_f3("mPt#LT" , 10, xaxis='p_{T#mu} (GeV)', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-mPt-%s' % label) + # + #plotter.plot_final_f3("ePt#LT" , 10, xaxis='p_{Te} (GeV)', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-ePt-%s' % label) + # + #plotter.plot_final_f3("tPt#LT" , 10, xaxis='p_{T#tau} (GeV)', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-tPt-%s' % label) + + #plotter.plot_final_f3("mJetPt#LT" , 10, xaxis='p_{T Jet#mu} (GeV)', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-mJetPt-%s' % label) + # + #plotter.plot_final_f3("eJetPt#LT" , 10, xaxis='p_{T Jet e} (GeV)', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-eJetPt-%s' % label) + + #eta + #plotter.plot_final_f3("mAbsEta#LT", 10, xaxis='|#eta_{#mu}|', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-mAbsEta-%s' % label) + # + #plotter.plot_final_f3("eAbsEta#LT", 10, xaxis='|#eta_{e}|' , maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-eAbsEta-%s' % label) + # + #plotter.plot_final_f3("tAbsEta#LT", 10, xaxis='|#eta_{#tau}|' , maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-tAbsEta-%s' % label) + + #DR + #plotter.plot_final_f3("m_t_DR#LT", 10, xaxis='#DeltaR_{#mu#tau}', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m_t_DR-%s' % label) + # + #plotter.plot_final_f3("e_t_DR#LT", 10, xaxis='#DeltaR_{e#tau}' , maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-e_t_DR-%s' % label) + + #Jet BTag + #plotter.plot_final_f3("eJetBtag#LT", 2, xaxis='e Jet Btag' , maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-eJetBtag-%s' % label) + # + #plotter.plot_final_f3("mJetBtag#LT", 2, xaxis='#mu Jet Btag' , maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-mJetBtag-%s' % label) + + plotter.set_subdir('f3') + plotter.plot_final_f3('LT', 5, xaxis='LT (GeV)', show_error=True) plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-mJetBtag-%s' % label) - - plotter.set_subdir('f3') - plotter.plot_final_f3('LT', 5, xaxis='LT (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-LT') - - plotter.plot_final_f3('subMass', 20, xaxis='m_{l_{2}#tau_{#mu}} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass') - - plotter.plot_final_f3('subMass', 200, xaxis='m_{l_{2}#tau_{#mu}} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-counting-like', dotc=True, dotroot=True) - - plotter.plot_final_f3('subMass', 20, xaxis='m_{l_{2}#tau_{#mu}} (GeV)', qcd_weight_fraction=1, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-qcdfake-subMass') - - plotter.plot_final_f3('subMass', 20, xaxis='m_{l_{2}#tau_{#mu}} (GeV)', qcd_weight_fraction=0, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-wjetfake-subMass') - - plotter.plot_final_f3("eJetBtag#LT", 2, xaxis='e Jet Btag' , maxy=None, project=[0, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-eJetBtag') - - plotter.plot_final_f3("mJetBtag#LT", 2, xaxis='#mu Jet Btag' , maxy=None, project=[0, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-mJetBtag') - - - plotter.plot_final_f3('e_t_Mass', 20, xaxis='m_{e#tau_{#mu}} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-etMass') - - plotter.plot_final_f3('e_m_Mass', 20, xaxis='m_{e#mu} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-emMass') - - #plotter.plot_final_f3('m_t_Mass', 20, xaxis='m_{#mu#tau} (GeV)', qcd_weight_fraction=0.5, show_error=True) - #plotter.add_cms_blurb(sqrts) - #plotter.save('final-f3-emMass') - - plotter.plot_final_f3('mPt', 10, xaxis='p_{T#mu} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-mPt') - - plotter.plot_final_f3('ePt', 10, xaxis='p_{Te} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-ePt') - - plotter.plot_final_f3('tPt', 10, xaxis='p_{T#tau} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tPt') - - plotter.plot_final_f3('tSubDR', 10, xaxis='#DeltaR_{l_{2}#tau}', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tSubDR') - - plotter.plot_final_f3('tLeadDR', 10, xaxis='#DeltaR_{l_{1}#tau}', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tLeadDR') - - plotter.plot_final_f3('e_t_DR', 10, xaxis='#DeltaR_{e#tau}', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-etDR') - - plotter.plot_final_f3('m_t_DR', 10, xaxis='#DeltaR_{#mu#tau}', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-mtDR') - - plotter.plot_final_f3('subPt', 10, xaxis='p_{Tl_{2}} (GeV)', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subPt') - - plotter.plot_final_f3('subJetPt', 10, xaxis='p_{TJetl_{2}} (GeV)', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subJetPt') - - plotter.plot_final_f3('leadPt', 10, xaxis='p_{Tl_{1}} (GeV)', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-leadPt') - - plotter.plot_final_f3('eChargeIdTight', 1, xaxis='Charge ID Tight', maxy=None) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-eChargeIdTight') - - plotter.plot_final_f3('subMass#LT', 20, xaxis='subleading mass from projection', maxy=None, project=[0, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMassProj') - - plotter.plot_final_f3('subMass#LT', 20, xaxis='M_{l_{2}#tau} (GeV)', maxy=None, project=[0, 90], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-LTLo') - - plotter.plot_final_f3('subMass#LT', 20, xaxis='M_{l_{2}#tau} (GeV)', maxy=None, project=[90, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-LTHi') + plotter.save('final-f3-LT') #END OF if not options.dry_run: - ########################################################################### - ## Making shape file ################################################# - ########################################################################### - plotter.set_subdir('') - prefixes = [options.prefix+'$'] if options.prefix else [''] - prefixes = [i+'$' for i in options.prefixes.split(',') if i] if options.prefixes else prefixes - for prefix in prefixes: - shape_prefix = prefix if len(prefixes) > 1 else '' - shape_prefix = shape_prefix.replace(':','_').replace('$','_') - - plotter.plot_final(prefix+'LT', 5, xaxis='LT (GeV)', qcd_weight_fraction=0.5) - plotter.add_cms_blurb(sqrts) - plotter.save('study-%s-LT-qweight05' % shape_prefix) - - plotter.plot_final(prefix+'subMass', 20, xaxis='m_{#l_{2}#tau} (GeV)', qcd_weight_fraction=0.5) - plotter.add_cms_blurb(sqrts) - plotter.save('study-%s-subMass-qweight05' % shape_prefix) - - plotter.plot_final_f3(prefix+'subMass', 20, xaxis='m_{l_{1}#tau_{#mu}} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('study-%s-f3-qweight05-werror-subMass' % shape_prefix) - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, 'LTCut_emt_shapes_%s.root' % ( plotter.period) ), 'RECREATE') - shape_dir = shape_file.mkdir('emtCatHigh') - plotter.write_shapes(prefix+'subMass#LT', 20, shape_dir, qcd_fraction=0.5, project=[80, 650], project_axis='X') - shape_dir = shape_file.mkdir('emtCatHigh_w') - plotter.write_shapes(prefix+'subMass#LT', 20, shape_dir, qcd_fraction=0.0, project=[80, 650], project_axis='X') - shape_dir = shape_file.mkdir('emtCatHigh_q') - plotter.write_shapes(prefix+'subMass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') - shape_file.Close() - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, '%semt_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') - - shape_dir = shape_file.mkdir('emtCatLow') - plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0, 130], project_axis='X') - shape_dir = shape_file.mkdir('emtCatLow_w') - plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 130], project_axis='X') - shape_dir = shape_file.mkdir('emtCatLow_q') - plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 130], project_axis='X') - - shape_dir = shape_file.mkdir('emtCatHigh') - plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('emtCatHigh_w') - plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('emtCatHigh_q') - plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') - - logging.warning('shape file %s created' % shape_file.GetName()) - shape_file.Close() - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, '%semt_f3_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') - - shape_dir = shape_file.mkdir('emtCatLow') - plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('emtCatLow_w') - plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('emtCatLow_q') - plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') - - shape_dir = shape_file.mkdir('emtCatHigh') - plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('emtCatHigh_w') - plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('emtCatHigh_q') - plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') - - logging.warning('shape file %s created' % shape_file.GetName()) - shape_file.Close() + if not options.no_shapes: + ########################################################################### + ## Making shape file ################################################# + ########################################################################### + plotter.set_subdir('') + prefixes = [options.prefix+'$'] if options.prefix else [''] + prefixes = [i+'$' for i in options.prefixes.split(',') if i] if options.prefixes else prefixes + for prefix in prefixes: + shape_prefix = prefix if len(prefixes) > 1 else '' + shape_prefix = shape_prefix.replace(':','_').replace('$','_') + binning_7TeV = [0,40,80,120,200] + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTAll_emt_shapes_%s.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('emt') + plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emt_w') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emt_q') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTCut_emt_shapes_%s.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('emt') + plotter.write_shapes(prefix+'subMass#LT', binning_7TeV, shape_dir, qcd_fraction=0., project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_w') + #plotter.write_shapes(prefix+'subMass#LT', 20, shape_dir, qcd_fraction=0.0, project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_q') + #plotter.write_shapes(prefix+'subMass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTCut_emt_shapes_%s_different_fakes.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('emt') + plotter.write_shapes(prefix+'subMass#LT', binning_7TeV, shape_dir, qcd_fraction=0., project=[80, 650], project_axis='X', different_fakes=True) + #shape_dir = shape_file.mkdir('emtCatHigh_w') + #plotter.write_shapes(prefix+'subMass#LT', 20, shape_dir, qcd_fraction=0.0, project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_q') + #plotter.write_shapes(prefix+'subMass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, '%semt_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + + shape_dir = shape_file.mkdir('emtCatLow') + plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0, 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLow_w') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLow_q') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 130], project_axis='X') + + shape_dir = shape_file.mkdir('emtCatHigh') + plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_w') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_q') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, '%semt_shapes_%s_different_fakes.root' % (shape_prefix, plotter.period) ), 'RECREATE') + + shape_dir = shape_file.mkdir('emtCatLow') + plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0, 130], project_axis='X', different_fakes=True) + #shape_dir = shape_file.mkdir('emtCatLow_w') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0, 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLow_q') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 130], project_axis='X') + + shape_dir = shape_file.mkdir('emtCatHigh') + plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[130, 650], project_axis='X', different_fakes=True) + #shape_dir = shape_file.mkdir('emtCatHigh_w') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_q') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + #shape_file = ROOT.TFile( + # os.path.join(plotter.outputdir, '%semt_f3_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + # + #shape_dir = shape_file.mkdir('emtCatLow') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLow_w') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLow_q') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('emtCatHigh') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_w') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_q') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #logging.warning('shape file %s created' % shape_file.GetName()) + #shape_file.Close() + # + #shape_file = ROOT.TFile( + # os.path.join(plotter.outputdir, '%semt_f3_all_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + # + #shape_dir = shape_file.mkdir('emtCatLow') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLow_w') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLow_q') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('emtCatHigh') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_w') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHigh_q') + #plotter.write_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #shape_dir = shape_file.mkdir('emtCatLowf3') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLowf3_w') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatLowf3_q') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('emtCatHighf3') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHighf3_w') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('emtCatHighf3_q') + #plotter.write_f3_shapes(prefix+'subMass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #logging.warning('shape file %s created' % shape_file.GetName()) + #shape_file.Close() diff --git a/wh/WHPlotterMMT.py b/wh/WHPlotterMMT.py index da48fe38..571a7d9d 100644 --- a/wh/WHPlotterMMT.py +++ b/wh/WHPlotterMMT.py @@ -12,575 +12,531 @@ import ROOT import sys import WHPlotterBase -from WHPlotterBase import make_styler, parser +from WHPlotterBase import make_styler, parser, project_x import rootpy.plotting.views as views from FinalStateAnalysis.MetaData.data_styles import data_styles, colors logging.basicConfig(stream=sys.stderr, level=logging.INFO) +ROOT.gStyle.SetOptTitle(0) +#ROOT.gROOT.SetStyle('Plain') class WHPlotterMMT(WHPlotterBase.WHPlotterBase): def __init__(self): super(WHPlotterMMT, self).__init__('MMT') +rebin_slim = range(20, 81, 10)+[100, 130, 200] +binning_7TeV = [0,40,80,120,200] +categories = { + 'LTCut' : [80, 650], + 'Full' : [0, 650], + 'LTLow' : [0, 130], + 'LTHigh': [130, 650], +} + + + if __name__ == "__main__": plotter = WHPlotterMMT() sqrts = plotter.sqrts options,NOTUSED = parser.parse_args() if not options.dry_run: - ########################################################################### - ## Zmm control plots ##################################################### - ########################################################################### - plotter.set_subdir('mc_data') - - # Control Z->mumu + jet region - plotter.plot_mc_vs_data('os/p1p2f3', 'm1_m2_Mass', xaxis='m_{#mu#mu} (GeV)', xrange=(60, 120)) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-os-p1p2f3-m1m2Mass') - - plotter.plot_mc_vs_data('os/p1p2p3', 'm1_m2_Mass', xaxis='m_{#mu#mu} (GeV)', xrange=(60, 120)) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-os-p1p2p3-m1m2Mass') - - plotter.plot_mc_vs_data('ss/p1p2p3_enhance_wz', 'm2_t_Mass', xaxis='m_{#mu#mu} (GeV)', xrange=(0, 120), rebin=10) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1p2p3-enhance_wz-subMass') - - plotter.plot_mc_vs_data('ss/p1p2p3_enhance_wz', 'm1_t_Mass', xaxis='m_{#mu#mu} (GeV)', xrange=(0, 120), rebin=10) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1p2p3-enhance_wz-leadMass') - - plotter.plot_mc_vs_data('ss/p1f2p3_enhance_wz', 'm1_t_Mass', xaxis='m_{#mu#mu} (GeV)', xrange=(0, 120), rebin=10) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-enhance_wz-leadMass') - - plotter.plot_mc_vs_data('ss/p1f2p3_enhance_wz/w2', 'm1_t_Mass', xaxis='m_{#mu#mu} (GeV)', xrange=(0, 120), rebin=10) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-w2-enhance_wz-leadMass') - - plotter.plot_mc_vs_data('ss/p1p2p3_enhance_wz', 'subMTMass', xaxis='m_{#mu#mu} (GeV)', xrange=(0, 120), rebin=10) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1p2p3-enhance_wz-subMTMass') - - plotter.plot_mc_vs_data('ss/p1p2p3_enhance_wz', 'm2Pt', xaxis='m_{#mu#mu} (GeV)', xrange=(0, 120), rebin=5) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1p2p3-enhance_wz-m2Pt') - - plotter.compare_shapes('Zjets_M50', 'data', 'os/p1p2f3/nvtx') - plotter.save('z-vs-data-nvtx-shape') - plotter.compare_shapes('Zjets_M50', 'data', 'os/p1p2f3/rho') - plotter.save('z-vs-data-rho-shape') - - plotter.plot_mc_vs_data('os/p1p2f3/w3', 'm1_m2_Mass') - plotter.save('mcdata-os-p1p2f3-w3-m1m2Mass') - - plotter.plot_mc_vs_data('os/p1f2p3', 'm1_m2_Mass', xaxis='m_{#mu#mu} (GeV)', xrange=(60, 120)) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-os-p1f2p3-m1m2Mass') - - # Check PU variables - plotter.plot_mc_vs_data('os/p1p2f3', 'rho') - plotter.save('mcdata-os-p1p2f3-rho') - - plotter.plot_mc_vs_data('os/p1p2f3', 'nvtx') - plotter.save('mcdata-os-p1p2f3-nvtx') - - # Lower stat but closer to signal region - plotter.plot_mc_vs_data('os/p1p2p3', 'rho') - plotter.save('mcdata-os-p1p2p3-rho') - - plotter.plot_mc_vs_data('os/p1p2p3', 'nvtx') - plotter.save('mcdata-os-p1p2p3-nvtx') - - # Make Z->mumu + tau jet control - - antiiso_m2JetPt = plotter.plot('data', 'ss/p1f2p3/m2JetPt', 'hist', styler=make_styler(2, 'hist'), xrange=(0, 120), rebin=10) - antiiso_m2JetPt.SetTitle("Anti-iso CR yield") - antiiso_m2JetPt.legendstyle='l' - antiiso_m2JetPt.GetXaxis().SetTitle("#mu_{2} Jet Pt") - plotter.save('data-p1f2p3-m2JetPt') - - antiiso_m1JetPt = plotter.plot('data', 'ss/f1p2p3/m1JetPt', 'hist', styler=make_styler(2, 'hist'), xrange=(0, 120), rebin=10) - antiiso_m1JetPt.SetTitle("Anti-iso CR yield") - antiiso_m1JetPt.legendstyle='l' - antiiso_m1JetPt.GetXaxis().SetTitle("#mu_{1} Jet Pt") - plotter.save('data-f1p2p3-m1JetPt') + if not options.no_mc_data: + ########################################################################### + ## Zmm control plots ##################################################### + ########################################################################### + plotter.set_subdir('mc_data/zmm') - zmm_weighted = plotter.plot('data', 'os/p1p2f3/w3/m1_m2_Mass', 'hist', styler=make_styler(2, 'hist'), xrange=(60, 120)) - zmm_weighted.SetTitle("Z#mu#mu + fake #tau_{h} est.") - zmm_weighted.legendstyle='l' - zmm_weighted.GetXaxis().SetTitle("m_{#mu#mu} (GeV)") - - zmm_unweighted = plotter.plot('data', 'os/p1p2p3/m1_m2_Mass', 'same', styler=make_styler(1), xrange=(60, 120)) - zmm_unweighted.SetTitle("Z#mu#mu observed") - zmm_unweighted.SetTitle("Z#mu#mu + fake #tau_{h} obs.") - zmm_unweighted.legendstyle='pe' - - plotter.add_legend([zmm_weighted, zmm_unweighted]) - plotter.add_cms_blurb(sqrts) - plotter.save('zmm-os-fr-control') - - ## plotter.plot('data', 'os/p1p2p3/prescale', styler=make_styler(1)) - ## plotter.save('zmm-os-prescale-check') - - plotter.plot('Zjets_M50', 'os/p1p2f3/weight') - plotter.save('zmm-mc-event-weights') - # Check MC weights - ## plotter.plot('Zjets_M50', 'os/p1p2f3/weight_nopu') - ## plotter.save('zmm-mc-event-weight_nopu') - - plotter.plot('Zjets_M50', 'os/p1p2f3/nTruePU', 'nTruePU', rebin=1, xaxis='True PU') - plotter.save('zjets-os-p1p2f3-nTruePU') - - - ########################################################################### - ## FR sideband MC-vs-Data ################################################ - ########################################################################### - - plotter.plot_mc_vs_data('ss/p1f2p3', 'm1Pt', rebin=10, xaxis='#mu_{1} p_{T} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-m1Pt') - - plotter.plot_mc_vs_data('ss/p1f2p3', 'm2_t_Mass', rebin=10, xaxis='m_{#mu2#tau} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-subMass') - - plotter.plot_mc_vs_data('ss/p1f2p3/w2', 'm1Pt', rebin=10, xaxis='#mu_{1} p_{T}', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-w2-m1Pt') - - plotter.plot_mc_vs_data('ss/f1p2p3', 'm2_t_Mass', rebin=20, xaxis='m_{#mu2#tau} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-f1p2p3-subMass') - - plotter.plot_mc_vs_data('ss/f1p2p3/w1', 'm2_t_Mass', rebin=20, xaxis='m_{#mu2#tau} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-f1p2p3-w1-subMass') - - plotter.plot_mc_vs_data('ss/p1f2f3', 'm2AbsEta', rebin=10, xaxis='m_{#mu2#tau} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2f3-m2AbsEta') - - plotter.plot_mc_vs_data('ss/p1f2p3', 'm2AbsEta', rebin=10, xaxis='m_{#mu2#tau} (GeV)', leftside=False) - plotter.add_cms_blurb(sqrts) - plotter.save('mcdata-ss-p1f2p3-m2AbsEta') - - - - ########################################################################### - ## Signal region plots ################################################ - ########################################################################### - plotter.set_subdir('') - rebin_slim = [0,20]+range(30, 91, 10)+[110,200] - categories = { - 'LTCut' : [80, 650], - 'LTLow' : [0, 130], - 'LTHigh': [130, 650], - } - - for label, proj_range in categories.iteritems(): - plotter.set_subdir('%s' % label) - plotter.plot_final('m2_t_Mass#LT', rebin_slim, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-%s' % label) - - plotter.plot_final('m2_t_Mass#LT', 200, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-%s-counting' % label, dotc=True, dotroot=True) - - #pt - plotter.plot_final("m1Pt#LT" , 10, xaxis='p_{T#mu_{1}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m1Pt-%s' % label) - - plotter.plot_final("m2Pt#LT" , 10, xaxis='p_{T#mu_{2}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2Pt-%s' % label) - - plotter.plot_final("m1JetPt#LT" , 10, xaxis='p_{T Jet #mu_{1}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m1JetPt-%s' % label) - - plotter.plot_final("m2JetPt#LT" , 10, xaxis='p_{T Jet #mu_{2}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2JetPt-%s' % label) - - plotter.plot_final("tPt#LT" , 10, xaxis='p_{T#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-tPt-%s' % label) - - #eta - plotter.plot_final("m1AbsEta#LT", 10, xaxis='|#eta_{#mu_{1}}|', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m1AbsEta-%s' % label) - - plotter.plot_final("m2AbsEta#LT", 10, xaxis='|#eta_{#mu_{2}}|' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2AbsEta-%s' % label) - - plotter.plot_final("tAbsEta#LT", 10, xaxis='|#eta_{#tau}|' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-tAbsEta-%s' % label) - - #DR - plotter.plot_final("m1_t_DR#LT", 10, xaxis='#DeltaR_{#mu_{1}#tau}', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m1_t_DR-%s' % label) - - plotter.plot_final("m2_t_DR#LT", 10, xaxis='#DeltaR_{#mu_{2}#tau}' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2_t_DR-%s' % label) - - #Jet BTag - - #from pdb import set_trace; set_trace() - plotter.plot_final("m2JetBtag#LT", [-100, -40, 20, 100], xaxis='#mu_{2} Jet Btag' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2JetBtag-%s' % label, dotroot=True) - - plotter.plot_final("m1JetBtag#LT", 1, xaxis='#mu_{1} Jet Btag' , maxy=None, project=proj_range, project_axis='X') + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'm1_m2_Mass', rebin=10, + xaxis='m_{#mu#mu} (GeV)', leftside=False) plotter.add_cms_blurb(sqrts) - plotter.save('final-m1JetBtag-%s' % label) + plotter.save('mcdata-Zmm-m1m2Mass') - plotter.plot_final("m2JetCSVBtag#LT", 1, xaxis='#mu_{2} Jet CSV Btag' , maxy=None, project=proj_range, project_axis='X', x_range=[0,1]) + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'm1Pt#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-m2JetCSVBtag-%s' % label, dotroot=True) + plotter.save('mcdata-Zmm-m1Pt') - plotter.plot_final("m1JetCSVBtag#LT", 1, xaxis='#mu_{1} Jet CSV Btag' , maxy=None, project=proj_range, project_axis='X', x_range=[0,1]) + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'm2Pt#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) plotter.add_cms_blurb(sqrts) - plotter.save('final-m1JetCSVBtag-%s' % label) - - - - #from pdb import set_trace; set_trace() - plotter.plot_final('m2_t_Mass#LT', rebin_slim, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=[0, 130], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTLow') - - plotter.plot_final('m2_t_Mass#LT', rebin_slim, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=[130, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTHigh') - - plotter.plot_final('m2_t_Mass#LT', rebin_slim, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=[80, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTCut') - - plotter.plot_final('m2_t_Mass#LT', 20, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=[80, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-LTCut-flatbin') - - plotter.plot_final('LT', 5, xaxis='LT (GeV)', maxy=15) - plotter.add_cms_blurb(sqrts) - plotter.save('final-LT') - - plotter.plot_final('m1Pt', 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-m1Pt') - - plotter.plot_final('m2Pt', 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2Pt') - - plotter.plot_final('m2Pt', 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2Pt') - - plotter.plot_final('m1AbsEta', 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-m1AbsEta') - - plotter.plot_final('m2AbsEta', 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2AbsEta') - - plotter.plot_final('m2AbsEta', 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2AbsEta') - - plotter.plot_final('m2_t_Mass', 20, xaxis='m_{#mu_{2}#tau} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass') - - plotter.plot_final('m2_t_Mass', 20, xaxis='m_{#mu_{2}#tau} (GeV)', qcd_weight_fraction=1) - plotter.add_cms_blurb(sqrts) - plotter.save('final-qweight-subMass') - - plotter.plot_final('m2_t_Mass', 20, xaxis='m_{#mu_{2}#tau} (GeV)', qcd_weight_fraction=0.5) - plotter.add_cms_blurb(sqrts) - plotter.save('final-qweight05-subMass') - - plotter.plot_final('m2_t_Mass', 20, xaxis='m_{#mu_{2}#tau} (GeV)', show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-werror') - - plotter.plot_final('m2_t_Mass', 20, xaxis='m_{#mu_{2}#tau} (GeV)', - show_error=True, fake_error=0, wz_error=0, zz_error=0) - plotter.add_cms_blurb(sqrts) - plotter.save('final-subMass-wshapeerror') - - plotter.plot_final('m2RelPFIsoDB', 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-m2Iso') - - ########################################################################### - ## WZ enhanced region plots ########################################### - ########################################################################### - plotter.set_subdir('WZ_enhanced') - - plotter.plot_final_wz('m1_t_Mass', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-wz-leadMass') - - plotter.plot_final_wz('m2Pt', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-wz-m2Pt') - - plotter.plot_final_wz('m2JetPt', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-wz-m2JetPt') - - ########################################################################### - ## F3 enhanced region plots ########################################### - ########################################################################### - categories = { - 'LTCut' : [80, 650], - 'LTLow' : [0, 130], - 'LTHigh': [130, 650], - } + plotter.save('mcdata-Zmm-m2Pt') + + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'm1AbsEta#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) + plotter.add_cms_blurb(sqrts) + plotter.save('mcdata-Zmm-m1AbsEta') + + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'm2AbsEta#LT', rebin=10, + xaxis='p_{T}^{#mu1} (GeV)', leftside=False, preprocess=project_x) + plotter.add_cms_blurb(sqrts) + plotter.save('mcdata-Zmm-m2AbsEta') + + # Check PU variables + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'rho') + plotter.save('mcdata-Zmm-rho') + + plotter.plot_mc_vs_data('os/tau_?s/p1p2?3', 'nvtx') + plotter.save('mcdata-Zmm-nvtx') + + if not options.no_wz: + ########################################################################### + ## WZ control plots ##################################################### + ########################################################################### + plotter.set_subdir('mc_data/wz_enhanced') + + plotter.plot_mc_vs_data('ss/tau_os/p1p2p3_enhance_wz', 'm2_t_Mass#LT', xaxis='m_{#mu#mu} (GeV)', + xrange=(0, 120), rebin=10, leftside=False, preprocess=project_x) + plotter.add_cms_blurb(sqrts) + plotter.save('mcdata-ss-p1p2p3-enhance_wz-subMass') + + plotter.plot_mc_vs_data('ss/tau_os/p1p2p3_enhance_wz', 'm1_t_Mass', xaxis='m_{#mu#mu} (GeV)', + xrange=(0, 120), rebin=10, leftside=False, preprocess=project_x) + plotter.add_cms_blurb(sqrts) + plotter.save('mcdata-ss-p1p2p3-enhance_wz-leadMass') + + plotter.set_subdir('WZ_enhanced') + + plotter.plot_final_wz('m1_t_Mass', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') + plotter.add_cms_blurb(sqrts) + plotter.save('final-wz-leadMass') + + plotter.plot_final_wz('m2_t_Mass#LT', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') + plotter.add_cms_blurb(sqrts) + plotter.save('final-wz-subMass') + + plotter.plot_final_wz('m2Pt#LT', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') + plotter.add_cms_blurb(sqrts) + plotter.save('final-wz-m2Pt') + + plotter.plot_final_wz('m2JetPt#LT', 5, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', + project=[0,650], project_axis='X') + plotter.add_cms_blurb(sqrts) + plotter.save('final-wz-m2JetPt') + + if not options.no_signal: + ########################################################################### + ## Signal region plots ################################################ + ########################################################################### + plotter.set_subdir('') + #rebin_slim = range(20, 91, 10)+[110,200] + + for label, proj_range in categories.iteritems(): + for tau_charge in ['tau_os', 'tau_ss']: + if tau_charge == 'tau_os': + plotter.set_subdir('%s' % label) + else: + plotter.set_subdir('%s_charge3' % label) + + plotter.plot_final('m2_t_Mass#LT', rebin_slim, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', differential=True, + yaxis='Events / GeV', show_error=True, tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-%s' % label) + + plotter.plot_final('m2_t_Mass#LT', binning_7TeV, xaxis='m_{#mu_{2}#tau} (GeV)', + project=proj_range, project_axis='X', + yaxis='Events', show_error=True, x_range=[0,199], + maxy=15.6, tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-7TeVBin-%s' % label, verbose=True) + + plotter.plot_final('m2_t_Mass#LT', 300, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, + project=proj_range, project_axis='X', show_error=True, tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-subMass-%s-counting' % label, json=True) #, dotc=True, dotroot=True) + + #pt + #plotter.plot_final("m1Pt#LT" , 10, xaxis='p_{T#mu_{1}} (GeV)', + # maxy=None, project=proj_range, project_axis='X', + # show_error=True, tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m1Pt-%s' % label) + # + #plotter.plot_final("m2Pt#LT" , 10, xaxis='p_{T#mu_{2}} (GeV)', maxy=None, + # project=proj_range, project_axis='X', + # show_error=True, tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m2Pt-%s' % label) + # + #plotter.plot_final("tPt#LT" , 10, xaxis='p_{T#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', + # show_error=True, tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-tPt-%s' % label) + + #plotter.plot_final("m1JetPt#LT" , 10, xaxis='p_{T Jet #mu_{1}} (GeV)', + # maxy=None, project=proj_range, project_axis='X', + # show_error=True, tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m1JetPt-%s' % label) + # + #plotter.plot_final("m2JetPt#LT" , 10, xaxis='p_{T Jet #mu_{2}} (GeV)', + # maxy=None, project=proj_range, project_axis='X', + # show_error=True, tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m2JetPt-%s' % label) + # + #plotter.plot_final("tPt#LT" , 10, xaxis='p_{T#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-tPt-%s' % label) + + #eta + #plotter.plot_final("m1AbsEta#LT", 10, xaxis='|#eta_{#mu_{1}}|', maxy=None, + # project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m1AbsEta-%s' % label) + # + #plotter.plot_final("m2AbsEta#LT", 10, xaxis='|#eta_{#mu_{2}}|' , maxy=None, + # project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m2AbsEta-%s' % label) + # + #plotter.plot_final("tAbsEta#LT", 10, xaxis='|#eta_{#tau}|' , maxy=None, + # project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-tAbsEta-%s' % label) + + #DR + #plotter.plot_final("m1_t_DR#LT", 10, xaxis='#DeltaR_{#mu_{1}#tau}', maxy=None, + # project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m1_t_DR-%s' % label) + # + #plotter.plot_final("m2_t_DR#LT", 10, xaxis='#DeltaR_{#mu_{2}#tau}' , maxy=None, + # project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m2_t_DR-%s' % label) + + #Jet BTag + + #from pdb import set_trace; set_trace() + #plotter.plot_final("m2JetBtag#LT", [-100, -40, 20, 100], xaxis='#mu_{2} Jet Btag' , + # maxy=None, project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m2JetBtag-%s' % label, dotroot=True) + # + #plotter.plot_final("m1JetBtag#LT", 1, xaxis='#mu_{1} Jet Btag' , maxy=None, + # project=proj_range, project_axis='X', show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m1JetBtag-%s' % label) + # + #plotter.plot_final("m2JetCSVBtag#LT", 1, xaxis='#mu_{2} Jet CSV Btag' , maxy=None, + # project=proj_range, project_axis='X', x_range=[0,1], show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m2JetCSVBtag-%s' % label, dotroot=True) + # + #plotter.plot_final("m1JetCSVBtag#LT", 1, xaxis='#mu_{1} Jet CSV Btag' , maxy=None, + # project=proj_range, project_axis='X', x_range=[0,1], show_error=True, + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-m1JetCSVBtag-%s' % label) + + plotter.set_subdir('') + plotter.plot_final('LT', 10, xaxis='LT (GeV)', maxy=15) + plotter.add_cms_blurb(sqrts) + plotter.save('final-LT') + + if not options.no_f3: + ########################################################################### + ## F3 enhanced region plots ########################################### + ########################################################################### + plotter.set_subdir('f3') + #plotter.plot_final_f3('LT', [0, 50, 75, 100, 125, 150, 200, 300, 500], xaxis='LT (GeV)', maxy=None, + # show_ratio=True, fit = { 'model' : ("slope*x + offset", "offset[0, -1, 1], slope[0,-1,1]"), + # 'range' : [50, 500], 'options' : 'QIRMENS', + # 'stat position' : 'bottom-left'}) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-LT-tauOS-chi2', verbose=True) + + plotter.plot_final_f3('LT', [0, 50, 75, 100, 125, 150, 200, 300, 500], xaxis='LT (GeV)', maxy=None, + show_ratio=True, fit = { 'model' : ("slope*x + offset", "offset[0, -1, 1], slope[0,-1,1]"), + 'range' : [50, 500], 'options' : 'WLQIRMENS', + 'stat position' : 'bottom-left'}) + plotter.add_cms_blurb(sqrts) + plotter.save('final-LT-tauOS-likelihood') + + plotter.plot_final_f3('LT', [0, 50, 130, 500], xaxis='LT (GeV)', maxy=None, show_ratio=True) + plotter.add_cms_blurb(sqrts) + plotter.save('final-LT-tauOS-2categories') + + #plotter.plot_final_f3('LT', [0, 50, 75, 100, 125, 150, 200, 300, 500], xaxis='LT (GeV)', tau_charge='tau_ss', + # maxy=None, show_ratio=True, + # fit = {'range' : [50, 500], 'model' : ("slope*x + offset", "offset[0, -1, 1], slope[0,-1,1]")}) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-LT-tauSS') + + plotter.plot_final_f3('LT', [0, 50, 130, 500], xaxis='LT (GeV)', tau_charge='tau_ss', maxy=None, show_ratio=True) + plotter.add_cms_blurb(sqrts) + plotter.save('final-LT-tauSS-2categories') + + for label, proj_range in categories.iteritems(): + for tau_charge in ['tau_os', 'tau_ss']: + if tau_charge == 'tau_os': + plotter.set_subdir('f3/%s' % label) + else: + plotter.set_subdir('f3/%s_charge3' % label) + + plotter.plot_final_f3('m2_t_Mass#LT', rebin_slim, xaxis='m_{#mu_{2}#tau} (GeV)', + maxy=None, project=proj_range, project_axis='X', differential=True, + show_error=True, tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-%s' % label) + + plotter.plot_final_f3('m2_t_Mass#LT', binning_7TeV, xaxis='m_{#mu_{2}#tau} (GeV)', + maxy=None, project=proj_range, project_axis='X', differential=True, + show_error=True, tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-7TeVBin-%s' % label) + + plotter.plot_final_f3('m2_t_Mass#LT', 300, xaxis='m_{#mu_{2}#tau} (GeV)', + maxy=None, project=proj_range, project_axis='X', + tau_charge=tau_charge) + plotter.add_cms_blurb(sqrts) + plotter.save('final-f3-subMass-%s-counting' % label, json=True, verbose=True) + + #pt + #plotter.plot_final_f3("m1Pt#LT" , 10, xaxis='p_{T#mu_{1}} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m1Pt-%s' % label) + # + #plotter.plot_final_f3("m2Pt#LT" , 10, xaxis='p_{T#mu_{2}} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m2Pt-%s' % label) + # + #plotter.plot_final_f3("tPt#LT", 10, xaxis='p_{T#tau} (GeV)', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-tPt-%s' % label) + # + ##plotter.plot_final_f3("m1JetPt#LT" , 10, xaxis='p_{T Jet #mu_{1}} (GeV)', + ## maxy=None, project=proj_range, project_axis='X', + ## tau_charge=tau_charge) + ##plotter.add_cms_blurb(sqrts) + ##plotter.save('final-f3-m1JetPt-%s' % label) + ## + ##plotter.plot_final_f3("m2JetPt#LT" , 10, xaxis='p_{T Jet #mu_{2}} (GeV)', + ## maxy=None, project=proj_range, project_axis='X', + ## tau_charge=tau_charge) + ##plotter.add_cms_blurb(sqrts) + ##plotter.save('final-f3-m2JetPt-%s' % label) + # + ##eta + #plotter.plot_final_f3("m1AbsEta#LT", 10, xaxis='|#eta_{#mu_{1}}|', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m1AbsEta-%s' % label) + # + #plotter.plot_final_f3("m2AbsEta#LT", 10, xaxis='|#eta_{#mu_{2}}|', maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m2AbsEta-%s' % label) + # + #plotter.plot_final_f3("tAbsEta#LT", 10, xaxis='|#eta_{#tau}|' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-tAbsEta-%s' % label) + + #DR + #plotter.plot_final_f3("m1_t_DR#LT", 5, xaxis='#DeltaR_{#mu_{1}#tau}', + # maxy=None, project=proj_range, project_axis='X', + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m1_t_DR-%s' % label) + # + #plotter.plot_final_f3("m2_t_DR#LT", 5, xaxis='#DeltaR_{#mu_{2}#tau}' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m2_t_DR-%s' % label) + + #Jet BTag - for label, proj_range in categories.iteritems(): - plotter.set_subdir('f3/%s' % label) - plotter.plot_final_f3('m2_t_Mass#LT', rebin_slim, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-%s' % label) - - plotter.plot_final_f3('m2_t_Mass#LT', 200, xaxis='m_{#mu_{2}#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-%s-counting' % label, dotc=True, dotroot=True) - - #pt - plotter.plot_final_f3("m1Pt#LT" , 10, xaxis='p_{T#mu_{1}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1Pt-%s' % label) - - plotter.plot_final_f3("m2Pt#LT" , 10, xaxis='p_{T#mu_{2}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2Pt-%s' % label) - - plotter.plot_final_f3("m1JetPt#LT" , 10, xaxis='p_{T Jet #mu_{1}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1JetPt-%s' % label) - - plotter.plot_final_f3("m2JetPt#LT" , 10, xaxis='p_{T Jet #mu_{2}} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2JetPt-%s' % label) - - plotter.plot_final_f3("tPt#LT" , 10, xaxis='p_{T#tau} (GeV)', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tPt-%s' % label) - - #eta - plotter.plot_final_f3("m1AbsEta#LT", 10, xaxis='|#eta_{#mu_{1}}|', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1AbsEta-%s' % label) - - plotter.plot_final_f3("m2AbsEta#LT", 10, xaxis='|#eta_{#mu_{2}}|' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2AbsEta-%s' % label) - - plotter.plot_final_f3("tAbsEta#LT", 10, xaxis='|#eta_{#tau}|' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-tAbsEta-%s' % label) - - #DR - plotter.plot_final_f3("m1_t_DR#LT", 10, xaxis='#DeltaR_{#mu_{1}#tau}', maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1_t_DR-%s' % label) - - plotter.plot_final_f3("m2_t_DR#LT", 10, xaxis='#DeltaR_{#mu_{2}#tau}' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2_t_DR-%s' % label) - - #Jet BTag - - #from pdb import set_trace; set_trace() - plotter.plot_final_f3("m2JetBtag#LT", [-100, -40, 20, 100], xaxis='#mu_{2} Jet Btag' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2JetBtag-%s' % label, dotroot=True) - - plotter.plot_final_f3("m1JetBtag#LT", 1, xaxis='#mu_{1} Jet Btag' , maxy=None, project=proj_range, project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1JetBtag-%s' % label) - - plotter.plot_final_f3("m2JetCSVBtag#LT", 1, xaxis='#mu_{2} Jet CSV Btag' , maxy=None, project=proj_range, project_axis='X', x_range=[0,1]) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2JetCSVBtag-%s' % label, dotroot=True) - - plotter.plot_final_f3("m1JetCSVBtag#LT", 1, xaxis='#mu_{1} Jet CSV Btag' , maxy=None, project=proj_range, project_axis='X', x_range=[0,1]) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1JetCSVBtag-%s' % label) + #from pdb import set_trace; set_trace() + #plotter.plot_final_f3("m2JetBtag#LT", [-100, -40, 20, 100], xaxis='#mu_{2} Jet Btag', + # maxy=None, project=proj_range, project_axis='X', + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m2JetBtag-%s' % label, dotroot=True) + # + #plotter.plot_final_f3("m1JetBtag#LT", 1, xaxis='#mu_{1} Jet Btag' , maxy=None, + # project=proj_range, project_axis='X', tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m1JetBtag-%s' % label) + # + #plotter.plot_final_f3("m2JetCSVBtag#LT", 1, xaxis='#mu_{2} Jet CSV Btag', maxy=None, + # project=proj_range, project_axis='X', x_range=[0,1], + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m2JetCSVBtag-%s' % label, dotroot=True) + # + #plotter.plot_final_f3("m1JetCSVBtag#LT", 1, xaxis='#mu_{1} Jet CSV Btag', maxy=None, + # project=proj_range, project_axis='X', x_range=[0,1], + # tau_charge=tau_charge) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-m1JetCSVBtag-%s' % label) + + #TAU ISO + #plotter.plot_final_f3("tRawIso3Hits#LT", [0,5,10,15,20,25,30,35,40,50,60,120,200], + # xaxis='#tau 3Hits Raw Iso', maxy=None, + # project=proj_range, project_axis='X', + # tau_charge=tau_charge, show_ratio=True, + # fit = { 'model' : ("slope*x + offset", "offset[0, -1, 1], slope[0,-1,1]"), + # 'options' : 'WLQIRMENS', + # 'stat position' : 'bottom-right'}) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-tRawIso3Hits-Likelihood-%s' % label) + # + #plotter.plot_final_f3("tRawIso3Hits#LT", [0,5,10,15,20,25,30,35,40,50,60,120,200], + # xaxis='#tau 3Hits Raw Iso', maxy=None, + # project=proj_range, project_axis='X', + # tau_charge=tau_charge, show_ratio=True, + # fit = { 'model' : ("slope*x + offset", "offset[0, -1, 1], slope[0,-1,1]"), + # 'options' : 'QIRMENS', + # 'stat position' : 'bottom-right'}) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-tRawIso3Hits-chi2-%s' % label) + # + #plotter.plot_final_f3("tRawIso3Hits#LT", [0,5,10,15,20,25,30,35,40,50,60,120,200], + # xaxis='#tau 3Hits Raw Iso', maxy=None, project=proj_range, + # project_axis='X', tau_charge=tau_charge, show_ratio=True, + # wz_error=0., zz_error =0.) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-f3-tRawIso3Hits-noDibosonErr-%s' % label) + #END OF if not options.dry_run: - plotter.set_subdir('f3') - plotter.plot_final_f3('LT', 5, xaxis='LT (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-LT') - - plotter.plot_final_f3('m1_t_Mass', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-leadMass') - - plotter.plot_final_f3('m2_t_Mass', 20, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', qcd_correction=False, qcd_weight_fraction=0, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-wjetfake-subMass') - - plotter.plot_final_f3('m2_t_Mass', 20, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', qcd_correction=False, qcd_weight_fraction=1, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-qcdfake-subMass') - - plotter.plot_final_f3("m2JetBtag#LT", 4, xaxis='#mu_{2} Jet Btag' , maxy=None, project=[0, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2JetBtag') - - plotter.plot_final_f3("m1JetBtag#LT", 4, xaxis='#mu_{1} Jet Btag' , maxy=None, project=[0, 650], project_axis='X') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1JetBtag') - - plotter.plot_final_f3('m2_t_Mass', 20, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', qcd_correction=False, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass') - - plotter.plot_final_f3('m2_t_Mass', 200, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', qcd_correction=False, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-subMass-counting-like', dotc=True, dotroot=True) - - plotter.plot_final_f3_split('m2_t_Mass', 10, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-split-subMass') - - plotter.plot_final_f3('m1Pt', 5, xaxis='p_{T#mu_{1}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1Pt') - - plotter.plot_final_f3('m1JetPt', 5, xaxis='p_{TJet#mu_{1}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1JetPt') - - plotter.plot_final_f3('m1AbsEta', 10, xaxis='|#eta_{#mu_{1}}| (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1AbsEta') - - plotter.plot_final_f3('m2Pt', 5, xaxis='p_{T#mu_{2}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2Pt') - - plotter.plot_final_f3('m2JetPt', 5, xaxis='p_{TJet#mu_{2}} (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2JetPt') - - plotter.plot_final_f3('m2AbsEta', 10, xaxis='|#eta_{#mu_{2}}| (GeV)') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2AbsEta') - - plotter.plot_final_f3('m1_t_DR', 5, xaxis='#DeltaR_{#mu_{1}#tau}') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m1_t_DR') - - plotter.plot_final_f3('m2_t_DR', 5, xaxis='#DeltaR_{#mu_{2}#tau}') - plotter.add_cms_blurb(sqrts) - plotter.save('final-f3-m2_t_DR') - + if not options.no_shapes: ########################################################################### - ## Check QCD contamination in control regions ############################ + ## Making shape file ################################################# ########################################################################### - plotter.set_subdir('qcd_contamination') - - plotter.plot_qcd_contamination('m2_t_Mass', 2, 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-qcd2-subMass') - - plotter.plot_qcd_contamination('m2_t_Mass', 1, 20) - plotter.add_cms_blurb(sqrts) - plotter.save('final-qcd1-subMass') - - plotter.plot_qcd_contamination('m2JetPt', 2, 10) - plotter.add_cms_blurb(sqrts) - plotter.save('final-qcd2-m2JetPt') - - plotter.plot_qcd_contamination('m1JetPt', 1, 20) - plotter.add_cms_blurb(sqrts) - plotter.save('final-qcd1-m1JetPt') - - #END OF if not options.dry_run: - ########################################################################### - ## Making shape file ################################################# - ########################################################################### - plotter.set_subdir('') - prefixes = [options.prefix+'$'] if options.prefix else [''] - prefixes = [i+'$' for i in options.prefixes.split(',') if i] if options.prefixes else prefixes - for prefix in prefixes: - plotter.plot_final(prefix+'m2_t_Mass', 20, xaxis='m_{#mu_{2}#tau} (GeV)', qcd_weight_fraction=0.5) - plotter.add_cms_blurb(sqrts) - plotter.save('final-%s-qweight05-subMass' % options.prefix) - - plotter.plot_final_f3(prefix+'m2_t_Mass', 20, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', qcd_correction=False, qcd_weight_fraction=0.5, show_error=True) - plotter.add_cms_blurb(sqrts) - plotter.save('final-%s-f3-qweight05-subMass' % options.prefix) - - shape_prefix = prefix if len(prefixes) > 1 else '' - shape_prefix = shape_prefix.replace(':','_').replace('$','_') - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, 'LTCut_mmt_shapes_%s.root' % ( plotter.period) ), 'RECREATE') - shape_dir = shape_file.mkdir('mmtCatHigh') - plotter.write_shapes(prefix+'m2_t_Mass#LT', 20, shape_dir, qcd_fraction=0.5, project=[80, 650], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatHigh_w') - plotter.write_shapes(prefix+'m2_t_Mass#LT', 20, shape_dir, qcd_fraction=0.0, project=[80, 650], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatHigh_q') - plotter.write_shapes(prefix+'m2_t_Mass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') - shape_file.Close() - - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, '%smmt_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') - - shape_dir = shape_file.mkdir('mmtCatLow') - plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatLow_w') - plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatLow_q') - plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') - - shape_dir = shape_file.mkdir('mmtCatHigh') - plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatHigh_w') - plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatHigh_q') - plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') - - logging.warning('shape file %s created' % shape_file.GetName()) - shape_file.Close() - - - - shape_file = ROOT.TFile( - os.path.join(plotter.outputdir, '%smmt_f3_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') - - shape_dir = shape_file.mkdir('mmtCatLow') - plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatLow_w') - plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatLow_q') - plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') - - shape_dir = shape_file.mkdir('mmtCatHigh') - plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.5, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatHigh_w') - plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') - shape_dir = shape_file.mkdir('mmtCatHigh_q') - plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') - - logging.warning('shape file %s created' % shape_file.GetName()) - shape_file.Close() + plotter.set_subdir('') + prefixes = [options.prefix+'$'] if options.prefix else [''] + prefixes = [i+'$' for i in options.prefixes.split(',') if i] if options.prefixes else prefixes + for prefix in prefixes: + #plotter.plot_final(prefix+'m2_t_Mass', 20, xaxis='m_{#mu_{2}#tau} (GeV)', qcd_weight_fraction=0.5) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-%s-qweight05-subMass' % options.prefix) + # + #plotter.plot_final_f3(prefix+'m2_t_Mass', 20, xaxis='m_{#mu_{1}#tau_{#mu}} (GeV)', qcd_correction=False, qcd_weight_fraction=0.5, show_error=True) + #plotter.add_cms_blurb(sqrts) + #plotter.save('final-%s-f3-qweight05-subMass' % options.prefix) + + shape_prefix = prefix if len(prefixes) > 1 else '' + shape_prefix = shape_prefix.replace(':','_').replace('$','_') + binning_7TeV = [0,40,80,120,200] + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTCut_mmt_shapes_%s.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('mmt') + plotter.write_shapes(prefix+'m2_t_Mass#LT', binning_7TeV, shape_dir, qcd_fraction=0., project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHigh_w') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', 20, shape_dir, qcd_fraction=-1., project=[80, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHigh_q') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', 20, shape_dir, qcd_fraction=1.0, project=[80, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, 'LTAll_mmt_shapes_%s.root' % ( plotter.period) ), 'RECREATE') + shape_dir = shape_file.mkdir('mmt') + plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmt_w') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[0, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmt_q') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + #rebin_slim = range(20, 91, 10)+[110,200] + shape_file = ROOT.TFile( + os.path.join(plotter.outputdir, '%smmt_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + + shape_dir = shape_file.mkdir('mmtCatLow') + plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatLow_w') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatLow_q') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + + shape_dir = shape_file.mkdir('mmtCatHigh') + plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0., project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHigh_w') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHigh_q') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + + logging.warning('shape file %s created' % shape_file.GetName()) + shape_file.Close() + + + #shape_file = ROOT.TFile( + # os.path.join(plotter.outputdir, '%smmt_f3_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + # + #shape_dir = shape_file.mkdir('mmtCatLow') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + ##shape_dir = shape_file.mkdir('mmtCatLow_w') + ##plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[0., 130], project_axis='X') + ##shape_dir = shape_file.mkdir('mmtCatLow_q') + ##plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('mmtCatHigh') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + ##shape_dir = shape_file.mkdir('mmtCatHigh_w') + ##plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[130, 650], project_axis='X') + ##shape_dir = shape_file.mkdir('mmtCatHigh_q') + ##plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #logging.warning('shape file %s created' % shape_file.GetName()) + #shape_file.Close() + # + #shape_file = ROOT.TFile( + # os.path.join(plotter.outputdir, '%smmt_f3_all_shapes_%s.root' % (shape_prefix, plotter.period) ), 'RECREATE') + # + #shape_dir = shape_file.mkdir('mmtCatLow') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatLow_w') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatLow_q') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('mmtCatHigh') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHigh_w') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHigh_q') + #plotter.write_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #shape_dir = shape_file.mkdir('mmtCatLowf3') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatLowf3_w') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[0., 130], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatLowf3_q') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[0., 130], project_axis='X') + # + #shape_dir = shape_file.mkdir('mmtCatHighf3') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=0.0, project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHighf3_w') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=-1., project=[130, 650], project_axis='X') + #shape_dir = shape_file.mkdir('mmtCatHighf3_q') + #plotter.write_f3_shapes(prefix+'m2_t_Mass#LT', rebin_slim, shape_dir, qcd_fraction=1.0, project=[130, 650], project_axis='X') + # + #logging.warning('shape file %s created' % shape_file.GetName()) + #shape_file.Close() diff --git a/wh/baseSelections.py b/wh/baseSelections.py index 2e16cf93..fac2065f 100755 --- a/wh/baseSelections.py +++ b/wh/baseSelections.py @@ -11,23 +11,31 @@ def splitEid(label): return label.split('_')[-1], label.split('_')[0] #OBJECT SELECTION -def muSelection(row, name): +def muSelection(row, name, tracker=None): if getattr( row, getVar(name,'Pt')) < 10: return False + if tracker: tracker.Fill('muon Pt') + if getattr( row, getVar(name,'AbsEta')) > 2.4: return False + if tracker: tracker.Fill('muon AbsEta') + if not getattr( row, getVar(name,'PixHits')): return False + if tracker: tracker.Fill('muon PixHits') + if getattr( row, getVar(name,'JetCSVBtag')) > 0.8: return False - #if getattr( row, getVar(name,'JetBtag')) > 3.3: return False #was 3.3 + if tracker: tracker.Fill('muon JetCSVBtag') + if abs(getattr( row, getVar(name,'DZ'))) > 0.2: return False + if tracker: tracker.Fill('muon DZ') + return True def eSelection(row, name): if getattr( row, getVar(name,'Pt')) < 10: return False if getattr( row, getVar(name,'AbsEta')) > 2.5: return False if getattr( row, getVar(name,'MissingHits')): return False - if getattr( row, getVar(name,'HasConversion')): return False + if getattr( row, getVar(name,'HasMatchedConversion')): return False if not getattr( row, getVar(name,'ChargeIdTight')): return False if getattr( row, getVar(name,'JetCSVBtag')) > 0.8: return False - #if getattr( row, getVar(name,'JetBtag')) > 3.3: return False if abs(getattr( row, getVar(name,'DZ'))) > 0.2: return False return True @@ -35,16 +43,27 @@ def tauSelection(row, name): if getattr( row, getVar(name,'Pt')) < 20: return False if getattr( row, getVar(name,'AbsEta')) > 2.3: return False if abs(getattr( row, getVar(name,'DZ'))) > 0.2: return False + if getattr( row, + getVar( name, + 'ElectronPt10IdIsoVtxOverlap') + ): return False return True #VETOS -def vetos(row): +def vetos(row, tracker=None, bveto=True): if row.muVetoPt5IsoIdVtx: return False - if row.bjetCSVVetoZHLike: return False - #if row.bjetCSVVeto: return False + if tracker: tracker.Fill('muon veto') + + if bveto: + if row.bjetCSVVetoZHLike: return False + if tracker: tracker.Fill('bjet veto') + if row.eVetoMVAIsoVtx: return False + if tracker: tracker.Fill('electron veto') + if row.tauVetoPt20Loose3HitsVtx: return False + if tracker: tracker.Fill('tau veto') return True def lepton_id_iso(row, name, label): #label in the format eidtype_isotype @@ -68,8 +87,8 @@ def lepton_id_iso(row, name, label): #label in the format eidtype_isotype def control_region_ee(row): '''Figure out what control region we are in. Shared among two codes, to avoid mismatching copied here''' - if row.e1_e2_SS and lepton_id_iso(row, 'e1', 'eid12Medium_h2taucuts') and row.e1MtToMET > 30: - return 'wjets' + if row.e1_e2_SS and lepton_id_iso(row, 'e1', 'eid12Medium_h2taucuts') and row.e1MtToMET > 35: + return 'wjetsLtLow' elif row.e1_e2_SS and row.e1RelPFIsoDB > 0.3 and row.type1_pfMetEt < 25: #and row.metSignificance < 3: # return 'qcd' elif lepton_id_iso(row,'e1', 'eid12Medium_h2taucuts') and lepton_id_iso(row,'e2', 'eid12Medium_h2taucuts') \ diff --git a/wh/card_config/cgs.conf.eet.7TeV b/wh/card_config/cgs.conf.eet.7TeV new file mode 100644 index 00000000..32f2fff9 --- /dev/null +++ b/wh/card_config/cgs.conf.eet.7TeV @@ -0,0 +1,19 @@ +# cgs.config: Specification of groups, categories, and samples + +#$ GROUP signal Higgs_vtth_sm_120,Higgs_gf_sm_120,Higgs_vbf_sm_120 +#$ GROUP background Ztt,ttbar,EWK,Fakes +#categories: emu_vbf +#signals: signal +#backgrounds: background +#data: data_obs + +$ GROUP signal WH +#,WH_hww +$ GROUP background wz,zz,fakes,WH_hww125 +$ GROUP simulated WH,wz,zz,WH_hww125 +#,WH_hww + +categories: eetCatHigh,eetCatLow +signals: signal +backgrounds: background +data: data_obs diff --git a/wh/card_config/cgs.conf.eet.8TeV b/wh/card_config/cgs.conf.eet.8TeV index 317982bb..c70fa4f5 100644 --- a/wh/card_config/cgs.conf.eet.8TeV +++ b/wh/card_config/cgs.conf.eet.8TeV @@ -7,9 +7,9 @@ #backgrounds: background #data: data_obs -$ GROUP signal WH,WH_hww -$ GROUP all_background wz,zz,fakes,charge_fakes -$ GROUP simulated WH,wz,zz,WH_hww +$ GROUP signal WH +$ GROUP all_background wz,zz,fakes,charge_fakes,WH_hww125 +$ GROUP simulated WH,wz,zz,WH_hww125 categories: eetCatHigh,eetCatLow signals: signal diff --git a/wh/card_config/cgs.conf.emt.7TeV b/wh/card_config/cgs.conf.emt.7TeV new file mode 100644 index 00000000..381f2a15 --- /dev/null +++ b/wh/card_config/cgs.conf.emt.7TeV @@ -0,0 +1,19 @@ +# cgs.config: Specification of groups, categories, and samples + +#$ GROUP signal Higgs_vtth_sm_120,Higgs_gf_sm_120,Higgs_vbf_sm_120 +#$ GROUP background Ztt,ttbar,EWK,Fakes +#categories: emu_vbf +#signals: signal +#backgrounds: background +#data: data_obs + +$ GROUP signal WH +# +$ GROUP background wz,zz,fakes,WH_hww125 +$ GROUP simulated WH,wz,zz,WH_hww125 +#,WH_hww + +categories: emtCatHigh,emtCatLow +signals: signal +backgrounds: background +data: data_obs diff --git a/wh/card_config/cgs.conf.emt.8TeV b/wh/card_config/cgs.conf.emt.8TeV index 7a41f0a7..07e64400 100644 --- a/wh/card_config/cgs.conf.emt.8TeV +++ b/wh/card_config/cgs.conf.emt.8TeV @@ -7,9 +7,9 @@ #backgrounds: background #data: data_obs -$ GROUP signal WH,WH_hww -$ GROUP all_background wz,zz,fakes,charge_fakes -$ GROUP simulated WH,wz,zz,WH_hww +$ GROUP signal WH +$ GROUP all_background wz,zz,fakes,charge_fakes,WH_hww125 +$ GROUP simulated WH,wz,zz,WH_hww125 categories: emtCatHigh,emtCatLow signals: signal diff --git a/wh/card_config/cgs.conf.mmt.7TeV b/wh/card_config/cgs.conf.mmt.7TeV new file mode 100644 index 00000000..d64b07c8 --- /dev/null +++ b/wh/card_config/cgs.conf.mmt.7TeV @@ -0,0 +1,19 @@ +# cgs.config: Specification of groups, categories, and samples + +#$ GROUP signal Higgs_vtth_sm_120,Higgs_gf_sm_120,Higgs_vbf_sm_120 +#$ GROUP background Ztt,ttbar,EWK,Fakes +#categories: emu_vbf +#signals: signal +#backgrounds: background +#data: data_obs + +$ GROUP signal WH +#, +$ GROUP background wz,zz,fakes,WH_hww125 +$ GROUP simulated WH,wz,zz,WH_hww125 +#,WH_hww + +categories: mmtCatHigh,mmtCatLow +signals: signal +backgrounds: background +data: data_obs diff --git a/wh/card_config/cgs.conf.mmt.8TeV b/wh/card_config/cgs.conf.mmt.8TeV index bad4fb30..aa3d1bf9 100644 --- a/wh/card_config/cgs.conf.mmt.8TeV +++ b/wh/card_config/cgs.conf.mmt.8TeV @@ -7,9 +7,9 @@ #backgrounds: background #data: data_obs -$ GROUP signal WH,WH_hww -$ GROUP background wz,zz,fakes -$ GROUP simulated WH,wz,zz,WH_hww +$ GROUP signal WH +$ GROUP background wz,zz,fakes,WH_hww125 +$ GROUP simulated WH,wz,zz,WH_hww125 categories: mmtCatHigh,mmtCatLow signals: signal diff --git a/wh/card_config/unc.conf.eet.7TeV b/wh/card_config/unc.conf.eet.7TeV new file mode 100644 index 00000000..06257e08 --- /dev/null +++ b/wh/card_config/unc.conf.eet.7TeV @@ -0,0 +1,23 @@ +# unc.config: Specification of uncertainty parameter names and types +# Example: +# lumi lnN +# some_sb_parameter gmN 1000 +# some_shape_parameter shape + +lumi_7TeV lnN + +CMS_trigger_e lnN + +CMS_eff_e lnN +CMS_eff_t lnN + +CMS_fake_b_7TeV lnN + +CMS_scale_t lnN + +CMS_vhtt_eet_fakes_7TeV lnN +CMS_vhtt_eet_chargeFlip_7TeV shape + +pdf_qqbar lnN +QCDscale_VH lnN +QCDscale_VV lnN diff --git a/wh/card_config/unc.conf.eet.8TeV b/wh/card_config/unc.conf.eet.8TeV index 944955bc..7c64358b 100644 --- a/wh/card_config/unc.conf.eet.8TeV +++ b/wh/card_config/unc.conf.eet.8TeV @@ -6,6 +6,8 @@ lumi_8TeV lnN +CMS_trigger_e lnN + CMS_eff_e lnN CMS_eff_t lnN @@ -14,9 +16,6 @@ CMS_fake_b_8TeV lnN CMS_scale_t lnN CMS_vhtt_eet_fakes_8TeV lnN -#CMS_vhtt_eet_fakes_8TeV lnN -#CMS_vhtt_eetCatLow_fakes_8TeV lnN -#CMS_vhtt_eetCatHigh_fakes_8TeV lnN CMS_vhtt_eet_chargeFlip_8TeV shape @@ -24,5 +23,3 @@ pdf_qqbar lnN QCDscale_VH lnN QCDscale_VV lnN -# Only for testing. -#CMS_vhtt_llt_fakes lnN diff --git a/wh/card_config/unc.conf.emt.7TeV b/wh/card_config/unc.conf.emt.7TeV new file mode 100644 index 00000000..2809be5f --- /dev/null +++ b/wh/card_config/unc.conf.emt.7TeV @@ -0,0 +1,27 @@ +# unc.config: Specification of uncertainty parameter names and types +# Example: +# lumi lnN +# some_sb_parameter gmN 1000 +# some_shape_parameter shape + +lumi_7TeV lnN + +CMS_trigger_em lnN + +CMS_eff_e lnN +CMS_eff_m lnN +CMS_eff_t lnN + +CMS_fake_b_7TeV lnN + +CMS_scale_t lnN + +CMS_vhtt_emt_fakes_7TeV lnN +CMS_vhtt_emt_chargeFlip_7TeV shape + +pdf_qqbar lnN +QCDscale_VH lnN +QCDscale_VV lnN + +# Only for testing. +CMS_vhtt_llt_fakes lnN diff --git a/wh/card_config/unc.conf.emt.8TeV b/wh/card_config/unc.conf.emt.8TeV index e071e1a5..a448dd44 100644 --- a/wh/card_config/unc.conf.emt.8TeV +++ b/wh/card_config/unc.conf.emt.8TeV @@ -6,6 +6,8 @@ lumi_8TeV lnN +CMS_trigger_em lnN + CMS_eff_e lnN CMS_eff_m lnN CMS_eff_t lnN diff --git a/wh/card_config/unc.conf.mmt.7TeV b/wh/card_config/unc.conf.mmt.7TeV new file mode 100644 index 00000000..e9dc8834 --- /dev/null +++ b/wh/card_config/unc.conf.mmt.7TeV @@ -0,0 +1,23 @@ +# unc.config: Specification of uncertainty parameter names and types +# Example: +# lumi lnN +# some_sb_parameter gmN 1000 +# some_shape_parameter shape + +lumi_7TeV lnN + +CMS_trigger_m lnN + +CMS_eff_m lnN +CMS_eff_t lnN + +CMS_fake_b_7TeV lnN + +CMS_scale_t lnN + +CMS_vhtt_mmt_fakes_7TeV lnN + +pdf_qqbar lnN +QCDscale_VH lnN +QCDscale_VV lnN + diff --git a/wh/card_config/unc.conf.mmt.8TeV b/wh/card_config/unc.conf.mmt.8TeV index be49adf7..6f1268f3 100644 --- a/wh/card_config/unc.conf.mmt.8TeV +++ b/wh/card_config/unc.conf.mmt.8TeV @@ -6,6 +6,8 @@ lumi_8TeV lnN +CMS_trigger_m lnN + CMS_eff_m lnN CMS_eff_t lnN @@ -14,12 +16,8 @@ CMS_fake_b_8TeV lnN CMS_scale_t lnN CMS_vhtt_mmt_fakes_8TeV lnN -#CMS_vhtt_mmtCatHigh_fakes_8TeV lnN -#CMS_vhtt_mmtCatLow_fakes_8TeV lnN pdf_qqbar lnN QCDscale_VH lnN QCDscale_VV lnN -# Only for testing. -#CMS_vhtt_llt_fakes lnN diff --git a/wh/card_config/unc.vals.eet.7TeV b/wh/card_config/unc.vals.eet.7TeV new file mode 100644 index 00000000..9f6e0ec6 --- /dev/null +++ b/wh/card_config/unc.vals.eet.7TeV @@ -0,0 +1,32 @@ +########################################################################### +# unc.vals: specification of uncertainty values by category, sample, and uncertainty name +# Example: +# emu_vbf,emu_novbf,emu_boost signal,EWK lumi 1.045 + +eetCatLow,eetCatHigh simulated lumi_7TeV 1.022 + +# Trigger uncertainties +eetCatLow,eetCatHigh simulated CMS_trigger_e 1.01 + +# Efficiency uncertainties +eetCatLow,eetCatHigh simulated CMS_eff_e 1.04 +eetCatLow,eetCatHigh simulated CMS_eff_t 1.06 + +# Scale uncertainties +eetCatLow,eetCatHigh simulated CMS_scale_t 1.03 + +# Efficiency of b-jet veto +eetCatLow,eetCatHigh simulated CMS_fake_b_7TeV 1.01 + +# Background uncertainties - due to the theoretical unc. on the xsection +eetCatLow,eetCatHigh zz pdf_qqbar 1.033 +eetCatLow,eetCatHigh zz QCDscale_VV 1.023 + +eetCatLow,eetCatHigh wz pdf_qqbar 1.04 +eetCatLow,eetCatHigh wz QCDscale_VV 1.04 + +eetCatLow,eetCatHigh signal pdf_qqbar 1.026 +eetCatLow,eetCatHigh signal QCDscale_VH 1.009 + +#charge flip uncertainty +eetCatLow,eetCatHigh charge_fakes CMS_vhtt_eet_chargeFlip_7TeV 1.0 \ No newline at end of file diff --git a/wh/card_config/unc.vals.eet.8TeV b/wh/card_config/unc.vals.eet.8TeV index 79f1e01d..515bfc51 100644 --- a/wh/card_config/unc.vals.eet.8TeV +++ b/wh/card_config/unc.vals.eet.8TeV @@ -3,11 +3,14 @@ # Example: # emu_vbf,emu_novbf,emu_boost signal,EWK lumi 1.045 -eetCatLow,eetCatHigh simulated lumi_8TeV 1.042 +eetCatLow,eetCatHigh simulated lumi_8TeV 1.026 + +# Trigger uncertainties +eetCatLow,eetCatHigh simulated CMS_trigger_e 1.01 # Efficiency uncertainties -eetCatLow,eetCatHigh simulated CMS_eff_e 1.02 -eetCatLow,eetCatHigh simulated CMS_eff_t 1.08 +eetCatLow,eetCatHigh simulated CMS_eff_e 1.04 +eetCatLow,eetCatHigh simulated CMS_eff_t 1.06 # Scale uncertainties eetCatLow,eetCatHigh simulated CMS_scale_t 1.03 @@ -22,8 +25,8 @@ eetCatLow,eetCatHigh zz QCDscale_VV 1.023 eetCatLow,eetCatHigh wz pdf_qqbar 1.04 eetCatLow,eetCatHigh wz QCDscale_VV 1.04 -eetCatLow,eetCatHigh signal pdf_qqbar 1.034 -eetCatLow,eetCatHigh signal QCDscale_VH 1.004 +eetCatLow,eetCatHigh signal pdf_qqbar 1.023 +eetCatLow,eetCatHigh signal QCDscale_VH 1.01 #charge flip uncertainty eetCatLow,eetCatHigh charge_fakes CMS_vhtt_eet_chargeFlip_8TeV 1.0 \ No newline at end of file diff --git a/wh/card_config/unc.vals.emt.7TeV b/wh/card_config/unc.vals.emt.7TeV new file mode 100644 index 00000000..581895ff --- /dev/null +++ b/wh/card_config/unc.vals.emt.7TeV @@ -0,0 +1,33 @@ +########################################################################### +# unc.vals: specification of uncertainty values by category, sample, and uncertainty name +# Example: +# emu_vbf,emu_novbf,emu_boost signal,EWK lumi 1.045 + +emtCatHigh,emtCatLow simulated lumi_7TeV 1.022 + +# Trigger uncertainties +emtCatHigh,emtCatLow simulated CMS_trigger_em 1.01 + +# Efficiency uncertainties +emtCatHigh,emtCatLow simulated CMS_eff_e 1.02 +emtCatHigh,emtCatLow simulated CMS_eff_m 1.02 +emtCatHigh,emtCatLow simulated CMS_eff_t 1.08 + +# Scale uncertainties +emtCatHigh,emtCatLow simulated CMS_scale_t 1.03 + +# Efficiency of b-jet veto +emtCatHigh,emtCatLow simulated CMS_fake_b_7TeV 1.01 + +# Background uncertainties - due to the theoretical unc. on the xsection +emtCatHigh,emtCatLow zz pdf_qqbar 1.033 +emtCatHigh,emtCatLow zz QCDscale_VV 1.023 + +emtCatHigh,emtCatLow wz pdf_qqbar 1.04 +emtCatHigh,emtCatLow wz QCDscale_VV 1.04 + +emtCatHigh,emtCatLow signal pdf_qqbar 1.026 +emtCatHigh,emtCatLow signal QCDscale_VH 1.009 + +#charge flip uncertainty +emtCatHigh,emtCatLow charge_fakes CMS_vhtt_emt_chargeFlip_7TeV 1.0 diff --git a/wh/card_config/unc.vals.emt.8TeV b/wh/card_config/unc.vals.emt.8TeV index d42a8ab1..15590606 100644 --- a/wh/card_config/unc.vals.emt.8TeV +++ b/wh/card_config/unc.vals.emt.8TeV @@ -3,12 +3,15 @@ # Example: # emu_vbf,emu_novbf,emu_boost signal,EWK lumi 1.045 -emtCatHigh,emtCatLow simulated lumi_8TeV 1.042 +emtCatHigh,emtCatLow simulated lumi_8TeV 1.026 + +# Trigger uncertainties +emtCatHigh,emtCatLow simulated CMS_trigger_em 1.01 # Efficiency uncertainties emtCatHigh,emtCatLow simulated CMS_eff_e 1.02 -emtCatHigh,emtCatLow simulated CMS_eff_m 1.01 -emtCatHigh,emtCatLow simulated CMS_eff_t 1.08 +emtCatHigh,emtCatLow simulated CMS_eff_m 1.02 +emtCatHigh,emtCatLow simulated CMS_eff_t 1.06 # Scale uncertainties emtCatHigh,emtCatLow simulated CMS_scale_t 1.03 @@ -23,8 +26,8 @@ emtCatHigh,emtCatLow zz QCDscale_VV 1.023 emtCatHigh,emtCatLow wz pdf_qqbar 1.04 emtCatHigh,emtCatLow wz QCDscale_VV 1.04 -emtCatHigh,emtCatLow signal pdf_qqbar 1.034 -emtCatHigh,emtCatLow signal QCDscale_VH 1.004 +emtCatHigh,emtCatLow signal pdf_qqbar 1.023 +emtCatHigh,emtCatLow signal QCDscale_VH 1.01 #charge flip uncertainty emtCatHigh,emtCatLow charge_fakes CMS_vhtt_emt_chargeFlip_8TeV 1.0 diff --git a/wh/card_config/unc.vals.mmt.7TeV b/wh/card_config/unc.vals.mmt.7TeV new file mode 100644 index 00000000..b82af8cc --- /dev/null +++ b/wh/card_config/unc.vals.mmt.7TeV @@ -0,0 +1,29 @@ +########################################################################### +# unc.vals: specification of uncertainty values by category, sample, and uncertainty name +# Example: +# emu_vbf,emu_novbf,emu_boost signal,EWK lumi 1.045 + +mmtCatHigh,mmtCatLow simulated lumi_7TeV 1.022 + +# Trigger uncertainties +mmtCatHigh,mmtCatLow simulated CMS_trigger_m 1.01 + +# Efficiency uncertainties +mmtCatHigh,mmtCatLow simulated CMS_eff_m 1.04 +mmtCatHigh,mmtCatLow simulated CMS_eff_t 1.06 + +# Scale uncertainties +mmtCatHigh,mmtCatLow simulated CMS_scale_t 1.03 + +# Efficiency of b-jet veto +mmtCatHigh,mmtCatLow simulated CMS_fake_b_7TeV 1.01 + +# Background uncertainties - due to the theoretical unc. on the xsection +mmtCatHigh,mmtCatLow zz pdf_qqbar 1.033 +mmtCatHigh,mmtCatLow zz QCDscale_VV 1.023 + +mmtCatHigh,mmtCatLow wz pdf_qqbar 1.04 +mmtCatHigh,mmtCatLow wz QCDscale_VV 1.04 + +mmtCatHigh,mmtCatLow signal pdf_qqbar 1.026 +mmtCatHigh,mmtCatLow signal QCDscale_VH 1.009 diff --git a/wh/card_config/unc.vals.mmt.8TeV b/wh/card_config/unc.vals.mmt.8TeV index b3630604..915c37bb 100644 --- a/wh/card_config/unc.vals.mmt.8TeV +++ b/wh/card_config/unc.vals.mmt.8TeV @@ -3,11 +3,14 @@ # Example: # emu_vbf,emu_novbf,emu_boost signal,EWK lumi 1.045 -mmtCatHigh,mmtCatLow simulated lumi_8TeV 1.042 +mmtCatHigh,mmtCatLow simulated lumi_8TeV 1.026 + +# Trigger uncertainties +mmtCatHigh,mmtCatLow simulated CMS_trigger_m 1.01 # Efficiency uncertainties -mmtCatHigh,mmtCatLow simulated CMS_eff_m 1.02 -mmtCatHigh,mmtCatLow simulated CMS_eff_t 1.08 +mmtCatHigh,mmtCatLow simulated CMS_eff_m 1.04 +mmtCatHigh,mmtCatLow simulated CMS_eff_t 1.06 # Scale uncertainties mmtCatHigh,mmtCatLow simulated CMS_scale_t 1.03 @@ -22,6 +25,6 @@ mmtCatHigh,mmtCatLow zz QCDscale_VV 1.023 mmtCatHigh,mmtCatLow wz pdf_qqbar 1.04 mmtCatHigh,mmtCatLow wz QCDscale_VV 1.04 -mmtCatHigh,mmtCatLow signal pdf_qqbar 1.034 -mmtCatHigh,mmtCatLow signal QCDscale_VH 1.004 +mmtCatHigh,mmtCatLow signal pdf_qqbar 1.023 +mmtCatHigh,mmtCatLow signal QCDscale_VH 1.01 diff --git a/wh/check_shapes.py b/wh/check_shapes.py new file mode 100755 index 00000000..55537656 --- /dev/null +++ b/wh/check_shapes.py @@ -0,0 +1,214 @@ +#! /bin/env python + +import ROOT +import fnmatch +from optparse import OptionParser +import os +import re +import logging +import sys + +__author__ = "Mauro Verzetti (mauro.verzetti@cern.ch)" +__doc__ = """checks that the shapes for the limit are looking good""" + +parser = OptionParser(description=__doc__) +parser.add_option('--fakes', '-f', type=str, default = '*fakes*', + help='pattern to match to fakes',dest='fakes') +parser.add_option('--exclude', '-e', type=str, default = '*_?', + help='pattern of dirs to exclude',dest='exclude') +parser.add_option('--signal', '-s', type=str, default = 'WH*', + help='pattern of plots to be recognised as signals',dest='signal') +parser.add_option('--shape-unc-matcher', default='*CMS_*', + dest='shapematch', + help='Shell glob-style matcher for shape errors. These shapes arent shown.') +parser.add_option('--level', '-l', type=str, default = 'INFO', + help='pattern of dirs to excludelogging level', dest='level') + +args, shapes_filenames = parser.parse_args() + +logging.basicConfig(stream=sys.stderr, level=getattr(logging, args.level)) + +ROOT.gROOT.SetBatch(True) +ROOT.gStyle.SetOptStat('111111111') + +def walk(inputdir): + ''' Recursive function which generates (path, subdirs, histos) ''' + directories = [] + histos = [] + for key in inputdir.GetListOfKeys(): + # Keep track of stuff we find in this directory + name = key.GetName() + classname = key.GetClassName() + if classname.startswith('TDirectory'): + directories.append(name) + elif isinstance(inputdir.Get(name), ROOT.TH1): + histos.append(name) + path = inputdir.GetPath().split(':')[1] + # Yield the stuff in this directory + yield (path, tuple(directories), tuple(histos)) + # Now get the stuff in sub directories + for directory in directories: + for subresult in walk(inputdir.Get(directory)): + yield subresult + +def seperate_histos(histo_list, signal_pattern, err_pattern, fakes_pattern): + ''' Separate histogram lists into backgrounds, shape_uncs, and signals ''' + signals = [] + shapes = [] + bkgs = [] + fakes = [] + for x in histo_list: + if 'obs' in x: + continue + if fnmatch.fnmatch(x, signal_pattern): + signals.append(x) + elif fnmatch.fnmatch(x, err_pattern): + shapes.append(x) + elif fnmatch.fnmatch(x, fakes_pattern): + fakes.append(x) + else: + bkgs.append(x) + return (tuple(signals), tuple(shapes), tuple(fakes), tuple(bkgs)) + +def count_holes(histo): + nbins_x = histo.GetNbinsX() + last_filled = 0 + first_filled = nbins_x + for i in xrange(nbins_x, 1, -1): + if histo.GetBinContent(i): + last_filled = i + break + for i in xrange(1, nbins_x+1): + if histo.GetBinContent(i): + first_filled = i + break + + if last_filled < first_filled: + return -1 + #raise Exception("Error in count_holes") + + holes = sum( + 1 for i in xrange(first_filled, last_filled) + if not histo.GetBinContent(i) + ) + return holes + +def count_negatives(histo): + nbins_x = histo.GetNbinsX() + negatives = sum( + 1 for i in xrange(1, nbins_x+1) + if (histo.GetBinContent(i) + histo.GetBinError(i)) < 0 + ) + return negatives + +def check_empty(histo): + return histo.Integral() == 0 + +def check_sig_bkg(signals, backgrounds): + nbins_x = signals[0].GetNbinsX() #same as + bins = 0 + for ibin in xrange(1, nbins_x+1): + bkg_sum = sum( + h.GetBinContent(ibin) for h in backgrounds + if h.GetBinContent(ibin) >= 0 + ) + if not bkg_sum: #in background is empty + #check signals + bins += int( + any( + h.GetBinContent(ibin) > 0 + for h in signals + ) + ) + return bins + +def pair_signals(signals): + regex = re.compile("[a-zA-Z_]+(?P\d+)") + pairs = {} + for name in signals: + logging.debug(name) + mass = regex.match(name).group('mass') + pairs[mass] = pairs.get(mass,[]) + [name] + return pairs + + +good_shapes = [] +bad_shapes = [] +ugly_shapes = [] #not used + +for shape_filename in shapes_filenames: + logging.info( "Inspecting %s" % shape_filename) + shape_file = ROOT.TFile.Open(shape_filename) + + info = {} + for path, subdirs, histos in walk(shape_file): + if not histos or fnmatch.fnmatch(path, args.exclude): + continue + + h_dict = {} + for h in histos: + h_dict[h] = shape_file.Get(os.path.join(path, h)) + + logging.debug('%s, %s, %s' % (path.__repr__(), subdirs.__repr__(), histos.__repr__())) + signals, unc, fakes, bkgs = seperate_histos( + histos, args.signal, args.shapematch, args.fakes) + + paired_signals = pair_signals(signals) + logging.debug('paired signals: %s' % paired_signals) + signals = [] + for mass, names in paired_signals.iteritems(): + if len(names) == 1: + signals += names + if len(names) == 2: + h_dict[names[0]].Add(h_dict[names[1]]) + signals.append(names[0]) + + logging.debug('new signals: %s' % signals) + signals = tuple(signals) + #count holes + for h in fakes+bkgs: + hpath = os.path.join(path, h) + info[hpath] = {} + info[hpath]['holes'] = count_holes(h_dict[h]) + + for h in signals: + info[hpath]['empty'] = check_empty(h_dict[h]) + + #count negatives + for h in fakes: + hpath = os.path.join(path, h) + info[hpath]['negatives'] = count_negatives(h_dict[h]) + + h_sigs = [ h_dict[h] for h in signals ] + h_bkgs = [ h_dict[h] for h in fakes+bkgs ] + info[path] = { + 'signal_only' : check_sig_bkg(h_sigs, h_bkgs) + } + + has_errors = False + for path, values in info.iteritems(): + if values.get('holes') or values.get('negatives'): + has_errors = True + logging.info( '%s found with %i holes and %i negative bins!' % (path, values['holes'], values.get('negatives', 0)) ) + if values.get('empty'): + has_errors = True + logging.info( '%s found to be empty!' % path ) + if values.get('signal_only'): + has_errors = True + logging.info('category %s has %i bins with signal-only contribution!' % (path, values['signal_only'])) + if has_errors: + bad_shapes.append(shape_filename) + logging.warning('%s has errors!' % shape_filename) + else: + good_shapes.append(shape_filename) + logging.info( "\n\n\n") + shape_file.Close() + + + +print '\n\nBAD SHAPE FILES:\n\n' +print '\n'.join( bad_shapes ) + + +print '\n\nGOOD SHAPE FILES:\n\n' +print '\n'.join( good_shapes ) diff --git a/wh/cutflowtracker.py b/wh/cutflowtracker.py new file mode 100644 index 00000000..7963ac08 --- /dev/null +++ b/wh/cutflowtracker.py @@ -0,0 +1,44 @@ +import os + +class cut_flow_tracker(object): + def __init__(self, hist): + self.labels = [hist.GetXaxis().GetBinLabel(i+1) for i in range(hist.GetNbinsX())] + self.cut_flow = dict([ (i, False) for i in self.labels]) + self.hist = hist + self.evt_info = [-1, -1, -1] + self.disabled = 'CutFlow' not in os.environ + self.sync_mode = 'SYNC' in os.environ + + def fill(self, label): + self.cut_flow[label] = True + + def Fill(self, *labels): + if self.disabled: + return + for label in labels: + self.fill(label) + + def flush(self): + if self.disabled: + return + final_i = -1 + for i, label in enumerate(self.labels): + val = self.cut_flow[label] + if val: + self.hist.Fill(i+0.5) + final_i = i + if self.sync_mode: + fails = '' + try: + fails = 'fails %s' % (self.labels[final_i+1]) + except IndexError: + fails = 'passes the selection' #if len(self.labels) == final_i else 'passes the selection' + print 'Event %i:%i:%i ' % tuple(self.evt_info) + fails + + def new_row(self, *args): + if self.disabled: + return + if self.evt_info != list(args): + self.flush() + self.evt_info = list(args) + self.cut_flow = dict([ (i, False) for i in self.labels]) diff --git a/wh/dump_lumis.py b/wh/dump_lumis.py new file mode 100644 index 00000000..16e72136 --- /dev/null +++ b/wh/dump_lumis.py @@ -0,0 +1,43 @@ +import glob +import os +from FinalStateAnalysis.MetaData.data_views import extract_sample, read_lumi +import re +#from pudb import set_trace; set_trace() + +paths = { + #os.environ['current'], + 'current' : 'inputs/%s/' % os.environ['jobid'], + 'previous' : 'inputs/2013-Jun-30-8TeV/', +} + + +for dataset in ['DoubleMu', 'DoubleElectron', 'MuEG']: + lumi_dict = {} + for jobid, path in paths.iteritems(): + lumi_dict[jobid] = {} + for lumifile in glob.glob(path+'/data_'+dataset+'*.lumicalc.sum'): + lumi_dict[jobid][extract_sample(lumifile)] = read_lumi(lumifile) + + print dataset + print '%60s%20s%20s' % ('', 'current', 'previous') + keys = [] + for i in lumi_dict.values(): + keys += i.keys() + keys = list(set(keys)) + + total_lumis = dict([(i, {'current' : 0., 'previous' : 0.}) for i in ['2012A', '2012B', '2012C', '2012D', 'TOTAL',]]) + + for sample in keys: + curr_l = lumi_dict['current'][sample] if sample in lumi_dict['current'] else 0. + total_lumis['TOTAL']['current'] += curr_l + previous_l = lumi_dict['previous'][sample] if sample in lumi_dict['previous'] else 0. + total_lumis['TOTAL']['previous'] += previous_l + for key in total_lumis: + if key in sample: + total_lumis[key]['previous'] += previous_l + total_lumis[key]['current'] += curr_l + print '%60s%20s%20s' % (sample, '%.1f' % curr_l, '%.1f' % previous_l) + + for key, val in total_lumis.iteritems(): + print '%60s%20s%20s' % (key, '%.1f' % val['current'], '%.1f' % val['previous']) + print '\n\n' diff --git a/wh/dump_xsecs.py b/wh/dump_xsecs.py new file mode 100644 index 00000000..876a79c2 --- /dev/null +++ b/wh/dump_xsecs.py @@ -0,0 +1,29 @@ +import FinalStateAnalysis.Utilities.prettyjson as prettyjson +import os +import glob +from pdb import set_trace + +def dump_xsec(jobid): + json_files = [i for i in glob.glob('inputs/%s/*.json' % jobid) if 'data_' not in i] + lumi_files = [i for i in glob.glob('inputs/%s/*.sum' % jobid) if 'data_' not in i] + + datasets = {} + for json_file in json_files: + dname = json_file.split('/')[-1].split('.')[0] + datasets[dname] = {} + datasets[dname]['numevts'] = prettyjson.loads(open(json_file).read())['n_evts'] + + for lumi_file in lumi_files: + dname = lumi_file.split('/')[-1].split('.')[0] + datasets[dname]['lumi'] = float( open(lumi_file).read().strip() ) + + out_format = '%30s'+'%15s'*3 + print out_format % ('dataset', '# evts', 'lumi [/pb]', 'xsec [pb]') + for dataset, info in datasets.iteritems(): + print out_format % (dataset, '%.3f' % info['numevts'], '%.3f' % info['lumi'], '%.5f' % (info['numevts']/info['lumi']) ) + +print '\n\n%s\n' % os.environ['jobid7'] +dump_xsec(os.environ['jobid7']) + +print '\n\n%s\n' % os.environ['jobid8'] +dump_xsec(os.environ['jobid8']) diff --git a/wh/fakerate_functions.py b/wh/fakerate_functions.py index aa9db0e8..2728b37a 100755 --- a/wh/fakerate_functions.py +++ b/wh/fakerate_functions.py @@ -1,10 +1,14 @@ import os -from FinalStateAnalysis.StatTools.RooFunctorFromWS import build_roofunctor, make_corrector_from_th2, build_uncorr_2Droofunctor, FunctorFromMVA +from FinalStateAnalysis.StatTools.RooFunctorFromWS import build_roofunctor, make_corrector_from_th2,\ + build_uncorr_2Droofunctor, FunctorFromMVA, MultiFunctorFromMVA, MultiFunctorFromTF1 from FinalStateAnalysis.StatTools.VariableScaler import make_scaler from FinalStateAnalysis.Utilities.smartdict import SmartDict +from FinalStateAnalysis.MetaData.data_views import read_lumi import itertools import optimizer import re +import glob +from fnmatch import fnmatch #from optimizer import leading_lepton_iso_tag, subleading_lepton_iso_tag ################################################################################ @@ -12,7 +16,27 @@ ################################################################################ # Get fitted fake rate functions -frfit_dir = os.path.join('results', os.environ['jobid'], 'fakerate_fits') +frfit_dir = os.path.join('results', os.environ['jobid'], 'fakerate_fits')+'/' +is7TeV = '7TeV' in os.environ['jobid'] + +def get_lumis(pattern): + lumi_files = glob.glob( os.path.join('inputs', os.environ['jobid'], '*.lumicalc.sum') ) + ret = 0. + #print pattern + for lumi_file in lumi_files: + sample_name = os.path.basename(lumi_file).split('.')[0] + #print lumi_file, sample_name + if fnmatch(sample_name, pattern): + #print 'Matches!' + ret += read_lumi(lumi_file) + return ret + +double_e_lumi = get_lumis('data_DoubleElectron*') +double_mu_lumi = get_lumis('data_DoubleMu*') +mueg_lumi = get_lumis('data_MuEG*') +wz_lumi = get_lumis('WZ*ZToTauTau*') +zz_lumi = get_lumis('ZZ*') + def make_simple_mapper(tomap): def f_(string): @@ -77,10 +101,10 @@ def make_corrector_dict(filename, mapname, mapper=None): ret[i] = make_corrector_from_th2(filename % lepid, mapname) return ret -def make_scaler_dict(filename, mapname): +def make_scaler_dict(filename, mapname, **kwargs): ret = {} for i in optimizer.lep_id: - ret[i] = make_scaler(filename % i, 'mass_scale') + ret[i] = make_scaler(filename % i, 'mass_scale', **kwargs) return ret def make_mva_functor_dict(template, variables, mapper=None): @@ -96,64 +120,232 @@ def make_mva_functor_dict(template, variables, mapper=None): ) return ret +def null(*args, **kwargs): + return 0. -################## -## 1D Muon Func ## -################## +def make_null_dict(template, variables, mapper=None): + ret = {} + for i in optimizer.lep_id: + lepid = i + if mapper: + lepid = mapper(lepid) + ret[i] = null + return ret + +SKIP_MMT=eval( os.environ.get('SKIP_MMT','False') ) +SKIP_EMT=eval( os.environ.get('SKIP_EMT','False') ) +SKIP_EET=eval( os.environ.get('SKIP_EET','False') ) -#no changes in muonID in 2013 -mapper = {'eid1[0-9][A-Z][a-z]+_':'', 'idiso02' : 'pfidiso02'} -variables = ['muonJetPt', 'muonPt', 'muonJetCSVBtag'] #'muonPVDXY']#, 'muonJetBtag'] -highpt_mu_fr = make_mva_functor_dict(frfit_dir + '/m_wjets_pt20_%s_muonInfo.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) -lowpt_mu_fr = make_mva_functor_dict(frfit_dir + '/m_wjets_pt10_%s_muonInfo.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) +################### +## MMT FUNCTIONS ## +################### -highpt_mu_qcd_fr = make_mva_functor_dict(frfit_dir + '/m_qcd_pt20_%s_muonInfo.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) -lowpt_mu_qcd_fr = make_mva_functor_dict(frfit_dir + '/m_qcd_pt10_%s_muonInfo.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) +wz_sample = 'WZJetsTo3LNu_ZToTauTau_pythia' if '8TeV' in os.environ['jobid'] else 'WZJetsTo3LNu_ZToTauTau' +if not SKIP_MMT: + #no changes in muonID in 2013 + mapper = {'eid1[0-9][A-Z][a-z]+_':'', 'idiso02' : 'pfidiso02'} + variables = ['muonJetPt', 'muonPt', 'numJets20'] #, 'muonJetCSVBtag'] + lowpt_mu_fr = SmartDict() + lowpt_mu_fr.book( 'eid12Medium_h2taucuts020', + MultiFunctorFromMVA, + 'lowpt_mu_fr', + (frfit_dir + 'mm_wjets_pt10_h2taucuts020_muonInfo_k50.data.kNN.weights.xml', double_mu_lumi), + [ (frfit_dir + 'mm_wjets_pt10_h2taucuts020_muonInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'mm_wjets_pt10_h2taucuts020_muonInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables) + + highpt_mu_fr = SmartDict() + highpt_mu_fr.book( 'eid12Medium_h2taucuts', + MultiFunctorFromMVA, + 'highpt_mu_fr', + (frfit_dir + 'mm_wjets_pt10_h2taucuts_muonInfo_k50.data.kNN.weights.xml', double_mu_lumi), + [ (frfit_dir + 'mm_wjets_pt10_h2taucuts_muonInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'mm_wjets_pt10_h2taucuts_muonInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables, + phase_space='muonPt > 20' + ) + + lowpt_mu_qcd_fr = SmartDict() + lowpt_mu_qcd_fr.book( 'eid12Medium_h2taucuts020', + FunctorFromMVA, + 'lowpt_mu_qcd_fr', + frfit_dir + 'mm_qcd_pt10_h2taucuts020_muonInfo_k50.data.kNN.weights.xml', + *variables) -####################### -## 1D Electrons Func ## -####################### + highpt_mu_qcd_fr = SmartDict() + highpt_mu_qcd_fr.book( 'eid12Medium_h2taucuts', + FunctorFromMVA, + 'highpt_mu_qcd_fr', + frfit_dir + 'mm_qcd_pt10_h2taucuts_muonInfo_k50.data.kNN.weights.xml', + *variables) + + + + #lowpt_mu_fr = make_mva_functor_dict(frfit_dir + '/mm_wjets_pt10_%s_muonInfo_k100.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) + #highpt_mu_fr = lowpt_mu_fr + # + #lowpt_mu_qcd_fr = make_mva_functor_dict(frfit_dir + '/mm_qcd_pt10_%s_muonInfo_k100.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) + #highpt_mu_qcd_fr = lowpt_mu_qcd_fr + +################### +## EMT FUNCTIONS ## +################### -variables = ['electronJetPt', 'electronPt'] -#EMT -highpt_e_fr = make_mva_functor_dict(frfit_dir + '/e_wjets_pt20_%s_electronInfo.kNN.weights.xml', variables) -lowpt_e_fr = make_mva_functor_dict(frfit_dir + '/e_wjets_pt10_%s_electronInfo.kNN.weights.xml', variables) +if not SKIP_EMT: + variables = ['muonJetPt', 'muonPt', 'numJets20'] -highpt_e_qcd_fr = make_mva_functor_dict(frfit_dir + '/e_qcd_pt20_%s_electronInfo.kNN.weights.xml', variables) -lowpt_e_qcd_fr = make_mva_functor_dict(frfit_dir + '/e_qcd_pt10_%s_electronInfo.kNN.weights.xml', variables) + lowpt_mue_fr = SmartDict() + lowpt_mue_fr.book( 'eid12Medium_h2taucuts', + MultiFunctorFromMVA, + 'lowpt_mue_fr', + (frfit_dir + 'em_Mwjets_pt10_h2taucuts_muonInfo_k50.data.kNN.weights.xml', mueg_lumi), + [ (frfit_dir + 'em_Mwjets_pt10_h2taucuts_muonInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'em_Mwjets_pt10_h2taucuts_muonInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables) -#EET -highpt_ee_fr = make_mva_functor_dict(frfit_dir + '/ee_wjetsNoZmass_pt20_%s_electronInfo.kNN.weights.xml', variables) -lowpt_ee_fr = make_mva_functor_dict(frfit_dir + '/ee_wjetsNoZmass_pt10_%s_electronInfo.kNN.weights.xml', variables) + highpt_mue_fr = SmartDict() + highpt_mue_fr.book( 'eid12Medium_h2taucuts', + MultiFunctorFromMVA, + 'lowpt_mue_fr', + (frfit_dir + 'em_Mwjets_pt10_h2taucuts_muonInfo_k50.data.kNN.weights.xml', mueg_lumi), + [ (frfit_dir + 'em_Mwjets_pt10_h2taucuts_muonInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'em_Mwjets_pt10_h2taucuts_muonInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables, + phase_space='muonPt > 20' + ) -highpt_ee_qcd_fr = make_mva_functor_dict(frfit_dir + '/ee_qcd_pt20_%s_electronInfo.kNN.weights.xml', variables) -lowpt_ee_qcd_fr = make_mva_functor_dict(frfit_dir + '/ee_qcd_pt10_%s_electronInfo.kNN.weights.xml', variables) + + lowpt_mue_qcd_fr = SmartDict() + lowpt_mue_qcd_fr.book( 'eid12Medium_h2taucuts', + FunctorFromMVA, + 'lowpt_mue_qcd_fr', + frfit_dir + 'em_Mqcd_pt10_h2taucuts_muonInfo_k50.data.kNN.weights.xml', + *variables ) + highpt_mue_qcd_fr = lowpt_mue_qcd_fr + + + variables = ['electronJetPt', 'electronPt', 'numJets20'] + lowpt_e_fr = SmartDict() + lowpt_e_fr.book( 'eid12Medium_h2taucuts', + MultiFunctorFromMVA, + 'lowpt_e_fr', + (frfit_dir + 'em_wjets_pt10_eid12Medium_h2taucuts_electronInfo_k50.data.kNN.weights.xml', mueg_lumi), + [ (frfit_dir + 'em_wjets_pt10_eid12Medium_h2taucuts_electronInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'em_wjets_pt10_eid12Medium_h2taucuts_electronInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables) + + highpt_e_fr = SmartDict() + highpt_e_fr.book( 'eid12Medium_h2taucuts', + MultiFunctorFromMVA, + 'lowpt_e_fr', + (frfit_dir + 'em_wjets_pt10_eid12Medium_h2taucuts_electronInfo_k50.data.kNN.weights.xml', mueg_lumi), + [ (frfit_dir + 'em_wjets_pt10_eid12Medium_h2taucuts_electronInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'em_wjets_pt10_eid12Medium_h2taucuts_electronInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables, + phase_space='electronPt > 20' + ) + + lowpt_e_qcd_fr = SmartDict() + lowpt_e_qcd_fr.book( 'eid12Medium_h2taucuts', + FunctorFromMVA, + 'lowpt_e_qcd_fr', + frfit_dir + 'em_qcd_pt10_eid12Medium_h2taucuts_electronInfo_k50.data.kNN.weights.xml', + *variables ) + highpt_e_qcd_fr = lowpt_e_qcd_fr + + + #lowpt_mue_fr = make_mva_functor_dict(frfit_dir + '/em_Mwjets_pt10_%s_muonInfo_k100.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) + #highpt_mue_fr = lowpt_mue_fr + # + #lowpt_mue_qcd_fr = make_mva_functor_dict(frfit_dir + '/em_Mqcd_pt10_%s_muonInfo_k100.kNN.weights.xml', variables, mapper=make_regex_mapper(mapper)) + #highpt_mue_qcd_fr = lowpt_mue_qcd_fr + # + #variables = ['electronJetPt', 'electronPt', 'numJets20'] + #lowpt_e_fr = make_mva_functor_dict(frfit_dir + '/em_wjets_pt10_%s_electronInfo_k100.kNN.weights.xml', variables) + #highpt_e_fr = lowpt_e_fr + # + #lowpt_e_qcd_fr = make_mva_functor_dict(frfit_dir + '/em_qcd_pt10_%s_electronInfo_k100.kNN.weights.xml', variables) + #highpt_e_qcd_fr = lowpt_e_qcd_fr + + +################### +## EET FUNCTIONS ## +################### + +if not SKIP_EET: + variables = ['electronJetPt', 'electronPt', 'numJets20'] + lowpt_ee_fr = SmartDict() + lowpt_ee_fr.book( 'eid12Medium_h2taucuts020', + MultiFunctorFromMVA, + 'lowpt_ee_fr', + (frfit_dir + 'ee_wjetsNoZmass_pt10_eid12Medium_h2taucuts020_electronInfo_k50.data.kNN.weights.xml', double_e_lumi), + [ (frfit_dir + 'ee_wjetsNoZmass_pt10_eid12Medium_h2taucuts020_electronInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'ee_wjetsNoZmass_pt10_eid12Medium_h2taucuts020_electronInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables) + + highpt_ee_fr = SmartDict() + highpt_ee_fr.book( 'eid12Tight_h2taucuts', + MultiFunctorFromMVA, + 'highpt_ee_fr', + (frfit_dir + 'ee_wjetsNoZmass_pt10_eid12Tight_h2taucuts_electronInfo_k50.data.kNN.weights.xml', double_e_lumi), + [ (frfit_dir + 'ee_wjetsNoZmass_pt10_eid12Tight_h2taucuts_electronInfo_k50.%s.kNN.weights.xml' % wz_sample, wz_lumi), + (frfit_dir + 'ee_wjetsNoZmass_pt10_eid12Tight_h2taucuts_electronInfo_k50.ZZJetsTo4L_pythia.kNN.weights.xml', zz_lumi)], + *variables, + phase_space='electronPt > 20' + ) + + + lowpt_ee_qcd_fr = SmartDict() + lowpt_ee_qcd_fr.book( 'eid12Medium_h2taucuts020', + FunctorFromMVA, + 'lowpt_ee_qcd_fr', + frfit_dir + 'ee_qcd_pt10_eid12Medium_h2taucuts020_electronInfo_k50.data.kNN.weights.xml', + *variables) + + highpt_ee_qcd_fr = SmartDict() + highpt_ee_qcd_fr.book( 'eid12Tight_h2taucuts', + FunctorFromMVA, + 'highpt_ee_qcd_fr', + frfit_dir + 'ee_qcd_pt10_eid12Tight_h2taucuts_electronInfo_k50.data.kNN.weights.xml', + *variables) + + + + + #lowpt_ee_fr = make_mva_functor_dict(frfit_dir + '/ee_wjetsNoZmass_pt10_%s_electronInfo_k100.kNN.weights.xml', variables) + #highpt_ee_fr = lowpt_ee_fr + # + #lowpt_ee_qcd_fr = make_mva_functor_dict(frfit_dir + '/ee_qcd_pt10_%s_electronInfo_k100.kNN.weights.xml', variables) + #highpt_ee_qcd_fr = lowpt_ee_qcd_fr ################## ## 1D Taus Func ## ################## -tau_fr = build_roofunctor( - frfit_dir + '/t_ztt_pt20_mvaloose_tauPt.root', - 'fit_efficiency', # workspace name - 'efficiency' +filename = '2011.root' if is7TeV else '2012.root' +date = '2011' if is7TeV else '2012' +tau_fr = MultiFunctorFromTF1( + 'external/%s' % filename, + [('%s_wmuJetsAll_electronLooseMVA3_muonTight_lepTauOS_fakeable_combinedIsolationLoose3Hits_byEta_projX_barrel/landau' % date, [-1, 0.8]), + ('%s_wmuJetsAll_electronLooseMVA3_muonTight_lepTauOS_fakeable_combinedIsolationLoose3Hits_byEta_projX_transition/landau' % date, [0.8, 1.6]), + ('%s_wmuJetsAll_electronLooseMVA3_muonTight_lepTauOS_fakeable_combinedIsolationLoose3Hits_byEta_projX_forward/landau' % date, [1.6, 100])] ) tau_qcd_fr = tau_fr -e_charge_flip = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_%s.root", "efficiency_map") -e_charge_flip_up = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_%s.root", "efficiency_map_statUp") -e_charge_flip_down = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_%s.root", "efficiency_map_statDown") -mass_scaler = make_scaler_dict(frfit_dir+"/charge_flip_prob_map_%s.root", 'mass_scale') -default_scaler = mass_scaler[mass_scaler.keys()[0]] - - -e1_charge_flip = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_e1_%s.root", "efficiency_map") -e1_charge_flip_up = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_e1_%s.root", "efficiency_map_statUp") -e1_charge_flip_down = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_e1_%s.root", "efficiency_map_statDown") +############################ +## CHARGE FLIP FUNCTIONS ## +############################ -e2_charge_flip = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_e2_%s.root", "efficiency_map") -e2_charge_flip_up = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_e2_%s.root", "efficiency_map_statUp") -e2_charge_flip_down = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_e2_%s.root", "efficiency_map_statDown") +if not (SKIP_EMT or SKIP_EET): + e_charge_flip = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_%s.root", "efficiency_map") + e_charge_flip_up = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_%s.root", "efficiency_map_statUp") + e_charge_flip_down = make_corrector_dict(frfit_dir+"/charge_flip_prob_map_%s.root", "efficiency_map_statDown") + mass_scaler = make_scaler_dict(frfit_dir+"/charge_flip_prob_map_%s.root", 'mass_scale') + mass_scaler_up = make_scaler_dict(frfit_dir+"/charge_flip_prob_map_%s.root", 'mass_scale', error_scale=1 ) + mass_scaler_down = make_scaler_dict(frfit_dir+"/charge_flip_prob_map_%s.root", 'mass_scale', error_scale=-1) + default_scaler = mass_scaler[ mass_scaler.keys()[0]] + default_scaler_up = mass_scaler_up[ mass_scaler.keys()[0]] + default_scaler_down = mass_scaler_down[mass_scaler.keys()[0]] diff --git a/wh/get_fake_systematic.py b/wh/get_fake_systematic.py index 7b39c2fa..9b12d4bc 100755 --- a/wh/get_fake_systematic.py +++ b/wh/get_fake_systematic.py @@ -1,29 +1,31 @@ -#!/usr/bin/env python +#! /bin/env python -''' - -Get fake systematic. - -''' - -from rootpy import io -import rootpy.plotting.views as views import sys - -the_filename = sys.argv[1] -base_dirs = sys.argv[2].split(',') -syst_name = sys.argv[3] - -the_file = io.open(the_filename, 'READ') -nom_view = views.SumView( - *[ views.SubdirectoryView( the_file, dirname ) for dirname in base_dirs] -) - -qcd_view = views.SumView( - *[ views.SubdirectoryView( the_file, dirname+'_q' ) for dirname in base_dirs] -) - -nom = nom_view.Get('fakes').Integral() -qcd = qcd_view.Get('fakes').Integral() - -print "%s fakes %s %0.2f" % (','.join(base_dirs), syst_name, 1 + abs(nom - qcd) / nom) +import os +import re + +"Usage pull files get_unc_val_from_pull.py pulls.txt nuisance initial_value header" + +header = sys.argv[-1] +prefit = float(sys.argv[-2]) +nuisance = sys.argv[-3] +filename = sys.argv[-4] + +if not os.path.isfile(filename): + print "%s not found!" % filename + sys.exit(1) + +lines = open(filename).readlines() +parser = re.compile(r'(?P\w+)\s+(?P(?:[\*\!] )?[\-+]\d+\.\d+)\,\s(?P\d+\.\d+)') + +for line in lines: + match = parser.match(line) + if match: + if match.group('nuisance') != nuisance: + continue + pull = float(match.group('pull').replace('* ','').replace('! ','')) + constraint = float(match.group('constraint')) + max_dev = max(abs(pull), abs(constraint)) + new_dev = abs(1-prefit)*max_dev + 1 + print '%s %s %.2f' % (header, nuisance, new_dev) + diff --git a/wh/jobid.sh b/wh/jobid.sh index 9a98b4dc..fab0f77a 100644 --- a/wh/jobid.sh +++ b/wh/jobid.sh @@ -1,4 +1,5 @@ # Central definition of current job IDs -export jobid7='2013-Jul-04-7TeV' +export jobid7='2013-Sept-02-7TeV' +#export jobid7='2013-Sept-02' export jobid8='2013-Jul-03-8TeV' diff --git a/wh/limits.sh b/wh/limits.sh index 21c72f49..b36e2571 100755 --- a/wh/limits.sh +++ b/wh/limits.sh @@ -6,16 +6,10 @@ set -o nounset set -o errexit source jobid.sh -#export jobid=$jobid7 -#rake cards -#rake limits -#rake harvest_limits -#rake plot_limits -#rake compare_limits +export jobid=$jobid7 +rake f3_postfit_plots +rake compare_limits -export jobid=$jobid8 -rake cards -rake limits -rake harvest_limits -rake plot_limits -rake compare_limits \ No newline at end of file +export jobid=$jobid8 #'2013-Jun-30-8TeV' # +rake f3_postfit_plots +rake compare_limits diff --git a/wh/mcCorrectors.py b/wh/mcCorrectors.py index 9f29d16b..c49e5939 100644 --- a/wh/mcCorrectors.py +++ b/wh/mcCorrectors.py @@ -8,6 +8,13 @@ is7TeV = bool('7TeV' in os.environ['jobid']) print "Is 7TeV:", is7TeV + +######################################################################## +## +## PILE UP CORRECTIONS +## +######################################################################## + # Make PU corrector from expected data PU distribution # PU corrections .root files from pileupCalc.py pu_distributions = { @@ -20,24 +27,6 @@ print "Using S6_600bins PU weights for HWW3l" mc_pu_tag = 'S6_600bins' -#Makes appropriate correction function for electrons or muons according to run period -mu_pog_2011_id = MuonPOGCorrections.make_muon_pog_PFTight_2011() -mu_pog_2011_iso = MuonPOGCorrections.make_muon_pog_PFRelIsoDB02_2011() -muon_pog_IsoID = (lambda pt, eta: mu_pog_2011_id(pt,eta)*mu_pog_2011_iso(pt,eta)) if is7TeV else H2TauCorrections.correct_mu_idiso_2012 -electron_corrections = H2TauCorrections.correct_e_idiso_2011 if is7TeV else H2TauCorrections.correct_e_idiso_2012 - -#scale factors for double muon trigger, too messy to make only in one line, the function will take care of this -# takes etas of muons -muon_pog_Mu17Mu8_2011 = MuonPOGCorrections.muon_pog_Mu17Mu8_eta_eta_2011 -muon_pog_Mu17Mu8_Mu17_2012 = MuonPOGCorrections.make_muon_pog_Mu17Mu8_Mu17_2012() -muon_pog_Mu17Mu8_Mu8_2012 = MuonPOGCorrections.make_muon_pog_Mu17Mu8_Mu8_2012() - -#Scale factors for mueg triggers, that's better -correct_mueg_mu = H2TauCorrections.correct_mueg_mu_2011 if is7TeV else H2TauCorrections.correct_mu_idiso_2012 -correct_mueg_e = H2TauCorrections.correct_mueg_e_2011 if is7TeV else H2TauCorrections.correct_mueg_e_2012 - -#Double electrons does NOT need scale factors - def make_puCorrector(dataset, kind=None): 'makes PU reweighting according to the pu distribution of the reference data and the MC, MC distribution can be forced' if not kind: @@ -48,7 +37,55 @@ def make_puCorrector(dataset, kind=None): raise KeyError('dataset not present. Please check the spelling or add it to mcCorrectors.py') ## def force_pu_distribution(kind): ## pu_corrector = PileupWeight.PileupWeight( kind, *pu_distributions) - + + + +######################################################################## +## +## TRIGGER +## +######################################################################## + +#DOUBLE MU +muon_pog_Mu17Mu8_2011 = MuonPOGCorrections.muon_pog_Mu17Mu8_eta_eta_2011 +#muon_pog_Mu17Mu8_Mu17_2012 = MuonPOGCorrections.make_muon_pog_Mu17Mu8_Mu17_2012() +#muon_pog_Mu17Mu8_Mu8_2012 = MuonPOGCorrections.make_muon_pog_Mu17Mu8_Mu8_2012() +muon_h2tau_Mu17Mu8_2012 = H2TauCorrections.correct_double_muon_trg_2012 + +def double_muon_trigger(row,m1,m2): + 'makes scale factor for double mu trigger' + if is7TeV: + return muon_pog_Mu17Mu8_2011(getattr(row, '%sEta' % m1), getattr(row, '%sEta' % m2) ) + else: + return muon_h2tau_Mu17Mu8_2012(getattr(row, '%sPt' % m1), getattr(row, '%sEta' % m1), getattr(row, '%sPt' % m2), getattr(row, '%sEta' % m2)) + + +#MUEG +correct_mueg_mu = H2TauCorrections.correct_mueg_mu_2011 if is7TeV else H2TauCorrections.correct_mueg_mu_2012 +correct_mueg_e = H2TauCorrections.correct_mueg_e_2011 if is7TeV else H2TauCorrections.correct_mueg_e_2012 + +#Double electrons scale factors +correct_double_electron = H2TauCorrections.correct_double_electron_trg_2011 if is7TeV else H2TauCorrections.correct_double_electron_trg_2012 + +def double_electron_trigger(row): + return correct_double_electron( row.e1Pt, row.e1Eta, row.e2Pt, row.e2Eta ) + + + +######################################################################## +## +## ID/ISO +## +######################################################################## + + +#Makes appropriate correction function for electrons or muons according to run period +mu_pog_2011_id = MuonPOGCorrections.make_muon_pog_PFTight_2011() +mu_pog_2011_iso = MuonPOGCorrections.make_muon_pog_PFRelIsoDB02_2011() +muon_pog_IsoID = (lambda pt, eta: mu_pog_2011_id(pt,eta)*mu_pog_2011_iso(pt,eta)) if is7TeV else H2TauCorrections.correct_mu_idiso_2012 +electron_corrections = H2TauCorrections.correct_e_idiso_2011 if is7TeV else H2TauCorrections.correct_e_idiso_2012 +electron_tight_corrections = H2TauCorrections.correct_e_TIGHTidiso_2011 if is7TeV else H2TauCorrections.correct_e_TIGHTidiso_2012 + def get_muon_corrections(row,*args): 'makes corrections to iso and id of muons' @@ -69,12 +106,35 @@ def get_electron_corrections(row,*args): ret *= electron_corrections(pt,abseta) return ret -def double_muon_trigger(row,m1,m2): - 'makes scale factor for double mu trigger' - if is7TeV: - return muon_pog_Mu17Mu8_2011(getattr(row, '%sEta' % m1), getattr(row, '%sEta' % m2) ) - else: - f1 = muon_pog_Mu17Mu8_Mu17_2012(getattr(row, '%sPt' % m1), getattr(row, '%sEta' % m1)) - f2 = muon_pog_Mu17Mu8_Mu8_2012(getattr(row, '%sPt' % m2), getattr(row, '%sEta' % m2)) - return f1*f2 + + + +######################################################################## +## +## MC MATCHING +## +######################################################################## + + +from FinalStateAnalysis.PlotTools.decorators import memo + +@memo +def getVar(name, var): + return name+var + +def match_mc_object(row, obj_name): + '''check that muons are real muons, electrons are real electrons, + had taus are real had taus and little furry creatures from alpha + centauri are real little furry creatures form alpha centauri''' + if obj_name[0] == 'm': + return (abs( getattr(row, getVar(obj_name, 'GenPdgId')) ) == 13) + elif obj_name[0] == 'e': + return (abs( getattr(row, getVar(obj_name, 'GenPdgId')) ) == 11) + elif obj_name[0] == 't': + return ( getattr(row, getVar(obj_name, 'GenDecayMode')) > -1) + return False + +def mc_matching(row, *args): + 'matches object to the gen-level object' + return all( match_mc_object(row, i) for i in args ) diff --git a/wh/optimizer.py b/wh/optimizer.py index bb786e02..be16d9f1 100644 --- a/wh/optimizer.py +++ b/wh/optimizer.py @@ -6,23 +6,17 @@ RUN_OPTIMIZATION = ('RUN_OPTIMIZATION' in os.environ) and eval(os.environ['RUN_OPTIMIZATION']) lep_id = [ - 'eid12Tight_idiso02', 'eid12Tight_h2taucuts', 'eid12Tight_h2taucuts020', - 'eid12Loose_idiso02', - 'eid12Loose_h2taucuts', - 'eid12Loose_h2taucuts020', - 'eid12Medium_idiso02', + #'eid12Loose_h2taucuts', + #'eid12Loose_h2taucuts020', 'eid12Medium_h2taucuts', 'eid12Medium_h2taucuts020' ] \ if RUN_OPTIMIZATION else \ [ - 'eid12Medium_idiso02', - 'eid12Loose_idiso02', - 'eid12Tight_idiso02', - 'eid12Loose_h2taucuts', - 'eid12Loose_h2taucuts020', + #'eid12Loose_h2taucuts', + #'eid12Loose_h2taucuts020', 'eid12Tight_h2taucuts', 'eid12Medium_h2taucuts020', 'eid12Medium_h2taucuts' @@ -81,8 +75,8 @@ } else: grid_search['MMT'] = { - 'leading_iso' : 'eid12Loose_h2taucuts', - 'subleading_iso' : 'eid12Loose_h2taucuts020', + 'leading_iso' : 'eid12Medium_h2taucuts', + 'subleading_iso' : 'eid12Medium_h2taucuts020', 'LT' : 50, 'tauID' : None, 'tauPT' : 0, diff --git a/wh/plot.sh b/wh/plot.sh index 2ab705df..43a0b0ac 100755 --- a/wh/plot.sh +++ b/wh/plot.sh @@ -5,24 +5,27 @@ set -o nounset set -o errexit source jobid.sh -#export jobid=$jobid7 -#rake plot_zee -#rake plot_eet -# -#rake plot_em -#rake plot_emt -# -#rake plot_zmm -#rake plot_mmt -#python plots_for_prepp.py -# +export jobid=$jobid7 +echo $jobid +python WHPlotterMMT.py +python WHPlotterEMT.py +python WHPlotterEET.py + +python PlotControlZMM.py +python PlotControlEM.py +python PlotControlZEE.py + +python plots_for_prepp_kNN.py + export jobid=$jobid8 -#rake plot_zee -rake plot_eet -# -#rake plot_em -rake plot_emt -# -#rake plot_zmm -rake plot_mmt -python plots_for_prepp.py +echo $jobid +python WHPlotterMMT.py +python WHPlotterEMT.py +python WHPlotterEET.py + +python PlotControlZMM.py +python PlotControlEM.py +python PlotControlZEE.py + +python plots_for_prepp_kNN.py + diff --git a/wh/plots_for_prepp_kNN.py b/wh/plots_for_prepp_kNN.py new file mode 100644 index 00000000..b7d44d8f --- /dev/null +++ b/wh/plots_for_prepp_kNN.py @@ -0,0 +1,206 @@ +from rootpy.utils import asrootpy +from FinalStateAnalysis.Utilities.rootbindings import ROOT +import os +from FinalStateAnalysis.PlotTools.RebinView import RebinView +import rootpy.plotting as plotting +import logging +import sys + +logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) + +def round_to_ints(histo): + new = histo.Clone() + new.Reset() + for bin in range(histo.GetNbinsX()+1): + nentries = ROOT.TMath.Nint(histo.GetBinContent(bin)) \ + if histo.GetBinContent(bin) >= 0 else 0 + centerx = histo.GetXaxis().GetBinCenter(bin) + for _ in range(nentries): + new.Fill(centerx) + return new + + +ROOT.gROOT.SetBatch(True) +ROOT.gROOT.SetStyle("Plain") +ROOT.gStyle.SetOptTitle(0) +ROOT.gStyle.SetOptStat(0) + +jobid = os.environ['jobid'] + +rebinPt = ( + [10,12,15,20,25,30,35,40,45,50,60,70,100], #,150,200], + [10,12,15,20,25,30,35,40,45,50,60,70,100], #range(0,50,5)+range(50,110,10), + ) + +rebinJet = ( + [0,1,2,3,4,6,9,12], + [0,1,2,3,4,6,9,12], + #range(13), + ) + +axes = { + 'muonPt' : 'muon p_{T} (GeV)', + 'muonJetPt' : 'muon p_{T}^{Jet} (GeV)', + 'numJets20' : '# Jets', + 'electronPt' : 'electron p_{T} (GeV)', + 'electronJetPt' : 'electron p_{T}^{Jet} (GeV)', +} + +sources = { + ##MMT + 'm_mmt_subleading_kNN' : { + 'vars' : {'muonPt':rebinPt, 'muonJetPt':rebinPt, 'numJets20':rebinJet}, + 'wjets' : 'results/%s/fakerate_fits/mm_wjets_pt10_h2taucuts020_muonInfo_k50.data.kNN.root' % jobid, + 'qcd' : 'results/%s/fakerate_fits/mm_qcd_pt10_h2taucuts020_muonInfo_k50.data.kNN.root' % jobid, + }, + 'm_mmt_leading_kNN' : { + 'vars' : {'muonPt':rebinPt, 'muonJetPt':rebinPt, 'numJets20':rebinJet}, + 'wjets' : 'results/%s/fakerate_fits/mm_wjets_pt10_h2taucuts_muonInfo_k50.data.kNN.root' % jobid, + 'qcd' : 'results/%s/fakerate_fits/mm_qcd_pt10_h2taucuts_muonInfo_k50.data.kNN.root' % jobid, + }, + + #EMT + 'm_emt_kNN' : { + 'vars' : {'muonPt':rebinPt, 'muonJetPt':rebinPt, 'numJets20':rebinJet}, + 'wjets' : 'results/%s/fakerate_fits/em_Mwjets_pt10_h2taucuts_muonInfo_k50.data.kNN.root' % jobid, + 'qcd' : 'results/%s/fakerate_fits/em_Mqcd_pt10_h2taucuts_muonInfo_k50.data.kNN.root' % jobid, + }, + 'e_emt_kNN' : { + 'vars' : {'electronPt':rebinPt, 'electronJetPt':rebinPt, 'numJets20':rebinJet}, + 'wjets' : 'results/%s/fakerate_fits/em_wjets_pt10_eid12Medium_h2taucuts_electronInfo_k50.data.kNN.root' % jobid, + 'qcd' : 'results/%s/fakerate_fits/em_qcd_pt10_eid12Medium_h2taucuts_electronInfo_k50.data.kNN.root' % jobid, + }, + + #EET + #'e_eet_subleading_kNN' : { + # 'vars' : {'electronPt':rebinPt, 'electronJetPt':rebinPt, 'numJets20':rebinJet}, + # 'wjets' : 'results/%s/fakerate_fits/ee_wjetsNoZmass_pt10_eid12Medium_h2taucuts020_electronInfo_k50.kNN.root' % jobid, + # 'qcd' : 'results/%s/fakerate_fits/ee_qcd_pt10_eid12Medium_h2taucuts020_electronInfo_k50.kNN.root' % jobid, + # }, + #'e_eet_leading_kNN' : { + # 'vars' : {'electronPt':rebinPt, 'electronJetPt':rebinPt, 'numJets20':rebinJet}, + # 'wjets' : 'results/%s/fakerate_fits/ee_wjetsNoZmass_pt10_eid12Tight_h2taucuts_electronInfo_k50.kNN.root' % jobid, + # 'qcd' : 'results/%s/fakerate_fits/ee_qcd_pt10_eid12Tight_h2taucuts_electronInfo_k50.kNN.root' % jobid, + # }, +} + +canvas = plotting.Canvas(800, 800, name='adsf', title='asdf') +canvas.SetLogy(True) + +#from pdb import set_trace; set_trace() +for output, info in sources.iteritems(): + logging.info("analyzing %s" % output) + wjets_name = info['wjets'] + #qcd_name = info['qcd'] + variables = info['vars'] + + wjets_file = ROOT.TFile.Open(wjets_name) + logging.debug('filename: %s instance: %s' % (wjets_name, wjets_file.__repr__())) + #qcd_file = ROOT.TFile.Open(qcd_name) + #logging.debug('filename: %s instance: %s' % (qcd_name, qcd_file.__repr__())) + + for var, rebins in variables.iteritems(): + logging.debug('variable %s' % var) + ##### + #WJets fake rate + ##### + wjets_view = RebinView(wjets_file, rebins[0]) + wjets_eff = asrootpy( + ROOT.TGraphAsymmErrors( + round_to_ints( wjets_view.Get('%s_pass' % var)), + round_to_ints( wjets_view.Get('%s_all' % var)) + ) + ) + wjets_eff.SetTitle('WJets fake rate') + wjets_eff.markerstyle = 20 + wjets_eff.markercolor = ROOT.EColor.kBlue + + ##### + #QCD fake rate + ##### + #qcd_view = RebinView(qcd_file, rebins[0]) + #qcd_eff = asrootpy( + # ROOT.TGraphAsymmErrors( + # round_to_ints(qcd_view.Get('%s_pass' % var)), + # round_to_ints(qcd_view.Get('%s_all' % var)) + # ) + #) + #qcd_eff.SetTitle('QCD fake rate') + #qcd_eff.markerstyle = 20 + #qcd_eff.markercolor = ROOT.EColor.kRed + + + ##### + #WJets kNN output + ##### + wjets_view = RebinView(wjets_file, rebins[1]) + wjets_estimate = asrootpy( + wjets_view.Get('%s_estimate' % var) + ) + wjets_estimate_denom = asrootpy( + wjets_view.Get('%s_estimate_all' % var) + ) + wjets_estimate.Divide(wjets_estimate_denom) + wjets_estimate.SetTitle('WJets kNN output') + wjets_estimate.linecolor = ROOT.kBlue + wjets_estimate.linewidth = 2 + wjets_estimate.legendstyle = 'l' + wjets_estimate.fillstyle = 0 + wjets_estimate.drawstyle = 'hist' + + ##### + #QCD kNN output + ##### + #qcd_view = RebinView(qcd_file, rebins[1]) + #qcd_estimate = asrootpy( + # qcd_view.Get('%s_estimate' % var) + #) + #qcd_estimate_denom = asrootpy( + # qcd_view.Get('%s_estimate_all' % var) + #) + #qcd_estimate.Divide(qcd_estimate_denom) + #qcd_estimate.SetTitle('QCD kNN output') + #qcd_estimate.linecolor = ROOT.kRed + #qcd_estimate.linewidth = 2 + #qcd_estimate.fillstyle = 0 + #qcd_estimate.legendstyle = 'l' + #qcd_estimate.drawstyle = 'hist' + + canvas.SetGrid() + + wjets_estimate.GetXaxis().SetTitle(axes[var]) + wjets_estimate.GetYaxis().SetTitle('fake rate') + wjets_estimate.GetYaxis().SetRangeUser(10**-2,1.) + for axis in [wjets_estimate.GetXaxis(), wjets_estimate.GetYaxis()]: + axis.SetLabelSize( axis.GetLabelSize()*0.6 ) + axis.SetTitleSize( axis.GetTitleSize()*0.6 ) + #axis.SetTitleOffset( axis.GetTitleOffset()*0.6 ) + + wjets_estimate.Draw() + #qcd_estimate.Draw('same') + + wjets_eff.Draw('P SAME') + #qcd_eff.Draw('P SAME') + + ##### + #Legend + ##### + legend = plotting.Legend(2, rightmargin=0.02, topmargin=0.05, leftmargin=0.45) + legend.AddEntry(wjets_estimate) + #legend.AddEntry(qcd_estimate) + legend.AddEntry(wjets_eff) + #legend.AddEntry(qcd_eff) + legend.SetTextSize(0.5*legend.GetTextSize()) + legend.SetEntrySeparation(0.0) + legend.SetMargin(0.35) + legend.Draw() + + canvas.Update() + canvas.SetLogy(True) + print "saving results/%s/fakerate_fits/%s_%s.pdf(png)" % (jobid, output, var) + canvas.SaveAs('results/%s/fakerate_fits/%s_%s.pdf' % (jobid, output, var)) + canvas.SaveAs('results/%s/fakerate_fits/%s_%s.png' % (jobid, output, var)) + + + wjets_file.Close() + #qcd_file.Close() diff --git a/wh/print_evt_list.py b/wh/print_evt_list.py new file mode 100755 index 00000000..6fd69361 --- /dev/null +++ b/wh/print_evt_list.py @@ -0,0 +1,15 @@ +#! /bin/env python + +import ROOT +import sys + +tfile_path = sys.argv[-2] +tree_path = sys.argv[-1] + +tfile = ROOT.TFile.Open(tfile_path) +tree = tfile.Get(tree_path) + +for row in tree: + print '%i:%i:%i' % (row.run, row.lumi, row.evt) + + diff --git a/wh/run.sh b/wh/run.sh index 0b0ba5e8..7ef7c979 100755 --- a/wh/run.sh +++ b/wh/run.sh @@ -8,25 +8,27 @@ source jobid.sh export jobid=$jobid8 rake fakerates -rake fits - -#rake mmcontrol -#rake emcontrol -rake eecontrol +rake charge_fakes +rake kNN rake mmt rake emt rake eet -#export jobid=$jobid7 -#rake fakerates -#rake fits +rake mmcontrol +rake emcontrol +rake eecontrol -#rake mmcontrol -#rake emcontrol -#rake eecontrol +export jobid=$jobid7 +rake fakerates +rake charge_fakes +rake kNN +#rake fits -#rake mmt -#rake emt -#rake eet +rake mmt +rake emt +rake eet +rake mmcontrol +rake emcontrol +rake eecontrol diff --git a/wh/setup.sh b/wh/setup.sh index 3c60d84a..5aabb3e8 100755 --- a/wh/setup.sh +++ b/wh/setup.sh @@ -1,6 +1,9 @@ #!/bin/bash # Setup the cython proxies, find input ntuple files, and compute luminosity. +export OVERRIDE_META_TREE_data_DoubleElectron='ee/metaInfo' +export OVERRIDE_META_TREE_data_MuEG='em/metaInfo' +export IGNORE_LUMI_ERRORS=1 source jobid.sh export jobid=$jobid7 @@ -19,7 +22,7 @@ for file in $(ls inputs/$jobid/WZJetsTo3LNu*); do done export jobid=$jobid8 -export datasrc=$(ls -d /scratch/*/data/$jobid | awk -F$jobid '{print $1}') +export datasrc=/hdfs/store/user/$USER/$jobid #$(ls -d /scratch/*/data/$jobid | awk -F$jobid '{print $1}') #./make_proxies.sh for dir in $datasrc; do echo $dir @@ -33,6 +36,10 @@ for file in $(ls inputs/$jobid/WZJetsTo3LNu*); do cp -uv $file $newname done +unset OVERRIDE_META_TREE_data_DoubleElectron +unset OVERRIDE_META_TREE_data_MuEG +unset IGNORE_LUMI_ERRORS + # Use the 7TeV WH samples for 8TeV #pushd inputs/$jobid/ # Symlink the list of input files and the counts of the number of events.