Example #1
0
    def make_signal_views(self, rebin, unblinded=True):
        ''' Make signal views with FR background estimation '''

        wz_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('WZ*'), rebin), 'os/All_Passed/')
        zz_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('ZZ*'), rebin), 'os/All_Passed/')
        all_data_view = self.rebin_view(self.get_view('data'), rebin)
        if unblinded and self.blind:
            all_data_view = self.rebin_view(
                self.get_view('data', 'unblinded_view'), rebin)

        data_view = views.SubdirectoryView(all_data_view, 'os/All_Passed/')
        #Categories (to match Abdollah's naming convention)
        probes = [p + 'IsoFailed' for p in products_map[self.channel][1]]
        cat0 = 'os/' + '_'.join(probes) + '/all_weights_applied/'
        cat1 = 'os/' + probes[0] + '/obj1_weight/'
        cat2 = 'os/' + probes[1] + '/obj2_weight/'

        # View of weighted obj1-fails data
        cat1_view = views.SubdirectoryView(all_data_view, cat1)
        # View of weighted obj2-fails data
        cat2_view = views.SubdirectoryView(all_data_view, cat2)
        # View of weighted obj1&2-fails data
        cat0_view = views.SubdirectoryView(all_data_view, cat0)

        subtract_cat0_view = views.ScaleView(cat0_view, -1)
        # Corrected fake view
        Zjets_view = views.SumView(cat1_view, cat2_view, subtract_cat0_view)
        Zjets_view = views.TitleView(
            views.StyleView(Zjets_view, **data_styles['Zjets*']), 'Non-prompt')

        charge_fakes = views.TitleView(
            views.StyleView(
                views.SubdirectoryView(all_data_view, 'os/p1p2p3/c1'),
                **data_styles['TT*']), 'Charge mis-id')

        output = {
            'wz': wz_view,
            'zz': zz_view,
            'data': data_view,
            'cat1': cat1_view,
            'cat2': cat2_view,
            'Zjets': Zjets_view,
            'charge_fakes': charge_fakes,
        }

        # Add signal
        for mass in [110, 120, 130, 140]:
            vh_view = views.SubdirectoryView(
                self.rebin_view(self.get_view('VH_H2Tau_M-%i' % mass), rebin),
                'os/All_Passed/')
            output['vh%i' % mass] = vh_view
            ww_view = views.SubdirectoryView(
                self.rebin_view(self.get_view('VH_%i_HWW' % mass), rebin),
                'os/All_Passed/')
            output['vh%i_hww' % mass] = ww_view
            output['signal%i' % mass] = views.SumView(ww_view, vh_view)

        return output
Example #2
0
            def make_fakes_view(weight_type, 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/%s/f1p2f3/%s1' % (tau_charge, weight_type))
                # View of weighted obj2-fails data
                obj2_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/p1f2f3/%s2' % (tau_charge, weight_type))
                # View of weighted obj1&2-fails data
                obj12_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/f1f2f3/%s12' % (tau_charge, weight_type))

                # Give the individual object views nice colors
                obj1_view = views.TitleView(
                    views.StyleView(obj1_view, **remove_name_entry(data_styles['TT*'])),
                    'Reducible bkg. 1')
                obj2_view = views.TitleView(
                    views.StyleView(obj2_view, **remove_name_entry(data_styles['QCD*'])),
                    'Reducible bkg. 2')
                obj12_view = views.TitleView(
                    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
    def make_signal_views(self, rebin, unblinded=True):
        ''' Make signal views with FR background estimation '''

        wz_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('WZJetsTo3LNu*'), rebin),
            'ss/p1p2p3/')
        zz_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('ZZJetsTo4L*'), rebin), 'ss/p1p2p3/')
        all_data_view = self.rebin_view(self.get_view('data'), rebin)
        if unblinded:
            all_data_view = self.rebin_view(
                self.get_view('data', 'unblinded_view'), rebin)

        data_view = views.SubdirectoryView(all_data_view, 'ss/p1p2p3/')

        # View of weighted obj1-fails data
        obj1_view = views.SubdirectoryView(all_data_view, 'ss/f1p2p3/w1')
        # View of weighted obj2-fails data
        obj2_view = views.SubdirectoryView(all_data_view, 'ss/p1f2p3/w2')
        # View of weighted obj1&2-fails data
        obj12_view = views.SubdirectoryView(all_data_view, 'ss/f1f2p3/w12')

        subtract_obj12_view = views.ScaleView(obj12_view, -1)
        # Corrected fake view
        fakes_view = views.SumView(obj1_view, obj2_view, subtract_obj12_view)
        fakes_view = views.TitleView(
            views.StyleView(fakes_view, **data_styles['Zjets*']), 'Non-prompt')

        charge_fakes = views.TitleView(
            views.StyleView(
                views.SubdirectoryView(all_data_view, 'os/p1p2p3/c1'),
                **data_styles['TT*']), 'Charge mis-id')

        output = {
            'wz': wz_view,
            'zz': zz_view,
            'data': data_view,
            'obj1': obj1_view,
            'obj2': obj2_view,
            'fakes': fakes_view,
            'charge_fakes': charge_fakes,
        }

        # Add signal
        for mass in [110, 120, 130, 140]:
            vh_view = views.SubdirectoryView(
                self.rebin_view(self.get_view('VH_*%i' % mass), rebin),
                'ss/p1p2p3/')
            output['vh%i' % mass] = vh_view
            ww_view = views.SubdirectoryView(
                self.rebin_view(self.get_view('WH_%i*' % mass), rebin),
                'ss/p1p2p3/')
            output['vh%i_hww' % mass] = ww_view
            output['signal%i' % mass] = views.SumView(ww_view, vh_view)

        return output
Example #4
0
    def make_views(self, rebin):
        ''' Make signal views with FR background estimation '''

        wz_view = InflateErrorView(
            views.SubdirectoryView(
                self.rebin_view(self.get_view('WZ*'), rebin), 'charge'), 0.16)

        zz_view = InflateErrorView(
            views.SubdirectoryView(
                self.rebin_view(self.get_view('ZZ*'), rebin), 'charge'), 0.16)

        zj_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('Zjets*'), rebin), 'charge')

        diboson_view = views.StyleView(views.SumView(wz_view, zz_view),
                                       fillcolor=(ROOT.EColor.kRed - 7),
                                       drawstyle='hist')
        all_data_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('data'), rebin), 'charge')

        output = {
            'wz': wz_view,
            'zz': zz_view,
            'zjets': zj_view,
            'data': all_data_view,
            'diboson': diboson_view,
        }

        return output
Example #5
0
    def make_qcd_proj_views(self, control_region, rebin):
        ''' Make views when obj1 or obj2 fails, projecting QCD in

        QCD comes from the triple fake region
        '''
        all_data_view = self.rebin_view(self.get_view('data'), rebin)

        mapping = {
            1: {
                'obs': 'ss/tau_os/f1p2p3',
                'qcd': 'ss/tau_os/f1f2f3/w23',
            },
            2: {
                'obs': 'ss/tau_os/p1f2p3',
                'qcd': 'ss/tau_os/f1f2f3/w13',
            },
        }

        data_view = views.TitleView(views.SubdirectoryView(
            all_data_view, mapping[control_region]['obs']),
            "Anti-iso obj %i" % control_region)

        qcd_view = views.TitleView(views.SubdirectoryView(
            all_data_view, mapping[control_region]['qcd']), "QCD")

        qcd_view = views.StyleView(
            qcd_view, drawstyle='hist', linecolor=colors['red'],
            fillstyle=0, legendstyle='l'
        )
        return {'obs': data_view, 'qcd': qcd_view}
Example #6
0
def make_view(inview, title, color):
    return views.TitleView(
        views.StyleView(inview,
                        linecolor=color,
                        drawstyle='hist',
                        linewidth=3,
                        legendstyle='l'), title)
Example #7
0
def make_view(tf, subdir, title, colour):
    return urviews.NormalizedView(
        views.TitleView(
            views.StyleView(views.SubdirectoryView(tf, subdir),
                            linecolor=colour,
                            drawstyle='hist',
                            linewidth=3,
                            legendstyle='l'), title))
Example #8
0
    def get_flip_data(self, rebin=1, xaxis='', data_type='data'):
        data_view = self.get_view(data_type)
        data_view = self.rebin_view(data_view,
                                    rebin) if rebin != 1 else data_view
        #Get ss/p1p2 views
        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

        #Get fakes according to WJets or QCD
        #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 = 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_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_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_obj3_fail_cr_views(self, rebin):
        ''' Make views when obj3 fails, estimating the bkg in obj1 pass using
            f1p2f3 '''
        wz_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('WZJetsTo3LNu*'), rebin),
            'ss/p1p2f3/')
        zz_view = views.SubdirectoryView(
            self.rebin_view(self.get_view('ZZJetsTo4L*'), rebin), 'ss/p1p2f3/')
        all_data_view = self.rebin_view(self.get_view('data'), rebin)
        data_view = views.SubdirectoryView(all_data_view, 'ss/p1p2f3/')

        # View of weighted obj1-fails data
        obj1_view = views.SubdirectoryView(all_data_view, 'ss/f1p2f3/w1')
        # View of weighted obj2-fails data
        obj2_view = views.SubdirectoryView(all_data_view, 'ss/p1f2f3/w2')
        # View of weighted obj1&2-fails data
        obj12_view = views.SubdirectoryView(all_data_view, 'ss/f1f2f3/w12')

        subtract_obj12_view = views.ScaleView(obj12_view, -1)
        # Corrected fake view
        fakes_view = views.SumView(obj1_view, obj2_view, subtract_obj12_view)
        fakes_view = views.TitleView(
            views.StyleView(fakes_view, **data_styles['Zjets*']), 'Non-prompt')

        charge_fakes = views.TitleView(
            views.StyleView(
                views.SubdirectoryView(all_data_view, 'os/p1p2f3/c1'),
                **data_styles['TT*']), 'Charge mis-id')

        output = {
            'wz': wz_view,
            'zz': zz_view,
            'data': data_view,
            'obj1': obj1_view,
            'obj2': obj2_view,
            'fakes': fakes_view,
            'charge_fakes': charge_fakes,
        }

        return output
Example #10
0
    def plot_final(self,
                   variable,
                   rebin=1,
                   xaxis='',
                   maxy=10,
                   show_error=False,
                   magnifyHiggs=5):
        ''' Plot the final output - with bkg. estimation '''

        sig_view = self.make_signal_views(rebin)
        vh_nx = views.TitleView(
            views.StyleView(
                views.ScaleView(sig_view['signal120'], magnifyHiggs),
                **data_styles['VH*']), "(%s#times) m_{H} = 120" % magnifyHiggs)

        stack = views.StackView(
            sig_view['wz'],
            sig_view['zz'],
            sig_view['fakes'],
            vh_10x,
        )
        histo = stack.Get(variable)
        histo.Draw()
        histo.GetHistogram().GetXaxis().SetTitle(xaxis)
        histo.SetMaximum(maxy)
        self.keep.append(histo)

        # Add legend
        legend = self.add_legend(histo, leftside=False, entries=4)

        if show_error:
            bkg_error_view = BackgroundErrorView(
                sig_view['fakes'],
                sig_view['wz'],
                sig_view['zz'],
            )
            bkg_error = bkg_error_view.Get(variable)
            self.keep.append(bkg_error)
            bkg_error.Draw('pe2,same')
            legend.AddEntry(bkg_error)

        # Use poisson error bars on the data
        sig_view['data'] = PoissonView(sig_view['data'], x_err=False)

        data = sig_view['data'].Get(variable)
        data.Draw('pe,same')
        self.keep.append(data)

        #legend.AddEntry(data)
        legend.Draw()
    def make_wz_cr_views(self, rebin):
        ''' 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)
        data_view = views.SubdirectoryView(all_data_view,
                                           'ss/p1p2p3_enhance_wz/')

        # View of weighted obj2-fails data
        fakes_view = views.SubdirectoryView(all_data_view,
                                            'ss/p1f2p3_enhance_wz/w2')
        fakes_view = views.StyleView(fakes_view, **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')

        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, 'Non-prompt')

        output = {
            'wz': wz_view,
            '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), rebin),
                'ss/p1p2p3/')
            output['vh%i' % mass] = vh_view

        return output
Example #12
0
    def make_wz_cr_views(self, rebin=1, project=None, project_axis=None):
        ''' Make WZ control region views with FR background estimation '''

        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/tau_os/p1p2p3_enhance_wz/')

        # View of weighted obj2-fails data
        fakes_view = views.SubdirectoryView(
            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(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_ztt': wz_view_tautau,
            'wz_3l' : wz_view_3l,
            'zz'    : zz_view,
            'data'  : data_view,
            'fakes' : fakes_view
        }
        return output
Example #13
0
        def make_fakes(qcd_fraction):
            def make_fakes_view(weight_type, 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/%s/f1p2f3/%s1' % (tau_charge, weight_type))
                # View of weighted obj2-fails data
                obj2_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/p1f2f3/%s2' % (tau_charge, weight_type))
                # View of weighted obj1&2-fails data
                obj12_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/f1f2f3/%s12' % (tau_charge, weight_type))

                # Give the individual object views nice colors
                obj1_view = views.TitleView(
                    views.StyleView(obj1_view, **remove_name_entry(data_styles['TT*'])),
                    'Reducible bkg. 1')
                obj2_view = views.TitleView(
                    views.StyleView(obj2_view, **remove_name_entry(data_styles['QCD*'])),
                    'Reducible bkg. 2')
                obj12_view = views.TitleView(
                    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

            qcd1, qcd2, qcd12, negqcd12 = make_fakes_view('q', qcd_fraction)
            wjet1, wjet2, wjet12, negwjet12 = 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.TitleView(
                views.StyleView(fakes_view, **remove_name_entry(data_styles['Zjets*'])), 'Reducible bkg.')
            return obj1_view, obj2_view, obj12_view, fakes_view
sign = ['os']
jets = [0, 1, 2, 3]
outputdir = 'plots/%s/EEAnalyzerMVA/%s/' % (jobid, channel)
if not os.path.exists(outputdir):
    os.makedirs(outputdir)

plotter = BasePlotter(files, lumifiles, outputdir)




EWKDiboson = views.StyleView(
    views.SumView(
        *[ plotter.get_view(regex) for regex in \
          filter(lambda x : x.startswith('WW') or x.startswith('WZ') or x.startswith('ZZ') or x.startswith('WG'), mc_samples )]
    ), **remove_name_entry(data_styles['WW*'#,'WZ*', 'WG*', 'ZZ*'
                                       ])
)
Wplus = views.StyleView(
    views.SumView(*[
        plotter.get_view(regex)
        for regex in filter(lambda x: x.startswith('Wplus'), mc_samples)
    ]), **remove_name_entry(data_styles['Wplus*Jets*']))
DYLL = views.StyleView(
    views.SumView(*[
        plotter.get_view(regex)
        for regex in filter(lambda x: x.endswith('skimmedLL'), mc_samples)
    ]), **remove_name_entry(data_styles['Z*jets*LL']))
DYTT = views.StyleView(
    views.SumView(*[
Example #15
0
parser = ArgumentParser()
parser.add_argument('input', help='input root file')
parser.add_argument('out', help='output dir')
args = parser.parse_args()

tfile = root_open(args.input)
plotter = BasePlotter(
    args.out,
    defaults={'save': {
        'pdf': False
    }},
)
b_plots = views.StyleView(views.TitleView(views.SubdirectoryView(tfile, 'B'),
                                          'B'),
                          linewidth=2,
                          linecolor='#2aa198',
                          legendstyle='l',
                          drawstyle='hist')

c_plots = views.StyleView(
    views.TitleView(views.SubdirectoryView(tfile, 'C'), 'C'),
    linewidth=2,
    linecolor='#0055ff',
    legendstyle='l',
    drawstyle='hist',
)

l_plots = views.StyleView(
    views.TitleView(views.SubdirectoryView(tfile, 'DUSG'), 'DUSG'),
    linewidth=2,
    linecolor='#ab5555',
Example #16
0
        'WplusJets_madgraph',
        'TTplusJets_madgraph',
        'Zjets_M50',
    ]]
)

#mc_inverted = views.ScaleView(mc_view, -1)
mc_inverted = views.ScaleView(mc_view, -1)

sqrts = 7 if '7TeV' in jobid else 8

qcd_view = views.StyleView(
    views.TitleView(
        views.ScaleView(
            views.SumView(views.PathModifierView(plotter.data, get_ss),
                          mc_inverted),
            1.4 if sqrts == 8 else 1.28  # OS/SS from Valentina
        ),
        'QCD'),
    **data_styles['WZ*'])


def get_fakes(x):
    return x.replace('em/', 'em/f2/w2/')

fakes_view = views.StyleView(
    views.TitleView(
        views.PathModifierView(plotter.data, get_fakes), 'Fakes'),
    **data_styles['WZ*']
)
Example #17
0
    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(
                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(
                all_wz_view_3l,
                'ss/%s/p1p2p3/' % tau_charge
        )
        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')
        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_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/%s/f1p2p3/%s1' % (tau_charge, weight_type))
                # View of weighted obj2-fails data
                obj2_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/p1f2p3/%s2' % (tau_charge, weight_type))
                # View of weighted obj1&2-fails data
                obj12_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/f1f2p3/%s12' % (tau_charge, weight_type))

                # Give the individual object views nice colors
                obj1_view = views.TitleView(
                    views.StyleView(obj1_view, **remove_name_entry(data_styles['TT*'])),
                    'Reducible bkg. 1')
                obj2_view = views.TitleView(
                    views.StyleView(obj2_view, **remove_name_entry(data_styles['QCD*'])),
                    'Reducible bkg. 2')
                obj12_view = views.TitleView(
                    views.StyleView(obj12_view, **remove_name_entry(data_styles['WW*'])),
                    'Reducible bkg. 12')

                return obj1_view, obj2_view, obj12_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)

            # Corrected fake 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

        obj1_view, obj2_view, obj12_view, fakes_view = make_fakes(qcd_weight_fraction)
        fakes_view_05 = make_fakes(0.5)[-1]
        fakes_view_0  = make_fakes(0)[-1]
        fakes_view_1  = make_fakes(1)[-1]
 
        charge_fakes = views.TitleView( 
            views.StyleView(
                views.SumView(
                    views.PathModifierView(
                        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/%s/p1p2p3/c2' % tau_charge),
                        create_mapper(self.obj2_charge_mapper)
                        ),
                    ),
                **remove_name_entry(data_styles['TT*'])),
            'Charge mis-id')

        charge_fakes_sysup = views.TitleView( 
            views.StyleView(
                views.SumView(
                    views.PathModifierView(
                        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/%s/p1p2p3/c2_sysup' % tau_charge),
                        create_mapper(self.obj2_charge_mapper)
                        ),
                    ),
                **remove_name_entry(data_styles['TT*'])),
            'Charge mis-id')

        #charge_fakes = MedianView(highv=charge_fakes_sysup, centv=charge_fakes)

        output = {
            'wz': wz_view_tautau,
            'wz_3l': wz_view_3l,
            'zz': zz_view,
            'data': data_view,
            'obj1': obj1_view,
            'obj2': obj2_view,
            'obj12': obj12_view,
            'fakes': fakes_view,
            'weighted_fakes' : {
                0.  : fakes_view_0,
                0.5 : fakes_view_05,
                1.  : fakes_view_1,
            },
            'charge_fakes': {
                'central' : charge_fakes,
                'sys_up'  : charge_fakes_sysup,
                }
        }

        # Add signal
        data_total_lumi = self.views['data']['intlumi']
        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
                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
Example #18
0
    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)
Example #19
0
    def make_obj3_fail_cr_views(self, qcd_correction=False,
                                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(
            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(
            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/%s/p1p2f3/' % tau_charge
        )
        all_data_view = self.get_view('data')
        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_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/%s/f1p2f3/%s1' % (tau_charge, weight_type))
                # View of weighted obj2-fails data
                obj2_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/p1f2f3/%s2' % (tau_charge, weight_type))
                # View of weighted obj1&2-fails data
                obj12_view = views.SubdirectoryView(
                    scaled_data, 'ss/%s/f1f2f3/%s12' % (tau_charge, weight_type))

                # Give the individual object views nice colors
                obj1_view = views.TitleView(
                    views.StyleView(obj1_view, **remove_name_entry(data_styles['TT*'])),
                    'Reducible bkg. 1')
                obj2_view = views.TitleView(
                    views.StyleView(obj2_view, **remove_name_entry(data_styles['QCD*'])),
                    'Reducible bkg. 2')
                obj12_view = views.TitleView(
                    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

            qcd1, qcd2, qcd12, negqcd12 = make_fakes_view('q', qcd_fraction)
            wjet1, wjet2, wjet12, negwjet12 = 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.TitleView(
                views.StyleView(fakes_view, **remove_name_entry(data_styles['Zjets*'])), 'Reducible bkg.')
            return obj1_view, obj2_view, obj12_view, fakes_view

        obj1_view, obj2_view, obj12_view, fakes_view = make_fakes(qcd_weight_fraction)
        fakes_view_05 = make_fakes(0.5)[-1]
        fakes_view_0  = make_fakes(0)[-1]
        fakes_view_1  = make_fakes(1)[-1]

        style_dict_no_name = remove_name_entry(data_styles['TT*'])
        charge_fakes = views.TitleView(  #FIXME
            views.StyleView(
                views.SumView(
                    views.PathModifierView(
                        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/%s/p1p2f3/c2' % tau_charge),
                        create_mapper(self.obj2_charge_mapper)
                        ),
                    ),
                **style_dict_no_name),
            'Charge mis-id')
        
        charge_fakes_sysup = views.TitleView(
                 views.StyleView(
                     views.SumView(
                         views.PathModifierView(
                             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/%s/p1p2f3/c2_sysup' % tau_charge),
                             create_mapper(self.obj2_charge_mapper)
                         ),
                     ),
                 **style_dict_no_name),
            'Charge mis-id')

        #charge_fakes = MedianView(highv=charge_fakes_sysup, centv=charge_fakes)
                            
        output = {
            'wz': wz_view,
            'wz_3l': wz_view_3l,
            'zz': zz_view,
            'data': data_view,
            'obj1': obj1_view,
            'obj2': obj2_view,
            'obj12': obj12_view,
            'fakes': fakes_view,
            'weighted_fakes' : {
                0.  : fakes_view_0,
                0.5 : fakes_view_05,
                1.  : fakes_view_1,
            },
            'charge_fakes': {
                'central' : charge_fakes,
                'sys_up'  : charge_fakes_sysup,
                }
        }

        #Add signal @ 120, just mo make bkg fitting easier
        mass = 120
        vh_view = views.SubdirectoryView(
            self.get_view('VH_*%i' % mass),
            'ss/tau_os/p1p2f3/'
        )
        output['vh%i' % mass] = vh_view
        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) if ww_view else vh_view

        return output
Example #20
0
period = '13TeV'
sqrts = 13
outputdir = 'plots/%s/MuMuAnalyserGen/' % (jobid)
if not os.path.exists(outputdir):
    os.makedirs(outputdir)
#print "outputdir", outputdir
#print "files", files
#print lumifiles
#plotter = BasePlotter(files, lumifiles, outputdir, None, 1000.)
plotter = Plotter(files, lumifiles, outputdir)


WSMH = views.StyleView(
    views.SumView(
        *[ plotter.get_view(regex) for regex in \
          filter(lambda x : x.startswith('WminusHToTauTau_M125') or x.startswith('WplusHToTauTau_M125') , mc_samples )]
    ), **remove_name_entry(data_styles['WH*'])
)

#EWK = views.StyleView(
#    views.SumView(
#        *[ plotter.get_view(regex) for regex in \
#          filter(lambda x : x.startswith('EWKZ2Jets_ZToLL') or x.startswith('EWKZ2Jets_ZToNuNu') , mc_samples )]
#    ), **remove_name_entry(data_styles['EWK*'])
#)

EWKDiboson = views.StyleView(
    views.SumView(
        *[ plotter.get_view(regex) for regex in \
          filter(lambda x : x.startswith('WW') or x.startswith('WZ') or x.startswith('ZZ') or x.startswith('WG'), mc_samples )]
    ), **remove_name_entry(data_styles['WW*'#,'WZ*', 'WG*', 'ZZ*'
Example #21
0
postfix = '_TEST_'

ROOT.gStyle.SetPaintTextFormat('.2g')
jobid = os.environ['jobid']
channels = ['eet', 'emt', 'mmt']

public = os.environ['pub']
chan_hists = {}
for ch, color in zip(channels, ['darkgreen', 'blue', 'red']):
    view = views.TitleView(
        views.StyleView(
            views.SumView(
                #                io.open('results/%s/WHAnalyze%s/VH_120_HWW.root' % (jobid, ch.upper()) ),
                io.open('results/%s/WHAnalyze%s/VH_H2Tau_M-120.root' %
                        (jobid, ch.upper()))),
            drawstyle='hist TEXT00',
            linecolor=color,
            linewidth=2,
            fillstyle='hollow',
            legendstyle='l',
        ),
        ch)
    chan_hists[ch] = view.Get('ss/CUT_FLOW')
    chan_hists[ch].SetLabelSize(0.035)

canvas = plotting.Canvas(name='adsf', title='asdf')
canvas.SetGridx(True)
canvas.SetGridy(True)
canvas.SetLogy(True)
legend = plotting.Legend(len(channels),
                         rightmargin=0.07,
Example #22
0
#    else:
#        files.extend(glob.glob('results/lpairs_data_Oct9/MuMuAnalyser/%s' % (x)))
#        lumifiles.extend(glob.glob('inputs/lpairs_data_Oct9/%s.lumicalc.sum' % (x)))

period = '13TeV'
sqrts = 13
outputdir = 'plots/%s/MuMuAnalyser/' % (jobid)
if not os.path.exists(outputdir):
    os.makedirs(outputdir)
#plotter = BasePlotter(files, lumifiles, outputdir, None, 1000.)
plotter = Plotter(files, lumifiles, outputdir)


WSMH = views.StyleView(
    views.SumView(
        *[ plotter.get_view(regex) for regex in \
          filter(lambda x : x.startswith('WminusHToTauTau_M125') or x.startswith('WplusHToTauTau_M125') , mc_samples )]
    ), **remove_name_entry(data_styles['WH*'])
)

EWKDiboson = views.StyleView(
    views.SumView(
        *[ plotter.get_view(regex) for regex in \
          filter(lambda x : x.startswith('WW') or x.startswith('WZ') or x.startswith('ZZ') or x.startswith('WG'), mc_samples )]
    ), **remove_name_entry(data_styles['WW*'#,'WZ*', 'WG*', 'ZZ*'
                                       ])
)

WJ = views.StyleView(
    views.SumView(
        *[ plotter.get_view(regex) for regex in \
          filter(lambda x : x.startswith('W1JetsToLNu') or x.startswith('W2JetsToLNu') or x.startswith('W3JetsToLNu') or x.startswith('W4JetsToLNu') or x.startswith('WJetsToLNu') , mc_samples )]
Example #23
0
def data_views(files, lumifiles, styles, forceLumi=-1):
    ''' Builds views of files.

    [files] gives an iterator of .root files with histograms to build.

    [lumifiles] gives the correspond list of .lumisum files which contain
    the effective integrated luminosity of the samples.

    The lumi to normalize to is taken as the sum of the data file int. lumis.

    '''

    files = list(files)

    log.info("Creating views from %i files", len(files))

    # Map sample_name => root file
    histo_files = dict((extract_sample(x), io.open(x)) for x in files)

    # Map sample_name => lumi file
    lumi_files = dict((extract_sample(x), read_lumi(x)) for x in lumifiles)

    # Identify data files
    datafiles = set([name for name in histo_files.keys() if 'data' in name])

    log.info("Found the following data samples:")
    log.info(" ".join(datafiles))
    datalumi = 0
    for x in datafiles:
        if x not in lumi_files:
            raise KeyError(
                "Can't find a lumi file for %s - I have these ones: " % x +
                repr(lumi_files.keys()))
        datalumi += lumi_files[x]
    log.warning("-> total int. lumi = %0.0fpb-1", datalumi)
    if forceLumi > 0:
        datalumi = forceLumi
        log.warning("-> forcing lumi to = %0.0fpb-1", datalumi)

    # Figure out the dataset for each file, and the int lumi.
    # Key = dataset name
    # Value = {intlumi, rootpy file, weight, weighted view}
    output = {}
    has_data = False

    for sample in histo_files.keys():
        raw_file = histo_files[sample]
        intlumi = lumi_files[sample]
        weight = 1
        if intlumi:
            weight = datalumi / intlumi
        if 'data' in sample:
            has_data = True
            weight = 1
        log.warning(
            "Building sample: %s => int lumi: %0.f pb-1. Weight => %0.2E",
            sample, intlumi, weight)

        view = views.ScaleView(raw_file, weight)
        unweighted_view = raw_file

        # Find the longest (i.e. most specific) matching style pattern
        style = get_best_style(sample, styles)
        if style:
            log.info("Found style for %s - applying Style View", sample)

            # Set style and title
            # title = the name of the sample, rootpy Legend uses this.
            nicename = copy.copy(style['name'])
            log.debug("sample name %s", nicename)
            style_dict_no_name = dict(
                [i for i in style.iteritems() if i[0] != 'name'])
            view = views.TitleView(views.StyleView(view, **style_dict_no_name),
                                   nicename)
            unweighted_view = views.TitleView(
                views.StyleView(unweighted_view, **style_dict_no_name),
                nicename)
        else:
            log.warning("No matching style found for %s", sample)

        output[sample] = {
            'intlumi': intlumi,
            'file': raw_file,
            'weight': weight,
            'view': view,
            'unweighted_view': unweighted_view
        }

    if not has_data:
        return output

    # Merge the data into just 'data'
    log.info("Merging data together")
    output['data'] = {
        'intlumi':
        datalumi,
        'weight':
        1,
        'view':
        views.SumView(*[output[x]['view'] for x in datafiles]),
        'unweighted_view':
        views.SumView(*[output[x]['unweighted_view'] for x in datafiles]),
    }

    return output
Example #24
0
    def make_closure_plots(self, var, testDir, refDir, rebin=1, xaxis=''):
        '''helper function to make comparison between data and data (closure test for fakerates etc.)'''
        self.canvas.cd()
        data_view = self.rebin_view(self.data, rebin)
        test_view = views.StyleView(views.TitleView(
            views.SubdirectoryView(data_view, testDir), 'Weighted data'),
                                    fillcolor=ROOT.EColor.kRed,
                                    drawstyle='hist')  #.Get(var)
        refData = views.SubdirectoryView(data_view, refDir).Get(var)

        testSampleName = '_'.join(testDir.split('/')[1:]).replace(
            'IsoFailed', 'fail').replace('_weight', 'w')
        refSampleName = refDir.split('/')[1].replace('IsoFailed',
                                                     'fail').replace(
                                                         '_weight', 'w')
        #testData.SetTitle(testSampleName)
        refData.SetTitle(refSampleName)

        diboson_views = [
            InflateErrorView(
                views.SubdirectoryView(
                    self.rebin_view(self.get_view(pattern), rebin), refDir),
                0.16) for pattern in ['WZ*']
        ]  #, 'ZZ*', 'WW*'] ]
        to_stack_views = diboson_views + [test_view]  #+
        stack_hist = views.StackView(*to_stack_views).Get(var)
        refData.drawstyle = "ep"
        stack_hist.drawstyle = "HIST same"  # same" #"HISTe same "

        hmax = max([
            max([(b.content + b.error) for b in zipBins(refData)]),
            stack_hist.GetMaximum()
        ])
        refData.GetYaxis().SetRangeUser(0, hmax * 1.3)
        refData.GetXaxis().SetTitle(xaxis)

        tgTest = HistStackToTGRaphErrors(stack_hist)
        tgTest.SetFillStyle(3013)
        tgTest.GetXaxis().SetTitle(xaxis)
        tgTest.GetYaxis().SetRangeUser(0, hmax * 1.3)
        self.keep.append(tgTest)

        refData.SetMarkerStyle(20)
        refData.SetMarkerSize(1)
        self.keep.append(refData)
        self.keep.append(stack_hist)
        refData.Draw()
        stack_hist.Draw('same')
        stack_hist.GetXaxis().SetTitle(xaxis)
        stack_hist.GetYaxis().SetRangeUser(0, hmax * 1.3)
        refData.Draw('same')
        tgTest.Draw('2 same')
        #stack_hist.Draw()
        #self.canvas.SetLogy()

        legend = self.add_legend([refData],
                                 leftside=False,
                                 entries=len(to_stack_views) + 1)
        legend.AddEntry(stack_hist, 'f')
        legend.Draw()
        self.add_cms_blurb(self.sqrts)
Example #25
0
def data_views(files, lumifiles):
    ''' Builds views of files.

    [files] gives an iterator of .root files with histograms to build.

    [lumifiles] gives the correspond list of .lumisum files which contain
    the effective integrated luminosity of the samples.

    The lumi to normalize to is taken as the sum of the data file int. lumis.

    '''

    files = list(files)

    log.info("Creating views from %i files", len(files))

    # Map sample_name => root file
    histo_files = dict((extract_sample(x), io.open(x)) for x in files)

    # Map sample_name => lumi file
    lumi_files = dict((extract_sample(x), read_lumi(x)) for x in lumifiles)

    # Identify data files
    datafiles = set([name for name in histo_files.keys() if 'data' in name])

    log.info("Found the following data samples:")
    log.info(" ".join(datafiles))
    datalumi = 0
    for x in datafiles:
        if x not in lumi_files:
            raise KeyError(
                "Can't find a lumi file for %s - I have these ones: " % x
                + repr(lumi_files.keys()))
        datalumi += lumi_files[x]
    log.info("-> total int. lumi = %0.0fpb-1", datalumi)

    # Figure out the dataset for each file, and the int lumi.
    # Key = dataset name
    # Value = {intlumi, rootpy file, weight, weighted view}
    output = {}

    for sample in histo_files.keys():
        raw_file = histo_files[sample]
        intlumi = lumi_files[sample]
        log.info("Building sample: %s => int lumi: %0.f pb-1", sample, intlumi)
        weight = 1
        if intlumi:
            weight = datalumi/intlumi
        if 'data' in sample:
            weight = 1
        log.debug("Weight: %0.2f", weight)

        view = views.ScaleView(raw_file, weight)
        unweighted_view = raw_file

        # Find the longest (i.e. most specific) matching style pattern
        best_pattern = ''
        for pattern, style_dict in data_styles.iteritems():
            log.debug("Checking pattern: %s against %s", pattern, sample)
            if fnmatch.fnmatch(sample, pattern):
                log.debug("-> it matches!")
                if len(pattern) > len(best_pattern):
                    best_pattern = pattern
                    log.info("Found new best style for %s: %s",
                             sample, pattern)
        if best_pattern:
            style_dict = data_styles[best_pattern]
            log.info("Found style for %s - applying Style View", sample)

            # Set style and title
            # title = the name of the sample, rootpy Legend uses this.
            nicename = copy.copy(style_dict['name'])
            view = views.TitleView(
                views.StyleView(view, **style_dict), nicename
            )
            unweighted_view = views.TitleView(
                views.StyleView(unweighted_view, **style_dict), nicename
            )

        output[sample] = {
            'intlumi': intlumi,
            'file' : raw_file,
            'weight' : weight,
            'view' : view,
            'unweighted_view' : unweighted_view
        }

    # Merge the data into just 'data'
    log.info("Merging data together")
    output['data'] = {
        'intlumi' : datalumi,
        'weight' : 1,
        'view' : views.SumView(*[output[x]['view'] for x in datafiles]),
        'unweighted_view' : views.SumView(*[output[x]['unweighted_view']
                                            for x in datafiles]),
    }

    return output
Example #26
0
                          'pdf': False
                      }})

ttjets = urviews.NormalizedView(
    root_open('results/%s/permProbComputer/ttJets.root' % jobid))
subs_and_col = [
    ('semilep_visible_right', 'violet'),
    ('other_tt_decay', 'blue'),
    ('semilep_right_thad', 'cyan'),
    ('semilep_right_tlep', 'red'),
    ('semilep_wrong', '#00960a'),
]
samples = [
    views.TitleView(
        views.StyleView(views.SubdirectoryView(ttjets, i),
                        linecolor=j,
                        drawstyle='hist',
                        legendstyle='l'), i) for i, j in subs_and_col
]

plots = ['nusolver_chi2', 'thfr', 'tlfr', 'wfr_jcosth_delta']
#plotter.set_subdir('shapes')
#for var in plots:
#	shapes = [i.Get('nosys/%s' % var) for i in samples]
#	legend = LegendDefinition(position='NE')
#	plotter.overlay(shapes, legend_def=legend, ytitle='a.u.', y_range='shape', ignore_style=True)
#	plotter.save(var)

systematics = [
    ('nosys', 'violet'),
    ('jes_down', 'blue'),
    ('jes_up', 'cyan'),
Example #27
0
outputdir = 'plots/%s/ControlFakeTau/%s/' % (jobid, channel)
if not os.path.exists(outputdir):
        os.makedirs(outputdir)


        
def remove_name_entry(dictionary):
    return dict( [ i for i in dictionary.iteritems() if i[0] != 'name'] )


plotter = BasePlotter(channel,files, lumifiles, outputdir) 

EWKDiboson = views.StyleView(
    views.SumView( 
        *[ plotter.get_view(regex) for regex in \
          filter(lambda x : x.startswith('WW') or x.startswith('WZ') or x.startswith('ZZ') or x.startswith('WG'), mc_samples )]
    ), **remove_name_entry(data_styles['WW*'#,'WZ*', 'WG*', 'ZZ*'
])
)
Wplus = views.StyleView(views.SumView(  *[ plotter.get_view(regex) for regex in filter(lambda x :  x.startswith('Wplus'), mc_samples )]), **remove_name_entry(data_styles['Wplus*Jets*']))
DYLL = views.StyleView(views.SumView( *[ plotter.get_view(regex) for regex in filter(lambda x :  x.endswith('skimmedLL'), mc_samples )]), **remove_name_entry(data_styles['Z*jets*LL']))
DYTT = views.StyleView(views.SumView( *[ plotter.get_view(regex) for regex in filter(lambda x :  x.endswith('jets_M50_skimmedTT'), mc_samples )]), **remove_name_entry(data_styles['Z*jets*TT']))
TT = views.StyleView(views.SumView(  *[ plotter.get_view(regex) for regex in  filter(lambda x : x.startswith('TT') , mc_samples)]), **remove_name_entry(data_styles['TTJets*']))
singleT = views.StyleView(views.SumView(  *[ plotter.get_view(regex) for regex in  filter(lambda x : x.startswith('T_') or x.startswith('Tbar_'), mc_samples)]), **remove_name_entry(data_styles['T*_t*']))
SMH = views.StyleView(views.SumView( *[ plotter.get_view(regex) for regex in filter(lambda x : 'HToTauTau' in x , mc_samples)]), **remove_name_entry(data_styles['GluGluToHToTauTau*']))


plotter.views['EWKDiboson']={'view' : EWKDiboson }
plotter.views['Wplus']={'view' : Wplus }
plotter.views['DYLL']={'view' : DYLL }
plotter.views['DYTT']={'view' : DYTT }
Example #28
0
    def plot_final(self, variable, rebin=1, xaxis='', maxy=24,
                   show_error=False, qcd_correction=False, stack_higgs=True, 
                   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,
                                          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['vh125'], higgs_xsec_multiplier),
                **remove_name_entry(data_styles['VH*'])
            ),
            "(%i#times) m_{H} = 125" % higgs_xsec_multiplier
        )
        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)
        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])
        self.keep.append(histo)

        # Add legend
        entries = len(tostack)+1
        if show_error:
            entries += 1
        legend  = self.add_legend(histo, leftside=leftside_legend, entries=entries)

        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(
                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)
            self.keep.append(bkg_error)
            bkg_error.Draw('pe2,same')
            legend.AddEntry(bkg_error)

        # Use poisson error bars on the data
        sig_view['data'] = PoissonView(sig_view['data'], x_err=False, is_scaled=differential) #PoissonView(, x_err=False)

        data = sig_view['data'].Get(variable)
        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.Draw()