def mc_stack_n_data_sum(wrps, merge_mc_key_func=None, use_all_data_lumi=False): """ Stacks MC histos and merges data, input needs to be sorted and grouped. The output are tuples of MC stacks and data histograms. ATTENTION: This crashes, if the proper histograms are not present! :param wrps: Iterables of HistoWrapper (grouped) :param merge_mc_key_func: key function for python sorted(...), default tries to sort after stack position :yields: (StackWrapper, HistoWrapper) """ if not merge_mc_key_func: merge_mc_key_func = lambda w: settings.get_stack_position(w.sample) for grp in wrps: # split stream data, mc = split_data_mc(grp) # sum up data data_sum = None try: data_sum = op.sum(data) except op.TooFewWrpsError: print "WARNING generators.mc_stack_n_data_sum(..): "\ "No data histos present! I will yield only mc." if use_all_data_lumi: data_lumi = settings.data_lumi_sum_wrp() else: data_lumi = op.lumi(data_sum) # merge mc samples (merge also normalizes to lumi = 1.) mc_sorted = sorted(mc, key=merge_mc_key_func) mc_groupd = group(mc_sorted, merge_mc_key_func) mc_merged = (op.merge(g) for g in mc_groupd) mc_colord = apply_histo_fillcolor(mc_merged) # stack mc mc_norm = gen_prod( itertools.izip(mc_colord, itertools.repeat(data_lumi))) mc_stck = None try: mc_stck = op.stack(mc_norm) except op.TooFewWrpsError: print "WARNING generators.mc_stack_n_data_sum(..): " \ "No mc histos present! I will yield only data" if mc_stck and data_sum: yield mc_stck, data_sum elif mc_stck: yield (mc_stck, ) elif data_sum: yield (data_sum, ) else: raise op.TooFewWrpsError("Neither data nor mc histos present!")
def mc_stack_n_data_sum(wrps, merge_mc_key_func=None, use_all_data_lumi=False): """ Stacks MC histos and merges data, input needs to be sorted and grouped. The output are tuples of MC stacks and data histograms. ATTENTION: This crashes, if the proper histograms are not present! :param wrps: Iterables of HistoWrapper (grouped) :param merge_mc_key_func: key function for python sorted(...), default tries to sort after stack position :yields: (StackWrapper, HistoWrapper) """ if not merge_mc_key_func: merge_mc_key_func = lambda w: settings.get_stack_position(w.sample) for grp in wrps: # split stream data, mc = split_data_mc(grp) # sum up data data_sum = None try: data_sum = op.sum(data) except op.TooFewWrpsError: print "WARNING generators.mc_stack_n_data_sum(..): "\ "No data histos present! I will yield only mc." if use_all_data_lumi: data_lumi = settings.data_lumi_sum_wrp() else: data_lumi = op.lumi(data_sum) # merge mc samples (merge also normalizes to lumi = 1.) mc_sorted = sorted(mc, key=merge_mc_key_func) mc_groupd = group(mc_sorted, merge_mc_key_func) mc_merged = (op.merge(g) for g in mc_groupd) mc_colord = apply_histo_fillcolor(mc_merged) # stack mc mc_norm = gen_prod(itertools.izip(mc_colord, itertools.repeat(data_lumi))) mc_stck = None try: mc_stck = op.stack(mc_norm) except op.TooFewWrpsError: print "WARNING generators.mc_stack_n_data_sum(..): " \ "No mc histos present! I will yield only data" if mc_stck and data_sum: yield mc_stck, data_sum elif mc_stck: yield (mc_stck, ) elif data_sum: yield (data_sum, ) else: raise op.TooFewWrpsError("Neither data nor mc histos present!")
def mc_stack(wrps, merge_mc_key_func=None): """ Delivers only MC stacks, feed only with MC. :param wrps: Iterables of HistoWrapper (grouped) :param merge_mc_key_func: key function for python sorted(...), default tries to sort after stack position :yields: StackWrapper """ if not merge_mc_key_func: merge_mc_key_func = lambda w: settings.get_stack_position(w.sample) for grp in wrps: # merge mc samples (merge also normalizes to lumi = 1.) mc_sorted = sorted(grp, key=merge_mc_key_func) mc_groupd = group(mc_sorted, merge_mc_key_func) mc_merged = (op.merge(g) for g in mc_groupd) mc_colord = apply_histo_fillcolor(mc_merged) # stack mc stack = op.stack(mc_colord) yield stack
def mc_stack_n_data_sum(wrps, merge_mc_key_func=None, use_all_data_lumi=True): """ Stacks MC histos and merges data, input needs to be sorted and grouped. Yields tuples of an MC stack, signal histograms, and a data histogram, if all kinds of data are present. Raises an exception if no histograms are given at all. :param wrps: Iterables of HistoWrapper (grouped) :param merge_mc_key_func: key function for python sorted(...), default tries to sort after stack position :yields: WrapperWrapper of wrappers for plotting """ if not merge_mc_key_func: merge_mc_key_func = analysis.get_stack_position for grp in wrps: # split stream dat, bkg, sig = split_data_bkg_sig(grp) # data dat_sum = None try: dat_sum = op.sum(dat) except op.TooFewWrpsError: monitor.message('generators.mc_stack_n_data_sum', 'DEBUG No data histograms present!') if dat_sum and not use_all_data_lumi: data_lumi = op.lumi(dat_sum) else: data_lumi = analysis.data_lumi_sum_wrp() # background (op.merge normalizes to lumi = 1.) bkg = sorted(bkg, key=merge_mc_key_func) is_2d = bkg and 'TH2' in bkg[0].type bkg = group(bkg, merge_mc_key_func) bkg = (op.merge(g) for g in bkg) bkg = apply_fillcolor(bkg) if settings.stack_line_color: bkg = apply_linecolor(bkg, settings.stack_line_color) if data_lumi.float != 1.: bkg = gen_prod(itertools.izip(bkg, itertools.repeat(data_lumi))) try: if is_2d: bkg_stk = gen_squash_sys_acc(bkg, op.sum) else: bkg_stk = gen_squash_sys_acc(bkg, op.stack) except op.TooFewWrpsError: bkg_stk = None monitor.message('generators.mc_stack_n_data_sum', 'DEBUG No background histograms present!') # signal sig = sorted(sig, key=merge_mc_key_func) sig = group(sig, merge_mc_key_func) sig = list(op.merge(g) for g in sig) if any(s.sys_info for s in sig): sig = sorted(sig, key=lambda s: s.sample) sig = group(sig, lambda s: s.sample) sig = (gen_squash_sys(s) for s in sig) sig = apply_linecolor(sig) sig = apply_linewidth(sig) sig = list(sig) if not sig: monitor.message('generators.mc_stack_n_data_sum', 'DEBUG No signal histograms present!') # return in order for plotting: bkg, signals, data res = [bkg_stk] + sig + [dat_sum] res = list(r for r in res if r) if res: yield wrappers.WrapperWrapper(res, name=grp.name) else: raise op.TooFewWrpsError('No histograms present!')