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