Belle II Software  light-2212-foldex
inputVariablesPlots.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 
11 
12 
24 
25 import os
26 import glob
27 import sys
28 from matplotlib.ticker import FormatStrFormatter
29 import matplotlib.pyplot as plt
30 import ROOT
31 from ROOT import Belle2
32 import basf2 as b2
33 import flavorTagger as ft
34 from defaultEvaluationParameters import categories
35 
36 import numpy as np
37 import matplotlib as mpl
38 mpl.use('Agg')
39 mpl.rcParams.update({'font.size': 22})
40 mpl.rcParams['text.usetex'] = True
41 mpl.rcParams['text.latex.preamble'] = [r"\usepackage{amsmath}"]
42 
43 ROOT.gROOT.SetBatch(True)
44 
45 if len(sys.argv) != 5:
46  sys.exit("Must provide 4 arguments: [Belle or Belle2] [BGx0 or BGx1] [training] [workingDirectory]"
47  )
48 
49 belleOrBelle2 = sys.argv[1]
50 MCtype = str(sys.argv[2])
51 decayChannelTrainedOn = str(sys.argv[3]) # Decay channel of the weight files "JPsiKs" or "nunubar"
52 workingDirectory = sys.argv[4]
53 
54 filesDirectory = workingDirectory + '/FlavorTagging/TrainedMethods'
55 
56 if decayChannelTrainedOn == 'JPsiKs':
57  decayChannelTrainedOn = 'JpsiKs_mu'
58 
59 weightFiles = 'B2' + decayChannelTrainedOn + MCtype
60 
61 
62 ROOT.TH1.SetDefaultSumw2()
63 
64 allInputVariables = []
65 
66 belleOrBelle2Flag = belleOrBelle2
67 
68 identifiersExtraInfosDict = dict()
69 identifiersExtraInfosKaonPion = []
70 
71 if belleOrBelle2 == "Belle":
72  unitImp = "cm"
73 
74 dBw = 50
75 
76 pBins = 50
77 fBins = 100
78 
79 unitImp = "mm"
80 
81 variablesPlotParamsDict = {
82  'useCMSFrame(p)': ['useCMSFrame__bop__bc', pBins, 0, 3, r'$p^*\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
83  'useCMSFrame(pt)': ['useCMSFrame__bopt__bc', pBins, 0, 3, r'$p_{\rm t}^*\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
84  'p': ['p', pBins, 0, 3, r'$p\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
85  'pt': ['pt', pBins, 0, 3, r'$p_{\rm t}\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
86  'cosTheta': ['cosTheta', dBw, -1, 1.01, r'$\cos{\theta}$', ""],
87  ft.eId[ft.getBelleOrBelle2()]: [Belle2.MakeROOTCompatible.makeROOTCompatible(ft.eId[ft.getBelleOrBelle2()]),
88  dBw, 0, 1.01, r'$\mathcal{L}_{e}$', ""],
89  'eid_dEdx': ['eid_dEdx', dBw, 0, 1.01, r'$\mathcal{L}_{e}^{{\rm d}E/{\rm d}x}$', ""],
90  'eid_TOP': ['eid_TOP', dBw, 0, 1.01, r'$\mathcal{L}_{e}^{\rm TOP}$', ""],
91  'eid_ARICH': ['eid_ARICH', dBw, 0, 1.01, r'$\mathcal{L}_{e}^{\rm ARICH}$', ""],
92  'eid_ECL': ['eid_ECL', dBw, 0, 1.01, r'$\mathcal{L}_{e}^{\rm ECL}$', ""],
93  'BtagToWBosonVariables(recoilMassSqrd)': ['BtagToWBosonVariables__borecoilMassSqrd__bc', fBins,
94  0, 100, r'$M_{\rm rec}^2\ [{\rm GeV}^2/c^4]$', r"{\rm GeV}^2/c^4"],
95  'BtagToWBosonVariables(pMissCMS)': [
96  'BtagToWBosonVariables__bopMissCMS__bc', 60, 0, 3.6,
97  r'$p^*_{\rm miss}\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
98  'BtagToWBosonVariables(cosThetaMissCMS)': ['BtagToWBosonVariables__bocosThetaMissCMS__bc',
99  dBw, -1, 1.01, r'$\cos{\theta^*_{\rm miss}}$', ""],
100  'BtagToWBosonVariables(EW90)': ['BtagToWBosonVariables__boEW90__bc',
101  dBw, 0, 4, r'$E_{90}^{W}\ [{\rm GeV}]$', r"{\rm GeV}\, "],
102  'BtagToWBosonVariables(recoilMass)': ['sqrt(abs(BtagToWBosonVariables__borecoilMassSqrd__bc))',
103  dBw, 0, 12, r'$M_{\rm rec}\ [{\rm GeV}/c^2]$', r"{\rm GeV}/c^2\, "],
104  'cosTPTO': ['cosTPTO', dBw, 0, 1.01, r'$\vert\cos{\theta^*_{\rm T}}\vert$', ""],
105  'ImpactXY': ['ImpactXY', dBw, 0, 0.5, r'$d_0\ [{\rm ' + unitImp + '}]$', r"{\rm " + unitImp + r"}\, "],
106  'z0': ['z0', dBw, 0, 1.0, r'$z_0\ [{\rm ' + unitImp + '}]$', r"{\rm " + unitImp + r"}\, "],
107  'y': ['y', dBw, -0.15, 0.15, r'$y_0\ [{\rm ' + unitImp + '}]$', r"{\rm " + unitImp + r"}\, "],
108  'OBoost': ['OBoost', dBw, -0.15, 0.15, r'$d_0^\prime\ [{\rm ' + unitImp + '}]$', r"{\rm " + unitImp + r"}\, "],
109  'distance': ['distance', dBw, 0, 1.5, r'$\xi_0\ [{\rm ' + unitImp + '}]$', r"{\rm " + unitImp + r"}\, "],
110  'chiProb': ['chiProb', dBw, 0, 1.01, r'$p$-${\rm value}$', ""],
111  ft.muId[ft.getBelleOrBelle2()]: [Belle2.MakeROOTCompatible.makeROOTCompatible(ft.muId[ft.getBelleOrBelle2()]),
112  dBw, 0, 1.01, r'$\mathcal{L}_{\mu}$', ""],
113  'muid_dEdx': ['muid_dEdx', dBw, 0, 1.01, r'$\mathcal{L}_{\mu}^{{\rm d}E/{\rm d}x}$', ""],
114  'muid_TOP': ['muid_TOP', dBw, 0, 1.01, r'$\mathcal{L}_{\mu}^{\rm TOP}$', ""],
115  'muid_ARICH': ['muid_ARICH', dBw, 0, 1.01, r'$\mathcal{L}_{\mu}^{\rm ARICH}$', ""],
116  'muid_KLM': ['muid_KLM', dBw, 0, 1.01, r'$\mathcal{L}_{\mu}^{\rm KLM}$', ""],
117  ft.KId[ft.getBelleOrBelle2()]: [Belle2.MakeROOTCompatible.makeROOTCompatible(ft.KId[ft.getBelleOrBelle2()]),
118  dBw, 0, 1.01, r'$\mathcal{L}_{K}$', ""],
119  'Kid_dEdx': ['Kid_dEdx', dBw, 0, 1.01, r'$\mathcal{L}_{K}^{{\rm d}E/{\rm d}x}$', ""],
120  'Kid_TOP': ['Kid_TOP', dBw, 0, 1.01, r'$\mathcal{L}_{K}^{\rm TOP}$', ""],
121  'Kid_ARICH': ['Kid_ARICH', dBw, 0, 1.01, r'$\mathcal{L}_{K}^{\rm ARICH}$', ""],
122  'NumberOfKShortsInRoe': ['NumberOfKShortsInRoe', dBw, 0, 12, r'$n_{K^0_S}$', ""],
123  'ptTracksRoe': ['ptTracksRoe', fBins, 0, 6, r'$\Sigma\, p_{\rm t}^2\ [{\rm GeV^2}/c^2]$',
124  r"{\rm GeV^2}/c^2"],
125  'extraInfo(isRightCategory(Kaon))': ['extraInfo__boisRightCategory__boKaon__bc__bc',
126  dBw, 0, 1.01, r"$y_{\rm Kaon}$", ""],
127  'HighestProbInCat(pi+:inRoe, isRightCategory(SlowPion))': [
128  'HighestProbInCat__bopi__pl__clinRoe__cm__spisRightCategory__boSlowPion__bc__bc',
129  dBw, 0, 1.01, r"$y_{\rm SlowPion}$", ""],
130  'KaonPionVariables(cosKaonPion)': ['KaonPionVariables__bocosKaonPion__bc',
131  dBw, -1, 1.01, r'$\cos{\theta^*_{K\pi}}$', ""],
132  'KaonPionVariables(HaveOpositeCharges)': ['KaonPionVariables__boHaveOpositeCharges__bc',
133  dBw, 0, 1.01, r'$\frac{1 - q_{K} \cdot q_\pi}{2}$', ""],
134  'pionID': ['pionID', dBw, 0, 1.01, r'$\mathcal{L}_{\pi}$', ""],
135  'piid_dEdx': ['piid_dEdx', dBw, 0, 1.01, r'$\mathcal{L}_{\pi}^{{\rm d}E/{\rm d}x}$', ""],
136  'piid_TOP': ['piid_TOP', dBw, 0, 1.01, r'$\mathcal{L}_{\pi}^{\rm TOP}$', ""],
137  'piid_ARICH': ['piid_ARICH', dBw, 0, 1.01, r'$\mathcal{L}_{\pi}^{\rm ARICH}$', ""],
138  'pi_vs_edEdxid': ['pi_vs_edEdxid', dBw, 0, 1.01, r'$\mathcal{L}_{\pi/e}^{{\rm d}E/{\rm d}x}$', ""],
139  'FSCVariables(pFastCMS)': ['FSCVariables__bopFastCMS__bc', pBins, 0, 3, r'$p^*_{\rm Fast}\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
140  'FSCVariables(cosSlowFast)': ['FSCVariables__bocosSlowFast__bc', dBw, -1, 1.01, r'$\cos{\theta^*_{\rm SlowFast}}$', ''],
141  'FSCVariables(cosTPTOFast)': ['FSCVariables__bocosTPTOFast__bc', dBw, 0, 1.01, r'$\vert\cos{\theta^*_{\rm T, Fast}}\vert$', ''],
142  'FSCVariables(SlowFastHaveOpositeCharges)': ['FSCVariables__boSlowFastHaveOpositeCharges__bc',
143  dBw, 0, 1.01, r'$\frac{1 - q_{\rm Slow} \cdot q_{\rm Fast}}{2}$', ""],
144  'lambdaFlavor': ['lambdaFlavor', dBw, -1, 1.01, r'$q_{\Lambda}$', ""],
145  'M': ['M', dBw, 1.08, 1.22, r'$M_{\Lambda}\ [{\rm GeV}/c^2]$', r"{\rm MeV}/c^2\, "],
146  'cosAngleBetweenMomentumAndVertexVector': ['cosAngleBetweenMomentumAndVertexVector',
147  dBw, -1, 1.01,
148  r'$\cos{\theta_{\boldsymbol{x}_{\Lambda},\boldsymbol{p}_{\Lambda}}}$', ""],
149  'lambdaZError': ['lambdaZError', dBw, 0, 0.05, r'$\sigma_{\Lambda}^{zz}$', r"{\rm mm}\, "],
150  'daughter(0,p)': ['daughter__bo0__cmp__bc', dBw, 0, 1, r'$p_{\pi}\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
151  'daughter(0,useCMSFrame(p))': ['daughter__bo0__cmuseCMSFrame__bop__bc__bc',
152  dBw, 0, 1, r'$p^*_{\pi}\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
153  'daughter(1,p)': ['daughter__bo1__cmp__bc', dBw, 0, 2, r'$p_{p}\ [{\rm GeV}/c]$', r"{\rm GeV}/c"],
154  'daughter(1,useCMSFrame(p))': ['daughter__bo1__cmuseCMSFrame__bop__bc__bc',
155  dBw, 0, 2, r'$p^*_{p}\ [{\rm GeV}/c]$', r"{\rm GeV}/c\, "],
156  'daughter(1,protonID)': ['daughter__bo1__cmprotonID__bc', dBw, 0, 1.01, r'$\mathcal{L}_{p}$', ""],
157  'daughter(0,pionID)': ['daughter__bo0__cmpionID__bc', dBw, 0, 1.01, r'$\mathcal{L}_{\pi}$', ""]}
158 
159 if not b2.find_file('InputVariablesPlots', silent=True):
160  os.mkdir('./InputVariablesPlots')
161 
162 
163 def plotInputVariablesOfFlavorTagger():
164  """
165  Makes plots of the distribution of the input variables of the flavor tagger
166  for each category distinguishing between the target particles of the category (signal)
167  and all the other (bkg.)
168  """
169 
170  for (particleList, category, _) in ft.getEventLevelParticleLists(categories):
171 
172  # if category != "SlowPion":
173  # continue
174 
175  if not b2.find_file('InputVariablesPlots/' + category, silent=True):
176  os.mkdir('./InputVariablesPlots/' + category)
177 
178  if particleList not in identifiersExtraInfosDict and category != 'KaonPion':
179  identifiersExtraInfosDict[particleList] = []
180 
181  methodPrefixEventLevel = "FlavorTagger_" + belleOrBelle2Flag + "_" + weightFiles + 'EventLevel' + category + 'FBDT'
182  treeName = methodPrefixEventLevel + "_tree"
183  targetVariable = 'isRightCategory(' + category + ')'
184 
185  tree = ROOT.TChain(treeName)
186 
187  workingFiles = glob.glob(filesDirectory + '/' + methodPrefixEventLevel + 'sampled*.root')
188  # print("workingFiles = ", workingFiles)
189  # workingFiles = glob.glob(filesDirectory + '/' + methodPrefixEventLevel + 'sampled1?.root')
190 
191  for iFile in workingFiles:
192  tree.AddFile(iFile)
193 
194  categoryInputVariables = []
195  trulyUsedInputVariables = []
196  for iVariable in tree.GetListOfBranches():
197 
198  managerVariableName = str(Belle2.MakeROOTCompatible.invertMakeROOTCompatible(iVariable.GetName()))
199 
200  if managerVariableName in ft.getTrainingVariables(category) or managerVariableName == 'distance' or \
201  managerVariableName == 'z0' or managerVariableName == 'ImpactXY' or \
202  managerVariableName == 'y' or managerVariableName == 'OBoost':
203  if managerVariableName in categoryInputVariables:
204  continue
205 
206  categoryInputVariables.append(managerVariableName)
207  if managerVariableName in ft.getTrainingVariables(category):
208  allInputVariables.append((category, managerVariableName))
209  trulyUsedInputVariables.append((category, managerVariableName))
210 
211  if managerVariableName not in identifiersExtraInfosDict[particleList] and category != 'KaonPion':
212  identifiersExtraInfosDict[particleList].append(managerVariableName)
213 
214  elif category == 'KaonPion' and managerVariableName not in identifiersExtraInfosKaonPion:
215  identifiersExtraInfosKaonPion.append(managerVariableName)
216 
217  # if managerVariableName not in variablesPlotParamsDict:
218  # variablesPlotParamsDict[managerVariableName] =
219  # [iVariable.GetName(), 100, 0, 2, iVariable.GetName(), "unit"]
220 
221  print("The number of variables used in " + category + " is = ", len(trulyUsedInputVariables))
222 
223  if category != 'KaonPion' and category != 'FSC' and category != 'MaximumPstar' and \
224  category != 'FastHadron' and category != 'Lambda':
225  categoryInputVariables.append('BtagToWBosonVariables(recoilMass)')
226 
227  for inputVariable in categoryInputVariables:
228 
229  print(inputVariable)
230 
231  nBins = variablesPlotParamsDict[inputVariable][1]
232  limXmin = variablesPlotParamsDict[inputVariable][2]
233  limXmax = variablesPlotParamsDict[inputVariable][3]
234 
235  if category == "SlowPion":
236  if inputVariable == 'p' or inputVariable == 'useCMSFrame(p)' or \
237  inputVariable == 'pt' or inputVariable == 'useCMSFrame(pt)':
238  nBins = 150
239  limXmax = 1.5
240 
241  if inputVariable == 'distance':
242  nBins = 80
243  limXmax = 2.4
244 
245  if inputVariable == 'ImpactXY':
246  nBins = 80
247  limXmax = 0.8
248 
249  if category == "Lambda":
250  if inputVariable == 'distance':
251  # nBins = 25
252  limXmax = 10
253 
254  if inputVariable == 'chiProb':
255  nBins = 25
256 
257  signalHistogram = ROOT.TH1F("signal" + category + str(Belle2.MakeROOTCompatible.makeROOTCompatible(inputVariable)), "",
258  nBins,
259  limXmin,
260  limXmax)
261  backgroundHistogram = ROOT.TH1F("bkg" + category + str(Belle2.MakeROOTCompatible.makeROOTCompatible(inputVariable)), "",
262  nBins,
263  limXmin,
264  limXmax)
265 
266  factorMultiplication = str()
267 
268  if belleOrBelle2 == "Belle2" and ((category != "Lambda" and inputVariable == 'distance') or inputVariable ==
269  'z0' or inputVariable == 'ImpactXY' or inputVariable ==
270  'y' or inputVariable == 'OBoost'):
271  factorMultiplication = "*10 "
272 
273  tree.Draw(variablesPlotParamsDict[inputVariable][0] + factorMultiplication + ">> signal" + category + str(
275  Belle2.MakeROOTCompatible.makeROOTCompatible(targetVariable) + " > 0")
276 
277  tree.Draw(
278  variablesPlotParamsDict[inputVariable][0] +
279  factorMultiplication +
280  ">> bkg" +
281  category +
282  str(
285  " < 1")
286 
287  signalScalingFactor = signalHistogram.Integral()
288  backgroundScalingFactor = backgroundHistogram.Integral()
289 
290  if signalScalingFactor == 0:
291  signalScalingFactor = 1
292 
293  if backgroundScalingFactor == 0:
294  backgroundScalingFactor = 1
295 
296  signalHistogram.Scale(1 / signalScalingFactor)
297  backgroundHistogram.Scale(1 / backgroundScalingFactor)
298 
299  signalArray = np.zeros((signalHistogram.GetNbinsX(), 2))
300  backgroundArray = np.zeros((backgroundHistogram.GetNbinsX(), 2))
301 
302  for i in range(0, signalHistogram.GetNbinsX()):
303  signalArray[i] = np.array([signalHistogram.GetBinCenter(i + 1), signalHistogram.GetBinContent(i + 1)])
304  backgroundArray[i] = np.array([backgroundHistogram.GetBinCenter(i + 1), backgroundHistogram.GetBinContent(i + 1)])
305 
306  fig1 = plt.figure(1, figsize=(11, 10))
307 
308  # if inputVariable == 'Kid_dEdx' or inputVariable == 'muid_dEdx':
309  # ax1 = plt.axes([0.18, 0.17, 0.75, 0.8])
310  # if inputVariable == 'pi_vs_edEdxid':
311  # ax1 = plt.axes([0.18, 0.187, 0.75, 0.805])
312  # else:
313  ax1 = plt.axes([0.18, 0.2, 0.76, 0.705])
314 
315  # print(signalArray.shape, signalHistogram.GetNbinsX(), )
316  # print(signalArray)
317  ax1.hist(
318  signalArray[:, 0], weights=signalArray[:, 1], bins=signalHistogram.GetNbinsX(),
319  histtype='step',
320  edgecolor='r',
321  linewidth=4,
322  alpha=0.9,
323  label=r'${\rm Signal}$')
324 
325  ax1.hist(backgroundArray[:, 0], weights=backgroundArray[:, 1], bins=backgroundHistogram.GetNbinsX(),
326  histtype='step',
327  edgecolor='b', linewidth=4.5, linestyle='dashed', label=r'${\rm Background}$') # hatch='.',
328 
329  p1, = ax1.plot([], label=r'${\rm Signal}$', linewidth=5, linestyle='solid', alpha=0.9, c='r')
330  p2, = ax1.plot([], label=r'${\rm Background}$', linewidth=5.5, linestyle='dashed', c='b')
331 
332  binWidth = signalHistogram.GetBinWidth(2)
333 
334  if inputVariable == 'lambdaZError': # or inputVariable == 'ImpactXY' or\
335  # (category != "Lambda" and inputVariable == 'distance'):
336  binWidth = binWidth * 10
337 
338  if inputVariable == 'M':
339  binWidth = binWidth * 1000
340 
341  if category == "Lambda" and inputVariable == 'distance':
342  variablesPlotParamsDict[inputVariable][5] = r"{\rm cm}\, "
343 
344  binWidth = '{:8.2f}'.format(binWidth)
345 
346  xLabel = variablesPlotParamsDict[inputVariable][4]
347  legendLocation = 1
348 
349  if category == "FSC":
350  if inputVariable == 'cosTPTO':
351  xLabel = r'$\vert\cos{\theta^*_{\rm T, Slow}}\vert$'
352  if inputVariable == 'useCMSFrame(p)':
353  xLabel = r'$p^*_{\rm Slow}\ [{\rm GeV}/c]$'
354  if category == 'Lambda':
355  if inputVariable == 'useCMSFrame(p)':
356  xLabel = r'$p^*_{\Lambda}\ [{\rm GeV}/c]$'
357  if inputVariable == 'p':
358  xLabel = r'$p_{\Lambda}\ [{\rm GeV}/c]$'
359 
360  ax1.set_ylabel(r'${\rm Fraction\hspace{0.25em} of\hspace{0.25em} Events}\, /\, (\, ' + binWidth + r'\, ' +
361  variablesPlotParamsDict[inputVariable][5] + r')$', fontsize=46)
362  ax1.set_xlabel(xLabel, fontsize=65)
363  # plt.xticks([-1, -0.75, -0.5, -0.25, 0, 0.25, 0.5, 0.75, 1],
364  # [r'$-1$', r'', r'$-0.5$', r'', r'$0$', r'', r'$0.5$', r'', r'$1$'], rotation=0, size=40)
365  if inputVariable == 'extraInfo(isRightCategory(Kaon))' or \
366  inputVariable == 'HighestProbInCat(pi+:inRoe, isRightCategory(SlowPion))':
367  legendLocation = 3
368  ax1.set_yscale('log', nonposy='clip')
369  else:
370  ax1.yaxis.set_major_formatter(FormatStrFormatter(r'$%.2f$'))
371 
372  ax1.tick_params(axis='x', labelsize=50)
373  ax1.tick_params(axis='y', labelsize=40)
374 
375  if inputVariable == 'pi_vs_edEdxid':
376  ax1.xaxis.labelpad = 5
377  else:
378  ax1.xaxis.labelpad = 15
379 
380  if inputVariable.find('ARICH') != -1 or inputVariable.find('TOP') != -1 or \
381  inputVariable == 'cosTPTO' or inputVariable.find('KLM') != -1 or \
382  inputVariable == 'cosTheta' or inputVariable == 'FSCVariables(cosTPTOFast)' or \
383  inputVariable == 'KaonPionVariables(cosKaonPion)' or \
384  inputVariable == 'BtagToWBosonVariables(recoilMass)':
385  legendLocation = 2
386 
387  elif inputVariable == 'FSCVariables(SlowFastHaveOpositeCharges)' or \
388  inputVariable == 'KaonPionVariables(HaveOpositeCharges)' or inputVariable == "eid_ECL" or \
389  inputVariable.find('ID') != -1 or inputVariable.find('dEdx') != -1:
390  legendLocation = 9
391 
392  if inputVariable == 'muid_dEdx':
393  if category != 'KinLepton':
394  legendLocation = 8
395 
396  ax1.legend([p1, p2], [r'${\rm Signal}$', r'${\rm Bkgr.}$'], prop={
397  'size': 50}, loc=legendLocation, numpoints=1, handlelength=1)
398  ax1.grid(True)
399  # ax1.set_ylim(0, 1.4)
400  ax1.set_xlim(limXmin, limXmax)
401  plt.savefig('./InputVariablesPlots/' + category + '/' + category +
402  "_" + str(Belle2.MakeROOTCompatible.makeROOTCompatible(inputVariable)) + '.pdf')
403  fig1.clear()
404 
405  signalHistogram.Delete()
406  backgroundHistogram.Delete()
407 
408 
409 if __name__ == '__main__':
410 
411  plotInputVariablesOfFlavorTagger()
412 
413  totalNumberOfVariables = 0
414 
415  for category in ft.AvailableCategories:
416  totalNumberOfVariables += len(ft.getTrainingVariables(category))
417 
418  print("Total number of variables = ", totalNumberOfVariables)
419 
420  totalNumberOfCalculatedVariables = len(identifiersExtraInfosKaonPion)
421 
422  print("Calculations for Kaon-Pion Category = ", totalNumberOfCalculatedVariables)
423 
424  print("Variables per particle list:")
425  for particleList in identifiersExtraInfosDict:
426  print(particleList)
427  print(identifiersExtraInfosDict[particleList])
428  totalNumberOfCalculatedVariables += len(identifiersExtraInfosDict[particleList])
429 
430  print("Total number of calculated variables = ", totalNumberOfCalculatedVariables)
static std::string makeROOTCompatible(std::string str)
Remove special characters that ROOT dislikes in branch names, e.g.
static std::string invertMakeROOTCompatible(std::string str)
Invert makeROOTCompatible operation.