ATLAS Offline Software
Loading...
Searching...
No Matches
RatesEmulationExample.py
Go to the documentation of this file.
1#!/usr/bin/env python
2#
3# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4#
5
6# For processing JZ slices
8 channel_to_string = {
9 801165: "_JZ0",
10 801166: "_JZ1",
11 801167: "_JZ2",
12 801168: "_JZ3",
13 801169: "_JZ4",
14 801170: "_JZ5",
15 801171: "_JZ6",
16 801172: "_JZ7",
17 801173: "_JZ8",
18 801174: "_JZ9"
19 }
20 try:
21 return channel_to_string[dsid]
22 except KeyError:
23 return ""
24
25if __name__=='__main__':
26 import sys
27
28 # Initialise Athena config flags to get and customise the argument parser
29 from AthenaConfiguration.AllConfigFlags import initConfigFlags
30 flags = initConfigFlags()
31 parser = flags.getArgumentParser()
32 #
33 parser.add_argument('--disableGlobalGroups', action='store_true', help='Turn off global groups')
34 parser.add_argument('--disableTriggerGroups', action='store_true', help='Turn off per-trigger groups')
35 parser.add_argument('--disableExpressGroup', action='store_true', help='Turn off express stream rates')
36 parser.add_argument('--disableUniqueRates', action='store_true', help='Turn off unique rates (much faster!)')
37 parser.add_argument('--disableLumiExtrapolation', action='store_true', help='Turn off luminosity extrapolation')
38 #
39 parser.add_argument('--MCDatasetName', default='', type=str, help='For MC input: Name of the dataset, can be used instead of MCCrossSection, MCFilterEfficiency')
40 parser.add_argument('--MCCrossSection', default=0.0, type=float, help='For MC input: Cross section of process in nb')
41 parser.add_argument('--MCFilterEfficiency', default=1.0, type=float, help='For MC input: Filter efficiency of any MC filter (0.0 - 1.0)')
42 parser.add_argument('--MCKFactor', default=1.0, type=float, help='For MC input: Additional multiplicitive fudge-factor to the supplied cross section.')
43 parser.add_argument('--MCIgnoreGeneratorWeights', action='store_true', help='For MC input: Flag to disregard any generator weights.')
44 #
45 parser.add_argument('--doRatesVsPositionInTrain', action='store_true', help='Study rates vs BCID position in bunch train')
46 parser.add_argument('--vetoStartOfTrain', default=0, type=int, help='Number of BCIDs at the start of the train to veto, implies doRatesVsPositionInTrain')
47 #
48 parser.add_argument('--targetLuminosity', default=2e34, type=float)
49 #
50 parser.add_argument('--outputHist', default='RatesHistograms.root', type=str, help='Histogram output ROOT file')
51 parser.add_argument('--ebWeightsDirectory', default='', type=str, help='Path to directory with local EB xml files')
52 #
53 parser.add_argument('--doMultiSliceDiJet', action='store_true', help='Enable the HS-softer-than-PU (HSTP) filter; reweight the Slices according to Jet/ETMiss procedure; recommended by PMG for di-jet slices.')
54 #
55 parser.add_argument('flags', nargs='*', help='Config flag overrides')
56
57 args = parser.parse_args()
58
59 flags.Exec.EventPrintoutInterval = 1000
60 flags.Common.MsgSuppression = False
61 flags.Concurrency.NumThreads = 1
62
63 args = flags.fillFromArgs(parser=parser)
64 flags.lock()
65
66 useBunchCrossingData = (args.doRatesVsPositionInTrain or args.vetoStartOfTrain > 0)
67
68 from AthenaConfiguration.AutoConfigFlags import GetFileMD
69 metadata = GetFileMD(flags.Input.Files)
70 # Initialize configuration object, add accumulator, merge, and run.
71 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
72 from AthenaConfiguration.ComponentFactory import CompFactory
73
74 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
75 cfg = MainServicesCfg(flags)
76 cfg.merge(PoolReadCfg(flags))
77
78 histSvc = CompFactory.THistSvc()
79 histSvc.Output += ["RATESTREAM DATAFILE='" + args.outputHist + "' OPT='RECREATE'"]
80 cfg.addService(histSvc)
81
82 # Minimal config needed to read metadata: MetaDataSvc & ProxyProviderSvc
83 from AthenaServices.MetaDataSvcConfig import MetaDataSvcCfg
84 cfg.merge(MetaDataSvcCfg(flags))
85
86 from TrigConfxAOD.TrigConfxAODConfig import getxAODConfigSvc
87 cfgsvc = cfg.getPrimaryAndMerge(getxAODConfigSvc(flags))
88
89 from TrigDecisionTool.TrigDecisionToolConfig import TrigDecisionToolCfg
90 tdt = cfg.getPrimaryAndMerge(TrigDecisionToolCfg(flags))
91
92 # If the dataset name is in the input files path, then it will be fetched from there
93 # Note to enable autolookup, first run "lsetup pyami; voms-proxy-init -voms atlas" and enter your grid pass phrase
94 xsec = args.MCCrossSection
95 fEff = args.MCFilterEfficiency
96 dset = args.MCDatasetName
97 if flags.Input.isMC and xsec == 0: # If the input file is MC then make sure we have the needed info
98 from RatesAnalysis.GetCrossSectionAMITool import GetCrossSectionAMI
99 amiTool = GetCrossSectionAMI()
100 if dset == "": # Can we get the dataset name from the input file path?
101 dset = amiTool.getDatasetNameFromPath(flags.Input.Files[0])
102 amiTool.queryAmi(dset)
103 xsec = amiTool.crossSection
104 fEff = amiTool.filterEfficiency
105
106 ebw = CompFactory.EnhancedBiasWeighter('EnhancedBiasRatesTool')
107 ebw.RunNumber = flags.Input.RunNumbers[0]
108 ebw.UseBunchCrossingData = useBunchCrossingData
109 ebw.IsMC = flags.Input.isMC
110 # The following three are only needed if isMC == true
111 ebw.TargetLuminosity = args.targetLuminosity
112 ebw.MCCrossSection = xsec
113 ebw.MCFilterEfficiency = fEff
114 ebw.MCKFactor = args.MCKFactor
115 ebw.DoMultiSliceDiJet = args.doMultiSliceDiJet and flags.Input.isMC
116 ebw.MCIgnoreGeneratorWeights = args.MCIgnoreGeneratorWeights
117 ebw.EBWeightsDirectory = args.ebWeightsDirectory if args.ebWeightsDirectory else ""
118 cfg.addPublicTool(ebw)
119
120 rates = CompFactory.RatesEmulationExample()
121 rates.DoTriggerGroups = not args.disableTriggerGroups
122 rates.DoGlobalGroups = not args.disableGlobalGroups
123 rates.DoExpressRates = not args.disableExpressGroup
124 rates.DoUniqueRates = not args.disableUniqueRates
125 rates.UseBunchCrossingData = useBunchCrossingData
126 rates.TargetLuminosity = args.targetLuminosity
127 rates.VetoStartOfTrain = args.vetoStartOfTrain
128 rates.EnableLumiExtrapolation = not args.disableLumiExtrapolation and not args.doMultiSliceDiJet
129 rates.EnhancedBiasRatesTool = ebw
130 rates.TrigDecisionTool = tdt
131 rates.TrigConfigSvc = cfgsvc
132 rates.DoMultiSliceDiJet = args.doMultiSliceDiJet and flags.Input.isMC
133 rates.histogramSuffix = getHistogramSuffix(metadata['mc_channel_number'])
134
135 cfg.addEventAlgo(rates)
136
137
138 from JetRecConfig.StandardSmallRJets import AntiKt4Truth, standardghosts, flavourghosts, calibmods, truthmods, standardmods, clustermods
139 from JetRecConfig.JetRecConfig import JetRecCfg
140 if 'AntiKt4TruthJets' not in flags.Input.Collections and args.doMultiSliceDiJet:
141 cfg.merge(JetRecCfg(flags, AntiKt4Truth))
142 if 'AntiKt4EMTopoJets' not in flags.Input.Collections:
143 from JetRecConfig.JetDefinition import JetDefinition
144 from JetRecConfig.StandardJetConstits import stdConstitDic as cst
145 AntiKt4EMTopo = JetDefinition("AntiKt",0.4,cst.EMTopoOrigin,
146 ghostdefs = standardghosts+flavourghosts,
147 modifiers = calibmods+truthmods+standardmods+clustermods+("Filter_calibThreshold:15000","LArHVCorr","jetiso",),
148 lock = True)
149 cfg.merge(JetRecCfg(flags, AntiKt4EMTopo))
150
151
152 # Setup for accessing bunchgroup data from the DB
153 # if useBunchCrossingData:
154 # from LumiBlockComps.BunchCrossingCondAlgConfig import BunchCrossingCondAlgCfg
155 # cfg.merge(BunchCrossingCondAlgCfg(flags))
156
157 # If you want to turn on more detailed messages ...
158 # exampleMonitorAcc.getEventAlgo('ExampleMonAlg').OutputLevel = 2 # DEBUG
159 cfg.printConfig(withDetails=False) # set True for exhaustive info
160
161 sc = cfg.run(flags.Exec.MaxEvents)
162 sys.exit(0 if sc.isSuccess() else 1)