Belle II Software  release-06-01-15
validation.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 """\
13 This module contains classes for plotting validation results.
14 """
15 import pxd.utils as utils
16 from pxd.utils.plots import *
17 import uproot
18 import ROOT
19 import pandas as pd
20 import numpy as np
21 
22 
23 def analyse_root_file(file_name, tree_name="tree"):
24  """
25  Function to analyse the ROOT file generated from validation algorithm
26  Parameters:
27  file_name (str): name of the ROOT file
28  tree_name (str): name of the TTree
29  """
30  # Get TTree
31  tfile = ROOT.TFile.Open(file_name)
32  tree = tfile.Get(tree_name)
33  # Read pandas.DataFrame from some branches
34  branches = ['exp', 'run', 'pxdid', 'uBin', 'vBin', 'nTrackPoints', 'nSelTrackPoints', 'nSelTrackClusters', 'nTrackClusters']
35  df = uproot.open(file_name)[tree_name].arrays(branches, library='pd')
36  experiment_number = df.exp.min()
37  run_range = (df.run.min(), df.run.max())
38  prefix = f"e{experiment_number:05}_r{run_range[0]:04}-{run_range[1]:04}_"
39 
40  # Calculate efficiencies for all regions
41  df.calculate_eff(num="nTrackClusters", den="nTrackPoints", output_var="eff")
42  df.calculate_eff(num="nSelTrackClusters", den="nSelTrackPoints", output_var="eff_sel")
43 
44  plot_in_module_efficiency(
45  df=df,
46  pxdid=1052,
47  y="eff_sel",
48  x="run",
49  cut="eff_sel>0&eff_sel_err_low<0.01",
50  yerr_low="eff_sel_err_low",
51  yerr_up="eff_sel_err_up",
52  save_to=prefix + "efficiency_in_selected_regions_H1052.png")
53 
54  # Calculate efficiency of the entire PXD
55  df_sum_all = df.groupby(['exp', 'run'])[["nTrackPoints", "nSelTrackPoints",
56  "nTrackClusters", "nSelTrackClusters"]].sum().reset_index()
57  df_sum_all.calculate_eff(num="nTrackClusters", den="nTrackPoints", output_var="eff")
58  df_sum_all.calculate_eff(num="nSelTrackClusters", den="nSelTrackPoints", output_var="eff_sel")
59 
60  plot_efficiency_vs_run(df=df_sum_all, max_err=0.01, save_to=prefix + "pxd_efficiency_vs_run.png")
61 
62  # Calculate efficiences of modules
63  df_module_sum = df.groupby(['exp', 'run', 'pxdid'])[["nTrackPoints", "nSelTrackPoints",
64  "nTrackClusters", "nSelTrackClusters"]].sum().reset_index()
65  df_module_sum["pxdid"] = df_module_sum["pxdid"].astype(np.int)
66  df_module_sum.calculate_eff(num="nTrackClusters", den="nTrackPoints", output_var="eff")
67  df_module_sum.calculate_eff(num="nSelTrackClusters", den="nSelTrackPoints", output_var="eff_sel")
68 
69  plot_module_efficiencies_in_DHHs(df=df_module_sum, save_to=prefix + "efficiency_vs_run.png")
70 
71  # 2d efficiency map
72  c1 = ROOT.TCanvas("c1", "c1", 900, 600)
73  ROOT.gStyle.SetPalette(ROOT.kDarkRainBow)
74  h2eff_l1 = plot_efficiency_map(
75  tree=tree,
76  exp_runs=[
77  0,
78  9999],
79  num_name="hTrackClustersLayer1",
80  den_name="hTrackPointsLayer1",
81  save_to=prefix + "efficiency_l1.png",
82  canvas=c1)
83  h2eff_l2 = plot_efficiency_map(
84  tree=tree,
85  exp_runs=[
86  0,
87  9999],
88  num_name="hTrackClustersLayer2",
89  den_name="hTrackPointsLayer2",
90  title="Efficiency of layer 2",
91  save_to=prefix + "efficiency_l2.png",
92  canvas=c1)
93  # ip resolutions
94  df_res = plot_ip_resolutions(tree=tree, save_to=prefix + "pxd_resolutions_vs_run.png")
95 
96 
97 if __name__ == "__main__":
98  import sys
99  file_name = sys.argv[1]
100  ROOT.gROOT.SetBatch(True)
101  analyse_root_file(file_name)