Пример #1
0
def dsid2name(mcChanNum):
    """
    kwargs = {'dsid':mcChannelNumber,'root_tree'=ttree}
    - Ideally, if given something like 'data/ttbar_pre.root', we will return 'ttbar'.
    - Now adding Metadata to the root file, so the desired interface is with 'root_tree'

    Need to add protection against bad/un-supported calls!
    """
    sample_names = info.dsids()
    signal_dsids = [sample_names['signal'][i].keys() for i in sample_names['signal'].keys()]
    signal_dsids = list(itertools.chain(*signal_dsids))
    bckg_dsids   = [sample_names['background'][i].keys() for i in sample_names['background'].keys()]
    bckg_dsids   = list(itertools.chain(*bckg_dsids))

    if mcChanNum == 0:
        dsid_name = 'data'
        dsid_key  = ''
        isMC      = False
    else:
        if mcChanNum in signal_dsids:
            for key in sample_names['signal']:
                dsid_key = key
                try:
                    dsid_name = sample_names['signal'][key][mcChanNum]
                    break
                except KeyError:
                    continue
        elif mcChanNum in bckg_dsids:
            for key in sample_names['background']:
                dsid_key = key
                try:
                    dsid_name = sample_names['background'][key][mcChanNum]
                    break
                except KeyError:
                    continue
        else:
            dsid_name = ''
            dsid_key  = ''

    return {'name':dsid_name,'key':dsid_key}
Пример #2
0
    def event_loop(self,Entry):
        """Running the event selection for a single event."""
        self.entry = Entry
        self.t.GetEntry(self.entry)

        if not self.entry%1000:
            print "  -> Entry {0}".format(self.entry)

        ## Initialize these in case stuff fails we can return empty values
        passedSelection     = False
        savedEventVariables = {'fatjets':   [],\
                               'rcjets':    [],\
                               'resjets':   [],\
                               'bjets':     [],\
                               'jets':      [],\
                               'lepton':    False,\
                               'nu':        False,\
                               'MET':       0,\
                               'HT':        0,\
                               'MC':        {},\
                               'eventinfo': {}}

        # ---------------- #
        # Physics Objects  #
        # ---------------- #
        self.initializeObjects()


        # ---------------- #
        # Cuts             #
        # ---------------- #
        ## Cutting on truth objects? DeltaR matching?
        if any('truth' in i for i in self.cuts):
            truth_objs = truthBase(self.t)
            for truth_obj in truth_objs.keys():
                self.objects[truth_obj] = truth_objs[truth_obj]

        ## -- cuts on objects
        c_objlevel = self.objectLevelCuts()  # function below
        if not c_objlevel['result']:
            return {'objects':savedEventVariables,'result':passedSelection}
        self.objects = c_objlevel['objects']  # update our dictionary of objects

        ## -- cuts on event-level quantities (HT, DeltaR(x,y), etc.)
        c_evtlevel = self.eventLevelCuts()   # function below
        if not c_evtlevel['result']:
            return {'objects':savedEventVariables,'result':passedSelection}
        self.objects = c_evtlevel['objects']

        ## -- record HT if it hasn't been saved or used
        if not self.objects.get('ht'):
            self.objects['ht'] = vlq.calcHT(self.objects)

        # ---------------- #
        # Event Info       #
        # ---------------- #
        signal_dsids = info.dsids()['signal']['TTS'].keys()
        ttbar_dsids  = info.dsids()['background']['ttbar'].keys()
        if self.t.mcChannelNumber in signal_dsids+ttbar_dsids:
            # setup the truth (after cuts and only for signal & ttbar)
            self.MC = truthBase(self.t)
        else:
            self.MC = {}

        boostedEvent   = (len(self.objects['fatjets'])>0)
        resolvedEvent  = (not boostedEvent)

        eventInfo = {'mcWeight':        self.t.weight_mc,\
                     'pileupWeight':    self.t.weight_pileup,\
                     'eventNumber':     self.t.eventNumber,\
                     'runNumber':       self.t.runNumber,\
                     'mcChannelNumber': self.t.mcChannelNumber,\
                     'mu':              self.t.mu,\
                     'weight_btag_track_70': self.t.weight_btag_track_70,\
                     'weight_btag_60':  self.t.weight_btag_60,\
                     'weight_btag_70':  self.t.weight_btag_70,\
                     'weight_btag_77':  self.t.weight_btag_77,\
                     'weight_btag_85':  self.t.weight_btag_85,\
                     'weight_lep_eff':  self.t.weight_lept_eff,\
                     'nAMI':            self.t.AMI,\
                     'isBoosted':       boostedEvent,\
                     'isResolved':      resolvedEvent,\
                     'mujets':          self.t.mujets,\
                     'ejets':           self.t.ejets,\
                     'nbtags':          self.t.btags_n,\
                     'KFactor':         self.t.KFactor,\
                     'XSection':        self.t.XSection,\
                     'vlq_tag':         self.t.vlq_evtype,\
                     'FilterEff':       self.t.FilterEff}

       # ------------------------------------------------------------- #
       # Log the results for inspection later                          #    
       # ------------------------------------------------------------- #
        if self.loggingLEVEL >= 20:
            self.logResults()

       # ------------------------------------------------------------- #
       # Return the results to miniSL.py                               #    
       # ------------------------------------------------------------- #
        passedSelection     = True
        savedEventVariables = {'fatjets':   self.objects['fatjets'],\
                               'rcjets':    self.objects['rcjets'],\
                               'resjets':   self.objects['resjets'],\
                               'lepton':    self.objects['lepton'],\
                               'nu':        self.objects['nu'],\
                               'jets':      self.objects['jets'],\
                               'tjets':     self.objects['tjets'],\
                               'met':       self.objects['met'],\
                               'HT':        self.objects['ht'],\
                               'MC':        self.MC,\
                               'eventinfo': eventInfo}

        ## Analysis-specific custom object :: need to remove this hard-coding...
        if self.objects.get('TTbar'):
            savedEventVariables['TTbar'] = self.objects['TTbar']
        else:
            savedEventVariables['TTbar'] = []


        return {'objects':savedEventVariables,'result':passedSelection}
Пример #3
0
    def event_loop(self,Entry):
        """Running the event selection for a single event."""
        self.entry = Entry

        logging.getLogger('share/{0}.log'.format(self.cfg_name))
        loggingLEVEL = logging.getLogger().getEffectiveLevel() # DEBUG, INFO, ERROR, etc.
        logging.info("")
        logging.critical(" -- In file 'SelectionBase.py'\n")
        logging.info("  ------------  ")

        self.t.GetEntry(self.entry)

        sampleID   = self.t.mcChannelNumber
        if sampleID > 0:
            self.isMC   = True
            evt_weights = self.Weights[self.energy][str(sampleID)]
            KFactor     = evt_weights['KFactor']
            XSection    = evt_weights['XSection']
            FilterEff   = evt_weights['FilterEff']
        else:
            self.isMC   = False
            KFactor     = 1.0
            XSection    = 1.0
            FilterEff   = 1.0


        if not self.entry%1000:
            print "  -> Entry {0}".format(self.entry) # So we can see it's actually running


        # Initialize these variables in case stuff fails 
        # Then, empty things are just passed around
        passedSelection     = False
        savedEventVariables = {'fatjets':   [],\
                               'rcjets':    [],\
                               'resjets':   [],\
                               'bjets':     [],\
                               'lepton':    None,\
                               'nu':        None,\
                               'jets':      [],\
                               'tjets':     [],\
                               'met':       -999.,\
                               'HT':        -999.,\
                               'MC':        {},\
                               'eventinfo': {}}

        # ---------------- #
        # Physics Objects  #
        # ---------------- #
        self.initializeObjects()

        # Protect against events with 3 jets but no boosted candidate
        if len(self.objects['jets']) <= 3 and not self.objects['fatjets']:
            logging.error(" Processing Pre-selection failed ")
            logging.error(" -- Entry {0} ".format(self.entry))
            logging.error(" -- Too few jets (3 small-r jets and not Boosted) ")
            logging.info(" jet assignments failed.") 
            return {'objects':savedEventVariables,'result':passedSelection}


        # ---------------- #
        # Cuts             #
        # ---------------- #
        ## -- cuts on objects
        c_objlevel = self.objectLevelCuts()  # function below
        if not c_objlevel['result']:
            return {'objects':savedEventVariables,'result':passedSelection}
        self.objects = c_objlevel['objects']  # update our dictionary of objects

        ## -- cuts on event-level quantities (HT, DeltaR(x,y), etc.)
        c_evtlevel = self.eventLevelCuts()   # function below
        if not c_evtlevel['result']:
            return {'objects':savedEventVariables,'result':passedSelection}
        self.objects = c_evtlevel['objects']

        ## -- record HT if it hasn't been saved or used
        if not self.objects.get('ht'):
            self.objects['ht'] = vlq.calcHT(self.objects)

        # ---------------- #
        # Hadronic W       #
        # ---------------- #
        logging.debug(' Hadronic W')
        self.resjets  = []

        ## Check for boosted W first
        if not self.objects['fatjets']:
            logging.debug(' Resolved Event')
            self.objects['resjets'] = [self.objects['jets'][0]+self.objects['jets'][1]]


        # ----------------- #
        # Truth Information #
        # ----------------- #
        all_sample_dsids = info.dsids()
        signal_dsids = all_sample_dsids['signal']['TTS'].keys()        # Just TTS
        ttbar_dsids  = all_sample_dsids['background']['ttbar'].keys()
        if self.isMC:
            if self.t.mcChannelNumber in signal_dsids:
                self.SetupTruth('vlq')
            elif self.t.mcChannelNumber in ttbar_dsids:
                if not self.init_prev_entry:
                    prev_truth_entry = 0
                else:
                    prev_truth_entry = int(open(self.ttbar_truth_file,'r').readlines()[0])
                self.SetupTruth('ttbar',prev_truth_entry)
            else:
                self.MC = {}
        else:
            self.MC = {}


        # ---------------- #
        # Event Info       #
        # ---------------- #
        boostedEvent       = (len(self.objects['fatjets'])>0) # converted to int in miniSL
        resolvedEvent      = (not boostedEvent)

        if self.isMC:
            trackjet_btag_weight_70 = self.t.weight_trackjet_bTagSF_70
            btag_weight_60     = self.t.weight_bTagSF_60
            btag_weight_70     = self.t.weight_bTagSF_70
            btag_weight_77     = self.t.weight_bTagSF_77
            btag_weight_85     = self.t.weight_bTagSF_85
            lept_eff           = self.t.weight_leptonSF
            self.weight_mc     = self.t.weight_mc
            self.weight_pileup = self.t.weight_pileup
        else:
            trackjet_btag_weight_70 = 1.0
            btag_weight_60     = 1.0
            btag_weight_70     = 1.0
            btag_weight_77     = 1.0
            btag_weight_85     = 1.0
            lept_eff           = 1.0
            self.weight_mc     = 1.0
            self.weight_pileup = 1.0



        eventInfo = {'mcWeight':        self.weight_mc,\
                     'pileupWeight':    self.weight_pileup,\
                     'eventNumber':     self.t.eventNumber,\
                     'runNumber':       self.t.runNumber,\
                     'mcChannelNumber': self.t.mcChannelNumber,\
                     'mu':              self.t.mu,\
                     'nAMI':            self.eventWeight[self.t.mcChannelNumber],\
                     'KFactor':         KFactor,\
                     'XSection':        XSection,\
                     'FilterEff':       FilterEff,\
                     'weight_btag_track_70': trackjet_btag_weight_70,\
                     'weight_btag_60':  btag_weight_60,\
                     'weight_btag_70':  btag_weight_70,\
                     'weight_btag_77':  btag_weight_77,\
                     'weight_btag_85':  btag_weight_85,\
                     'weight_lep_eff':  lept_eff,\
                     'isBoosted':       boostedEvent,\
                     'isResolved':      resolvedEvent,\
                     'mujets':          self.t.mujets,\
                     'ejets':           self.t.ejets,\
                     'nbtags':          self.objects['nbtags'],\
                     'vlq_tag':         self.objects['vlq_evtype']}



       # ------------------------------------------------------------- #
       # Log the results for inspection later                          #    
       # ------------------------------------------------------------- #
        if loggingLEVEL >= 20:
            self.logResults()

       # ------------------------------------------------------------- #
       # Return the results to miniSL.py                               #    
       # ------------------------------------------------------------- #
        passedSelection     = True
        savedEventVariables = {'fatjets':   self.objects['fatjets'],\
                               'rcjets':    self.objects['rcjets'],\
                               'resjets':   self.objects['resjets'],\
                               'lepton':    self.objects['lepton'],\
                               'nu':        self.objects['nu'],\
                               'jets':      self.objects['jets'],\
                               'tjets':     self.objects['tjets'],\
                               'met':       self.objects['met'],\
                               'HT':        self.objects['ht'],\
                               'MC':        self.MC,\
                               'eventinfo': eventInfo}
        ## Hard-coded analysis-specific objects...
        if self.objects.get('bjets'):
            savedEventVariables['bjets'] = self.objects['bjets']
        else:
            savedEventVariables['bjets'] = []


        return {'objects':savedEventVariables,'result':passedSelection}