ATLAS Offline Software
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 
25 if __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)
python.AutoConfigFlags.GetFileMD
def GetFileMD(filenames, allowEmpty=True, maxLevel='peeker')
Definition: AutoConfigFlags.py:65
TrigConfxAODConfig.getxAODConfigSvc
def getxAODConfigSvc(flags)
Definition: TrigConfxAODConfig.py:5
python.JetRecConfig.JetRecCfg
def JetRecCfg(flags, jetdef, returnConfiguredDef=False)
Top level functions returning ComponentAccumulator out of JetDefinition.
Definition: JetRecConfig.py:36
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:312
python.RatesEmulationExample.getHistogramSuffix
def getHistogramSuffix(dsid)
Definition: RatesEmulationExample.py:7
python.TriggerInterface.TrigDecisionToolCfg
def TrigDecisionToolCfg(flags)
Definition: TriggerInterface.py:14
python.MetaDataSvcConfig.MetaDataSvcCfg
def MetaDataSvcCfg(flags, toolNames=[], tools=[])
Definition: MetaDataSvcConfig.py:6
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:71