File indexing completed on 2024-11-26 02:34:39
0001
0002
0003 import sys
0004 import os
0005 import re
0006 from ROOT import gROOT, TFile
0007 import MultipleCompare as MultipleCompare
0008
0009
0010 __author__ = "Lars Perchalla (lars.perchalla@cern.ch)"
0011 __doc__ = """Script to execute multiple plotting commands via MultipleCompare.py. Switch between massiveMode producing a set of plots comparing each one by one, and defaultMode producing a smaller set of default plot combinations by adding the commandline option massiveMode:\n\n
0012 Usage: SteerMultipleCompare.py -T testFile -R refFile [options] [search strings that you want to apply '*' is supported as special character]
0013 see MultiCompare.py for details
0014 """
0015
0016 def StripPath(name):
0017 path = ''
0018 plot = ''
0019 matches = re.match(r'(.*)\/(.*)$', name)
0020 if matches:
0021 path = matches.group(1)
0022 plot = matches.group(2)
0023 return [path, plot]
0024
0025 def CreateDirectory(dir,addToExisting=False):
0026 if os.path.exists(dir) and not addToExisting:
0027 print("Output directory %s already exists! OK to overwrite?" % dir)
0028 while True:
0029 input = raw_input("Please enter [y/n] ")
0030 if (input == 'y'):
0031 break
0032 elif (input == 'n'):
0033 print(" ...exiting.")
0034 sys.exit()
0035 if not os.path.exists(dir):
0036 os.makedirs(dir)
0037
0038 def CreateBaseDirectory(options):
0039 if options.out == 'MultipleCompare.png' or options.out.find('.')!=-1:
0040
0041
0042 outputDirName = 'MultipleCompareOutput'
0043 else:
0044 outputDirName = options.out
0045 outputDir = os.path.join(os.getcwd(), outputDirName)
0046 CreateDirectory(outputDir)
0047 return outputDir
0048
0049 def CreateSubDirectory(basedir, path):
0050 outputDir = os.path.join(basedir, path)
0051 CreateDirectory(outputDir,True)
0052
0053 def CleanArguments(argv, option):
0054
0055 while argv.count(option) > 0:
0056 index = argv.index(option)
0057 if index < len(argv)-1:
0058 argv.pop(index+1)
0059 argv.pop(index)
0060
0061
0062
0063
0064 def plotOneByOne(argv, outputDir, histoList, histoSubNames, paths):
0065 for hist, name, path in zip(histoList, histoSubNames, paths):
0066 CreateSubDirectory(outputDir, path)
0067
0068 tmpArgv = argv[:]
0069 tmpArgv.append('-o')
0070 tmpArgv.append(outputDir+'/'+path+'/'+name+'.png')
0071 tmpArgv.append(hist)
0072 MultipleCompare.main(tmpArgv)
0073
0074 def plotDefault(argv, outputDir, name, type, plots, addArgv=[]):
0075 tmpArgv = argv[:]
0076 tmpArgv.append('-o')
0077 tmpArgv.append(outputDir+'/'+name+type)
0078 tmpArgv.extend(addArgv)
0079 tmpArgv.extend(plots)
0080 MultipleCompare.main(tmpArgv)
0081
0082
0083 def plotDefaults(argv, options, outputDir):
0084 name = 'Validation_'
0085 if options.testLabel != None:
0086 name += options.testLabel+'_'
0087 else:
0088 name += options.test+'_vs_'
0089 if options.refLabel != None:
0090 name += options.refLabel+'_'
0091 else:
0092 name += options.ref+'_'
0093 outputType = '.eps'
0094 additionalArgv = []
0095 if outputDir.find('QCD')!=-1:
0096 additionalArgv.append('-f')
0097 plotDefault(argv, outputDir, name, 'LeptonRejectionEffphi'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*Rejection/*Effphi'], additionalArgv)
0098 plotDefault(argv, outputDir, name, 'LeptonRejectionEffeta'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*Rejection/*Effeta'], additionalArgv)
0099 plotDefault(argv, outputDir, name, 'LeptonRejectionEffpt'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*Rejection/*Effpt'], additionalArgv)
0100
0101 if outputDir.find('QCD')!=-1:
0102 additionalArgv.append('--logScale')
0103 plotDefault(argv, outputDir, name, 'Effphi'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*Effphi', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*Effphi'], additionalArgv)
0104 plotDefault(argv, outputDir, name, 'Effeta'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*Effeta', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*Effeta'], additionalArgv)
0105 plotDefault(argv, outputDir, name, 'Effpt'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*Effpt', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*Effpt'], additionalArgv)
0106
0107 plotDefault(argv, outputDir, name, 'pTRatio_allHadronic'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_pTRatio_allHadronic', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_pTRatio_allHadronic'])
0108 plotDefault(argv, outputDir, name, 'pTRatio_oneProng1Pi0'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_pTRatio_oneProng1Pi0', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_pTRatio_oneProng1Pi0'])
0109 plotDefault(argv, outputDir, name, 'pTRatio_threeProng0Pi0'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_pTRatio_threeProng0Pi0', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_pTRatio_threeProng0Pi0'])
0110
0111 plotDefault(argv, outputDir, name, 'Size_isolationPFChargedHadrCands'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_Size_isolationPFChargedHadrCands', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_Size_isolationPFChargedHadrCands'])
0112 plotDefault(argv, outputDir, name, 'Size_isolationPFNeutrHadrCands'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_Size_isolationPFNeutrHadrCands', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_Size_isolationPFNeutrHadrCands'])
0113 plotDefault(argv, outputDir, name, 'Size_isolationPFGammaCands'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_Size_isolationPFGammaCands', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_Size_isolationPFGammaCands'])
0114
0115 plotDefault(argv, outputDir, name, 'SumPt_isolationPFChargedHadrCands'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_SumPt_isolationPFChargedHadrCands', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_SumPt_isolationPFChargedHadrCands'])
0116 plotDefault(argv, outputDir, name, 'SumPt_isolationPFNeutrHadrCands'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_SumPt_isolationPFNeutrHadrCands', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_SumPt_isolationPFNeutrHadrCands'])
0117 plotDefault(argv, outputDir, name, 'SumPt_isolationPFGammaCands'+outputType, ['DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationByDecayModeFinding/*_SumPt_isolationPFGammaCands', 'DQMData/RecoTauV/hpsPFTauProducer_hpsPFTauDiscriminationBy*CombinedIsolationDBSumPtCorr/*_SumPt_isolationPFGammaCands'])
0118
0119
0120 def main(argv=None):
0121 if argv is None:
0122 argv = sys.argv
0123
0124 options, toPlot = MultipleCompare.LoadCommandlineOptions(argv)
0125
0126 gROOT.SetBatch()
0127
0128 testFile = TFile(options.test)
0129 refFile = None
0130 if options.ref != '':
0131 refFile = TFile(options.ref)
0132
0133 plotList = []
0134 MultipleCompare.MapDirStructure( testFile,'',plotList)
0135
0136 if len(plotList)<1:
0137 print('\tError: Please specify at least one histogram. The following ones are available in the root file.')
0138 print(plotList)
0139 sys.exit()
0140
0141 histoList = []
0142 histoSubNames = []
0143 paths = []
0144 massiveMode = False
0145 for plot in toPlot:
0146
0147 argv.remove(plot)
0148 for path in plotList:
0149 if MultipleCompare.Match(plot.lower(),path.lower()):
0150 histoList.append(path)
0151 strippedPath, strippedPlot = StripPath(path)
0152 paths.append(strippedPath)
0153 histoSubNames.append(strippedPlot)
0154
0155 elif plot.find('massiveMode') != -1:
0156 massiveMode = True
0157
0158 CleanArguments(argv,'--output')
0159 CleanArguments(argv,'-o')
0160
0161 outputDir = CreateBaseDirectory(options)
0162
0163 if massiveMode:
0164 print("Massive mode: scan all subdirs and make plots comparing each histogram one by one.")
0165 plotOneByOne(argv, outputDir, histoList, histoSubNames, paths)
0166 else:
0167 print("Default mode: Make default plot combinations.")
0168 plotDefaults(argv, options, outputDir)
0169
0170
0171
0172 if __name__ == '__main__':
0173
0174
0175 sys.exit(main())
0176 else:
0177 print("This is ",__name__)
0178