5from argparse
import ArgumentParser
12from ShipGeoConfig
import load_from_root_file
16PDG = ROOT.TDatabasePDG.Instance()
24parser = ArgumentParser()
26parser.add_argument(
"-f",
"--inputFile", dest=
"inputFile", help=
"Input file (MC simulation)", required=
True)
28 "-r",
"--recoFile", dest=
"recoFile", help=
"Reconstruction file (will be used as friend tree)", required=
False
31 "-n",
"--nEvents", dest=
"nEvents", help=
"Number of events to analyze", required=
False, default=999999, type=int
33parser.add_argument(
"-g",
"--geoFile", dest=
"geoFile", help=
"ROOT geofile", required=
True)
34parser.add_argument(
"--Debug", dest=
"Debug", help=
"Switch on debugging", required=
False, action=
"store_true")
35options = parser.parse_args()
38if not options.recoFile:
40 if options.inputFile.find(
"_rec.root") > 0:
41 options.recoFile = options.inputFile
42 options.inputFile = options.inputFile.replace(
"_rec.root",
".root")
44 options.recoFile = options.inputFile.replace(
".root",
"_rec.root")
47if not options.inputFile.find(
",") < 0:
48 sTree = ROOT.TChain(
"cbmsim")
49 recoChain = ROOT.TChain(
"ship_reco_sim")
50 for x
in options.inputFile.split(
","):
52 for x
in options.recoFile.split(
","):
54 sTree.AddFriend(recoChain)
56 f = ROOT.TFile(options.inputFile)
59 sTree.AddFriend(
"ship_reco_sim", options.recoFile)
61if not options.geoFile:
62 options.geoFile = options.inputFile.replace(
"ship.",
"geofile_full.").replace(
"_rec.",
".")
64 fgeo = ROOT.TFile(options.geoFile)
67ShipGeo = load_from_root_file(fgeo,
"ShipGeo")
68dy = ShipGeo.Yheight / u.m
73run = ROOT.FairRunSim()
75run.SetSink(ROOT.FairRootFileSink(ROOT.TMemFile(
"output",
"recreate")))
76run.SetUserConfig(
"g4Config_basic.C")
77rtdb = run.GetRuntimeDb()
83if hasattr(ShipGeo.Bfield,
"fieldMap"):
86 print(
"no fieldmap given, geofile too old, not anymore support")
88sGeo = fgeo[
"FAIRGeom"]
89geoMat = ROOT.genfit.TGeoMaterialInterface()
90ROOT.genfit.MaterialEffects.getInstance().init(geoMat)
91bfield = ROOT.genfit.FairShipFields()
92bfield.setField(fieldMaker.getGlobalField())
93fM = ROOT.genfit.FieldManager.getInstance()
98for x
in ROOT.gGeoManager.GetListOfVolumes():
99 volDict[i] = x.GetName()
108ut.bookHist(h,
"delPOverP",
"delP / P", 400, 0.0, 200.0, 100, -0.5, 0.5)
109ut.bookHist(h,
"pullPOverPx",
"delPx / sigma", 400, 0.0, 200.0, 100, -3.0, 3.0)
110ut.bookHist(h,
"pullPOverPy",
"delPy / sigma", 400, 0.0, 200.0, 100, -3.0, 3.0)
111ut.bookHist(h,
"pullPOverPz",
"delPz / sigma", 400, 0.0, 200.0, 100, -3.0, 3.0)
112ut.bookHist(h,
"delPOverP2",
"delP / P chi2/nmeas<" + str(chi2CutOff), 400, 0.0, 200.0, 100, -0.5, 0.5)
113ut.bookHist(h,
"delPOverPz",
"delPz / Pz", 400, 0.0, 200.0, 100, -0.5, 0.5)
114ut.bookHist(h,
"delPOverP2z",
"delPz / Pz chi2/nmeas<" + str(chi2CutOff), 400, 0.0, 200.0, 100, -0.5, 0.5)
115ut.bookHist(h,
"chi2",
"chi2/nmeas after trackfit", 100, 0.0, 10.0)
116ut.bookHist(h,
"prob",
"prob(chi2)", 100, 0.0, 1.0)
117ut.bookHist(h,
"IP",
"Impact Parameter", 100, 0.0, 10.0)
118ut.bookHist(h,
"Vzresol",
"Vz reco - true [cm]", 100, -50.0, 50.0)
119ut.bookHist(h,
"Vxresol",
"Vx reco - true [cm]", 100, -10.0, 10.0)
120ut.bookHist(h,
"Vyresol",
"Vy reco - true [cm]", 100, -10.0, 10.0)
121ut.bookHist(h,
"Vzpull",
"Vz pull", 100, -5.0, 5.0)
122ut.bookHist(h,
"Vxpull",
"Vx pull", 100, -5.0, 5.0)
123ut.bookHist(h,
"Vypull",
"Vy pull", 100, -5.0, 5.0)
124ut.bookHist(h,
"Doca",
"Doca between two tracks", 100, 0.0, 10.0)
125for x
in [
"",
"_pi0"]:
126 ut.bookHist(h,
"IP0" + x,
"Impact Parameter to target", 100, 0.0, 100.0)
127 ut.bookHist(h,
"IP0/mass" + x,
"Impact Parameter to target vs mass", 100, 0.0, 2.0, 100, 0.0, 100.0)
128 ut.bookHist(h,
"HNL" + x,
"reconstructed Mass", 500, 0.0, 2.0)
129ut.bookHist(h,
"HNLw",
"reconstructed Mass with weights", 500, 0.0, 2.0)
130ut.bookHist(h,
"meas",
"number of measurements", 40, -0.5, 39.5)
131ut.bookHist(h,
"meas2",
"number of measurements, fitted track", 40, -0.5, 39.5)
132ut.bookHist(h,
"measVSchi2",
"number of measurements vs chi2/meas", 40, -0.5, 39.5, 100, 0.0, 10.0)
133ut.bookHist(h,
"distu",
"distance to wire", 100, 0.0, 1.0)
134ut.bookHist(h,
"distv",
"distance to wire", 100, 0.0, 1.0)
135ut.bookHist(h,
"disty",
"distance to wire", 100, 0.0, 1.0)
136ut.bookHist(h,
"meanhits",
"mean number of hits / track", 50, -0.5, 49.5)
138ut.bookHist(h,
"extrapTimeDetX",
"extrapolation to TimeDet X", 100, -10.0, 10.0)
139ut.bookHist(h,
"extrapTimeDetY",
"extrapolation to TimeDet Y", 100, -10.0, 10.0)
141ut.bookHist(h,
"oa",
"cos opening angle", 100, 0.999, 1.0)
143ut.bookHist(h,
"nrtracks",
"nr of tracks in signal selected", 10, -0.5, 9.5)
144ut.bookHist(h,
"nrSBT",
"nr of hits in SBT", 100, -0.5, 99.5)
146import TrackExtrapolateTool
151 a, u = PosDir[t1][
"position"], PosDir[t1][
"direction"]
152 c, v = PosDir[t2][
"position"], PosDir[t2][
"direction"]
157 denom = Usq * Vsq - UV**2
158 tmp2 = Vsq * u - UV * v
159 Va = ca.Dot(tmp2) / denom
160 tmp2 = UV * u - Usq * v
161 Vb = ca.Dot(tmp2) / denom
162 X = (a + c + Va * u + Vb * v) * 0.5
164 dist = 2.0 * ROOT.TMath.Sqrt(l1.Dot(l1))
165 T = ROOT.TMatrixD(3, 12)
174 temp = (u[j] * Vsq - v[j] * UV) * u[i] + (u[j] * UV - v[j] * Usq) * v[i]
178 T[i][3 * k + j] = 0.5 * (KD + sign * temp / denom)
181 aNAZ = denom * (ca[j] * Vsq - v.Dot(ca) * v[j])
182 aZAN = (ca.Dot(u) * Vsq - ca.Dot(v) * UV) * 2 * (u[j] * Vsq - v[j] * UV)
183 bNAZ = denom * (ca[j] * UV + (u.Dot(ca) * v[j]) - 2 * ca.Dot(v) * u[j])
184 bZAN = (ca.Dot(u) * UV - ca.Dot(v) * Usq) * 2 * (u[j] * Vsq - v[j] * UV)
185 T[i][3 * k + j] = 0.5 * (
186 Va * KD + u[i] / denom**2 * (aNAZ - aZAN) + v[i] / denom**2 * (bNAZ - bZAN)
190 aNAZ = denom * (2 * ca.Dot(u) * v[j] - ca.Dot(v) * u[j] - ca[j] * UV)
191 aZAN = (ca.Dot(u) * Vsq - ca.Dot(v) * UV) * 2 * (v[j] * Usq - u[j] * UV)
192 bNAZ = denom * (ca.Dot(u) * u[j] - ca[j] * Usq)
193 bZAN = (ca.Dot(u) * UV - ca.Dot(v) * Usq) * 2 * (v[j] * Usq - u[j] * UV)
194 T[i][3 * k + j] = 0.5 * (
195 Vb * KD + u[i] / denom**2 * (aNAZ - aZAN) + v[i] / denom**2 * (bNAZ - bZAN)
197 transT = ROOT.TMatrixD(12, 3)
199 CovTracks = ROOT.TMatrixD(12, 12)
206 xfac = scalFac[tlist[k]]
208 xfac = xfac * scalFac[tlist[k]]
209 CovTracks[i + k * 6][j + k * 6] = CovMat[tlist[k]][i][j] * xfac
211 tmp = ROOT.TMatrixD(3, 12)
212 tmp.Mult(T, CovTracks)
213 covX = ROOT.TMatrixD(3, 3)
214 covX.Mult(tmp, transT)
218from array
import array
224 node = sGeo.FindNode(X, Y, Z)
225 if "DecayVacuum" not in node.GetName():
227 start = array(
"d", [X, Y, Z])
229 dalpha = 2 * ROOT.TMath.Pi() / nsteps
231 minDistance = 100 * u.m
232 for n
in range(nsteps):
234 sdir = array(
"d", [ROOT.TMath.Sin(alpha), ROOT.TMath.Cos(alpha), 0.0])
235 node = sGeo.InitTrack(start, sdir)
236 sGeo.FindNextBoundary()
237 distance = sGeo.GetStep()
238 if distance < minDistance:
239 minDistance = distance
246 if ShipGeo.TrackStation1.z < Z:
255 if hasattr(tMom,
"P"):
260 t += tMom(i) / P * (point(i) - tPos(i))
263 dist += (point(i) - tPos(i) - t * tMom(i) / P) ** 2
264 dist = ROOT.TMath.Sqrt(dist)
276 for n
in range(len(sTree.MCTrack)):
277 mo = sTree.MCTrack[n].GetMotherId()
278 if mo < 0
or mo >= len(sTree.MCTrack):
280 if abs(sTree.MCTrack[mo].GetPdgCode()) == 9900015:
284 ut.reportError(
"ShipAna: checkHNLorigin, no HNL found")
285 elif hnlkey >= len(sTree.MCTrack):
286 ut.reportError(
"ShipAna: checkHNLorigin, HNL key out of bounds")
289 theHNLVx = sTree.MCTrack[hnlkey]
290 X, Y, Z = theHNLVx.GetStartX(), theHNLVx.GetStartY(), theHNLVx.GetStartZ()
301 fT = sTree.FitTracks[tkey]
311 Ptruth, Ptruthx, Ptruthy, Ptruthz = -1.0, -1.0, -1.0, -1.0
312 for ahit
in sTree.strawtubesPoint:
313 if ahit.GetTrackID() == mcPartKey:
314 Ptruthx, Ptruthy, Ptruthz = ahit.GetPx(), ahit.GetPy(), ahit.GetPz()
315 Ptruth = ROOT.TMath.Sqrt(Ptruthx**2 + Ptruthy**2 + Ptruthz**2)
317 return Ptruth, Ptruthx, Ptruthy, Ptruthz
322 for ahit
in ev.SmearedHits.GetObject():
323 print(ahit[0], ahit[1], ahit[2], ahit[3], ahit[4], ahit[5], ahit[6])
325 mchit = TrackingHits[key]
326 mctrack = MCTracks[mchit.GetTrackID()]
327 print(mchit.GetZ(), mctrack.GetP(), mctrack.GetPdgCode())
334 a = ROOT.TVector3(PosDir[t1][0](0), PosDir[t1][0](1), PosDir[t1][0](2))
335 u = ROOT.TVector3(PosDir[t1][1](0), PosDir[t1][1](1), PosDir[t1][1](2))
336 c = ROOT.TVector3(PosDir[t2][0](0), PosDir[t2][0](1), PosDir[t2][0](2))
337 v = ROOT.TVector3(PosDir[t2][1](0), PosDir[t2][1](1), PosDir[t2][1](2))
340 dist = pq.Dot(uCrossv) / (uCrossv.Mag() + 1e-8)
343 E = u.Dot(a) - u.Dot(c)
344 F = v.Dot(a) - v.Dot(c)
345 A, B = u.Mag2(), -u.Dot(v)
346 C, D = u.Dot(v), -v.Mag2()
347 t = -(C * E - A * F) / (B * C - A * D)
348 X = c.x() + v.x() * t
349 Y = c.y() + v.y() * t
350 Z = c.z() + v.z() * t
351 return X, Y, Z, abs(dist)
357 xx = sTree.FitTracks[tr].getFittedState()
358 PosDir[tr] = [xx.getPos(), xx.getDir()]
359 xv, yv, zv, doca =
myVertex(t1, t2, PosDir)
362 reps, states, newPosDir = {}, {}, {}
363 ROOT.TVector3(0.0, 0.0, 1.0)
368 newPos = ROOT.TVector3(xv, yv, zv)
371 xx = sTree.FitTracks[tr].getFittedState()
372 reps[tr] = ROOT.genfit.RKTrackRep(xx.getPDG())
373 states[tr] = ROOT.genfit.StateOnPlane(reps[tr])
374 reps[tr].setPosMom(states[tr], xx.getPos(), xx.getMom())
376 reps[tr].extrapolateToPoint(states[tr], newPos,
False)
378 print(
"SHiPAna: extrapolation did not work")
381 newPosDir[tr] = [reps[tr].getPos(states[tr]), reps[tr].getDir(states[tr])]
384 xv, yv, zv, doca =
myVertex(t1, t2, newPosDir)
385 dz = abs(zBefore - zv)
388 print(
"abort iteration, too many steps, pos=", xv, yv, zv,
" doca=", doca,
"z before and dz", zBefore, dz)
392 return xv, yv, zv, doca, -1
395 mom = reps[tr].getMom(states[tr])
396 pid = abs(states[tr].getPDG())
399 mass = PDG.GetParticle(pid).Mass()
400 E = ROOT.TMath.Sqrt(mass * mass + mom.Mag2())
401 LV[tr] = ROOT.TLorentzVector()
402 LV[tr].SetPxPyPzE(mom.x(), mom.y(), mom.z(), E)
403 HNLMom = LV[t1] + LV[t2]
404 return xv, yv, zv, doca, HNLMom
407def fitSingleGauss(x: str, ba: float |
None =
None, be: float |
None =
None) ->
None:
408 name =
"myGauss_" + x
409 myGauss = h[x].GetListOfFunctions().FindObject(name)
412 ba = h[x].GetBinCenter(1)
414 be = h[x].GetBinCenter(h[x].GetNbinsX())
415 bw = h[x].GetBinWidth(1)
416 mean = h[x].GetMean()
417 sigma = h[x].GetRMS()
418 norm = h[x].GetEntries() * 0.3
419 myGauss = ROOT.TF1(name,
"[0]*" + str(bw) +
"/([2]*sqrt(2*pi))*exp(-0.5*((x-[1])/[2])**2)+[3]", 4)
420 myGauss.SetParameter(0, norm)
421 myGauss.SetParameter(1, mean)
422 myGauss.SetParameter(2, sigma)
423 myGauss.SetParameter(3, 1.0)
424 myGauss.SetParName(0,
"Signal")
425 myGauss.SetParName(1,
"Mean")
426 myGauss.SetParName(2,
"Sigma")
427 myGauss.SetParName(3,
"bckgr")
428 h[x].Fit(myGauss,
"",
"", ba, be)
434 for t
in [p.GetDaughter(0), p.GetDaughter(1)]:
435 mcp = sTree.fitTrack2MC[t]
437 if mcp >= len(sTree.MCTrack):
439 mo = sTree.MCTrack[mcp]
440 if abs(mo.GetPdgCode()) == 9900015:
443 mcp = mo.GetMotherId()
444 if len(hnlKey) == 2
and hnlKey[0] == hnlKey[1]:
450 ut.bookCanvas(h, key=
"strawanalysis", title=
"Distance to wire and mean nr of hits", nx=1200, ny=600, cx=3, cy=1)
451 cv = h[
"strawanalysis"].cd(1)
453 h[
"distu"].Draw(
"same")
454 h[
"distv"].Draw(
"same")
455 cv = h[
"strawanalysis"].cd(2)
457 cv = h[
"strawanalysis"].cd(3)
459 ut.bookCanvas(h, key=
"fitresults", title=
"Fit Results", nx=1600, ny=1200, cx=2, cy=2)
460 cv = h[
"fitresults"].cd(1)
461 h[
"delPOverPz"].Draw(
"box")
462 cv = h[
"fitresults"].cd(2)
465 cv = h[
"fitresults"].cd(3)
466 h[
"delPOverPz_proj"] = h[
"delPOverPz"].ProjectionY()
467 ROOT.gStyle.SetOptFit(11111)
468 h[
"delPOverPz_proj"].Draw()
469 h[
"delPOverPz_proj"].Fit(
"gaus")
470 cv = h[
"fitresults"].cd(4)
471 h[
"delPOverP2z_proj"] = h[
"delPOverP2z"].ProjectionY()
472 h[
"delPOverP2z_proj"].Draw()
474 h[
"fitresults"].Print(
"fitresults.gif")
475 for x
in [
"",
"_pi0"]:
476 ut.bookCanvas(h, key=
"fitresults2" + x, title=
"Fit Results " + x, nx=1600, ny=1200, cx=2, cy=2)
477 cv = h[
"fitresults2" + x].cd(1)
479 h[
"Doca"].SetXTitle(
"closest distance between 2 tracks [cm]")
480 h[
"Doca"].SetYTitle(
"N/1mm")
483 h[
"pi0Mass"].SetXTitle(
"#gamma #gamma invariant mass [GeV/c^{2}]")
484 h[
"pi0Mass"].SetYTitle(
"N/" + str(int(h[
"pi0Mass"].GetBinWidth(1) * 1000)) +
"MeV")
486 h[
"pi0Mass"].Fit(
"gaus",
"S",
"", 0.08, 0.19)
487 cv = h[
"fitresults2" + x].cd(2)
488 h[
"IP0" + x].SetXTitle(
"impact parameter to p-target [cm]")
489 h[
"IP0" + x].SetYTitle(
"N/1cm")
491 cv = h[
"fitresults2" + x].cd(3)
492 h[
"HNL" + x].SetXTitle(
"inv. mass [GeV/c^{2}]")
493 h[
"HNL" + x].SetYTitle(
"N/4MeV/c2")
496 cv = h[
"fitresults2" + x].cd(4)
497 h[
"IP0/mass" + x].SetXTitle(
"inv. mass [GeV/c^{2}]")
498 h[
"IP0/mass" + x].SetYTitle(
"IP [cm]")
499 h[
"IP0/mass" + x].Draw(
"colz")
500 h[
"fitresults2" + x].Print(
"fitresults2" + x +
".gif")
501 ut.bookCanvas(h, key=
"vxpulls", title=
"Vertex resol and pulls", nx=1600, ny=1200, cx=3, cy=2)
502 cv = h[
"vxpulls"].cd(4)
504 cv = h[
"vxpulls"].cd(5)
506 cv = h[
"vxpulls"].cd(6)
508 cv = h[
"vxpulls"].cd(1)
510 cv = h[
"vxpulls"].cd(2)
512 cv = h[
"vxpulls"].cd(3)
514 ut.bookCanvas(h, key=
"trpulls", title=
"momentum pulls", nx=1600, ny=600, cx=3, cy=1)
515 cv = h[
"trpulls"].cd(1)
516 h[
"pullPOverPx_proj"] = h[
"pullPOverPx"].ProjectionY()
517 h[
"pullPOverPx_proj"].Draw()
518 cv = h[
"trpulls"].cd(2)
519 h[
"pullPOverPy_proj"] = h[
"pullPOverPy"].ProjectionY()
520 h[
"pullPOverPy_proj"].Draw()
521 cv = h[
"trpulls"].cd(3)
522 h[
"pullPOverPz_proj"] = h[
"pullPOverPz"].ProjectionY()
523 h[
"pullPOverPz_proj"].Draw()
524 ut.bookCanvas(h, key=
"vetodecisions", title=
"Veto Detectors", nx=1600, ny=600, cx=2, cy=1)
525 cv = h[
"vetodecisions"].cd(1)
528 cv = h[
"vetodecisions"].cd(2)
532 print(
"finished making plots")
537 rc = sTree.GetEntry(n)
540 if sTree.GetBranch(
"FitTracks_PR"):
541 sTree.FitTracks = sTree.FitTracks_PR
543 if sTree.GetBranch(
"fitTrack2MC_PR"):
544 sTree.fitTrack2MC = sTree.fitTrack2MC_PR
545 if sTree.GetBranch(
"Particles_PR"):
546 sTree.Particles = sTree.Particles_PR
549 if not len(sTree.MCTrack) > 1:
552 wg = sTree.MCTrack[1].GetWeight()
558 for ahit
in sTree.strawtubesPoint:
559 detID = ahit.GetDetectorID()
560 top = ROOT.TVector3()
561 bot = ROOT.TVector3()
562 modules[
"strawtubes"].StrawEndPoints(detID, bot, top)
563 dw = ahit.dist2Wire()
565 if abs(top.y()) == abs(bot.y()):
567 if abs(top.y()) > abs(bot.y()):
569 if abs(top.y()) < abs(bot.y()):
572 trID = ahit.GetTrackID()
579 h[
"meanhits"].Fill(hitlist[tr])
582 for atrack
in sTree.FitTracks:
587 fitStatus = atrack.getFitStatus()
588 nmeas = fitStatus.getNdf()
589 h[
"meas"].Fill(nmeas)
590 if not fitStatus.isFitConverged():
592 h[
"meas2"].Fill(nmeas)
595 fittedTracks[key] = atrack
597 rchi2 = fitStatus.getChi2()
598 prob = ROOT.TMath.Prob(rchi2, int(nmeas))
601 fittedState = atrack.getFittedState()
602 h[
"chi2"].Fill(chi2, wg)
603 h[
"measVSchi2"].Fill(atrack.getNumPoints(), chi2)
604 P = fittedState.getMomMag()
605 Px, Py, Pz = fittedState.getMom().x(), fittedState.getMom().y(), fittedState.getMom().z()
606 cov = fittedState.get6DCov()
607 if len(sTree.fitTrack2MC) - 1 < key:
609 mcPartKey = sTree.fitTrack2MC[key]
610 if mcPartKey < 0
or mcPartKey >= len(sTree.MCTrack):
612 mcPart = sTree.MCTrack[mcPartKey]
616 Ptruth, Ptruthx, Ptruthy, Ptruthz =
getPtruthFirst(sTree, mcPartKey)
617 delPOverP = (Ptruth - P) / Ptruth
618 h[
"delPOverP"].Fill(Ptruth, delPOverP)
619 delPOverPz = (1.0 / Ptruthz - 1.0 / Pz) * Ptruthz
620 h[
"pullPOverPx"].Fill(Ptruth, (Ptruthx - Px) / ROOT.TMath.Sqrt(cov[3][3]))
621 h[
"pullPOverPy"].Fill(Ptruth, (Ptruthy - Py) / ROOT.TMath.Sqrt(cov[4][4]))
622 h[
"pullPOverPz"].Fill(Ptruth, (Ptruthz - Pz) / ROOT.TMath.Sqrt(cov[5][5]))
623 h[
"delPOverPz"].Fill(Ptruthz, delPOverPz)
624 if chi2 > chi2CutOff:
626 h[
"delPOverP2"].Fill(Ptruth, delPOverP)
627 h[
"delPOverP2z"].Fill(Ptruth, delPOverPz)
629 trackDir = fittedState.getDir()
630 trackPos = fittedState.getPos()
632 mcPart.GetStartVertex(vx)
635 t += trackDir(i) * (vx(i) - trackPos(i))
638 dist += (vx(i) - trackPos(i) - t * trackDir(i)) ** 2
639 dist = ROOT.TMath.Sqrt(dist)
643 for HNL
in sTree.Particles:
644 t1, t2 = HNL.GetDaughter(0), HNL.GetDaughter(1)
648 checkMeasurements =
True
651 fitStatus = sTree.FitTracks[tr].getFitStatus()
652 nmeas = fitStatus.getNdf()
654 checkMeasurements =
False
655 if not checkMeasurements:
660 HNLPos = ROOT.TLorentzVector()
661 HNL.ProductionVertex(HNLPos)
662 HNLMom = ROOT.TLorentzVector()
669 if not isInFiducial(HNLPos.X(), HNLPos.Y(), HNLPos.Z()):
674 tr = ROOT.TVector3(0, 0, ShipGeo.target.z0)
678 for pi0
in pi0Reco.findPi0(sTree,HNLPos):
679 rc = h[
'pi0Mass'].Fill(pi0.M())
680 if abs(pi0.M()-0.135)>0.02:
continue
682 HNLwithPi0 = HNLMom + pi0
684 mass = HNLwithPi0.M()
685 h[
'IP0_pi0'].Fill(dist)
686 h[
'IP0/mass_pi0'].Fill(mass,dist)
687 h[
'HNL_pi0'].Fill(mass)
693 h[
"IP0/mass"].Fill(mass, dist)
695 h[
"HNLw"].Fill(mass, wg)
697 vetoDets[
"SBT"] = veto.SBT_decision()
698 vetoDets[
"UBT"] = veto.UBT_decision()
699 vetoDets[
"TRA"] = veto.Track_decision()
700 h[
"nrtracks"].Fill(vetoDets[
"TRA"][2])
701 h[
"nrSBT"].Fill(vetoDets[
"SBT"][2])
703 mcTrackIdx = sTree.fitTrack2MC[t1]
704 if mcTrackIdx < 0
or mcTrackIdx >= len(sTree.MCTrack):
706 mctrack = sTree.MCTrack[mcTrackIdx]
707 h[
"Vzresol"].Fill((mctrack.GetStartZ() - HNLPos.Z()) / u.cm)
708 h[
"Vxresol"].Fill((mctrack.GetStartX() - HNLPos.X()) / u.cm)
709 h[
"Vyresol"].Fill((mctrack.GetStartY() - HNLPos.Y()) / u.cm)
710 PosDir, newPosDir, CovMat, _scalFac = {}, {}, {}, {}
712 newPos = ROOT.TVector3(HNLPos.X(), HNLPos.Y(), HNLPos.Z())
713 st1, st2 = sTree.FitTracks[t1].getFittedState(), sTree.FitTracks[t2].getFittedState()
714 PosDir[t1] = {
"position": st1.getPos(),
"direction": st1.getDir(),
"momentum": st1.getMom()}
715 PosDir[t2] = {
"position": st2.getPos(),
"direction": st2.getDir(),
"momentum": st2.getMom()}
716 CovMat[t1] = st1.get6DCov()
717 CovMat[t2] = st2.get6DCov()
718 rep1, rep2 = ROOT.genfit.RKTrackRep(st1.getPDG()), ROOT.genfit.RKTrackRep(st2.getPDG())
719 state1, state2 = ROOT.genfit.StateOnPlane(rep1), ROOT.genfit.StateOnPlane(rep2)
720 rep1.setPosMom(state1, st1.getPos(), st1.getMom())
721 rep2.setPosMom(state2, st2.getPos(), st2.getMom())
723 rep1.extrapolateToPoint(state1, newPos,
False)
724 rep2.extrapolateToPoint(state2, newPos,
False)
725 mom1, mom2 = rep1.getMom(state1), rep2.getMom(state2)
727 mom1, mom2 = st1.getMom(), st2.getMom()
728 newPosDir[t1] = {
"position": rep1.getPos(state1),
"direction": rep1.getDir(state1),
"momentum": mom1}
729 newPosDir[t2] = {
"position": rep2.getPos(state2),
"direction": rep2.getDir(state2),
"momentum": mom2}
730 oa = mom1.Dot(mom2) / (mom1.Mag() * mom2.Mag())
735 h[
"Vzpull"].Fill((mctrack.GetStartZ() - HNLPos.Z()) / ROOT.TMath.Sqrt(covX[5]))
736 h[
"Vxpull"].Fill((mctrack.GetStartX() - HNLPos.X()) / ROOT.TMath.Sqrt(covX[0]))
737 h[
"Vypull"].Fill((mctrack.GetStartY() - HNLPos.Y()) / ROOT.TMath.Sqrt(covX[3]))
740 if hasattr(ShipGeo,
"TimeDet"):
741 for fT
in sTree.FitTracks:
744 for aPoint
in sTree.TimeDetPoint:
745 h[
"extrapTimeDetX"].Fill(pos.X() - aPoint.GetX())
746 h[
"extrapTimeDetY"].Fill(pos.Y() - aPoint.GetY())
752 ut.bookHist(h,
"HNLmomNoW",
"momentum unweighted", 100, 0.0, 300.0)
753 ut.bookHist(h,
"HNLmom",
"momentum", 100, 0.0, 300.0)
754 ut.bookHist(h,
"HNLPtNoW",
"Pt unweighted", 100, 0.0, 10.0)
755 ut.bookHist(h,
"HNLPt",
"Pt", 100, 0.0, 10.0)
756 ut.bookHist(h,
"HNLmom_recTracks",
"momentum", 100, 0.0, 300.0)
757 ut.bookHist(h,
"HNLmomNoW_recTracks",
"momentum unweighted", 100, 0.0, 300.0)
758 for n
in range(sTree.GetEntries()):
760 for hnlkey
in [1, 2]:
761 if hnlkey >= len(sTree.MCTrack):
763 if abs(sTree.MCTrack[hnlkey].GetPdgCode()) == 9900015:
764 theHNL = sTree.MCTrack[hnlkey]
765 wg = theHNL.GetWeight()
768 if hnlkey - 1 < 0
or hnlkey - 1 >= len(sTree.MCTrack):
770 idMother = abs(sTree.MCTrack[hnlkey - 1].GetPdgCode())
771 if idMother
not in HNLorigin:
772 HNLorigin[idMother] = 0
773 HNLorigin[idMother] += wg
776 h[
"HNLmom"].Fill(P, wg)
777 h[
"HNLmomNoW"].Fill(P)
778 h[
"HNLPt"].Fill(Pt, wg)
779 h[
"HNLPtNoW"].Fill(Pt)
780 for HNL
in sTree.Particles:
781 t1, t2 = HNL.GetDaughter(0), HNL.GetDaughter(1)
783 xx = sTree.FitTracks[tr].getFittedState()
784 Prec = xx.getMom().Mag()
785 h[
"HNLmom_recTracks"].Fill(Prec, wg)
786 h[
"HNLmomNoW_recTracks"].Fill(Prec)
789 theSum += HNLorigin[x]
791 print(
"%4i : %5.4F relative fraction: %5.4F " % (x, HNLorigin[x], HNLorigin[x] / theSum))
796options.nEvents = min(sTree.GetEntries(), options.nEvents)
799ut.bookHist(h,
"pi0Mass",
"gamma gamma inv mass", 100, 0.0, 0.5)
801for n
in range(options.nEvents):
803 sTree.FitTracks.clear()
806hfile = options.inputFile.split(
",")[0]
808 hfile = hfile.replace(
"_rec",
"_ana")
810 hfile = hfile.replace(
".root",
"_ana.root")
811if "/eos" in hfile
or not options.inputFile.find(
",") < 0:
813 tmp = hfile.split(
"/")
814 hfile = tmp[len(tmp) - 1]
816ut.writeHists(h, hfile)
None access2SmearedHits(ev, TrackingHits, MCTracks)
def RedoVertexing(t1, t2)
def VertexError(t1, t2, PosDir, CovMat, scalFac)
bool checkHNLorigin(sTree)
def myVertex(t1, t2, PosDir)
bool checkFiducialVolume(sTree, int tkey, dy)
def dist2InnerWall(X, Y, Z)
def getPtruthFirst(sTree, mcPartKey)
def ImpactParameter(point, tPos, tMom)
bool isInFiducial(X, Y, Z)
None fitSingleGauss(str x, float|None ba=None, float|None be=None)
def addVMCFields(shipGeo, str controlFile="", bool verbose=False, bool withVirtualMC=True)
def configure(run, ship_geo)
None configure(darkphoton=None)