4 from AthenaCommon.Utils.unixtools
import find_datafile
5 from AthenaCommon.Logging
import logging
9 utility function to retrieve the flag dictionary
10 for every TrackAnalysis from an input JSON file
14 input_file = flags.PhysVal.IDTPM.trkAnaCfgFile
17 if input_file ==
"Default":
22 if dataPath
is None and input_file !=
"Default":
23 raise Exception(f
"Input file with analyses definition: {input_file} could not be found, for files given with absolute path use ./ prefix")
29 with open( dataPath,
"r" )
as input_json_file:
30 analysesDictTmp = json.load( input_json_file )
34 for trkAnaName, trkAnaDict
in analysesDictTmp.items():
36 analysesDict.update( { trkAnaName : trkAnaDict } )
38 analysesDict[trkAnaName][
"anaTag"] =
"_" + trkAnaName
40 if (
"SubFolder" not in analysesDict[trkAnaName].
keys()
or
41 analysesDict[trkAnaName][
"SubFolder"] ==
"" ) :
42 analysesDict[trkAnaName][
"SubFolder"] = trkAnaName
43 analysesDict[trkAnaName][
"SubFolder"] +=
"/"
45 if "ChainNames" in analysesDict[trkAnaName]:
46 fullChainList =
getChainList( flags, analysesDict[trkAnaName][
"ChainNames"] )
47 analysesDict[trkAnaName][
"ChainNames"] = fullChainList
49 return unpackTrkAnaDicts( analysesDict )
if flags.PhysVal.IDTPM.unpackTrigChains
else analysesDict
54 utility function to define a separate TrackAnalysis
55 for each configured trigger chain
57 if not analysesDictIn :
return analysesDictIn
60 for trkAnaName, trkAnaDict
in analysesDictIn.items():
61 if "ChainNames" in trkAnaDict:
62 chainList = trkAnaDict[
"ChainNames"]
63 for chain
in chainList:
64 trkAnaName_new = trkAnaName +
"_" + chain
65 trkAnaDict_new = dict( trkAnaDict )
66 trkAnaDict_new[
"anaTag"] = trkAnaDict[
"anaTag"] +
"_" + chain
67 trkAnaDict_new[
"ChainNames"] = [ chain ]
68 analysesDictOut.update( { trkAnaName_new : trkAnaDict_new } )
70 analysesDictOut.update( { trkAnaName : trkAnaDict } )
72 return analysesDictOut
78 utility function to retrieve full list of
79 configured trigger chains matching
80 the passed regex list of chains
82 if not regexChainList:
return regexChainList
84 if not flags.locked():
85 flags_tmp = flags.clone()
89 from TrigConfigSvc.TriggerConfigAccess
import getHLTMenuAccess
94 for regexChain
in regexChainList:
95 for item
in chainsMenu:
96 chains = re.findall( regexChain, item )
98 if chain
is not None and chain == item:
99 configChains.append( chain )
106 Open json files and load all merged contents
107 in a dictionary, which is later converted to a
108 list of strings, each to be parsed in a
109 (flattened) json format
111 log = logging.getLogger(
"getPlotsDefList" )
114 log.debug(
"plotsDefFileList : %s", flags.PhysVal.IDTPM.plotsDefFileList )
115 listPath =
find_datafile( flags.PhysVal.IDTPM.plotsDefFileList )
117 log.error(
"plotsDefFileList not found" )
120 plotsDefFileNames = []
121 with open( listPath,
"r" )
as input_flist :
122 plotsDefFileNames = input_flist.read().splitlines()
127 for plotsDefFileName
in plotsDefFileNames :
129 log.debug(
"Reading input plots definitions : %s", dataPath )
131 log.error(
"plotsDefFile %s not found", plotsDefFileName )
134 with open( dataPath,
"r" )
as input_json_file :
135 plotsDefDict.update( json.load( input_json_file ) )
143 def flatten_json( y ) :
145 def flatten(x, name=''):
148 flatten(x[a], name + a +
'_')
154 plotsDefStrList_v1 = []
155 for plotName, plotDict
in plotsDefDict.items():
156 newPlotDict = plotDict.copy()
157 newPlotDict[
"name" ] = plotName
160 plotDictFlat = flatten_json( newPlotDict )
163 plotDefStr =
str( json.dumps( plotDictFlat ) )
166 plotsDefStrList_v1.append( plotDefStr )
170 plotsCommonValuesFileName = flags.PhysVal.IDTPM.plotsCommonValuesFile
171 if not plotsCommonValuesFileName :
172 if flags.Detector.GeometryID :
173 plotsCommonValuesFileName =
"InDetTrackPerfMon/PlotsDefCommonValues.json"
174 elif flags.Detector.GeometryITk :
175 plotsCommonValuesFileName =
"InDetTrackPerfMon/PlotsDefCommonValues_ITk.json"
177 log.error(
"Could not get detector geometry for plotsCommonValuesFile" )
180 commonValuesPath =
find_datafile( plotsCommonValuesFileName )
181 if commonValuesPath
is None :
182 log.error(
"plotsCommonValuesFile not found: %s", plotsCommonValuesFileName )
185 commonValuesDict = {}
186 with open( commonValuesPath,
"r" )
as input_commonValues :
187 commonValuesDict.update( json.load( input_commonValues ) )
189 plotsDefStrList_v2 = []
190 for plotDefStr
in plotsDefStrList_v1 :
191 newPlotDefStr = plotDefStr
192 if commonValuesDict :
193 for key, value
in commonValuesDict.items() :
194 plotDefStr_tmp = newPlotDefStr.replace(
"$"+key, value[0] )
195 newPlotDefStr = plotDefStr_tmp
196 plotsDefStrList_v2.append( newPlotDefStr )
199 testLabel =
getLabel( flags, flags.PhysVal.IDTPM.currentTrkAna.TestType )
200 refLabel =
getLabel( flags, flags.PhysVal.IDTPM.currentTrkAna.RefType )
201 trkLabels = [ testLabel, refLabel ]
203 if flags.PhysVal.IDTPM.currentTrkAna.MatchingType ==
"EFTruthMatch":
204 trkLabels.append(
getLabel( flags,
"Truth" ) )
207 for plotsDefStr
in plotsDefStrList_v2 :
208 plotsDefStr = plotsDefStr.replace(
"$TESTTYPE", testLabel[0] ).
replace(
"$TESTTAG", testLabel[1] )
209 plotsDefStr = plotsDefStr.replace(
"$REFTYPE", refLabel[0] ).
replace(
"$REFTAG", refLabel[1] )
210 if (
"$TRKTAG" not in plotsDefStr )
and (
"$TRKTYPE" not in plotsDefStr ) :
211 plotsDefStrList.append( plotsDefStr )
213 for trkLabel
in trkLabels :
214 newPlotsDefStr = plotsDefStr.replace(
"$TRKTYPE", trkLabel[0] ).
replace(
"$TRKTAG", trkLabel[1] )
215 if (
"$TRK2TAG" not in newPlotsDefStr )
and (
"$TRK2TYPE" not in newPlotsDefStr ) :
216 plotsDefStrList.append( newPlotsDefStr )
218 for trk2Label
in trkLabels :
219 newPlotsDefStr2 = newPlotsDefStr.replace(
"$TRK2TYPE", trk2Label[0] ).
replace(
"$TRK2TAG", trk2Label[1] )
220 plotsDefStrList.append( newPlotsDefStr2 )
222 return plotsDefStrList
226 if key ==
"Offline" and flags.PhysVal.IDTPM.currentTrkAna.SelectOfflineObject:
227 if "Truth" not in flags.PhysVal.IDTPM.currentTrkAna.SelectOfflineObject:
228 key += flags.PhysVal.IDTPM.currentTrkAna.SelectOfflineObject
230 "EFTrigger" : [
"EF Trigger track",
"eftrig" ],
231 "Trigger" : [
"Trigger track",
"trig" ],
232 "Offline" : [
"Offline track",
"offl" ],
233 "OfflineElectron" : [
"Offline e^{#pm} track",
"offEle" ],
234 "OfflineMuon" : [
"Offline #mu^{#pm} track",
"offMu" ],
235 "OfflineTau" : [
"Offline #tau^{#pm} track",
"offTau" ],
236 "Truth" : [
"Truth particle",
"truth" ],
237 "TruthElectron" : [
"Truth e^{#pm}",
"truthEle" ],
238 "TruthMuon" : [
"Truth #mu^{#pm}",
"truthMu" ],
239 "TruthTau" : [
"Truth #tau^{#pm}",
"truthEle" ],
241 return trkLabelsDict[ key ]
251 outDict = myPlotsDefDict.copy()
253 items = [
"res",
"pull" ]
254 plist = [
"mean",
"width" ]
257 "helper" : {
"name" :
"resHelper",
"yTitle" :
"residual" },
258 "mean" : {
"name" :
"resmean",
"yTitle" :
"bias" },
259 "width" : {
"name" :
"resolution",
"yTitle" :
"resolution" }
262 "helper" : {
"name" :
"pullHelper",
"yTitle" :
"pull" },
263 "mean" : {
"name" :
"pullmean",
"yTitle" :
"pull mean" },
264 "width" : {
"name" :
"pullwidth",
"yTitle" :
"pull width" }
268 for plotName, plotDict
in myPlotsDefDict.items() :
271 if iDict[i][
"helper"][
"name"]
in plotName :
275 pName = plotName.replace( iDict[i][
"helper"][
"name"], iDict[i][p][
"name"] )
278 if pName
in outDict :
280 pDict = outDict[ pName ]
285 yTitle = plotDict[
"yAxis"][
"title"]
286 yTitle = yTitle.replace( iDict[i][
"helper"][
"yTitle"], iDict[i][p][
"yTitle"] )
287 pDict.update( {
"yAxis" : {
"title" : yTitle } } )
292 "xAxis" : plotDict[
"xAxis"]
296 outDict.update( { pName : pDict } )