ATLAS Offline Software
RunTrigCostAnalysis.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #
3 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
4 #
5 
6 from AthenaConfiguration.ComponentFactory import CompFactory
7 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
8 from AthenaCommon.Logging import logging
9 log = logging.getLogger('RunTrigCostAnalysis.py')
10 
11 
12 # Configure Cost Analysis algorithm
13 def trigCostAnalysisCfg(flags, args):
14  from TrigCostAnalysis.ROSToROB import ROSToROBMap
15 
16  acc = ComponentAccumulator()
17 
18  if len(flags.Input.RunNumbers) > 1:
19  log.error('Multiple run numbers from metadata! Only one expected per cost processing')
20  return acc
21 
22  enhancedBiasWeighter = CompFactory.EnhancedBiasWeighter()
23  enhancedBiasWeighter.RunNumber = flags.Input.RunNumbers[0]
24  enhancedBiasWeighter.UseBunchCrossingData = False
25  enhancedBiasWeighter.IsMC = flags.Input.isMC
26  if flags.Input.isMC:
27  MCpayload = readMCpayload(args)
28  enhancedBiasWeighter.MCCrossSection = MCpayload.get('MCCrossSection')
29  enhancedBiasWeighter.MCFilterEfficiency = MCpayload.get('MCFilterEfficiency')
30  enhancedBiasWeighter.MCKFactor = MCpayload.get('MCKFactor')
31  enhancedBiasWeighter.MCIgnoreGeneratorWeights = MCpayload.get('MCIgnoreGeneratorWeights')
32 
33  trigCostAnalysis = CompFactory.TrigCostAnalysis()
34  trigCostAnalysis.OutputLevel = flags.Exec.OutputLevel
35  trigCostAnalysis.BaseEventWeight = args.baseWeight
36  trigCostAnalysis.EnhancedBiasTool = enhancedBiasWeighter
37  trigCostAnalysis.AlgToChainTool = CompFactory.getComp("TrigCompositeUtils::AlgToChainTool")()
38  trigCostAnalysis.UseEBWeights = args.useEBWeights
39  trigCostAnalysis.MaxFullEventDumps = 100
40  trigCostAnalysis.FullEventDumpProbability = 1 # X. Where probability is 1 in X
41  trigCostAnalysis.UseSingleTimeRange = flags.Input.isMC or args.useEBWeights
42  trigCostAnalysis.ROSToROBMap = ROSToROBMap().get_mapping()
43  trigCostAnalysis.DoMonitorChainAlgorithm = args.monitorChainAlgorithm
44  if args.excludeAlgsFromChainTime:
45  trigCostAnalysis.ExcludeAlgsFromChainTime = args.excludeAlgsFromChainTime.split(',')
46 
47  if not flags.Input.isMC:
48  trigCostAnalysis.AdditionalHashList = readHashesFromHLTJO(args.joFile, args.smk, args.dbAlias)
49  else:
50  log.debug("Hashes from the HLTJO won't be retrieved for MC job")
51  trigCostAnalysis.AdditionalHashList = list()
52 
53  acc.addEventAlgo(trigCostAnalysis)
54 
55  return acc
56 
57 # Prepare dictionary with MC parameters read from arguments, or from AMI
58 def readMCpayload(args):
59  payload = {}
60 
61  payload['MCCrossSection'] = args.MCCrossSection
62  payload['MCFilterEfficiency'] = args.MCFilterEfficiency
63  payload['MCKFactor'] = args.MCKFactor
64  payload['MCIgnoreGeneratorWeights'] = args.MCIgnoreGeneratorWeights
65 
66  dset = args.MCDatasetName
67  if payload['MCCrossSection'] == 0: # If the input file is MC then make sure we have the needed info
68  from RatesAnalysis.GetCrossSectionAMITool import GetCrossSectionAMI
69  amiTool = GetCrossSectionAMI()
70  if dset == '': # Can we get the dataset name from the input file path?
71  dset = amiTool.getDatasetNameFromPath(flags.Input.Files[0])
72  amiTool.queryAmi(dset)
73  payload['MCCrossSection'] = amiTool.crossSection
74  payload['MCFilterEfficiency'] = amiTool.filterEfficiency
75 
76  return payload
77 
78 # Read algorithm and class names from HLTJobOptions file
79 def readHashesFromHLTJO(joFileName="", smk=0, dbAlias=""):
80  joData = {}
81  try:
82  if joFileName:
83  log.debug("Reading HLTJobOptions from file {0}".format(joFileName))
84  with open(joFileName, "r") as joFile:
85  import json
86  joData = json.load(joFile)
87  elif smk and dbAlias:
88  log.debug("Reading HLTJobOptions from database {0} {1}".format(smk, dbAlias))
89  from TrigConfIO.HLTTriggerConfigAccess import HLTJobOptionsAccess
90  joData = HLTJobOptionsAccess(dbalias = dbAlias, smkey = smk)
91  else:
92  log.debug("Additional collections' names from HLTJobOptions file are not available")
93  return list()
94  except Exception as err:
95  log.warning("Retrieving additional names fron HLTJO failed: {0}".format(err))
96  return list()
97 
98  namesList = set()
99  for entry in joData["properties"]:
100  namesList.add(entry.split('.')[0])
101 
102  # Read algorithm names with classes
103  entryObj = joData["properties"][entry]
104  if "Members" in entryObj:
105  membersList = entryObj["Members"].strip('][').replace("'", "").split(', ')
106  namesList.update(membersList)
107 
108 
109  log.info("Retrieved {0} additional names from HLT JO file".format(len(namesList)))
110  return list(namesList)
111 
112 
113 # Configure deserialisation
114 def decodingCfg(flags):
115  from AthenaCommon.CFElements import seqAND
116  from TrigEDMConfig import DataScoutingInfo
117 
118  acc = ComponentAccumulator()
119 
120  acc.addSequence(seqAND("Decoding"))
121  acc.addEventAlgo(CompFactory.HLTResultMTByteStreamDecoderAlg(), "Decoding")
122 
123  costDataDeserialiser = CompFactory.TriggerEDMDeserialiserAlg("CostDataTrigDeserialiser")
124  costDataDeserialiser.ModuleID = DataScoutingInfo.getDataScoutingResultID("CostMonDS")
125  acc.addEventAlgo(costDataDeserialiser, "Decoding")
126 
127  return acc
128 
129 
130 # Configure HLTConfigSvc with JSON Menu file
131 def hltConfigSvcCfg(flags, smk, dbAlias):
132  acc = ComponentAccumulator()
133 
134  hltConfigSvc = CompFactory.getComp("TrigConf::HLTConfigSvc")("HLTConfigSvc")
135 
136  menuFile = getHltMenu()
137  # If local file not found - read HLTMenu from database
138  if menuFile:
139  log.debug("Reading HLTMenu from file {0}".format(menuFile))
140 
141  hltConfigSvc.InputType = "FILE"
142  hltConfigSvc.HLTJsonFileName = menuFile
143  elif smk and dbAlias:
144  log.debug("Reading HLTMenu from database {0} {1}".format(smk, dbAlias))
145 
146  hltConfigSvc.InputType = "DB"
147  hltConfigSvc.HLTJsonFileName = ""
148  hltConfigSvc.TriggerDB = dbAlias
149  hltConfigSvc.SMK = smk
150  else:
151  log.error("Cannot read the HLTMenu! Provide file or relevant keys.")
152 
153  acc.addService(hltConfigSvc, False, True)
154 
155  return acc
156 
157 
158 def readConfigFromCool(flags, smk, dbAlias):
159  # Try to read keys from COOL (for P1 data)
160  from TrigConfStorage.TriggerCoolUtil import TriggerCoolUtil
161  dbconn = TriggerCoolUtil.GetConnection("CONDBR2")
162  runNumber = flags.Input.RunNumbers[0]
163  configKeys = TriggerCoolUtil.getHLTConfigKeys(dbconn, [[runNumber, runNumber]])
164 
165  log.debug("Getting keys from COOL for run {0}".format(runNumber))
166  if configKeys and runNumber in configKeys.keys():
167  if not smk:
168  smk = configKeys[runNumber]['SMK']
169 
170  if not dbAlias:
171  dbAlias = configKeys[runNumber]['DB']
172 
173  log.debug("Config keys are SMK: {0} DB alias: {1}".format(smk, dbAlias))
174 
175  else:
176  log.debug("Configuration keys for run {0} not found!".format(runNumber))
177  dbAlias = None if not dbAlias else dbAlias
178  smk = None if not smk else smk
179 
180  return (smk, dbAlias)
181 
182 
183 # Get HLT Menu from json file
185  # Try to find local menu file
186  menuFileName = 'HLTMenu_.*json'
187 
188  import re, os
189  r = re.compile(menuFileName)
190  menuFiles = list(filter(r.match, os.listdir('.')))
191 
192  if len(menuFiles) > 1:
193  log.info("Found more than one menu file! Saving first match %s", menuFiles[0])
194 
195  return menuFiles[0] if len(menuFiles) > 0 else ""
196 
197 
198 if __name__=='__main__':
199  # Set the Athena configuration flags
200  from AthenaConfiguration.AllConfigFlags import initConfigFlags
201  flags = initConfigFlags()
202 
203  # Add specific command-line arguments
204  parser = flags.getArgumentParser()
205  parser.add_argument('--outputHist', type=str, default='TrigCostRoot_Results.root', help='Histogram output ROOT file')
206  parser.add_argument('--monitorChainAlgorithm', action='store_true', help='Turn on Chain Algorithm monitoring')
207  parser.add_argument('--baseWeight', type=float, default=1.0, help='Base events weight')
208  parser.add_argument('--useEBWeights', type=bool, default=False, help='Apply Enhanced Bias weights')
209  parser.add_argument('--joFile', type=str, help='Optional HLTJobOptions file to add more hashes')
210 
211  parser.add_argument('--smk', type=int, help='SuperMasterKey to retrieve menu file')
212  parser.add_argument('--dbAlias', type=str, help='Database alias to retrieve menu file')
213 
214  parser.add_argument('--MCDatasetName', default='', type=str, help='For MC input: Name of the dataset, can be used instead of MCCrossSection, MCFilterEfficiency')
215  parser.add_argument('--MCCrossSection', default=0.0, type=float, help='For MC input: Cross section of process in nb')
216  parser.add_argument('--MCFilterEfficiency', default=1.0, type=float, help='For MC input: Filter efficiency of any MC filter (0.0 - 1.0)')
217  parser.add_argument('--MCKFactor', default=1.0, type=float, help='For MC input: Additional multiplicitive fudge-factor to the supplied cross section.')
218  parser.add_argument('--MCIgnoreGeneratorWeights', action='store_true', help='For MC input: Flag to disregard any generator weights.')
219 
220  parser.add_argument('--excludeAlgsFromChainTime', help='comma separated list of algorithms to exclude from chain time calculation')
221 
222  args = flags.fillFromArgs(parser=parser)
223  flags.lock()
224 
225  # Initialize configuration object, add accumulator, merge, and run.
226  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
227  cfg = MainServicesCfg(flags)
228 
229  if flags.Input.isMC:
230  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
231  cfg.merge(PoolReadCfg(flags))
232  else:
233  from ByteStreamCnvSvc.ByteStreamConfig import ByteStreamReadCfg
234  cfg.merge(ByteStreamReadCfg(flags))
235  cfg.merge(decodingCfg(flags))
236 
237  histSvc = CompFactory.THistSvc()
238  histSvc.Output += ["COSTSTREAM DATAFILE='" + args.outputHist + "' OPT='RECREATE'"]
239  cfg.addService(histSvc)
240 
241  # Retrieve config from cool database
242  if not flags.Input.isMC and (not args.smk or not args.dbAlias):
243  (args.smk, args.dbAlias) = readConfigFromCool(flags, args.smk, args.dbAlias)
244 
245  cfg.merge(hltConfigSvcCfg(flags, args.smk, args.dbAlias))
246  cfg.merge(trigCostAnalysisCfg(flags, args))
247 
248  # If you want to turn on more detailed messages ...
249  # exampleMonitorAcc.getEventAlgo('ExampleMonAlg').OutputLevel = 2 # DEBUG
250  cfg.printConfig(withDetails=False) # set True for exhaustive info
251  sc = cfg.run(flags.Exec.MaxEvents)
252  import sys
253  sys.exit(0 if sc.isSuccess() else 1)
RunTrigCostAnalysis.decodingCfg
def decodingCfg(flags)
Definition: RunTrigCostAnalysis.py:114
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:310
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:342
vtune_athena.format
format
Definition: vtune_athena.py:14
RunTrigCostAnalysis.getHltMenu
def getHltMenu()
Definition: RunTrigCostAnalysis.py:184
RunTrigCostAnalysis.hltConfigSvcCfg
def hltConfigSvcCfg(flags, smk, dbAlias)
Definition: RunTrigCostAnalysis.py:131
covarianceTool.filter
filter
Definition: covarianceTool.py:514
RunTrigCostAnalysis.trigCostAnalysisCfg
def trigCostAnalysisCfg(flags, args)
Definition: RunTrigCostAnalysis.py:13
ROS_HLT_TableConstructor.ROSToROBMap
ROSToROBMap
Definition: ROS_HLT_TableConstructor.py:7
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:310
RunTrigCostAnalysis.readMCpayload
def readMCpayload(args)
Definition: RunTrigCostAnalysis.py:58
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
ByteStreamConfig.ByteStreamReadCfg
def ByteStreamReadCfg(flags, type_names=None)
Definition: Event/ByteStreamCnvSvc/python/ByteStreamConfig.py:25
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
Trk::open
@ open
Definition: BinningType.h:40
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
python.CFElements.seqAND
def seqAND(name, subs=[], invert=False)
Definition: CFElements.py:27
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:71
RunTrigCostAnalysis.readHashesFromHLTJO
def readHashesFromHLTJO(joFileName="", smk=0, dbAlias="")
Definition: RunTrigCostAnalysis.py:79
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
RunTrigCostAnalysis.readConfigFromCool
def readConfigFromCool(flags, smk, dbAlias)
Definition: RunTrigCostAnalysis.py:158