Understanding large track parameter values

Dear experts! Me and my analysis group are trying to reconstruct secondary vertices with this algorithm: FCCAnalyses/analyzers/dataframe/src/VertexFinderLCFIPlus.cc at d0abc8d76e37630ea157f9d5c48e7867a86be2e2 · HEP-FCC/FCCAnalyses · GitHub . While debugging some vertices that are reconstructed at extremely large radii (>1.5m), we observed some strange tracks that we would like help to understand. For two example tracks, the track parameters obtained from VertexingUtils::get_trackParam have the following values:

Track1: (d0, phi0, omega, z0, tanLambda) = (-590.709, 2.04753, -0.000197501, -268.031, -0.380197)
Track2: (d0, phi0, omega, z0, tanLambda) = (169.184, 1.23833, 5.05816e-05, 29.8117, -0.489485)

We think that the d0 and z0 values (in mm) are really big for the process which we are running (e+e- → Z(ee) + H(bb) @ sqrt(s) = 240 GeV), and would like to ask if you have any idea why the values are so big?

Dear Axel,

Thanks for contacting us! Are you running on a Delphes sample or a full sim sample? Can you do a matching to MCParticles to see if you have any particle in the MC record that could lead to such tracks?

Cheers,
Brieuc

Dear Brieuc,

The sample we’re running on is the winter2023 delphes sample for IDEA. Regarding the matching, could you elaborate a bit (possibly with example code)?

I assume that one would use something like get_EventPrimaryVertex or possibly get_list_of_particles_from_decay, but how do I get the ROOT::VecOps::RVec<edm4hep::MCParticleData> object on track level (i.e. in e.g. VertexFinderLCFIPlus.cc?

Thanks,
Axel

Dear Axel,

I do not see any helper methods in FCCanalyses to print the vertex origin of MCParticles (FCCAnalyses users may comment further). But, for this kind of debugging where you want to dissect a pathological event, I would be tempted to simply run something like:

import ROOT
from podio import root_io
input_file_path = "path_to_your_file_with_pathological_event"
podio_reader = root_io.Reader(input_file_path)
for event in podio_reader.get("events"):
  for mc_particle in event.get("Particle"):
    if mc_particle.getCharge() != 0:
      mc_particle_vertex = mc_particle.getVertex()
      print(f"x: {mc_particle_vertex.x}, y: {mc_particle_vertex.y}, z: {mc_particle_vertex.z}")

(let me know if you want the C++ equivalent), and see if you have a charged particle with a displacement compatible with what you have from VertexingUtils. To develop further the above example, the following Doxygen will be helpful: EDM4hep: edm4hep::MCParticle Class Reference .

If you do not see a MC particle compatible with the displacement, further debugging of VertexingUtils might be needed.

Hoping this helps,
Brieuc