diff --git a/benchmarks/track_finding/options/track_reconstruction.py b/benchmarks/track_finding/options/track_reconstruction.py
index 88e6bb907b5a7f0c8cd960c6862f9ff8cf5d2876..f9ee38dc532fdaa8a5286fd356b6156644a365ba 100644
--- a/benchmarks/track_finding/options/track_reconstruction.py
+++ b/benchmarks/track_finding/options/track_reconstruction.py
@@ -22,11 +22,24 @@ input_sim_file  = str(os.environ["JUGGLER_SIM_FILE"])
 output_rec_file = str(os.environ["JUGGLER_REC_FILE"])
 n_events = str(os.environ["JUGGLER_N_EVENTS"])
 
-geo_service  = GeoSvc("GeoSvc", detectors=["{}/{}.xml".format(detector_path,detector_name)], OutputLevel=WARNING)
+## note: old version of material map is called material-maps.XXX, new version is materials-map.XXX
+##       these names are somewhat inconsistent, and should probably all be renamed to 'material-map.XXX'
+##       FIXME
+if detector_version == 'acadia':
+    geo_service = GeoSvc("GeoSvc",
+                         detectors=["{}/{}.xml".format(detector_path,detector_name)],
+                         materials="config/material-maps.json",
+                         OutputLevel=WARNING)
+else:
+    geo_service = GeoSvc("GeoSvc",
+                         detectors=["{}/{}.xml".format(detector_path,detector_name)],
+                         materials="calibrations/materials-map.cbor",
+                         OutputLevel=WARNING)
 podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file], OutputLevel=WARNING)
 
 from Configurables import PodioInput
 
+from Configurables import Jug__Digi__SimTrackerHitsCollector as SimTrackerHitsCollector
 from Configurables import Jug__Digi__SiliconTrackerDigi as TrackerDigi
 
 from Configurables import Jug__Reco__TrackerHitReconstruction as TrackerHitReconstruction
@@ -46,48 +59,96 @@ from Configurables import Jug__Reco__SimpleClustering as SimpleClustering
 
 algorithms = [ ]
 
-input_collections = ['MCParticles','TrackerEndcapHits','TrackerBarrelHits','VertexBarrelHits','GEMTrackerEndcapHits']
+tracker_endcap_collections = [
+    'TrackerEndcapHits1',
+    'TrackerEndcapHits2',
+    'TrackerEndcapHits3',
+    'TrackerEndcapHits4',
+    'TrackerEndcapHits5',
+    'TrackerEndcapHits6'
+]
+tracker_barrel_collections = [
+    'TrackerBarrelHits'
+]
+vertex_barrel_collections = [
+    'VertexBarrelHits'
+]
+gem_endcap_collections = [
+    'GEMTrackerEndcapHits1',
+    'GEMTrackerEndcapHits2',
+    'GEMTrackerEndcapHits3'
+]
+vertex_endcap_collections = [
+    'VertexEndcapHits'
+]
+mpgd_barrel_collections = [
+    'MPGDTrackerBarrelHits1',
+    'MPGDTrackerBarrelHits2'
+]
+
+input_collections = ['MCParticles'] + tracker_endcap_collections + tracker_barrel_collections + vertex_barrel_collections + gem_endcap_collections
+
 if 'acadia' in detector_version:
-    input_collections.append('VertexEndcapHits')
+    input_collections += vertex_endcap_collections
 else:
-    input_collections.append('MPGDTrackerBarrelHits')
-podioinput = PodioInput("PodioReader", 
-                        collections=input_collections)#, OutputLevel=DEBUG)
+    input_collections += mpgd_barrel_collections
+
+podioinput = PodioInput("PodioReader",
+                        collections=input_collections)
 algorithms.append( podioinput )
 
-trk_b_digi = TrackerDigi("trk_b_digi", 
-        inputHitCollection="TrackerBarrelHits",
-        outputHitCollection="TrackerBarrelRawHits",
+trk_b_coll = SimTrackerHitsCollector("trk_b_coll",
+        inputSimTrackerHits = tracker_barrel_collections,
+        outputSimTrackerHits = "TrackerBarrelHits")
+trk_b_digi = TrackerDigi("trk_b_digi",
+        inputHitCollection = trk_b_coll.outputSimTrackerHits,
+        outputHitCollection = "TrackerBarrelRawHits",
         timeResolution=8)
 algorithms.append( trk_b_digi )
-trk_ec_digi = TrackerDigi("trk_ec_digi", 
-        inputHitCollection="TrackerEndcapHits",
-        outputHitCollection="TrackerEndcapRawHits",
+
+trk_ec_coll = SimTrackerHitsCollector("trk_ec_coll",
+        inputSimTrackerHits = tracker_endcap_collections,
+        outputSimTrackerHits = "TrackerEndcapHits")
+trk_ec_digi = TrackerDigi("trk_ec_digi",
+        inputHitCollection = trk_ec_coll.outputSimTrackerHits,
+        outputHitCollection = "TrackerEndcapRawHits",
         timeResolution=8)
 algorithms.append( trk_ec_digi )
 
-vtx_b_digi = TrackerDigi("vtx_b_digi", 
-        inputHitCollection="VertexBarrelHits",
-        outputHitCollection="VertexBarrelRawHits",
+vtx_b_coll = SimTrackerHitsCollector("vtx_b_coll",
+        inputSimTrackerHits = vertex_barrel_collections,
+        outputSimTrackerHits = "VertexBarrelHits")
+vtx_b_digi = TrackerDigi("vtx_b_digi",
+        inputHitCollection = vtx_b_coll.outputSimTrackerHits,
+        outputHitCollection = "VertexBarrelRawHits",
         timeResolution=8)
 algorithms.append( vtx_b_digi )
 
 if 'acadia' in detector_version:
-    vtx_ec_digi = TrackerDigi("vtx_ec_digi", 
-            inputHitCollection="VertexEndcapHits",
-            outputHitCollection="VertexEndcapRawHits",
+    vtx_ec_coll = SimTrackerHitsCollector("vtx_ec_coll",
+            inputSimTrackerHits = vertex_endcap_collections,
+            outputSimTrackerHits = "VertexEndcapHits")
+    vtx_ec_digi = TrackerDigi("vtx_ec_digi",
+            inputHitCollection = vtx_ec_coll.outputSimTrackerHits,
+            outputHitCollection = "VertexEndcapRawHits",
             timeResolution=8)
     algorithms.append( vtx_ec_digi )
 else:
-    mm_b_digi = TrackerDigi("mm_b_digi", 
-            inputHitCollection="MPGDTrackerBarrelHits",
-            outputHitCollection="MPGDTrackerBarrelRawHits",
+    mm_b_coll = SimTrackerHitsCollector("mm_b_coll",
+            inputSimTrackerHits = mpgd_barrel_collections,
+            outputSimTrackerHits = "MPGDTrackerBarrelHits")
+    mm_b_digi = TrackerDigi("mm_b_digi",
+            inputHitCollection = mm_b_coll.outputSimTrackerHits,
+            outputHitCollection = "MPGDTrackerBarrelRawHits",
             timeResolution=8)
     algorithms.append( mm_b_digi )
 
+gem_ec_coll = SimTrackerHitsCollector("gem_ec_coll",
+        inputSimTrackerHits = gem_endcap_collections,
+        outputSimTrackerHits = "GEMTrackerEndcapHits")
 gem_ec_digi = TrackerDigi("gem_ec_digi",
-        inputHitCollection="GEMTrackerEndcapHits",
-        outputHitCollection="GEMTrackerEndcapRawHits",
+        inputHitCollection = gem_ec_coll.outputSimTrackerHits,
+        outputHitCollection = "GEMTrackerEndcapRawHits",
         timeResolution=10)
 algorithms.append(gem_ec_digi)
 
diff --git a/benchmarks/track_fitting/options/track_reconstruction.py b/benchmarks/track_fitting/options/track_reconstruction.py
index 83f00b8de9df7a86b70495f4b58a67b1d8296e06..31e4a6ce499cff0dfdeaa821261d7d304b0ab67c 100644
--- a/benchmarks/track_fitting/options/track_reconstruction.py
+++ b/benchmarks/track_fitting/options/track_reconstruction.py
@@ -22,18 +22,30 @@ input_sim_file  = str(os.environ["JUGGLER_SIM_FILE"])
 output_rec_file = str(os.environ["JUGGLER_REC_FILE"])
 n_events = str(os.environ["JUGGLER_N_EVENTS"])
 
-geo_service  = GeoSvc("GeoSvc", detectors=["{}/{}.xml".format(detector_path,detector_name)], OutputLevel=WARNING)
+## note: old version of material map is called material-maps.XXX, new version is materials-map.XXX
+##       these names are somewhat inconsistent, and should probably all be renamed to 'material-map.XXX'
+##       FIXME
+if detector_version == 'acadia':
+    geo_service = GeoSvc("GeoSvc",
+                         detectors=["{}/{}.xml".format(detector_path,detector_name)],
+                         materials="config/material-maps.json",
+                         OutputLevel=WARNING)
+else:
+    geo_service = GeoSvc("GeoSvc",
+                         detectors=["{}/{}.xml".format(detector_path,detector_name)],
+                         materials="calibrations/materials-map.cbor",
+                         OutputLevel=WARNING)
 podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file], OutputLevel=WARNING)
 
 from Configurables import PodioInput
 
+from Configurables import Jug__Digi__SimTrackerHitsCollector as SimTrackerHitsCollector
 from Configurables import Jug__Digi__SiliconTrackerDigi as TrackerDigi
 
 from Configurables import Jug__Reco__TrackerHitReconstruction as TrackerHitReconstruction
 from Configurables import Jug__Reco__TrackingHitsCollector2 as TrackingHitsCollector
 
 from Configurables import Jug__Reco__TrackerSourceLinker as TrackerSourceLinker
-#from Configurables import Jug__Reco__TrackingHitsSourceLinker as TrackingHitsSourceLinker
 from Configurables import Jug__Reco__TrackParamTruthInit as TrackParamTruthInit
 from Configurables import Jug__Reco__TrackParamClusterInit as TrackParamClusterInit
 from Configurables import Jug__Reco__TrackParamVertexClusterInit as TrackParamVertexClusterInit
@@ -46,48 +58,96 @@ from Configurables import Jug__Reco__SimpleClustering as SimpleClustering
 
 algorithms = [ ]
 
-input_collections = ['MCParticles','TrackerEndcapHits','TrackerBarrelHits','VertexBarrelHits','GEMTrackerEndcapHits']
+tracker_endcap_collections = [
+    'TrackerEndcapHits1',
+    'TrackerEndcapHits2',
+    'TrackerEndcapHits3',
+    'TrackerEndcapHits4',
+    'TrackerEndcapHits5',
+    'TrackerEndcapHits6'
+]
+tracker_barrel_collections = [
+    'TrackerBarrelHits'
+]
+vertex_barrel_collections = [
+    'VertexBarrelHits'
+]
+gem_endcap_collections = [
+    'GEMTrackerEndcapHits1',
+    'GEMTrackerEndcapHits2',
+    'GEMTrackerEndcapHits3'
+]
+vertex_endcap_collections = [
+    'VertexEndcapHits'
+]
+mpgd_barrel_collections = [
+    'MPGDTrackerBarrelHits1',
+    'MPGDTrackerBarrelHits2'
+]
+
+input_collections = ['MCParticles'] + tracker_endcap_collections + tracker_barrel_collections + vertex_barrel_collections + gem_endcap_collections
+
 if 'acadia' in detector_version:
-    input_collections.append('VertexEndcapHits')
+    input_collections += vertex_endcap_collections
 else:
-    input_collections.append('MPGDTrackerBarrelHits')
-podioinput = PodioInput("PodioReader", 
-                        collections=input_collections)#, OutputLevel=DEBUG)
+    input_collections += mpgd_barrel_collections
+
+podioinput = PodioInput("PodioReader",
+                        collections=input_collections)
 algorithms.append( podioinput )
 
-trk_b_digi = TrackerDigi("trk_b_digi", 
-        inputHitCollection="TrackerBarrelHits",
-        outputHitCollection="TrackerBarrelRawHits",
+trk_b_coll = SimTrackerHitsCollector("trk_b_coll",
+        inputSimTrackerHits = tracker_barrel_collections,
+        outputSimTrackerHits = "TrackerBarrelHits")
+trk_b_digi = TrackerDigi("trk_b_digi",
+        inputHitCollection = trk_b_coll.outputSimTrackerHits,
+        outputHitCollection = "TrackerBarrelRawHits",
         timeResolution=8)
 algorithms.append( trk_b_digi )
-trk_ec_digi = TrackerDigi("trk_ec_digi", 
-        inputHitCollection="TrackerEndcapHits",
-        outputHitCollection="TrackerEndcapRawHits",
+
+trk_ec_coll = SimTrackerHitsCollector("trk_ec_coll",
+        inputSimTrackerHits = tracker_endcap_collections,
+        outputSimTrackerHits = "TrackerEndcapHits")
+trk_ec_digi = TrackerDigi("trk_ec_digi",
+        inputHitCollection = trk_ec_coll.outputSimTrackerHits,
+        outputHitCollection = "TrackerEndcapRawHits",
         timeResolution=8)
 algorithms.append( trk_ec_digi )
 
-vtx_b_digi = TrackerDigi("vtx_b_digi", 
-        inputHitCollection="VertexBarrelHits",
-        outputHitCollection="VertexBarrelRawHits",
+vtx_b_coll = SimTrackerHitsCollector("vtx_b_coll",
+        inputSimTrackerHits = vertex_barrel_collections,
+        outputSimTrackerHits = "VertexBarrelHits")
+vtx_b_digi = TrackerDigi("vtx_b_digi",
+        inputHitCollection = vtx_b_coll.outputSimTrackerHits,
+        outputHitCollection = "VertexBarrelRawHits",
         timeResolution=8)
 algorithms.append( vtx_b_digi )
 
 if 'acadia' in detector_version:
-    vtx_ec_digi = TrackerDigi("vtx_ec_digi", 
-            inputHitCollection="VertexEndcapHits",
-            outputHitCollection="VertexEndcapRawHits",
+    vtx_ec_coll = SimTrackerHitsCollector("vtx_ec_coll",
+            inputSimTrackerHits = vertex_endcap_collections,
+            outputSimTrackerHits = "VertexEndcapHits")
+    vtx_ec_digi = TrackerDigi("vtx_ec_digi",
+            inputHitCollection = vtx_ec_coll.outputSimTrackerHits,
+            outputHitCollection = "VertexEndcapRawHits",
             timeResolution=8)
     algorithms.append( vtx_ec_digi )
 else:
-    mm_b_digi = TrackerDigi("mm_b_digi", 
-            inputHitCollection="MPGDTrackerBarrelHits",
-            outputHitCollection="MPGDTrackerBarrelRawHits",
+    mm_b_coll = SimTrackerHitsCollector("mm_b_coll",
+            inputSimTrackerHits = mpgd_barrel_collections,
+            outputSimTrackerHits = "MPGDTrackerBarrelHits")
+    mm_b_digi = TrackerDigi("mm_b_digi",
+            inputHitCollection = mm_b_coll.outputSimTrackerHits,
+            outputHitCollection = "MPGDTrackerBarrelRawHits",
             timeResolution=8)
     algorithms.append( mm_b_digi )
 
+gem_ec_coll = SimTrackerHitsCollector("gem_ec_coll",
+        inputSimTrackerHits = gem_endcap_collections,
+        outputSimTrackerHits = "GEMTrackerEndcapHits")
 gem_ec_digi = TrackerDigi("gem_ec_digi",
-        inputHitCollection="GEMTrackerEndcapHits",
-        outputHitCollection="GEMTrackerEndcapRawHits",
+        inputHitCollection = gem_ec_coll.outputSimTrackerHits,
+        outputHitCollection = "GEMTrackerEndcapRawHits",
         timeResolution=10)
 algorithms.append(gem_ec_digi)
 
diff --git a/benchmarks/tracking/options/track_reconstruction.py b/benchmarks/tracking/options/track_reconstruction.py
index cdf2764ecc4c6b30bbb68faeb4015a8ca5cbf5aa..2512324c9a9f44004fddb69b9db893c5a0afffd6 100644
--- a/benchmarks/tracking/options/track_reconstruction.py
+++ b/benchmarks/tracking/options/track_reconstruction.py
@@ -39,6 +39,7 @@ podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file], OutputLevel=W
 
 from Configurables import PodioInput
 
+from Configurables import Jug__Digi__SimTrackerHitsCollector as SimTrackerHitsCollector
 from Configurables import Jug__Digi__SiliconTrackerDigi as TrackerDigi
 
 from Configurables import Jug__Reco__TrackerHitReconstruction as TrackerHitReconstruction
@@ -58,50 +59,96 @@ from Configurables import Jug__Reco__SimpleClustering as SimpleClustering
 
 algorithms = [ ]
 
-input_collections = ['MCParticles','TrackerEndcapHits','TrackerBarrelHits','VertexBarrelHits','GEMTrackerEndcapHits']
+tracker_endcap_collections = [
+    'TrackerEndcapHits1',
+    'TrackerEndcapHits2',
+    'TrackerEndcapHits3',
+    'TrackerEndcapHits4',
+    'TrackerEndcapHits5',
+    'TrackerEndcapHits6'
+]
+tracker_barrel_collections = [
+    'TrackerBarrelHits'
+]
+vertex_barrel_collections = [
+    'VertexBarrelHits'
+]
+gem_endcap_collections = [
+    'GEMTrackerEndcapHits1',
+    'GEMTrackerEndcapHits2',
+    'GEMTrackerEndcapHits3'
+]
+vertex_endcap_collections = [
+    'VertexEndcapHits'
+]
+mpgd_barrel_collections = [
+    'MPGDTrackerBarrelHits1',
+    'MPGDTrackerBarrelHits2'
+]
+
+input_collections = ['MCParticles'] + tracker_endcap_collections + tracker_barrel_collections + vertex_barrel_collections + gem_endcap_collections
+
 if 'acadia' in detector_version:
-    input_collections.append('VertexEndcapHits')
+    input_collections += vertex_endcap_collections
 else:
-    input_collections.append('MPGDTrackerBarrelHits')
-podioinput = PodioInput("PodioReader", 
-                        collections=input_collections,
-                        OutputLevel=DEBUG)
+    input_collections += mpgd_barrel_collections
+
+podioinput = PodioInput("PodioReader",
+                        collections=input_collections)
 algorithms.append( podioinput )
 
-trk_b_digi = TrackerDigi("trk_b_digi", 
-        inputHitCollection="TrackerBarrelHits",
-        outputHitCollection="TrackerBarrelRawHits",
-        timeResolution=8,
-        OutputLevel=DEBUG)
+trk_b_coll = SimTrackerHitsCollector("trk_b_coll",
+        inputSimTrackerHits = tracker_barrel_collections,
+        outputSimTrackerHits = "TrackerBarrelHits")
+trk_b_digi = TrackerDigi("trk_b_digi",
+        inputHitCollection = trk_b_coll.outputSimTrackerHits,
+        outputHitCollection = "TrackerBarrelRawHits",
+        timeResolution=8)
 algorithms.append( trk_b_digi )
-trk_ec_digi = TrackerDigi("trk_ec_digi", 
-        inputHitCollection="TrackerEndcapHits",
-        outputHitCollection="TrackerEndcapRawHits",
+
+trk_ec_coll = SimTrackerHitsCollector("trk_ec_coll",
+        inputSimTrackerHits = tracker_endcap_collections,
+        outputSimTrackerHits = "TrackerEndcapHits")
+trk_ec_digi = TrackerDigi("trk_ec_digi",
+        inputHitCollection = trk_ec_coll.outputSimTrackerHits,
+        outputHitCollection = "TrackerEndcapRawHits",
         timeResolution=8)
 algorithms.append( trk_ec_digi )
 
-vtx_b_digi = TrackerDigi("vtx_b_digi", 
-        inputHitCollection="VertexBarrelHits",
-        outputHitCollection="VertexBarrelRawHits",
+vtx_b_coll = SimTrackerHitsCollector("vtx_b_coll",
+        inputSimTrackerHits = vertex_barrel_collections,
+        outputSimTrackerHits = "VertexBarrelHits")
+vtx_b_digi = TrackerDigi("vtx_b_digi",
+        inputHitCollection = vtx_b_coll.outputSimTrackerHits,
+        outputHitCollection = "VertexBarrelRawHits",
         timeResolution=8)
 algorithms.append( vtx_b_digi )
 
 if 'acadia' in detector_version:
-    vtx_ec_digi = TrackerDigi("vtx_ec_digi", 
-            inputHitCollection="VertexEndcapHits",
-            outputHitCollection="VertexEndcapRawHits",
+    vtx_ec_coll = SimTrackerHitsCollector("vtx_ec_coll",
+            inputSimTrackerHits = vertex_endcap_collections,
+            outputSimTrackerHits = "VertexEndcapHits")
+    vtx_ec_digi = TrackerDigi("vtx_ec_digi",
+            inputHitCollection = vtx_ec_coll.outputSimTrackerHits,
+            outputHitCollection = "VertexEndcapRawHits",
             timeResolution=8)
     algorithms.append( vtx_ec_digi )
 else:
-    mm_b_digi = TrackerDigi("mm_b_digi", 
-            inputHitCollection="MPGDTrackerBarrelHits",
-            outputHitCollection="MPGDTrackerBarrelRawHits",
+    mm_b_coll = SimTrackerHitsCollector("mm_b_coll",
+            inputSimTrackerHits = mpgd_barrel_collections,
+            outputSimTrackerHits = "MPGDTrackerBarrelHits")
+    mm_b_digi = TrackerDigi("mm_b_digi",
+            inputHitCollection = mm_b_coll.outputSimTrackerHits,
+            outputHitCollection = "MPGDTrackerBarrelRawHits",
             timeResolution=8)
     algorithms.append( mm_b_digi )
 
+gem_ec_coll = SimTrackerHitsCollector("gem_ec_coll",
+        inputSimTrackerHits = gem_endcap_collections,
+        outputSimTrackerHits = "GEMTrackerEndcapHits")
 gem_ec_digi = TrackerDigi("gem_ec_digi",
-        inputHitCollection="GEMTrackerEndcapHits",
-        outputHitCollection="GEMTrackerEndcapRawHits",
+        inputHitCollection = gem_ec_coll.outputSimTrackerHits,
+        outputHitCollection = "GEMTrackerEndcapRawHits",
         timeResolution=10)
 algorithms.append(gem_ec_digi)
 
@@ -156,8 +203,7 @@ algorithms.append( trk_hit_col )
 sourcelinker = TrackerSourceLinker("sourcelinker",
         inputHitCollection=trk_hit_col.trackingHits,
         outputSourceLinks="TrackSourceLinks",
-        outputMeasurements="TrackMeasurements",
-        OutputLevel=VERBOSE)
+        outputMeasurements="TrackMeasurements")
 algorithms.append( sourcelinker )
 
 ## Track param init
@@ -178,13 +224,11 @@ parts_from_fit = ParticlesFromTrackFit("parts_from_fit",
         inputTrajectories="trajectories",
         outputParticles="ReconstructedParticles",
         outputTrackParameters="outputTrackParameters")
-        #OutputLevel=DEBUG)
 algorithms.append( parts_from_fit )
 
 #trajs_from_fit = TrajectoryFromTrackFit("trajs_from_fit",
 #inputTrajectories = trk_find_alg.outputTrajectories,
 #outputTrajectoryParameters = "outputTrajectoryParameters")
-        #OutputLevel=DEBUG)
 #algorithms.append(trajs_from_fit)
 
 out = PodioOutput("out", filename=output_rec_file)