def myVertex(t1, t2, PosDir): # closest distance between two tracks # d = |pq . u x v|/|u x v| a = ROOT.TVector3(PosDir[t1]['position'](0), PosDir[t1]['position'](1), PosDir[t1]['position'](2)) u = ROOT.TVector3(PosDir[t1]['direction'](0), PosDir[t1]['direction'](1), PosDir[t1]['direction'](2)) c = ROOT.TVector3(PosDir[t2]['position'](0), PosDir[t2]['position'](1), PosDir[t2]['position'](2)) v = ROOT.TVector3(PosDir[t2]['direction'](0), PosDir[t2]['direction'](1), PosDir[t2]['direction'](2)) pq = a - c uCrossv = u.Cross(v) dist = pq.Dot(uCrossv) / (uCrossv.Mag() + 1E-8) # u.a - u.c + s*|u|**2 - u.v*t = 0 # v.a - v.c + s*v.u - t*|v|**2 = 0 E = u.Dot(a) - u.Dot(c) F = v.Dot(a) - v.Dot(c) A, B = u.Mag2(), -u.Dot(v) C, D = u.Dot(v), -v.Mag2() t = -(C * E - A * F) / (B * C - A * D) X = c.x() + v.x() * t Y = c.y() + v.y() * t Z = c.z() + v.z() * t # sT = ROOT.gROOT.FindAnything('cbmsim') #print 'test2 ',X,Y,Z,dist #print 'truth',sTree.MCTrack[2].GetStartX(),sTree.MCTrack[2].GetStartY(),sTree.MCTrack[2].GetStartZ() return X, Y, Z, abs(dist)
def myVertex(t1, t2, PosDir): # closest distance between two tracks # d = |pq . u x v|/|u x v| # print(' ') # print('myvertex',PosDir) # print(np.shape(PosDir)) # print(PosDir[0]) # print(PosDir[0][0]) a = ROOT.TVector3(PosDir[0][0](0), PosDir[0][0](1), PosDir[0][0](2)) u = ROOT.TVector3(PosDir[0][1](0), PosDir[0][1](1), PosDir[0][1](2)) c = ROOT.TVector3(PosDir[1][0](0), PosDir[1][0](1), PosDir[1][0](2)) v = ROOT.TVector3(PosDir[1][1](0), PosDir[1][1](1), PosDir[1][1](2)) pq = a - c uCrossv = u.Cross(v) dist = pq.Dot(uCrossv) / (uCrossv.Mag() + 1E-8) # u.a - u.c + s*|u|**2 - u.v*t = 0 # v.a - v.c + s*v.u - t*|v|**2 = 0 E = u.Dot(a) - u.Dot(c) F = v.Dot(a) - v.Dot(c) A, B = u.Mag2(), -u.Dot(v) C, D = u.Dot(v), -v.Mag2() t = -(C * E - A * F) / (B * C - A * D) X = c.x() + v.x() * t Y = c.y() + v.y() * t Z = c.z() + v.z() * t return X, Y, Z, abs(dist)
def docaLine(a,b,c,d): u = b-a v = d-c n = u.Cross(v) ac = a-c if n.Mag()==0: dist = ROOT.TMath.Sqrt(ac.Mag2()+3*(ac.Dot(u))**2/u.Mag2()) else: dist = n.Dot(ac)/n.Mag() return dist