1 from __future__
import print_function
2 from builtins
import range
3 from optparse
import OptionParser
4 from random
import gauss
7 execfile(
"Alignment/MuonAlignment/data/idealTransformation.py")
11 parser = OptionParser(usage=
"Usage: python %prog outputName [options] (default is unit matrix times 1e-15)")
13 parser.add_option(
"--xx", dest=
"xx", help=
"variance of x (cm*cm)", default=
"1e-15")
14 parser.add_option(
"--xy", dest=
"xy", help=
"covariance of x and y (cm*cm)", default=
"0")
15 parser.add_option(
"--xz", dest=
"xz", help=
"covariance of x and z (cm*cm)", default=
"0")
16 parser.add_option(
"--xphix", dest=
"xphix", help=
"covariance of x and phix (cm*rad)", default=
"0")
17 parser.add_option(
"--xphiy", dest=
"xphiy", help=
"covariance of x and phiy (cm*rad)", default=
"0")
18 parser.add_option(
"--xphiz", dest=
"xphiz", help=
"covariance of x and phiz (cm*rad)", default=
"0")
20 parser.add_option(
"--yy", dest=
"yy", help=
"variance of y (cm*cm)", default=
"1e-15")
21 parser.add_option(
"--yz", dest=
"yz", help=
"covariance of y and z (cm*cm)", default=
"0")
22 parser.add_option(
"--yphix", dest=
"yphix", help=
"covariance of y and phix (cm*rad)", default=
"0")
23 parser.add_option(
"--yphiy", dest=
"yphiy", help=
"covariance of y and phiy (cm*rad)", default=
"0")
24 parser.add_option(
"--yphiz", dest=
"yphiz", help=
"covariance of y and phiz (cm*rad)", default=
"0")
26 parser.add_option(
"--zz", dest=
"zz", help=
"variance of z (cm*cm)", default=
"1e-15")
27 parser.add_option(
"--zphix", dest=
"zphix", help=
"covariance of z and phix (cm*rad)", default=
"0")
28 parser.add_option(
"--zphiy", dest=
"zphiy", help=
"covariance of z and phiy (cm*rad)", default=
"0")
29 parser.add_option(
"--zphiz", dest=
"zphiz", help=
"covariance of z and phiz (cm*rad)", default=
"0")
31 parser.add_option(
"--phixphix", dest=
"phixphix", help=
"variance of phix (rad*rad)", default=
"1e-15")
32 parser.add_option(
"--phixphiy", dest=
"phixphiy", help=
"covariance of phix and phiy (rad*rad)", default=
"0")
33 parser.add_option(
"--phixphiz", dest=
"phixphiz", help=
"covariance of phix and phiz (rad*rad)", default=
"0")
35 parser.add_option(
"--phiyphiy", dest=
"phiyphiy", help=
"variance of phiy (rad*rad)", default=
"1e-15")
36 parser.add_option(
"--phiyphiz", dest=
"phiyphiz", help=
"covariance of phiy and phiz (rad*rad)", default=
"0")
38 parser.add_option(
"--phizphiz", dest=
"phizphiz", help=
"variance of phiz (rad*rad)", default=
"1e-15")
40 parser.add_option(
"-f", dest=
"force", help=
"force overwrite of output files", action=
"store_true")
42 options, args = parser.parse_args()
43 if args
is None or len(args) != 1:
49 if os.path.exists(outputName +
".xml"):
50 raise Exception(outputName +
".xml exists!")
51 if os.path.exists(outputName +
"_convert_cfg.py"):
52 raise Exception(outputName +
"_convert_cfg.py exists!")
53 if os.path.exists(outputName +
".db"):
54 raise Exception(outputName +
".db exists!")
55 if os.path.exists(outputName +
"_correlations.txt"):
56 raise Exception(outputName +
"_correlations.txt exists!")
58 components =
"xx",
"xy",
"xz",
"xphix",
"xphiy",
"xphiz",
"yy",
"yz",
"yphix",
"yphiy",
"yphiz",
"zz",
"zphix",
"zphiy",
"zphiz",
"phixphix",
"phixphiy",
"phixphiz",
"phiyphiy",
"phiyphiz",
"phizphiz" 59 for component
in components:
60 exec(
"%s = float(options.%s)" % (component, component))
64 print(
"Spread in each parameter: x %g mm" % (
sqrt(xx)*10.))
67 print(
" phix %g mrad" % (
sqrt(phixphix)*1000.))
68 print(
" phiy %g mrad" % (
sqrt(phiyphiy)*1000.))
69 print(
" phiz %g mrad" % (
sqrt(phizphiz)*1000.))
72 print(
"Covariance matrix (x, y, z, phix, phiy, phiz):")
73 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xx, xy, xz, xphix, xphiy, xphiz))
74 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xy, yy, yz, yphix, yphiy, yphiz))
75 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xz, yz, zz, zphix, zphiy, zphiz))
76 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xphix, yphix, zphix, phixphix, phixphiy, phixphiz))
77 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xphiy, yphiy, zphiy, phixphiy, phiyphiy, phiyphiz))
78 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xphiz, yphiz, zphiz, phixphiz, phiyphiz, phizphiz))
81 print(
"Correlation (x, y, z, phix, phiy, phiz):")
85 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xphix/
sqrt(phixphix)/
sqrt(xx), yphix/
sqrt(phixphix)/
sqrt(yy), zphix/
sqrt(phixphix)/
sqrt(zz), phixphix/
sqrt(phixphix)/
sqrt(phixphix), phixphiy/
sqrt(phixphix)/
sqrt(phiyphiy), phixphiz/
sqrt(phixphix)/
sqrt(phizphiz)))
86 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xphiy/
sqrt(phiyphiy)/
sqrt(xx), yphiy/
sqrt(phiyphiy)/
sqrt(yy), zphiy/
sqrt(phiyphiy)/
sqrt(zz), phixphiy/
sqrt(phiyphiy)/
sqrt(phixphix), phiyphiy/
sqrt(phiyphiy)/
sqrt(phiyphiy), phiyphiz/
sqrt(phiyphiy)/
sqrt(phizphiz)))
87 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (xphiz/
sqrt(phizphiz)/
sqrt(xx), yphiz/
sqrt(phizphiz)/
sqrt(yy), zphiz/
sqrt(phizphiz)/
sqrt(zz), phixphiz/
sqrt(phizphiz)/
sqrt(phixphix), phiyphiz/
sqrt(phizphiz)/
sqrt(phiyphiy), phizphiz/
sqrt(phizphiz)/
sqrt(phizphiz)))
95 if correlation_coefficient > 1.:
96 raise Exception(
"Correlations must not be larger than one!")
101 """Matrix multiplication: mmult([[11, 12], [21, 22]], [[-1, 0], [0, 1]]) returns [[-11, 12], [-21, 22]]""" 102 return [[sum([i*j
for i, j
in zip(row, col)])
for col
in zip(*b)]
for row
in a]
105 """Applies matrix m to vector v: mvdot([[-1, 0], [0, 1]], [12, 55]) returns [-12, 55]""" 106 return [i[0]
for i
in mmult(m, [[vi]
for vi
in v])]
109 """Matrix transposition: mtrans([[11, 12], [21, 22]]) returns [[11, 21], [12, 22]]""" 110 return [[a[j][i]
for j
in range(len(a[i]))]
for i
in range(len(a))]
113 """Cholesky decomposition of the correlation matrix to properly normalize the transformed random deviates""" 119 for j
in range(len(A[0])):
120 D[j] = A[j][j] - sum([L[j,k]**2 * D[k]
for k
in range(j)])
121 for i
in range(len(A)):
123 L[i,j] = (A[i][j] - sum([L[i,k] * L[j,k] * D[k]
for k
in range(j)])) / D[j]
125 L = [[ 1., 0., 0., 0., 0., 0.],
126 [L[1,0], 1., 0., 0., 0., 0.],
127 [L[2,0], L[2,1], 1., 0., 0., 0.],
128 [L[3,0], L[3,1], L[3,2], 1., 0., 0.],
129 [L[4,0], L[4,1], L[4,2], L[4,1], 1., 0.],
130 [L[5,0], L[5,1], L[5,2], L[5,1], L[5,0], 1.]]
132 Dsqrt = [[
sqrt(D[0]), 0., 0., 0., 0., 0.],
133 [ 0.,
sqrt(D[1]), 0., 0., 0., 0.],
134 [ 0., 0.,
sqrt(D[2]), 0., 0., 0.],
135 [ 0., 0., 0.,
sqrt(D[3]), 0., 0.],
136 [ 0., 0., 0., 0.,
sqrt(D[4]), 0.],
137 [ 0., 0., 0., 0., 0.,
sqrt(D[5])]]
139 return mmult(L, Dsqrt)
141 matrix = [[ xx, xy, xz, xphix, xphiy, xphiz],
142 [ xy, yy, yz, yphix, yphiy, yphiz],
143 [ xz, yz, zz, zphix, zphiy, zphiz],
144 [xphix, yphix, zphix, phixphix, phixphiy, phixphiz],
145 [xphiy, yphiy, zphiy, phixphiy, phiyphiy, phiyphiz],
146 [xphiz, yphiz, zphiz, phixphiz, phiyphiz, phizphiz]]
153 randomunit = [gauss(0., 1.), gauss(0., 1.), gauss(0., 1.), gauss(0., 1.), gauss(0., 1.), gauss(0., 1.)]
154 return mvdot(chomat, randomunit)
158 for wheel
in -2, -1, 0, 1, 2:
159 for station
in 1, 2, 3, 4:
160 for sector
in range(1, 14+1):
161 if station != 4
and sector > 12:
continue 163 misal[
"DT", wheel, station, 0, sector] =
random6dof()
166 for station
in 1, 2, 3, 4:
168 if station > 1
and ring == 3:
continue 169 for sector
in range(1, 36+1):
170 if station > 1
and ring == 1
and sector > 18:
continue 172 misal[
"CSC", endcap, station, ring, sector] =
random6dof()
205 for xi, yi, zi, phixi, phiyi, phizi
in misal.values():
216 sum_xphix += xi*phixi
217 sum_xphiy += xi*phiyi
218 sum_xphiz += xi*phizi
221 sum_yphix += yi*phixi
222 sum_yphiy += yi*phiyi
223 sum_yphiz += yi*phizi
225 sum_zphix += zi*phixi
226 sum_zphiy += zi*phiyi
227 sum_zphiz += zi*phizi
228 sum_phixphix += phixi*phixi
229 sum_phixphiy += phixi*phiyi
230 sum_phixphiz += phixi*phizi
231 sum_phiyphiy += phiyi*phiyi
232 sum_phiyphiz += phiyi*phizi
233 sum_phizphiz += phizi*phizi
238 ave_phix = sum_phix/
float(len(misal))
239 ave_phiy = sum_phiy/
float(len(misal))
240 ave_phiz = sum_phiz/
float(len(misal))
245 ave_xphix = sum_xphix/
float(len(misal))
246 ave_xphiy = sum_xphiy/
float(len(misal))
247 ave_xphiz = sum_xphiz/
float(len(misal))
250 ave_yphix = sum_yphix/
float(len(misal))
251 ave_yphiy = sum_yphiy/
float(len(misal))
252 ave_yphiz = sum_yphiz/
float(len(misal))
254 ave_zphix = sum_zphix/
float(len(misal))
255 ave_zphiy = sum_zphiy/
float(len(misal))
256 ave_zphiz = sum_zphiz/
float(len(misal))
257 ave_phixphix = sum_phixphix/
float(len(misal))
258 ave_phixphiy = sum_phixphiy/
float(len(misal))
259 ave_phixphiz = sum_phixphiz/
float(len(misal))
260 ave_phiyphiy = sum_phiyphiy/
float(len(misal))
261 ave_phiyphiz = sum_phiyphiz/
float(len(misal))
262 ave_phizphiz = sum_phizphiz/
float(len(misal))
264 print(
"Estimated covariance matrix from %d chambers (x, y, z, phix, phiy, phiz):" % len(misal))
265 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xx, ave_xy, ave_xz, ave_xphix, ave_xphiy, ave_xphiz))
266 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xy, ave_yy, ave_yz, ave_yphix, ave_yphiy, ave_yphiz))
267 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xz, ave_yz, ave_zz, ave_zphix, ave_zphiy, ave_zphiz))
268 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xphix, ave_yphix, ave_zphix, ave_phixphix, ave_phixphiy, ave_phixphiz))
269 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xphiy, ave_yphiy, ave_zphiy, ave_phixphiy, ave_phiyphiy, ave_phiyphiz))
270 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xphiz, ave_yphiz, ave_zphiz, ave_phixphiz, ave_phiyphiz, ave_phizphiz))
273 print(
"Estimated correlation from %d chambers (x, y, z, phix, phiy, phiz):" % len(misal))
274 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xx/
sqrt(ave_xx)/
sqrt(ave_xx), ave_xy/
sqrt(ave_xx)/
sqrt(ave_yy), ave_xz/
sqrt(ave_xx)/
sqrt(ave_zz), ave_xphix/
sqrt(ave_xx)/
sqrt(ave_phixphix), ave_xphiy/
sqrt(ave_xx)/
sqrt(ave_phiyphiy), ave_xphiz/
sqrt(ave_xx)/
sqrt(ave_phizphiz)))
275 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xy/
sqrt(ave_yy)/
sqrt(ave_xx), ave_yy/
sqrt(ave_yy)/
sqrt(ave_yy), ave_yz/
sqrt(ave_yy)/
sqrt(ave_zz), ave_yphix/
sqrt(ave_yy)/
sqrt(ave_phixphix), ave_yphiy/
sqrt(ave_yy)/
sqrt(ave_phiyphiy), ave_yphiz/
sqrt(ave_yy)/
sqrt(ave_phizphiz)))
276 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xz/
sqrt(ave_zz)/
sqrt(ave_xx), ave_yz/
sqrt(ave_zz)/
sqrt(ave_yy), ave_zz/
sqrt(ave_zz)/
sqrt(ave_zz), ave_zphix/
sqrt(ave_zz)/
sqrt(ave_phixphix), ave_zphiy/
sqrt(ave_zz)/
sqrt(ave_phiyphiy), ave_zphiz/
sqrt(ave_zz)/
sqrt(ave_phizphiz)))
277 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xphix/
sqrt(ave_phixphix)/
sqrt(ave_xx), ave_yphix/
sqrt(ave_phixphix)/
sqrt(ave_yy), ave_zphix/
sqrt(ave_phixphix)/
sqrt(ave_zz), ave_phixphix/
sqrt(ave_phixphix)/
sqrt(ave_phixphix), ave_phixphiy/
sqrt(ave_phixphix)/
sqrt(ave_phiyphiy), ave_phixphiz/
sqrt(ave_phixphix)/
sqrt(ave_phizphiz)))
278 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xphiy/
sqrt(ave_phiyphiy)/
sqrt(ave_xx), ave_yphiy/
sqrt(ave_phiyphiy)/
sqrt(ave_yy), ave_zphiy/
sqrt(ave_phiyphiy)/
sqrt(ave_zz), ave_phixphiy/
sqrt(ave_phiyphiy)/
sqrt(ave_phixphix), ave_phiyphiy/
sqrt(ave_phiyphiy)/
sqrt(ave_phiyphiy), ave_phiyphiz/
sqrt(ave_phiyphiy)/
sqrt(ave_phizphiz)))
279 print(
"%11.8f %11.8f %11.8f %11.8f %11.8f %11.8f" % (ave_xphiz/
sqrt(ave_phizphiz)/
sqrt(ave_xx), ave_yphiz/
sqrt(ave_phizphiz)/
sqrt(ave_yy), ave_zphiz/
sqrt(ave_phizphiz)/
sqrt(ave_zz), ave_phixphiz/
sqrt(ave_phizphiz)/
sqrt(ave_phixphix), ave_phiyphiz/
sqrt(ave_phizphiz)/
sqrt(ave_phiyphiy), ave_phizphiz/
sqrt(ave_phizphiz)/
sqrt(ave_phizphiz)))
285 if os.path.exists(outputName +
".xml"):
286 os.unlink(outputName +
".xml")
287 if os.path.exists(outputName +
"_convert_cfg.py"):
288 os.unlink(outputName +
"_convert_cfg.py")
289 if os.path.exists(outputName +
".db"):
290 os.unlink(outputName +
".db")
291 if os.path.exists(outputName +
"_correlations.txt"):
292 os.unlink(outputName +
"_correlations.txt")
296 txtfile =
file(outputName +
"_correlations.txt",
"w")
297 for wheel
in -2, -1, 0, 1, 2:
298 for station
in 1, 2, 3, 4:
299 for sector
in range(1, 14+1):
300 if station != 4
and sector > 12:
continue 301 txtfile.write(
"DT %(wheel)d %(station)d %(sector)d %(xx)g %(xy)g %(xz)g %(xphix)g %(xphiy)g %(xphiz)g %(yy)g %(yz)g %(yphix)g %(yphiy)g %(yphiz)g %(zz)g %(zphix)g %(zphiy)g %(zphiz)g %(phixphix)g %(phixphiy)g %(phixphiz)g %(phiyphiy)g %(phiyphiz)g %(phizphiz)g\n" % vars())
304 for station
in 1, 2, 3, 4:
306 if station > 1
and ring == 3:
continue 307 for sector
in range(1, 36+1):
308 if station > 1
and ring == 1
and sector > 18:
continue 309 txtfile.write(
"CSC %(endcap)d %(station)d %(ring)d %(sector)d %(xx)g %(xy)g %(xz)g %(xphix)g %(xphiy)g %(xphiz)g %(yy)g %(yz)g %(yphix)g %(yphiy)g %(yphiz)g %(zz)g %(zphix)g %(zphiy)g %(zphiz)g %(phixphix)g %(phixphiy)g %(phixphiz)g %(phiyphiy)g %(phiyphiz)g %(phizphiz)g\n" % vars())
313 xmlfile =
file(outputName +
".xml",
"w")
314 xmlfile.write(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
315 xmlfile.write(
"<?xml-stylesheet type=\"text/xml\" href=\"MuonAlignment.xsl\"?>\n")
316 xmlfile.write(
"<MuonAlignment>\n\n")
318 for (system, whendcap, station, ring, sector), (xi, yi, zi, phixi, phiyi, phizi)
in misal.items():
319 if system ==
"DT": wheel = whendcap
320 if system ==
"CSC": endcap = whendcap
322 rot = rotation[system, whendcap, station, ring, sector]
323 localape = [[xx, xy, xz], [xy, yy, yz], [xz, yz, zz]]
325 globalxx = globalape[0][0]
326 globalxy = globalape[0][1]
327 globalxz = globalape[0][2]
328 globalyy = globalape[1][1]
329 globalyz = globalape[1][2]
330 globalzz = globalape[2][2]
332 xmlfile.write(
"<operation>\n")
335 xmlfile.write(
" <DTChamber wheel=\"%(wheel)d\" station=\"%(station)d\" sector=\"%(sector)d\" />\n" % vars())
337 xmlfile.write(
" <CSCChamber endcap=\"%(endcap)d\" station=\"%(station)d\" ring=\"%(ring)d\" chamber=\"%(sector)d\" />\n" % vars())
340 if (station, ring) == (1, 1):
341 xmlfile.write(
" <CSCChamber endcap=\"%(endcap)d\" station=\"%(station)d\" ring=\"4\" chamber=\"%(sector)d\" />\n" % vars())
343 xmlfile.write(
" <setposition relativeto=\"ideal\" x=\"%(xi)g\" y=\"%(yi)g\" z=\"%(zi)g\" phix=\"%(phixi)g\" phiy=\"%(phiyi)g\" phiz=\"%(phizi)g\" />\n" % vars())
344 xmlfile.write(
" <setape xx=\"%(globalxx)g\" xy=\"%(globalxy)g\" xz=\"%(globalxz)g\" yy=\"%(globalyy)g\" yz=\"%(globalyz)g\" zz=\"%(globalzz)g\" />\n" % vars())
345 xmlfile.write(
"</operation>\n\n")
347 xmlfile.write(
"</MuonAlignment>\n")
352 cfgfile =
file(outputName +
"_convert_cfg.py",
"w")
354 cfgfile.write(
"""import FWCore.ParameterSet.Config as cms 356 process = cms.Process("CONVERT") 357 process.source = cms.Source("EmptySource") 358 process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(1)) 360 process.load("Configuration.StandardSequences.GeometryDB_cff") 361 process.load("Geometry.MuonNumbering.muonNumberingInitialization_cfi") 363 process.MuonGeometryDBConverter = cms.EDAnalyzer("MuonGeometryDBConverter", 364 input = cms.string("xml"), 365 fileName = cms.string("%(outputName)s.xml"), 366 shiftErr = cms.double(1000.), 367 angleErr = cms.double(6.28), 369 output = cms.string("db") 372 process.load("CondCore.DBCommon.CondDBSetup_cfi") 373 process.PoolDBOutputService = cms.Service("PoolDBOutputService", 375 connect = cms.string("sqlite_file:%(outputName)s.db"), 376 toPut = cms.VPSet(cms.PSet(record = cms.string("DTAlignmentRcd"), tag = cms.string("DTAlignmentRcd")), 377 cms.PSet(record = cms.string("DTAlignmentErrorExtendedRcd"), tag = cms.string("DTAlignmentErrorExtendedRcd")), 378 cms.PSet(record = cms.string("CSCAlignmentRcd"), tag = cms.string("CSCAlignmentRcd")), 379 cms.PSet(record = cms.string("CSCAlignmentErrorExtendedRcd"), tag = cms.string("CSCAlignmentErrorExtendedRcd")))) 381 process.Path = cms.Path(process.MuonGeometryDBConverter) 384 print(
"To create an SQLite file for this geometry (%(outputName)s.db), run the following:" % vars())
386 os.system(
"echo cmsRun %s_convert_cfg.py" % outputName)
def random6dof()
Generate correlated random misalignments for all chambers.
S & print(S &os, JobReport::InputFile const &f)
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
Abs< T >::type abs(const T &t)
def mmult(a, b)
Print out user's choices as diagnostics.