File indexing completed on 2024-11-25 02:29:02
0001
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
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()