14 <contact>software-tracking@belle2.org</contact>
15 <output>fullTrackingValidationTable.root</output>
16 <input>matching_validation.root</input>
17 <description>This module generates events for the validation using the full tracking with a tabular output.</description>
21 from ROOT
import TFile, TNamed
24 VALIDATION_OUTPUT_FILE =
"fullTrackingTableValidation.root"
27 from root_pandas
import read_root
30 basf2.B2FATAL(
"You need to have pandas installed for this validation script to run.")
32 FORMAT_STRING =
" {:.2%} <br/> -{:.2%} <br/> <b>-{:.2%}</b> <br/> Matching: {:.2%} <br/> CDC: {:.2%} <br/> VXD: {:.2%}"
33 SHORT_FORMAT_STRING =
"MC: {:.2%} <br/>Missing: -{:.2%} <br/>Missing and !fit: <b>-{:.2%}</b>"
36 def reducelist(list_of_cuts, df, current_name=None, current_cut=None, x=0, y=0):
37 if current_name
is not None:
39 return_string = FORMAT_STRING.format(current_cut.mean(),
40 (current_cut & (df.is_matched == 0)).mean(),
41 (current_cut & (df.fitted_is_matched == 0)).mean(),
42 (current_cut & (df.both_related == 1)).mean(),
43 (current_cut & (df.cdc_has_related == 1)).mean(),
44 (current_cut & (df.vxd_has_related == 1)).mean())
46 return_string = SHORT_FORMAT_STRING.format(current_cut.mean(),
47 (current_cut & (df.is_matched == 0)).mean(),
48 (current_cut & (df.fitted_is_matched == 0)).mean())
49 yield (y, x, current_name), return_string
54 name, cut = list_of_cuts[0]
59 return x.is_missing == x.is_missing
61 if current_name
is None:
62 yield from reducelist(list_of_cuts[1:], df, name, cut(df),
63 x + 2 ** (len(list_of_cuts) - 1), y + 1)
65 yield from reducelist(list_of_cuts[1:], df, current_name +
"_no_" + name, current_cut & (~cut(df)),
67 yield from reducelist(list_of_cuts[1:], df, current_name +
"_" + name, current_cut & (cut(df)),
68 x + 2 ** (len(list_of_cuts) - 1), y + 1)
71 def make_chunks(k, n):
72 return [k[i:i + n]
for i
in range(0, len(k), n)]
75 def write_value_cell(key, value):
77 colspan = 2 ** int(5 - y)
80 3: [
"white",
"gray",
"orange",
"green"],
81 4: [
"gray",
"white",
"gray",
"gray",
82 "orange",
"orange",
"green",
"green"],
83 5: [
"gray",
"gray",
"red",
"green",
84 "gray",
"gray",
"gray",
"gray",
85 "red",
"gray",
"red",
"orange",
86 "green",
"gray",
"orange",
"green"]
90 color_index = int((x - 2 ** 4) / (2 ** (5 - y)))
91 color = colors[y][color_index]
96 <td style="border: 1px solid black" colspan={colspan}
97 align="center" valign=middle bgcolor="{color}">{value}</td>
98 """.format(colspan=colspan, color=color, value=value)
101 def make_html_row(x):
102 keys = [key
for key, _
in x.iteritems()]
103 titles = [key[2]
for key, _
in x.iteritems()]
105 chunked_titles = make_chunks(titles, 2)
106 common_prefixes = list(map(os.path.commonprefix, chunked_titles))
108 shorter_titles = [title.replace(prefix,
"").replace(
"_",
" ")
109 for list_titles, prefix
in zip(chunked_titles, common_prefixes)
110 for title
in list_titles]
112 row_content =
"".join([write_value_cell(key, value)
for key, value
in zip(keys, shorter_titles)])
113 html =
"<tr>" + row_content +
"</tr>"
115 row_content =
"".join([write_value_cell(key, value)
for key, value
in x.sort_index().iteritems()])
116 html +=
"<tr>" + row_content +
"</tr>"
121 def get_html(df, test):
122 results = pd.DataFrame(dict(reducelist(test, df)), index=[0]).unstack()
124 last_row_titles = [
"",
"",
"CDCTF may help",
"Criteria?",
"",
"",
"",
"",
"VXDTF may help",
"",
125 "hard cases",
"CKF may help",
"Criteria?",
"",
"CKF may help",
"Merging"]
128 html +=
"".join(results.groupby(level=0).apply(make_html_row))
129 html +=
"<tr>" + (
"".join([
"<td>" + value +
"</td>" for value
in last_row_titles])) +
"</tr>"
135 if __name__ ==
'__main__':
139 (
"has_vxd",
lambda x: (x.n_svd_hits >= 2)),
140 (
"vxd_was_found",
lambda x: x[
"vxd_was_found"] == 1),
141 (
"has_cdc",
lambda x: x.n_cdc_hits >= 3),
142 (
"cdc_was_found",
lambda x: x[
"cdc_was_found"] == 1),
145 df = read_root(
"../matching_validation.root")
146 html = get_html(df, test)
148 tfile = TFile(VALIDATION_OUTPUT_FILE,
"RECREATE")
149 html_content = TNamed(
"Tracking Table Validation", html)