File indexing completed on 2023-03-17 10:39:49
0001
0002
0003 from __future__ import print_function
0004 import sys, optparse, re, math
0005 from Alignment.MuonAlignment.geometryXMLparser import MuonGeometry
0006
0007 usage = """./%prog GeomGlobal.xml AbsConstrints.[phiy|phipos|phiz] frameName
0008
0009 Calculates constraints from AbsConstraints relative to GeomGlobal for
0010 use in CSCOverlapsAlignmentAlgorithm. Assumes that constraints (including
0011 chamber names) are properly formatted.
0012
0013 GeomGlobal CSC geometry represented as a relativeto="none" XML file
0014 (standard format--- must be MuonGeometryDBConverter output)
0015 AbsConstrints text file listing absolute phiy, phipos, or phiz constraints
0016 as "chambername measuredvalue uncertainty"
0017 frameName name of coordinate system frame (all constraints are
0018 relative to this coordinate system"""
0019
0020 parser = optparse.OptionParser(usage)
0021 parser.add_option("--scaleErrors",
0022 help="factor to scale errors: 1 is default, 10 *weakens* constraint by a factor of 10, etc.",
0023 type="string",
0024 default=1,
0025 dest="scaleErrors")
0026 parser.add_option("--disks",
0027 help="align whole disks, rather than individual rings",
0028 action="store_true",
0029 dest="disks")
0030
0031 if len(sys.argv) < 4:
0032 raise SystemError("Too few arguments.\n\n"+parser.format_help())
0033
0034 if sys.argv[2][-5:] == ".phiy": mode = "phiy"
0035 elif sys.argv[2][-7:] == ".phipos": mode = "phipos"
0036 elif sys.argv[2][-5:] == ".phiz": mode = "phiz"
0037 else: raise Exception
0038
0039 geometry = MuonGeometry(sys.argv[1])
0040 constraints = file(sys.argv[2])
0041 frameName = sys.argv[3]
0042
0043 options, args = parser.parse_args(sys.argv[4:])
0044 options.scaleErrors = float(options.scaleErrors)
0045
0046 empty = True
0047 byRing = {"ME+1/1": [], "ME+1/2": [], "ME+2/1": [], "ME+2/2": [], "ME+3/1": [], "ME+3/2": [], "ME+4/1": [], "ME+4/2": [], "ME-1/1": [], "ME-1/2": [], "ME-2/1": [], "ME-2/2": [], "ME-3/1": [], "ME-3/2": [], "ME-4/1": [], "ME-4/2": []}
0048 if options.disks: byRing = {"ME+1/1": [], "YE+1": [], "YE+2": [], "ME+4/1": [], "ME+4/2": [], "ME-1/1": [], "YE-1": [], "YE-2": [], "ME-4/1": [], "ME-4/2": []}
0049
0050 for line in constraints.readlines():
0051 match = re.match(r"(ME[\+\-/0-9]+)\s+([\+\-\.eE0-9]+)\s+([\+\-\.eE0-9]+)", line)
0052 if match is not None:
0053 chamber, value, error = match.groups()
0054 ringName = chamber[0:6]
0055 value = float(value)
0056 error = float(error) * options.scaleErrors
0057
0058 if options.disks:
0059 if ringName in ("ME+1/2", "ME+1/3"): ringName = "YE+1"
0060 elif ringName in ("ME+2/1", "ME+2/2", "ME+3/1", "ME+3/2"): ringName = "YE+2"
0061 elif ringName in ("ME-1/2", "ME-1/3"): ringName = "YE-1"
0062 elif ringName in ("ME-2/1", "ME-2/2", "ME-3/1", "ME-3/2"): ringName = "YE-2"
0063
0064 if chamber[2] == "+": endcap = 1
0065 elif chamber[2] == "-": endcap = 2
0066 else: raise Exception
0067 station = int(chamber[3])
0068 ring = int(chamber[5])
0069 cham = int(chamber[7:9])
0070
0071 if mode == "phiy":
0072 geom = geometry.csc[endcap, station, ring, cham].phiy
0073 elif mode == "phipos":
0074 geom = math.atan2(geometry.csc[endcap, station, ring, cham].y, geometry.csc[endcap, station, ring, cham].x)
0075 elif mode == "phiz":
0076 geom = geometry.csc[endcap, station, ring, cham].phiz
0077
0078 relative = value - geom
0079
0080 if mode in ("phiy", "phipos", "phiz"):
0081 while relative > math.pi: relative -= 2.*math.pi
0082 while relative <= -math.pi: relative += 2.*math.pi
0083
0084 if ringName in byRing:
0085 byRing[ringName].append("""cms.PSet(i = cms.string("%(frameName)s"), j = cms.string("%(chamber)s"), value = cms.double(%(relative)g), error = cms.double(%(error)g))""" % vars())
0086 empty = False
0087
0088 if not empty:
0089 keys = sorted(byRing.keys())
0090 print("for fitter in process.looper.algoConfig.fitters:")
0091 for ringName in keys:
0092 if len(byRing[ringName]) > 0:
0093 print(" if fitter.name.value() == \"%(ringName)s\":" % vars())
0094 print(" fitter.alignables.append(\"%(frameName)s\")" % vars())
0095 for line in byRing[ringName]:
0096 print(" fitter.constraints.append(%(line)s)" % vars())