3 import os, sys, re, optparse, math
6 for i
in range(len(copyargs)):
9 if copyargs[i].
find(
" ") != -1:
10 copyargs[i] =
"\"%s\"" % copyargs[i]
11 commandline =
" ".
join(copyargs)
13 usage =
"""./%prog DIRNAME PATTERN INITIALGEOM INPUTFILES [options]
15 Creates (overwrites) a directory for each word in PATTERN and creates
16 (overwrites) submitJobs.sh with the submission sequence and
19 DIRNAME directories will be named DIRNAME01, DIRNAME02, etc.
20 PATTERN a quoted combination of "phiy", "phipos", "phiz"
21 INITIALGEOM SQLite file containing muon geometry with tag names
22 CSCAlignmentRcd, CSCAlignmentErrorRcd
23 INPUTFILES Python file defining 'fileNames', a list of input files as
26 parser = optparse.OptionParser(usage)
27 parser.add_option(
"-j",
"--jobs",
28 help=
"approximate number of \"gather\" subjobs",
32 parser.add_option(
"-s",
"--submitJobs",
33 help=
"alternate name of submitJobs.sh script (please include .sh extension); a file with this name will be OVERWRITTEN",
35 default=
"submitJobs.sh",
37 parser.add_option(
"-b",
"--big",
38 help=
"if invoked, subjobs will also be run on cmscaf1nd",
41 parser.add_option(
"--globalTag",
42 help=
"GlobalTag for calibration conditions",
44 default=
"GR_R_35X_V8A::All",
46 parser.add_option(
"--photogrammetry",
47 help=
"if invoked, alignment will be constrained to photogrammetry",
49 dest=
"photogrammetry")
50 parser.add_option(
"--photogrammetryScale",
51 help=
"scale factor for photogrammetry constraint: 1 is default and 10 *weakens* the constraint by a factor of 10",
54 dest=
"photogrammetryScale")
55 parser.add_option(
"--disks",
56 help=
"align whole disks, rather than individual rings",
60 parser.add_option(
"--minP",
61 help=
"minimum track momentum (measured via radial component of fringe fields)",
65 parser.add_option(
"--minHitsPerChamber",
66 help=
"minimum number of hits per chamber",
69 dest=
"minHitsPerChamber")
70 parser.add_option(
"--maxdrdz",
71 help=
"maximum dr/dz of tracklets (anti-cosmic cut)",
75 parser.add_option(
"--maxRedChi2",
76 help=
"maximum reduced chi^2 of tracks",
80 parser.add_option(
"--fiducial",
81 help=
"if invoked, select only segments within the good region of the chamber (for all 6 layers)",
84 parser.add_option(
"--useHitWeights",
85 help=
"if invoked, use hit weights in tracklet fits",
88 parser.add_option(
"--truncateSlopeResid",
89 help=
"maximum allowed slope residual in mrad (like the histograms in a phiy job)",
92 dest=
"truncateSlopeResid")
93 parser.add_option(
"--truncateOffsetResid",
94 help=
"maximum allowed offset residual in mm (like the histograms in a phipos or phiz job)",
97 dest=
"truncateOffsetResid")
98 parser.add_option(
"--combineME11",
99 help=
"if invoked, combine ME1/1a and ME1/1b chambers",
102 parser.add_option(
"--useTrackWeights",
103 help=
"if invoked, weight residuals by track uncertainties",
105 dest=
"useTrackWeights")
106 parser.add_option(
"--errorFromRMS",
107 help=
"if invoked, determine residuals uncertainties from the RMS of the residuals distribution",
110 parser.add_option(
"--minTracksPerOverlap",
111 help=
"minimum number of tracks needed for an overlap constraint to be valid",
114 dest=
"minTracksPerOverlap")
115 parser.add_option(
"--slopeFromTrackRefit",
116 help=
"if invoked, determine direction of tracklets by refitting track to all other stations",
118 dest=
"slopeFromTrackRefit")
119 parser.add_option(
"--minStationsInTrackRefits",
120 help=
"minimum number of stations in a full track refit (slopeFromTrackRefit)",
123 dest=
"minStationsInTrackRefits")
125 if len(sys.argv) < 5:
126 raise SystemError,
"Too few arguments.\n\n"+parser.format_help()
128 DIRNAME = sys.argv[1]
129 PATTERN = re.split(
"\s+", sys.argv[2])
130 INITIALGEOM = sys.argv[3]
131 INPUTFILES = sys.argv[4]
133 options, args = parser.parse_args(sys.argv[5:])
134 globaltag = options.globaltag
135 photogrammetry = options.photogrammetry
136 photogrammetryScale = options.photogrammetryScale
137 disks = options.disks
139 minHitsPerChamber = options.minHitsPerChamber
140 maxdrdz = options.maxdrdz
141 maxRedChi2 = options.maxRedChi2
142 fiducial = options.fiducial
143 useHitWeights = options.useHitWeights
144 truncateSlopeResid = options.truncateSlopeResid
145 truncateOffsetResid = options.truncateOffsetResid
146 combineME11 = options.combineME11
147 useTrackWeights = options.useTrackWeights
148 errorFromRMS = options.errorFromRMS
149 minTracksPerOverlap = options.minTracksPerOverlap
150 slopeFromTrackRefit = options.slopeFromTrackRefit
151 minStationsInTrackRefits = options.minStationsInTrackRefits
154 stepsize = int(math.ceil(1.*len(fileNames)/options.subjobs))
155 pwd = str(os.getcwdu())
157 bsubfile = [
"#!/bin/sh",
""]
162 for i, mode
in enumerate(PATTERN):
165 inputdb = INITIALGEOM
166 inputdbdir = directory[:]
168 inputdb = director +
".db"
169 inputdbdir = directory[:]
171 directory =
"%s%02d/" % (DIRNAME, iteration)
172 director = directory[:-1]
173 os.system(
"rm -rf %s; mkdir %s" % (directory, directory))
174 os.system(
"cp gatherBH_cfg.py %s" % directory)
175 os.system(
"cp alignBH_cfg.py %s" % directory)
177 bsubfile.append(
"cd %s" % directory)
180 if photogrammetry
and (mode ==
"phipos" or mode ==
"phiz"):
182 if disks: diskswitch =
"--disks "
184 constraints +=
"""export ALIGNMENT_CONVERTXML=%(inputdb)s
185 cmsRun $ALIGNMENT_AFSDIR/Alignment/MuonAlignmentAlgorithms/python/convertToXML_global_cfg.py
186 python $ALIGNMENT_AFSDIR/Alignment/MuonAlignmentAlgorithms/scripts/relativeConstraints.py %(inputdb)s_global.xml $ALIGNMENT_AFSDIR/Alignment/MuonAlignmentAlgorithms/data/Photogrammetry2007.%(mode)s PGFrame --scaleErrors %(photogrammetryScale)s %(diskswitch)s> constraints_cff.py""" % vars()
188 constraints +=
"""echo \"\" > constraints_cff.py"""
190 for jobnumber
in range(options.subjobs):
191 gather_fileName =
"%sgather%03d.sh" % (directory, jobnumber)
192 inputfiles =
" ".
join(fileNames[jobnumber*stepsize:(jobnumber+1)*stepsize])
194 if len(inputfiles) > 0:
195 file(gather_fileName,
"w").write(
"""#/bin/sh
198 export ALIGNMENT_CAFDIR=`pwd`
201 eval `scramv1 run -sh`
202 export ALIGNMENT_AFSDIR=`pwd`
204 export ALIGNMENT_INPUTFILES='%(inputfiles)s'
205 export ALIGNMENT_ITERATION=%(iteration)d
206 export ALIGNMENT_MODE=%(mode)s
207 export ALIGNMENT_JOBNUMBER=%(jobnumber)d
208 export ALIGNMENT_INPUTDB=%(inputdb)s
209 export ALIGNMENT_GLOBALTAG=%(globaltag)s
210 export ALIGNMENT_PHOTOGRAMMETRY=%(photogrammetry)s
211 export ALIGNMENT_DISKS=%(disks)s
212 export ALIGNMENT_minP=%(minP)s
213 export ALIGNMENT_minHitsPerChamber=%(minHitsPerChamber)s
214 export ALIGNMENT_maxdrdz=%(maxdrdz)s
215 export ALIGNMENT_maxRedChi2=%(maxRedChi2)s
216 export ALIGNMENT_fiducial=%(fiducial)s
217 export ALIGNMENT_useHitWeights=%(useHitWeights)s
218 export ALIGNMENT_truncateSlopeResid=%(truncateSlopeResid)s
219 export ALIGNMENT_truncateOffsetResid=%(truncateOffsetResid)s
220 export ALIGNMENT_combineME11=%(combineME11)s
221 export ALIGNMENT_useTrackWeights=%(useTrackWeights)s
222 export ALIGNMENT_errorFromRMS=%(errorFromRMS)s
223 export ALIGNMENT_minTracksPerOverlap=%(minTracksPerOverlap)s
224 export ALIGNMENT_slopeFromTrackRefit=%(slopeFromTrackRefit)s
225 export ALIGNMENT_minStationsInTrackRefits=%(minStationsInTrackRefits)s
227 cp -f %(directory)sgatherBH_cfg.py %(inputdbdir)s%(inputdb)s inertGlobalPositionRcd.db $ALIGNMENT_CAFDIR/
228 cd $ALIGNMENT_CAFDIR/
233 cmsRun gatherBH_cfg.py
235 cp -f *.tmp *.root $ALIGNMENT_AFSDIR/%(directory)s
237 os.system(
"chmod +x %s" % gather_fileName)
238 bsubfile.append(
"echo %sgather%03d.sh" % (directory, jobnumber))
240 if last_align
is None: waiter =
""
241 else: waiter =
"-w \"ended(%s)\"" % last_align
242 if options.big: queue =
"cmscaf1nd"
243 else: queue =
"cmscaf1nh"
245 bsubfile.append(
"bsub -R \"type==SLC5_64\" -q %s -J \"%s_gather%03d\" %s gather%03d.sh" % (queue, director, jobnumber, waiter, jobnumber))
247 bsubnames.append(
"ended(%s_gather%03d)" % (director, jobnumber))
249 file(
"%sconvert-db-to-xml_cfg.py" % directory,
"w").write(
"""from Alignment.MuonAlignment.convertSQLitetoXML_cfg import *
250 process.PoolDBESSource.connect = \"sqlite_file:%(directory)s%(director)s.db\"
251 process.MuonGeometryDBConverter.outputXML.fileName = \"%(directory)s%(director)s.xml\"
252 process.MuonGeometryDBConverter.outputXML.relativeto = \"ideal\"
253 process.MuonGeometryDBConverter.outputXML.suppressDTChambers = True
254 process.MuonGeometryDBConverter.outputXML.suppressDTSuperLayers = True
255 process.MuonGeometryDBConverter.outputXML.suppressDTLayers = True
256 process.MuonGeometryDBConverter.outputXML.suppressCSCChambers = False
257 process.MuonGeometryDBConverter.outputXML.suppressCSCLayers = True
259 process.MuonGeometryDBConverter.getAPEs = True
260 process.PoolDBESSource.toGet = cms.VPSet(
261 cms.PSet(record = cms.string(\"DTAlignmentRcd\"), tag = cms.string(\"DTAlignmentRcd\")),
262 cms.PSet(record = cms.string(\"DTAlignmentErrorRcd\"), tag = cms.string(\"DTAlignmentErrorRcd\")),
263 cms.PSet(record = cms.string(\"CSCAlignmentRcd\"), tag = cms.string(\"CSCAlignmentRcd\")),
264 cms.PSet(record = cms.string(\"CSCAlignmentErrorRcd\"), tag = cms.string(\"CSCAlignmentErrorRcd\")),
268 constraints +=
"""\ncp -f constraints_cff.py $ALIGNMENT_AFSDIR/%(directory)sconstraints_cff.py""" % vars()
270 file(
"%salign.sh" % directory,
"w").write(
"""#!/bin/sh
273 export ALIGNMENT_CAFDIR=`pwd`
276 eval `scramv1 run -sh`
277 export ALIGNMENT_AFSDIR=`pwd`
279 export ALIGNMENT_ITERATION=%(iteration)d
280 export ALIGNMENT_MODE=%(mode)s
281 export ALIGNMENT_INPUTDB=%(inputdb)s
282 export ALIGNMENT_GLOBALTAG=%(globaltag)s
283 export ALIGNMENT_PHOTOGRAMMETRY=%(photogrammetry)s
284 export ALIGNMENT_DISKS=%(disks)s
285 export ALIGNMENT_minP=%(minP)s
286 export ALIGNMENT_minHitsPerChamber=%(minHitsPerChamber)s
287 export ALIGNMENT_maxdrdz=%(maxdrdz)s
288 export ALIGNMENT_maxRedChi2=%(maxRedChi2)s
289 export ALIGNMENT_fiducial=%(fiducial)s
290 export ALIGNMENT_useHitWeights=%(useHitWeights)s
291 export ALIGNMENT_truncateSlopeResid=%(truncateSlopeResid)s
292 export ALIGNMENT_truncateOffsetResid=%(truncateOffsetResid)s
293 export ALIGNMENT_combineME11=%(combineME11)s
294 export ALIGNMENT_useTrackWeights=%(useTrackWeights)s
295 export ALIGNMENT_errorFromRMS=%(errorFromRMS)s
296 export ALIGNMENT_minTracksPerOverlap=%(minTracksPerOverlap)s
297 export ALIGNMENT_slopeFromTrackRefit=%(slopeFromTrackRefit)s
298 export ALIGNMENT_minStationsInTrackRefits=%(minStationsInTrackRefits)s
300 cp -f %(directory)salignBH_cfg.py %(directory)sconvert-db-to-xml_cfg.py %(inputdbdir)s%(inputdb)s %(directory)s*.tmp inertGlobalPositionRcd.db $ALIGNMENT_CAFDIR/
301 cd $ALIGNMENT_CAFDIR/
302 export ALIGNMENT_ALIGNMENTTMP=`ls alignment*.tmp`
307 cmsRun alignBH_cfg.py
308 cp -f report.py $ALIGNMENT_AFSDIR/%(directory)s%(director)s_report.py
309 cp -f outputdb.db $ALIGNMENT_AFSDIR/%(directory)s%(director)s.db
310 cp -f plotting.root $ALIGNMENT_AFSDIR/%(directory)s%(director)s.root
313 cmsRun %(directory)sconvert-db-to-xml_cfg.py
315 os.system(
"chmod +x %salign.sh" % directory)
317 bsubfile.append(
"echo %salign.sh" % directory)
318 bsubfile.append(
"bsub -R \"type==SLC5_64\" -q cmscaf1nd -J \"%s_align\" -w \"%s\" align.sh" % (director,
" && ".
join(bsubnames)))
319 bsubfile.append(
"cd ..")
321 last_align =
"%s_align" % director
324 file(options.submitJobs,
"w").write(
"\n".
join(bsubfile))
325 os.system(
"chmod +x %s" % options.submitJobs)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
static std::string join(char **cmd)