SND@LHC Software
Loading...
Searching...
No Matches
evd_fillEnergy.py
Go to the documentation of this file.
1from __future__ import print_function
2import ROOT
3import shipunit as u
4import eveGlobal
5
6
7def collect_hits(lsOfGlobals, checked_muons):
8 MUON = 13
9 sTree = lsOfGlobals.FindObject('cbmsim')
10
11 fPos = ROOT.TVector3()
12 fMom = ROOT.TVector3()
13
14 muon_to_follow = -1
15 for index, track in enumerate(sTree.MCTrack):
16 if abs(track.GetPdgCode()) == MUON and index not in checked_muons:
17 muon_to_follow = index
18 checked_muons.add(muon_to_follow)
19 break
20
21 if muon_to_follow == -1:
22 return {}
23
24 fT = sTree.MCTrack[muon_to_follow]
25 fT.GetStartVertex(fPos)
26 hitlist = {}
27 hitlist[fPos.Z()] = [fPos.X(), fPos.Y(), fT.GetP()]
28# loop over all sensitive volumes to find hits
29 for P in ["vetoPoint", "muonPoint", "EcalPoint", "HcalPoint", "preshowerPoint",
30 "strawtubesPoint", "ShipRpcPoint", "TargetPoint"]:
31 if not sTree.GetBranch(P):
32 continue
33 c = eval("sTree." + P)
34 for p in c:
35 if p.GetTrackID() == muon_to_follow:
36 p.Momentum(fMom)
37 if hasattr(p, "LastPoint"):
38 lp = p.LastPoint()
39 hitlist[lp.z()] = [lp.x(), lp.y(), p.LastMom().Mag()]
40 hitlist[2. * p.GetZ() - lp.z()] = [2. * p.GetX() - lp.x(),
41 2. * p.GetY() - lp.y(),
42 fMom.Mag()]
43 else:
44 hitlist[p.GetZ()] = [p.GetX(), p.GetY(), fMom.Mag()]
45 return hitlist
46
47
48def trajectory_init(lsOfGlobals, name='SHiP MuonTraj'):
49 traj = lsOfGlobals.FindObject(name)
50 if not traj:
51 traj = ROOT.TGraph()
52 traj.SetName(name)
53 traj.SetLineWidth(2)
54 lsOfGlobals.Add(traj)
55 traj.Set(0)
56 return traj
57
58def execute():
59 N_MUONS = 2
60 canvas = ROOT.gROOT.FindObject('Root Canvas EnergyLoss')
61 if not canvas:
62 print("add particle flower not started!")
63 return
64 lsOfGlobals = ROOT.gROOT.GetListOfGlobals()
65 c1 = canvas.cd(1)
66 c1.Clear()
67
68# get zmin, zmax from graphic
69 SHiPDisplay = eveGlobal.SHiPDisplay
70 v = ROOT.gEve.GetViewers().FindChild('Bar Embedded Viewer side')
71 vw = v.GetGLViewer()
72 cam = vw.CurrentCamera()
73 ed = v.GetEditorObject()
74 co = ed.GetCameraOverlay()
75 ax = co.GetAttAxis()
76 fr = vw.GetFrame()
77 test = ROOT.TGLVertex3(0., 0., 0.)
78 vtest = cam.ViewportToWorld(test)
79 zmin = vtest.Z()
80 test = ROOT.TGLVertex3(fr.GetWidth(), 0., 0.)
81 vtest = cam.ViewportToWorld(test)
82 zmax = vtest.Z()
83
84
85 checked_muons = set()
86 all_muons_hitlist = [collect_hits(lsOfGlobals, checked_muons) for _ in range(N_MUONS)]
87 all_muons_hitlist = list(filter(lambda x: x, all_muons_hitlist))
88 trajectories = [trajectory_init(lsOfGlobals, "SHiP MuonTraj_" + str(index))
89 for index in range(len(all_muons_hitlist))]
90
91 emin, emax = 1E9, -1E9
92 for trajectory, hitlist in zip(trajectories, all_muons_hitlist):
93 for index, z in enumerate(sorted(hitlist.keys())):
94 E = hitlist[z][2]
95 trajectory.SetPoint(index, z, E)
96 emax = max(emax, E)
97 emin = min(emin, E)
98
99 emin, emax = emin * 0.9, emax * 1.1
100 print("zmin/max", zmin, zmax)
101 hist = c1.DrawFrame(zmin, emin, zmax, emax)
102 hist.SetYTitle('p (GeV/c)')
103 hist.SetXTitle('z cm')
104 xaxis = hist.GetXaxis()
105 xaxis.SetNdivisions(ax.GetNdivisions())
106 for trajectory in trajectories:
107 trajectory.Draw()
108 txt = ROOT.TLatex()
109 txt.DrawLatexNDC(0.6, 0.8, 'event index:' + str(SHiPDisplay.n))
110 c1.Update()
111
112
113if __name__ == "__main__":
114 execute()
set(INCLUDE_DIRECTORIES ${SYSTEM_INCLUDE_DIRECTORIES} ${VMC_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/shipdata ${CMAKE_SOURCE_DIR}/shipLHC ${CMAKE_SOURCE_DIR}/analysis/cuts ${CMAKE_SOURCE_DIR}/analysis/tools ${FMT_INCLUDE_DIR}) include_directories($
Definition CMakeLists.txt:1
trajectory_init(lsOfGlobals, name='SHiP MuonTraj')
collect_hits(lsOfGlobals, checked_muons)