7import argparse, ROOT, os, sys
8from InDetTrackPerfMon.ConfigUtils
import custom_find_datafile
9from AthenaCommon.Logging
import logging
10log = logging.getLogger(
"IDPVMtoIDTPMConverter.py" )
13parser = argparse.ArgumentParser( description =
"IDPVMtoIDTPMConverter.py options:" )
14parser.add_argument(
"-i",
"--inputFile", help=
"IDPVM input file", required=
True )
15parser.add_argument(
"-c",
"--config", help=
"config file", default=
"InDetTrackPerfMon/IDPVM_to_IDTPM_map_skeleton.txt" )
16parser.add_argument(
"-o",
"--outputFile", help=
"Name of the output IDPVM file converted in IDTPM format", default=
"IDPVMtoIDTPM.root" )
17parser.add_argument(
"-d",
"--debug", help=
'set debug level printout', action=
'store_true', default=
False )
18parser.add_argument(
"--doTightPrimary", help=
'also include tight-primary plots in map', action=
'store_true', default=
False )
20MyArgs = parser.parse_args()
22if MyArgs.debug : log.setLevel( logging.DEBUG )
25inputPath = custom_find_datafile( MyArgs.inputFile )
27 log.error( f
"Input file {MyArgs.inputFile} not found" )
31configFileName = custom_find_datafile( MyArgs.config )
32if not configFileName :
33 log.error( f
"Config txt {MyArgs.config} not found" )
38with open( configFileName,
'r' )
as configFile :
39 for line
in configFile.readlines() :
41 if not line.strip() :
continue
42 if line.startswith(
" ")
or line.startswith(
"#") :
continue
48 if hIDPVM==
"NONE" or hIDTPM==
"NONE" :
continue
50 namingMap_base.update( { hIDPVM : {
"IDTPMname" : hIDTPM,
"type" : htype } } )
54if MyArgs.doTightPrimary : expandMap.append( {
"IDPVMrepl" :
"SquirrelPlots/TightPrimary/",
55 "IDTPMrepl" :
"TrkAnaOffl_TightPrimary" } )
58namingMap = namingMap_base.copy()
59for expitem
in expandMap :
61 for hname, hdict
in namingMap_base.items() :
62 newhname = hname.replace(
"SquirrelPlots/", expitem[
"IDPVMrepl"] )
63 newhdict = hdict.copy()
64 newhdict[
"IDTPMname"] = newhdict[
"IDTPMname"].
replace(
"TrkAnaOffl", expitem[
"IDTPMrepl"] )
65 namingMap_add.update( { newhname : newhdict } )
66 namingMap.update( namingMap_add )
67log.info(
"Naming map successfully created" )
71 "Generator function to recurse into a ROOT file/dir and yield (path, obj) pairs"
72 for key
in d.GetListOfKeys():
75 if key.GetClassName() ==
"TTree":
78 for i
in getall(d.Get(kname), basepath+kname+
"/"):
81 yield basepath+kname, d.Get(kname)
83inFile = ROOT.TFile.Open( inputPath,
"READ" )
84outFile = ROOT.TFile.Open( MyArgs.outputFile,
"RECREATE" )
86for keyname, keyobj
in getall( inFile ) :
87 if not keyobj :
continue
88 keytype = keyobj.ClassName()
91 if keyname
not in namingMap :
92 log.debug( f
"WARNING: plot {keyname} not found. Skipping" )
96 mapHtype = namingMap[ keyname ][
"type"]
97 newHname = namingMap[ keyname ][
"IDTPMname"]
100 if keytype != mapHtype :
101 log.warning( f
"histogram {keyname} is {keytype}, but {mapHtype} requested. Skipping." )
106 keyobj.SetDirectory(0)
110 newHname_path = os.path.dirname( newHname )
111 newHname_obj = os.path.basename( newHname )
112 if(
not outFile.GetDirectory( newHname_path ) ):
113 outFile.mkdir( newHname_path, newHname_path )
114 outFile.cd( newHname_path )
115 keyobj.SetName( newHname_obj )
118log.info( f
"Output file {MyArgs.outputFile} successfully written. All done!" )
std::string replace(std::string s, const std::string &s2, const std::string &s3)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
getall(d, basepath="")
now opening and looping input IDPVM file