24 import modularAnalysis
as ma
25 from vertex
import TagV
31 basf2.set_log_level(basf2.LogLevel.ERROR)
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>")
37 step = str(sys.argv[1])
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')
43 np.random.shuffle(signal_inputfiles)
44 np.random.shuffle(qqbar_inputfiles)
47 input = signal_inputfiles
49 input = qqbar_inputfiles
51 sys.exit(
'Step does not match any of the available samples: `signal` or `qqbar`')
53 outfile =
'MVAExpert_fullNTuple_' + step +
'.root'
56 main = basf2.create_path()
59 ma.inputMdstList(
'default', input, path=main)
61 main.add_module(
'ProgressBar')
64 ma.fillParticleList(
'gamma',
'goodGamma == 1', path=main)
66 ma.fillParticleList(
'pi+:good',
'chiProb > 0.001 and pionID > 0.5', path=main)
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)
72 ma.matchMCTruth(
'B0', path=main)
73 ma.buildRestOfEvent(
'B0', path=main)
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)
78 ma.buildContinuumSuppression(
'B0',
'cleanMask', path=main)
81 ma.applyCuts(
'B0',
'isSignal or isContinuumEvent', path=main)
87 roe_path = basf2.create_path()
89 deadEndPath = basf2.create_path()
91 ma.signalSideParticleFilter(
'B0',
'', roe_path, deadEndPath)
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)
101 v.variables.addAlias(
'cmsp',
'useCMSFrame(p)')
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)
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)',
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']
150 for variablename
in basic_variables + vertex_variables:
151 v.variables.addAlias(
'thrustsig' + variablename,
'useBThrustFrame(' + variablename +
',Signal)')
153 cluster_variables = cluster_specific_variables[:]
154 for variablename
in basic_variables:
155 cluster_variables.append(
'thrustsig' + variablename)
157 track_variables = track_specific_variables
158 for variablename
in basic_variables + vertex_variables:
159 track_variables.append(
'thrustsig' + variablename)
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(
168 variable, shortcut, rank),
'getVariableByRank({}, cmsp, {}, {})'.format(
169 particlelist, variable, rank + 1))
170 variables.append(
'{}_{}{}'.format(variable, shortcut, rank))
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(
178 variable, shortcut, rank),
'getVariableByRank({}, cmsp, {}, {})'.format(
179 particlelist, variable, rank + 1))
180 variables.append(
'{}_{}{}'.format(variable, shortcut, rank))
184 path =
'/gpfs/fs02/belle2/users/pablog/inputForDNNContinuumSuppression/'
186 roe_path.add_module(
'MVAExpert', listNames=[
'B0'], extraInfoName=
'Deep_CS', identifier=path +
'Deep_Feed_Forward.xml')
189 expertVars = [
'extraInfo(Deep_CS)',
'transformedNetworkOutput(Deep_CS,0.1,1.0)']
192 ma.variablesToNtuple(
'B0', variables + expertVars, treename=
'tree', filename=outfile, path=roe_path)
194 main.for_each(
'RestOfEvent',
'RestOfEvents', roe_path)
197 print(basf2.statistics)