18 def __init__(self, hp, sTree, mcTree=None) -> None:
20 self.
mcTree = mcTree
if mcTree
is not None else sTree
22 if not self.
sTree.GetBranch(
"Particles"):
27 self.
LV = {1: ROOT.TLorentzVector(), 2: ROOT.TLorentzVector()}
29 self.
PDG = ROOT.TDatabasePDG.Instance()
56 y_data = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
60 def chi2(self, res, Vy) -> int:
63 s += Vy[i] * res[i // 10] * res[i % 10]
68 res[0] = abs(y_data[0]) - a[5]
69 res[1] = y_data[1] - a[3]
70 res[2] = y_data[2] - a[4]
71 res[3] = y_data[3] - a[0] - a[3] * (a[2] - z0)
72 res[4] = y_data[4] - a[1] - a[4] * (a[2] - z0)
73 res[5] = abs(y_data[5]) - a[8]
74 res[6] = y_data[6] - a[6]
75 res[7] = y_data[7] - a[7]
76 res[8] = y_data[8] - a[0] - a[6] * (a[2] - z0)
77 res[9] = y_data[9] - a[1] - a[7] * (a[2] - z0)
80 def fcn(self, npar, gin, f, par, iflag) -> None:
89 if len(goodTracks) < 2:
91 PosDirCharge, CovMat, scalFac = {}, {}, {}
93 fittedTracks[tr].getFitStatus()
94 xx = fittedTracks[tr].getFittedState()
96 if not global_variables.pidProton
and abs(pid) == 2212:
97 pid = int(math.copysign(211, pid))
98 rep = ROOT.genfit.RKTrackRep(xx.getPDG())
99 state = ROOT.genfit.StateOnPlane(rep)
100 rep.setPosMom(state, xx.getPos(), xx.getMom())
102 "position": xx.getPos(),
103 "direction": xx.getDir(),
104 "momentum": xx.getMom(),
105 "charge": xx.getCharge(),
111 CovMat[tr] = xx.get6DCov()
113 if len(PosDirCharge) < 2:
115 if len(PosDirCharge) > 4:
117 for t1
in PosDirCharge:
118 c1 = PosDirCharge[t1][
"charge"]
119 for t2
in PosDirCharge:
123 if PosDirCharge[t2][
"charge"] == c1:
125 newPos, doca = self.
VertexError(t1, t2, PosDirCharge)
135 PosDirCharge[tr][
"rep"].extrapolateToPoint(PosDirCharge[tr][
"newstate"], newPos,
False)
137 ut.reportError(
"shipVertex: extrapolation did not work")
141 "position": PosDirCharge[tr][
"rep"].getPos(PosDirCharge[tr][
"newstate"]),
142 "direction": PosDirCharge[tr][
"rep"].getDir(PosDirCharge[tr][
"newstate"]),
143 "momentum": PosDirCharge[tr][
"rep"].getMom(PosDirCharge[tr][
"newstate"]),
148 dz = abs(zBefore - newPos[2])
151 ut.reportError(
"shipVertex: abort iteration, too many steps")
152 if global_variables.debug:
154 "abort iteration, too many steps, pos=",
171 (PosDirCharge[t1][
"position"][2] - newPos[2])
172 / PosDirCharge[t1][
"direction"][2]
173 / PosDirCharge[t1][
"momentum"].Mag()
176 (PosDirCharge[t2][
"position"][2] - newPos[2])
177 / PosDirCharge[t2][
"direction"][2]
178 / PosDirCharge[t2][
"momentum"].Mag()
185 if self.
sTree.GetBranch(
"fitTrack2MC"):
186 mctrack = self.
mcTree.MCTrack[self.
sTree.fitTrack2MC[t1]]
188 self.
mcTree.MCTrack[mctrack.GetMotherId()]
200 detPlane = ROOT.genfit.DetPlane(
201 ROOT.TVector3(0, 0, HNLPos[2]), ROOT.TVector3(1, 0, 0), ROOT.TVector3(0, 1, 0)
203 detPlanePtr = ROOT.genfit.SharedPlanePtr(detPlane)
204 st1 = fittedTracks[t1].getFittedState()
205 st2 = fittedTracks[t2].getFittedState()
207 st1.extrapolateToPlane(detPlanePtr)
209 ut.reportError(
"shipVertex.TwoTrackVertex: extrapolation did not work")
212 st2.extrapolateToPlane(detPlanePtr)
214 ut.reportError(
"shipVertex.TwoTrackVertex: extrapolation did not work")
220 cov = ROOT.TMatrixDSym(10)
224 cov[i][j] = cov1[i][j]
226 cov[i][j] = cov2[i - 5][j - 5]
227 covInv = ROOT.TMatrixDSym()
228 ROOT.genfit.tools.invertMatrix(cov, covInv)
230 self.
y_datay_data = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
231 stVal1 = st1.getState()
232 stVal2 = st2.getState()
239 self.
VyVy[i] = covInv[i // 10][i % 10]
242 gMinuit = ROOT.TMinuit(9)
244 gMinuit.SetFCN(tempFcn)
245 gMinuit.SetPrintLevel(-1)
246 rc = gMinuit.DefineParameter(0,
"X pos", HNLPos[0], 0.1, 0, 0)
247 rc = gMinuit.DefineParameter(1,
"Y pos", HNLPos[1], 0.1, 0, 0)
248 rc = gMinuit.DefineParameter(2,
"Z pos", HNLPos[2], 0.1, 0, 0)
249 rc = gMinuit.DefineParameter(3,
"tan1X", mom1[0] / mom1[2], 0.1, 0, 0)
250 rc = gMinuit.DefineParameter(4,
"tan1Y", mom1[1] / mom1[2], 0.1, 0, 0)
251 rc = gMinuit.DefineParameter(5,
"1/mom1", 1.0 / mom1.Mag(), 0.1, 0, 0)
252 rc = gMinuit.DefineParameter(6,
"tan2X", mom2[0] / mom2[2], 0.1, 0, 0)
253 rc = gMinuit.DefineParameter(7,
"tan2Y", mom2[1] / mom2[2], 0.1, 0, 0)
254 rc = gMinuit.DefineParameter(8,
"1/mom2", 1.0 / mom2.Mag(), 0.1, 0, 0)
258 tmp = array(
"d", [0])
259 err = array(
"i", [0])
260 gMinuit.mnexcm(
"HESSE", tmp, -1, err)
263 ut.reportError(
"shipVertex::minos does not work")
273 gMinuit.mnemat(emat, 9)
288 dValue = ctypes.c_double()
289 dError = ctypes.c_double()
290 rc = gMinuit.GetParameter(0, dValue, dError)
291 values[0] = dValue.value
292 errors[0] = dError.value
293 rc = gMinuit.GetParameter(1, dValue, dError)
294 values[1] = dValue.value
295 errors[1] = dError.value
296 rc = gMinuit.GetParameter(2, dValue, dError)
297 values[2] = dValue.value
298 errors[2] = dError.value
299 rc = gMinuit.GetParameter(3, dValue, dError)
300 values[3] = dValue.value
301 errors[3] = dError.value
302 rc = gMinuit.GetParameter(4, dValue, dError)
303 values[4] = dValue.value
304 errors[4] = dError.value
305 rc = gMinuit.GetParameter(5, dValue, dError)
306 values[5] = dValue.value
307 errors[5] = dError.value
308 rc = gMinuit.GetParameter(6, dValue, dError)
309 values[6] = dValue.value
310 errors[6] = dError.value
311 rc = gMinuit.GetParameter(7, dValue, dError)
312 values[7] = dValue.value
313 errors[7] = dError.value
314 rc = gMinuit.GetParameter(8, dValue, dError)
315 values[8] = dValue.value
316 errors[8] = dError.value
321 HNLPosFit = ROOT.TVector3(xFit, yFit, zFit)
327 m1 = self.
PDG.GetParticle(PosDirCharge[t1][
"pdgCode"]).Mass()
328 m2 = self.
PDG.GetParticle(PosDirCharge[t2][
"pdgCode"]).Mass()
337 def getP(fitValues: array[float], cov: array[float], m1, m2):
344 px1 = a3 / (a5 * ROOT.TMath.Sqrt(1 + a3**2 + a4**2))
345 py1 = a4 / (a5 * ROOT.TMath.Sqrt(1 + a3**2 + a4**2))
346 pz1 = 1 / (a5 * ROOT.TMath.Sqrt(1 + a3**2 + a4**2))
347 px2 = a6 / (a8 * ROOT.TMath.Sqrt(1 + a6**2 + a7**2))
348 py2 = a7 / (a8 * ROOT.TMath.Sqrt(1 + a6**2 + a7**2))
349 pz2 = 1 / (a8 * ROOT.TMath.Sqrt(1 + a6**2 + a7**2))
353 E1 = ROOT.TMath.Sqrt(px1**2 + py1**2 + pz1**2 + m1**2)
354 E2 = ROOT.TMath.Sqrt(px2**2 + py2**2 + pz2**2 + m2**2)
355 M = ROOT.TMath.Sqrt(2 * E1 * E2 + m1**2 + m2**2 - 2 * pz1 * pz2 * (1 + a3 * a6 + a4 * a7))
357 A5 = 1 + a3**2 + a4**2
358 A8 = 1 + a6**2 + a7**2
359 M_AtoP = ROOT.TMatrixD(4, 6)
360 MT_AtoP = ROOT.TMatrixD(6, 4)
361 covA = ROOT.TMatrixD(6, 6)
362 M_AtoP[0][0] = (1.0 - a3 * a3 / A5) / (a5 * ROOT.TMath.Sqrt(A5))
363 M_AtoP[0][1] = (-a3 * a4 / A5) / (a5 * ROOT.TMath.Sqrt(A5))
364 M_AtoP[0][2] = (-a3) / (a5 * a5 * ROOT.TMath.Sqrt(A5))
365 M_AtoP[0][3] = (1.0 - a6 * a6 / A8) / (a8 * ROOT.TMath.Sqrt(A8))
366 M_AtoP[0][4] = (-a6 * a7 / A8) / (a8 * ROOT.TMath.Sqrt(A8))
367 M_AtoP[0][5] = (-a6) / (a8 * a8 * ROOT.TMath.Sqrt(A8))
369 M_AtoP[1][0] = (-a3 * a4 / A5) / (a5 * ROOT.TMath.Sqrt(A5))
370 M_AtoP[1][1] = (1.0 - a4 * a4 / A5) / (a5 * ROOT.TMath.Sqrt(A5))
371 M_AtoP[1][2] = (-a4) / (a5 * a5 * ROOT.TMath.Sqrt(A5))
372 M_AtoP[1][3] = (-a6 * a7 / A8) / (a8 * ROOT.TMath.Sqrt(A8))
373 M_AtoP[1][4] = (1.0 - a7 * a7 / A8) / (a8 * ROOT.TMath.Sqrt(A8))
374 M_AtoP[1][5] = (-a7) / (a8 * a8 * ROOT.TMath.Sqrt(A8))
376 M_AtoP[2][0] = (-a3 / A5) / (a5 * ROOT.TMath.Sqrt(A5))
377 M_AtoP[2][1] = (-a4 / A5) / (a5 * ROOT.TMath.Sqrt(A5))
378 M_AtoP[2][2] = (-1.0) / (a5 * a5 * ROOT.TMath.Sqrt(A5))
379 M_AtoP[2][3] = (-a6 / A8) / (a8 * ROOT.TMath.Sqrt(A8))
380 M_AtoP[2][4] = (-a7 / A8) / (a8 * ROOT.TMath.Sqrt(A8))
381 M_AtoP[2][5] = (-1.0) / (a8 * a8 * ROOT.TMath.Sqrt(A8))
383 a5a8 = a5 * a8 * ROOT.TMath.Sqrt(A5) * ROOT.TMath.Sqrt(A8)
385 M_AtoP[3][0] = (-2 * a6 / a5a8 + 2 * a3 * E2 / (a5 * a5 * A5 * E1)) / MM
386 M_AtoP[3][1] = (-2 * a7 / a5a8 + 2 * a4 * E2 / (a5 * a5 * A5 * E1)) / MM
388 2 * (1 + a3 * a6 + a4 * a7) / (a5 * a5a8)
389 - 2 * (1.0 + a3 * a3 + a4 * a4) * E2 / (a5 * a5 * a5 * A5 * E1)
391 M_AtoP[3][3] = (-2 * a3 / a5a8 + 2 * a6 * E1 / (a8 * a8 * A8 * E2)) / MM
392 M_AtoP[3][4] = (-2 * a4 / a5a8 + 2 * a7 * E1 / (a8 * a8 * A8 * E2)) / MM
394 2 * (1 + a3 * a6 + a4 * a7) / (a8 * a5a8)
395 - 2 * (1.0 + a6 * a6 + a7 * a7) * E1 / (a8 * a8 * a8 * A8 * E2)
400 MT_AtoP[j][i] = M_AtoP[i][j]
403 covA[i // 6][i % 6] = cov[i // 6 + 3 + (i % 6 + 3) * 9]
405 tmp = ROOT.TMatrixD(4, 6)
406 tmp.Mult(M_AtoP, covA)
407 covP = ROOT.TMatrixD(4, 4)
408 covP.Mult(tmp, MT_AtoP)
409 P = ROOT.TLorentzVector()
410 P.SetXYZM(Px, Py, Pz, M)
413 P, covP = getP(values, emat, m1, m2)
422 covV = array(
"d", [emat[0], emat[1], emat[2], emat[1 + 9], emat[2 + 9], emat[2 + 2 * 9]])
440 vx = ROOT.TLorentzVector(
443 particle = ROOT.ShipParticle(9900015, 0, -1, -1, t1, t2, P, vx)
444 particle.SetCovV(covV)
445 particle.SetCovP(covP)
446 particle.SetDoca(doca)
456 a, u = PosDir[t1][
"position"], PosDir[t1][
"direction"]
457 c, v = PosDir[t2][
"position"], PosDir[t2][
"direction"]
462 denom = Usq * Vsq - UV**2
463 tmp2 = Vsq * u - UV * v
464 Va = ca.Dot(tmp2) / denom
465 tmp2 = UV * u - Usq * v
466 Vb = ca.Dot(tmp2) / denom
467 X = (a + c + Va * u + Vb * v) * 0.5
469 dist = 2.0 * ROOT.TMath.Sqrt(l1.Dot(l1))
472 T = ROOT.TMatrixD(3, 12)
481 temp = (u[j] * Vsq - v[j] * UV) * u[i] + (u[j] * UV - v[j] * Usq) * v[i]
485 T[i][3 * k + j] = 0.5 * (KD + sign * temp / denom)
488 aNAZ = denom * (ca[j] * Vsq - v.Dot(ca) * v[j])
489 aZAN = (ca.Dot(u) * Vsq - ca.Dot(v) * UV) * 2 * (u[j] * Vsq - v[j] * UV)
490 bNAZ = denom * (ca[j] * UV + (u.Dot(ca) * v[j]) - 2 * ca.Dot(v) * u[j])
491 bZAN = (ca.Dot(u) * UV - ca.Dot(v) * Usq) * 2 * (u[j] * Vsq - v[j] * UV)
492 T[i][3 * k + j] = 0.5 * (
493 Va * KD + u[i] / denom**2 * (aNAZ - aZAN) + v[i] / denom**2 * (bNAZ - bZAN)
497 aNAZ = denom * (2 * ca.Dot(u) * v[j] - ca.Dot(v) * u[j] - ca[j] * UV)
498 aZAN = (ca.Dot(u) * Vsq - ca.Dot(v) * UV) * 2 * (v[j] * Usq - u[j] * UV)
499 bNAZ = denom * (ca.Dot(u) * u[j] - ca[j] * Usq)
500 bZAN = (ca.Dot(u) * UV - ca.Dot(v) * Usq) * 2 * (v[j] * Usq - u[j] * UV)
501 T[i][3 * k + j] = 0.5 * (
502 Vb * KD + u[i] / denom**2 * (aNAZ - aZAN) + v[i] / denom**2 * (bNAZ - bZAN)
504 transT = ROOT.TMatrixD(12, 3)
506 CovTracks = ROOT.TMatrixD(12, 12)
513 xfac = scalFac[tlist[k]]
515 xfac = xfac * scalFac[tlist[k]]
516 CovTracks[i + k * 6][j + k * 6] = CovMat[tlist[k]][i][j] * xfac
518 tmp = ROOT.TMatrixD(3, 12)
519 tmp.Mult(T, CovTracks)
520 covX = ROOT.TMatrixD(3, 3)
521 covX.Mult(tmp, transT)
None TwoTrackVertex(self)
None fcn(self, npar, gin, f, par, iflag)
def residuals(self, y_data, a, int z0)
def VertexError(self, t1, t2, PosDir, CovMat=None, scalFac=None)
None __init__(self, hp, sTree, mcTree=None)