Skip to content

Commit

Permalink
ci: Physmon for KF and GSF refitting (acts-project#3733)
Browse files Browse the repository at this point in the history
Adds KF and GSF refitting to physmon. This allows us to also track physics related changes with fitters and direct navigation.

In principle we could monitor the output by comparing it to the normal navigation ones but for now I would opt for creating additional reference files. Later we can converge on the outputs if we want to.
  • Loading branch information
andiwand authored Oct 16, 2024
1 parent 02b779b commit ff6d195
Show file tree
Hide file tree
Showing 9 changed files with 255 additions and 23 deletions.
30 changes: 28 additions & 2 deletions CI/physmon/phys_perf_mon.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ shopt -s extglob


mode=${1:-all}
if ! [[ $mode = @(all|kf|gsf|gx2f|fullchains|simulation) ]]; then
echo "Usage: $0 <all|kf|gsf|gx2f|fullchains|simulation> (outdir)"
if ! [[ $mode = @(all|kf|gsf|gx2f|refit_kf|refit_gsf|fullchains|simulation) ]]; then
echo "Usage: $0 <all|kf|gsf|gx2f|refit_kf|refit_gsf|fullchains|simulation> (outdir)"
exit 1
fi

Expand Down Expand Up @@ -152,6 +152,12 @@ fi
if [[ "$mode" == "all" || "$mode" == "gx2f" ]]; then
run_physmon_gen "Truth Tracking GX2F" "trackfitting_gx2f"
fi
if [[ "$mode" == "all" || "$mode" == "refit_kf" ]]; then
run_physmon_gen "Truth Tracking KF refit" "trackrefitting_kf"
fi
if [[ "$mode" == "all" || "$mode" == "refit_gsf" ]]; then
run_physmon_gen "Truth Tracking GSF refit" "trackrefitting_gsf"
fi
if [[ "$mode" == "all" || "$mode" == "fullchains" ]]; then
run_physmon_gen "CKF single muon" "trackfinding_1muon"
run_physmon_gen "CKF muon 50" "trackfinding_4muon_50vertices"
Expand Down Expand Up @@ -411,6 +417,26 @@ if [[ "$mode" == "all" || "$mode" == "gx2f" ]]; then
--config CI/physmon/config/trackfitting_gx2f.yml
fi

if [[ "$mode" == "all" || "$mode" == "kf_refit" ]]; then
run_histcmp \
$outdir/data/trackrefitting_kf/performance_trackrefitting.root \
$refdir/trackrefitting_kf/performance_trackrefitting.root \
"Truth tracking (KF refit)" \
trackrefitting_kf/performance_trackrefitting.html \
trackrefitting_kf/performance_trackrefitting_plots \
--config CI/physmon/config/trackfitting_kf.yml
fi

if [[ "$mode" == "all" || "$mode" == "gsf_refit" ]]; then
run_histcmp \
$outdir/data/trackrefitting_gsf/performance_trackrefitting.root \
$refdir/trackrefitting_gsf/performance_trackrefitting.root \
"Truth tracking (GSF refit)" \
trackrefitting_gsf/performance_trackrefitting.html \
trackrefitting_gsf/performance_trackrefitting_plots \
--config CI/physmon/config/trackfitting_gsf.yml
fi

if [[ "$mode" == "all" || "$mode" == "fullchains" ]]; then
trackfinding "trackfinding | single muon | truth smeared seeding" trackfinding_1muon/truth_smeared
trackfinding "trackfinding | single muon | truth estimated seeding" trackfinding_1muon/truth_estimated
Expand Down
Binary file not shown.
Binary file not shown.
34 changes: 34 additions & 0 deletions CI/physmon/workflows/physmon_trackrefitting_gsf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/usr/bin/env python3

import tempfile
from pathlib import Path
import shutil

import acts
from truth_tracking_gsf_refitting import runRefittingGsf

from physmon_common import makeSetup

setup = makeSetup()

with tempfile.TemporaryDirectory() as temp:
s = acts.examples.Sequencer(
events=10000,
numThreads=-1,
logLevel=acts.logging.INFO,
)

tp = Path(temp)
runRefittingGsf(
trackingGeometry=setup.trackingGeometry,
field=setup.field,
digiConfigFile=setup.digiConfig,
outputDir=tp,
s=s,
)

s.run()

perf_file = tp / "performance_gsf_refit.root"
assert perf_file.exists(), "Performance file not found"
shutil.copy(perf_file, setup.outdir / "performance_trackrefitting.root")
34 changes: 34 additions & 0 deletions CI/physmon/workflows/physmon_trackrefitting_kf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/usr/bin/env python3

import tempfile
from pathlib import Path
import shutil

import acts
from truth_tracking_kalman_refitting import runRefittingKf

from physmon_common import makeSetup

setup = makeSetup()

with tempfile.TemporaryDirectory() as temp:
s = acts.examples.Sequencer(
events=10000,
numThreads=-1,
logLevel=acts.logging.INFO,
)

tp = Path(temp)
runRefittingKf(
trackingGeometry=setup.trackingGeometry,
field=setup.field,
digiConfigFile=setup.digiConfig,
outputDir=tp,
s=s,
)

s.run()

perf_file = tp / "performance_kf_refit.root"
assert perf_file.exists(), "Performance file not found"
shutil.copy(perf_file, setup.outdir / "performance_trackrefitting.root")
8 changes: 4 additions & 4 deletions Examples/Python/tests/root_file_hashes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@ test_exatrkx[cpu-torch]__performance_track_finding.root: 36b3045589c4c17c038dbc8
test_exatrkx[gpu-onnx]__performance_track_finding.root: 9090de10ffb1489d3f1993e2a3081a3038227e3e5c453e98a9a4f33ea3d6d817
test_exatrkx[gpu-torch]__performance_track_finding.root: 36b3045589c4c17c038dbc87943366f4af4440f7eea6887afb763871ac149b05
test_ML_Ambiguity_Solver__performance_ambiML.root: 284ff5c3a08c0b810938e4ac2f8ba8fe2babb17d4c202b624ed69fff731a9006
test_refitting[odd]__trackstates_gsf_refit.root: 75cac3d6c0d9ce02169637cff739ab1e72b00c8fd3db9e99945d40b34c35b70b
test_refitting[odd]__tracksummary_gsf_refit.root: 90b9c9b3e24441066376f8cf529df10119b31f83563f001ac438fa70874dcb16
test_refitting[generic]__trackstates_gsf_refit.root: 4424fdf2f27575db825c1a59f8e53a1595946211cbd5b2c8d3a2f71cdcc77ae9
test_refitting[generic]__tracksummary_gsf_refit.root: 562deecee4cfb97ceee72eff53d63da079e3249fb62d6bcd556e6f27d495dfd9
test_refitting[odd]__trackstates_gsf_refit.root: a61fe2d80d5d10d3b3505000e8abb589d88302bf5f54b625948793418f2a7fe8
test_refitting[odd]__tracksummary_gsf_refit.root: 082789fc1a85e578b3cf9a750723d2dcee01b5019e871c6a63e0b271f4e907b1
test_refitting[generic]__trackstates_gsf_refit.root: 9fa7af9eff12081504c0d648f6debae64f6996e0ca610cf58187d23aa5a13251
test_refitting[generic]__tracksummary_gsf_refit.root: 35b5ac6f208cae093fff94038d217a2e9915a5ce075da2a95718dda696f2d4a2
test_truth_tracking_kalman[generic-False-0.0]__trackstates_kf.root: 9f77962b92037cb760b1629a602b1dae61f45e659c45d9a87baa784f6190960e
test_truth_tracking_kalman[generic-False-0.0]__tracksummary_kf.root: 562deecee4cfb97ceee72eff53d63da079e3249fb62d6bcd556e6f27d495dfd9
test_truth_tracking_kalman[generic-False-1000.0]__trackstates_kf.root: 56a1bd989b9c1316b9098c65fa75df9e6683e62e35ae68d8f72d27220be0fd7d
Expand Down
3 changes: 2 additions & 1 deletion Examples/Python/tests/test_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ def test_refitting(tmp_path, detector_config, assert_root_hash):
field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))

seq = Sequencer(
events=10,
events=3,
numThreads=1,
)

Expand All @@ -699,6 +699,7 @@ def test_refitting(tmp_path, detector_config, assert_root_hash):
runRefittingGsf(
trackingGeometry=trackingGeometry,
field=field,
digiConfigFile=detector_config.digiConfigFile,
outputDir=tmp_path,
s=seq,
).run()
Expand Down
47 changes: 31 additions & 16 deletions Examples/Scripts/Python/truth_tracking_gsf_refitting.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,16 @@


def runRefittingGsf(
trackingGeometry,
field,
outputDir,
trackingGeometry: acts.TrackingGeometry,
field: acts.MagneticFieldProvider,
digiConfigFile: Path,
outputDir: Path,
s: acts.examples.Sequencer = None,
):
srcdir = Path(__file__).resolve().parent.parent.parent.parent

s = runTruthTrackingKalman(
trackingGeometry,
field,
digiConfigFile=srcdir
/ "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json",
# "thirdparty/OpenDataDetector/config/odd-digi-smearing-config.json",
digiConfigFile=digiConfigFile,
outputDir=outputDir,
s=s,
)
Expand All @@ -41,7 +38,7 @@ def runRefittingGsf(
acts.examples.RefittingAlgorithm(
acts.logging.INFO,
inputTracks="kf_tracks",
outputTracks="gsf_tracks",
outputTracks="gsf_refit_tracks",
fit=acts.examples.makeGsfFitterFunction(
trackingGeometry, field, **gsfOptions
),
Expand All @@ -51,7 +48,7 @@ def runRefittingGsf(
s.addAlgorithm(
acts.examples.TrackTruthMatcher(
level=acts.logging.INFO,
inputTracks="gsf_tracks",
inputTracks="gsf_refit_tracks",
inputParticles="truth_seeds_selected",
inputMeasurementParticlesMap="measurement_particles_map",
outputTrackParticleMatching="refit_track_particle_matching",
Expand All @@ -62,7 +59,7 @@ def runRefittingGsf(
s.addWriter(
acts.examples.RootTrackStatesWriter(
level=acts.logging.INFO,
inputTracks="gsf_tracks",
inputTracks="gsf_refit_tracks",
inputParticles="truth_seeds_selected",
inputTrackParticleMatching="refit_track_particle_matching",
inputSimHits="simhits",
Expand All @@ -87,18 +84,36 @@ def runRefittingGsf(
inputTracks="tracks",
inputParticles="truth_seeds_selected",
inputTrackParticleMatching="track_particle_matching",
filePath=str(outputDir / "performance_refitter.root"),
filePath=str(outputDir / "performance_gsf_refit.root"),
)
)

return s


if __name__ == "__main__":
outputDir = Path.cwd()
srcdir = Path(__file__).resolve().parent.parent.parent.parent

# ODD
from acts.examples.odd import getOpenDataDetector

detector, trackingGeometry, decorators = getOpenDataDetector()
digiConfigFile = (
srcdir / "thirdparty/OpenDataDetector/config/odd-digi-smearing-config.json"
)

## GenericDetector
# detector, trackingGeometry, _ = acts.examples.GenericDetector.create()
# digiConfigFile = (
# srcdir
# / "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json"
# )

# detector, trackingGeometry, decorators = getOpenDataDetector()
detector, trackingGeometry, decorators = acts.examples.GenericDetector.create()
field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))

runRefittingGsf(trackingGeometry, field, outputDir).run()
runRefittingGsf(
trackingGeometry=trackingGeometry,
field=field,
digiConfigFile=digiConfigFile,
outputDir=Path.cwd(),
).run()
122 changes: 122 additions & 0 deletions Examples/Scripts/Python/truth_tracking_kalman_refitting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
#!/usr/bin/env python3

from pathlib import Path

import acts
import acts.examples

from truth_tracking_kalman import runTruthTrackingKalman

u = acts.UnitConstants


def runRefittingKf(
trackingGeometry: acts.TrackingGeometry,
field: acts.MagneticFieldProvider,
digiConfigFile: Path,
outputDir: Path,
multipleScattering: bool = True,
energyLoss: bool = True,
reverseFilteringMomThreshold=0 * u.GeV,
s: acts.examples.Sequencer = None,
):
s = runTruthTrackingKalman(
trackingGeometry,
field,
digiConfigFile=digiConfigFile,
outputDir=outputDir,
s=s,
)

kalmanOptions = {
"multipleScattering": multipleScattering,
"energyLoss": energyLoss,
"reverseFilteringMomThreshold": reverseFilteringMomThreshold,
"freeToBoundCorrection": acts.examples.FreeToBoundCorrection(False),
"level": acts.logging.INFO,
}

s.addAlgorithm(
acts.examples.RefittingAlgorithm(
level=acts.logging.INFO,
inputTracks="kf_tracks",
outputTracks="kf_refit_tracks",
fit=acts.examples.makeKalmanFitterFunction(
trackingGeometry, field, **kalmanOptions
),
)
)

s.addAlgorithm(
acts.examples.TrackTruthMatcher(
level=acts.logging.INFO,
inputTracks="kf_refit_tracks",
inputParticles="truth_seeds_selected",
inputMeasurementParticlesMap="measurement_particles_map",
outputTrackParticleMatching="refit_track_particle_matching",
outputParticleTrackMatching="refit_particle_track_matching",
)
)

s.addWriter(
acts.examples.RootTrackStatesWriter(
level=acts.logging.INFO,
inputTracks="kf_refit_tracks",
inputParticles="truth_seeds_selected",
inputTrackParticleMatching="refit_track_particle_matching",
inputSimHits="simhits",
inputMeasurementSimHitsMap="measurement_simhits_map",
filePath=str(outputDir / "trackstates_kf_refit.root"),
)
)

s.addWriter(
acts.examples.RootTrackSummaryWriter(
level=acts.logging.INFO,
inputTracks="tracks",
inputParticles="truth_seeds_selected",
inputTrackParticleMatching="refit_track_particle_matching",
filePath=str(outputDir / "tracksummary_kf_refit.root"),
)
)

s.addWriter(
acts.examples.TrackFitterPerformanceWriter(
level=acts.logging.INFO,
inputTracks="tracks",
inputParticles="truth_seeds_selected",
inputTrackParticleMatching="track_particle_matching",
filePath=str(outputDir / "performance_kf_refit.root"),
)
)

return s


if __name__ == "__main__":
srcdir = Path(__file__).resolve().parent.parent.parent.parent
outputDir = Path.cwd()

# ODD
from acts.examples.odd import getOpenDataDetector

detector, trackingGeometry, decorators = getOpenDataDetector()
digiConfigFile = (
srcdir / "thirdparty/OpenDataDetector/config/odd-digi-smearing-config.json"
)

## GenericDetector
# detector, trackingGeometry, _ = acts.examples.GenericDetector.create()
# digiConfigFile = (
# srcdir
# / "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json"
# )

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

runRefittingKf(
trackingGeometry=trackingGeometry,
field=field,
digiConfigFile=digiConfigFile,
outputDir=Path.cwd(),
).run()

0 comments on commit ff6d195

Please sign in to comment.