Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
runL1TopoRates.py
Go to the documentation of this file.
1 #!/usr/bin/env athena.py
2 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 
4 """
5 CA module to configure the (standalone) HLT for athena.
6 """
7 
8 # This entry point is only used when running in athena
9 
10 if __name__ == "__main__":
11  from AthenaConfiguration.AllConfigFlags import initConfigFlags
12  flags = initConfigFlags()
13  parser = flags.getArgumentParser()
14  # Add additional args
15  #
16  parser.add_argument('--disableHistograms', action='store_false', help='Turn off histograming')
17  parser.add_argument('--disableGlobalGroups', action='store_false', help='Turn off global groups')
18  parser.add_argument('--disableTriggerGroups', action='store_false', help='Turn off per-trigger groups')
19  parser.add_argument('--disableExpressGroup', action='store_false', help='Turn off express stream rates')
20  parser.add_argument('--disableUniqueRates', action='store_false', help='Turn off unique rates (much faster!)')
21  parser.add_argument('--disableLumiExtrapolation', action='store_false', help='Turn off luminosity extrapolation')
22  #
23  parser.add_argument('--MCDatasetName', default='', type=str, help='For MC input: Name of the dataset, can be used instead of MCCrossSection, MCFilterEfficiency')
24  parser.add_argument('--MCCrossSection', default=0.0, type=float, help='For MC input: Cross section of process in nb')
25  parser.add_argument('--MCFilterEfficiency', default=1.0, type=float, help='For MC input: Filter efficiency of any MC filter (0.0 - 1.0)')
26  parser.add_argument('--MCKFactor', default=1.0, type=float, help='For MC input: Additional multiplicitive fudge-factor to the supplied cross section.')
27  parser.add_argument('--MCIgnoreGeneratorWeights', action='store_true', help='For MC input: Flag to disregard any generator weights.')
28  #
29  parser.add_argument('--outputHist', default='RatesHistograms.root', type=str, help='Histogram output ROOT file')
30  #
31  parser.add_argument('--targetLuminosity', default=2e34, type=float)
32  #
33  parser.add_argument('--doRatesVsPositionInTrain', action='store_true', help='Study rates vs BCID position in bunch train')
34  parser.add_argument('--vetoStartOfTrain', default=0, type=int, help='Number of BCIDs at the start of the train to veto, implies doRatesVsPositionInTrain')
35  #
36  parser.add_argument('--maxEvents', type=int, help='Maximum number of events to process')
37  parser.add_argument('flags', nargs='*', help='Config flag overrides')
38 
39  parser.add_argument('--ratesJson', type=str, help='Input JSON of triggers for rates')
40  args, _ = parser.parse_known_args()
41 
42  if args.ratesJson:
43  import json
44  with open(args.ratesJson, 'r') as f:
45  triggers_data = json.load(f)
46  L1_items = triggers_data.get("L1_items", [])
47 
48  userDefinedL1items = triggers_data.get("userDefinedL1items", [])
49  userDefinedNames = [item["name"] for item in userDefinedL1items if "name" in item]
50  userDefinedDefinitions = [item["definition"] for item in userDefinedL1items if "definition" in item]
51  else:
52  L1_items = []
53  userDefinedNames = []
54  userDefinedDefinitions = []
55  # Act on additional args, e.g. run over ttbar if no --filesInput argument is specified
56  # Runs over Enhanced bias data
57  if not args.filesInput:
58  from TrigValTools.TrigValSteering import Input
59  flags.Input.Files = Input.load_input_json()['data']['paths']
60 
61  # Set explicit flags
62  flags.Trigger.enabledSignatures=['Calib']
63  flags.Trigger.doLVL1=True
64  flags.Concurrency.NumConcurrentEvents = 1
65  flags.Concurrency.NumThreads = 1
66  flags.Exec.MaxEvents = 1000
67 
68  useBunchCrossingData = (args.doRatesVsPositionInTrain or args.vetoStartOfTrain > 0)
69 
70  # Fill flags from command line
71  try:
72  flags.fillFromArgs(parser=parser)
73  except Exception as e:
74  print(f"Error filling flags: {e}")
75  import sys
76  sys.exit(1)
77  if (flags.Input.isMC):
78  flags.IOVDb.GlobalTag="OFLCOND-MC23-SDR-RUN3-05"
79 
80  from TriggerJobOpts.runHLT import athenaCfg
81  acc = athenaCfg(flags,parser=parser)
82  from AthenaConfiguration.ComponentFactory import CompFactory
83 
84  from TrigDecisionTool.TrigDecisionToolConfig import TrigDecisionToolCfg
85  tdt = acc.getPrimaryAndMerge(TrigDecisionToolCfg(flags))
86 
87  from TrigConfxAOD.TrigConfxAODConfig import getxAODConfigSvc
88  cfgsvc = acc.getPrimaryAndMerge(getxAODConfigSvc(flags))
89 
90  histSvc = CompFactory.THistSvc()
91  histSvc.Output += ["RATESTREAM DATAFILE='RatesHistograms.root' OPT='RECREATE'"]
92  acc.addService(histSvc)
93 
94  # If the dataset name is in the input files path, then it will be fetched from there
95  # Note to enable autolookup, first run "lsetup pyami; voms-proxy-init -voms atlas" and enter your grid pass phrase
96  xsec = args.MCCrossSection
97  fEff = args.MCFilterEfficiency
98  dset = args.MCDatasetName
99  if flags.Input.isMC and xsec == 0: # If the input file is MC then make sure we have the needed info
100  from RatesAnalysis.GetCrossSectionAMITool import GetCrossSectionAMI
101  amiTool = GetCrossSectionAMI()
102  if dset == "": # Can we get the dataset name from the input file path?
103  dset = amiTool.getDatasetNameFromPath(flags.Input.Files[0])
104  amiTool.queryAmi(dset)
105  xsec = amiTool.crossSection
106  fEff = amiTool.filterEfficiency
107 
108  ebw = CompFactory.EnhancedBiasWeighter('EnhancedBiasRatesTool')
109  ebw.RunNumber = flags.Input.RunNumbers[0]
110  ebw.UseBunchCrossingData = False
111  ebw.IsMC = flags.Input.isMC
112  # Assuming ttbar
113  #ebw.MCCrossSection = 0.73207
114  #ebw.MCFilterEfficiency = 4.385184E-01
115  # The following three are only needed if isMC == true
116  ebw.MCCrossSection = xsec
117  ebw.MCFilterEfficiency = fEff
118  ebw.MCKFactor = args.MCKFactor
119  ebw.MCIgnoreGeneratorWeights = args.MCIgnoreGeneratorWeights
120 
121  acc.addPublicTool(ebw)
122 
123  tdt = CompFactory.Trig.TrigDecisionTool('TrigDecisionTool')
124  tdt.TrigConfigSvc = cfgsvc
125  tdt.HLTSummary = "HLTNav_Summary_OnlineSlimmed"
126  tdt.NavigationFormat = "TrigComposite"
127  acc.addPublicTool(tdt)
128 
129  rates = CompFactory.L1TopoRatesCalculator()
130  if L1_items:
131  try:
132  rates.m_L1_items_json = L1_items
133  except AttributeError:
134  print("Failed to set L1_items, method not found")
135 
136  if userDefinedNames and userDefinedDefinitions:
137  rates.m_userDefinedNames = userDefinedNames
138  rates.m_userDefinedDefinitions = userDefinedDefinitions
139 
140  rates.DoTriggerGroups = True
141  rates.DoGlobalGroups = True
142  rates.DoExpressRates = True
143  rates.DoUniqueRates = True
144  rates.DoHistograms = True
145  rates.UseBunchCrossingData = False
146  rates.TargetLuminosity = 2e34
147  rates.VetoStartOfTrain = False
148  rates.EnableLumiExtrapolation = True
149  rates.EnhancedBiasRatesTool = ebw
150  rates.TrigDecisionTool = tdt
151  rates.TrigConfigSvc = cfgsvc
152  acc.addEventAlgo(rates)
153 
154  # Add aditional algorithms, e.g. the rates algorithm
155  #acc.addEventAlgo( ... )
156 
157  import sys
158  sys.exit(acc.run().isFailure())
TrigConfxAODConfig.getxAODConfigSvc
def getxAODConfigSvc(flags)
Definition: TrigConfxAODConfig.py:5
python.runHLT.athenaCfg
def athenaCfg(flags, parser=None)
Definition: runHLT.py:143
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
python.TriggerInterface.TrigDecisionToolCfg
def TrigDecisionToolCfg(flags)
Definition: TriggerInterface.py:14
Trk::open
@ open
Definition: BinningType.h:40
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19