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
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)
def GetMax(self): return PlotUtils.GetTrueMaximum(self.totalhist)
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)