CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
alignmentValidation.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 from __future__ import print_function
4 from builtins import range
5 import re,os,sys,shutil
6 import optparse
7 
8 from mutypes import *
9 
10 execfile("plotscripts.py")
11 
12 ROOT.gROOT.SetBatch(1);
13 
14 ######################################################
15 
16 ######################################################
17 # To parse commandline args
18 
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'
35 
36 parser=optparse.OptionParser(usage)
37 
38 parser.add_option("-l", "--runLabel",
39  help="[REQUIRED] label to use for a run",
40  type="string",
41  default='',
42  dest="runLabel")
43 
44 parser.add_option("-i", "--inputDir",
45  help="[REQUIRED] input directory: should contain directories with the first and the final iterations' results",
46  type="string",
47  default='',
48  dest="inputDir")
49 
50 parser.add_option("--i1",
51  help="[REQUIRED] directory with the alignment 1st iteration's results relative to inputDir",
52  type="string",
53  default='',
54  dest="i1")
55 
56 parser.add_option("--iN",
57  help="[REQUIRED] directory with the alignment last iteration's results relative to inputDir",
58  type="string",
59  default='',
60  dest="iN")
61 
62 parser.add_option("--i1prefix",
63  help="filename prefix for the alignment 1st iteration's results. If not provided, i1prefix = i1",
64  type="string",
65  default='',
66  dest="i1prefix")
67 
68 parser.add_option("--iNprefix",
69  help="filename prefix for the alignment last iteration's results. If not provided, iNprefix = iN",
70  type="string",
71  default='',
72  dest="iNprefix")
73 
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",
76  type="string",
77  default='',
78  dest="outputDir")
79 
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!",
82  action="store_true",
83  default=False,
84  dest="createDirSructure")
85 
86 parser.add_option("--dt",
87  help="If it is present, but not --csc, DT only plots will be created",
88  action="store_true",
89  default=False,
90  dest="dt")
91 
92 parser.add_option("--csc",
93  help="If this is present, but not --dt, CSC only plots will be created",
94  action="store_true",
95  default=False,
96  dest="csc")
97 
98 parser.add_option("-a","--all",
99  help="If present, all types of plots will be created",
100  action="store_true",
101  default=False,
102  dest="all")
103 
104 parser.add_option("--map",
105  help="If present, map plots will be created",
106  action="store_true",
107  default=False,
108  dest="map")
109 
110 parser.add_option("--segdiff",
111  help="If present, segdiff plots will be created",
112  action="store_true",
113  default=False,
114  dest="segdiff")
115 
116 parser.add_option("--curvature",
117  help="If present, curvature plots will be created",
118  action="store_true",
119  default=False,
120  dest="curvature")
121 
122 parser.add_option("--fit",
123  help="If present, fit functions plots will be created",
124  action="store_true",
125  default=False,
126  dest="fit")
127 
128 parser.add_option("--median",
129  help="If present, median plots will be created",
130  action="store_true",
131  default=False,
132  dest="median")
133 
134 parser.add_option("--diagnostic",
135  help="If present, will run diagnostic checks",
136  action="store_true",
137  default=False,
138  dest="diagnostic")
139 
140 parser.add_option("-v", "--verbose",
141  help="Degree of debug info verbosity",
142  type="int",
143  default=0,
144  dest="verbose")
145 
146 options,args=parser.parse_args()
147 
148 if options.runLabel=='' or options.inputDir=='' or options.i1=='' or options.iN=='':
149  print("\nOne or more of REQUIRED options is missing!\n")
150  parser.print_help()
151  # See \n"+sys.argv[0]+" --help"
152  sys.exit()
153 
154 outdir = options.outputDir
155 if outdir=='': outdir = options.inputDir
156 
157 i1prefix = options.i1prefix
158 if i1prefix=='' : i1prefix = options.i1
159 
160 iNprefix = options.iNprefix
161 if iNprefix=='' : iNprefix = options.iN
162 
163 if not os.access(outdir,os.F_OK):
164  print("\noutDir = "+outdir+"\ndoes not exist! Exiting...")
165  sys.exit()
166 
167 # If neither --dt or --csc is present, plots for both systems will be created
168 DO_DT = False
169 DO_CSC = False
170 if options.dt or not ( options.dt or options.csc):
171  DO_DT = True
172 if options.csc or not ( options.dt or options.csc):
173  DO_CSC = True
174 
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...")
177  sys.exit()
178 
179 SINGLE_ITERATION = False
180 if i1prefix == iNprefix: SINGLE_ITERATION = True
181 
182 DO_MAP = False
183 DO_SEGDIFF = False
184 DO_CURVATURE = False
185 DO_FIT = False
186 DO_MEDIAN = False
187 if options.map or options.all:
188  DO_MAP = True
189 if options.segdiff or options.all:
190  DO_SEGDIFF = True
191 if options.curvature or options.all:
192  DO_CURVATURE = True
193 if options.fit or options.all:
194  DO_FIT = True
195 if options.median or options.all:
196  DO_MEDIAN = True
197 
198 DO_DIAGNOSTIC = options.diagnostic
199 
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)
215 
216 
217 QUICKTESTN=10000
218 
219 
220 
221 ######################################################
222 
223 # template for canvases list
224 CANVASES_LIST_TEMPLATE = [
225 ['Common',' ',
226  ['medians distribution','medians.png']
227 ],
228 ['DT',' ',
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']
256 ],
257 ['CSC',' ',
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'],
270  #['Chamber: Delta rphi residuals vs. curvature','csc_curvature_x.png'],
271  #['Chamber: Delta d(rphi)/dz residuals vs. curvature','csc_curvature_dxdz.png'],
272  ['Extras: Extra plots in a separate window','csc_extras.php']
273 ]
274 ]
275 
276 
277 ######################################################
278 # functions definitions
279 
280 
281 def isFileUnderDir(dir_name, file_name):
282  '''Recursively looks for file named file_name under dir_name directory
283  '''
284  if not DO_DT and dir_name.find("MB")>-1:
285  return False
286  if not DO_CSC and dir_name.find("ME")>-1:
287  return False
288 
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:
292  return True
293  # recursively access file names in subdirectories
294  elif os.path.isdir(dirfile):
295  #print "Accessing directory:", dirfile
296  if isFileUnderDir(dirfile, file_name): return True
297  return False
298 
299 
300 # to time saving of plots
301 def saveAs(nm):
302  t1 = time.time()
303  ddt[15] += 1
304  c1.SaveAs(nm)
305  tn = time.time()
306  ddt[16] = 1./ddt[15]*((ddt[15]-1)*ddt[16] + tn-t1)
307 
308 
309 def createDirectoryStructure(iteration_name):
310 
311  if not os.access(iteration_name,os.F_OK):
312  os.mkdir(iteration_name)
313 
314  csc_basedir = iteration_name+'/'
315  for endcap in CSC_TYPES:
316  #print csc_basedir+endcap[0]
317  shutil.rmtree(csc_basedir+endcap[0],True)
318  os.mkdir(csc_basedir+endcap[0])
319  for station in endcap[2]:
320  #print csc_basedir+endcap[0]+'/'+station[1]
321  os.mkdir(csc_basedir+endcap[0]+'/'+station[1])
322  for ring in station[2]:
323  #print csc_basedir+endcap[0]+'/'+station[1]+'/'+ring[1]
324  os.mkdir(csc_basedir+endcap[0]+'/'+station[1]+'/'+ring[1])
325  for chamber in range(1,ring[2]+1):
326  schamber = "%02d" % chamber
327  #print csc_basedir+endcap[0]+'/'+station[1]+'/'+ring[1]+'/'+schamber
328  os.mkdir(csc_basedir+endcap[0]+'/'+station[1]+'/'+ring[1]+'/'+schamber)
329 
330  dt_basedir = iteration_name+'/MB/'
331  #print dt_basedir
332  shutil.rmtree(dt_basedir,True)
333  os.mkdir(dt_basedir)
334  for wheel in DT_TYPES:
335  #print dt_basedir+wheel[0]
336  os.mkdir(dt_basedir+wheel[0])
337  for station in wheel[2]:
338  #print dt_basedir+wheel[0]+'/'+station[1]
339  os.mkdir(dt_basedir+wheel[0]+'/'+station[1])
340  for sector in range(1,station[2]+1):
341  ssector = "%02d" % sector
342  #print dt_basedir+wheel[0]+'/'+station[1]+'/'+ssector
343  os.mkdir(dt_basedir+wheel[0]+'/'+station[1]+'/'+ssector)
344 
345  print(os.getcwd())
346 
347 ######################################################
348 
349 def doMapPlotsDT(dt_basedir, tfiles_plotting):
350  """write DT map plots
351 
352  "DTvsphi_st%dwh%s" % (station, wheelletter):
353 
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
357 
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.
361 
362 
363  "DTvsz_st%dsec%02d" % (station, sector)
364 
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
368 
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).
373 
374 
375  "DTvsz_st%dsecALL" % (station)
376 
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
380 
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)."""
384 
385 
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]+'/'
390  label = "DTvsphi_st%dwh%s" % (int(station[1]), wheelLetter(int(wheel[1])))
391  htitle = "wheel %+d, station %s" % (int(wheel[1]), station[1])
392  #mapplot(tfiles_plotting, label, "x", window=25., title=htitle, fitsawteeth=True,fitsine=True)
393  mapplot(tfiles_plotting, label, "x", window=10., title=htitle, fitsine=True,fitpeaks=True,peaksbins=2)
394  c1.SaveAs(pdir+'map_DTvsphi_x.png')
395  #mapplot(tfiles_plotting, label, "dxdz", window=25., title=htitle, fitsawteeth=True,fitsine=True)
396  mapplot(tfiles_plotting, label, "dxdz", window=10., title=htitle,peaksbins=2)
397  c1.SaveAs(pdir+'map_DTvsphi_dxdz.png')
398 
399  if station[1]=='4': continue
400  #mapplot(tfiles_plotting, label, "y", window=25., title=htitle, fitsawteeth=True,fitsine=True)
401  mapplot(tfiles_plotting, label, "y", window=10., title=htitle,peaksbins=2)
402  c1.SaveAs(pdir+'map_DTvsphi_y.png')
403  #mapplot(tfiles_plotting, label, "dydz", window=25., title=htitle, fitsawteeth=True,fitsine=True)
404  mapplot(tfiles_plotting, label, "dydz", window=10., title=htitle,peaksbins=2)
405  c1.SaveAs(pdir+'map_DTvsphi_dydz.png')
406 
407 
408  qcount=0
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
414  qcount += 1
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')
423 
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')
429 
430  qcount=0
431  for wheel in DT_TYPES:
432  if wheel[1]!="ALL": continue
433  for station in wheel[2]:
434  if qcount>QUICKTESTN: break
435  qcount += 1
436  pdir = dt_basedir+'/'+wheel[0]+'/'+station[1]+'/'
437  label = "DTvsz_st%ssecALL" % (station[1])
438  htitle = "station %s" % (station[1])
439 
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')
445 
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')
451 
452  saveTestResultsMap(options.runLabel)
453 
454 
455 def doMapPlotsCSC(csc_basedir, tfiles_plotting):
456  """write CSC map plots
457 
458  "CSCvsphi_me%s%d%d" % (endcap, station, ring)
459 
460  plots "integrated" over ALL SECTORS:
461  of rphi, drphi/dz vs. phi
462  made for all (endcap,station,ring) combinations
463 
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
468  clickable.
469 
470 
471  "CSCvsr_me%s%dch%02d" % (endcap, station, chamberNumber)
472 
473  plots "integrated" over ALL RINGS:
474  of rphi, drphi/dz vs. z
475  made for all (endcap,station,chamber) combinations
476 
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).
480 
481  "CSCvsr_me%s%dchALL" % (endcap, station)
482 
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
486 
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)."""
490 
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)
499  #mapplot(tfiles_plotting, label, "x", window=15., title=htitle, fitsine=True)
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')
503 
504  saveTestResultsMap(options.runLabel)
505 
506  qcount = 0
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
513  qcount += 1
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')
522 
523  qcount = 0
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
529  qcount += 1
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')
538 
539 
540 
541 def doCurvaturePlotsDT(dt_basedir, tfiles_plotting):
542  """write DT curvature plots
543 
544  "wheel%s_sector%s" % (wheel, sector)
545 
546  wheel in "m2", "m1", "z", "p1", "p2"
547  station 1 only!
548  sector in "01", ..., "12"
549 
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
554 
555  made for all (wheel,station=1,sector) combinations
556 
557  Interface: could be accesses through a general DT chambers map for station=1 chambers."""
558 
559  w_dict = {'-2':'m2', '-1':'m1', '0':'z', '1':'p1', '2':'p2'}
560  qcount = 0
561  for wheel in DT_TYPES:
562  if wheel[1]=="ALL": continue
563  #station = 1
564  #station = wheel[2][0]
565  for station in wheel[2]:
566  print("curv in ", wheel[0]+'/'+station[1])
567  for sector in range(1,station[2]+1):
568  #if sector>12: break
569  if qcount>QUICKTESTN: break
570  qcount += 1
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')
579 
580 
581 
582 def doSegDiffPlotsDT(dt_basedir, tfiles_plotting, iter_reports):
583  """write segment-difference plots for DT
584 
585  segdiff "dt13_resid" and "dt13_slope"
586 
587  set of plots of
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)
591 
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).
594 
595  segdiff "dt2_resid" and "dt2_slope"
596 
597  set of plots of
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)
601 
602  Interface: then the interface would still be a general DT map,
603  but the info only available from station 2 & 3 chambers."""
604 
605  qcount = 0
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])
611  #print dstations
612  for isector in range(1, istation[2] + 1):
613  if isector > 12: continue
614  if qcount>QUICKTESTN: break
615  qcount += 1
616  ssector = "%02d" % isector
617  pdir = dt_basedir + '/' + iwheel[0] + '/' + istation[1] + '/' + ssector + '/'
618 
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')
623 
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')
629 
630  qcount = 0
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
636  #print dstations
637  for isector in range(1, istation[2] + 1):
638  ssector = "%02d" % isector
639  pdir = dt_basedir + '/' + iwheel[0] + '/' + istation[1] + '/' + ssector + '/'
640  if istation[1]=="1":
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')
643  if istation[1]=="2":
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')
646 
647  """segdiffvsphi "dt13_resid" and "dt13_slope"
648 
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
654 
655  Interface: could be accessed by clicking on wheel number under the "wheel" column
656  in a general DT map
657 
658  segdiffvsphi "dt2_resid" and "dt2_slope"
659 
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
665 
666  Interface: could be accessed by clicking on wheel number under the "wheel" column
667  in a general DT map"""
668 
669  if len(iter_reports)==0: return
670 
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.)#, excludesectors=(1,7))
675  c1.SaveAs(pdir + 'segdifphi_dt13_resid.png')
676  segdiffvsphi(tfiles_plotting, iter_reports, "dt13_slope", int(iwheel[1]), window=10.)#, excludesectors=(1,7))
677  c1.SaveAs(pdir + 'segdifphi_dt13_slope.png')
678  segdiffvsphi(tfiles_plotting, iter_reports, "dt2_resid", int(iwheel[1]), window=10.)#, excludesectors=(1,7))
679  c1.SaveAs(pdir + 'segdifphi_dt2_resid.png')
680  segdiffvsphi(tfiles_plotting, iter_reports, "dt2_slope", int(iwheel[1]), window=15.)#, excludesectors=(1,7))
681  c1.SaveAs(pdir + 'segdifphi_dt2_slope.png')
682 
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] + '/'
687  segdiffvsphi_xalign(tfiles_plotting, int(iwheel[1]), window=10.)
688  c1.SaveAs(pdir + 'segdifphi_x_dt_csc_resid.png')
689 
690 
691 def doSegDiffPlotsCSC(csc_basedir, tfiles_plotting, iter_reports):
692  """write segment-difference plots for CSC
693 
694  segdiff "csc_resid" and "csc_slope"
695 
696  set of plots of
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
700  endcap "m" or "p"
701  ring 1 or 2
702  chamber 1-18 (r1) or 1-36 (r2)
703  note: there's no ME3-ME4 plots for R2
704 
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)."""
707 
708  qcount = 0
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
718  qcount += 1
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')
727 
728  """segdiffvsphicsc "csc_resid" and "csc_slope"
729 
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
735  endcap "m" or "p"
736 
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)."""
739 
740  qcount = 0
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
746  qcount += 1
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')
752 
753 
754 def doFitFunctionsPlotsDT(dt_basedir, iter_tfile, iter_reports):
755  """write fit functions plots for DT
756 
757  DT bellcurves and polynomials
758 
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?)
762 
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
768 
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
772 
773  made for all (wheel,station,sector) combinations
774 
775  Interface: could be accesses through a general DT chambers map."""
776 
777  qcount = 0
778  clearDDT()
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
785  qcount += 1
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)
790  #c1.SaveAs(pdir+'dt_bellcurves.png')
791  saveAs(pdir+'dt_bellcurves.png')
792  polynomials(iter_tfile, iter_reports, label, False)
793  #c1.SaveAs(pdir+'dt_polynomials.png')
794  saveAs(pdir+'dt_polynomials.png')
795  #printDeltaTs()
796 
797 
798 def doFitFunctionsPlotsCSC(csc_basedir, iter_tfile, iter_reports):
799  """write fit functions plots for CSC
800 
801  CSC bellcurves and polynomials
802 
803  set of plots of bellcurves
804  rphi, drphidz, rphi vs. drphidz
805 
806  set of plots of polynomials
807  rphi vs. rphi pos, rphi vs drphidz angle
808  drphidz vs. rphi pos, drphidz vs drphidz angle
809 
810  made for all (endcap,station,ring,chamber) combinations
811 
812  Interface: could be accesses through a general CSC chambers map."""
813 
814  qcount = 0
815  clearDDT()
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
823  qcount += 1
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)
828  #c1.SaveAs(pdir+'csc_bellcurves.png')
829  saveAs(pdir+'csc_bellcurves.png')
830  polynomials(iter_tfile, iter_reports, label, False)
831  #c1.SaveAs(pdir+'csc_polynomials.png')
832  saveAs(pdir+'csc_polynomials.png')
833  #printDeltaTs()
834 
835 
836 
837 def doIterationPlots(iteration_directory, tfiles_plotting, iter_tfile, iter_reports):
838  dt_basedir = iteration_directory+'/'+'MB'
839  csc_basedir = iteration_directory+'/'
840 
841  if DO_DT and DO_MAP:
842  doMapPlotsDT(dt_basedir, tfiles_plotting)
843  if DO_CSC and DO_MAP:
844  doMapPlotsCSC(csc_basedir, tfiles_plotting)
845 
846  if DO_DT and DO_CURVATURE:
847  doCurvaturePlotsDT(dt_basedir, tfiles_plotting)
848  #if DO_CSC and DO_CURVATURE:
849  # doCurvaturePlotsCSC(csc_basedir, tfiles_plotting)
850 
851  if DO_DT and DO_SEGDIFF:
852  doSegDiffPlotsDT(dt_basedir, tfiles_plotting, iter_reports)
853  if DO_CSC and DO_SEGDIFF:
854  doSegDiffPlotsCSC(csc_basedir, tfiles_plotting, iter_reports)
855 
856  if DO_DT and DO_FIT:
857  doFitFunctionsPlotsDT(dt_basedir, iter_tfile, iter_reports)
858  if DO_CSC and DO_FIT:
859  doFitFunctionsPlotsCSC(csc_basedir, iter_tfile, iter_reports)
860 
861 
862 def createCanvasesList(fname="canvases_list.js"):
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.
865  '''
866  CANVASES_LIST = []
867  for scope in CANVASES_LIST_TEMPLATE:
868  scope_entry = []
869  if len(scope)>2:
870  scope_entry = [scope[0],scope[1]]
871  for canvas_entry in scope[2:]:
872  if isFileUnderDir("./",canvas_entry[1]):
873  scope_entry.append(canvas_entry)
874  CANVASES_LIST.append(scope_entry)
875 
876  ff = open(fname,mode="w")
877  print("var CANVASES_LIST = ", file=ff)
878  json.dump(CANVASES_LIST,ff)
879  ff.close()
880 
881 
882 def createCanvasToIDList(fname="canvas2id_list.js"):
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.
886  '''
887  CANVAS2ID_LIST = []
888  ID_LIST = []
889  for scope in CANVASES_LIST_TEMPLATE:
890  if len(scope)>2:
891  for canvas_entry in scope[2:]:
892  ids = idsForFile("./",canvas_entry[1])
893  # scope_entry.append(canvas_entry)
894  # uniquify:
895  set_ids = set(ids)
896  uids = list(set_ids)
897  ID_LIST.extend(uids)
898  print(canvas_entry, ":", len(uids), "ids")
899  if (len(uids)>0):
900  CANVAS2ID_LIST.append( (canvas_entry[1],uids) )
901  #print CANVAS2ID_LIST
902  CANVAS2ID_LIST_DICT = dict(CANVAS2ID_LIST)
903  #print CANVAS2ID_LIST_DICT
904  ff = open(fname,mode="w")
905  print("var CANVAS2ID_LIST = ", file=ff)
906  json.dump(CANVAS2ID_LIST_DICT,ff)
907  ff.close()
908  set_ids = set(ID_LIST)
909  return list(set_ids)
910 
911 def idsForFile(dir_name, file_name):
912  '''Recursively looks for file named file_name under dir_name directory
913  and fill the list with dir names converted to IDs
914  '''
915  id_list = []
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))
921  # recursively access file names in subdirectories
922  elif os.path.isdir(dirfile):
923  #print "Accessing directory:", dirfile
924  ids = idsForFile(dirfile, file_name)
925  if (len(ids)>0):
926  id_list.extend(ids)
927  return id_list
928 
929 
930 def dirToID(d):
931  if d[-1]!='/': d += '/'
932  dtn = d.find("/MB/")
933  if dtn!=-1:
934  return d[dtn+4:-1]
935  cscn = d.find("/ME-/")
936  if cscn!=-1:
937  return 'ME-'+d[cscn+5:-1]
938  cscn = d.find("/ME+/")
939  if cscn!=-1:
940  return 'ME+'+d[cscn+5:-1]
941  return ''
942 
943 
944 ############################################################################################################
945 ############################################################################################################
946 # main script
947 
948 # open input files:
949 
950 #basedir='/disks/sdb5/home_reloc/khotilov/db/cms/alignment'
951 #iteration1 = "iteration_01"
952 #iteration3 = "iteration_03"
953 #iteration1 = "NOV4DT_PASS3noweight_TkHIP_01"
954 #iteration3 = "NOV4DT_PASS3noweight_TkHIP_05"
955 #os.chdir(options.inputDir)
956 #iteration1 = options.i1
957 #iteration3 = options.iN
958 
959 fname = options.inputDir+'/'+options.i1+'/'+i1prefix
960 tfiles1_plotting = []
961 iter1_tfile = None
962 iter1_reports = []
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")
966  sys.exit()
967  if DO_FIT and not os.access(fname+".root",os.F_OK):
968  print("no file "+fname+".root")
969  sys.exit()
970  if DO_MEDIAN and not os.access(fname+"_report.py",os.F_OK):
971  print("no file "+fname+"_report.py")
972  sys.exit()
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
979 
980 fname = options.inputDir+'/'+options.iN+'/'+iNprefix
981 tfilesN_plotting = []
982 iterN_tfile = None
983 iterN_reports = []
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")
986  sys.exit()
987 if DO_FIT and not os.access(fname+".root",os.F_OK):
988  print("no file "+fname+".root")
989  sys.exit()
990 if DO_MEDIAN and not os.access(fname+"_report.py",os.F_OK):
991  print("no file "+fname+"_report.py")
992  sys.exit()
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
999 
1000 if DO_MAP:
1001  os.chdir(options.inputDir)
1002  phiedges2c()
1003 
1004 ######################################################
1005 # setup output:
1006 
1007 # cd to outputDIr
1008 os.chdir(options.outputDir)
1009 
1010 comdir = "common/"
1011 iteration1 = "iter1"
1012 iterationN = "iterN"
1013 
1014 # create directory structure
1015 if options.createDirSructure:
1016  print("WARNING: all existing results in "+options.outputDir+" will be deleted!")
1017  if not SINGLE_ITERATION: createDirectoryStructure(iteration1)
1018  createDirectoryStructure(iterationN)
1019  if not os.access(comdir,os.F_OK):
1020  os.mkdir(comdir)
1021 
1022 ######################################################
1023 # do drawing
1024 
1025 c1 = ROOT.TCanvas("c1","c1",800,600)
1026 
1027 set_palette("blues")
1028 
1029 print("--- ITERATION 1 ---")
1030 if not SINGLE_ITERATION: doIterationPlots(iteration1, tfiles1_plotting, iter1_tfile, iter1_reports)
1031 print("--- ITERATION N ---")
1032 doIterationPlots(iterationN, tfilesN_plotting, iterN_tfile, iterN_reports)
1033 
1034 if CPP_LOADED: ROOT.cleanUpHeap()
1035 
1036 # write distributions of medians plots
1037 
1038 if DO_MEDIAN:
1039  #plotmedians(iter1_reports, iterN_reports)
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')
1042 
1043 # perform diagnostic
1044 if DO_DIAGNOSTIC:
1045  #if not SINGLE_ITERATION: doTests(iter1_reports,"mu_list_1.js","dqm_report_1.js",options.runLabel)
1046  createCanvasesList("canvases_list.js")
1047  pic_ids = createCanvasToIDList("canvas2id_list.js")
1048  doTests(iterN_reports, pic_ids, "mu_list.js","dqm_report.js",options.runLabel)
def wheelLetter
Definition: plotscripts.py:39
const uint16_t range(const Frame &aFrame)
def segdiffvsphi_xalign
def curvatureplot
"param" may be one of "deltax" (Delta x position residuals), "deltadxdz" (Delta (dx/dz) angular resid...
def saveTestResultsMap
def isFileUnderDir
functions definitions
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def segdiffvsphicsc
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
def segdiff_xalign