3 from __future__
import print_function
4 from builtins
import range
5 import re,os,sys,shutil
10 execfile(
"plotscripts.py")
12 ROOT.gROOT.SetBatch(1);
19 usage=
'%prog [options]\n'+\
20 'This script dumps muon alignment validation plots '+\
21 '(see https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideMuonAlignValidationPlots) '+\
22 'in web-friendly png format into a predefined directory structure '+\
23 'and also (to be implemented) does some quality checks for these plots.\n'+\
24 'Script uses output of the first and last iterations of muon alignment runs '+\
25 'that should be located in inputDir+i1 and inputDir+iN directories (see options descriptions). '+\
26 'Each of these directories should contain\ni#prefix+"_plotting.root"\ni#prefix+".root"\ni#prefix+"_report.py"\n'+\
27 'files, where # = 1 or N.\n'+\
28 'Output will be located in outputDir, which must exist. Plots from the first and last iterations '+\
29 'will be in outputDir+"iter1" and outputDir+"iterN" respectively, and plots relevant for all iterations will '+\
30 'reside in outputDir+"common/".\n'+\
31 'For a first run a --createDirSructure option must be present. If this option is present for subsequent runs '+\
32 'with the same outputDir, all previous results in "iter1", "iterN" and and "common" would be deleted!\n'+\
33 'If neither --dt or --csc is present, plots for both systems will be created.\n'+\
34 'Options must include either -a or any of the following: --map, --segdiff, --fit, --median'
36 parser=optparse.OptionParser(usage)
38 parser.add_option(
"-l",
"--runLabel",
39 help=
"[REQUIRED] label to use for a run",
44 parser.add_option(
"-i",
"--inputDir",
45 help=
"[REQUIRED] input directory: should contain directories with the first and the final iterations' results",
50 parser.add_option(
"--i1",
51 help=
"[REQUIRED] directory with the alignment 1st iteration's results relative to inputDir",
56 parser.add_option(
"--iN",
57 help=
"[REQUIRED] directory with the alignment last iteration's results relative to inputDir",
62 parser.add_option(
"--i1prefix",
63 help=
"filename prefix for the alignment 1st iteration's results. If not provided, i1prefix = i1",
68 parser.add_option(
"--iNprefix",
69 help=
"filename prefix for the alignment last iteration's results. If not provided, iNprefix = iN",
74 parser.add_option(
"-o",
"--outputDir",
75 help=
"output directory: all plots will be saved with relation to outputDir. If not provided, consider outputDir = inputDir",
80 parser.add_option(
"--createDirSructure",
81 help=
"If present, new directory structure for storing plots will be first created for each iteration at outputDir+i1 and outputDir+iN. WARNING: this will delete any existing results!",
84 dest=
"createDirSructure")
86 parser.add_option(
"--dt",
87 help=
"If it is present, but not --csc, DT only plots will be created",
92 parser.add_option(
"--csc",
93 help=
"If this is present, but not --dt, CSC only plots will be created",
98 parser.add_option(
"-a",
"--all",
99 help=
"If present, all types of plots will be created",
104 parser.add_option(
"--map",
105 help=
"If present, map plots will be created",
110 parser.add_option(
"--segdiff",
111 help=
"If present, segdiff plots will be created",
116 parser.add_option(
"--curvature",
117 help=
"If present, curvature plots will be created",
122 parser.add_option(
"--fit",
123 help=
"If present, fit functions plots will be created",
128 parser.add_option(
"--median",
129 help=
"If present, median plots will be created",
134 parser.add_option(
"--diagnostic",
135 help=
"If present, will run diagnostic checks",
140 parser.add_option(
"-v",
"--verbose",
141 help=
"Degree of debug info verbosity",
146 options,args=parser.parse_args()
148 if options.runLabel==
'' or options.inputDir==
'' or options.i1==
'' or options.iN==
'':
149 print(
"\nOne or more of REQUIRED options is missing!\n")
154 outdir = options.outputDir
155 if outdir==
'': outdir = options.inputDir
157 i1prefix = options.i1prefix
158 if i1prefix==
'' : i1prefix = options.i1
160 iNprefix = options.iNprefix
161 if iNprefix==
'' : iNprefix = options.iN
163 if not os.access(outdir,os.F_OK):
164 print(
"\noutDir = "+outdir+
"\ndoes not exist! Exiting...")
170 if options.dt
or not ( options.dt
or options.csc):
172 if options.csc
or not ( options.dt
or options.csc):
175 if not (options.all
or options.map
or options.curvature
or options.segdiff
or options.fit
or options.median
or options.diagnostic):
176 print(
"\nOptions must include either -a or any of the following: --map, --segdiff, --fit, --median, --diagnostic. Exiting...")
179 SINGLE_ITERATION =
False
180 if i1prefix == iNprefix: SINGLE_ITERATION =
True
187 if options.map
or options.all:
189 if options.segdiff
or options.all:
191 if options.curvature
or options.all:
193 if options.fit
or options.all:
195 if options.median
or options.all:
198 DO_DIAGNOSTIC = options.diagnostic
200 allOptions =
"-l "+options.runLabel+
" -i "+options.inputDir+
" --i1 "+options.i1+
" --iN "+options.iN
201 if options.i1prefix !=
'': allOptions +=
" --i1prefix " + options.i1prefix
202 if options.iNprefix !=
'': allOptions +=
" --iNprefix " + options.iNprefix
203 allOptions +=
" -o "+options.outputDir
204 if options.createDirSructure: allOptions +=
" --createDirSructure"
205 if DO_DT: allOptions +=
" --dt"
206 if DO_CSC: allOptions +=
" --csc"
207 if options.all: allOptions +=
" -a"
208 if options.map: allOptions +=
" --map"
209 if options.segdiff: allOptions +=
" --segdiff"
210 if options.curvature: allOptions +=
" --curvature"
211 if options.fit: allOptions +=
" --fit"
212 if options.median: allOptions +=
" --median"
213 if options.diagnostic: allOptions +=
" --diagnostic"
214 print(sys.argv[0]+
" "+allOptions)
224 CANVASES_LIST_TEMPLATE = [
226 [
'medians distribution',
'medians.png']
229 [
'Wheel&Station: map of dxdz residual vs phi',
'map_DTvsphi_dxdz.png'],
230 [
'Wheel&Station: map of dydz residual vs phi',
'map_DTvsphi_dydz.png'],
231 [
'Wheel&Station: map of x residual vs phi',
'map_DTvsphi_x.png'],
232 [
'Wheel&Station: map of y residual vs phi',
'map_DTvsphi_y.png'],
233 [
'Station&Sector: map of dxdz residual vs z',
'map_DTvsz_dxdz.png'],
234 [
'Station&Sector: map of dydz residual vs z',
'map_DTvsz_dydz.png'],
235 [
'Station&Sector: map of x residual vs z',
'map_DTvsz_x.png'],
236 [
'Station&Sector: map of y residual vs z',
'map_DTvsz_y.png'],
237 [
'Station: map of dxdz residual vs z',
'map_DTvsz_all_dxdz.png'],
238 [
'Station: map of dydz residual vs z',
'map_DTvsz_all_dydz.png'],
239 [
'Station: map of x residual vs z',
'map_DTvsz_all_x.png'],
240 [
'Station: map of y residual vs z',
'map_DTvsz_all_y.png'],
241 [
'Wheel: segdiff in x residuals vs phi',
'segdifphi_dt13_resid.png'],
242 [
'Wheel: segdiff in dxdz residuals vs phi',
'segdifphi_dt13_slope.png'],
243 [
'Wheel: segdiff in y residuals vs phi',
'segdifphi_dt2_resid.png'],
244 [
'Wheel: segdiff in dydz residuals vs phi',
'segdifphi_dt2_slope.png'],
245 [
'Wheel: segdiff DT-CSC in x residuals vs phi',
'segdifphi_x_dt_csc_resid.png'],
246 [
'Chamber: segdiff in x residuals',
'segdif_dt13_resid.png'],
247 [
'Chamber: segdiff in dxdz residuals',
'segdif_dt13_slope.png'],
248 [
'Chamber: segdiff in y residuals',
'segdif_dt2_resid.png'],
249 [
'Chamber: segdiff in dydz residuals',
'segdif_dt2_slope.png'],
250 [
'Chamber: segdiff DT-CSC in x residuals',
'segdif_x_dt_csc_resid.png'],
251 [
'Chamber: residuals distributions',
'dt_bellcurves.png'],
252 [
'Chamber: residuals relations to misalignments',
'dt_polynomials.png'],
253 [
'Chamber: Delta x residuals vs. curvature',
'dt_curvature_deltax.png'],
254 [
'Chamber: Delta dxdz residuals vs. curvature',
'dt_curvature_deltadxdz.png'],
255 [
'Extras: Extra plots in a separate window',
'dt_extras.php']
258 [
'Station&Ring: map of d(rphi)/dz residual vs phi',
'map_CSCvsphi_dxdz.png'],
259 [
'Station&Ring: map of rphi residual vs phi',
'map_CSCvsphi_x.png'],
260 [
'Station&Chamber: map of d(rphi)/dz residual vs r',
'map_CSCvsr_dxdz.png'],
261 [
'Station&Chamber: map of rphi residual vs r',
'map_CSCvsr_x.png'],
262 [
'Station: map of d(rphi)/dz residual vs r',
'map_CSCvsr_all_dxdz.png'],
263 [
'Station: map of rphi residual vs r',
'map_CSCvsr_all_x.png'],
264 [
'Station: segdiff in rphi residuals vs phi',
'segdifphi_csc_resid.png'],
265 [
'Station: segdiff in d(rphi)/dz residuals vs phi',
'segdifphi_csc_slope.png'],
266 [
'Chamber: segdiff in rphi residuals',
'segdif_csc_resid.png'],
267 [
'Chamber: segdiff in d(rphi)/dz residuals',
'segdif_csc_slope.png'],
268 [
'Chamber: residuals distributions',
'csc_bellcurves.png'],
269 [
'Chamber: residuals relations to misalignments',
'csc_polynomials.png'],
272 [
'Extras: Extra plots in a separate window',
'csc_extras.php']
282 '''Recursively looks for file named file_name under dir_name directory
284 if not DO_DT
and dir_name.find(
"MB")>-1:
286 if not DO_CSC
and dir_name.find(
"ME")>-1:
289 for f
in os.listdir(dir_name):
290 dirfile = os.path.join(dir_name, f)
291 if os.path.isfile(dirfile)
and f==file_name:
294 elif os.path.isdir(dirfile):
306 ddt[16] = 1./ddt[15]*((ddt[15]-1)*ddt[16] + tn-t1)
311 if not os.access(iteration_name,os.F_OK):
312 os.mkdir(iteration_name)
314 csc_basedir = iteration_name+
'/'
315 for endcap
in CSC_TYPES:
317 shutil.rmtree(csc_basedir+endcap[0],
True)
318 os.mkdir(csc_basedir+endcap[0])
319 for station
in endcap[2]:
321 os.mkdir(csc_basedir+endcap[0]+
'/'+station[1])
322 for ring
in station[2]:
324 os.mkdir(csc_basedir+endcap[0]+
'/'+station[1]+
'/'+ring[1])
325 for chamber
in range(1,ring[2]+1):
326 schamber =
"%02d" % chamber
328 os.mkdir(csc_basedir+endcap[0]+
'/'+station[1]+
'/'+ring[1]+
'/'+schamber)
330 dt_basedir = iteration_name+
'/MB/'
332 shutil.rmtree(dt_basedir,
True)
334 for wheel
in DT_TYPES:
336 os.mkdir(dt_basedir+wheel[0])
337 for station
in wheel[2]:
339 os.mkdir(dt_basedir+wheel[0]+
'/'+station[1])
340 for sector
in range(1,station[2]+1):
341 ssector =
"%02d" % sector
343 os.mkdir(dt_basedir+wheel[0]+
'/'+station[1]+
'/'+ssector)
350 """write DT map plots
352 "DTvsphi_st%dwh%s" % (station, wheelletter):
354 plots "integrated" over ALL SECTORS:
355 of x, y, dxdz, dydz vs. phi (y and dydz only for stations 1-3)
356 made for all (station,wheel) combinations
358 Access interface may be arranged into station(1 .. 4) vs. wheel(-2 .. +2) map.
359 It could be incorporated into a general DT chambers map (column1: wheel, column2: station,
360 columns3-16 correspond to sector #) by making station numbers in column 2 clickable.
363 "DTvsz_st%dsec%02d" % (station, sector)
365 plots "integrated" over ALL WHEELS:
366 of x, y, dxdz, dydz vs. z (y and dydz only for stations 1-3)
367 made for all (station,sector) combinations
369 Interface: may be arranged into station(1 .. 4) vs. sector(1 .. 14) map with sector range
370 (1 .. 12) for stations 1-3.
371 It could be incorporated into an EXTENDED general DT chambers map (extended by adding an
372 identifier "ALL" in column1 for wheel number).
375 "DTvsz_st%dsecALL" % (station)
377 plots spanning in z over ALL WHEELS and "integrated" over all sectors:
378 of x, y, dxdz, dydz vs. z (y and dydz only for stations 1-3)
379 made for all stations
381 Interface: may be arranged into station(1 .. 4) map
382 It could be incorporated into an EXTENDED general DT chambers map (extended by adding an
383 identifier "ALL" in column1 for wheel number)."""
386 for wheel
in DT_TYPES:
387 if wheel[1]==
"ALL":
continue
388 for station
in wheel[2]:
389 pdir = dt_basedir+
'/'+wheel[0]+
'/'+station[1]+
'/'
391 htitle =
"wheel %+d, station %s" % (
int(wheel[1]), station[1])
393 mapplot(tfiles_plotting, label,
"x", window=10., title=htitle, fitsine=
True,fitpeaks=
True,peaksbins=2)
394 c1.SaveAs(pdir+
'map_DTvsphi_x.png')
396 mapplot(tfiles_plotting, label,
"dxdz", window=10., title=htitle,peaksbins=2)
397 c1.SaveAs(pdir+
'map_DTvsphi_dxdz.png')
399 if station[1]==
'4':
continue
401 mapplot(tfiles_plotting, label,
"y", window=10., title=htitle,peaksbins=2)
402 c1.SaveAs(pdir+
'map_DTvsphi_y.png')
404 mapplot(tfiles_plotting, label,
"dydz", window=10., title=htitle,peaksbins=2)
405 c1.SaveAs(pdir+
'map_DTvsphi_dydz.png')
409 for wheel
in DT_TYPES:
410 if wheel[1]!=
"ALL":
continue
411 for station
in wheel[2]:
412 for sector
in range(1,station[2]+1):
413 if qcount>QUICKTESTN:
break
415 ssector =
"%02d" % sector
416 pdir = dt_basedir+
'/'+wheel[0]+
'/'+station[1]+
'/'+ssector+
'/'
417 label =
"DTvsz_st%ssec%s" % (station[1], ssector)
418 htitle =
"station %s, sector %d" % (station[1], sector)
419 mapplot(tfiles_plotting, label,
"x", window=10., title=htitle, peaksbins=2)
420 c1.SaveAs(pdir+
'map_DTvsz_x.png')
421 mapplot(tfiles_plotting, label,
"dxdz", window=10., title=htitle, peaksbins=2)
422 c1.SaveAs(pdir+
'map_DTvsz_dxdz.png')
424 if station[1]==
'4':
continue
425 mapplot(tfiles_plotting, label,
"y", window=10., title=htitle, peaksbins=2)
426 c1.SaveAs(pdir+
'map_DTvsz_y.png')
427 mapplot(tfiles_plotting, label,
"dydz", window=10., title=htitle, peaksbins=2)
428 c1.SaveAs(pdir+
'map_DTvsz_dydz.png')
431 for wheel
in DT_TYPES:
432 if wheel[1]!=
"ALL":
continue
433 for station
in wheel[2]:
434 if qcount>QUICKTESTN:
break
436 pdir = dt_basedir+
'/'+wheel[0]+
'/'+station[1]+
'/'
437 label =
"DTvsz_st%ssecALL" % (station[1])
438 htitle =
"station %s" % (station[1])
440 print(label, end=
' ')
441 mapplot(tfiles_plotting, label,
"x", window=10., title=htitle, peaksbins=2)
442 c1.SaveAs(pdir+
'map_DTvsz_all_x.png')
443 mapplot(tfiles_plotting, label,
"dxdz", window=10., title=htitle, peaksbins=2)
444 c1.SaveAs(pdir+
'map_DTvsz_all_dxdz.png')
446 if station[1]==
'4':
continue
447 mapplot(tfiles_plotting, label,
"y", window=10., title=htitle, peaksbins=2)
448 c1.SaveAs(pdir+
'map_DTvsz_all_y.png')
449 mapplot(tfiles_plotting, label,
"dydz", window=10., title=htitle, peaksbins=2)
450 c1.SaveAs(pdir+
'map_DTvsz_all_dydz.png')
456 """write CSC map plots
458 "CSCvsphi_me%s%d%d" % (endcap, station, ring)
460 plots "integrated" over ALL SECTORS:
461 of rphi, drphi/dz vs. phi
462 made for all (endcap,station,ring) combinations
464 Interface: may be arranged into two station(1 .. 4) vs. R(1 .. 4) maps for both endcaps
465 with R range (1 .. 4) for stations 2-4
466 It could be incorporated into a general CSC chambers map (column1: endcap, column2: station,
467 column3: ring, columns4-40 correspond to chamber #) by making ring numbers in column 3
471 "CSCvsr_me%s%dch%02d" % (endcap, station, chamberNumber)
473 plots "integrated" over ALL RINGS:
474 of rphi, drphi/dz vs. z
475 made for all (endcap,station,chamber) combinations
477 Interface: may be arranged into two station(1 .. 4) vs. chamber(1 .. 36) maps for both endcaps
478 It could be incorporated into an EXTENDED general CSC chambers map (extended by adding an
479 identifier "ALL" in column3 for ring number).
481 "CSCvsr_me%s%dchALL" % (endcap, station)
483 plots spanning over ALL RINGS along r and integrated over all SECTORS:
484 of rphi, drphi/dz vs. z
485 made for all (endcap,station) combinations
487 Interface: may be arranged into two station(1 .. 4) maps for both endcaps
488 It could be incorporated into an EXTENDED general CSC chambers map (extended by adding an
489 identifier "ALL" in column3 for ring number)."""
491 for endcap
in CSC_TYPES:
492 for station
in endcap[2]:
493 for ring
in station[2]:
494 if ring[1]==
"ALL":
continue
495 pdir = csc_basedir+
'/'+endcap[0]+
'/'+station[1]+
'/'+ring[1]+
'/'
496 label =
"CSCvsphi_me%s%s%s" % (endcap[1], station[1], ring[1])
497 htitle =
"%s%s/%s" % (endcap[0], station[1],ring[1])
498 mapplot(tfiles_plotting, label,
"x", window=15., title=htitle, fitsine=
True,fitpeaks=
True, peaksbins=2)
500 c1.SaveAs(pdir+
'map_CSCvsphi_x.png')
501 mapplot(tfiles_plotting, label,
"dxdz", window=15., title=htitle, peaksbins=2)
502 c1.SaveAs(pdir+
'map_CSCvsphi_dxdz.png')
507 for endcap
in CSC_TYPES:
508 for station
in endcap[2]:
509 for ring
in station[2]:
510 if ring[1]!=
"ALL":
continue
511 for chamber
in range(1,ring[2]+1):
512 if qcount>QUICKTESTN:
break
514 schamber =
"%02d" % chamber
515 pdir = csc_basedir+
'/'+endcap[0]+
'/'+station[1]+
'/'+ring[1]+
'/'+schamber+
'/'
516 label =
"CSCvsr_me%s%sch%s" % (endcap[1], station[1], schamber)
517 htitle =
"%s%s/ALL/%d" % (endcap[0], station[1],chamber)
518 mapplot(tfiles_plotting, label,
"x", window=15., title=htitle, peaksbins=2)
519 c1.SaveAs(pdir+
'map_CSCvsr_x.png')
520 mapplot(tfiles_plotting, label,
"dxdz", window=15., title=htitle, peaksbins=2)
521 c1.SaveAs(pdir+
'map_CSCvsr_dxdz.png')
524 for endcap
in CSC_TYPES:
525 for station
in endcap[2]:
526 for ring
in station[2]:
527 if ring[1]!=
"ALL":
continue
528 if qcount>QUICKTESTN:
break
530 schamber =
"%02d" % chamber
531 pdir = csc_basedir+
'/'+endcap[0]+
'/'+station[1]+
'/'+ring[1]+
'/'
532 label =
"CSCvsr_me%s%schALL" % (endcap[1], station[1])
533 htitle =
"%s%s" % (endcap[0], station[1])
534 mapplot(tfiles_plotting, label,
"x", window=10., title=htitle, peaksbins=2)
535 c1.SaveAs(pdir+
'map_CSCvsr_all_x.png')
536 mapplot(tfiles_plotting, label,
"dxdz", window=10., title=htitle, peaksbins=2)
537 c1.SaveAs(pdir+
'map_CSCvsr_all_dxdz.png')
542 """write DT curvature plots
544 "wheel%s_sector%s" % (wheel, sector)
546 wheel in "m2", "m1", "z", "p1", "p2"
548 sector in "01", ..., "12"
550 "param" may be one of
551 "deltax" (Delta x position residuals),
552 "deltadxdz" (Delta (dx/dz) angular residuals),
553 "curverr" (Delta x * d(Delta q/pT)/d(Delta x) = Delta q/pT in the absence of misalignment) - not necessary
555 made for all (wheel,station=1,sector) combinations
557 Interface: could be accesses through a general DT chambers map for station=1 chambers."""
559 w_dict = {
'-2':
'm2',
'-1':
'm1',
'0':
'z',
'1':
'p1',
'2':
'p2'}
561 for wheel
in DT_TYPES:
562 if wheel[1]==
"ALL":
continue
565 for station
in wheel[2]:
566 print(
"curv in ", wheel[0]+
'/'+station[1])
567 for sector
in range(1,station[2]+1):
569 if qcount>QUICKTESTN:
break
571 ssector =
"%02d" % sector
572 pdir = dt_basedir+
'/'+wheel[0]+
'/'+station[1]+
'/'+ssector+
'/'
573 label =
"wheel%s_st%s_sector%s" % (w_dict[wheel[1]], station[1], ssector)
574 thetitle =
"Wheel %s, station %s, sector %s" % (wheel[1], station[1], ssector)
575 curvatureplot(tfiles_plotting, label,
"deltax", title=thetitle, window=10., fitline=
True)
576 saveAs(pdir+
'dt_curvature_deltax.png')
577 curvatureplot(tfiles_plotting, label,
"deltadxdz", title=thetitle, window=10., fitline=
True)
578 saveAs(pdir+
'dt_curvature_deltadxdz.png')
583 """write segment-difference plots for DT
585 segdiff "dt13_resid" and "dt13_slope"
588 x vs qpt, x for positive, x for negative ("dt13_resid")
589 dxdz vs qpt, dxdz for positive, dxdz for negative ("dt13_slope")
590 done for MB1-MB2, MB2-MB3, and MB3-MB4 stations combinations with all possible (wheel, sector)
592 Interface: could be accessed through a general DT chambers map, but only for chambers in
593 stations 2-4 (e.g., station 2 would provide MB1-MB2 plots).
595 segdiff "dt2_resid" and "dt2_slope"
598 y vs q/pt, y for positive, y for negative ("dt2_resid")
599 dydz vs q/pt, dydz for positive, dydz for negative ("dt2_slope")
600 done for MB1-MB2, MB2-MB3 stations combinations with all possible (wheel, sector)
602 Interface: then the interface would still be a general DT map,
603 but the info only available from station 2 & 3 chambers."""
606 for iwheel
in DT_TYPES:
607 if iwheel[1]==
"ALL":
continue
608 for istation
in iwheel[2]:
609 if istation[1]==
"1":
continue
610 dstations = (
int(istation[1])-1)*10 +
int(istation[1])
612 for isector
in range(1, istation[2] + 1):
613 if isector > 12:
continue
614 if qcount>QUICKTESTN:
break
616 ssector =
"%02d" % isector
617 pdir = dt_basedir +
'/' + iwheel[0] +
'/' + istation[1] +
'/' + ssector +
'/'
619 segdiff(tfiles_plotting,
"dt13_resid", dstations, wheel=
int(iwheel[1]), sector=isector, window=15.)
620 c1.SaveAs(pdir +
'segdif_dt13_resid.png')
621 segdiff(tfiles_plotting,
"dt13_slope", dstations, wheel=
int(iwheel[1]), sector=isector, window=15.)
622 c1.SaveAs(pdir +
'segdif_dt13_slope.png')
624 if istation[1] !=
'4':
625 segdiff(tfiles_plotting,
"dt2_resid", dstations, wheel=
int(iwheel[1]), sector=isector, window=15.)
626 c1.SaveAs(pdir +
'segdif_dt2_resid.png')
627 segdiff(tfiles_plotting,
"dt2_slope", dstations, wheel=
int(iwheel[1]), sector=isector, window=15.)
628 c1.SaveAs(pdir +
'segdif_dt2_slope.png')
631 for iwheel
in DT_TYPES:
632 if iwheel[1]==
"ALL":
continue
633 if abs(
int(iwheel[1])) != 2:
continue
634 for istation
in iwheel[2]:
635 if istation[1]==
"3":
continue
637 for isector
in range(1, istation[2] + 1):
638 ssector =
"%02d" % isector
639 pdir = dt_basedir +
'/' + iwheel[0] +
'/' + istation[1] +
'/' + ssector +
'/'
641 segdiff_xalign(tfiles_plotting,
"x_dt1_csc", wheel=
int(iwheel[1]), sector=isector, cscstations =
"12")
642 c1.SaveAs(pdir +
'segdif_x_dt_csc_resid.png')
644 segdiff_xalign(tfiles_plotting,
"x_dt2_csc", wheel=
int(iwheel[1]), sector=isector, cscstations =
"1")
645 c1.SaveAs(pdir +
'segdif_x_dt_csc_resid.png')
647 """segdiffvsphi "dt13_resid" and "dt13_slope"
649 plot for a specific wheel #:
650 x vs phi of pair ("dt13_resid")
651 dxdz vs phi of pair ("dt13_slope")
652 contains all three combinations of neighboring stations
653 made for all possible wheel values
655 Interface: could be accessed by clicking on wheel number under the "wheel" column
658 segdiffvsphi "dt2_resid" and "dt2_slope"
660 plot for a specific wheel #:
661 y vs phi of pair ("dt2_resid")
662 dydz vs phi of pair ("dt2_slope")
663 contains both MB1-MB2 and MB2-MB3 combinations
664 made for all possible wheel values
666 Interface: could be accessed by clicking on wheel number under the "wheel" column
667 in a general DT map"""
669 if len(iter_reports)==0:
return
671 for iwheel
in DT_TYPES:
672 if iwheel[1]==
"ALL":
continue
673 pdir = dt_basedir +
'/' + iwheel[0] +
'/'
674 segdiffvsphi(tfiles_plotting, iter_reports,
"dt13_resid",
int(iwheel[1]), window=10.)
675 c1.SaveAs(pdir +
'segdifphi_dt13_resid.png')
676 segdiffvsphi(tfiles_plotting, iter_reports,
"dt13_slope",
int(iwheel[1]), window=10.)
677 c1.SaveAs(pdir +
'segdifphi_dt13_slope.png')
678 segdiffvsphi(tfiles_plotting, iter_reports,
"dt2_resid",
int(iwheel[1]), window=10.)
679 c1.SaveAs(pdir +
'segdifphi_dt2_resid.png')
680 segdiffvsphi(tfiles_plotting, iter_reports,
"dt2_slope",
int(iwheel[1]), window=15.)
681 c1.SaveAs(pdir +
'segdifphi_dt2_slope.png')
683 for iwheel
in DT_TYPES:
684 if iwheel[1]==
"ALL":
continue
685 if abs(
int(iwheel[1])) != 2:
continue
686 pdir = dt_basedir +
'/' + iwheel[0] +
'/'
688 c1.SaveAs(pdir +
'segdifphi_x_dt_csc_resid.png')
692 """write segment-difference plots for CSC
694 segdiff "csc_resid" and "csc_slope"
697 rphi vs qpt, rphi for positive, rphi for negative ("csc_resid")
698 drphidz vs qpt, drphidz for positive, drphidz for negative ("csc_slope")
699 done for ME1-ME2, ME2-ME3, and ME3-ME4 stations combinations with
702 chamber 1-18 (r1) or 1-36 (r2)
703 note: there's no ME3-ME4 plots for R2
705 Interface: could be accessed through a general CSC chambers map, but only for chambers in
706 stations 2-4 (e.g., station 2 would provide ME1-ME2 plots)."""
709 for iendcap
in CSC_TYPES:
710 for istation
in iendcap[2]:
711 if istation[1]==
"1":
continue
712 dstations = (
int(istation[1])-1)*10 +
int(istation[1])
713 for iring
in istation[2]:
714 if iring[1]==
"ALL":
continue
715 if istation[1]==
"4" and iring[1]==
"2":
continue
716 for ichamber
in range(1,iring[2]+1):
717 if qcount>QUICKTESTN:
break
719 schamber =
"%02d" % ichamber
720 pdir = csc_basedir+
'/'+iendcap[0]+
'/'+istation[1]+
'/'+iring[1]+
'/'+schamber+
'/'
721 segdiff(tfiles_plotting,
"csc_resid", dstations,
722 endcap=iendcap[1], ring=
int(iring[1]), chamber=ichamber, window=15.)
723 c1.SaveAs(pdir +
'segdif_csc_resid.png')
724 segdiff(tfiles_plotting,
"csc_slope", dstations,
725 endcap=iendcap[1], ring=
int(iring[1]), chamber=ichamber, window=15.)
726 c1.SaveAs(pdir +
'segdif_csc_slope.png')
728 """segdiffvsphicsc "csc_resid" and "csc_slope"
730 plot for a specific deltaME station differences:
731 rphi vs phi of pair ("csc_resid")
732 dxdz vs phi of pair ("csc_slope")
733 contains plots for two (or one for ME4-ME3) rings
734 done for ME1-ME2, ME2-ME3, and ME3-ME4 stations combinations with
737 Interface: could be accessed by clicking on ME station boxes, but only for stations 2-4
738 (e.g., station 2 would provide ME1-ME2 plots)."""
741 for iendcap
in CSC_TYPES:
742 for istation
in iendcap[2]:
743 if istation[1]==
"1":
continue
744 dstations = (
int(istation[1])-1)*10 +
int(istation[1])
745 if qcount>QUICKTESTN:
break
747 pdir = csc_basedir+
'/'+iendcap[0]+
'/'+istation[1]+
'/'
748 segdiffvsphicsc(tfiles_plotting,
"csc_resid", dstations, window=10., endcap=iendcap[1])
749 c1.SaveAs(pdir +
'segdifphi_csc_resid.png')
750 segdiffvsphicsc(tfiles_plotting,
"csc_slope", dstations, window=10., endcap=iendcap[1])
751 c1.SaveAs(pdir +
'segdifphi_csc_slope.png')
755 """write fit functions plots for DT
757 DT bellcurves and polynomials
759 set of plots of bellcurves
760 x, dxdz, x vs. dxdz (for all 4 stations)
761 y, dydz, x vs. dxdz (only for stations 1-3?)
763 set of plots of polynomials -- for stations 1-3 only??
764 x vs. xpos, x vs ypos, x vs dxdz angle, x vs dydz angle
765 y vs. xpos, y vs ypos, y vs dxdz angle, y vs dydz angle
766 dxdz vs. xpos, dxdz vs ypos, dxdz vs dxdz angle, dxdz vs dydz angle
767 dydz vs. xpos, dydz vs ypos, dydz vs dxdz angle, dydz vs dydz angle
769 set of plots of polynomials -- for station 4 only??
770 x vs. xpos, x vs dxdz angle
771 dxdz vs. xpos, dxdz vs dxdz angle
773 made for all (wheel,station,sector) combinations
775 Interface: could be accesses through a general DT chambers map."""
779 for wheel
in DT_TYPES:
780 if wheel[1]==
"ALL":
continue
781 for station
in wheel[2]:
782 print(wheel[0]+
'/'+station[1])
783 for sector
in range(1,station[2]+1):
784 if qcount>QUICKTESTN:
break
786 ssector =
"%02d" % sector
787 pdir = dt_basedir+
'/'+wheel[0]+
'/'+station[1]+
'/'+ssector+
'/'
788 label =
"MBwh%sst%ssec%s" % (
wheelLetter(
int(wheel[1])),station[1],ssector)
789 bellcurves(iter_tfile, iter_reports, label,
False)
791 saveAs(pdir+
'dt_bellcurves.png')
792 polynomials(iter_tfile, iter_reports, label,
False)
794 saveAs(pdir+
'dt_polynomials.png')
799 """write fit functions plots for CSC
801 CSC bellcurves and polynomials
803 set of plots of bellcurves
804 rphi, drphidz, rphi vs. drphidz
806 set of plots of polynomials
807 rphi vs. rphi pos, rphi vs drphidz angle
808 drphidz vs. rphi pos, drphidz vs drphidz angle
810 made for all (endcap,station,ring,chamber) combinations
812 Interface: could be accesses through a general CSC chambers map."""
816 for endcap
in CSC_TYPES:
817 for station
in endcap[2]:
818 for ring
in station[2]:
819 if ring[1]==
"ALL":
continue
820 print(endcap[0]+
'/'+station[1]+
'/'+ring[1])
821 for chamber
in range(1,ring[2]+1):
822 if qcount>QUICKTESTN:
break
824 schamber =
"%02d" % chamber
825 pdir = csc_basedir+
'/'+endcap[0]+
'/'+station[1]+
'/'+ring[1]+
'/'+schamber+
'/'
826 label =
"ME%s%s%s_%s" % (endcap[1], station[1], ring[1], schamber)
827 bellcurves(iter_tfile, iter_reports, label,
False)
829 saveAs(pdir+
'csc_bellcurves.png')
830 polynomials(iter_tfile, iter_reports, label,
False)
832 saveAs(pdir+
'csc_polynomials.png')
838 dt_basedir = iteration_directory+
'/'+
'MB'
839 csc_basedir = iteration_directory+
'/'
843 if DO_CSC
and DO_MAP:
846 if DO_DT
and DO_CURVATURE:
851 if DO_DT
and DO_SEGDIFF:
853 if DO_CSC
and DO_SEGDIFF:
858 if DO_CSC
and DO_FIT:
863 '''Use CANVASES_LIST_TEMPLATE as a template to create a canvases list include for the browser.
864 Write out only those canvases which have existing filename.png plots.
867 for scope
in CANVASES_LIST_TEMPLATE:
870 scope_entry = [scope[0],scope[1]]
871 for canvas_entry
in scope[2:]:
873 scope_entry.append(canvas_entry)
874 CANVASES_LIST.append(scope_entry)
876 ff = open(fname,mode=
"w")
877 print(
"var CANVASES_LIST = ", file=ff)
878 json.dump(CANVASES_LIST,ff)
883 '''Writes out a canvas-2-ids list include for the browser.
884 Write out only those canvases which have existing filename.png plots.
885 Returns: list of unique IDs that have existing filename.png plots.
889 for scope
in CANVASES_LIST_TEMPLATE:
891 for canvas_entry
in scope[2:]:
898 print(canvas_entry,
":", len(uids),
"ids")
900 CANVAS2ID_LIST.append( (canvas_entry[1],uids) )
902 CANVAS2ID_LIST_DICT = dict(CANVAS2ID_LIST)
904 ff = open(fname,mode=
"w")
905 print(
"var CANVAS2ID_LIST = ", file=ff)
906 json.dump(CANVAS2ID_LIST_DICT,ff)
908 set_ids = set(ID_LIST)
912 '''Recursively looks for file named file_name under dir_name directory
913 and fill the list with dir names converted to IDs
916 for f
in os.listdir(dir_name):
917 dirfile = os.path.join(dir_name, f)
918 if os.path.isfile(dirfile)
and f==file_name:
919 if file_name[-4:]==
'.php': id_list.append(dir_name+
'/'+file_name)
920 else: id_list.append(
dirToID(dir_name))
922 elif os.path.isdir(dirfile):
931 if d[-1]!=
'/': d +=
'/'
935 cscn = d.find(
"/ME-/")
937 return 'ME-'+d[cscn+5:-1]
938 cscn = d.find(
"/ME+/")
940 return 'ME+'+d[cscn+5:-1]
959 fname = options.inputDir+
'/'+options.i1+
'/'+i1prefix
960 tfiles1_plotting = []
963 if not SINGLE_ITERATION:
964 if (DO_MAP
or DO_SEGDIFF
or DO_CURVATURE)
and not os.access(fname+
"_plotting.root",os.F_OK):
965 print(
"no file "+fname+
"_plotting.root")
967 if DO_FIT
and not os.access(fname+
".root",os.F_OK):
968 print(
"no file "+fname+
".root")
970 if DO_MEDIAN
and not os.access(fname+
"_report.py",os.F_OK):
971 print(
"no file "+fname+
"_report.py")
973 if DO_MAP
or DO_SEGDIFF
or DO_CURVATURE: tfiles1_plotting.append(ROOT.TFile(fname+
"_plotting.root"))
974 if os.access(fname+
".root",os.F_OK):
975 iter1_tfile = ROOT.TFile(fname+
".root")
976 if os.access(fname+
"_report.py",os.F_OK):
977 execfile(fname+
"_report.py")
978 iter1_reports = reports
980 fname = options.inputDir+
'/'+options.iN+
'/'+iNprefix
981 tfilesN_plotting = []
984 if (DO_MAP
or DO_SEGDIFF
or DO_CURVATURE)
and not os.access(fname+
"_plotting.root",os.F_OK):
985 print(
"no file "+fname+
"_plotting.root")
987 if DO_FIT
and not os.access(fname+
".root",os.F_OK):
988 print(
"no file "+fname+
".root")
990 if DO_MEDIAN
and not os.access(fname+
"_report.py",os.F_OK):
991 print(
"no file "+fname+
"_report.py")
993 if DO_MAP
or DO_SEGDIFF
or DO_CURVATURE: tfilesN_plotting.append(ROOT.TFile(fname+
"_plotting.root"))
994 if os.access(fname+
".root",os.F_OK):
995 iterN_tfile = ROOT.TFile(fname+
".root")
996 if os.access(fname+
"_report.py",os.F_OK):
997 execfile(fname+
"_report.py")
998 iterN_reports = reports
1001 os.chdir(options.inputDir)
1008 os.chdir(options.outputDir)
1011 iteration1 =
"iter1"
1012 iterationN =
"iterN"
1015 if options.createDirSructure:
1016 print(
"WARNING: all existing results in "+options.outputDir+
" will be deleted!")
1019 if not os.access(comdir,os.F_OK):
1025 c1 = ROOT.TCanvas(
"c1",
"c1",800,600)
1029 print(
"--- ITERATION 1 ---")
1030 if not SINGLE_ITERATION:
doIterationPlots(iteration1, tfiles1_plotting, iter1_tfile, iter1_reports)
1031 print(
"--- ITERATION N ---")
1034 if CPP_LOADED: ROOT.cleanUpHeap()
1040 plotmedians(iter1_reports, iterN_reports,binsx=100, windowx=10., binsy=100, windowy=10., binsdxdz=100, windowdxdz=10., binsdydz=100, windowdydz=10.)
1041 c1.SaveAs(comdir+
'medians.png')
1048 doTests(iterN_reports, pic_ids,
"mu_list.js",
"dqm_report.js",options.runLabel)