File indexing completed on 2023-03-17 11:28:58
0001
0002
0003 from __future__ import print_function
0004 from builtins import range
0005 import ROOT
0006 from array import array
0007
0008 from Validation.RecoTrack.plotting.ntuple import *
0009 import analysis
0010
0011 from math import sqrt, copysign, sin, cos, pi
0012
0013 class EventPlotter(object):
0014
0015 def __init__(self):
0016 self.plots_2D = []
0017 self.plots_3D = []
0018 c = ROOT.TColor()
0019 self.colors_G = [c.GetColor(0,255,0), c.GetColor(0,185,0), c.GetColor(50,255,50), \
0020 c.GetColor(0,100,0), c.GetColor(50,155,0), c.GetColor(0,70,155), \
0021 c.GetColor(0,255,0), c.GetColor(0,255,0), c.GetColor(0,255,0)]
0022 self.colors_B = [c.GetColor(0,0,255), c.GetColor(0,0,155), c.GetColor(50,50,255), \
0023 c.GetColor(0,0,80), c.GetColor(50,0,155), c.GetColor(0,70,155), \
0024 c.GetColor(0,0,255), c.GetColor(0,0,255), c.GetColor(0,0,255)]
0025
0026
0027 def Reset(self):
0028 self.plots_2D = []
0029 self.plots_3D = []
0030
0031 def PlotEvent3DHits(self, event, flag="PSG"):
0032 '''
0033 Plots the 3D hits of an event.
0034 flag is an string which defines which hit types to plot
0035 (p for pixel, s for strip, g for glued)
0036 '''
0037 if('p' in flag or 'P' in flag):
0038 pixel_hits = event.pixelHits()
0039 pix_coords = []
0040 for hit in pixel_hits:
0041 pix_coords.append(hit.x())
0042 pix_coords.append(hit.y())
0043 pix_coords.append(hit.z())
0044 pix_plot = ROOT.TPolyMarker3D(len(pix_coords)/3, array('f', pix_coords), 1)
0045 pix_plot.SetMarkerColor(4)
0046
0047 if('s' in flag or 'S' in flag):
0048 strip_hits = event.stripHits()
0049 str_coords = []
0050 for hit in strip_hits:
0051 str_coords.append(hit.x())
0052 str_coords.append(hit.y())
0053 str_coords.append(hit.z())
0054 str_plot = ROOT.TPolyMarker3D(len(str_coords)/3, array('f', str_coords), 1)
0055 str_plot.SetMarkerColor(2)
0056
0057 if('g' in flag or 'G' in flag):
0058 glued_hits = event.gluedHits()
0059 glu_coords = []
0060 for hit in glued_hits:
0061 glu_coords.append(hit.x())
0062 glu_coords.append(hit.y())
0063 glu_coords.append(hit.z())
0064 glu_plot = ROOT.TPolyMarker3D(len(glu_coords)/3, array('f', glu_coords), 1)
0065 glu_plot.SetMarkerColor(3)
0066
0067 if('p' in flag or 'P' in flag): self.plots_3D.append(pix_plot)
0068 if('s' in flag or 'S' in flag): self.plots_3D.append(str_plot)
0069 if('g' in flag or 'G' in flag): self.plots_3D.append(glu_plot)
0070
0071 def PlotXY(self, event, limits=[-1000,1000], flag="PSG"):
0072 '''
0073 Plots the hits of an event in an XY plane.
0074 flag is an string which defines which hit types to plot
0075 (p for pixel, s for strip, g for glued)
0076 '''
0077
0078 if('p' in flag or 'P' in flag):
0079 pixel_hits = event.pixelHits()
0080 pix_x = []
0081 pix_y = []
0082 for hit in pixel_hits:
0083 if(limits[0] < hit.z() < limits[1]):
0084 pix_x.append(hit.x())
0085 pix_y.append(hit.y())
0086 pix_plot = ROOT.TGraph(len(pix_x), array('f', pix_x), array('f', pix_y))
0087 pix_plot.SetMarkerColor(4)
0088
0089 if('s' in flag or 'S' in flag):
0090 strip_hits = event.stripHits()
0091 str_x = []
0092 str_y = []
0093 for hit in strip_hits:
0094 if(limits[0] < hit.z() < limits[1]):
0095 str_x.append(hit.x())
0096 str_y.append(hit.y())
0097 str_plot = ROOT.TGraph(len(str_x), array('f', str_x), array('f', str_y))
0098 str_plot.SetMarkerColor(2)
0099
0100 if('g' in flag or 'G' in flag):
0101 glued_hits = event.gluedHits()
0102 glu_x = []
0103 glu_y = []
0104 for hit in glued_hits:
0105 if(limits[0] < hit.z() < limits[1]):
0106 glu_x.append(hit.x())
0107 glu_y.append(hit.y())
0108 glu_plot = ROOT.TGraph(len(glu_x), array('f', glu_x), array('f', glu_y))
0109 glu_plot.SetMarkerColor(3)
0110
0111 plot = ROOT.TMultiGraph()
0112
0113 if('p' in flag or 'P' in flag): plot.Add(pix_plot,"P")
0114 if('s' in flag or 'S' in flag): plot.Add(str_plot,"P")
0115 if('g' in flag or 'G' in flag): plot.Add(glu_plot,"P")
0116 self.plots_2D.append(plot)
0117
0118 def PlotZY(self, event, limits=[-1000,1000], flag="PSG"):
0119 '''
0120 Plots the hits of an event in an ZR plane.
0121 flag is an string which defines which hit types to plot
0122 (p for pixel, s for strip, g for glued)
0123 '''
0124
0125 if('p' in flag or 'P' in flag):
0126 pixel_hits = event.pixelHits()
0127 pix_z = []
0128 pix_y = []
0129 for hit in pixel_hits:
0130 if(limits[0] < hit.z() < limits[1]):
0131 pix_z.append(hit.z())
0132 pix_y.append(hit.y())
0133 pix_plot = ROOT.TGraph(len(pix_z), array('f', pix_z), array('f', pix_y))
0134 pix_plot.SetMarkerColor(4)
0135
0136 if('s' in flag or 'S' in flag):
0137 strip_hits = event.stripHits()
0138 str_z = []
0139 str_y = []
0140 for hit in strip_hits:
0141 if(limits[0] < hit.z() < limits[1]):
0142 str_z.append(hit.z())
0143 str_y.append(hit.y())
0144 str_plot = ROOT.TGraph(len(str_z), array('f', str_z), array('f', str_y))
0145 str_plot.SetMarkerColor(2)
0146
0147 if('g' in flag or 'G' in flag):
0148 glued_hits = event.gluedHits()
0149 glu_z = []
0150 glu_y = []
0151 for hit in glued_hits:
0152 if(limits[0] < hit.z() < limits[1]):
0153 glu_z.append(hit.z())
0154 glu_y.append(hit.y())
0155 glu_plot = ROOT.TGraph(len(glu_z), array('f', glu_z), array('f', glu_y))
0156 glu_plot.SetMarkerColor(3)
0157
0158 plot = ROOT.TMultiGraph()
0159
0160 if('p' in flag or 'P' in flag): plot.Add(pix_plot,"P")
0161 if('s' in flag or 'S' in flag): plot.Add(str_plot,"P")
0162 if('g' in flag or 'G' in flag): plot.Add(glu_plot,"P")
0163 self.plots_2D.append(plot)
0164
0165 def PlotTracksXY(self, tracks):
0166 plot = ROOT.TMultiGraph()
0167
0168 for track in tracks:
0169 X = []; Y = [];
0170 for hit in track.hits():
0171 if(hit.isValid()):
0172 X.append(hit.x())
0173 Y.append(hit.y())
0174 plot.Add(ROOT.TGraph(len(X),array("f",X),array("f",Y)),"L")
0175
0176 self.plots_2D.append(plot)
0177
0178 def PlotTracksZY(self, tracks):
0179 plot = ROOT.TMultiGraph()
0180
0181 for track in tracks:
0182 Y = []; Z = [];
0183 for hit in track.hits():
0184 if(hit.isValid()):
0185 Y.append(hit.y())
0186 Z.append(hit.z())
0187 plot.Add(ROOT.TGraph(len(Z),array("f",Z),array("f",Y)),"L")
0188
0189 self.plots_2D.append(plot)
0190
0191 def PlotTracks3D(self, tracks):
0192 for track in tracks:
0193 X = []; Y = []; Z = [];
0194 for hit in track.hits():
0195 if(hit.isValid()):
0196 X.append(hit.x())
0197 Y.append(hit.y())
0198 Z.append(hit.z())
0199 if(X):
0200 self.plots_3D.append(ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",Z)))
0201
0202 def PlotPixelTracks3D(self, tracks):
0203 for track in tracks:
0204 X = []; Y = []; Z = [];
0205 for hit in track.pixelHits():
0206 if(hit.isValid()):
0207 X.append(hit.x())
0208 Y.append(hit.y())
0209 Z.append(hit.z())
0210 if(X):
0211 self.plots_3D.append(ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",Z)))
0212
0213 def PlotPixelGluedTracks3D(self, tracks):
0214 for track in tracks:
0215 X = []; Y = []; Z = [];
0216 for hit in track.hits():
0217 if(hit.isValid() and hit.hitType != 1):
0218 X.append(hit.x())
0219 Y.append(hit.y())
0220 Z.append(hit.z())
0221 if(X):
0222 self.plots_3D.append(ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",Z)))
0223
0224 def PlotTrack3D(self, track, color = 1):
0225 '''Plots a single track and prints track info'''
0226
0227
0228
0229 X = []; Y = []; Z = [];
0230 for hit in track.hits():
0231 if(hit.isValid()):
0232 X.append(hit.x())
0233 Y.append(hit.y())
0234 Z.append(hit.z())
0235 if(not X):
0236 print("Track has no valid points")
0237 return
0238 plot = ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",Z))
0239 plot.SetLineColor(color)
0240 self.plots_3D.append(plot)
0241
0242 '''
0243 print "Track parameters:"
0244 print "px : " + str(track.px())
0245 print "py : " + str(track.py())
0246 print "pz : " + str(track.pz())
0247 print "pt : " + str(track.pt())
0248 print "eta : " + str(track.eta())
0249 print "phi : " + str(track.phi())
0250 print "dxy : " + str(track.dxy())
0251 print "dz : " + str(track.dz())
0252 print "q : " + str(track.q())
0253 '''
0254
0255 def TrackHelix(self, track, color = 1, style = 0):
0256 '''Creates a THelix object which can be plotted with Draw() method.'''
0257 if isinstance(track, TrackingParticle):
0258 phi = track.pca_phi()
0259 dxy = track.pca_dxy()
0260 dz = track.pca_dz()
0261 else:
0262 phi = track.phi()
0263 dxy = track.dxy()
0264 dz = track.dz()
0265 xyz = array("d", [-dxy*ROOT.TMath.Sin(phi), dxy*ROOT.TMath.Cos(phi), dz])
0266 v = array("d", [track.px(), track.py(), track.pz()])
0267 w = 0.3*3.8*track.q()*0.01
0268 z_last = dz
0269 for hit in track.hits():
0270 if(hit.isValidHit()): z_last = hit.z()
0271
0272 helix = ROOT.THelix(xyz, v, w, array("d", [dz, z_last]))
0273 helix.SetLineColor(color)
0274 if style == 1: helix.SetLineStyle(9)
0275 if style == 2: helix.SetLineStyle(7)
0276 return helix
0277
0278 def Plot3DHelixes(self, tracks, color = 1, style = 0):
0279 for track in tracks:
0280 if(track.hits()):
0281 self.plots_3D.append(self.TrackHelix(track, color, style))
0282
0283 def Plot3DHelix(self, track, color = 1, style = 0):
0284 if(track.hits()):
0285 self.plots_3D.append(self.TrackHelix(track, color, style))
0286
0287 def Plot3DHits(self, track, color = 1, style = 0):
0288 '''
0289 Plots the 3D hits from a track.
0290 '''
0291 pix_coords = []
0292 for hit in track.pixelHits():
0293 if hit.isValid():
0294 pix_coords.append(hit.x())
0295 pix_coords.append(hit.y())
0296 pix_coords.append(hit.z())
0297 if pix_coords:
0298 pix_plot = ROOT.TPolyMarker3D(len(pix_coords)/3, array('f', pix_coords), 2)
0299 pix_plot.SetMarkerColor(color)
0300 if style == 1: pix_plot.SetMarkerStyle(5)
0301 if style == 2: pix_plot.SetMarkerStyle(4)
0302 self.plots_3D.append(pix_plot)
0303
0304 for hit in track.gluedHits():
0305 if hit.isValid():
0306 x = hit.x(); y = hit.y(); z = hit.z()
0307 if hit.isBarrel():
0308 X = [x, x]
0309 Y = [y, y]
0310 Z = [z - sqrt(hit.zz()), z + sqrt(hit.zz())]
0311 else:
0312 X = [x - copysign(sqrt(hit.xx()),x), x + copysign(sqrt(hit.xx()),x)]
0313 Y = [y - copysign(sqrt(hit.yy()),y), y + copysign(sqrt(hit.yy()),y)]
0314 Z = [hit.z(), hit.z()]
0315 glu_plot = ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",Z))
0316
0317 if style == 1: glu_plot.SetLineStyle(2)
0318 if style == 2: glu_plot.SetLineStyle(3)
0319 glu_plot.SetLineColor(color)
0320 self.plots_3D.append(glu_plot)
0321
0322 for hit in track.stripHits():
0323 if hit.isValid():
0324 x = hit.x(); y = hit.y(); z = hit.z()
0325 if hit.isBarrel():
0326 X = [x, x]
0327 Y = [y, y]
0328 Z = [z - 1.5*sqrt(hit.zz()), z + 1.5*sqrt(hit.zz())]
0329 else:
0330 X = [x - 1.5*copysign(sqrt(hit.xx()),x), x + 1.5*copysign(sqrt(hit.xx()),x)]
0331 Y = [y - 1.5*copysign(sqrt(hit.yy()),y), y + 1.5*copysign(sqrt(hit.yy()),y)]
0332 Z = [hit.z(), hit.z()]
0333 str_plot = ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",Z))
0334 if style == 1: str_plot.SetLineStyle(2)
0335 if style == 2: str_plot.SetLineStyle(3)
0336 str_plot.SetLineColor(color)
0337 self.plots_3D.append(str_plot)
0338
0339 def PlotVertex3D(self, vertex, color=1):
0340 plot = ROOT.TPolyMarker3D(1, array('f', [vertex.x(), vertex.y(), vertex.z()]),3)
0341 plot.SetMarkerColor(color)
0342 self.plots_3D.append(plot)
0343
0344 def PlotPoint3D(self, point, color=1):
0345 plot = ROOT.TPolyMarker3D(1, array('f', [point[0], point[1], point[2]]),3)
0346 plot.SetMarkerColor(color)
0347 self.plots_3D.append(plot)
0348
0349 def PlotTrackingFail(self, match):
0350 X = array('f', [match.last_loc[0], match.fail_loc[0]])
0351 Y = array('f', [match.last_loc[1], match.fail_loc[1]])
0352 Z = array('f', [match.last_loc[2], match.fail_loc[2]])
0353 plot = ROOT.TPolyLine3D(2, X, Y, Z)
0354 plot.SetLineWidth(3)
0355 plot.SetLineColor(2)
0356 self.plots_3D.append(plot)
0357 self.PlotPoint3D(match.last_loc, 2)
0358
0359 def PlotFakes_MatchedRecos(self, event, iterative = 1, reconstructed = 0):
0360 fakes = analysis.FindFakes(event)
0361 if iterative:
0362
0363 for fake in fakes:
0364 self.Reset()
0365 self.Plot3DHelixes([fake],2)
0366 self.Plot3DHits(fake, 2)
0367
0368
0369 icol = 0
0370 particle_inds = []
0371 particles = []
0372 reco_inds = []
0373 recos = []
0374 for hit in fake.hits():
0375 if hit.isValid() and hit.nSimHits() >= 0:
0376 for simHit in hit.simHits():
0377 particle = simHit.trackingParticle()
0378 if particle.index() not in particle_inds:
0379 particle_inds.append(particle.index())
0380 particles.append(particle)
0381
0382 '''
0383 self.Plot3DHelix(particle, ROOT.TColor().GetColor(0,255,0), 1) # kAzure color, maybe ;)
0384 self.Plot3DHits(particle, 3+icol, 1)
0385 icol += 1
0386
0387 print "Number of matched tracks to real particle: " + str(particle.nMatchedTracks())
0388 '''
0389
0390 if reconstructed and particle.nMatchedTracks() > 0:
0391 for info in particle.matchedTrackInfos():
0392 track = info.track()
0393 if track.index() not in reco_inds:
0394 reco_inds.append(track.index())
0395 recos.append(track)
0396
0397 '''
0398 if particle.nMatchedTracks() == 1:
0399 self.Plot3DHelix(track,1,2)
0400 self.Plot3DHits(track,1,2)
0401 else:
0402 self.Plot3DHelix(track,5,2)
0403 self.Plot3DHits(track,5,2)
0404 '''
0405 icol = 0
0406 for particle in particles:
0407 self.Plot3DHelix(particle, self.colors_G[icol], 1)
0408 self.Plot3DHits(particle, self.colors_G[icol], 1)
0409 icol += 1
0410 for track in recos:
0411 self.Plot3DHelix(track,1,2)
0412 self.Plot3DHits(track,1,2)
0413 '''
0414 if track.trackingParticle().nMatchedTracks() == 1:
0415 self.Plot3DHelix(track,1,2)
0416 self.Plot3DHits(track,1,2)
0417 else:
0418 self.Plot3DHelix(track,5,2)
0419 self.Plot3DHits(track,5,2)
0420 '''
0421
0422 self.Draw()
0423 return
0424
0425
0426 '''
0427 self.Plot3DHelixes(fakes,2)
0428 for fake in fakes:
0429 self.Plot3DHits(fake, 2)
0430 # Plot real particle tracks which include fake tracks hits
0431 for hit in fake.hits():
0432 if hit.isValid() and hit.nMatchedTrackingParticles() >= 0:
0433 for info in hit.matchedTrackingParticleInfos():
0434 particle = info.trackingParticle()
0435 self.Plot3DHelix(particle,3,1)
0436 self.Plot3DHits(particle,3,1)
0437
0438 print "Number of matched tracks to real particle: " + str(particle.nMatchedTracks())
0439 # Plot reconstructed tracks of these real particle tracks
0440 if reconstructed and particle.nMatchedTracks() > 0:
0441 for info in particle.matchedTrackInfos():
0442 track = info.track()
0443 if particle.nMatchedTracks() == 1:
0444 self.Plot3DHelix(track,1,2)
0445 self.Plot3DHits(track,1,2)
0446 else:
0447 self.Plot3DHelix(track,5,2)
0448 self.Plot3DHits(track,5,2)
0449 '''
0450
0451 def PlotFakes(self, event, reconstructed = 1, fake_filter = None, end_filter = None, last_filter = None, particle_end_filter = None):
0452 iterative = 1
0453
0454 fakes = analysis.FindFakes(event)
0455 if iterative:
0456
0457 for fake in fakes:
0458
0459 if fake_filter:
0460 info = analysis.FakeInfo(fake)
0461 if info.fake_class not in fake_filter:
0462 continue
0463
0464 self.Reset()
0465 self.Plot3DHelixes([fake],2)
0466 self.Plot3DHits(fake, 2)
0467
0468 fake_info = analysis.FakeInfo(fake)
0469 analysis.PrintTrackInfo(fake, None, 0, fake_info)
0470 if fake_info.matches:
0471 for match in fake_info.matches:
0472 continue
0473
0474
0475
0476 icol = 0
0477 particle_inds = []
0478 particles = []
0479 reco_inds = []
0480 recos = []
0481 for hit in fake.hits():
0482 if hit.isValid() and hit.nMatchedTrackingParticles() >= 0:
0483 for info in hit.matchedTrackingParticleInfos():
0484 particle = info.trackingParticle()
0485 if particle.index() not in particle_inds:
0486 particle_inds.append(particle.index())
0487 particles.append(particle)
0488 if reconstructed and particle.nMatchedTracks() > 0:
0489 for info in particle.matchedTrackInfos():
0490 track = info.track()
0491 if track.index() not in reco_inds:
0492 reco_inds.append(track.index())
0493 recos.append(track)
0494
0495
0496
0497 if hit.isValid() and reconstructed and hit.ntracks() > 0:
0498 for track in hit.tracks():
0499
0500 if (track.index() not in reco_inds) and track.index() != fake.index():
0501 reco_inds.append(track.index())
0502 recos.append(track)
0503
0504
0505 icol = 0
0506 self.ParticleTest(particles, draw=False)
0507 for particle in particles:
0508 self.Plot3DHelix(particle, self.colors_G[icol], 1)
0509 self.plots_3D[-1].SetLineStyle(5)
0510 self.Plot3DHits(particle, self.colors_G[icol], 1)
0511 self.PlotVertex3D(particle.parentVertex(),self.colors_G[icol])
0512
0513
0514
0515 for decay in particle.decayVertices():
0516 self.PlotVertex3D(decay, 5)
0517 analysis.PrintTrackInfo(particle, fake)
0518 icol += 1
0519 icol = 0
0520 for track in recos:
0521 self.Plot3DHelix(track,self.colors_B[icol],2)
0522 self.Plot3DHits(track,self.colors_B[icol],2)
0523
0524 analysis.PrintTrackInfo(track, fake)
0525 icol += 1
0526
0527 if hit.isValid() and hit.z() >= 0: self.PlotDetectorRange("p",4)
0528 elif hit.isValid() and hit.z() < 0: self.PlotDetectorRange("n",4)
0529 else: self.PlotDetectorRange("b",4)
0530
0531 print("****************************\n")
0532 self.Draw()
0533 return
0534
0535 def DrawTrackTest_old(self, track):
0536 c3 = ROOT.TCanvas("3D Plot","3D Plot", 1200, 1200)
0537 self.PlotDetectorRange("b", 4)
0538 for i in range(8): self.plots_3D[i].Draw()
0539 axis = ROOT.TAxis3D()
0540 axis.Draw()
0541 for hit in track.hits():
0542 if hit.isValid():
0543 point = ROOT.TPolyMarker3D(1, array('f', [hit.x(), hit.y(), hit.z()]), 2)
0544 point.Draw()
0545 input("continue")
0546
0547
0548 axis.ToggleZoom()
0549
0550 def DrawTrackTest(self, track):
0551 self.PlotDetectorRange("b", 4)
0552 self.PlotTrack3D(track)
0553
0554 '''
0555 for hit in track.hits():
0556 if hit.isValid():
0557
0558 point = ROOT.TPolyMarker3D(1, array('f', [hit.x(), hit.y(), hit.z()]), 2)
0559 self.plots_3D.append(point)
0560 self.Draw()
0561 '''
0562
0563 def ParticleTest(self, particles, draw=False):
0564 for particle in particles:
0565 print("\nPARTICLE " + str(particle.index()))
0566 for hit in particle.hits():
0567 tof = -1
0568 for info in hit.matchedTrackingParticleInfos():
0569 if info.trackingParticle().index() == particle.index():
0570
0571 tof = info.tof()
0572 print("Index: " + str(hit.index()) + ", Layer: " + str(hit.layerStr()) + ", TOF: " + str(tof) +\
0573 " XY distance: " + str(sqrt(hit.x()**2 + hit.y()**2)) + ", Z: " + str(hit.z()))
0574 self.DrawTrackTest(particle)
0575 if draw:
0576 self.Draw()
0577 self.Reset()
0578
0579 def PlotDetectorRange(self, area="b", plates = 6):
0580 '''
0581 Plots the detector schematic layout.
0582 Area means which part to plot (p = positive side, n = negative side, b = both)
0583 Plates means how many detector circle schemes to plot per side.
0584 '''
0585 r = [17, 17, 57, 57, 112, 112]
0586 z = [30, 70, 70, 120, 120, 280]
0587 for i in range(plates):
0588 X = []; Y = []; Z = []; ZN = []
0589 for t in range(0,101):
0590 X.append(r[i]*cos(2*pi*t/100))
0591 Y.append(r[i]*sin(2*pi*t/100))
0592 Z.append(z[i]*1.0)
0593 ZN.append(-1.0*z[i])
0594 plot = ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",Z),"S")
0595 nplot = ROOT.TPolyLine3D(len(X),array("f",X),array("f",Y),array("f",ZN),"S")
0596 plot.SetLineStyle(3)
0597 nplot.SetLineStyle(3)
0598 if area == "p": self.plots_3D.append(plot)
0599 if area == "n": self.plots_3D.append(nplot)
0600 if area == "b":
0601 self.plots_3D.append(plot)
0602 self.plots_3D.append(nplot)
0603
0604 def ClassHistogram(self, data, name = "Histogram", labels = False, ready = False):
0605 '''
0606 Draws histogram with data. Data is in form of a dictionary,
0607 labels assigned to amount of hits. If labels is defined, it
0608 defines the labels assigned to data.
0609 '''
0610 if ready:
0611 if labels:
0612 keys = [key for key in data]
0613 hist_labels = [labels[key] for key in keys]
0614 hist_data = [data[key] for key in keys]
0615 else:
0616 hist_labels = [key for key in data]
0617 hist_data = [data[key] for key in hist_labels]
0618
0619 c1 = ROOT.TCanvas(name, name, 700, 500)
0620 c1.SetGrid()
0621
0622 hist = ROOT.TH1F(name, name, 30,0,30)
0623 hist.SetStats(0);
0624 hist.SetFillColor(38);
0625 hist.SetCanExtend(ROOT.TH1.kAllAxes);
0626 if ready:
0627 for i in range(len(hist_labels)):
0628
0629 [hist.Fill(hist_labels[i],1) for j in range(hist_data[i])]
0630 else:
0631 for entry in data: hist.Fill(entry,1)
0632 hist.LabelsDeflate()
0633
0634 hist.Draw()
0635
0636 input("Press any key to continue")
0637
0638
0639 def Draw(self):
0640 if self.plots_3D:
0641 c3 = ROOT.TCanvas("3D Plot","3D Plot", 1200, 1200)
0642 view = ROOT.TView3D()
0643 axis = ROOT.TAxis3D()
0644 axis.SetXTitle("x")
0645 axis.SetYTitle("y")
0646 axis.SetZTitle("z")
0647
0648
0649 for plot in self.plots_3D:
0650 if plot: plot.Draw()
0651
0652
0653 axis.Draw()
0654
0655
0656
0657
0658
0659
0660 axis.ToggleZoom()
0661
0662 if self.plots_2D:
0663 c2 = ROOT.TCanvas("2D Plot","2D Plot", 1200, 1200)
0664
0665 for plot in self.plots_2D: plot.Draw("A")
0666
0667 input("Press any key to continue")
0668
0669