Belle II Software  release-05-01-25
B2A713-DeepContinuumSuppression_MVAExpert.py
1 #!/usr/bin/env python3
2 
3 
22 
23 import basf2
24 import modularAnalysis as ma
25 from vertex import TagV
26 import variables as v
27 import glob
28 import sys
29 import numpy as np
30 
31 basf2.set_log_level(basf2.LogLevel.ERROR)
32 
33 # --I/O----------------------------------------------------------------------------------------
34 if (len(sys.argv) < 2 or sys.argv[1] not in ['signal', 'qqbar']):
35  sys.exit("usage:\n\tbasf2 B2A703-ContinuumSuppression_MVAExpert.py <signal,qqbar>")
36 
37 step = str(sys.argv[1])
38 
39 path = '/group/belle2/tutorial/release_01-00-00/DCS_Bd_KsPi0'
40 signal_inputfiles = glob.glob(path + '/*/*/*1.root.mdst')
41 qqbar_inputfiles = glob.glob(path + '/*/*/*7.root.mdst')
42 
43 np.random.shuffle(signal_inputfiles)
44 np.random.shuffle(qqbar_inputfiles)
45 
46 if step == 'signal':
47  input = signal_inputfiles
48 elif step == 'qqbar':
49  input = qqbar_inputfiles
50 else:
51  sys.exit('Step does not match any of the available samples: `signal` or `qqbar`')
52 
53 outfile = 'MVAExpert_fullNTuple_' + step + '.root'
54 # ---------------------------------------------------------------------------------------------
55 
56 main = basf2.create_path()
57 
58 # Perform analysis.
59 ma.inputMdstList('default', input, path=main)
60 
61 main.add_module('ProgressBar')
62 
63 # Build B candidate like in B2A701-ContinuumSuppression_Input.py
64 ma.fillParticleList('gamma', 'goodGamma == 1', path=main)
65 
66 ma.fillParticleList('pi+:good', 'chiProb > 0.001 and pionID > 0.5', path=main)
67 
68 ma.reconstructDecay('K_S0 -> pi+:good pi-:good', '0.480<=M<=0.516', path=main)
69 ma.reconstructDecay('pi0 -> gamma gamma', '0.115<=M<=0.152', path=main)
70 ma.reconstructDecay('B0 -> K_S0 pi0', '5.2 < Mbc < 5.3 and -0.3 < deltaE < 0.2', path=main)
71 
72 ma.matchMCTruth('B0', path=main)
73 ma.buildRestOfEvent('B0', path=main)
74 
75 cleanMask = ('cleanMask', 'nCDCHits > 0 and useCMSFrame(p)<=3.2', 'p >= 0.05 and useCMSFrame(p)<=3.2')
76 ma.appendROEMasks('B0', [cleanMask], path=main)
77 
78 ma.buildContinuumSuppression('B0', 'cleanMask', path=main)
79 
80 # Accept only correctly reconstructed B candidates as signal
81 ma.applyCuts('B0', 'isSignal or isContinuumEvent', path=main)
82 
83 # Tag B candidate for Vertex information
84 TagV('B0', path=main)
85 
86 # Loop over each possible ROE (1 for every B candidate) in every event
87 roe_path = basf2.create_path()
88 
89 deadEndPath = basf2.create_path()
90 
91 ma.signalSideParticleFilter('B0', '', roe_path, deadEndPath)
92 
93 # Build particle lists for low level variables
94 ma.fillParticleList('gamma:roe', 'isInRestOfEvent == 1 and goodGamma == 1', path=roe_path)
95 ma.fillParticleList('gamma:signal', 'isInRestOfEvent == 0 and goodGamma == 1', path=roe_path)
96 ma.fillParticleList('pi+:chargedProe', 'isInRestOfEvent == 1', path=roe_path)
97 ma.fillParticleList('pi+:chargedPsignal', 'isInRestOfEvent == 0', path=roe_path)
98 ma.fillParticleList('pi-:chargedMroe', 'isInRestOfEvent == 1', path=roe_path)
99 ma.fillParticleList('pi-:chargedMsignal', 'isInRestOfEvent == 0', path=roe_path)
100 
101 v.variables.addAlias('cmsp', 'useCMSFrame(p)')
102 
103 ma.rankByHighest('gamma:roe', 'cmsp', path=roe_path)
104 ma.rankByHighest('gamma:signal', 'cmsp', path=roe_path)
105 ma.rankByHighest('pi+:chargedProe', 'cmsp', path=roe_path)
106 ma.rankByHighest('pi+:chargedPsignal', 'cmsp', path=roe_path)
107 ma.rankByHighest('pi-:chargedMroe', 'cmsp', path=roe_path)
108 ma.rankByHighest('pi-:chargedMsignal', 'cmsp', path=roe_path)
109 
110 # Define traditional Continuum Suppression Variables
111 contVars = [
112  'R2',
113  'thrustBm',
114  'thrustOm',
115  'cosTBTO',
116  'cosTBz',
117  'KSFWVariables(et)',
118  'KSFWVariables(mm2)',
119  'KSFWVariables(hso00)',
120  'KSFWVariables(hso02)',
121  'KSFWVariables(hso04)',
122  'KSFWVariables(hso10)',
123  'KSFWVariables(hso12)',
124  'KSFWVariables(hso14)',
125  'KSFWVariables(hso20)',
126  'KSFWVariables(hso22)',
127  'KSFWVariables(hso24)',
128  'KSFWVariables(hoo0)',
129  'KSFWVariables(hoo1)',
130  'KSFWVariables(hoo2)',
131  'KSFWVariables(hoo3)',
132  'KSFWVariables(hoo4)',
133  'CleoCone(1)',
134  'CleoCone(2)',
135  'CleoCone(3)',
136  'CleoCone(4)',
137  'CleoCone(5)',
138  'CleoCone(6)',
139  'CleoCone(7)',
140  'CleoCone(8)',
141  'CleoCone(9)'
142 ]
143 
144 # Define additional low level variables
145 basic_variables = ['p', 'phi', 'cosTheta', 'pErr', 'phiErr', 'cosThetaErr']
146 vertex_variables = ['distance', 'dphi', 'dcosTheta']
147 cluster_specific_variables = ['clusterNHits', 'clusterTiming', 'clusterE9E25', 'clusterReg', 'isInRestOfEvent']
148 track_specific_variables = ['kaonID', 'electronID', 'muonID', 'protonID', 'pValue', 'nCDCHits', 'isInRestOfEvent', 'charge']
149 
150 for variablename in basic_variables + vertex_variables:
151  v.variables.addAlias('thrustsig' + variablename, 'useBThrustFrame(' + variablename + ',Signal)')
152 
153 cluster_variables = cluster_specific_variables[:]
154 for variablename in basic_variables:
155  cluster_variables.append('thrustsig' + variablename)
156 
157 track_variables = track_specific_variables
158 for variablename in basic_variables + vertex_variables:
159  track_variables.append('thrustsig' + variablename)
160 
161 variables = ['isContinuumEvent', 'isNotContinuumEvent', 'isSignal', 'M', 'p', 'Mbc', 'DeltaZ',
162  'deltaE', 'daughter(0, M)', 'daughter(0, p)', 'daughter(1, M)', 'daughter(1, p)']
163 for rank in range(10):
164  for shortcut, particlelist in [('Croe', 'gamma:roe'), ('Csig', 'gamma:signal')]:
165  for variable in cluster_variables:
166  v.variables.addAlias(
167  '{}_{}{}'.format(
168  variable, shortcut, rank), 'getVariableByRank({}, cmsp, {}, {})'.format(
169  particlelist, variable, rank + 1))
170  variables.append('{}_{}{}'.format(variable, shortcut, rank))
171 
172 for rank in range(5):
173  for shortcut, particlelist in [('TProe', 'pi+:chargedProe'), ('TPsig', 'pi+:chargedPsignal'),
174  ('TMroe', 'pi+:chargedMroe'), ('TMsig', 'pi+:chargedMsignal')]:
175  for variable in track_variables:
176  v.variables.addAlias(
177  '{}_{}{}'.format(
178  variable, shortcut, rank), 'getVariableByRank({}, cmsp, {}, {})'.format(
179  particlelist, variable, rank + 1))
180  variables.append('{}_{}{}'.format(variable, shortcut, rank))
181 
182 # MVAExpert
183 # In this path there are already several trained weightfiles. Look at README for a short explanation
184 path = '/gpfs/fs02/belle2/users/pablog/inputForDNNContinuumSuppression/'
185 
186 roe_path.add_module('MVAExpert', listNames=['B0'], extraInfoName='Deep_CS', identifier=path + 'Deep_Feed_Forward.xml')
187 
188 # Variables from MVAExpert.
189 expertVars = ['extraInfo(Deep_CS)', 'transformedNetworkOutput(Deep_CS,0.1,1.0)']
190 
191 # Create output file with all sets of variables.
192 ma.variablesToNtuple('B0', variables + expertVars, treename='tree', filename=outfile, path=roe_path)
193 
194 main.for_each('RestOfEvent', 'RestOfEvents', roe_path)
195 
196 basf2.process(main)
197 print(basf2.statistics)
basf2.process
def process(path, max_event=0)
Definition: __init__.py:25