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}
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}
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}