10def DRAW_ZmumuKernelCfg(flags, name="DRAW_ZMUMUKernel", **kwargs):
11
12 result = ComponentAccumulator()
13 result.addSequence(seqAND("DRAWZMUMU_Sequence"))
14
15 massEntryName = "DRZmumuMass"
16
17 sel_muon1 = 'Muons.pt > 25*GeV && Muons.ptcone40/Muons.pt < 0.3'
18 sel_muon2 = 'Muons.pt > 20*GeV && Muons.ptcone40/Muons.pt < 0.3'
19
20 mass_tool = result.getPrimaryAndMerge(InvariantMassToolCfg(flags,
21 name="DRZmumuMassTool",
22 ContainerName="Muons",
23 ObjectRequirements=sel_muon1,
24 SecondObjectRequirements=sel_muon2,
25 MassHypothesis=105.66,
26 SecondMassHypothesis=105.66,
27 StoreGateEntryName=massEntryName,
28 InputDecorNames=["Muons.ptcone40"]))
29
30 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import AsgSelectionToolWrapperCfg
31 from MuonSelectorTools.MuonSelectorToolsConfig import MuonSelectionToolCfg
32 muon_sel_tool = result.popToolsAndMerge(MuonSelectionToolCfg(flags, name="DRAW_ZMUMU_MuonsSelector",
33 MaxEta=3, MuQuality=2
34 ))
35 result.addPublicTool(muon_sel_tool)
36 muonSkimmingTool = result.getPrimaryAndMerge(AsgSelectionToolWrapperCfg(flags,
37 name="DRAW_ZMUMU_GoodMuon_SkimmingTool",
38 ContainerName="Muons",
39 StoreGateEntryName="isMedium_DRAWZmumu",
40 AsgSelectionTool=muon_sel_tool))
41
42 dimuonMassString = "( count ( {mass} > 70*GeV && {mass} < 110*GeV ) >= 1 )".format(
43 mass=massEntryName)
44
45 muonSkimmingString = "( count (Muons.pt > 20*GeV && Muons.isMedium_DRAWZmumu == 1) >= 1)"
46 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import xAODStringSkimmingToolCfg
47 dimuonMassSkimmingTool = result.getPrimaryAndMerge(xAODStringSkimmingToolCfg(flags,
48 name="DRAW_ZMUMU_DiMuonMass_SkimmingTool",
49 expression="{mass} && {muon} ".format(mass=dimuonMassString,
50 muon=muonSkimmingString)))
51
52
53 from TriggerMenuMT.TriggerAPI.TriggerAPI import TriggerAPI
54 from TriggerMenuMT.TriggerAPI.TriggerEnums import TriggerPeriod, TriggerType
55 periods = TriggerPeriod.y2015 | TriggerPeriod.y2016 | TriggerPeriod.y2017 | TriggerPeriod.y2018 | TriggerPeriod.future
56 TriggerAPI.setConfigFlags(flags)
57 allUnprescaledTriggers = TriggerAPI.getLowestUnprescaledAnyPeriod(
58 periods, TriggerType.mu) + ["HLT_noalg_L1MU14FCH", "L1_MU14FCH"]
59 print(
"DRAW_ZMUMU: will skim on an OR of the following muon triggers (list provided at run-time by the TriggerAPI):")
60 for trig in allUnprescaledTriggers:
61 print(
" **** {trig}".format(trig=trig))
62
63 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import TriggerSkimmingToolCfg
64 triggerSkimmingTool = result.getPrimaryAndMerge(TriggerSkimmingToolCfg(flags,
65 name="DRAWZMUMUTriggerSkimmingTool",
66 TriggerListOR=allUnprescaledTriggers))
67
68
69 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import FilterCombinationANDCfg
70 DRAW_ZMUMU_SkimmingTool = result.getPrimaryAndMerge(FilterCombinationANDCfg(flags,
71 name="DRAW_ZMUMU_FinalFilter",
72 FilterList=[dimuonMassSkimmingTool,
73 triggerSkimmingTool]))
74
75 kwargs.setdefault("AugmentationTools", [muonSkimmingTool, mass_tool])
76 kwargs.setdefault("SkimmingTools", [DRAW_ZMUMU_SkimmingTool])
77 kwargs.setdefault("doChronoStat", flags.Concurrency.NumThreads <= 1)
78 the_alg = CompFactory.DerivationFramework.DerivationKernel(name, **kwargs)
79 result.addEventAlgo(the_alg, primary=True)
80 return result
81
82
void print(char *figname, TCanvas *c1)