Belle II Software  release-05-02-19
fom.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 import collections
5 import array
6 import ROOT
7 
8 from tracking.root_utils import root_cd, root_save_name
9 
10 
11 class ValidationFiguresOfMerit(collections.MutableMapping):
12  """Create and write an TNtuple of the validation figures of merit"""
13 
14  def __init__(
15  self,
16  name,
17  description='',
18  check='',
19  contact='',
20  title='',
21  ):
22  """Constructor"""
23 
24 
25  self.name = root_save_name(name)
26 
27  self.description = description
28 
29  self.check = check
30 
31  self.contact = contact
32 
33  self.title = title
34 
35 
36  self.figures_by_name = collections.OrderedDict()
37 
38  def __str__(self):
39  """Informal string output listing the assigned figures of merit."""
40 
41  figures_by_name = self.figures_by_name
42  return '\n'.join('%s : %s' % (key, figures_by_name[key])
43  for key in
44  figures_by_name.keys())
45 
46  def write(self, tdirectory=None):
47  """Writes the figures of merit as a TNtuple.
48 
49  Parameters
50  ----------
51  tdirectory : ROOT.TDirectory, optional
52  The directory to which the TNtuple shall be written.
53  Defaults to the current directory.
54  """
55  name = self.name
56 
57  if not self.figures_by_name:
58  get_logger().warning('Do not create Ntuple for empty ValidationFiguresOfMerit %s' % name)
59  return
60 
61  title = self.title or name
62  contact = self.contact
63 
64  description = self.description
65  check = self.check
66 
67  figure_names = [root_save_name(key) for key in list(self.figures_by_name.keys())]
68  values = list(self.figures_by_name.values())
69 
70  with root_cd(tdirectory) as tdirectory:
71  # Try to find the object first
72  tntuple = tdirectory.Get(name)
73  if tntuple:
74  former_description = tntuple.GetAlias('Description')
75  former_check = tntuple.GetAlias('Check')
76  former_figure_names = []
77  former_values = []
78  tntuple.GetEntry(0)
79  for tleaf in tntuple.GetListOfLeaves():
80  former_figure_names.append(tleaf.GetName())
81  former_values.append(tleaf.GetValue())
82 
83  # Append the description and check of this figure of merit to whatever is there
84  description = former_description + ' <br/>\n' + description
85  check = former_check + ' <br/>\n' + check
86 
87  figure_names = former_figure_names + figure_names
88  values = former_values + values
89 
90  # Need both delete and overwrite to get rid of the former object.
91  tdirectory.Delete(name)
92  write_option = ROOT.TObject.kOverwrite
93 
94  else:
95  write_option = 0
96 
97  leaf_specification = ':'.join(figure_names)
98  tntuple = ROOT.TNtuple(name, title, leaf_specification)
99 
100  array_of_values = array.array('f', values)
101  tntuple.Fill(array_of_values)
102 
103  tntuple.SetAlias('Description', description)
104  tntuple.SetAlias('Check', check)
105  tntuple.SetAlias('Contact', contact)
106 
107  # Overwrite the former TNtuple if one was there
108  tntuple.Write("", write_option)
109 
110  def __setitem__(self, figure_name, value):
111  """Braketed item assignement for figures of merit"""
112 
113  self.figures_by_name[figure_name] = value
114 
115  def __getitem__(self, figure_name):
116  """Braketed item lookup for figures of merit"""
117 
118  return self.figures_by_name[figure_name]
119 
120  def __delitem__(self, figure_name):
121  """Braketed item deletion for figures of merit"""
122 
123  del self.figures_by_name[figure_name]
124 
125  def __iter__(self):
126  """Implements the iter() hook as if it was a dictionary."""
127 
128  return iter(self.figures_by_name)
129 
130  def __len__(self):
131  """Returns the number of figures of merit assigned. Implements the len() hook."""
132 
133  return len(self.figures_by_name)
134 
135 
137  """Create and write an TNtuple with several validation figures of merit"""
138 
139  def __str__(self):
140  """Describe myself"""
141  return 'Not supported.'
142 
143  def write(self, tdirectory=None):
144  """Writes the figures of merit as a TNtuple.
145 
146  Parameters
147  ----------
148  tdirectory : ROOT.TDirectory, optional
149  The directory to which the TNtuple shall be written.
150  Defaults to the current directory.
151  """
152  name = self.name
153  figure_names = [root_save_name(key) for key in list(self.figures_by_name.keys())]
154  values = list(self.figures_by_name.values())
155 
156  leaf_specification = ':'.join(figure_names)
157  title = self.title or ""
158  ntuple = ROOT.TNtuple(name, title, leaf_specification)
159 
160  for value in zip(*values):
161  ntuple.Fill(*value)
162 
163  ntuple.SetAlias('Description', self.description)
164  ntuple.SetAlias('Check', self.check)
165  ntuple.SetAlias('Contact', self.contact)
166 
167  with root_cd(tdirectory):
168  ntuple.Write()
tracking.validation.fom.ValidationFiguresOfMerit
Definition: fom.py:11
tracking.validation.fom.ValidationFiguresOfMerit.__delitem__
def __delitem__(self, figure_name)
Definition: fom.py:120
tracking.validation.fom.ValidationFiguresOfMerit.figures_by_name
figures_by_name
cached dictionary of figures for this figure of merit
Definition: fom.py:29
tracking.validation.fom.ValidationFiguresOfMerit.description
description
cached description for this figure of merit
Definition: fom.py:20
tracking.validation.fom.ValidationManyFiguresOfMerit
Definition: fom.py:136
tracking.validation.fom.ValidationManyFiguresOfMerit.write
def write(self, tdirectory=None)
Definition: fom.py:143
tracking.validation.fom.ValidationManyFiguresOfMerit.__str__
def __str__(self)
Definition: fom.py:139
tracking.validation.fom.ValidationFiguresOfMerit.__iter__
def __iter__(self)
Definition: fom.py:125
tracking.validation.fom.ValidationFiguresOfMerit.name
name
cached name for this figure of merit
Definition: fom.py:18
tracking.validation.fom.ValidationFiguresOfMerit.__setitem__
def __setitem__(self, figure_name, value)
Definition: fom.py:110
tracking.validation.fom.ValidationFiguresOfMerit.__getitem__
def __getitem__(self, figure_name)
Definition: fom.py:115
tracking.root_utils
Definition: root_utils.py:1
tracking.validation.fom.ValidationFiguresOfMerit.__init__
def __init__(self, name, description='', check='', contact='', title='')
Definition: fom.py:14
tracking.validation.fom.ValidationFiguresOfMerit.write
def write(self, tdirectory=None)
Definition: fom.py:46
tracking.validation.fom.ValidationFiguresOfMerit.__len__
def __len__(self)
Definition: fom.py:130
tracking.validation.fom.ValidationFiguresOfMerit.title
title
cached title for this figure of merit
Definition: fom.py:26
tracking.validation.fom.ValidationFiguresOfMerit.contact
contact
cached contact person for this figure of merit
Definition: fom.py:24
tracking.validation.fom.ValidationFiguresOfMerit.check
check
cached user-check action for this figure of merit
Definition: fom.py:22
tracking.validation.fom.ValidationFiguresOfMerit.__str__
def __str__(self)
Definition: fom.py:38