Skip to content

Commit

Permalink
refactor: Rework physmon track fitting (#2549)
Browse files Browse the repository at this point in the history
- align KF and GSF track fitting physmon
- use single particles
- apply cuts on truth particles
- only fit primary particles
- apply cuts on reconstructed tracks
  • Loading branch information
andiwand committed Oct 24, 2023
1 parent deb3744 commit 06e46fc
Show file tree
Hide file tree
Showing 15 changed files with 114 additions and 104 deletions.
4 changes: 3 additions & 1 deletion CI/physmon/fpe_masks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
"Fatras/include/ActsFatras/Kernel/detail/SimulationActor.hpp:177":
FLTUND: 1
"Core/include/Acts/TrackFitting/detail/GsfUtils.hpp:197":
FLTUND: 1
FLTUND: 1
"Core/include/Acts/TrackFitting/detail/GsfUtils.hpp:201":
FLTUND: 1
"Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp:120":
FLTUND: 1
Binary file modified CI/physmon/reference/performance_gsf.root
Binary file not shown.
Binary file modified CI/physmon/reference/performance_truth_tracking.root
Binary file not shown.
4 changes: 2 additions & 2 deletions CI/physmon/workflows/physmon_truth_tracking_gsf.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

with tempfile.TemporaryDirectory() as temp:
s = acts.examples.Sequencer(
events=500,
events=10000,
numThreads=-1,
logLevel=acts.logging.INFO,
fpeMasks=acts.examples.Sequencer.FpeMask.fromFile(
Expand All @@ -23,8 +23,8 @@
tp = Path(temp)
runTruthTrackingGsf(
setup.trackingGeometry,
setup.digiConfig,
setup.field,
setup.digiConfig,
outputDir=tp,
s=s,
)
Expand Down
2 changes: 1 addition & 1 deletion CI/physmon/workflows/physmon_truth_tracking_kalman.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
runTruthTrackingKalman(
setup.trackingGeometry,
setup.field,
digiConfigFile=setup.digiConfig,
setup.digiConfig,
outputDir=tp,
s=s,
)
Expand Down
8 changes: 4 additions & 4 deletions Examples/Io/Root/src/RootTrajectoryStatesWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -545,12 +545,11 @@ ActsExamples::ProcessCode ActsExamples::RootTrajectoryStatesWriter::writeT(
m_res_eT[ipar].push_back(parameters[Acts::eBoundTime] - truthTIME);

// track parameters error
// MARK: fpeMaskBegin(FLTINV, 1, #2348)
m_err_eLOC0[ipar].push_back(
std::sqrt(covariance( // MARK: fpeMask(FLTINV, 1, #2348)
Acts::eBoundLoc0, Acts::eBoundLoc0)));
std::sqrt(covariance(Acts::eBoundLoc0, Acts::eBoundLoc0)));
m_err_eLOC1[ipar].push_back(
std::sqrt(covariance( // MARK: fpeMask(FLTINV, 1, #2348)
Acts::eBoundLoc1, Acts::eBoundLoc1)));
std::sqrt(covariance(Acts::eBoundLoc1, Acts::eBoundLoc1)));
m_err_ePHI[ipar].push_back(
std::sqrt(covariance(Acts::eBoundPhi, Acts::eBoundPhi)));
m_err_eTHETA[ipar].push_back(
Expand All @@ -559,6 +558,7 @@ ActsExamples::ProcessCode ActsExamples::RootTrajectoryStatesWriter::writeT(
std::sqrt(covariance(Acts::eBoundQOverP, Acts::eBoundQOverP)));
m_err_eT[ipar].push_back(
std::sqrt(covariance(Acts::eBoundTime, Acts::eBoundTime)));
// MARK: fpeMaskEnd(FLTINV)

// track parameters pull
m_pull_eLOC0[ipar].push_back(
Expand Down
1 change: 1 addition & 0 deletions Examples/Python/python/acts/examples/reconstruction.py
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,7 @@ def addTruthTrackingGsf(
calibrator=acts.examples.makePassThroughCalibrator(),
)
s.addAlgorithm(gsfAlg)
s.addWhiteboardAlias("tracks", gsfAlg.config.outputTracks)

trackConverter = acts.examples.TracksToTrajectories(
level=customLogLevel(),
Expand Down
24 changes: 12 additions & 12 deletions Examples/Python/tests/root_file_hashes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@ test_itk_seeding__particles_final.root: 0d38f1a4ede5fb86844c156c002ada340011e140
test_itk_seeding__particles_initial.root: 88315e93ed4cb5d40a8721502048a9d1fc100e0a7d504e25fd4502c8302f1578
test_propagation__propagation_steps.root: 174301b25784dbb881196b658f2d7f99c0a2ea688a0129e6110fc19aa5cf8e54
test_material_recording__geant4_material_tracks.root: e411152d370775463c22b19a351dfc7bfe40b51985e10a7c1a010aebde80715d
test_truth_tracking_kalman[generic-0.0]__trackstates_fitter.root: c8454669d2ce93296ef7be86cd9e900c0e57154c30199dcb92790983472d6847
test_truth_tracking_kalman[generic-0.0]__tracksummary_fitter.root: e9c9c700ef3ebd6aafd3bbb95eaf6e24bc38e90c00f207f1e94a33b2271b0607
test_truth_tracking_kalman[generic-0.0]__trackstates_fitter.root: 559321c478b63859b5d1b687e73d79655d1b3b12ebc34c2bd5ffa1049827b020
test_truth_tracking_kalman[generic-0.0]__tracksummary_fitter.root: abb9520d5ace34139d993fb8214fda3b6649ec52c44e25928e9bce78209ef923
test_truth_tracking_kalman[generic-0.0]__performance_track_finder.root: ada9cda2ec3c648b144bdaa081d6eff923c80f3d484c4196006e847428cf67a8
test_truth_tracking_kalman[generic-1000.0]__trackstates_fitter.root: 23bcd151eda147e9270924f76a422e807d8d38d75b6193e4ffbc442ab94e65c1
test_truth_tracking_kalman[generic-1000.0]__tracksummary_fitter.root: 80672652eb750f117013ef22c9ff75fa09ac08a0f38dd788249fa40395e38e47
test_truth_tracking_kalman[generic-1000.0]__trackstates_fitter.root: 0befe1ec82e461f64bac9d44f6b0d96f01263b0d6c094afdb4b1cc3d2c965095
test_truth_tracking_kalman[generic-1000.0]__tracksummary_fitter.root: bc0b98247953bac0f37e3600441c08afb9f73e190f718b108009970d61a32e72
test_truth_tracking_kalman[generic-1000.0]__performance_track_finder.root: ada9cda2ec3c648b144bdaa081d6eff923c80f3d484c4196006e847428cf67a8
test_truth_tracking_kalman[odd-0.0]__trackstates_fitter.root: bcd562b4d55374e892f2bdbb742db4c7761637d523ec8879897c091901e16a95
test_truth_tracking_kalman[odd-0.0]__tracksummary_fitter.root: 9b9bffa011bb22f54c3c988cf9b66bc84c848ca88513e0a8025de8861924866e
test_truth_tracking_kalman[odd-0.0]__trackstates_fitter.root: 45e2c15e4b942a8adec909e50c8297aa8dd9217dc047dbc5e7ef61c02f4e4378
test_truth_tracking_kalman[odd-0.0]__tracksummary_fitter.root: 119bae4e06305acab6ef86ca73acd1b1ea90eaa3c3b347d9655cf877419563d6
test_truth_tracking_kalman[odd-0.0]__performance_track_finder.root: 39aec6316cceb90e314e16b02947faa691c18f57c3a851a25e547a8fc05a4593
test_truth_tracking_kalman[odd-1000.0]__trackstates_fitter.root: ef499a4f0d0c81c9e39ec513708ff16a11003f668192fa2c7ba1fc24aba0d7c8
test_truth_tracking_kalman[odd-1000.0]__tracksummary_fitter.root: 6a4dda749c0b2f89aaf74e41b25938da5f8a979bac3b895b7ab15004a72e11e5
test_truth_tracking_kalman[odd-1000.0]__trackstates_fitter.root: 707c0784deac8d7c63de38542f08f66dbe375f502b26f7d0aeaccf976d4bcf67
test_truth_tracking_kalman[odd-1000.0]__tracksummary_fitter.root: 8830b954f91e3da4722e5d6922a2a59fcbc2d14cbf7732eb997fd9f44f366262
test_truth_tracking_kalman[odd-1000.0]__performance_track_finder.root: 39aec6316cceb90e314e16b02947faa691c18f57c3a851a25e547a8fc05a4593
test_truth_tracking_gsf[generic]__trackstates_gsf.root: 849f09ea6f45bcaad56172bd5d17cf201076f4f2760638debfbbc9b31b90b636
test_truth_tracking_gsf[generic]__tracksummary_gsf.root: 10c7f080b5d9de9eebd9dcd35344322a30bdb39a21ae5e5e28e3b5b99814bb12
test_truth_tracking_gsf[odd]__trackstates_gsf.root: bf4e15ba68937c3cf5138245939ee2cd9abaa04dafd70cf09bc11b0f6edcd79f
test_truth_tracking_gsf[odd]__tracksummary_gsf.root: 912c3e8f6fc71d7312e18e4e571ed91b2624c929b63a7d7ab407857fc3157118
test_truth_tracking_gsf[generic]__trackstates_gsf.root: 107d979b6e6b9a19f35a46cce9d3472fb383f79e287e6b7e880d860db423c520
test_truth_tracking_gsf[generic]__tracksummary_gsf.root: ec4cf67cea309776ec2e13ac2263662a5bda3eebb766aa22a804ef9e17b782ea
test_truth_tracking_gsf[odd]__trackstates_gsf.root: 16c480cf80ccedb5327cdfc534387bf8ad0a331d423c5f707a945efa8e24aa8f
test_truth_tracking_gsf[odd]__tracksummary_gsf.root: 500b88f9b1e28fb44064ae49e84f51f83ae15828aff228df94e53477e13ee995
test_particle_gun__particles.root: 8549ba6e20338004ab8ba299fc65e1ee5071985b46df8f77f887cb6fef56a8ec
test_material_mapping__material-map_tracks.root: 2deac7a48ff1185ba3889cfd4cc0bd0a6de57293048dfd6766f3c3907232e45e
test_material_mapping__propagation-material.root: 84b04ebd5721550867f0f193b5eb4e9f3f205df542cb46090d320be6bff565c5
Expand Down
2 changes: 0 additions & 2 deletions Examples/Python/tests/test_algorithms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import pytest

import acts

from acts.examples import (
TutorialVertexFinderAlgorithm,
AdaptiveMultiVertexFinderAlgorithm,
Expand Down
2 changes: 0 additions & 2 deletions Examples/Python/tests/test_detectors.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from pathlib import Path

import pytest

from helpers import dd4hepEnabled
Expand Down
4 changes: 0 additions & 4 deletions Examples/Python/tests/test_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@
exatrkxEnabled,
onnxEnabled,
AssertCollectionExistsAlg,
isCI,
doHashChecks,
failure_threshold,
)

Expand All @@ -33,7 +31,6 @@
Sequencer,
GenericDetector,
AlignedDetector,
RootParticleWriter,
)

from acts.examples.odd import getOpenDataDetector
Expand Down Expand Up @@ -569,7 +566,6 @@ def test_truth_tracking_kalman(
root_files = [
("trackstates_fitter.root", "trackstates", 19),
("tracksummary_fitter.root", "tracksummary", 10),
("performance_track_finder.root", "track_finder_tracks", 19),
("performance_track_fitter.root", None, -1),
]

Expand Down
1 change: 0 additions & 1 deletion Examples/Python/tests/test_magnetic_field.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from typing import Type
import pytest

import acts
Expand Down
28 changes: 2 additions & 26 deletions Examples/Python/tests/test_writer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from typing import Type
import os
import inspect
from pathlib import Path
Expand Down Expand Up @@ -748,33 +747,10 @@ def test_edm4hep_tracks_writer(tmp_path):
return

from podio.root_io import Reader
from podio.frame import Frame
import cppyy

reader = Reader(str(out))

expected = [
(31.986961364746094, 30, 16),
(28.64777374267578, 30, 16),
(11.607606887817383, 22, 12),
(5.585886001586914, 22, 12),
(20.560943603515625, 20, 11),
(28.742727279663086, 28, 15),
(27.446802139282227, 22, 12),
(30.82959747314453, 24, 13),
(24.671127319335938, 26, 14),
(16.479907989501953, 20, 11),
(10.594233512878418, 22, 12),
(25.174715042114258, 28, 15),
(27.9674072265625, 26, 14),
(4.3012871742248535, 22, 12),
(20.492422103881836, 22, 12),
(27.92759132385254, 24, 13),
(14.514887809753418, 22, 12),
(12.876864433288574, 22, 12),
(12.951473236083984, 26, 14),
]

actual = []

for frame in reader.get("events"):
Expand Down Expand Up @@ -805,5 +781,5 @@ def test_edm4hep_tracks_writer(tmp_path):
assert rp.x == 0.0
assert rp.y == 0.0
assert rp.z == 0.0
assert abs(perigee.D0) < 1e-1
assert abs(perigee.Z0) < 1
assert abs(perigee.D0) < 1e0
assert abs(perigee.Z0) < 1e1
70 changes: 46 additions & 24 deletions Examples/Scripts/Python/truth_tracking_gsf.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,36 @@
#!/usr/bin/env python3

from pathlib import Path
from typing import Optional, Union

from acts.examples import Sequencer, GenericDetector, RootParticleReader
from typing import Optional

import acts
import acts.examples

u = acts.UnitConstants


def runTruthTrackingGsf(
trackingGeometry,
trackingGeometry: acts.TrackingGeometry,
field: acts.MagneticFieldProvider,
digiConfigFile: Path,
field,
outputDir: Path,
outputCsv=True,
inputParticlePath: Optional[Path] = None,
decorators=[],
s=None,
s: acts.examples.Sequencer = None,
):
from acts.examples.simulation import (
addParticleGun,
ParticleConfig,
EtaConfig,
PhiConfig,
ParticleConfig,
MomentumConfig,
addFatras,
addDigitization,
)
from acts.examples.reconstruction import (
addSeeding,
SeedingAlgorithm,
TruthSeedRanges,
addTruthTrackingGsf,
)

Expand All @@ -47,10 +47,15 @@ def runTruthTrackingGsf(
if inputParticlePath is None:
addParticleGun(
s,
EtaConfig(-2.0, 2.0),
ParticleConfig(4, acts.PdgParticle.eElectron, True),
ParticleConfig(num=1, pdg=acts.PdgParticle.eElectron, randomizeCharge=True),
EtaConfig(-3.0, 3.0, uniform=True),
MomentumConfig(1.0 * u.GeV, 100.0 * u.GeV, transverse=True),
PhiConfig(0.0, 360.0 * u.degree),
multiplicity=2,
vtxGen=acts.examples.GaussianVertexGenerator(
mean=acts.Vector4(0, 0, 0, 0),
stddev=acts.Vector4(0, 0, 0, 0),
),
multiplicity=1,
rnd=rnd,
)
else:
Expand All @@ -59,7 +64,7 @@ def runTruthTrackingGsf(
)
assert inputParticlePath.exists()
s.addReader(
RootParticleReader(
acts.examples.RootParticleReader(
level=acts.logging.INFO,
filePath=str(inputParticlePath.resolve()),
particleCollection="particles_input",
Expand Down Expand Up @@ -87,22 +92,41 @@ def runTruthTrackingGsf(
s,
trackingGeometry,
field,
rnd=rnd,
inputParticles="particles_input",
seedingAlgorithm=SeedingAlgorithm.TruthSmeared,
particleHypothesis=acts.ParticleHypothesis.electron,
truthSeedRanges=TruthSeedRanges(
pt=(1 * u.GeV, None),
nHits=(7, None),
),
)

truthTrkFndAlg = acts.examples.TruthTrackFinder(
level=acts.logging.INFO,
inputParticles="truth_seeds_selected",
inputMeasurementParticlesMap="measurement_particles_map",
outputProtoTracks="prototracks",
addTruthTrackingGsf(
s,
trackingGeometry,
field,
)

s.addAlgorithm(truthTrkFndAlg)

addTruthTrackingGsf(s, trackingGeometry, field)
s.addAlgorithm(
acts.examples.TrackSelectorAlgorithm(
level=acts.logging.INFO,
inputTracks="tracks",
outputTracks="selected-tracks",
selectorConfig=acts.TrackSelector.Config(
minMeasurements=7,
),
)
)
s.addAlgorithm(
acts.examples.TracksToTrajectories(
level=acts.logging.INFO,
inputTracks="selected-tracks",
outputTrajectories="trajectories-from-tracks",
)
)
s.addWhiteboardAlias("trajectories", "trajectories-from-tracks")

# Output
s.addWriter(
acts.examples.RootTrajectoryStatesWriter(
level=acts.logging.INFO,
Expand Down Expand Up @@ -141,7 +165,7 @@ def runTruthTrackingGsf(
if "__main__" == __name__:
srcdir = Path(__file__).resolve().parent.parent.parent.parent

detector, trackingGeometry, decorators = GenericDetector.create()
detector, trackingGeometry, decorators = acts.examples.GenericDetector.create()

field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))

Expand All @@ -151,11 +175,9 @@ def runTruthTrackingGsf(

runTruthTrackingGsf(
trackingGeometry=trackingGeometry,
decorators=decorators,
field=field,
digiConfigFile=srcdir
/ "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json",
outputCsv=True,
inputParticlePath=inputParticlePath,
outputDir=Path.cwd(),
).run()

0 comments on commit 06e46fc

Please sign in to comment.