Belle II Software  light-2403-persian
create_training_files.py
1 #!/usr/bin/env python
2 
3 
10 
11 
12 from pathlib import Path
13 import argparse
14 
15 import basf2 as b2
16 import modularAnalysis as ma
17 
18 from ROOT import Belle2
19 
20 import stdPhotons
21 from variables import variables as vm
22 
23 from grafei import lcaSaver
24 
25 
26 def _get_args():
27  parser = argparse.ArgumentParser(
28  formatter_class=argparse.ArgumentDefaultsHelpFormatter,
29  description='Reconstruct most likely particles and save their features and LCA matrix'
30  )
31  parser.add_argument('-t', '--type', choices=['B0', 'B+', 'Ups'], required=True,
32  help='Training target', metavar='type',
33  dest='type')
34  return parser.parse_args()
35 
36 
37 if __name__ == '__main__':
38  b2.conditions.prepend_globaltag(ma.getAnalysisGlobaltag())
39 
40  args = _get_args()
41 
42  input_file = Path(Belle2.Environment.Instance().getInputFilesOverride()[0])
43 
44  path = b2.create_path()
45  ma.inputMdst(str(input_file), path=path)
46 
47  mc_particle_name = {
48  "B0": "B0:MC",
49  "B+": "B+:MC",
50  "Ups": "Upsilon(4S)"
51  }
52 
53  # ###### BUILD MC B/Ups FOR LCA/TAGGING ######
54  ma.fillParticleListFromMC(mc_particle_name[args.type], '', path=path)
55 
56  # These priors were obtained by counting truth-matched tracks in BB mixed MC
57  # It could be modified by the user if needed
58  priors = [0.068, 0.050, 0.7326, 0.1315, 0.0183, 0.00006]
59 
60  charged_cuts = [f"pidIsMostLikely({','.join(str(p) for p in priors)})>0", 'nCDCHits>20',
61  'thetaInCDCAcceptance', 'abs(dz)<1.0',
62  'dr<0.5', 'p<5', 'pt>0.2']
63 
64  photon_cuts = ['beamBackgroundSuppression>0.4', 'fakePhotonSuppression>0.3',
65  'abs(clusterTiming)<100', 'abs(formula(clusterTiming/clusterErrorTiming))<2.0',
66  '[[clusterReg==1 and E>0.09] or [clusterReg==2 and E>0.09] or [clusterReg==3 and E>0.14]]']
67 
68  charged_lists = [f'{c}:final' for c in ['p+', 'e+', 'pi+', 'mu+', 'K+']]
69 
70  ma.fillParticleLists(
71  [(c, ' and '.join(charged_cuts)) for c in charged_lists],
72  writeOut=True,
73  path=path,
74  )
75 
77  listtype='tight',
78  path=path,
79  )
80  ma.getBeamBackgroundProbability("gamma:all", "MC15ri", path=path)
81  ma.getFakePhotonProbability("gamma:all", "MC15ri", path=path)
82  ma.cutAndCopyList(
83  'gamma:final',
84  'gamma:tight',
85  ' and '.join(photon_cuts),
86  writeOut=True,
87  path=path,
88  )
89 
90  # Add requirements on total number of photons and charged in event
91  vm.addAlias('n_gamma_in_evt', 'nParticlesInList(gamma:final)')
92  vm.addAlias('n_p_in_evt', 'nParticlesInList(p+:final)')
93  vm.addAlias('n_e_in_evt', 'nParticlesInList(e+:final)')
94  vm.addAlias('n_mu_in_evt', 'nParticlesInList(mu+:final)')
95  vm.addAlias('n_pi_in_evt', 'nParticlesInList(pi+:final)')
96  vm.addAlias('n_K_in_evt', 'nParticlesInList(K+:final)')
97  vm.addAlias('n_charged_in_evt', 'formula(n_p_in_evt+n_e_in_evt+n_mu_in_evt+n_pi_in_evt+n_K_in_evt)')
98 
99  ma.applyEventCuts('n_gamma_in_evt<20 and n_charged_in_evt<20', path=path)
100 
101  # Set up variables to save to NTuple
102  save_vars = [
103  # Charged variables
104  'electronID_noSVD_noTOP',
105  'kaonID_noSVD',
106  'protonID_noSVD',
107  'muonID_noSVD',
108  'pionID_noSVD',
109  'p',
110  'pt',
111  'px',
112  'py',
113  'pz',
114  'dr',
115  'dz',
116  'x',
117  'y',
118  'z',
119  'charge',
120  # Neutral variables
121  'clusterNHits',
122  'clusterTiming',
123  'clusterE9E25',
124  ]
125 
126  # Set up particle lists we'll work with
127  p_lists = charged_lists + ['gamma:final']
128  p_names = [x.split(':')[0] for x in p_lists]
129 
130  # ##### TAG AND SAVE #######
131 
132  # Flag each particle according to the B meson and decay it came from
133  for i, p_list in enumerate(p_lists):
134  # Match MC particles for all lists
135  ma.matchMCTruth(p_list, path=path)
136 
137  lcaSaver(
138  particle_lists=p_lists,
139  features=save_vars,
140  mcparticle_list=mc_particle_name[args.type],
141  output_file=f'graFEI_train_{input_file.stem}.root',
142  path=path,
143  )
144 
145  # Actually run everything
146  b2.process(path)
147  print(b2.statistics)
static Environment & Instance()
Static method to get a reference to the Environment instance.
Definition: Environment.cc:28
def stdPhotons(listtype='loose', path=None, beamBackgroundMVAWeight="", fakePhotonMVAWeight="", biasCorrectionTable="")
Definition: stdPhotons.py:19