00001
00002
00003 import re,os,sys,shutil
00004 import optparse
00005
00006 from mutypes import *
00007
00008 execfile("plotscripts.py")
00009
00010 ROOT.gROOT.SetBatch(1);
00011
00012
00013
00014
00015
00016
00017 usage='%prog [options]\n'+\
00018 'This script dumps muon alignment validation plots '+\
00019 '(see https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideMuonAlignValidationPlots) '+\
00020 'in web-friendly png format into a predefined directory structure '+\
00021 'and also (to be implemented) does some quality checks for these plots.\n'+\
00022 'Script uses output of the first and last iterations of muon alignment runs '+\
00023 'that should be located in inputDir+i1 and inputDir+iN directories (see options descriptions). '+\
00024 'Each of these directories should contain\ni#prefix+"_plotting.root"\ni#prefix+".root"\ni#prefix+"_report.py"\n'+\
00025 'files, where # = 1 or N.\n'+\
00026 'Output will be located in outputDir, which must exist. Plots from the first and last iterations '+\
00027 'will be in outputDir+"iter1" and outputDir+"iterN" respectively, and plots relevant for all iterations will '+\
00028 'reside in outputDir+"common/".\n'+\
00029 'For a first run a --createDirSructure option must be present. If this option is present for subsequent runs '+\
00030 'with the same outputDir, all previous results in "iter1", "iterN" and and "common" would be deleted!\n'+\
00031 'If neither --dt or --csc is present, plots for both systems will be created.\n'+\
00032 'Options must include either -a or any of the following: --map, --segdiff, --fit, --median'
00033
00034 parser=optparse.OptionParser(usage)
00035
00036 parser.add_option("-l", "--runLabel",
00037 help="[REQUIRED] label to use for a run",
00038 type="string",
00039 default='',
00040 dest="runLabel")
00041
00042 parser.add_option("-i", "--inputDir",
00043 help="[REQUIRED] input directory: should contain directories with the first and the final iterations' results",
00044 type="string",
00045 default='',
00046 dest="inputDir")
00047
00048 parser.add_option("--i1",
00049 help="[REQUIRED] directory with the alignment 1st iteration's results relative to inputDir",
00050 type="string",
00051 default='',
00052 dest="i1")
00053
00054 parser.add_option("--iN",
00055 help="[REQUIRED] directory with the alignment last iteration's results relative to inputDir",
00056 type="string",
00057 default='',
00058 dest="iN")
00059
00060 parser.add_option("--i1prefix",
00061 help="filename prefix for the alignment 1st iteration's results. If not provided, i1prefix = i1",
00062 type="string",
00063 default='',
00064 dest="i1prefix")
00065
00066 parser.add_option("--iNprefix",
00067 help="filename prefix for the alignment last iteration's results. If not provided, iNprefix = iN",
00068 type="string",
00069 default='',
00070 dest="iNprefix")
00071
00072 parser.add_option("-o", "--outputDir",
00073 help="output directory: all plots will be saved with relation to outputDir. If not provided, consider outputDir = inputDir",
00074 type="string",
00075 default='',
00076 dest="outputDir")
00077
00078 parser.add_option("--createDirSructure",
00079 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!",
00080 action="store_true",
00081 default=False,
00082 dest="createDirSructure")
00083
00084 parser.add_option("--dt",
00085 help="If it is present, but not --csc, DT only plots will be created",
00086 action="store_true",
00087 default=False,
00088 dest="dt")
00089
00090 parser.add_option("--csc",
00091 help="If this is present, but not --dt, CSC only plots will be created",
00092 action="store_true",
00093 default=False,
00094 dest="csc")
00095
00096 parser.add_option("-a","--all",
00097 help="If present, all types of plots will be created",
00098 action="store_true",
00099 default=False,
00100 dest="all")
00101
00102 parser.add_option("--map",
00103 help="If present, map plots will be created",
00104 action="store_true",
00105 default=False,
00106 dest="map")
00107
00108 parser.add_option("--segdiff",
00109 help="If present, segdiff plots will be created",
00110 action="store_true",
00111 default=False,
00112 dest="segdiff")
00113
00114 parser.add_option("--curvature",
00115 help="If present, curvature plots will be created",
00116 action="store_true",
00117 default=False,
00118 dest="curvature")
00119
00120 parser.add_option("--fit",
00121 help="If present, fit functions plots will be created",
00122 action="store_true",
00123 default=False,
00124 dest="fit")
00125
00126 parser.add_option("--median",
00127 help="If present, median plots will be created",
00128 action="store_true",
00129 default=False,
00130 dest="median")
00131
00132 parser.add_option("--diagnostic",
00133 help="If present, will run diagnostic checks",
00134 action="store_true",
00135 default=False,
00136 dest="diagnostic")
00137
00138 parser.add_option("-v", "--verbose",
00139 help="Degree of debug info verbosity",
00140 type="int",
00141 default=0,
00142 dest="verbose")
00143
00144 options,args=parser.parse_args()
00145
00146 if options.runLabel=='' or options.inputDir=='' or options.i1=='' or options.iN=='':
00147 print "\nOne or more of REQUIRED options is missing!\n"
00148 parser.print_help()
00149
00150 sys.exit()
00151
00152 outdir = options.outputDir
00153 if outdir=='': outdir = options.inputDir
00154
00155 i1prefix = options.i1prefix
00156 if i1prefix=='' : i1prefix = options.i1
00157
00158 iNprefix = options.iNprefix
00159 if iNprefix=='' : iNprefix = options.iN
00160
00161 if not os.access(outdir,os.F_OK):
00162 print "\noutDir = "+outdir+"\ndoes not exist! Exiting..."
00163 sys.exit()
00164
00165
00166 DO_DT = False
00167 DO_CSC = False
00168 if options.dt or not ( options.dt or options.csc):
00169 DO_DT = True
00170 if options.csc or not ( options.dt or options.csc):
00171 DO_CSC = True
00172
00173 if not (options.all or options.map or options.curvature or options.segdiff or options.fit or options.median or options.diagnostic):
00174 print "\nOptions must include either -a or any of the following: --map, --segdiff, --fit, --median, --diagnostic. Exiting..."
00175 sys.exit()
00176
00177 SINGLE_ITERATION = False
00178 if i1prefix == iNprefix: SINGLE_ITERATION = True
00179
00180 DO_MAP = False
00181 DO_SEGDIFF = False
00182 DO_CURVATURE = False
00183 DO_FIT = False
00184 DO_MEDIAN = False
00185 if options.map or options.all:
00186 DO_MAP = True
00187 if options.segdiff or options.all:
00188 DO_SEGDIFF = True
00189 if options.curvature or options.all:
00190 DO_CURVATURE = True
00191 if options.fit or options.all:
00192 DO_FIT = True
00193 if options.median or options.all:
00194 DO_MEDIAN = True
00195
00196 DO_DIAGNOSTIC = options.diagnostic
00197
00198 allOptions = "-l "+options.runLabel+" -i "+options.inputDir+" --i1 "+options.i1+" --iN "+options.iN
00199 if options.i1prefix !='': allOptions += " --i1prefix " + options.i1prefix
00200 if options.iNprefix !='': allOptions += " --iNprefix " + options.iNprefix
00201 allOptions += " -o "+options.outputDir
00202 if options.createDirSructure: allOptions += " --createDirSructure"
00203 if DO_DT: allOptions += " --dt"
00204 if DO_CSC: allOptions += " --csc"
00205 if options.all: allOptions += " -a"
00206 if options.map: allOptions += " --map"
00207 if options.segdiff: allOptions += " --segdiff"
00208 if options.curvature: allOptions += " --curvature"
00209 if options.fit: allOptions += " --fit"
00210 if options.median: allOptions += " --median"
00211 if options.diagnostic: allOptions += " --diagnostic"
00212 print sys.argv[0]+" "+allOptions
00213
00214
00215 QUICKTESTN=10000
00216
00217
00218
00219
00220
00221
00222 CANVASES_LIST_TEMPLATE = [
00223 ['Common',' ',
00224 ['medians distribution','medians.png']
00225 ],
00226 ['DT',' ',
00227 ['Wheel&Station: map of dxdz residual vs phi','map_DTvsphi_dxdz.png'],
00228 ['Wheel&Station: map of dydz residual vs phi','map_DTvsphi_dydz.png'],
00229 ['Wheel&Station: map of x residual vs phi','map_DTvsphi_x.png'],
00230 ['Wheel&Station: map of y residual vs phi','map_DTvsphi_y.png'],
00231 ['Station&Sector: map of dxdz residual vs z','map_DTvsz_dxdz.png'],
00232 ['Station&Sector: map of dydz residual vs z','map_DTvsz_dydz.png'],
00233 ['Station&Sector: map of x residual vs z','map_DTvsz_x.png'],
00234 ['Station&Sector: map of y residual vs z','map_DTvsz_y.png'],
00235 ['Wheel: segdiff in x residuals vs phi','segdifphi_dt13_resid.png'],
00236 ['Wheel: segdiff in dxdz residuals vs phi','segdifphi_dt13_slope.png'],
00237 ['Wheel: segdiff in y residuals vs phi','segdifphi_dt2_resid.png'],
00238 ['Wheel: segdiff in dydz residuals vs phi','segdifphi_dt2_slope.png'],
00239 ['Chamber: segdiff in x residuals','segdif_dt13_resid.png'],
00240 ['Chamber: segdiff in dxdz residuals','segdif_dt13_slope.png'],
00241 ['Chamber: segdiff in y residuals','segdif_dt2_resid.png'],
00242 ['Chamber: segdiff in dydz residuals','segdif_dt2_slope.png'],
00243 ['Chamber: residuals distributions','dt_bellcurves.png'],
00244 ['Chamber: residuals relations to misalignments','dt_polynomials.png'],
00245 ['Chamber: Delta x residuals vs. curvature','dt_curvature_deltax.png'],
00246 ['Chamber: Delta dxdz residuals vs. curvature','dt_curvature_deltadxdz.png']
00247 ],
00248 ['CSC',' ',
00249 ['Station&Ring: map of d(rphi)/dz residual vs phi','map_CSCvsphi_dxdz.png'],
00250 ['Station&Ring: map of rphi residual vs phi','map_CSCvsphi_x.png'],
00251 ['Station&Chamber: map of d(rphi)/dz residual vs r','map_CSCvsr_dxdz.png'],
00252 ['Station&Chamber: map of rphi residual vs r','map_CSCvsr_x.png'],
00253 ['Chamber: segdiff in rphi residuals','segdif_csc_resid.png'],
00254 ['Chamber: segdiff in d(rphi)/dz residuals','segdif_csc_slope.png'],
00255 ['Chamber: residuals distributions','csc_bellcurves.png'],
00256 ['Chamber: residuals relations to misalignments','csc_polynomials.png']
00257 ]
00258 ]
00259
00260
00261
00262
00263
00264
00265 def isFileUnderDir(dir_name, file_name):
00266 '''Recursively looks for file named file_name under dir_name directory
00267 '''
00268 if not DO_DT and dir_name.find("MB")>-1:
00269 return False
00270 if not DO_CSC and dir_name.find("ME")>-1:
00271 return False
00272
00273 for f in os.listdir(dir_name):
00274 dirfile = os.path.join(dir_name, f)
00275 if os.path.isfile(dirfile) and f==file_name:
00276 return True
00277
00278 elif os.path.isdir(dirfile):
00279
00280 if isFileUnderDir(dirfile, file_name): return True
00281 return False
00282
00283
00284
00285 def saveAs(nm):
00286 t1 = time.time()
00287 ddt[15] += 1
00288 c1.SaveAs(nm)
00289 tn = time.time()
00290 ddt[16] = 1./ddt[15]*((ddt[15]-1)*ddt[16] + tn-t1)
00291
00292
00293 def createDirectoryStructure(iteration_name):
00294
00295 if not os.access(iteration_name,os.F_OK):
00296 os.mkdir(iteration_name)
00297
00298 csc_basedir = iteration_name+'/'
00299 for endcap in CSC_TYPES:
00300
00301 shutil.rmtree(csc_basedir+endcap[0],True)
00302 os.mkdir(csc_basedir+endcap[0])
00303 for station in endcap[2]:
00304
00305 os.mkdir(csc_basedir+endcap[0]+'/'+station[1])
00306 for ring in station[2]:
00307
00308 os.mkdir(csc_basedir+endcap[0]+'/'+station[1]+'/'+ring[1])
00309 for chamber in range(1,ring[2]+1):
00310 schamber = "%02d" % chamber
00311
00312 os.mkdir(csc_basedir+endcap[0]+'/'+station[1]+'/'+ring[1]+'/'+schamber)
00313
00314 dt_basedir = iteration_name+'/MB/'
00315
00316 shutil.rmtree(dt_basedir,True)
00317 os.mkdir(dt_basedir)
00318 for wheel in DT_TYPES:
00319
00320 os.mkdir(dt_basedir+wheel[0])
00321 for station in wheel[2]:
00322
00323 os.mkdir(dt_basedir+wheel[0]+'/'+station[1])
00324 for sector in range(1,station[2]+1):
00325 ssector = "%02d" % sector
00326
00327 os.mkdir(dt_basedir+wheel[0]+'/'+station[1]+'/'+ssector)
00328
00329 print os.getcwd()
00330
00331
00332
00333 def doMapPlotsDT(dt_basedir, tfiles_plotting):
00334 """write DT map plots
00335
00336 "DTvsphi_st%dwh%s" % (station, wheelletter):
00337
00338 plots "integrated" over ALL SECTORS:
00339 of x, y, dxdz, dydz vs. phi (y and dydz only for stations 1-3)
00340 made for all (station,wheel) combinations
00341
00342 Access interface may be arranged into station(1 .. 4) vs. wheel(-2 .. +2) map.
00343 It could be incorporated into a general DT chambers map (column1: wheel, column2: station,
00344 columns3-16 correspond to sector #) by making station numbers in column 2 clickable.
00345
00346
00347 "DTvsz_st%dsec%02d" % (station, sector)
00348
00349 plots "integrated" over ALL WHEELS:
00350 of x, y, dxdz, dydz vs. z (y and dydz only for stations 1-3)
00351 made for all (station,sector) combinations
00352
00353 Interface: may be arranged into station(1 .. 4) vs. sector(1 .. 14) map with sector range
00354 (1 .. 12) for stations 1-3.
00355 It could be incorporated into an EXTENDED general DT chambers map (extended by adding an
00356 identifier "ALL" in column1 for wheel number)."""
00357
00358 for wheel in DT_TYPES:
00359 if wheel[1]=="ALL": continue
00360 for station in wheel[2]:
00361 pdir = dt_basedir+'/'+wheel[0]+'/'+station[1]+'/'
00362 label = "DTvsphi_st%dwh%s" % (int(station[1]), wheelLetter(int(wheel[1])))
00363 htitle = "wheel %+d, station %s" % (int(wheel[1]), station[1])
00364 mapplot(tfiles_plotting, label, "x", window=15., title=htitle, fitsawteeth=True,fitsine=True)
00365 c1.SaveAs(pdir+'map_DTvsphi_x.png')
00366
00367 mapplot(tfiles_plotting, label, "dxdz", window=15., title=htitle)
00368 c1.SaveAs(pdir+'map_DTvsphi_dxdz.png')
00369
00370 if station[1]=='4': continue
00371
00372 mapplot(tfiles_plotting, label, "y", window=15., title=htitle)
00373 c1.SaveAs(pdir+'map_DTvsphi_y.png')
00374
00375 mapplot(tfiles_plotting, label, "dydz", window=15., title=htitle)
00376 c1.SaveAs(pdir+'map_DTvsphi_dydz.png')
00377
00378 qcount=0
00379 for wheel in DT_TYPES:
00380 if wheel[1]!="ALL": continue
00381 for station in wheel[2]:
00382 for sector in range(1,station[2]+1):
00383 if qcount>QUICKTESTN: break
00384 qcount += 1
00385 ssector = "%02d" % sector
00386 pdir = dt_basedir+'/'+wheel[0]+'/'+station[1]+'/'+ssector+'/'
00387 label = "DTvsz_st%ssec%s" % (station[1], ssector)
00388 htitle = "station %s, sector %d" % (station[1], sector)
00389 mapplot(tfiles_plotting, label, "x", window=15., title=htitle)
00390 c1.SaveAs(pdir+'map_DTvsz_x.png')
00391 mapplot(tfiles_plotting, label, "dxdz", window=15., title=htitle)
00392 c1.SaveAs(pdir+'map_DTvsz_dxdz.png')
00393
00394 if station[1]=='4': continue
00395 mapplot(tfiles_plotting, label, "y", window=15., title=htitle)
00396 c1.SaveAs(pdir+'map_DTvsz_y.png')
00397 mapplot(tfiles_plotting, label, "dydz", window=15., title=htitle)
00398 c1.SaveAs(pdir+'map_DTvsz_dydz.png')
00399
00400 saveTestResultsMap(options.runLabel)
00401
00402
00403 def doMapPlotsCSC(csc_basedir, tfiles_plotting):
00404 """write CSC map plots
00405
00406 "CSCvsphi_me%s%d%d" % (endcap, station, ring)
00407
00408 plots "integrated" over ALL SECTORS:
00409 of rphi, drphi/dz vs. phi
00410 made for all (endcap,station,ring) combinations
00411
00412 Interface: may be arranged into two station(1 .. 4) vs. R(1 .. 4) maps for both endcaps
00413 with R range (1 .. 4) for stations 2-4
00414 It could be incorporated into a general CSC chambers map (column1: endcap, column2: station,
00415 column3: ring, columns4-40 correspond to chamber #) by making ring numbers in column 3
00416 clickable.
00417
00418
00419 "CSCvsr_me%s%dch%02d" % (endcap, station, chamberNumber)
00420
00421 plots "integrated" over ALL RINGS:
00422 of rphi, drphi/dz vs. z
00423 made for all (endcap,station,chamber) combinations
00424
00425 Interface: may be arranged into two station(1 .. 4) vs. chamber(1 .. 36) maps for both endcaps
00426 It could be incorporated into an EXTENDED general CSC chambers map (extended by adding an
00427 identifier "ALL" in column3 for ring number)."""
00428
00429 for endcap in CSC_TYPES:
00430 for station in endcap[2]:
00431 for ring in station[2]:
00432 if ring[1]=="ALL": continue
00433 pdir = csc_basedir+'/'+endcap[0]+'/'+station[1]+'/'+ring[1]+'/'
00434 label = "CSCvsphi_me%s%s%s" % (endcap[1], station[1], ring[1])
00435 htitle = "%s%s/%s" % (endcap[0], station[1],ring[1])
00436 mapplot(tfiles_plotting, label, "x", window=15., title=htitle, fitsine=True)
00437 c1.SaveAs(pdir+'map_CSCvsphi_x.png')
00438 mapplot(tfiles_plotting, label, "dxdz", window=15., title=htitle)
00439 c1.SaveAs(pdir+'map_CSCvsphi_dxdz.png')
00440
00441 saveTestResultsMap(options.runLabel)
00442
00443 qcount = 0
00444 for endcap in CSC_TYPES:
00445 for station in endcap[2]:
00446 for ring in station[2]:
00447 if ring[1]!="ALL": continue
00448 for chamber in range(1,ring[2]+1):
00449 if qcount>QUICKTESTN: break
00450 qcount += 1
00451 schamber = "%02d" % chamber
00452 pdir = csc_basedir+'/'+endcap[0]+'/'+station[1]+'/'+ring[1]+'/'+schamber+'/'
00453 label = "CSCvsr_me%s%sch%s" % (endcap[1], station[1], schamber)
00454 htitle = "%s%s/ALL/%d" % (endcap[0], station[1],chamber)
00455 mapplot(tfiles_plotting, label, "x", window=15., title=htitle)
00456 c1.SaveAs(pdir+'map_CSCvsr_x.png')
00457 mapplot(tfiles_plotting, label, "dxdz", window=15., title=htitle)
00458 c1.SaveAs(pdir+'map_CSCvsr_dxdz.png')
00459
00460
00461 def doCurvaturePlotsDT(dt_basedir, tfiles_plotting):
00462 """write DT curvature plots
00463
00464 "wheel%s_sector%s" % (wheel, sector)
00465
00466 wheel in "m2", "m1", "z", "p1", "p2"
00467 station 1 only!
00468 sector in "01", ..., "12"
00469
00470 "param" may be one of
00471 "deltax" (Delta x position residuals),
00472 "deltadxdz" (Delta (dx/dz) angular residuals),
00473 "curverr" (Delta x * d(Delta q/pT)/d(Delta x) = Delta q/pT in the absence of misalignment) - not necessary
00474
00475 made for all (wheel,station=1,sector) combinations
00476
00477 Interface: could be accesses through a general DT chambers map for station=1 chambers."""
00478
00479 w_dict = {'-2':'m2', '-1':'m1', '0':'z', '1':'p1', '2':'p2'}
00480 qcount = 0
00481 for wheel in DT_TYPES:
00482 if wheel[1]=="ALL": continue
00483
00484 station = wheel[2][0]
00485 print wheel[0]+'/'+station[1]
00486 for sector in range(1,station[2]+1):
00487 if sector>12: break
00488 if qcount>QUICKTESTN: break
00489 qcount += 1
00490 ssector = "%02d" % sector
00491 pdir = dt_basedir+'/'+wheel[0]+'/'+station[1]+'/'+ssector+'/'
00492 label = "wheel%s_sector%s" % (w_dict[wheel[1]], ssector)
00493 thetitle ="Wheel %s, sector %s" % (wheel[1], ssector)
00494 curvatureplot(tfiles_plotting, label, "deltax", title=thetitle, window=15., fitline=True)
00495 saveAs(pdir+'dt_curvature_deltax.png')
00496 curvatureplot(tfiles_plotting, label, "deltadxdz", title=thetitle, window=15., fitline=True)
00497 saveAs(pdir+'dt_curvature_deltadxdz.png')
00498
00499
00500 def doSegDiffPlotsDT(dt_basedir, tfiles_plotting, iter_reports):
00501 """write segment-difference plots for DT
00502
00503 segdiff "dt13_resid" and "dt13_slope"
00504
00505 set of plots of
00506 x vs qpt, x for positive, x for negative ("dt13_resid")
00507 dxdz vs qpt, dxdz for positive, dxdz for negative ("dt13_slope")
00508 done for MB1-MB2, MB2-MB3, and MB3-MB4 stations combinations with all possible (wheel, sector)
00509
00510 Interface: could be accessed through a general DT chambers map, but only for chambers in
00511 stations 2-4 (e.g., station 2 would provide MB1-MB2 plots).
00512
00513 segdiff "dt2_resid" and "dt2_slope"
00514
00515 set of plots of
00516 y vs q/pt, y for positive, y for negative ("dt2_resid")
00517 dydz vs q/pt, dydz for positive, dydz for negative ("dt2_slope")
00518 done for MB1-MB2, MB2-MB3 stations combinations with all possible (wheel, sector)
00519
00520 Interface: then the interface would still be a general DT map,
00521 but the info only available from station 2 & 3 chambers."""
00522
00523 qcount = 0
00524 for iwheel in DT_TYPES:
00525 if iwheel[1]=="ALL": continue
00526 for istation in iwheel[2]:
00527 if istation[1]=="1": continue
00528 dstations = (int(istation[1])-1)*10 + int(istation[1])
00529
00530 for isector in range(1, istation[2] + 1):
00531 if isector > 12: continue
00532 if qcount>QUICKTESTN: break
00533 qcount += 1
00534 ssector = "%02d" % isector
00535 pdir = dt_basedir + '/' + iwheel[0] + '/' + istation[1] + '/' + ssector + '/'
00536
00537 segdiff(tfiles_plotting, "dt13_resid", dstations, wheel=int(iwheel[1]), sector=isector, window=10.)
00538 c1.SaveAs(pdir + 'segdif_dt13_resid.png')
00539 segdiff(tfiles_plotting, "dt13_slope", dstations, wheel=int(iwheel[1]), sector=isector, window=10.)
00540 c1.SaveAs(pdir + 'segdif_dt13_slope.png')
00541
00542 if istation[1] == '4': continue
00543 segdiff(tfiles_plotting, "dt2_resid", dstations, wheel=int(iwheel[1]), sector=isector, window=10.)
00544 c1.SaveAs(pdir + 'segdif_dt2_resid.png')
00545 segdiff(tfiles_plotting, "dt2_slope", dstations, wheel=int(iwheel[1]), sector=isector, window=10.)
00546 c1.SaveAs(pdir + 'segdif_dt2_slope.png')
00547
00548 """segdiffvsphi "dt13_resid" and "dt13_slope"
00549
00550 plot for a specific wheel #:
00551 x vs phi of pair ("dt13_resid")
00552 dxdz vs phi of pair ("dt13_slope")
00553 contains all three combinations of neighboring stations
00554 made for all possible wheel values
00555
00556 Interface: could be accessed by clicking on wheel number under the "wheel" column
00557 in a general DT map
00558
00559 segdiffvsphi "dt2_resid" and "dt2_slope"
00560
00561 plot for a specific wheel #:
00562 y vs phi of pair ("dt2_resid")
00563 dydz vs phi of pair ("dt2_slope")
00564 contains both MB1-MB2 and MB2-MB3 combinations
00565 made for all possible wheel values
00566
00567 Interface: could be accessed by clicking on wheel number under the "wheel" column
00568 in a general DT map"""
00569
00570 if len(iter_reports)==0: return
00571
00572 for iwheel in DT_TYPES:
00573 if iwheel[1]=="ALL": continue
00574 pdir = dt_basedir + '/' + iwheel[0] + '/'
00575 segdiffvsphi(tfiles_plotting, iter_reports, "dt13_resid", int(iwheel[1]), window=15., excludesectors=(1,7))
00576 c1.SaveAs(pdir + 'segdifphi_dt13_resid.png')
00577 segdiffvsphi(tfiles_plotting, iter_reports, "dt13_slope", int(iwheel[1]), window=15., excludesectors=(1,7))
00578 c1.SaveAs(pdir + 'segdifphi_dt13_slope.png')
00579 segdiffvsphi(tfiles_plotting, iter_reports, "dt2_resid", int(iwheel[1]), window=15., excludesectors=(1,7))
00580 c1.SaveAs(pdir + 'segdifphi_dt2_resid.png')
00581 segdiffvsphi(tfiles_plotting, iter_reports, "dt2_slope", int(iwheel[1]), window=15., excludesectors=(1,7))
00582 c1.SaveAs(pdir + 'segdifphi_dt2_slope.png')
00583
00584
00585 def doSegDiffPlotsCSC(csc_basedir, tfiles_plotting, iter_reports):
00586 """write segment-difference plots for CSC
00587
00588 segdiff "csc_resid" and "csc_slope"
00589
00590 set of plots of
00591 rphi vs qpt, rphi for positive, rphi for negative ("csc_resid")
00592 drphidz vs qpt, drphidz for positive, drphidz for negative ("csc_slope")
00593 done for ME1-ME2, ME2-ME3, and ME3-ME4 stations combinations with
00594 endcap "m" or "p"
00595 ring 1 or 2
00596 chamber 1-18 (r1) or 1-36 (r2)
00597 note: there's no ME3-ME4 plots for R2
00598
00599 Interface: could be accessed through a general CSC chambers map, but only for chambers in
00600 stations 2-4 (e.g., station 2 would provide ME1-ME2 plots)."""
00601
00602 qcount = 0
00603 for iendcap in CSC_TYPES:
00604 for istation in iendcap[2]:
00605 if istation[1]=="1": continue
00606 dstations = (int(istation[1])-1)*10 + int(istation[1])
00607 for iring in istation[2]:
00608 if iring[1]=="ALL": continue
00609 if istation[1]=="4" and iring[1]=="2": continue
00610 for ichamber in range(1,iring[2]+1):
00611 if qcount>QUICKTESTN: break
00612 qcount += 1
00613 schamber = "%02d" % ichamber
00614 pdir = csc_basedir+'/'+iendcap[0]+'/'+istation[1]+'/'+iring[1]+'/'+schamber+'/'
00615 segdiff(tfiles_plotting, "csc_resid", dstations,
00616 endcap=iendcap[1], ring=int(iring[1]), chamber=ichamber, window=10.)
00617 c1.SaveAs(pdir + 'segdif_csc_resid.png')
00618 segdiff(tfiles_plotting, "csc_slope", dstations,
00619 endcap=iendcap[1], ring=int(iring[1]), chamber=ichamber, window=10.)
00620 c1.SaveAs(pdir + 'segdif_csc_slope.png')
00621
00622
00623 def doFitFunctionsPlotsDT(dt_basedir, iter_tfile, iter_reports):
00624 """write fit functions plots for DT
00625
00626 DT bellcurves and polynomials
00627
00628 set of plots of bellcurves
00629 x, dxdz, x vs. dxdz (for all 4 stations)
00630 y, dydz, x vs. dxdz (only for stations 1-3?)
00631
00632 set of plots of polynomials -- for stations 1-3 only??
00633 x vs. xpos, x vs ypos, x vs dxdz angle, x vs dydz angle
00634 y vs. xpos, y vs ypos, y vs dxdz angle, y vs dydz angle
00635 dxdz vs. xpos, dxdz vs ypos, dxdz vs dxdz angle, dxdz vs dydz angle
00636 dydz vs. xpos, dydz vs ypos, dydz vs dxdz angle, dydz vs dydz angle
00637
00638 set of plots of polynomials -- for station 4 only??
00639 x vs. xpos, x vs dxdz angle
00640 dxdz vs. xpos, dxdz vs dxdz angle
00641
00642 made for all (wheel,station,sector) combinations
00643
00644 Interface: could be accesses through a general DT chambers map."""
00645
00646 qcount = 0
00647 clearDDT()
00648 for wheel in DT_TYPES:
00649 if wheel[1]=="ALL": continue
00650 for station in wheel[2]:
00651 print wheel[0]+'/'+station[1]
00652 for sector in range(1,station[2]+1):
00653 if qcount>QUICKTESTN: break
00654 qcount += 1
00655 ssector = "%02d" % sector
00656 pdir = dt_basedir+'/'+wheel[0]+'/'+station[1]+'/'+ssector+'/'
00657 label = "MBwh%sst%ssec%s" % (wheelLetter(int(wheel[1])),station[1],ssector)
00658 bellcurves(iter_tfile, iter_reports, label, False)
00659
00660 saveAs(pdir+'dt_bellcurves.png')
00661 polynomials(iter_tfile, iter_reports, label, False)
00662
00663 saveAs(pdir+'dt_polynomials.png')
00664
00665
00666
00667 def doFitFunctionsPlotsCSC(csc_basedir, iter_tfile, iter_reports):
00668 """write fit functions plots for CSC
00669
00670 CSC bellcurves and polynomials
00671
00672 set of plots of bellcurves
00673 rphi, drphidz, rphi vs. drphidz
00674
00675 set of plots of polynomials
00676 rphi vs. rphi pos, rphi vs drphidz angle
00677 drphidz vs. rphi pos, drphidz vs drphidz angle
00678
00679 made for all (endcap,station,ring,chamber) combinations
00680
00681 Interface: could be accesses through a general CSC chambers map."""
00682
00683 qcount = 0
00684 clearDDT()
00685 for endcap in CSC_TYPES:
00686 for station in endcap[2]:
00687 for ring in station[2]:
00688 if ring[1]=="ALL": continue
00689 print endcap[0]+'/'+station[1]+'/'+ring[1]
00690 for chamber in range(1,ring[2]+1):
00691 if qcount>QUICKTESTN: break
00692 qcount += 1
00693 schamber = "%02d" % chamber
00694 pdir = csc_basedir+'/'+endcap[0]+'/'+station[1]+'/'+ring[1]+'/'+schamber+'/'
00695 label = "ME%s%s%s_%s" % (endcap[1], station[1], ring[1], schamber)
00696 bellcurves(iter_tfile, iter_reports, label, False)
00697
00698 saveAs(pdir+'csc_bellcurves.png')
00699 polynomials(iter_tfile, iter_reports, label, False)
00700
00701 saveAs(pdir+'csc_polynomials.png')
00702
00703
00704
00705
00706 def doIterationPlots(iteration_directory, tfiles_plotting, iter_tfile, iter_reports):
00707 dt_basedir = iteration_directory+'/'+'MB'
00708 csc_basedir = iteration_directory+'/'
00709
00710 if DO_DT and DO_MAP:
00711 doMapPlotsDT(dt_basedir, tfiles_plotting)
00712 if DO_CSC and DO_MAP:
00713 doMapPlotsCSC(csc_basedir, tfiles_plotting)
00714
00715 if DO_DT and DO_CURVATURE:
00716 doCurvaturePlotsDT(dt_basedir, tfiles_plotting)
00717
00718
00719
00720 if DO_DT and DO_SEGDIFF:
00721 doSegDiffPlotsDT(dt_basedir, tfiles_plotting, iter_reports)
00722 if DO_CSC and DO_SEGDIFF:
00723 doSegDiffPlotsCSC(csc_basedir, tfiles_plotting, iter_reports)
00724
00725 if DO_DT and DO_FIT:
00726 doFitFunctionsPlotsDT(dt_basedir, iter_tfile, iter_reports)
00727 if DO_CSC and DO_FIT:
00728 doFitFunctionsPlotsCSC(csc_basedir, iter_tfile, iter_reports)
00729
00730
00731 def createCanvasesList(fname="canvases_list.js"):
00732 '''Use CANVASES_LIST_TEMPLATE as a template to create a canvases list include for the browser.
00733 Write out only those canvases which have existing filename.png plots.
00734 '''
00735 CANVASES_LIST = []
00736 for scope in CANVASES_LIST_TEMPLATE:
00737 scope_entry = []
00738 if len(scope)>2:
00739 scope_entry = [scope[0],scope[1]]
00740 for canvas_entry in scope[2:]:
00741 if isFileUnderDir("./",canvas_entry[1]):
00742 scope_entry.append(canvas_entry)
00743 CANVASES_LIST.append(scope_entry)
00744
00745 ff = open(fname,mode="w")
00746 print >>ff, "var CANVASES_LIST = "
00747 json.dump(CANVASES_LIST,ff)
00748 ff.close()
00749
00750
00751 def createCanvasToIDList(fname="canvas2id_list.js"):
00752 '''Create a canvas-to-ids list include for the browser.
00753 Write out only those canvases which have existing filename.png plots.
00754 '''
00755 CANVAS2ID_LIST = []
00756 for scope in CANVASES_LIST_TEMPLATE:
00757 if len(scope)>2:
00758 for canvas_entry in scope[2:]:
00759 ids = idsForFile("./",canvas_entry[1])
00760
00761
00762 set_ids = set(ids)
00763 uids = list(set_ids)
00764 print canvas_entry, ":", len(uids), "ids"
00765 if (len(uids)>0):
00766 CANVAS2ID_LIST.append( (canvas_entry[1],uids) )
00767
00768 CANVAS2ID_LIST_DICT = dict(CANVAS2ID_LIST)
00769
00770 ff = open(fname,mode="w")
00771 print >>ff, "var CANVAS2ID_LIST = "
00772 json.dump(CANVAS2ID_LIST_DICT,ff)
00773 ff.close()
00774
00775 def idsForFile(dir_name, file_name):
00776 '''Recursively looks for file named file_name under dir_name directory
00777 and fill the list with dir names converted to IDs
00778 '''
00779 id_list = []
00780 for f in os.listdir(dir_name):
00781 dirfile = os.path.join(dir_name, f)
00782 if os.path.isfile(dirfile) and f==file_name:
00783 id_list.append(dirToID(dir_name))
00784
00785 elif os.path.isdir(dirfile):
00786
00787 ids = idsForFile(dirfile, file_name)
00788 if (len(ids)>0):
00789 id_list.extend(ids)
00790 return id_list
00791
00792
00793 def dirToID(d):
00794 if d[-1]!='/': d += '/'
00795 dtn = d.find("/MB/")
00796 if dtn!=-1:
00797 return d[dtn+4:-1]
00798 cscn = d.find("/ME-/")
00799 if cscn!=-1:
00800 return 'ME-'+d[cscn+4:-1]
00801 cscn = d.find("/ME+/")
00802 if cscn!=-1:
00803 return 'ME+'+d[cscn+4:-1]
00804 return ''
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822 fname = options.inputDir+'/'+options.i1+'/'+i1prefix
00823 tfiles1_plotting = []
00824 iter1_tfile = None
00825 iter1_reports = []
00826 if not SINGLE_ITERATION:
00827 if (DO_MAP or DO_SEGDIFF or DO_CURVATURE) and not os.access(fname+"_plotting.root",os.F_OK):
00828 print "no file "+fname+"_plotting.root"
00829 sys.exit()
00830 if DO_FIT and not os.access(fname+".root",os.F_OK):
00831 print "no file "+fname+".root"
00832 sys.exit()
00833 if DO_MEDIAN and not os.access(fname+"_report.py",os.F_OK):
00834 print "no file "+fname+"_report.py"
00835 sys.exit()
00836 if DO_MAP or DO_SEGDIFF or DO_CURVATURE: tfiles1_plotting.append(ROOT.TFile(fname+"_plotting.root"))
00837 if os.access(fname+".root",os.F_OK):
00838 iter1_tfile = ROOT.TFile(fname+".root")
00839 if os.access(fname+"_report.py",os.F_OK):
00840 execfile(fname+"_report.py")
00841 iter1_reports = reports
00842
00843 fname = options.inputDir+'/'+options.iN+'/'+iNprefix
00844 tfilesN_plotting = []
00845 iterN_tfile = None
00846 iterN_reports = []
00847 if (DO_MAP or DO_SEGDIFF or DO_CURVATURE) and not os.access(fname+"_plotting.root",os.F_OK):
00848 print "no file "+fname+"_plotting.root"
00849 sys.exit()
00850 if DO_FIT and not os.access(fname+".root",os.F_OK):
00851 print "no file "+fname+".root"
00852 sys.exit()
00853 if DO_MEDIAN and not os.access(fname+"_report.py",os.F_OK):
00854 print "no file "+fname+"_report.py"
00855 sys.exit()
00856 if DO_MAP or DO_SEGDIFF or DO_CURVATURE: tfilesN_plotting.append(ROOT.TFile(fname+"_plotting.root"))
00857 if os.access(fname+".root",os.F_OK):
00858 iterN_tfile = ROOT.TFile(fname+".root")
00859 if os.access(fname+"_report.py",os.F_OK):
00860 execfile(fname+"_report.py")
00861 iterN_reports = reports
00862
00863 if DO_MAP:
00864 os.chdir(options.inputDir)
00865 phiedges2c()
00866
00867
00868
00869
00870
00871 os.chdir(options.outputDir)
00872
00873 comdir = "common/"
00874 iteration1 = "iter1"
00875 iterationN = "iterN"
00876
00877
00878 if options.createDirSructure:
00879 print "WARNING: all existing results in "+options.outputDir+" will be deleted!"
00880 if not SINGLE_ITERATION: createDirectoryStructure(iteration1)
00881 createDirectoryStructure(iterationN)
00882 if not os.access(comdir,os.F_OK):
00883 os.mkdir(comdir)
00884
00885
00886
00887
00888 c1 = ROOT.TCanvas("c1","c1",800,600)
00889
00890 set_palette("blues")
00891
00892 if not SINGLE_ITERATION: doIterationPlots(iteration1, tfiles1_plotting, iter1_tfile, iter1_reports)
00893 doIterationPlots(iterationN, tfilesN_plotting, iterN_tfile, iterN_reports)
00894
00895 if CPP_LOADED: ROOT.cleanUpHeap()
00896
00897
00898
00899 if DO_MEDIAN:
00900 plotmedians(iter1_reports, iterN_reports)
00901 c1.SaveAs(comdir+'medians.png')
00902
00903
00904 if DO_DIAGNOSTIC:
00905
00906 doTests(iterN_reports,"mu_list.js","dqm_report.js",options.runLabel)
00907 createCanvasesList("canvases_list.js")
00908 createCanvasToIDList("canvas2id_list.js")