def __init__(self,
                 year=2017,
                 sigma='central',
                 sample=None,
                 buggy=False,
                 flat=False):
        """Load data and MC pilup profiles."""

        assert (year
                in [2016, 2017,
                    2018]), "You must choose a year from: 2016, 2017, or 2018."
        assert (
            sigma in ['central', 'up', 'down']
        ), "You must choose a s.d. variation from: 'central', 'up', or 'down'."

        minbias = '69p2'
        if sigma == 'down':
            minbias = '66p0168'  # -4.6%
        elif sigma == 'up':
            minbias = '72p3832'  # +4.6%

        if year == 2016:
            datafilename = path + "Data_PileUp_2016_%s.root" % (minbias)
            mcfilename = path + "MC_PileUp_2016_Moriond17.root"
        elif year == 2017:
            tag = ""
            if buggy or sample:
                buggy = buggy or hasBuggyPU(sample)
                if buggy: tag = "_old_pmx"
                else: tag = "_new_pmx"
            datafilename = path + "Data_PileUp_2017_%s.root" % (minbias)
            mcfilename = path + "MC_PileUp_2017_Winter17_V2%s.root" % (tag)
        else:
            datafilename = path + "Data_PileUp_2018_%s.root" % (minbias)
            mcfilename = path + "MC_PileUp_2018_Autumn18.root"

        if flat or (sample and hasFlatPU(sample)):
            mcfilename = path + "MC_PileUp_%d_FlatPU0to75.root" % year

        print "Loading PileupWeightTool for '%s' and '%s'" % (datafilename,
                                                              mcfilename)
        self.datafile = ensureTFile(datafilename, 'READ')
        self.mcfile = ensureTFile(mcfilename, 'READ')
        self.datahist = self.datafile.Get('pileup')
        self.mchist = self.mcfile.Get('pileup')
        self.datahist.SetDirectory(0)
        self.mchist.SetDirectory(0)
        self.datahist.Scale(1. / self.datahist.Integral())
        self.mchist.Scale(1. / self.mchist.Integral())
        self.datafile.Close()
        self.mcfile.Close()
 def __init__(self, filename_1, filename_2, type, year):
     print '>>> ScaleFactor.init(file_1="%s", file_2="%s" ,type="%s")' % (
         filename_1, filename_2, type)
     self.type = type
     self.filename_1 = filename_1
     self.filename_2 = filename_2
     if type != 'selection':
         self.datafile = ensureTFile(filename_1)
         self.embfile = ensureTFile(filename_2)
         self.datahist = self.datafile.Get('{}_pt_eta_bins'.format(type))
         self.embhist = self.embfile.Get('{}_pt_eta_bins'.format(type))
     else:
         self.file_1 = ensureTFile(filename_1)
         self.file_2 = ensureTFile(filename_2)
         if year == 2018:
             self.file_1_hist = self.file_1.Get('Mu8_pt_eta_bins')
             self.file_2_hist = self.file_2.Get('Mu17_pt_eta_bins')
         elif year == 2017:
             self.file_1_hist = self.file_1.Get('data_trg_eff')
             self.file_2_hist = self.file_2.Get('data_trg_eff')
         elif year == 2016:
             self.file_1_hist = self.file_1.Get('Trg8_pt_eta_bins')
             self.file_2_hist = self.file_2.Get('Trg17_pt_eta_bins')
예제 #3
0
 def __init__(self, filename, graphname='ZMass', name="<noname>"):
     #print '>>> ScaleFactor.init("%s","%s",name="%s")'%(filename,graphname,name)
     self.name      = name
     self.filename  = filename
     self.file      = ensureTFile(filename)
     self.hist_eta  = self.file.Get('etaBinsH')
     self.hist_eta.SetDirectory(0)
     self.effs_data = { }
     self.effs_mc   = { }
     for ieta in range(1,self.hist_eta.GetXaxis().GetNbins()+1):
       etalabel = self.hist_eta.GetXaxis().GetBinLabel(ieta)
       self.effs_data[etalabel] = self.file.Get(graphname+etalabel+"_Data")
       self.effs_mc[etalabel]   = self.file.Get(graphname+etalabel+"_MC")
     self.file.Close()
예제 #4
0
 def __init__(self, filename, histname, name="<noname>", ptvseta=True):
     #print '>>> ScaleFactor.init("%s","%s",name="%s",ptvseta=%r)'%(filename,histname,name,ptvseta)
     self.name     = name
     self.ptvseta  = ptvseta
     self.filename = filename
     self.file     = ensureTFile(filename)
     self.hist     = self.file.Get(histname)
     if not self.hist:
       print '>>> ScaleFactor(%s).__init__: histogram "%s" does not exist in "%s"'%(self.name,histname,filename)
       exit(1)
     self.hist.SetDirectory(0)
     self.file.Close()
     
     if ptvseta: self.getSF = self.getSF_ptvseta
     else:       self.getSF = self.getSF_etavspt
예제 #5
0
 def __init__(self, trigger, wp='medium', id='MVAv2', year=2016):
     """Load tau trigger histograms from files."""
     print "Loading TauTriggerSFs for %s (%s WP)..."%(trigger,wp)
     
     trigger = trigger.replace('tautau','ditau').replace('eletau','etau')
     assert(trigger in ['ditau', 'mutau', 'etau']), "Choose from: 'ditau', 'mutau', 'etau' triggers."
     assert(wp in ['vloose', 'loose', 'medium', 'tight', 'vtight', 'vvtight']), "You must choose a WP from: vloose, loose, medium, tight, vtight, or vvtight"
     assert(id in ['MVAv2', 'dR0p3']), "Choose from two provided ID types: 'MVAv2', 'dR0p3'. 'MVAv2' uses dR0p5, and 'dR0p3' is also an MVA-based ID."
     assert(id=='MVAv2'), "Tau POG is currently only providing efficiencies for MVAv2, sorry."
     assert(year in [2016,2017,2018]), "You must choose a year from: 2016, 2017, or 2018."
     print "Loading Efficiencies for trigger %s usingTau %s ID WP %s for year %i"%(trigger,id,wp,year)
     
     file = ensureTFile( path+'%d/tauTriggerEfficiencies%i.root'%(year,year), 'r' )
     
     self.fit_data = { }
     self.fit_mc   = { }
     self.fitUnc_data = { }
     self.fitUnc_mc   = { }
     self.effEtaPhi_data = { }
     self.effEtaPhi_mc   = { }
     self.effEtaPhiAvg_data = { }
     self.effEtaPhiAvg_mc   = { }
     
     # LOOP over decay modes
     for dm in [0,1,10]:
       
       # LOAD the TF1s containing the analytic best-fit results
       self.fit_data[dm] = extractTH1(file,'%s_%s%s_dm%d_DATA_fit'%(trigger,wp,id,dm))
       self.fit_mc[dm]   = extractTH1(file,'%s_%s%s_dm%d_MC_fit'%(  trigger,wp,id,dm))
       
       # LOAD the TH1s containing the analytic best-fit result in 1 GeV incriments and the associated uncertainty
       self.fitUnc_data[dm] = extractTH1(file,'%s_%s%s_dm%d_DATA_errorBand'%(trigger,wp,id,dm))
       self.fitUnc_mc[dm]   = extractTH1(file,'%s_%s%s_dm%d_MC_errorBand'%(  trigger,wp,id,dm))
       
       # LOAD the TH2s containing the eta phi efficiency corrections
       self.effEtaPhi_data[dm] = extractTH1(file,'%s_%s%s_dm%d_DATA'%(trigger,wp,id,dm))
       self.effEtaPhi_mc[dm]   = extractTH1(file,'%s_%s%s_dm%d_MC'%(  trigger,wp,id,dm))
       
       # LOAD eta phi Averages
       self.effEtaPhiAvg_data[dm] = extractTH1(file,'%s_%s%s_dm%d_DATA_AVG'%(trigger,wp,id,dm))
       self.effEtaPhiAvg_mc[dm]   = extractTH1(file,'%s_%s%s_dm%d_MC_AVG'%(  trigger,wp,id,dm))
     
     file.Close()
     
     self.trigger = trigger
     self.year = year
     self.wp = wp
     self.id = id
예제 #6
0
    def __init__(self, year=2017):
        """Load Z pT weights."""
        assert year in [
            2016, 2017, 2018
        ], "ZptCorrectionTool: You must choose a year from: 2016, 2017, or 2018."

        if year == 2016:
            filename = zptpath + "Zpt_weights_2016.root"
        elif year == 2017:
            filename = zptpath + "Zpt_weights_2017.root"
        else:
            filename = zptpath + "Zpt_weights_2018.root"

        file = ensureTFile(filename, 'READ')
        hist = file.Get('zptmass_weights')
        hist.SetDirectory(0)
        file.Close()

        self.hist = hist
        self.filename = filename
    def __init__(self, year=2017, sigma='central', sample=None, buggy=False):
        """Load data and MC pilup profiles."""

        assert (year
                in [2016, 2017,
                    2018]), "You must choose a year from: 2016, 2017, or 2018."
        assert (
            sigma in ['central', 'up', 'down']
        ), "You must choose a s.d. variation from: 'central', 'up', or 'down'."

        minbias = '69p2'
        if sigma == 'down':
            minbias = '66p0168'  # -4.6%
        elif sigma == 'up':
            minbias = '72p3832'  # +4.6%

        if year == 2016:
            self.datafile = ensureTFile(
                path + 'Data_PileUp_2016_%s.root' % (minbias), 'READ')
            self.mcfile = ensureTFile(path + 'MC_PileUp_2016_Moriond17.root',
                                      'READ')
        elif year == 2017:
            tag = ""
            if buggy or sample:
                if buggy or hasBuggyPU(sample): tag = "_old_pmx"
                else: tag = "_new_pmx"
            self.datafile = ensureTFile(
                path + 'Data_PileUp_2017_%s.root' % (minbias), 'READ')
            self.mcfile = ensureTFile(
                path + 'MC_PileUp_2017_Winter17_V2%s.root' % (tag), 'READ')
        else:
            self.datafile = ensureTFile(
                path + 'Data_PileUp_2018_%s.root' % (minbias), 'READ')
            self.mcfile = ensureTFile(path + 'MC_PileUp_2018_Autumn18.root',
                                      'READ')
        self.datahist = self.datafile.Get('pileup')
        self.mchist = self.mcfile.Get('pileup')
        self.datahist.SetDirectory(0)
        self.mchist.SetDirectory(0)
        self.datahist.Scale(1. / self.datahist.Integral())
        self.mchist.Scale(1. / self.mchist.Integral())
        self.datafile.Close()
        self.mcfile.Close()
예제 #8
0
    def __init__(self,
                 tagger,
                 wp='medium',
                 sigma='central',
                 channel='mutau',
                 year=2017,
                 maxeta=2.4):
        """Load b tag weights from CSV file."""

        assert (year
                in [2016, 2017,
                    2018]), "You must choose a year from: 2016, 2017, or 2018."
        assert (tagger in [
            'CSVv2', 'DeepCSV'
        ]), "BTagWeightTool: You must choose a tagger from: CSVv2, DeepCSV!"
        assert (wp in [
            'loose', 'medium', 'tight'
        ]), "BTagWeightTool: You must choose a WP from: loose, medium, tight!"
        assert (sigma in [
            'central', 'up', 'down'
        ]), "BTagWeightTool: You must choose a WP from: central, up, down!"
        #assert(channel in ['mutau','eletau','tautau','mumu']), "BTagWeightTool: You must choose a channel from: mutau, eletau, tautau, mumu!"

        # FILE
        if year == 2016:
            if 'deep' in tagger.lower():
                csvname = path + 'DeepCSV_Moriond17_B_H.csv'
                effname = path + 'DeepCSV_2016_Moriond17_eff.root'
            else:
                csvname = path + 'CSVv2_Moriond17_B_H.csv'
                effname = path + 'CSVv2_2016_Moriond17_eff.root'
        elif year == 2017:
            if 'deep' in tagger.lower():
                csvname = path + 'DeepCSV_94XSF_V3_B_F.csv'
                effname = path + 'DeepCSV_2017_12Apr2017_eff.root'
            else:
                csvname = path + 'CSVv2_94XSF_V2_B_F.csv'
                effname = path + 'CSVv2_2017_12Apr2017_eff.root'
        elif year == 2018:
            if 'deep' in tagger.lower():
                csvname = path + 'DeepCSV_94XSF_V3_B_F.csv'
                effname = path + 'DeepCSV_2018_Autumn18_eff.root'
            else:
                csvname = path + 'CSVv2_94XSF_V2_B_F.csv'
                effname = path + 'CSVv2_2018_Autumn18_eff.root'

        # TAGGING WP
        self.wpname = wp
        self.wp = getattr(BTagWPs(tagger, year), wp)
        if 'deep' in tagger.lower():
            tagged = lambda e, i: e.Jet_btagDeepB[i] > self.wp
        else:
            tagged = lambda e, i: e.Jet_btagCSVV2[i] > self.wp

        # CSV READER
        print "Loading BTagWeightTool for %s (%s WP)..." % (tagger, wp)
        op = OP_LOOSE if wp == 'loose' else OP_MEDIUM if wp == 'medium' else OP_TIGHT if wp == 'tight' else OP_RESHAPING
        type_udsg = 'incl'
        type_bc = 'comb'  # 'mujets' for QCD; 'comb' for QCD+TT
        calib = BTagCalibration(tagger, csvname)
        reader = BTagCalibrationReader(op, sigma)
        reader.load(calib, FLAV_B, type_bc)
        reader.load(calib, FLAV_C, type_bc)
        reader.load(calib, FLAV_UDSG, type_udsg)

        # EFFICIENCIES
        hists = {}  # histograms to compute the b tagging efficiencies in MC
        effmaps = {
        }  # b tag efficiencies in MC to compute b tagging weight for an event
        efffile = ensureTFile(effname)
        default = False
        if not efffile:
            warning(
                "File %s with efficiency histograms does not exist! Reverting to default efficiency histogram..."
                % (effname),
                title="BTagWeightTool")
            default = True
        for flavor in [0, 4, 5]:
            flavor = flavorToString(flavor)
            histname = "%s_%s_%s" % (tagger, flavor, wp)
            effname = "%s/eff_%s_%s_%s" % (channel, tagger, flavor, wp)
            hists[flavor] = createEfficienyMap(
                histname)  # numerator   = b tagged jets
            hists[flavor + '_all'] = createEfficienyMap(
                histname + '_all')  # denominator = all jets
            if efffile:
                effmaps[flavor] = efffile.Get(effname)
                if not effmaps[flavor]:
                    warning(
                        "histogram '%s' does not exist in %s! Reverting to default efficiency histogram..."
                        % (effname, efffile.GetName()),
                        title="BTagWeightTool")
                    default = True
                    effmaps[flavor] = createDefaultEfficiencyMap(
                        effname, flavor, wp)
            else:
                effmaps[flavor] = createDefaultEfficiencyMap(
                    effname, flavor, wp)
            effmaps[flavor].SetDirectory(0)
        efffile.Close()

        if default:
            warning("Made use of default efficiency histograms! The b tag weights from this module should be regarded as placeholders only,\n"+\
                    "and should NOT be used for analyses. B (mis)tag efficiencies in MC are analysis dependent. Please create your own\n"+\
                    "efficiency histogram with corrections/btag/getBTagEfficiencies.py after running all MC samples with BTagWeightTool.",title="BTagWeightTool")

        self.tagged = tagged
        self.calib = calib
        self.reader = reader
        self.hists = hists
        self.effmaps = effmaps
        self.maxeta = maxeta