SND@LHC Software
Loading...
Searching...
No Matches
TrackExtrapolateTool.py
Go to the documentation of this file.
1from __future__ import print_function
2from __future__ import division
3from past.builtins import cmp
4import ROOT
5import shipunit as u
6
7minNdf = 20
8parallelToZ = ROOT.TVector3(0., 0., 1.)
9top = ROOT.gGeoManager.GetTopVolume()
10if top.GetNode('Ecal_1'): z_ecal = top.GetNode('Ecal_1').GetMatrix().GetTranslation()[2]
11elif top.GetNode('SplitCalDetector_1'): z_ecal = top.GetNode('SplitCalDetector_1').GetMatrix().GetTranslation()[2]
12else:
13 print("TrackExtraploate tool: Error, no calo present")
14 z_ecal = 100*u.m
16# etrapolate to a plane perpendicular to beam direction (z)
17 rc,pos,mom = False,None,None
18 fst = fT.getFitStatus()
19 if fst.isFitConverged() and fst.getNdf() > minNdf:
20# test for fit status for each point
21 if fT.getPoint(0).getFitterInfo() and fT.getPoint(1).getFitterInfo():
22 fstate0,fstate1 = fT.getFittedState(0),fT.getFittedState(1)
23 fPos0,fPos1 = fstate0.getPos(),fstate1.getPos()
24 if abs(z-fPos0.z()) < abs(z-fPos1.z()): fstate = fstate0
25 else: fstate = fstate1
26 zs = min(z,z_ecal)
27 NewPosition = ROOT.TVector3(0., 0., zs)
28 rep = ROOT.genfit.RKTrackRep(13*cmp(fstate.getPDG(),0) )
29 state = ROOT.genfit.StateOnPlane(rep)
30 pos,mom = fstate.getPos(),fstate.getMom()
31 rep.setPosMom(state,pos,mom)
32 try:
33 rep.extrapolateToPlane(state, NewPosition, parallelToZ )
34 pos,mom = state.getPos(),state.getMom()
35 rc = True
36 except:
37 # print 'error with extrapolation: z=',z/u.m,'m',pos.X(),pos.Y(),pos.Z(),mom.X(),mom.Y(),mom.Z()
38 pass
39 if not rc or z>z_ecal:
40 # use linear extrapolation
41 px,py,pz = mom.X(),mom.Y(),mom.Z()
42 lam = (z-pos.Z())/pz
43 pos = ROOT.TVector3( pos.X()+lam*px, pos.Y()+lam*py, z )
44 return rc,pos,mom