ATLAS Offline Software
Loading...
Searching...
No Matches
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
6from AthenaConfiguration.ComponentFactory import CompFactory
7from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
8from AthenaCommon.Logging import logging
9log = logging.getLogger('RunTrigCostAnalysis.py')
10
11
12# Configure Cost Analysis algorithm
13def 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
58def 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
79def 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
114def 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
131def 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
158def 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
198if __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)
STL class.
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177
hltConfigSvcCfg(flags, smk, dbAlias)
readHashesFromHLTJO(joFileName="", smk=0, dbAlias="")
trigCostAnalysisCfg(flags, args)
readConfigFromCool(flags, smk, dbAlias)