13 import modularAnalysis
as ma
14 from variables
import variables
as vm
15 from stdCharged
import stdK, stdPi
18 from ROOT
import PyConfig
19 PyConfig.IgnoreCommandLineOptions =
True
24 from grafei
import graFEI
27 b2.set_random_seed(42)
32 parser = argparse.ArgumentParser()
34 "-c",
"--config", type=str, default=
None, help=
"graFEI config file"
37 "-w",
"--weight", type=str, default=
None, help=
"graFEI weight file"
43 default=
"analysis_tools_light-2403-persian",
44 help=
"Globaltag containing graFEI model",
46 return parser.parse_args()
49 if __name__ ==
"__main__":
54 path = b2.create_path()
55 ma.inputMdst(filename=b2.find_file(
'mdst14.root',
'validation',
False), path=path)
57 b2.conditions.prepend_globaltag(ma.getAnalysisGlobaltag())
59 b2.conditions.prepend_globaltag(args.globaltag)
63 priors = [0.068, 0.050, 0.7326, 0.1315, 0.0183, 0.00006]
65 cut_charged_graFEI = [
66 f
"pidIsMostLikely({','.join(str(p) for p in priors)})>0",
68 "thetaInCDCAcceptance",
74 cut_photons_graFEI = [
75 "beamBackgroundSuppression>0.4",
76 "fakePhotonSuppression>0.3",
77 "abs(clusterTiming)<100",
78 "abs(formula(clusterTiming/clusterErrorTiming))<2.0",
79 "[[clusterReg==1 and E>0.09] or [clusterReg==2 and E>0.09] or [clusterReg==3 and E>0.14]]",
81 cut_KL0_graFEI =
"PDG==0"
84 cut_photons_graFEI += [
86 "[clusterErrorTiming < 1e6 and [clusterE1E9 > 0.4 or E > 0.075]]",
90 ranking_variable =
"abs(cosThetaBetweenParticleAndNominalB)"
93 cut_charged_graFEI =
" and ".join(cut_charged_graFEI)
94 cut_photons_graFEI =
" and ".join(cut_photons_graFEI)
102 ma.getBeamBackgroundProbability(
"gamma:all",
"MC15ri", path=path)
103 ma.getFakePhotonProbability(
"gamma:all",
"MC15ri", path=path)
107 stdK(
"loose", path=path)
108 stdPi(
"loose", path=path)
111 "D-:Kpipi -> K+:loose pi-:loose pi-:loose",
"1.85 < M < 1.88", path=path
115 "abs(dz)<2 and dr<0.5 and nCDCHits>20 and thetaInCDCAcceptance and pt>0.6 and E<5.5 and muonID_noSVD>0.9",
119 "B0:sig -> D-:Kpipi mu+:tight",
120 "abs(cosThetaBetweenParticleAndNominalB)<2",
125 ma.buildRestOfEvent(
"B0:sig", path=path)
130 f
"pidIsMostLikely({','.join(str(p) for p in priors)})>0 and nCDCHits>0 and thetaInCDCAcceptance and abs(dz)<4 and dr<2",
131 "inCDCAcceptance and clusterErrorTiming<1e6 and [clusterE1E9>0.4 or E>0.075] and [[clusterReg == 1 and E > 0.05]"
132 " or [clusterReg == 2 and E > 0.05] or [clusterReg == 3 and E > 0.075]]",
138 "nCDCHits > 0 and useCMSFrame(p)<=3.2",
139 "p >= 0.05 and useCMSFrame(p)<=3.2",
142 ma.appendROEMasks(list_name=
"B0:sig", mask_tuples=[csMask, basicMask], path=path)
144 ma.buildContinuumSuppression(list_name=
"B0:sig", roe_mask=
"csMask", path=path)
146 ma.applyCuts(
"B0:sig",
"cosTBz<0.9", path=path)
149 skimfilter = b2.register_module(
"SkimFilter")
150 skimfilter.param(
"particleLists", [
"B0:sig"])
151 empty_path = b2.create_path()
152 skimfilter.if_value(
"=0", empty_path, b2.AfterConditionPath.END)
153 path.add_module(skimfilter)
156 ma.matchMCTruth(
"B0:sig", path=path)
161 variable=ranking_variable,
162 outputVariable=
"Rank",
169 ma.fillParticleListFromROE(
172 maskName=
"basicMask",
173 sourceParticleListName=
"B0:sig",
177 ma.matchMCTruth(
"B0:forTM", path=path)
179 ma.variablesToEventExtraInfo(
"B0:forTM", {
"mcPDG":
"Bsig_ROE_mcPDG"}, path=path)
185 ma.fillParticleListFromMC(
"B0:MC",
"", path=path)
194 ma.appendROEMasks(
"B0:sig", [graFEI_roe_mask], path=path)
197 ma.fillParticleListFromROE(
200 maskName=
"graFEIROE",
201 sourceParticleListName=
"B0:sig",
207 ma.matchMCTruth(
"B0:tag", path=path)
212 cfg_path=args.config,
213 param_file=args.weight,
214 payload_config_name=
"graFEIConfigFile_Breco_example",
215 payload_model_name=
"graFEIModelFile_Breco_example",
220 ma.reconstructDecay(
"Upsilon(4S):graFEI -> B0:tag B0:sig",
"", path=path)
238 "cosThetaBetweenParticleAndNominalB",
244 "isSignalAcceptMissingNeutrino",
253 "graFEI_probEdgeProd",
254 "graFEI_probEdgeMean",
255 "graFEI_probEdgeGeom",
259 "graFEI_nCharged_preFit",
260 "graFEI_nElectrons_preFit",
261 "graFEI_nMuons_preFit",
262 "graFEI_nPions_preFit",
263 "graFEI_nKaons_preFit",
264 "graFEI_nProtons_preFit",
265 "graFEI_nLeptons_preFit",
266 "graFEI_nPhotons_preFit",
267 "graFEI_nOthers_preFit",
268 "graFEI_nCharged_postFit",
269 "graFEI_nElectrons_postFit",
270 "graFEI_nMuons_postFit",
271 "graFEI_nPions_postFit",
272 "graFEI_nKaons_postFit",
273 "graFEI_nProtons_postFit",
274 "graFEI_nLeptons_postFit",
275 "graFEI_nPhotons_postFit",
276 "graFEI_nOthers_postFit",
277 "graFEI_nPredictedUnmatched",
278 "graFEI_nPredictedUnmatched_noPhotons",
283 "graFEI_truth_perfectLCA",
284 "graFEI_truth_perfectMasses",
285 "graFEI_truth_perfectEvent",
286 "graFEI_truth_isSemileptonic",
288 "graFEI_truth_nPhotons",
289 "graFEI_truth_nElectrons",
290 "graFEI_truth_nMuons",
291 "graFEI_truth_nPions",
292 "graFEI_truth_nKaons",
293 "graFEI_truth_nProtons",
294 "graFEI_truth_nOthers",
299 vm.addAlias(
"Bsig_Rank",
"daughter(1, extraInfo(Rank))")
301 for var
in default_vars:
302 vm.addAlias(f
"Btag_{var}", f
"daughter(0, {var})")
303 vm.addAlias(f
"Bsig_{var}", f
"daughter(1, {var})")
304 for var
in graFEI_vars:
305 vm.addAlias(f
"Btag_{var}", f
"daughter(0, extraInfo({var}))")
307 graFEI_vars = [f
"Btag_{var}" for var
in graFEI_vars + default_vars] + \
308 [
"Btag_Mbc",
"Bsig_Rank"] + [f
"Bsig_{var}" for var
in default_vars]
310 vm.addAlias(
"Bsig_D_M",
"daughter(1, daughter(0, M))")
311 vm.addAlias(
"Bsig_D_E",
"daughter(1, daughter(0, E))")
312 vm.addAlias(
"Bsig_D_pt",
"daughter(1, daughter(0, pt))")
313 vm.addAlias(
"Bsig_D_p",
"daughter(1, daughter(0, p))")
315 graFEI_vars.extend([
"Bsig_D_M",
"Bsig_D_E",
"Bsig_D_pt",
"Bsig_D_p"])
317 ma.variablesToNtuple(
318 "Upsilon(4S):graFEI",
320 filename=
"graFEI_BReco_example.root",