def set_root_defaults( set_batch = True, msg_ignore_level = 1001 ): # set to batch mode (or not) gROOT.SetBatch( set_batch ) # ignore warnings gROOT.ProcessLine( 'gErrorIgnoreLevel = %d;' % msg_ignore_level ) # turn of the stupid ROOT pointer handling, seriously TH1F.AddDirectory(False)
histogram_properties.x_limits = [bin_edges[0], bin_edges[-1]] if log_plots: histogram_properties.set_log_y = True histogram_properties.name += '_log' compare_measurements( models, measurements, show_measurement_errors = True, histogram_properties = histogram_properties, save_folder = plot_location, save_as = ['pdf'] ) if __name__ == '__main__': set_root_defaults() # Do not let ROOT handle pointers. That just asks for trouble. TH1F.AddDirectory( False ) parser = OptionParser() parser.add_option( "-p", "--path", dest = "data_path", default = 'data/absolute_eta_M3_angle_bl', help = "set input path for data JSON files (for data test)" ) parser.add_option( "-o", "--output-folder", dest = "output_folder", default = 'plots/unfolding_tests/', help = "set path to save plots" ) parser.add_option( "-c", "--centre-of-mass-energy", dest = "CoM", default = 8, type = int, help = "set the centre of mass energy for analysis. Default = 8 [TeV]" ) parser.add_option( "-f", "--load-fakes", dest = "load_fakes", action = "store_true", help = "Load fakes histogram and perform manual fake subtraction in TSVDUnfold" ) parser.add_option( "-u", "--unfolding-method", dest = "unfolding_method", default = 'RooUnfoldSvd', help = "Unfolding method: RooUnfoldSvd (default), TSVDUnfold, RooUnfoldTUnfold, RooUnfoldInvert, RooUnfoldBinByBin, RooUnfoldBayes" ) parser.add_option( "-m", "--metType", dest = "metType", default = 'type1', help = "set MET type used in the analysis of MET-dependent variables" ) parser.add_option( "-t", "--test", dest = "test", default = 'closure',
# ROOT imports import ROOT from ROOT import TChain, TH1F, TFile, vector, gROOT # custom ROOT classes from ROOT import alp, ComposableSelector, CounterOperator, TriggerOperator, JetFilterOperator, BTagFilterOperator, JetPairingOperator, DiJetPlotterOperator from ROOT import BaseOperator, EventWriterOperator, IsoMuFilterOperator, MetFilterOperator, JetPlotterOperator, FolderOperator, MiscellPlotterOperator from ROOT import ThrustFinderOperator, HemisphereProducerOperator, HemisphereWriterOperator, MCTruthOperator # imports from ../python from Analysis.alp_analysis.alpSamples import samples from Analysis.alp_analysis.samplelists import samlists from Analysis.alp_analysis.triggerlists import triggerlists from Analysis.alp_analysis.workingpoints import wps TH1F.AddDirectory(0) # parsing parameters import argparse parser = argparse.ArgumentParser() parser.add_argument("-e", "--numEvts", help="number of events", type=int, default='-1') parser.add_argument("-s", "--samList", help="sample list", default="") parser.add_argument("-v", "--ntuplesVer", help="input sub-folder", default="") parser.add_argument("-o", "--oDir", help="output directory", default="") parser.add_argument("--btag", help="which btag algo", default='cmva') args = parser.parse_args() # exe parameters numEvents = args.numEvts if not args.samList: samList = ['SM'] # list of samples to be processed - append multiple lists else: samList = [args.samList]
import sys, time # Enabling root in batch mode sys.argv.append('-b') from ROOT import gPad, TCanvas, TFile, TH1F, THStack, TLatex, TLegend from neat.nn import nn_cpp as nn from Common import * from Processor import * from Util import * from WebpageWriter import * # IMPORTANT: Transfer the ownership to the user (not TFile) TH1F.AddDirectory(ROOT.kFALSE) # Style features ROOT.gStyle.SetEndErrorSize(3) ROOT.gStyle.SetErrorX(0.5) class PlotProducer(Processor): ## Constructor def __init__(self): super(PlotProducer, self).__init__() # Initializing allowed processor parameters self.defineParameter( 'input', 'Provides the input directory with a neat histograms.')
def __init__(self, cfg_ana, cfg_comp, looper_name): """ Constructor Arguments: cfg_ana: passed to the base class cfg_comp: passed to the base class looper_name: passed to the base class """ super(CommonAnalyzer, self).__init__(cfg_ana, cfg_comp, looper_name) self.rootfile = TFile('/'.join([self.dirName, 'output.root']), 'recreate') # tree to store smeared values self.tree = Tree(self.cfg_ana.tree_name, self.cfg_ana.tree_title) self.tree.var('n_particles') self.tree.var('event_number') self.tree.var('pv_x') self.tree.var('pv_y') self.tree.var('pv_z') self.tree.var('sv_x') self.tree.var('sv_y') self.tree.var('sv_z') self.tree.var('tv_tauplus_x') self.tree.var('tv_tauplus_y') self.tree.var('tv_tauplus_z') self.tree.var('tv_tauminus_x') self.tree.var('tv_tauminus_y') self.tree.var('tv_tauminus_z') self.tree.var('k_px') self.tree.var('k_py') self.tree.var('k_pz') self.tree.var('k_q') self.tree.var('pi_kstar_px') self.tree.var('pi_kstar_py') self.tree.var('pi_kstar_pz') self.tree.var('pi_kstar_q') self.tree.var('pi1_tauplus_px') self.tree.var('pi1_tauplus_py') self.tree.var('pi1_tauplus_pz') self.tree.var('pi1_tauplus_q') self.tree.var('pi2_tauplus_px') self.tree.var('pi2_tauplus_py') self.tree.var('pi2_tauplus_pz') self.tree.var('pi2_tauplus_q') self.tree.var('pi3_tauplus_px') self.tree.var('pi3_tauplus_py') self.tree.var('pi3_tauplus_pz') self.tree.var('pi3_tauplus_q') self.tree.var('pi1_tauminus_px') self.tree.var('pi1_tauminus_py') self.tree.var('pi1_tauminus_pz') self.tree.var('pi1_tauminus_q') self.tree.var('pi2_tauminus_px') self.tree.var('pi2_tauminus_py') self.tree.var('pi2_tauminus_pz') self.tree.var('pi2_tauminus_q') self.tree.var('pi3_tauminus_px') self.tree.var('pi3_tauminus_py') self.tree.var('pi3_tauminus_pz') self.tree.var('pi3_tauminus_q') # MC truth tree self.mc_truth_tree = Tree(self.cfg_ana.mc_truth_tree_name, self.cfg_ana.mc_truth_tree_title) # statistics self.counter = 0 # Total number of processed decays self.pb_counter = 0 # Number of events with B momentum > 25 GeV self.pvsv_distance_counter = 0 # Number of events with distance between PV and SV > 1 mm self.max_svtv_distance_counter = 0 # Number of events with any distance between SV and TV > 0.5 mm # histograms to visualize cuts TH1F.AddDirectory(False) # not to link histograms to files gROOT.ProcessLine('.x ' + self.cfg_ana.stylepath) # nice looking plots self.pb_hist = TH1F('pb_hist', 'P_{B}', 100, 0, 50) self.pvsv_distance_hist = TH1F('pvsv_distance_hist', 'FD_{B}', 100, 0, 10) self.max_svtv_distance_hist = TH1F('max_svtv_distance_hist', 'Max FD_{#tau}', 100, 0, 5) # time self.start_time = None self.last_timestamp = None
def beginLoop(self, setup): """Overriden base class function""" self.rootfile = TFile('/'.join([self.dirName, 'output.root']), 'recreate') # tree to store MC truth values and its branches self.mc_truth_tree = Tree(self.cfg_ana.mc_truth_tree_name, self.cfg_ana.mc_truth_tree_title) self.mc_truth_tree.var('n_particles') self.mc_truth_tree.var('event_number') self.mc_truth_tree.var('pv_x') self.mc_truth_tree.var('pv_y') self.mc_truth_tree.var('pv_z') self.mc_truth_tree.var('sv_x') self.mc_truth_tree.var('sv_y') self.mc_truth_tree.var('sv_z') self.mc_truth_tree.var('tv_tauplus_x') self.mc_truth_tree.var('tv_tauplus_y') self.mc_truth_tree.var('tv_tauplus_z') self.mc_truth_tree.var('tv_tauminus_x') self.mc_truth_tree.var('tv_tauminus_y') self.mc_truth_tree.var('tv_tauminus_z') self.mc_truth_tree.var('b_px') self.mc_truth_tree.var('b_py') self.mc_truth_tree.var('b_pz') self.mc_truth_tree.var('kstar_px') self.mc_truth_tree.var('kstar_py') self.mc_truth_tree.var('kstar_pz') self.mc_truth_tree.var('k_px') self.mc_truth_tree.var('k_py') self.mc_truth_tree.var('k_pz') self.mc_truth_tree.var('k_q') self.mc_truth_tree.var('pi_kstar_px') self.mc_truth_tree.var('pi_kstar_py') self.mc_truth_tree.var('pi_kstar_pz') self.mc_truth_tree.var('pi_kstar_q') self.mc_truth_tree.var('tauplus_px') self.mc_truth_tree.var('tauplus_py') self.mc_truth_tree.var('tauplus_pz') self.mc_truth_tree.var('pi1_tauplus_px') self.mc_truth_tree.var('pi1_tauplus_py') self.mc_truth_tree.var('pi1_tauplus_pz') self.mc_truth_tree.var('pi1_tauplus_q') self.mc_truth_tree.var('pi2_tauplus_px') self.mc_truth_tree.var('pi2_tauplus_py') self.mc_truth_tree.var('pi2_tauplus_pz') self.mc_truth_tree.var('pi2_tauplus_q') self.mc_truth_tree.var('pi3_tauplus_px') self.mc_truth_tree.var('pi3_tauplus_py') self.mc_truth_tree.var('pi3_tauplus_pz') self.mc_truth_tree.var('pi3_tauplus_q') self.mc_truth_tree.var('nu_tauplus_px') self.mc_truth_tree.var('nu_tauplus_py') self.mc_truth_tree.var('nu_tauplus_pz') self.mc_truth_tree.var('tauminus_px') self.mc_truth_tree.var('tauminus_py') self.mc_truth_tree.var('tauminus_pz') self.mc_truth_tree.var('pi1_tauminus_px') self.mc_truth_tree.var('pi1_tauminus_py') self.mc_truth_tree.var('pi1_tauminus_pz') self.mc_truth_tree.var('pi1_tauminus_q') self.mc_truth_tree.var('pi2_tauminus_px') self.mc_truth_tree.var('pi2_tauminus_py') self.mc_truth_tree.var('pi2_tauminus_pz') self.mc_truth_tree.var('pi2_tauminus_q') self.mc_truth_tree.var('pi3_tauminus_px') self.mc_truth_tree.var('pi3_tauminus_py') self.mc_truth_tree.var('pi3_tauminus_pz') self.mc_truth_tree.var('pi3_tauminus_q') self.mc_truth_tree.var('nu_tauminus_px') self.mc_truth_tree.var('nu_tauminus_py') self.mc_truth_tree.var('nu_tauminus_pz') # the same for smeared values self.tree = Tree(self.cfg_ana.tree_name, self.cfg_ana.tree_title) self.tree.var('n_particles') self.tree.var('event_number') self.tree.var('pv_x') self.tree.var('pv_y') self.tree.var('pv_z') self.tree.var('sv_x') self.tree.var('sv_y') self.tree.var('sv_z') self.tree.var('tv_tauplus_x') self.tree.var('tv_tauplus_y') self.tree.var('tv_tauplus_z') self.tree.var('tv_tauminus_x') self.tree.var('tv_tauminus_y') self.tree.var('tv_tauminus_z') self.tree.var('k_px') self.tree.var('k_py') self.tree.var('k_pz') self.tree.var('k_q') self.tree.var('pi_kstar_px') self.tree.var('pi_kstar_py') self.tree.var('pi_kstar_pz') self.tree.var('pi_kstar_q') self.tree.var('pi1_tauplus_px') self.tree.var('pi1_tauplus_py') self.tree.var('pi1_tauplus_pz') self.tree.var('pi1_tauplus_q') self.tree.var('pi2_tauplus_px') self.tree.var('pi2_tauplus_py') self.tree.var('pi2_tauplus_pz') self.tree.var('pi2_tauplus_q') self.tree.var('pi3_tauplus_px') self.tree.var('pi3_tauplus_py') self.tree.var('pi3_tauplus_pz') self.tree.var('pi3_tauplus_q') self.tree.var('pi1_tauminus_px') self.tree.var('pi1_tauminus_py') self.tree.var('pi1_tauminus_pz') self.tree.var('pi1_tauminus_q') self.tree.var('pi2_tauminus_px') self.tree.var('pi2_tauminus_py') self.tree.var('pi2_tauminus_pz') self.tree.var('pi2_tauminus_q') self.tree.var('pi3_tauminus_px') self.tree.var('pi3_tauminus_py') self.tree.var('pi3_tauminus_pz') self.tree.var('pi3_tauminus_q') # statistics self.counter = 0 # Total number of processed decays self.pb_counter = 0 # Number of events with B momentum > 25 GeV self.pvsv_distance_counter = 0 # Number of events with distance between PV and SV > 1 mm self.max_svtv_distance_counter = 0 # Number of events with any distance between SV and TV > 0.5 mm # histograms to visualize cuts TH1F.AddDirectory(False) # not to link histograms to files gROOT.ProcessLine('.x ' + self.cfg_ana.stylepath) # nice looking plots self.pb_hist = TH1F('pb_hist', 'P_{B}', 100, 0, 50) self.pvsv_distance_hist = TH1F('pvsv_distance_hist', 'FD_{B}', 100, 0, 10) self.max_svtv_distance_hist = TH1F('max_svtv_distance_hist', 'Max FD_{#tau}', 100, 0, 5) super(SignalAnalyzer, self).beginLoop(setup) #time self.start_time = time.time() self.last_timestamp = time.time()