6 from AthenaConfiguration.ComponentFactory
import CompFactory
7 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
8 from AthenaCommon.Logging
import logging
9 log = logging.getLogger(
'RunTrigCostAnalysis.py')
14 from TrigCostAnalysis.ROSToROB
import ROSToROBMap
18 if len(flags.Input.RunNumbers) > 1:
19 log.error(
'Multiple run numbers from metadata! Only one expected per cost processing')
22 enhancedBiasWeighter = CompFactory.EnhancedBiasWeighter()
23 enhancedBiasWeighter.RunNumber = flags.Input.RunNumbers[0]
24 enhancedBiasWeighter.UseBunchCrossingData =
False
25 enhancedBiasWeighter.IsMC = flags.Input.isMC
28 enhancedBiasWeighter.MCCrossSection = MCpayload.get(
'MCCrossSection')
29 enhancedBiasWeighter.MCFilterEfficiency = MCpayload.get(
'MCFilterEfficiency')
30 enhancedBiasWeighter.MCKFactor = MCpayload.get(
'MCKFactor')
31 enhancedBiasWeighter.MCIgnoreGeneratorWeights = MCpayload.get(
'MCIgnoreGeneratorWeights')
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
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(
',')
47 if not flags.Input.isMC:
48 trigCostAnalysis.AdditionalHashList =
readHashesFromHLTJO(args.joFile, args.smk, args.dbAlias)
50 log.debug(
"Hashes from the HLTJO won't be retrieved for MC job")
51 trigCostAnalysis.AdditionalHashList =
list()
53 acc.addEventAlgo(trigCostAnalysis)
61 payload[
'MCCrossSection'] = args.MCCrossSection
62 payload[
'MCFilterEfficiency'] = args.MCFilterEfficiency
63 payload[
'MCKFactor'] = args.MCKFactor
64 payload[
'MCIgnoreGeneratorWeights'] = args.MCIgnoreGeneratorWeights
66 dset = args.MCDatasetName
67 if payload[
'MCCrossSection'] == 0:
68 from RatesAnalysis.GetCrossSectionAMITool
import GetCrossSectionAMI
69 amiTool = GetCrossSectionAMI()
71 dset = amiTool.getDatasetNameFromPath(flags.Input.Files[0])
72 amiTool.queryAmi(dset)
73 payload[
'MCCrossSection'] = amiTool.crossSection
74 payload[
'MCFilterEfficiency'] = amiTool.filterEfficiency
83 log.debug(
"Reading HLTJobOptions from file {0}".
format(joFileName))
84 with open(joFileName,
"r")
as joFile:
86 joData = json.load(joFile)
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)
92 log.debug(
"Additional collections' names from HLTJobOptions file are not available")
94 except Exception
as err:
95 log.warning(
"Retrieving additional names fron HLTJO failed: {0}".
format(err))
99 for entry
in joData[
"properties"]:
100 namesList.add(entry.split(
'.')[0])
103 entryObj = joData[
"properties"][entry]
104 if "Members" in entryObj:
105 membersList = entryObj[
"Members"].strip(
'][').
replace(
"'",
"").
split(
', ')
106 namesList.update(membersList)
109 log.info(
"Retrieved {0} additional names from HLT JO file".
format(len(namesList)))
110 return list(namesList)
115 from AthenaCommon.CFElements
import seqAND
116 from TrigEDMConfig
import DataScoutingInfo
120 acc.addSequence(
seqAND(
"Decoding"))
121 acc.addEventAlgo(CompFactory.HLTResultMTByteStreamDecoderAlg(),
"Decoding")
123 costDataDeserialiser = CompFactory.TriggerEDMDeserialiserAlg(
"CostDataTrigDeserialiser")
124 costDataDeserialiser.ModuleID = DataScoutingInfo.getDataScoutingResultID(
"CostMonDS")
125 acc.addEventAlgo(costDataDeserialiser,
"Decoding")
134 hltConfigSvc = CompFactory.getComp(
"TrigConf::HLTConfigSvc")(
"HLTConfigSvc")
139 log.debug(
"Reading HLTMenu from file {0}".
format(menuFile))
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))
146 hltConfigSvc.InputType =
"DB"
147 hltConfigSvc.HLTJsonFileName =
""
148 hltConfigSvc.TriggerDB = dbAlias
149 hltConfigSvc.SMK = smk
151 log.error(
"Cannot read the HLTMenu! Provide file or relevant keys.")
153 acc.addService(hltConfigSvc,
False,
True)
160 from TrigConfStorage.TriggerCoolUtil
import TriggerCoolUtil
161 dbconn = TriggerCoolUtil.GetConnection(
"CONDBR2")
162 runNumber = flags.Input.RunNumbers[0]
163 configKeys = TriggerCoolUtil.getHLTConfigKeys(dbconn, [[runNumber, runNumber]])
165 log.debug(
"Getting keys from COOL for run {0}".
format(runNumber))
166 if configKeys
and runNumber
in configKeys.keys():
168 smk = configKeys[runNumber][
'SMK']
171 dbAlias = configKeys[runNumber][
'DB']
173 log.debug(
"Config keys are SMK: {0} DB alias: {1}".
format(smk, dbAlias))
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
180 return (smk, dbAlias)
186 menuFileName =
'HLTMenu_.*json'
189 r = re.compile(menuFileName)
190 menuFiles =
list(
filter(r.match, os.listdir(
'.')))
192 if len(menuFiles) > 1:
193 log.info(
"Found more than one menu file! Saving first match %s", menuFiles[0])
195 return menuFiles[0]
if len(menuFiles) > 0
else ""
198 if __name__==
'__main__':
200 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
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')
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')
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.')
220 parser.add_argument(
'--excludeAlgsFromChainTime', help=
'comma separated list of algorithms to exclude from chain time calculation')
222 args = flags.fillFromArgs(parser=parser)
226 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
230 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
233 from ByteStreamCnvSvc.ByteStreamConfig
import ByteStreamReadCfg
237 histSvc = CompFactory.THistSvc()
238 histSvc.Output += [
"COSTSTREAM DATAFILE='" + args.outputHist +
"' OPT='RECREATE'"]
239 cfg.addService(histSvc)
242 if not flags.Input.isMC
and (
not args.smk
or not args.dbAlias):
250 cfg.printConfig(withDetails=
False)
251 sc = cfg.run(flags.Exec.MaxEvents)
253 sys.exit(0
if sc.isSuccess()
else 1)