File indexing completed on 2023-03-17 11:28:55
0001
0002
0003 from __future__ import print_function
0004 import os
0005 import argparse
0006
0007 from Validation.RecoTrack.plotting.validation import SimpleValidation, SimpleSample
0008 import Validation.RecoTrack.plotting.trackingPlots as trackingPlots
0009 import Validation.RecoVertex.plotting.vertexPlots as vertexPlots
0010 import Validation.RecoTrack.plotting.plotting as plotting
0011
0012 class LimitTrackAlgo:
0013 def __init__(self, algos, includePtCut):
0014 self._algos = algos
0015 self._includePtCut = includePtCut
0016 def __call__(self, algo, quality):
0017 if self._algos is not None and algo not in self._algos:
0018 return False
0019 if not self._includePtCut and "Pt09" in quality:
0020 return False
0021 return True
0022
0023 def limitRelVal(algo, quality):
0024 return quality in ["", "highPurity", "ByOriginalAlgo", "highPurityByOriginalAlgo"]
0025
0026 def main(opts):
0027 sample = SimpleSample(opts.subdirprefix, opts.html_sample, [(f, f.replace(".root", "")) for f in opts.files])
0028
0029 drawArgs={}
0030 if opts.no_ratio:
0031 drawArgs["ratio"] = False
0032 if opts.separate:
0033 drawArgs["separate"] = True
0034 if opts.png:
0035 drawArgs["saveFormat"] = ".png"
0036 if opts.verbose:
0037 plotting.verbose = True
0038
0039 val = SimpleValidation([sample], opts.outputDir)
0040 htmlReport = val.createHtmlReport(validationName=opts.html_validation_name)
0041
0042 limitProcessing = LimitTrackAlgo(opts.limit_tracking_algo, includePtCut=opts.ptcut)
0043 kwargs_tracking = {
0044 "limitSubFoldersOnlyTo": {
0045 "": limitProcessing,
0046 "allTPEffic": limitProcessing,
0047 "fromPV": limitProcessing,
0048 "fromPVAllTP": limitProcessing,
0049 "tpPtLess09": limitProcessing,
0050 "tpEtaGreater2p7": limitProcessing,
0051 "seeding": limitProcessing,
0052 "building": limitProcessing,
0053 "bhadron": limitProcessing,
0054 "displaced": limitProcessing,
0055 }
0056 }
0057 if opts.limit_relval:
0058 ignore = lambda a,q: False
0059 kwargs_tracking["limitSubFoldersOnlyTo"] = {
0060 "": limitRelVal,
0061 "allTPEffic": ignore,
0062 "fromPV": ignore,
0063 "fromPVAllTP": ignore,
0064 "tpPtLess09": limitRelVal,
0065 "tpEtaGreater2p7": limitRelVal,
0066 "seeding": ignore,
0067 "bhadron": limitRelVal,
0068 "displaced": limitRelVal,
0069 }
0070
0071 trk = [trackingPlots.plotter]
0072 other = [trackingPlots.timePlotter, vertexPlots.plotter, trackingPlots.plotterHLT]
0073 if opts.extended:
0074 trk.append(trackingPlots.plotterExt)
0075 other.extend([vertexPlots.plotterExt, trackingPlots.plotterHLTExt])
0076 val.doPlots(trk, plotterDrawArgs=drawArgs, **kwargs_tracking)
0077 val.doPlots(other, plotterDrawArgs=drawArgs)
0078 print()
0079 if opts.no_html:
0080 print("Plots created into directory '%s'." % opts.outputDir)
0081 else:
0082 htmlReport.write()
0083 print("Plots and HTML report created into directory '%s'. You can just move it to some www area and access the pages via web browser" % opts.outputDir)
0084
0085 if __name__ == "__main__":
0086 parser = argparse.ArgumentParser(description="Create standard set of tracking validation plots from one or more DQM files.\nNote that for timing plots you have to include FastTimerService (typically it gets included via DQM/VALIDATION), and set\nprocess.FastTimerService.enableDQMbyPath = True")
0087 parser.add_argument("files", metavar="file", type=str, nargs="+",
0088 help="DQM file to plot the validation plots from")
0089 parser.add_argument("-o", "--outputDir", type=str, default="plots",
0090 help="Plot output directory (default: 'plots')")
0091 parser.add_argument("--subdirprefix", type=str, default="plots",
0092 help="Prefix for subdirectories inside outputDir (default: 'plots')")
0093 parser.add_argument("--no-ratio", action="store_true",
0094 help="Disable ratio pads")
0095 parser.add_argument("--separate", action="store_true",
0096 help="Save all plots separately instead of grouping them")
0097 parser.add_argument("--png", action="store_true",
0098 help="Save plots in PNG instead of PDF")
0099 parser.add_argument("--limit-tracking-algo", type=str, default=None,
0100 help="Comma separated list of tracking algos to limit to. (default: all algos; conflicts with --limit-relval)")
0101 parser.add_argument("--limit-relval", action="store_true",
0102 help="Limit set of plots to those in release validation (almost). (default: all plots in the DQM files; conflicts with --limit-tracking-algo)")
0103 parser.add_argument("--ptcut", action="store_true",
0104 help="Include plots with pT > 0.9 GeV cut (with --limit-relval, does not have any effect)")
0105 parser.add_argument("--extended", action="store_true",
0106 help="Include extended set of plots (e.g. bunch of distributions; default off)")
0107 parser.add_argument("--no-html", action="store_true",
0108 help="Disable HTML page genration")
0109 parser.add_argument("--html-sample", default="Sample",
0110 help="Sample name for HTML page generation (default 'Sample')")
0111 parser.add_argument("--html-validation-name", default="",
0112 help="Validation name for HTML page generation (enters to <title> element) (default '')")
0113 parser.add_argument("--verbose", action="store_true",
0114 help="Be verbose")
0115
0116 group = parser.add_argument_group("deprecated arguments (they have no effect and will be removed in the future):")
0117 group.add_argument("--ignoreMissing", action="store_true",
0118 help="Ignore missing histograms and directories (deprecated, is this is already the default mode)")
0119 group.add_argument("--ratio", action="store_true",
0120 help="Create ratio pads (deprecated, as it is already the default")
0121 group.add_argument("--html", action="store_true",
0122 help="Generate HTML pages (deprecated, as it is already the default")
0123
0124 opts = parser.parse_args()
0125 for f in opts.files:
0126 if not os.path.exists(f):
0127 parser.error("DQM file %s does not exist" % f)
0128
0129 if opts.ignoreMissing:
0130 print("--ignoreMissing is now the only operation mode, so you can stop using this parameter")
0131
0132 if opts.ratio:
0133 print("--ratio is now the default, so you can stop using this parameter")
0134
0135 if opts.html:
0136 print("--html is now the default, so you can stop using this parameter")
0137
0138 if opts.limit_tracking_algo is not None:
0139 if opts.limit_relval:
0140 parser.error("--limit-tracking-algo and --limit-relval conflict with each other")
0141 opts.limit_tracking_algo = opts.limit_tracking_algo.split(",")
0142
0143 if opts.limit_relval and opts.ptcut:
0144 print("With --limit-relval enabled, --ptcut option does not have any effect")
0145
0146 main(opts)