Belle II Software light-2609-luna
Method Class Reference

Public Member Functions

 __init__ (self, identifier)
 
 train_teacher (self, datafiles, treename, general_options=None, specific_options=None)
 
 apply_expert (self, datafiles, treename)
 

Public Attributes

 identifier = identifier
 Identifier of the method.
 
 weightfile = ROOT.Belle2.MVA.Weightfile.load(self.identifier)
 Weightfile of the method.
 
 general_options = basf2_mva.GeneralOptions()
 General options of the method.
 
 specific_options = None
 Specific options of the method.
 
dict importances = {k: importances[k] for k in variables}
 Dictionary of the variable importances calculated by the method.
 
 variables = list(sorted(variables, key=lambda v: self.importances.get(v, 0.0)))
 List of variables sorted by their importance.
 
list root_variables = [ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(v) for v in self.variables]
 List of the variable importances calculated by the method, but with the root compatible variable names.
 
dict root_importances = {k: importances[k] for k in self.root_variables}
 Dictionary of the variables sorted by their importance but with root compatoble variable names.
 
 description = str(basf2_mva.info(self.identifier))
 Description of the method as a xml string returned by basf2_mva.info.
 
list spectators = [str(v) for v in self.general_options.m_spectators]
 List of spectators.
 
list root_spectators = [ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(v) for v in self.spectators]
 List of spectators with root compatible names.
 

Detailed Description

Wrapper class providing an interface to the method stored under the given identifier.
It loads the Options, can apply the expert and train new ones using the current as a prototype.
This class is used by the basf_mva_evaluation tools

Definition at line 122 of file basf2_mva_util.py.

Constructor & Destructor Documentation

◆ __init__()

__init__ ( self,
identifier )
Load a method stored under the given identifier
@param identifier identifying the method

Definition at line 129 of file basf2_mva_util.py.

129 def __init__(self, identifier):
130 """
131 Load a method stored under the given identifier
132 @param identifier identifying the method
133 """
134 # Always avoid the top-level 'import ROOT'.
135 import ROOT # noqa
136 # Initialize all the available interfaces
137 ROOT.Belle2.MVA.AbstractInterface.initSupportedInterfaces()
138
139 self.identifier = identifier
140
141 self.weightfile = ROOT.Belle2.MVA.Weightfile.load(self.identifier)
142
143 self.general_options = basf2_mva.GeneralOptions()
144 self.general_options.load(self.weightfile.getXMLTree())
145
146 # This piece of code should be correct but leads to random segmentation faults
147 # inside python, llvm or pyroot, therefore we use the more dirty code below
148 # Ideas why this is happening:
149 # 1. Ownership of the unique_ptr returned by getOptions()
150 # 2. Some kind of object slicing, although pyroot identifies the correct type
151 # 3. Bug in pyroot
152 # interfaces = ROOT.Belle2.MVA.AbstractInterface.getSupportedInterfaces()
153 # self.interface = interfaces[self.general_options.m_method]
154 # self.specific_options = self.interface.getOptions()
155
156
157 self.specific_options = None
158 if self.general_options.m_method == "FastBDT":
159 self.specific_options = basf2_mva.FastBDTOptions()
160 elif self.general_options.m_method == "TMVAClassification":
161 self.specific_options = basf2_mva.TMVAOptionsClassification()
162 elif self.general_options.m_method == "TMVARegression":
163 self.specific_options = basf2_mva.TMVAOptionsRegression()
164 elif self.general_options.m_method == "Python":
165 self.specific_options = basf2_mva.PythonOptions()
166 elif self.general_options.m_method == "PDF":
167 self.specific_options = basf2_mva.PDFOptions()
168 elif self.general_options.m_method == "Combination":
169 self.specific_options = basf2_mva.CombinationOptions()
170 elif self.general_options.m_method == "Reweighter":
171 self.specific_options = basf2_mva.ReweighterOptions()
172 elif self.general_options.m_method == "Trivial":
173 self.specific_options = basf2_mva.TrivialOptions()
174 elif self.general_options.m_method == "ONNX":
175 self.specific_options = basf2_mva.ONNXOptions()
176 else:
177 raise RuntimeError("Unknown method " + self.general_options.m_method)
178
179 self.specific_options.load(self.weightfile.getXMLTree())
180
181 variables = [str(v) for v in self.general_options.m_variables]
182 importances = self.weightfile.getFeatureImportance()
183
184
185 self.importances = {k: importances[k] for k in variables}
186
187 self.variables = list(sorted(variables, key=lambda v: self.importances.get(v, 0.0)))
188
189 self.root_variables = [ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(v) for v in self.variables]
190
191 self.root_importances = {k: importances[k] for k in self.root_variables}
192
193 self.description = str(basf2_mva.info(self.identifier))
194
195 self.spectators = [str(v) for v in self.general_options.m_spectators]
196
197 self.root_spectators = [ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(v) for v in self.spectators]
198

Member Function Documentation

◆ apply_expert()

apply_expert ( self,
datafiles,
treename )
Apply the expert of the method to data and return the calculated probability and the target
@param datafiles the datafiles
@param treename the name of the tree containing the data

Definition at line 229 of file basf2_mva_util.py.

229 def apply_expert(self, datafiles, treename):
230 """
231 Apply the expert of the method to data and return the calculated probability and the target
232 @param datafiles the datafiles
233 @param treename the name of the tree containing the data
234 """
235 import ROOT # noqa
236 if isinstance(datafiles, str):
237 datafiles = [datafiles]
238 with tempfile.TemporaryDirectory() as tempdir:
239 identifier = tempdir + "/weightfile.xml"
240 ROOT.Belle2.MVA.Weightfile.save(self.weightfile, identifier)
241
242 rootfilename = tempdir + '/expert.root'
243 basf2_mva.expert(basf2_mva.vector(identifier),
244 basf2_mva.vector(*datafiles),
245 treename,
246 rootfilename)
247 chain = ROOT.TChain("variables")
248 chain.Add(rootfilename)
249
250 expert_target = identifier + '_' + self.general_options.m_target_variable
251 stripped_expert_target = self.identifier + '_' + self.general_options.m_target_variable
252
253 output_names = [self.identifier]
254 branch_names = [
255 ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(identifier),
256 ]
257 if self.general_options.m_nClasses > 2:
258 output_names = [self.identifier+f'_{i}' for i in range(self.general_options.m_nClasses)]
259 branch_names = [
260 ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(
261 identifier +
262 f'_{i}') for i in range(
263 self.general_options.m_nClasses)]
264
265 d = chain2dict(
266 chain,
267 [*branch_names, ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(expert_target)],
268 [*output_names, stripped_expert_target])
269
270 return (d[str(self.identifier)] if self.general_options.m_nClasses <= 2 else np.array([d[x]
271 for x in output_names]).T), d[stripped_expert_target]
272
273

◆ train_teacher()

train_teacher ( self,
datafiles,
treename,
general_options = None,
specific_options = None )
Train a new method using this method as a prototype
@param datafiles the training datafiles
@param treename the name of the tree containing the training data
@param general_options general options given to basf2_mva.teacher
  (if None the options of this method are used)
@param specific_options specific options given to basf2_mva.teacher
  (if None the options of this method are used)

Definition at line 199 of file basf2_mva_util.py.

199 def train_teacher(self, datafiles, treename, general_options=None, specific_options=None):
200 """
201 Train a new method using this method as a prototype
202 @param datafiles the training datafiles
203 @param treename the name of the tree containing the training data
204 @param general_options general options given to basf2_mva.teacher
205 (if None the options of this method are used)
206 @param specific_options specific options given to basf2_mva.teacher
207 (if None the options of this method are used)
208 """
209 # Always avoid the top-level 'import ROOT'.
210 import ROOT # noqa
211 if isinstance(datafiles, str):
212 datafiles = [datafiles]
213 if general_options is None:
214 general_options = self.general_options
215 if specific_options is None:
216 specific_options = self.specific_options
217
218 with tempfile.TemporaryDirectory() as tempdir:
219 identifier = tempdir + "/weightfile.xml"
220
221 general_options.m_datafiles = basf2_mva.vector(*datafiles)
222 general_options.m_identifier = identifier
223
224 basf2_mva.teacher(general_options, specific_options)
225
226 method = Method(identifier)
227 return method
228

Member Data Documentation

◆ description

description = str(basf2_mva.info(self.identifier))

Description of the method as a xml string returned by basf2_mva.info.

Definition at line 193 of file basf2_mva_util.py.

◆ general_options

general_options = basf2_mva.GeneralOptions()

General options of the method.

Definition at line 143 of file basf2_mva_util.py.

◆ identifier

identifier = identifier

Identifier of the method.

Definition at line 139 of file basf2_mva_util.py.

◆ importances

dict importances = {k: importances[k] for k in variables}

Dictionary of the variable importances calculated by the method.

Definition at line 185 of file basf2_mva_util.py.

◆ root_importances

dict root_importances = {k: importances[k] for k in self.root_variables}

Dictionary of the variables sorted by their importance but with root compatoble variable names.

Definition at line 191 of file basf2_mva_util.py.

◆ root_spectators

list root_spectators = [ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(v) for v in self.spectators]

List of spectators with root compatible names.

Definition at line 197 of file basf2_mva_util.py.

◆ root_variables

list root_variables = [ROOT.Belle2.MakeROOTCompatible.makeROOTCompatible(v) for v in self.variables]

List of the variable importances calculated by the method, but with the root compatible variable names.

Definition at line 189 of file basf2_mva_util.py.

◆ specific_options

specific_options = None

Specific options of the method.

Definition at line 157 of file basf2_mva_util.py.

◆ spectators

list spectators = [str(v) for v in self.general_options.m_spectators]

List of spectators.

Definition at line 195 of file basf2_mva_util.py.

◆ variables

variables = list(sorted(variables, key=lambda v: self.importances.get(v, 0.0)))

List of variables sorted by their importance.

Definition at line 187 of file basf2_mva_util.py.

◆ weightfile

weightfile = ROOT.Belle2.MVA.Weightfile.load(self.identifier)

Weightfile of the method.

Definition at line 141 of file basf2_mva_util.py.


The documentation for this class was generated from the following file: