class _EfficiencyCurve(object):
    def __init__(self, name, bins, threshold):
        from rootpy.plotting import Hist
        self._pass = Hist(bins, name=name + '_pass')
        self._total = Hist(bins, name=name + '_total')
        self._dist = Hist(bins, name=name + '_dist')
        self._threshold = threshold
        self._efficiency = None

    def fill(self, recoValue, l1Value, weight=1.):
        """ Fills the histograms used for efficiency calculation
        :param recoValue: the reconstructed quanity
        :type recoValue: float
        :param l1Value: the L1 Trigger quantity
        :type l1Value: float
        :param weight: weight to fill the histograms with, default=1.0
        :type weight: float
        """
        self._total.fill(recoValue, weight)
        self._dist.fill(l1Value, weight)
        if l1Value > self._threshold:
            self._pass.fill(recoValue, weight)

    def calculate_efficiency(self):
        from rootpy import asrootpy
        from ROOT import TEfficiency
        self._efficiency = asrootpy(TEfficiency(self._pass, self._total))
        self._efficiency.SetName(self._total.GetName() + '_eff')

    def get_efficiency(self):
        if not self._efficiency:
            self.calculate_efficiency()
        return self._efficiency
Exemple #2
0
def _project(tree,
             var,
             selection='',
             weight=1.0,
             bins=None,
             includeover=False):

    h = None
    if var.count(':') == 0:
        ## Hist (1D)
        if bins:
            if isinstance(bins, tuple):
                assert len(bins) == 3
                h = Hist(*bins)
            elif isinstance(bins, list):
                h = Hist(bins)
            else:
                assert False
        else:
            assert False
    elif var.count(':') == 1:
        ## Hist2D
        ## like rootpy, we use a convention where var=x:y, unlike ROOT
        varx, vary = var.split(':')
        var = ':'.join([vary, varx])
        if bins:
            if isinstance(bins, tuple):
                assert len(bins) == 6
                h = Hist2D(*bins)
            elif isinstance(bins, list):
                ## TODO: support variable bins for Hist2D
                h = Hist2D(*bins)
                #assert False
            else:
                assert False
        else:
            assert False
    else:
        assert False

    assert h
    #            kwargs['hist'] = h

    ## add the weight to the selection via a TCut
    weighted_selection = str(selection)
    if weight and weight != 1.0:
        weighted_selection = Cut(weighted_selection)
        weighted_selection = weighted_selection * weight
        weighted_selection = str(weighted_selection)

    tree.Draw('%s>>%s' % (var, h.GetName()), weighted_selection)

    ##    print tree.GetSelectedRows() ## debuging

    #    for event in t:
    #        x = getattr(event, var)
    #        h.fill(x)

    if h:
        h.SetDirectory(0)

        #        elist = ROOT.gDirectory.Get('elist')
        #        elist.Print('all')

        if var.count(':') == 0 and includeover:
            ## include overflow for Hist (1D)
            nbins = h.GetNbinsX()
            c1 = h.GetBinContent(nbins)
            c2 = h.GetBinContent(nbins + 1)
            e1 = h.GetBinError(nbins)
            e2 = h.GetBinError(nbins + 1)
            h.SetBinContent(nbins, c1 + c2)
            h.SetBinError(
                nbins,
                math.sqrt((c1 * e1 * e1 + c2 * e2 * e2) /
                          (c1 + c2)) if c1 + c2 != 0.0 else 0.0)
            h.SetBinContent(nbins + 1, 0.0)
            h.SetBinError(nbins + 1, 0.0)

    return h
                    h = Hist(toDraw['edges'], name=histName)
                elif histDimension == 2:
                    h = Hist2D(toDraw['edges'][0],
                               toDraw['edges'][1],
                               name=histName)
                elif histDimension == 3:
                    h = Hist2D(toDraw['edges'][0],
                               toDraw['edges'][1],
                               toDraw['edges'][2],
                               name=histName)
                else:
                    raise ValueError(
                        'I dunno how to handle {0}'.format(toDraw))
            else:
                print "ERROR: problem configuring the binning of the histograms..."
                exit()
            # things look ok, so we draw to the histogram
            print "\t\tdrawing {0}\n\t\twith cut ({1})*({2})".format(
                toDraw['draw'], args.eventWeightBranch, cut['name'])
            tree.Draw(toDraw['draw'],
                      '({0:s})*({1:s})'.format(args.eventWeightBranch,
                                               cut['cut']),
                      hist=h)
            samename = h.GetName()
            hnew = h.merge_bins([(-2, -1)])  # merge upper overflow bin
            hnew.SetName(samename)
            # write to file
            print "\t\twriting to file"
            hnew.write()
    out_file.close()