Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-11-25 02:29:02

0001 #!/usr/bin/env python3
0002 
0003 import os
0004 import sys
0005 
0006 if "CMSSW_BASE" not in os.environ:
0007     print("You need to source the CMSSW environment first.")
0008     sys.exit(1)
0009 
0010 required_version = (2,7)
0011 if sys.version_info < required_version:
0012     print("Your Python interpreter is too old. Need version 2.7 or higher.")
0013     sys.exit(1)
0014 
0015 import argparse
0016 
0017 import HLTrigger.Tools.rrapi as rrapi
0018 from FWCore.PythonUtilities.LumiList import LumiList
0019 
0020 
0021 def main(argv = None):
0022     """Main routine of the script.
0023 
0024     Arguments:
0025     - `argv`: arguments passed to the main routine
0026     """
0027 
0028     if argv == None:
0029         argv = sys.argv[1:]
0030 
0031     parser = argparse.ArgumentParser(
0032         description="Create JSON selection for a given magnetic field.")
0033     parser.add_argument("-i", "--input", dest="input", metavar="JSON",
0034                         type=str, help="input JSON file")
0035     parser.add_argument("-o", "--output", dest="output", metavar="JSON",
0036                         type=str, help="output JSON file")
0037     parser.add_argument("--min", dest="min", metavar="RUN", type=int,
0038                         help="first run to be considered in the selection")
0039     parser.add_argument("--max", dest="max", metavar="RUN", type=int,
0040                         help="last run to be considered in the selection")
0041     parser.add_argument("--epsilon", dest="epsilon", metavar="TESLA",
0042                         default=0.1, type=float,
0043                         help="precision of the filter (default: %(default)s T)")
0044     parser.add_argument("--debug", dest="debug", action="store_true",
0045                         help="show more verbose output")
0046     required = parser.add_argument_group("required arguments")
0047     required.add_argument("--b-field", dest="bfield", metavar="TESLA",
0048                           required=True, type=float,
0049                           help="magnetic field to filter")
0050     args = parser.parse_args(argv)
0051 
0052 
0053     try:
0054         if args.input == None and (args.min == None or args.max == None):
0055             msg = ("If no input JSON file ('--input') is provided, you have to "
0056                    "explicitly provide the first ('--min') and last ('--max') "
0057                    "run.")
0058             raise RuntimeError(msg)
0059 
0060         if args.min != None and args.max != None and args.min > args.max:
0061             msg = "First run ({min:d}) is after last run ({max:d})."
0062             msg = msg.format(**args.__dict__)
0063             raise RuntimeError(msg)
0064 
0065         if args.max != None and args.max <= 0:
0066             msg = "Last run must be greater than zero: max = {0:d} <= 0."
0067             msg = msg.format(args.max)
0068             raise RuntimeError(msg)
0069     except RuntimeError as e:
0070         if args.debug: raise
0071         print(">>>", os.path.splitext(os.path.basename(__file__))[0]+":", str(e))
0072         sys.exit(1)
0073 
0074 
0075     lumi_list = None if not args.input else LumiList(filename = args.input)
0076     input_runs = None if not lumi_list else [int(r) for r in lumi_list.getRuns()]
0077 
0078     # Run registry API: https://twiki.cern.ch/twiki/bin/viewauth/CMS/DqmRrApi
0079     URL = "http://runregistry.web.cern.ch/runregistry/"
0080     api = rrapi.RRApi(URL, debug = args.debug)
0081 
0082     if api.app != "user": return
0083 
0084     column_list = ("number",)
0085     min_run = args.min if args.min != None else input_runs[0]
0086     max_run = args.max if args.max != None else input_runs[-1]
0087     bfield_min = args.bfield - args.epsilon
0088     bfield_max = args.bfield + args.epsilon
0089     constraints = {
0090         "datasetExists": "= true",
0091         "number": ">= {0:d} and <= {1:d}".format(min_run, max_run),
0092         "bfield": "> {0:f} and < {1:f}".format(bfield_min, bfield_max)
0093         }
0094 
0095     run_list = [item["number"] for item in
0096                 api.data(workspace = "GLOBAL", table = "runsummary",
0097                          template = "json", columns = column_list,
0098                          filter = constraints)]
0099 
0100     if lumi_list != None:
0101         runs_to_remove = []
0102         for run in input_runs:
0103             if run not in run_list: runs_to_remove.append(run)
0104         lumi_list.removeRuns(runs_to_remove)
0105     else:
0106         lumi_list = LumiList(runs = run_list)
0107 
0108     if args.output != None:
0109         lumi_list.writeJSON(args.output)
0110         with open(args.output+".args", "w") as f:
0111             f.write(" ".join(argv)+"\n")
0112     else:
0113         print(lumi_list)
0114 
0115 
0116 
0117 if __name__ == "__main__":
0118     main()