Belle II Software development
Method Class Reference

Public Member Functions

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

Public Attributes

 identifier
 Identifier of the method.
 
 weightfile
 Weightfile of the method.
 
 general_options
 General options of the method.
 
 specific_options
 Specific options of the method.
 
 importances
 Dictionary of the variable importances calculated by the method.
 
 variables
 List of variables sorted by their importance.
 
 root_variables
 List of the variable importances calculated by the method, but with the root compatible variable names.
 
 root_importances
 Dictionary of the variables sorted by their importance but with root compatoble variable names.
 
 description
 Description of the method as a xml string returned by basf2_mva.info.
 
 spectators
 List of spectators.
 
 root_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 129 of file basf2_mva_util.py.

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 136 of file basf2_mva_util.py.

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

Member Function Documentation

◆ apply_expert()

def 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 236 of file basf2_mva_util.py.

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

◆ train_teacher()

def 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 206 of file basf2_mva_util.py.

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

Member Data Documentation

◆ description

description

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

Definition at line 200 of file basf2_mva_util.py.

◆ general_options

general_options

General options of the method.

Definition at line 150 of file basf2_mva_util.py.

◆ identifier

identifier

Identifier of the method.

Definition at line 146 of file basf2_mva_util.py.

◆ importances

importances

Dictionary of the variable importances calculated by the method.

Definition at line 192 of file basf2_mva_util.py.

◆ root_importances

root_importances

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

Definition at line 198 of file basf2_mva_util.py.

◆ root_spectators

root_spectators

List of spectators with root compatible names.

Definition at line 204 of file basf2_mva_util.py.

◆ root_variables

root_variables

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

Definition at line 196 of file basf2_mva_util.py.

◆ specific_options

specific_options

Specific options of the method.

Definition at line 164 of file basf2_mva_util.py.

◆ spectators

spectators

List of spectators.

Definition at line 202 of file basf2_mva_util.py.

◆ variables

variables

List of variables sorted by their importance.

Definition at line 194 of file basf2_mva_util.py.

◆ weightfile

weightfile

Weightfile of the method.

Definition at line 148 of file basf2_mva_util.py.


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