Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Particle selector works on measurements, not simhits #3856

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

update

a95b77d
Select commit
Loading
Failed to load commit list.
Draft

fix: Particle selector works on measurements, not simhits #3856

update
a95b77d
Select commit
Loading
Failed to load commit list.
ci-bridge / CI Bridge / linux_test_examples failed Nov 13, 2024 in 12m 8s

GitLab CI: FAILED

This check triggered job acts/ci-bridge/45940004
in pipeline acts/ci-bridge/24419
Status: FAILED
Created at: 2024-11-13T11:48:22.071+01:00
Started at: 2024-11-13T12:13:29.391+01:00
Finished at: 2024-11-13T12:25:37.907+01:00

Details

Showing last 1419 out of 20561 total lines

                "trackstates_ckf.root",
                "trackstates",
            ),
            (
                "tracksummary_ckf.root",
                "tracksummary",
            ),
        ]
    
        if not truthSmeared:
            root_files += [
                (
                    "performance_seeding.root",
                    None,
                ),
            ]
    
        for rf, _ in root_files:
            assert not (tmp_path / rf).exists()
    
        from ckf_tracks import runCKFTracks
    
        with detector_config.detectorTuple as (detector, trackingGeometry, decorators):
>           runCKFTracks(
                trackingGeometry,
                decorators,
                field=field,
                outputCsv=True,
                outputDir=tmp_path,
                geometrySelection=detector_config.geometrySelection,
                digiConfigFile=detector_config.digiConfigFile,
                truthSmearedSeeded=truthSmeared,
                truthEstimatedSeeded=truthEstimated,
                s=s,
            )

Examples/Python/tests/test_examples.py:1169: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/ckf_tracks.py:78: in runCKFTracks
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c7b1f330>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 9, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c7b1ed30>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
_______________ test_ckf_tracks_example[generic-truth_estimated] _______________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ckf_tracks_example_generi1')
assert_root_hash = <function assert_root_hash.<locals>.fn at 0x7fb6c7918b80>
truthSmeared = False, truthEstimated = True
detector_config = DetectorConfig(detectorTuple=DetectorContextManager(detector=<acts.ActsPythonBindings._examples.GenericDetector
object...uilds/acts/ci-bridge/src/Examples/Algorithms/Digitization/share/default-smearing-config-generic.json'), name='generic')

    @pytest.mark.parametrize(
        "truthSmeared,truthEstimated",
        [
            [False, False],
            [False, True],
            [True, False],
        ],
        ids=["full_seeding", "truth_estimated", "truth_smeared"],
    )
    @pytest.mark.slow
    def test_ckf_tracks_example(
        tmp_path, assert_root_hash, truthSmeared, truthEstimated, detector_config
    ):
        csv = tmp_path / "csv"
    
        assert not csv.exists()
    
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
        events = 100
        s = Sequencer(events=events, numThreads=-1)
    
        root_files = [
            (
                "performance_finding_ckf.root",
                None,
            ),
            (
                "trackstates_ckf.root",
                "trackstates",
            ),
            (
                "tracksummary_ckf.root",
                "tracksummary",
            ),
        ]
    
        if not truthSmeared:
            root_files += [
                (
                    "performance_seeding.root",
                    None,
                ),
            ]
    
        for rf, _ in root_files:
            assert not (tmp_path / rf).exists()
    
        from ckf_tracks import runCKFTracks
    
        with detector_config.detectorTuple as (detector, trackingGeometry, decorators):
>           runCKFTracks(
                trackingGeometry,
                decorators,
                field=field,
                outputCsv=True,
                outputDir=tmp_path,
                geometrySelection=detector_config.geometrySelection,
                digiConfigFile=detector_config.digiConfigFile,
                truthSmearedSeeded=truthSmeared,
                truthEstimatedSeeded=truthEstimated,
                s=s,
            )

Examples/Python/tests/test_examples.py:1169: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/ckf_tracks.py:78: in runCKFTracks
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c7a81eb0>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 9, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c7a810f0>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
________________ test_ckf_tracks_example[generic-truth_smeared] ________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ckf_tracks_example_generi2')
assert_root_hash = <function assert_root_hash.<locals>.fn at 0x7fb6c7918ae0>
truthSmeared = True, truthEstimated = False
detector_config = DetectorConfig(detectorTuple=DetectorContextManager(detector=<acts.ActsPythonBindings._examples.GenericDetector
object...uilds/acts/ci-bridge/src/Examples/Algorithms/Digitization/share/default-smearing-config-generic.json'), name='generic')

    @pytest.mark.parametrize(
        "truthSmeared,truthEstimated",
        [
            [False, False],
            [False, True],
            [True, False],
        ],
        ids=["full_seeding", "truth_estimated", "truth_smeared"],
    )
    @pytest.mark.slow
    def test_ckf_tracks_example(
        tmp_path, assert_root_hash, truthSmeared, truthEstimated, detector_config
    ):
        csv = tmp_path / "csv"
    
        assert not csv.exists()
    
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
        events = 100
        s = Sequencer(events=events, numThreads=-1)
    
        root_files = [
            (
                "performance_finding_ckf.root",
                None,
            ),
            (
                "trackstates_ckf.root",
                "trackstates",
            ),
            (
                "tracksummary_ckf.root",
                "tracksummary",
            ),
        ]
    
        if not truthSmeared:
            root_files += [
                (
                    "performance_seeding.root",
                    None,
                ),
            ]
    
        for rf, _ in root_files:
            assert not (tmp_path / rf).exists()
    
        from ckf_tracks import runCKFTracks
    
        with detector_config.detectorTuple as (detector, trackingGeometry, decorators):
>           runCKFTracks(
                trackingGeometry,
                decorators,
                field=field,
                outputCsv=True,
                outputDir=tmp_path,
                geometrySelection=detector_config.geometrySelection,
                digiConfigFile=detector_config.digiConfigFile,
                truthSmearedSeeded=truthSmeared,
                truthEstimatedSeeded=truthEstimated,
                s=s,
            )

Examples/Python/tests/test_examples.py:1169: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/ckf_tracks.py:78: in runCKFTracks
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c7ad9af0>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 9, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c7adad70>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
__________________ test_ckf_tracks_example[odd-full_seeding] ___________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ckf_tracks_example_odd_fu0')
assert_root_hash = <function assert_root_hash.<locals>.fn at 0x7fb6c791a520>
truthSmeared = False, truthEstimated = False
detector_config = DetectorConfig(detectorTuple=OpenDataDetectorContextManager(detector=<acts.ActsPythonBindingsDD4hep.DD4hepDetector
obj...e=PosixPath('/builds/acts/ci-bridge/src/thirdparty/OpenDataDetector/config/odd-digi-smearing-config.json'), name='odd')

    @pytest.mark.parametrize(
        "truthSmeared,truthEstimated",
        [
            [False, False],
            [False, True],
            [True, False],
        ],
        ids=["full_seeding", "truth_estimated", "truth_smeared"],
    )
    @pytest.mark.slow
    def test_ckf_tracks_example(
        tmp_path, assert_root_hash, truthSmeared, truthEstimated, detector_config
    ):
        csv = tmp_path / "csv"
    
        assert not csv.exists()
    
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
        events = 100
        s = Sequencer(events=events, numThreads=-1)
    
        root_files = [
            (
                "performance_finding_ckf.root",
                None,
            ),
            (
                "trackstates_ckf.root",
                "trackstates",
            ),
            (
                "tracksummary_ckf.root",
                "tracksummary",
            ),
        ]
    
        if not truthSmeared:
            root_files += [
                (
                    "performance_seeding.root",
                    None,
                ),
            ]
    
        for rf, _ in root_files:
            assert not (tmp_path / rf).exists()
    
        from ckf_tracks import runCKFTracks
    
        with detector_config.detectorTuple as (detector, trackingGeometry, decorators):
>           runCKFTracks(
                trackingGeometry,
                decorators,
                field=field,
                outputCsv=True,
                outputDir=tmp_path,
                geometrySelection=detector_config.geometrySelection,
                digiConfigFile=detector_config.digiConfigFile,
                truthSmearedSeeded=truthSmeared,
                truthEstimatedSeeded=truthEstimated,
                s=s,
            )

Examples/Python/tests/test_examples.py:1169: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/ckf_tracks.py:78: in runCKFTracks
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c7e646b0>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 9, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c7e65ef0>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
_________________ test_ckf_tracks_example[odd-truth_estimated] _________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ckf_tracks_example_odd_tr0')
assert_root_hash = <function assert_root_hash.<locals>.fn at 0x7fb6c7918d60>
truthSmeared = False, truthEstimated = True
detector_config = DetectorConfig(detectorTuple=OpenDataDetectorContextManager(detector=<acts.ActsPythonBindingsDD4hep.DD4hepDetector
obj...e=PosixPath('/builds/acts/ci-bridge/src/thirdparty/OpenDataDetector/config/odd-digi-smearing-config.json'), name='odd')

    @pytest.mark.parametrize(
        "truthSmeared,truthEstimated",
        [
            [False, False],
            [False, True],
            [True, False],
        ],
        ids=["full_seeding", "truth_estimated", "truth_smeared"],
    )
    @pytest.mark.slow
    def test_ckf_tracks_example(
        tmp_path, assert_root_hash, truthSmeared, truthEstimated, detector_config
    ):
        csv = tmp_path / "csv"
    
        assert not csv.exists()
    
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
        events = 100
        s = Sequencer(events=events, numThreads=-1)
    
        root_files = [
            (
                "performance_finding_ckf.root",
                None,
            ),
            (
                "trackstates_ckf.root",
                "trackstates",
            ),
            (
                "tracksummary_ckf.root",
                "tracksummary",
            ),
        ]
    
        if not truthSmeared:
            root_files += [
                (
                    "performance_seeding.root",
                    None,
                ),
            ]
    
        for rf, _ in root_files:
            assert not (tmp_path / rf).exists()
    
        from ckf_tracks import runCKFTracks
    
        with detector_config.detectorTuple as (detector, trackingGeometry, decorators):
>           runCKFTracks(
                trackingGeometry,
                decorators,
                field=field,
                outputCsv=True,
                outputDir=tmp_path,
                geometrySelection=detector_config.geometrySelection,
                digiConfigFile=detector_config.digiConfigFile,
                truthSmearedSeeded=truthSmeared,
                truthEstimatedSeeded=truthEstimated,
                s=s,
            )

Examples/Python/tests/test_examples.py:1169: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/ckf_tracks.py:78: in runCKFTracks
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c7c4a870>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 9, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c7c49cb0>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
__________________ test_ckf_tracks_example[odd-truth_smeared] __________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ckf_tracks_example_odd_tr1')
assert_root_hash = <function assert_root_hash.<locals>.fn at 0x7fb6c791afc0>
truthSmeared = True, truthEstimated = False
detector_config = DetectorConfig(detectorTuple=OpenDataDetectorContextManager(detector=<acts.ActsPythonBindingsDD4hep.DD4hepDetector
obj...e=PosixPath('/builds/acts/ci-bridge/src/thirdparty/OpenDataDetector/config/odd-digi-smearing-config.json'), name='odd')

    @pytest.mark.parametrize(
        "truthSmeared,truthEstimated",
        [
            [False, False],
            [False, True],
            [True, False],
        ],
        ids=["full_seeding", "truth_estimated", "truth_smeared"],
    )
    @pytest.mark.slow
    def test_ckf_tracks_example(
        tmp_path, assert_root_hash, truthSmeared, truthEstimated, detector_config
    ):
        csv = tmp_path / "csv"
    
        assert not csv.exists()
    
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
        events = 100
        s = Sequencer(events=events, numThreads=-1)
    
        root_files = [
            (
                "performance_finding_ckf.root",
                None,
            ),
            (
                "trackstates_ckf.root",
                "trackstates",
            ),
            (
                "tracksummary_ckf.root",
                "tracksummary",
            ),
        ]
    
        if not truthSmeared:
            root_files += [
                (
                    "performance_seeding.root",
                    None,
                ),
            ]
    
        for rf, _ in root_files:
            assert not (tmp_path / rf).exists()
    
        from ckf_tracks import runCKFTracks
    
        with detector_config.detectorTuple as (detector, trackingGeometry, decorators):
>           runCKFTracks(
                trackingGeometry,
                decorators,
                field=field,
                outputCsv=True,
                outputDir=tmp_path,
                geometrySelection=detector_config.geometrySelection,
                digiConfigFile=detector_config.digiConfigFile,
                truthSmearedSeeded=truthSmeared,
                truthEstimatedSeeded=truthEstimated,
                s=s,
            )

Examples/Python/tests/test_examples.py:1169: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/ckf_tracks.py:78: in runCKFTracks
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c7bdafb0>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 9, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c7bdb670>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
_________________________ test_full_chain_odd_example __________________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_full_chain_odd_example0')

    @pytest.mark.skipif(not dd4hepEnabled, reason="DD4hep not set up")
    @pytest.mark.odd
    @pytest.mark.slow
    def test_full_chain_odd_example(tmp_path):
        # This test literally only ensures that the full chain example can run without erroring out
    
        # just to make sure it can build the odd
        with getOpenDataDetector() as (detector, trackingGeometry, decorators):
            pass
    
        script = (
            Path(__file__).parent.parent.parent.parent
            / "Examples"
            / "Scripts"
            / "Python"
            / "full_chain_odd.py"
        )
        assert script.exists()
        env = os.environ.copy()
        env["ACTS_LOG_FAILURE_THRESHOLD"] = "ERROR"
        try:
>           subprocess.check_call(
                [sys.executable, str(script), "-n1"],
                cwd=tmp_path,
                env=env,
                stderr=subprocess.STDOUT,
            )

Examples/Python/tests/test_examples.py:1218: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

popenargs = (['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1'],)
kwargs = {'cwd': PosixPath('/tmp/pytest-of-root/pytest-0/test_full_chain_odd_example0'), 'env': {'ACTS_LOG_FAILURE_THRESHOLD': ...", "head_ref":
"fix/particle-selector-no-simhits"}', 'CCACHE_DIR': '/builds/acts/ci-bridge/ccache', ...}, 'stderr': -2}
retcode = 1
cmd = ['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1']

    def check_call(*popenargs, **kwargs):
        """Run command with arguments.  Wait for command to complete.  If
        the exit code was zero then return, otherwise raise
        CalledProcessError.  The CalledProcessError object will have the
        return code in the returncode attribute.
    
        The arguments are the same as for the call function.  Example:
    
        check_call(["ls", "-l"])
        """
        retcode = call(*popenargs, **kwargs)
        if retcode:
            cmd = kwargs.get("args")
            if cmd is None:
                cmd = popenargs[0]
>           raise CalledProcessError(retcode, cmd)
E           subprocess.CalledProcessError: Command '['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-
bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1']' returned non-zero exit status 1.

../dependencies/lib/python3.12/subprocess.py:413: CalledProcessError

During handling of the above exception, another exception occurred:

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_full_chain_odd_example0')

    @pytest.mark.skipif(not dd4hepEnabled, reason="DD4hep not set up")
    @pytest.mark.odd
    @pytest.mark.slow
    def test_full_chain_odd_example(tmp_path):
        # This test literally only ensures that the full chain example can run without erroring out
    
        # just to make sure it can build the odd
        with getOpenDataDetector() as (detector, trackingGeometry, decorators):
            pass
    
        script = (
            Path(__file__).parent.parent.parent.parent
            / "Examples"
            / "Scripts"
            / "Python"
            / "full_chain_odd.py"
        )
        assert script.exists()
        env = os.environ.copy()
        env["ACTS_LOG_FAILURE_THRESHOLD"] = "ERROR"
        try:
            subprocess.check_call(
                [sys.executable, str(script), "-n1"],
                cwd=tmp_path,
                env=env,
                stderr=subprocess.STDOUT,
            )
        except subprocess.CalledProcessError as e:
>           print(e.output.decode("utf-8"))
E           AttributeError: 'NoneType' object has no attribute 'decode'

Examples/Python/tests/test_examples.py:1225: AttributeError
__________________ test_full_chain_odd_example_pythia_geant4 ___________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_full_chain_odd_example_py0')

    @pytest.mark.skipif(
        not dd4hepEnabled or not geant4Enabled, reason="DD4hep and/or Geant4 not set up"
    )
    @pytest.mark.slow
    def test_full_chain_odd_example_pythia_geant4(tmp_path):
        # This test literally only ensures that the full chain example can run without erroring out
    
        # just to make sure it can build the odd
        with getOpenDataDetector() as (detector, trackingGeometry, decorators):
            pass
    
        script = (
            Path(__file__).parent.parent.parent.parent
            / "Examples"
            / "Scripts"
            / "Python"
            / "full_chain_odd.py"
        )
        assert script.exists()
        env = os.environ.copy()
        env["ACTS_LOG_FAILURE_THRESHOLD"] = "ERROR"
        try:
>           stdout = subprocess.check_output(
                [
                    sys.executable,
                    str(script),
                    "-n1",
                    "--geant4",
                    "--ttbar",
                    "--ttbar-pu",
                    "50",
                ],
                cwd=tmp_path,
                env=env,
                stderr=subprocess.STDOUT,
            )

Examples/Python/tests/test_examples.py:1251: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../dependencies/lib/python3.12/subprocess.py:466: in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

input = None, capture_output = False, timeout = None, check = True
popenargs = (['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1', '--
geant4', '--ttbar', '--ttbar-pu', ...],)
kwargs = {'cwd': PosixPath('/tmp/pytest-of-root/pytest-0/test_full_chain_odd_example_py0'), 'env': {'ACTS_LOG_FAILURE_THRESHOLD... "fix/particle-
selector-no-simhits"}', 'CCACHE_DIR': '/builds/acts/ci-bridge/ccache', ...}, 'stderr': -2, 'stdout': -1}
process = <Popen: returncode: 1 args: ['/builds/acts/ci-bridge/dependencies/bin/python...>
stdout = b'Warning in <TGeoMixture::ComputeDerivedQuantities>: Mixture PE: sum of weights is: 6\nDD4hep           WARN  ++ STD ... INFO
first = 0.796543\n11:23:33    Pythia8Gener   INFO                        last = 0.888187\n'
stderr = None, retcode = 1

    def run(*popenargs,
            input=None, capture_output=False, timeout=None, check=False, **kwargs):
        """Run command with arguments and return a CompletedProcess instance.
    
        The returned instance will have attributes args, returncode, stdout and
        stderr. By default, stdout and stderr are not captured, and those attributes
        will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them,
        or pass capture_output=True to capture both.
    
        If check is True and the exit code was non-zero, it raises a
        CalledProcessError. The CalledProcessError object will have the return code
        in the returncode attribute, and output & stderr attributes if those streams
        were captured.
    
        If timeout is given, and the process takes too long, a TimeoutExpired
        exception will be raised.
    
        There is an optional argument "input", allowing you to
        pass bytes or a string to the subprocess's stdin.  If you use this argument
        you may not also use the Popen constructor's "stdin" argument, as
        it will be used internally.
    
        By default, all communication is in bytes, and therefore any "input" should
        be bytes, and the stdout and stderr will be bytes. If in text mode, any
        "input" should be a string, and stdout and stderr will be strings decoded
        according to locale encoding, or by "encoding" if set. Text mode is
        triggered by setting any of text, encoding, errors or universal_newlines.
    
        The other arguments are the same as for the Popen constructor.
        """
        if input is not None:
            if kwargs.get('stdin') is not None:
                raise ValueError('stdin and input arguments may not both be used.')
            kwargs['stdin'] = PIPE
    
        if capture_output:
            if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None:
                raise ValueError('stdout and stderr arguments may not be used '
                                 'with capture_output.')
            kwargs['stdout'] = PIPE
            kwargs['stderr'] = PIPE
    
        with Popen(*popenargs, **kwargs) as process:
            try:
                stdout, stderr = process.communicate(input, timeout=timeout)
            except TimeoutExpired as exc:
                process.kill()
                if _mswindows:
                    # Windows accumulates the output in a single blocking
                    # read() call run on child threads, with the timeout
                    # being done in a join() on those threads.  communicate()
                    # _after_ kill() is required to collect that and add it
                    # to the exception.
                    exc.stdout, exc.stderr = process.communicate()
                else:
                    # POSIX _communicate already populated the output so
                    # far into the TimeoutExpired exception.
                    process.wait()
                raise
            except:  # Including KeyboardInterrupt, communicate handled that.
                process.kill()
                # We don't call process.wait() as .__exit__ does that for us.
                raise
            retcode = process.poll()
            if check and retcode:
>               raise CalledProcessError(retcode, process.args,
                                         output=stdout, stderr=stderr)
E               subprocess.CalledProcessError: Command '['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-
bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1', '--geant4', '--ttbar', '--ttbar-pu', '50']' returned non-zero exit status 1.

../dependencies/lib/python3.12/subprocess.py:571: CalledProcessError
___________________________ test_ML_Ambiguity_Solver ___________________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ML_Ambiguity_Solver0')
assert_root_hash = <function assert_root_hash.<locals>.fn at 0x7fb6c79189a0>

    @pytest.mark.skipif(not dd4hepEnabled, reason="DD4hep not set up")
    @pytest.mark.skipif(not onnxEnabled, reason="ONNX plugin not enabled")
    @pytest.mark.slow
    def test_ML_Ambiguity_Solver(tmp_path, assert_root_hash):
        # This test literally only ensures that the full chain example can run without erroring out
    
        root_file = "performance_finding_ambiML.root"
        output_dir = "odd_output"
        assert not (tmp_path / root_file).exists()
    
        # just to make sure it can build the odd
        with getOpenDataDetector() as (detector, trackingGeometry, decorators):
            pass
    
        script = (
            Path(__file__).parent.parent.parent.parent
            / "Examples"
            / "Scripts"
            / "Python"
            / "full_chain_odd.py"
        )
        assert script.exists()
        env = os.environ.copy()
        env["ACTS_LOG_FAILURE_THRESHOLD"] = "ERROR"
        try:
>           subprocess.check_call(
                [sys.executable, str(script), "-n1", "--ambi-solver", "ML"],
                cwd=tmp_path,
                env=env,
                stderr=subprocess.STDOUT,
            )

Examples/Python/tests/test_examples.py:1305: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

popenargs = (['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1', '--
ambi-solver', 'ML'],)
kwargs = {'cwd': PosixPath('/tmp/pytest-of-root/pytest-0/test_ML_Ambiguity_Solver0'), 'env': {'ACTS_LOG_FAILURE_THRESHOLD': 'ER...", "head_ref":
"fix/particle-selector-no-simhits"}', 'CCACHE_DIR': '/builds/acts/ci-bridge/ccache', ...}, 'stderr': -2}
retcode = 1
cmd = ['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1', '--ambi-
solver', 'ML']

    def check_call(*popenargs, **kwargs):
        """Run command with arguments.  Wait for command to complete.  If
        the exit code was zero then return, otherwise raise
        CalledProcessError.  The CalledProcessError object will have the
        return code in the returncode attribute.
    
        The arguments are the same as for the call function.  Example:
    
        check_call(["ls", "-l"])
        """
        retcode = call(*popenargs, **kwargs)
        if retcode:
            cmd = kwargs.get("args")
            if cmd is None:
                cmd = popenargs[0]
>           raise CalledProcessError(retcode, cmd)
E           subprocess.CalledProcessError: Command '['/builds/acts/ci-bridge/dependencies/bin/python3', '/builds/acts/ci-
bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1', '--ambi-solver', 'ML']' returned non-zero exit status 1.

../dependencies/lib/python3.12/subprocess.py:413: CalledProcessError

During handling of the above exception, another exception occurred:

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ML_Ambiguity_Solver0')
assert_root_hash = <function assert_root_hash.<locals>.fn at 0x7fb6c79189a0>

    @pytest.mark.skipif(not dd4hepEnabled, reason="DD4hep not set up")
    @pytest.mark.skipif(not onnxEnabled, reason="ONNX plugin not enabled")
    @pytest.mark.slow
    def test_ML_Ambiguity_Solver(tmp_path, assert_root_hash):
        # This test literally only ensures that the full chain example can run without erroring out
    
        root_file = "performance_finding_ambiML.root"
        output_dir = "odd_output"
        assert not (tmp_path / root_file).exists()
    
        # just to make sure it can build the odd
        with getOpenDataDetector() as (detector, trackingGeometry, decorators):
            pass
    
        script = (
            Path(__file__).parent.parent.parent.parent
            / "Examples"
            / "Scripts"
            / "Python"
            / "full_chain_odd.py"
        )
        assert script.exists()
        env = os.environ.copy()
        env["ACTS_LOG_FAILURE_THRESHOLD"] = "ERROR"
        try:
            subprocess.check_call(
                [sys.executable, str(script), "-n1", "--ambi-solver", "ML"],
                cwd=tmp_path,
                env=env,
                stderr=subprocess.STDOUT,
            )
        except subprocess.CalledProcessError as e:
>           print(e.output.decode("utf-8"))
E           AttributeError: 'NoneType' object has no attribute 'decode'

Examples/Python/tests/test_examples.py:1312: AttributeError
______________________________ test_gsf_debugger _______________________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_gsf_debugger0')

    def test_gsf_debugger(tmp_path):
        path = (
            Path(__file__).parent.parent.parent.parent
            / "Examples"
            / "Scripts"
            / "GsfDebugger"
        )
        scriptdir = (
            Path(__file__).parent.parent.parent.parent / "Examples" / "Scripts" / "Python"
        )
    
        gsf_script = path / "make_gsf_verbose_log.py"
        assert gsf_script.exists()
    
        debugger = path / "src/main.py"
        assert debugger.exists()
    
        env = os.environ.copy()
        env["PYTHONPATH"] = f"{scriptdir}:{env['PYTHONPATH']}"
        gsf_result = subprocess.run(
            [gsf_script], capture_output=True, cwd=tmp_path, env=env
        )
    
        logfile = tmp_path / "test.log"
        with open(logfile, "w") as f:
            f.write(gsf_result.stdout.decode("utf8"))
    
>       assert gsf_result.returncode == 0
E       assert 1 == 0
E        +  where 1 = CompletedProcess(args=[PosixPath('/builds/acts/ci-bridge/src/Examples/Scripts/GsfDebugger/make_gsf_verbose_log.py')],
returncode=1, stdout=b"11:23:48    Sequencer      INFO      Create Sequencer (single-threaded)\n11:23:48    Sequencer      INFO      Add Writer
'CsvTrackingGeometryWriter'\n11:23:48    Sequencer      INFO      Add Reader 'EventGenerator'\n11:23:48    Sequencer      INFO      -> OutputParticles
'particles_input':\n11:23:48    Sequencer      INFO         flat_set<SimParticle, detail::CompareParticleId, void>\n11:23:48    Sequencer      INFO
-> OutputVertices 'vertices_input':\n11:23:48    Sequencer      INFO         flat_set<SimVertex, detail::CompareVertexId, void>\n11:23:48    Sequencer
INFO      Key 'particles_input' aliased to 'particles'\n11:23:48    Sequencer      INFO      Key 'vertices_input' aliased to
'vertices_truth'\n11:23:48    ParticleSele   DEBUG     selection particle rho [0,inf)\n11:23:48    ParticleSele   DEBUG     selection particle |z|
[0,inf)\n11:23:48    ParticleSele   DEBUG     selection particle time [-inf,inf)\n11:23:48    ParticleSele   DEBUG     selection particle phi
[-inf,inf)\n11:23:48    ParticleSele   DEBUG     selection par...PE masks:\n- Core/include/Acts/TrackFitting/detail/GsfComponentMerging.hpp:88:
FLTUND: 1\n- Core/include/Acts/TrackFitting/detail/GsfComponentMerging.hpp:198: FLTUND: 1\n- Core/src/Vertexing/AdaptiveMultiVertexFinder.cpp:474:
FLTUND: 1\n- Fatras/include/ActsFatras/Kernel/detail/SimulationActor.hpp:172: FLTUND: 1\n-
Fatras/include/ActsFatras/Physics/ElectroMagnetic/BetheHeitler.hpp:66: FLTUND: 1\n", stderr=b'Traceback (most recent call last):\n  File
"/builds/acts/ci-bridge/src/Examples/Scripts/GsfDebugger/make_gsf_verbose_log.py", line 43, in <module>\n    runTruthTrackingGsf(\n  File
"/builds/acts/ci-bridge/src/Examples/Scripts/Python/truth_tracking_gsf.py", line 74, in runTruthTrackingGsf\n    addFatras(\n  File "/builds/acts/ci-
bridge/build/python/acts/examples/simulation.py", line 494, in addFatras\n    addParticleSelection(\n  File "/builds/acts/ci-
bridge/build/python/acts/examples/simulation.py", line 379, in addParticleSelection\n    acts.examples.ParticleSelector(\n  File "/builds/acts/ci-
bridge/build/python/acts/_adapter.py", line 41, in wrapped\n    fn(self, cfg, *args, **_kwargs)\nValueError: Read handle
\'ParticleSelector.InputMeasPartMap\' cannot receive empty key\n').returncode

Examples/Python/tests/test_misc.py:54: AssertionError
__________________________ test_edm4hep_tracks_reader __________________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_edm4hep_tracks_reader0')

    @pytest.mark.edm4hep
    @pytest.mark.skipif(not edm4hepEnabled, reason="EDM4hep is not set up")
    def test_edm4hep_tracks_reader(tmp_path):
        from acts.examples.edm4hep import EDM4hepTrackWriter, EDM4hepTrackReader
    
        detector, trackingGeometry, decorators = acts.examples.GenericDetector.create()
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
    
        from truth_tracking_kalman import runTruthTrackingKalman
    
        s = Sequencer(numThreads=1, events=10)
>       runTruthTrackingKalman(
            trackingGeometry,
            field,
            digiConfigFile=Path(
                str(
                    Path(__file__).parent.parent.parent.parent
                    / "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json"
                )
            ),
            outputDir=tmp_path,
            s=s,
        )

Examples/Python/tests/test_reader.py:395: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/truth_tracking_kalman.py:79: in runTruthTrackingKalman
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c448cd70>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 7, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c448ce30>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
_______________________ test_csv_multitrajectory_writer ________________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_csv_multitrajectory_write0')

    @pytest.mark.csv
    def test_csv_multitrajectory_writer(tmp_path):
        detector, trackingGeometry, decorators = GenericDetector.create()
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
    
        from truth_tracking_kalman import runTruthTrackingKalman
    
        s = Sequencer(numThreads=1, events=10)
>       runTruthTrackingKalman(
            trackingGeometry,
            field,
            digiConfigFile=Path(
                str(
                    Path(__file__).parent.parent.parent.parent
                    / "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json"
                )
            ),
            outputDir=tmp_path,
            s=s,
        )

Examples/Python/tests/test_writer.py:377: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/truth_tracking_kalman.py:79: in runTruthTrackingKalman
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb66d50fb70>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 7, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb66d50e770>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
_____________________ test_edm4hep_multitrajectory_writer ______________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_edm4hep_multitrajectory_w0')

    @pytest.mark.edm4hep
    @pytest.mark.skipif(not edm4hepEnabled, reason="EDM4hep is not set up")
    def test_edm4hep_multitrajectory_writer(tmp_path):
        from acts.examples.edm4hep import EDM4hepMultiTrajectoryWriter
    
        detector, trackingGeometry, decorators = GenericDetector.create()
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
    
        from truth_tracking_kalman import runTruthTrackingKalman
    
        s = Sequencer(numThreads=1, events=10)
>       runTruthTrackingKalman(
            trackingGeometry,
            field,
            digiConfigFile=Path(
                str(
                    Path(__file__).parent.parent.parent.parent
                    / "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json"
                )
            ),
            outputDir=tmp_path,
            s=s,
        )

Examples/Python/tests/test_writer.py:575: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/truth_tracking_kalman.py:79: in runTruthTrackingKalman
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb68c3be770>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 7, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb68c3bdef0>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
__________________________ test_edm4hep_tracks_writer __________________________

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_edm4hep_tracks_writer0')

    @pytest.mark.edm4hep
    @pytest.mark.skipif(not edm4hepEnabled, reason="EDM4hep is not set up")
    def test_edm4hep_tracks_writer(tmp_path):
        from acts.examples.edm4hep import EDM4hepTrackWriter
    
        detector, trackingGeometry, decorators = GenericDetector.create()
        field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
    
        from truth_tracking_kalman import runTruthTrackingKalman
    
        s = Sequencer(numThreads=1, events=10)
>       runTruthTrackingKalman(
            trackingGeometry,
            field,
            digiConfigFile=Path(
                str(
                    Path(__file__).parent.parent.parent.parent
                    / "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json"
                )
            ),
            outputDir=tmp_path,
            s=s,
        )

Examples/Python/tests/test_writer.py:624: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
Examples/Scripts/Python/truth_tracking_kalman.py:79: in runTruthTrackingKalman
    addFatras(
../build/python/acts/examples/simulation.py:494: in addFatras
    addParticleSelection(
../build/python/acts/examples/simulation.py:379: in addParticleSelection
    acts.examples.ParticleSelector(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <acts.ActsPythonBindings._examples.ParticleSelector object at 0x7fb6c43f0c70>
args = ()
kwargs = {'inputMeasurementParticlesMap': '', 'inputParticles': 'particles_simulated', 'level': <Level.INFO: 2>, 'measurementsMin': 7, ...}
cfg = <acts.ActsPythonBindings._examples.ParticleSelector.Config object at 0x7fb6c43f33f0>
_kwargs = {'level': <Level.INFO: 2>}, k = 'outputParticles'
v = 'fatras_particles_postselected'

    @functools.wraps(fn)
    def wrapped(self, *args, **kwargs):
        if len(args) > 0:
            maybe_config = args[0]
            if isinstance(maybe_config, inspect.unwrap(type(self).Config)):
                # is already config, nothing to do here
                fn(self, maybe_config, *args[1:], **kwargs)
                return
    
        if "config" in kwargs:
            config = kwargs.pop("config")
            fn(self, config, *args, **kwargs)
            return
    
        cfg = type(self).Config()
        _kwargs = {}
        for k, v in kwargs.items():
            if isinstance(v, Path):
                v = str(v)
    
            if hasattr(cfg, k):
                try:
                    setattr(cfg, k, v)
                except TypeError as e:
                    raise RuntimeError(
                        "{}: Failed to set {}={}".format(type(cfg), k, v)
                    ) from e
            else:
                _kwargs[k] = v
        try:
>           fn(self, cfg, *args, **_kwargs)
E           ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key

../build/python/acts/_adapter.py:41: ValueError
=============================== warnings summary ===============================
../dependencies/lib/cppyy/__init__.py:72
  /builds/acts/ci-bridge/dependencies/lib/cppyy/__init__.py:72: SyntaxWarning: invalid escape sequence '\d'
    if re.match('^libcppyy_backend\d+_\d+$', lib_name):

../dependencies/python/podio/EventStore.py:4
  /builds/acts/ci-bridge/dependencies/python/podio/EventStore.py:4: FutureWarning: The EventStore based I/O model is deprecated and will be removed.
Switch to the Frame based model.
    warnings.warn("The EventStore based I/O model is deprecated and will be removed. Switch to the Frame based model.",

Examples/Python/tests/test_examples.py::test_material_recording
Examples/Python/tests/test_reader.py::test_edm4hep_simhit_particle_reader
  /builds/acts/ci-bridge/dependencies/lib/python3.12/multiprocessing/popen_fork.py:66: DeprecationWarning: This process (pid=934) is multi-threaded,
use of fork() may lead to deadlocks in the child.
    self.pid = os.fork()

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ============================
FAILED Examples/Python/tests/test_examples.py::test_seeding - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_hashing_seeding - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty
key
FAILED Examples/Python/tests/test_examples.py::test_seeding_orthogonal - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive
empty key
FAILED Examples/Python/tests/test_examples.py::test_itk_seeding - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[generic-False-0.0] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[generic-False-1000.0] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[generic-True-0.0] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[generic-True-1000.0] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[odd-False-0.0] - ValueError: Read handle 'ParticleSelector.InputMeasPartMap'
cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[odd-False-1000.0] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[odd-True-0.0] - ValueError: Read handle 'ParticleSelector.InputMeasPartMap'
cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_kalman[odd-True-1000.0] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_gsf[generic] - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot
receive empty key
FAILED Examples/Python/tests/test_examples.py::test_truth_tracking_gsf[odd] - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot
receive empty key
FAILED Examples/Python/tests/test_examples.py::test_refitting[generic] - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive
empty key
FAILED Examples/Python/tests/test_examples.py::test_refitting[odd] - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive empty
key
FAILED Examples/Python/tests/test_examples.py::test_ckf_tracks_example[generic-full_seeding] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_ckf_tracks_example[generic-truth_estimated] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_ckf_tracks_example[generic-truth_smeared] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_ckf_tracks_example[odd-full_seeding] - ValueError: Read handle 'ParticleSelector.InputMeasPartMap'
cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_ckf_tracks_example[odd-truth_estimated] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_ckf_tracks_example[odd-truth_smeared] - ValueError: Read handle
'ParticleSelector.InputMeasPartMap' cannot receive empty key
FAILED Examples/Python/tests/test_examples.py::test_full_chain_odd_example - AttributeError: 'NoneType' object has no attribute 'decode'
FAILED Examples/Python/tests/test_examples.py::test_full_chain_odd_example_pythia_geant4 - subprocess.CalledProcessError: Command '['/builds/acts/ci-
bridge/dependencies/bin/python3', '/builds/acts/ci-bridge/src/Examples/Scripts/Python/full_chain_odd.py', '-n1', '--geant4', '--ttbar', '--ttbar-pu',
'50']' returned non-zero exit status 1.
FAILED Examples/Python/tests/test_examples.py::test_ML_Ambiguity_Solver - AttributeError: 'NoneType' object has no attribute 'decode'
FAILED Examples/Python/tests/test_misc.py::test_gsf_debugger - assert 1 == 0
 +  where 1 = CompletedProcess(args=[PosixPath('/builds/acts/ci-bridge/src/Examples/Scripts/GsfDebugger/make_gsf_verbose_log.py')], returncode=1,
stdout=b"11:23:48    Sequencer      INFO      Create Sequencer (single-threaded)\n11:23:48    Sequencer      INFO      Add Writer
'CsvTrackingGeometryWriter'\n11:23:48    Sequencer      INFO      Add Reader 'EventGenerator'\n11:23:48    Sequencer      INFO      -> OutputParticles
'particles_input':\n11:23:48    Sequencer      INFO         flat_set<SimParticle, detail::CompareParticleId, void>\n11:23:48    Sequencer      INFO
-> OutputVertices 'vertices_input':\n11:23:48    Sequencer      INFO         flat_set<SimVertex, detail::CompareVertexId, void>\n11:23:48    Sequencer
INFO      Key 'particles_input' aliased to 'particles'\n11:23:48    Sequencer      INFO      Key 'vertices_input' aliased to
'vertices_truth'\n11:23:48    ParticleSele   DEBUG     selection particle rho [0,inf)\n11:23:48    ParticleSele   DEBUG     selection particle |z|
[0,inf)\n11:23:48    ParticleSele   DEBUG     selection particle time [-inf,inf)\n11:23:48    ParticleSele   DEBUG     selection particle phi
[-inf,inf)\n11:23:48    ParticleSele   DEBUG     selection par...PE masks:\n- Core/include/Acts/TrackFitting/detail/GsfComponentMerging.hpp:88:
FLTUND: 1\n- Core/include/Acts/TrackFitting/detail/GsfComponentMerging.hpp:198: FLTUND: 1\n- Core/src/Vertexing/AdaptiveMultiVertexFinder.cpp:474:
FLTUND: 1\n- Fatras/include/ActsFatras/Kernel/detail/SimulationActor.hpp:172: FLTUND: 1\n-
Fatras/include/ActsFatras/Physics/ElectroMagnetic/BetheHeitler.hpp:66: FLTUND: 1\n", stderr=b'Traceback (most recent call last):\n  File
"/builds/acts/ci-bridge/src/Examples/Scripts/GsfDebugger/make_gsf_verbose_log.py", line 43, in <module>\n    runTruthTrackingGsf(\n  File
"/builds/acts/ci-bridge/src/Examples/Scripts/Python/truth_tracking_gsf.py", line 74, in runTruthTrackingGsf\n    addFatras(\n  File "/builds/acts/ci-
bridge/build/python/acts/examples/simulation.py", line 494, in addFatras\n    addParticleSelection(\n  File "/builds/acts/ci-
bridge/build/python/acts/examples/simulation.py", line 379, in addParticleSelection\n    acts.examples.ParticleSelector(\n  File "/builds/acts/ci-
bridge/build/python/acts/_adapter.py", line 41, in wrapped\n    fn(self, cfg, *args, **_kwargs)\nValueError: Read handle
\'ParticleSelector.InputMeasPartMap\' cannot receive empty key\n').returncode
FAILED Examples/Python/tests/test_reader.py::test_edm4hep_tracks_reader - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive
empty key
FAILED Examples/Python/tests/test_writer.py::test_csv_multitrajectory_writer - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot
receive empty key
FAILED Examples/Python/tests/test_writer.py::test_edm4hep_multitrajectory_writer - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot
receive empty key
FAILED Examples/Python/tests/test_writer.py::test_edm4hep_tracks_writer - ValueError: Read handle 'ParticleSelector.InputMeasPartMap' cannot receive
empty key
===== 30 failed, 215 passed, 4 deselected, 4 warnings in 588.97s (0:09:48) =====
section_end:1731497135:step_script
section_start:1731497135:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1731497136:cleanup_file_variables
ERROR: Job failed: exit code 1