예제 #1
0
    def GetMaxSf(self, width, ymin, isL):

        # Convert width in pad-frac to NBins
        width_axis = 1 - (self.pad_histogram.GetLeftMargin() +
                          self.pad_histogram.GetLeftMargin())
        nbins = self.pilot_hist.FindBin(
            self.xrangehigh) - self.pilot_hist.FindBin(self.xrangelow) + 1
        #print "nbins=",nbins
        bin_width_frac = width_axis / nbins
        legend_width_bins = int(
            math.ceil((width + self.leg_axis_offset) / bin_width_frac) + 1)

        # 2. Figure out if best on L or R
        if isL:
            #print self.pilot_hist.FindBin(self.xrangelow) + legend_width_bins
            max_range = PlotUtils.GetTrueMaximum(
                self.maxhist,
                self.pilot_hist.FindBin(self.xrangelow) - 1,
                self.pilot_hist.FindBin(self.xrangelow) + legend_width_bins)
        else:
            max_range = PlotUtils.GetTrueMaximum(
                self.maxhist,
                self.maxhist.FindBin(self.xrangehigh) - legend_width_bins,
                self.maxhist.FindBin(self.xrangehigh))

        # 3. Find height of highest bin in range
        # fiigure how much need to scale it down by

        #print width, ymin, isL, max_range

        if max_range == 0:
            return 1
        else:
            if self.linear == False:
                ndivs_below_1 = -1 * math.log10(self.ymin_log)
                ndivs_max = math.log10(PlotUtils.GetTrueMaximum(
                    self.maxhist)) + ndivs_below_1
                ndivs_max_range = math.log10(max_range) + ndivs_below_1
                y_max_sf = ndivs_max_range / (ndivs_max * (ymin - 0.03))
            else:
                y_max_sf = max_range / (
                    PlotUtils.GetTrueMaximum(self.maxhist) * (ymin - 0.03))

        #print y_max_sf
        return y_max_sf
예제 #2
0
    def PrepareElements(self):

        y_max = PlotUtils.GetTrueMaximum(self.maxhist)
        #print y_max

        #y_max_sf_min = 0
        y_max_sf_min = 1.1

        if y_max <= 0:
            print "***---> Uh oh, y_max <=0, BadThings(TM) might happen..."
            print "   ---> Setting y_max =1, will se what happens..."
            y_max = 1

        if self.y_max_sf < y_max_sf_min:
            print "Using minimum SF of 1.1"
            self.y_max_sf = y_max_sf_min

        if self.linear:
            self.ymax = y_max * self.y_max_sf
            # Non-zero to supress first Axis label ("0")
            self.ymin = self.ymin_lin
        else:
            # Sets maximum such that is same height as on linear scaqle
            ndivs_below_1 = -1 * math.log10(self.ymin_log)
            self.ymax = 10**(
                (ndivs_below_1 + math.log10(y_max)) * self.y_max_sf -
                ndivs_below_1)
            self.ymin = self.ymin_log * 1.00001

        #print self.ymin,  self.ymax, self.y_max_sf

        ########################################
        # Set minimum and maximum for pilot hist

        self.pilot_hist.SetMaximum(self.ymax)
        self.pilot_hist.SetMinimum(self.ymin)

        # Set minimum and maximum for pilot hist
        # Set Range for pilot hist
        if not self.xrangelow == None:
            self.pilot_hist.GetXaxis().SetRangeUser(self.xrangelow,
                                                    self.xrangehigh)
        ########################################

        self.pilot_hist.GetYaxis().SetTitleFont(self.text_font)
        self.pilot_hist.GetXaxis().SetTitleFont(self.text_font)
        self.pilot_hist.GetYaxis().SetLabelFont(self.text_font)
        self.pilot_hist.GetXaxis().SetLabelFont(self.text_font)

        ########################################
        # Set x and y labels
        if self.draw_ratio:

            # Only need to label Y as X was labelled on ratio plot
            # According to the ROOT manual the label and title size are fractions of the pads width
            # But seems to scale with height too
            #hist.GetYaxis().SetLabelSize(self.axis_label_size )
            #hist.GetYaxis().SetTitleSize(self.text_size )
            #print "Setting ratio pad tyitle size to", self.text_size
            self.pilot_hist.GetYaxis().SetLabelSize(
                self.axis_label_size / (1 - self.ratio_pad_height))
            self.pilot_hist.GetYaxis().SetTitleSize(
                self.text_size / (1 - self.ratio_pad_height))
            self.pilot_hist.GetYaxis().SetTitleOffset(
                1.3 * (1 - self.ratio_pad_height) * 0.05 / self.text_size)
            if self.xlabel:
                self.pilot_hist.GetYaxis().SetTitle(self.ylabel)

        else:

            self.pilot_hist.GetXaxis().SetLabelSize(self.axis_label_size)
            self.pilot_hist.GetXaxis().SetTitleSize(self.text_size)
            #self.pilot_hist.GetXaxis().SetTitleOffset(1.2 * 0.04 /self.text_size)
            self.pilot_hist.GetXaxis().SetTitleOffset(1.05)
            #print 1.2 * 0.04 /self.text_size

            if self.xlabel:
                self.pilot_hist.GetXaxis().SetTitle(self.xlabel)
                self.pilot_hist.GetYaxis().SetTitle(self.ylabel)

            self.pilot_hist.GetYaxis().SetLabelSize(self.axis_label_size)
            self.pilot_hist.GetYaxis().SetTitleSize(self.text_size)
            self.pilot_hist.GetYaxis().SetTitleOffset(self.y_axis_title_offset)
예제 #3
0
    def GetMax(self):

        return PlotUtils.GetTrueMaximum(self.totalhist)
예제 #4
0
    def _finaliseStack(self):

        stack = R.THStack("stack", "stack")

        if self.auto_sort:
            sorted(self.stack_labels,
                   key=lambda x: -1 * PlotUtils.GetTrueMaximum(self.
                                                               stack_hists[x]))

        hists_reversed = []
        first = True
        bins = []

        stackXmax = 9999999

        for hist in self.stack_hists.values():
            if hist.GetXaxis().GetXmax() < stackXmax:
                stackXmax = hist.GetXaxis().GetXmax()

        for label in self.stack_labels:
            #self.stack_hists[label].GetXaxis().SetLimits(self.xrangelow, self.xrangehigh)

            if first:

                # If we have a pilot hist, use it for binning template
                # If not use first stack element
                if self.pilot_hist:
                    bin_hist = self.pilot_hist
                else:
                    bin_hist = self.stack_hists[label]

                for bin in range(bin_hist.GetNbinsX()):
                    if bin_hist.GetBinLowEdge(bin + 1) > stackXmax: continue
                    bins.append(bin_hist.GetBinLowEdge(bin + 1))
                if bin_hist.GetBinLowEdge(bin + 1) <= stackXmax:
                    bins.append(
                        bin_hist.GetBinLowEdge(bin + 1) +
                        bin_hist.GetBinWidth(bin + 1))
                first = False
                #print repr(bins)

            #print self.stack_hists[label].
            #pdb.set_trace()
            self.stack_hists[label] = PlotUtils.SmartRebin(
                self.stack_hists[label], bins)

            stack.Add(self.stack_hists[label], self.stack_drawOpt)
            hists_reversed.append(self.stack_hists[label])

        labels_reversed = list(self.stack_labels)
        labels_reversed.reverse()
        hists_reversed.reverse()

        #pdb.set_trace()

        element = PlotElement(stack, "stack", labels_reversed,
                              self.stack_drawOpt, self.stack_legOpt,
                              hists_reversed)
        self.plot_elements.append(element)

        # Make stack error band
        self.stack_err_hist = element.totalhist.Clone("stack_err")
        #pdb.set_trace()

        if self.flat_syst_frac:
            print "Adding flat systematic"
            for bin in range(1, self.stack_err_hist.GetNbinsX() + 1):
                if self.stack_err_hist.GetBinContent(bin):
                    stat_frac = self.stack_err_hist.GetBinError(
                        bin) / self.stack_err_hist.GetBinContent(bin)
                    total_err_frac = AddInQuad.AddInQuad(
                        [stat_frac, self.flat_syst_frac])
                    total_err_abs = total_err_frac * self.stack_err_hist.GetBinContent(
                        bin)
                    self.stack_err_hist.SetBinError(bin, total_err_abs)

        if len(self.stack_syst_abs_hists):
            print "Adding systematic from abs hist"
            for abs_hist in self.stack_syst_abs_hists:
                for bin in range(1, self.stack_err_hist.GetNbinsX() + 1):
                    if self.stack_err_hist.GetBinContent(bin):
                        old_err = self.stack_err_hist.GetBinError(bin)
                        abs_hist_err = abs_hist.GetBinError(bin)
                        new_err = AddInQuad.AddInQuad([old_err, abs_hist_err])
                        #print self.stack_err_hist.GetBinContent(bin), old_err, abs_hist_err, new_err
                        self.stack_err_hist.SetBinError(bin, new_err)