Back to home page

EIC code displayed by LXR

 
 

    


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     # root map output check
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     # json map output check
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     # mapped tracks output check
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     # unmapped tracks output check
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     # test the validation as well
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)