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