File indexing completed on 2026-05-07 07:59:55
0001 from pathlib import Path
0002 import json
0003
0004
0005 from helpers import (
0006 geant4Enabled,
0007 dd4hepEnabled,
0008 assert_entries,
0009 )
0010 import pytest
0011
0012 import acts
0013 from acts.examples.odd import getOpenDataDetector
0014
0015 from acts.examples import Sequencer
0016
0017
0018 @pytest.mark.slow
0019 @pytest.mark.odd
0020 @pytest.mark.skipif(not geant4Enabled, reason="Geant4 not set up")
0021 @pytest.mark.skipif(not dd4hepEnabled, reason="DD4hep not set up")
0022 def test_material_recording(tmp_path, material_recording, assert_root_hash):
0023 root_files = [
0024 (
0025 "geant4_material_tracks.root",
0026 "material_tracks",
0027 2000,
0028 )
0029 ]
0030
0031 for fn, tn, ee in root_files:
0032 fp = material_recording / fn
0033 assert fp.exists()
0034 assert fp.stat().st_size > 2**10 * 50
0035 assert_entries(fp, tn, ee)
0036 assert_root_hash(fn, fp)
0037
0038
0039 @pytest.mark.slow
0040 @pytest.mark.odd
0041 @pytest.mark.skipif(not dd4hepEnabled, reason="DD4hep not set up")
0042 def test_material_mapping(material_recording, tmp_path, assert_root_hash):
0043 from material_mapping import runMaterialMapping
0044 from material_validation import runMaterialValidation
0045
0046 map_file = tmp_path / "material-map_tracks.root"
0047 assert not map_file.exists()
0048
0049 odd = getOpenDataDetector()
0050 trackingGeometry = odd.trackingGeometry()
0051 materialSurfaces = trackingGeometry.extractMaterialSurfaces()
0052
0053 s = Sequencer(events=2000, numThreads=1)
0054
0055 runMaterialMapping(
0056 surfaces=materialSurfaces,
0057 inputFile=material_recording / "geant4_material_tracks.root",
0058 outputFileBase=str(tmp_path / "material_mapping"),
0059 outputMapFormats=["json", "root"],
0060 loglevel=acts.logging.INFO,
0061 outputMaterialTracks="material_tracks",
0062 treeName="material_tracks",
0063 )
0064
0065 s.run()
0066
0067
0068 map_file_root = tmp_path / "material_mapping_map.root"
0069 assert map_file_root.exists()
0070 assert_root_hash(map_file_root.name, map_file_root)
0071
0072
0073 map_file_json = tmp_path / "material_mapping_map.json"
0074 assert map_file_json.exists()
0075 with map_file_json.open() as fh:
0076 assert json.load(fh)
0077
0078
0079 map_file_mapped = tmp_path / "material_mapping_mapped.root"
0080 assert map_file_mapped.exists()
0081 assert_root_hash(map_file_mapped.name, map_file_mapped)
0082
0083
0084 map_file_unmapped = tmp_path / "material_mapping_unmapped.root"
0085 assert map_file_unmapped.exists()
0086 assert_root_hash(map_file_unmapped.name, map_file_unmapped)
0087
0088 val_file = tmp_path / "material_validation.root"
0089 assert not val_file.exists()
0090
0091
0092 s = Sequencer(events=10, numThreads=1)
0093
0094 with getOpenDataDetector(
0095 materialDecorator=acts.IMaterialDecorator.fromFile(map_file_json)
0096 ) as detector:
0097 trackingGeometry = detector.trackingGeometry()
0098 materialSurfaces = trackingGeometry.extractMaterialSurfaces()
0099
0100 runMaterialValidation(
0101 surfaces=materialSurfaces,
0102 s=s,
0103 tracksPerEvent=1000,
0104 outputFileBase=tmp_path / "material_validation",
0105 materialTrackCollectionName="material_tracks",
0106 )
0107
0108 s.run()
0109
0110 assert val_file.exists()
0111 assert_entries(val_file, "material_tracks", 10000)
0112 assert_root_hash(val_file.name, val_file)