diff --git a/benchmarks/full/options/full_reconstruction.py b/benchmarks/full/options/full_reconstruction.py
index 3ee99112b196a0d710fe5cad5215ac0527f1b4a0..ecaa564ffad9afd7a57406d7e43f4f07ae29f746 100644
--- a/benchmarks/full/options/full_reconstruction.py
+++ b/benchmarks/full/options/full_reconstruction.py
@@ -52,15 +52,12 @@ from Configurables import Jug__Base__InputCopier_dd4pod__CalorimeterHitCollectio
 from Configurables import Jug__Base__InputCopier_dd4pod__TrackerHitCollection_dd4pod__TrackerHitCollection_ as TrkCopier
 from Configurables import Jug__Base__InputCopier_dd4pod__PhotoMultiplierHitCollection_dd4pod__PhotoMultiplierHitCollection_ as PMTCopier
 
-from Configurables import Jug__Base__MC2DummyParticle as MC2DummyParticle
-
 from Configurables import Jug__Digi__PhotoMultiplierDigi as PhotoMultiplierDigi
 from Configurables import Jug__Digi__CalorimeterHitDigi as CalHitDigi
-from Configurables import Jug__Digi__ExampleCaloDigi as ExampleCaloDigi
 from Configurables import Jug__Digi__UFSDTrackerDigi as TrackerDigi
-from Configurables import Jug__Digi__EMCalorimeterDigi as EMCalorimeterDigi
 
 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__TrackerSourcesLinker as TrackerSourcesLinker
 #from Configurables import Jug__Reco__TrackingHitsSourceLinker as TrackingHitsSourceLinker
@@ -85,8 +82,6 @@ from Configurables import Jug__Reco__PhotoRingClusters as PhotoRingClusters
 
 from Configurables import Jug__Reco__EMCalReconstruction as EMCalReconstruction
 
-from Configurables import Jug__Reco__SimpleClustering as SimpleClustering
-
 # branches needed from simulation root file
 sim_coll = [
     "mcparticles",
@@ -102,46 +97,32 @@ sim_coll = [
     "GEMTrackerEndcapHits",
     "VertexBarrelHits",
     "VertexEndcapHits",
-    "DRICHHits"
+    "DRICHHits",
+    "MRICHHits"
 ]
 
-# input and output
+# list of algorithms
+algorithms = []
+
+# input
 podin = PodioInput("PodioReader", collections=sim_coll)
-podout = PodioOutput("out", filename=output_rec)
+algorithms.append(podin)
 
 ## copiers to get around input --> output copy bug. Note the "2" appended to the output collection.
 copier = MCCopier("MCCopier",
         inputCollection="mcparticles",
         outputCollection="mcparticles2")
+algorithms.append(copier)
+
 trkcopier = TrkCopier("TrkCopier",
         inputCollection="TrackerBarrelHits",
         outputCollection="TrackerBarrelHits2")
+algorithms.append(trkcopier)
+
 pmtcopier = PMTCopier("PMTCopier",
         inputCollection="DRICHHits",
         outputCollection="DRICHHits2")
-
-# Dummy reconstruction
-dummy = MC2DummyParticle("MC2Dummy",
-        inputCollection="mcparticles",
-        outputCollection="ReconstructedParticles",
-        smearing = 0.01)
-
-# Simple clusters
-ecal_digi = EMCalorimeterDigi("ecal_digi",
-        inputHitCollection="EcalBarrelHits",
-        outputHitCollection="EcalBarrelHitsSimpleDigi")
-
-ecal_reco = EMCalReconstruction("ecal_reco",
-        inputHitCollection=ecal_digi.outputHitCollection,
-        outputHitCollection="EcalBarrelHitsSimpleReco",
-        minModuleEdep=0.0*units.MeV)
-
-simple_cluster = SimpleClustering("simple_cluster",
-        inputHitCollection=ecal_reco.outputHitCollection,
-        outputClusterCollection="SimpleClusters",
-        outputProtoClusterCollection="SimpleProtoClusters",
-        minModuleEdep=1.0*units.MeV,
-        maxDistance=50.0*units.cm)
+algorithms.append(pmtcopier)
 
 # Crystal Endcap Ecal
 ce_ecal_daq = dict(
@@ -155,6 +136,7 @@ ce_ecal_digi = CalHitDigi("ce_ecal_digi",
         outputHitCollection="EcalEndcapNRawHits",
         energyResolutions=[0., 0.02, 0.],
         **ce_ecal_daq)
+algorithms.append(ce_ecal_digi)
 
 ce_ecal_reco = CalHitReco("ce_ecal_reco",
         inputHitCollection=ce_ecal_digi.outputHitCollection,
@@ -163,6 +145,7 @@ ce_ecal_reco = CalHitReco("ce_ecal_reco",
         readoutClass="EcalEndcapNHits",
         sectorField="sector",
         **ce_ecal_daq)
+algorithms.append(ce_ecal_reco)
 
 ce_ecal_cl = IslandCluster("ce_ecal_cl",
         inputHitCollection=ce_ecal_reco.outputHitCollection,
@@ -172,6 +155,7 @@ ce_ecal_cl = IslandCluster("ce_ecal_cl",
         minClusterCenterEdep=30*units.MeV,
         sectorDist=5.0*units.cm,
         dimScaledLocalDistXY=[1.8, 1.8]) # dimension scaled dist is good for hybrid sectors with different module size
+algorithms.append(ce_ecal_cl)
 
 ce_ecal_clreco = RecoCoG("ce_ecal_clreco",
         inputHitCollection=ce_ecal_cl.inputHitCollection,
@@ -179,6 +163,7 @@ ce_ecal_clreco = RecoCoG("ce_ecal_clreco",
         outputClusterCollection="EcalEndcapNClusters",
         samplingFraction=0.998,      # this accounts for a small fraction of leakage
         logWeightBase=4.6)
+algorithms.append(ce_ecal_clreco)
 
 # Endcap Sampling Ecal
 ci_ecal_daq = dict(
@@ -191,12 +176,14 @@ ci_ecal_digi = CalHitDigi("ci_ecal_digi",
         inputHitCollection="EcalEndcapPHits",
         outputHitCollection="EcalEndcapPRawHits",
         **ci_ecal_daq)
+algorithms.append(ci_ecal_digi)
 
 ci_ecal_reco = CalHitReco("ci_ecal_reco",
         inputHitCollection=ci_ecal_digi.outputHitCollection,
         outputHitCollection="EcalEndcapPRecHits",
         thresholdFactor=5.0,
         **ci_ecal_daq)
+algorithms.append(ci_ecal_reco)
 
 # merge hits in different layer (projection to local x-y plane)
 ci_ecal_merger = CalHitsMerger("ci_ecal_merger",
@@ -205,6 +192,7 @@ ci_ecal_merger = CalHitsMerger("ci_ecal_merger",
         fields=["layer", "slice"],
         fieldRefNumbers=[1, 0],
         readoutClass="EcalEndcapPHits")
+algorithms.append(ci_ecal_merger)
 
 ci_ecal_cl = IslandCluster("ci_ecal_cl",
         inputHitCollection=ci_ecal_merger.outputHitCollection,
@@ -212,6 +200,7 @@ ci_ecal_cl = IslandCluster("ci_ecal_cl",
         splitCluster=False,
         minClusterCenterEdep=10.*units.MeV,
         localDistXY=[10*units.mm, 10*units.mm])
+algorithms.append(ci_ecal_cl)
 
 ci_ecal_clreco = RecoCoG("ci_ecal_clreco",
         inputHitCollection=ci_ecal_cl.inputHitCollection,
@@ -220,6 +209,7 @@ ci_ecal_clreco = RecoCoG("ci_ecal_clreco",
         outputInfoCollection="EcalEndcapPClustersInfo",
         logWeightBase=6.2,
         samplingFraction=ci_ecal_sf)
+algorithms.append(ci_ecal_clreco)
 
 # Central Barrel Ecal (Imaging Cal.)
 img_barrel_daq = dict(
@@ -233,6 +223,7 @@ img_barrel_digi = CalHitDigi("img_barrel_digi",
         outputHitCollection="EcalBarrelImagingRawHits",
         energyResolutions=[0., 0.02, 0.],   # 2% flat resolution
         **img_barrel_daq)
+algorithms.append(img_barrel_digi)
 
 img_barrel_reco = ImCalPixelReco("img_barrel_reco",
         inputHitCollection=img_barrel_digi.outputHitCollection,
@@ -242,6 +233,7 @@ img_barrel_reco = ImCalPixelReco("img_barrel_reco",
         layerField="layer",             # field to get layer id
         sectorField="module",           # field to get sector id
         **img_barrel_daq)
+algorithms.append(img_barrel_reco)
 
 img_barrel_cl = ImagingCluster("img_barrel_cl",
         inputHitCollection=img_barrel_reco.outputHitCollection,
@@ -250,6 +242,7 @@ img_barrel_cl = ImagingCluster("img_barrel_cl",
         layerDistEtaPhi=[10*units.mrad, 10*units.mrad],     # adjacent layer
         neighbourLayersRange=2,                 # id diff for adjacent layer
         sectorDist=3.*units.cm)                       # different sector
+algorithms.append(img_barrel_cl)
 
 img_barrel_clreco = ImagingClusterReco("img_barrel_clreco",
         samplingFraction=img_barrel_sf,
@@ -258,6 +251,7 @@ img_barrel_clreco = ImagingClusterReco("img_barrel_clreco",
         outputClusterCollection="EcalBarrelImagingClusters",
         outputInfoCollection="EcalBarrelImagingClustersInfo",
         outputLayerCollection="EcalBarrelImagingLayers")
+algorithms.append(img_barrel_clreco)
 
 # Central ECAL SciFi
 scfi_barrel_daq = dict(
@@ -270,6 +264,7 @@ scfi_barrel_digi = CalHitDigi("scfi_barrel_digi",
         inputHitCollection="EcalBarrelScFiHits",
         outputHitCollection="EcalBarrelScFiRawHits",
         **scfi_barrel_daq)
+algorithms.append(scfi_barrel_digi)
 
 scfi_barrel_reco = CalHitReco("scfi_barrel_reco",
         inputHitCollection=scfi_barrel_digi.outputHitCollection,
@@ -280,6 +275,7 @@ scfi_barrel_reco = CalHitReco("scfi_barrel_reco",
         sectorField="module",
         localDetFields=["system", "module"], # use local coordinates in each module (stave)
         **scfi_barrel_daq)
+algorithms.append(scfi_barrel_reco)
 
 # merge hits in different layer (projection to local x-y plane)
 scfi_barrel_merger = CalHitsMerger("scfi_barrel_merger",
@@ -288,6 +284,7 @@ scfi_barrel_merger = CalHitsMerger("scfi_barrel_merger",
          fields=["fiber"],
          fieldRefNumbers=[1],
          readoutClass="EcalBarrelScFiHits")
+algorithms.append(scfi_barrel_merger)
 
 scfi_barrel_cl = IslandCluster("scfi_barrel_cl",
          inputHitCollection=scfi_barrel_merger.outputHitCollection,
@@ -295,6 +292,7 @@ scfi_barrel_cl = IslandCluster("scfi_barrel_cl",
          splitCluster=False,
          minClusterCenterEdep=10.*MeV,
          localDistXZ=[30*mm, 30*mm])
+algorithms.append(scfi_barrel_cl)
 
 scfi_barrel_clreco = RecoCoG("scfi_barrel_clreco",
          inputHitCollection=scfi_barrel_cl.inputHitCollection,
@@ -303,6 +301,7 @@ scfi_barrel_clreco = RecoCoG("scfi_barrel_clreco",
          outputInfoCollection="EcalBarrelScFiClustersInfo",
          logWeightBase=6.2,
          samplingFraction= scifi_barrel_sf)
+algorithms.append(scfi_barrel_clreco)
 
 # Central Barrel Hcal
 cb_hcal_daq = dict(
@@ -315,6 +314,7 @@ cb_hcal_digi = CalHitDigi("cb_hcal_digi",
          inputHitCollection="HcalBarrelHits",
          outputHitCollection="HcalBarrelRawHits",
          **cb_hcal_daq)
+algorithms.append(cb_hcal_digi)
 
 cb_hcal_reco = CalHitReco("cb_hcal_reco",
         inputHitCollection=cb_hcal_digi.outputHitCollection,
@@ -324,6 +324,7 @@ cb_hcal_reco = CalHitReco("cb_hcal_reco",
         layerField="layer",
         sectorField="module",
         **cb_hcal_daq)
+algorithms.append(cb_hcal_reco)
 
 cb_hcal_merger = CalHitsMerger("cb_hcal_merger",
         inputHitCollection=cb_hcal_reco.outputHitCollection,
@@ -331,6 +332,7 @@ cb_hcal_merger = CalHitsMerger("cb_hcal_merger",
         readoutClass="HcalBarrelHits",
         fields=["layer", "slice"],
         fieldRefNumbers=[1, 0])
+algorithms.append(cb_hcal_merger)
 
 cb_hcal_cl = IslandCluster("cb_hcal_cl",
         inputHitCollection=cb_hcal_merger.outputHitCollection,
@@ -338,6 +340,7 @@ cb_hcal_cl = IslandCluster("cb_hcal_cl",
         splitCluster=False,
         minClusterCenterEdep=30.*units.MeV,
         localDistXY=[15.*units.cm, 15.*units.cm])
+algorithms.append(cb_hcal_cl)
 
 cb_hcal_clreco = RecoCoG("cb_hcal_clreco",
         inputHitCollection=cb_hcal_cl.inputHitCollection,
@@ -346,7 +349,7 @@ cb_hcal_clreco = RecoCoG("cb_hcal_clreco",
         outputInfoCollection="HcalBarrelClustersInfo",
         logWeightBase=6.2,
         samplingFraction=cb_hcal_sf)
-
+algorithms.append(cb_hcal_clreco)
 
 # Hcal Hadron Endcap
 ci_hcal_daq = dict(
@@ -354,16 +357,19 @@ ci_hcal_daq = dict(
          capacityADC=32768,
          pedestalMean=400,
          pedestalSigma=10)
+
 ci_hcal_digi = CalHitDigi("ci_hcal_digi",
          inputHitCollection="HcalEndcapPHits",
          outputHitCollection="HcalEndcapPRawHits",
          **ci_hcal_daq)
+algorithms.append(ci_hcal_digi)
 
 ci_hcal_reco = CalHitReco("ci_hcal_reco",
         inputHitCollection=ci_hcal_digi.outputHitCollection,
         outputHitCollection="HcalEndcapPRecHits",
         thresholdFactor=5.0,
         **ci_hcal_daq)
+algorithms.append(ci_hcal_reco)
 
 ci_hcal_merger = CalHitsMerger("ci_hcal_merger",
         inputHitCollection=ci_hcal_reco.outputHitCollection,
@@ -371,6 +377,7 @@ ci_hcal_merger = CalHitsMerger("ci_hcal_merger",
         readoutClass="HcalEndcapPHits",
         fields=["layer", "slice"],
         fieldRefNumbers=[1, 0])
+algorithms.append(ci_hcal_merger)
 
 ci_hcal_cl = IslandCluster("ci_hcal_cl",
         inputHitCollection=ci_hcal_merger.outputHitCollection,
@@ -378,6 +385,7 @@ ci_hcal_cl = IslandCluster("ci_hcal_cl",
         splitCluster=False,
         minClusterCenterEdep=30.*units.MeV,
         localDistXY=[15.*units.cm, 15.*units.cm])
+algorithms.append(ci_hcal_cl)
 
 ci_hcal_clreco = RecoCoG("ci_hcal_clreco",
         inputHitCollection=ci_hcal_cl.inputHitCollection,
@@ -386,6 +394,7 @@ ci_hcal_clreco = RecoCoG("ci_hcal_clreco",
         outputInfoCollection="HcalEndcapPClustersInfo",
         logWeightBase=6.2,
         samplingFraction=ci_hcal_sf)
+algorithms.append(ci_hcal_clreco)
 
 # Hcal Electron Endcap
 ce_hcal_daq = dict(
@@ -398,12 +407,14 @@ ce_hcal_digi = CalHitDigi("ce_hcal_digi",
         inputHitCollection="HcalEndcapNHits",
         outputHitCollection="HcalEndcapNRawHits",
         **ce_hcal_daq)
+algorithms.append(ce_hcal_digi)
 
 ce_hcal_reco = CalHitReco("ce_hcal_reco",
         inputHitCollection=ce_hcal_digi.outputHitCollection,
         outputHitCollection="HcalEndcapNRecHits",
         thresholdFactor=5.0,
         **ce_hcal_daq)
+algorithms.append(ce_hcal_reco)
 
 ce_hcal_merger = CalHitsMerger("ce_hcal_merger",
         inputHitCollection=ce_hcal_reco.outputHitCollection,
@@ -411,6 +422,7 @@ ce_hcal_merger = CalHitsMerger("ce_hcal_merger",
         readoutClass="HcalEndcapNHits",
         fields=["layer", "slice"],
         fieldRefNumbers=[1, 0])
+algorithms.append(ce_hcal_merger)
 
 ce_hcal_cl = IslandCluster("ce_hcal_cl",
         inputHitCollection=ce_hcal_merger.outputHitCollection,
@@ -418,6 +430,7 @@ ce_hcal_cl = IslandCluster("ce_hcal_cl",
         splitCluster=False,
         minClusterCenterEdep=30.*units.MeV,
         localDistXY=[15.*units.cm, 15.*units.cm])
+algorithms.append(ce_hcal_cl)
 
 ce_hcal_clreco = RecoCoG("ce_hcal_clreco",
         inputHitCollection=ce_hcal_cl.inputHitCollection,
@@ -426,163 +439,154 @@ ce_hcal_clreco = RecoCoG("ce_hcal_clreco",
         outputInfoCollection="HcalEndcapNClustersInfo",
         logWeightBase=6.2,
         samplingFraction=ce_hcal_sf)
-
+algorithms.append(ce_hcal_clreco)
 
 # Tracking
 trk_b_digi = TrackerDigi("trk_b_digi",
         inputHitCollection="TrackerBarrelHits",
         outputHitCollection="TrackerBarrelRawHits",
         timeResolution=8)
+algorithms.append(trk_b_digi)
+
 trk_ec_digi = TrackerDigi("trk_ec_digi",
         inputHitCollection="TrackerEndcapHits",
         outputHitCollection="TrackerEndcapRawHits",
         timeResolution=8)
+algorithms.append(trk_ec_digi)
 
 vtx_b_digi = TrackerDigi("vtx_b_digi",
         inputHitCollection="VertexBarrelHits",
-        outputHitCollection="VertexBarrelRawHits",
+        outputHitCollection="VertetimeResolution=10xBarrelRawHits",
         timeResolution=8)
+algorithms.append(vtx_b_digi)
 
 vtx_ec_digi = TrackerDigi("vtx_ec_digi",
         inputHitCollection="VertexEndcapHits",
         outputHitCollection="VertexEndcapRawHits",
         timeResolution=8)
+algorithms.append(vtx_ec_digi)
 
 gem_ec_digi = TrackerDigi("gem_ec_digi",
         inputHitCollection="GEMTrackerEndcapHits",
         outputHitCollection="GEMTrackerEndcapRawHits",
         timeResolution=10)
+algorithms.append(gem_ec_digi)
 
 # Tracker and vertex reconstruction
 trk_b_reco = TrackerHitReconstruction("trk_b_reco",
         inputHitCollection = trk_b_digi.outputHitCollection,
         outputHitCollection="TrackerBarrelRecHits")
+algorithms.append(trk_b_reco)
 
 trk_ec_reco = TrackerHitReconstruction("trk_ec_reco",
         inputHitCollection = trk_ec_digi.outputHitCollection,
         outputHitCollection="TrackerEndcapRecHits")
+algorithms.append(trk_ec_reco)
 
 vtx_b_reco = TrackerHitReconstruction("vtx_b_reco",
         inputHitCollection = vtx_b_digi.outputHitCollection,
         outputHitCollection="VertexBarrelRecHits")
+algorithms.append(vtx_b_reco)
 
 vtx_ec_reco = TrackerHitReconstruction("vtx_ec_reco",
         inputHitCollection = vtx_ec_digi.outputHitCollection,
         outputHitCollection="VertexEndcapRecHits")
+algorithms.append(vtx_ec_reco)
 
-gem_ec_reco = TrackerHitReconstruction("gem_ec_digi",
+gem_ec_reco = TrackerHitReconstruction("gem_ec_reco",
         inputHitCollection=gem_ec_digi.outputHitCollection,
-        outputHitCollection="GEMTrackerEndcapRecHits",
-        timeResolution=10)
+        outputHitCollection="GEMTrackerEndcapRecHits")
+algorithms.append(gem_ec_reco)
+
+# Tracking hit collector
+trk_hit_col = TrackingHitsCollector("trk_hit_col",
+        inputTrackingHits=[
+            str(trk_b_reco.outputHitCollection),
+            str(trk_ec_reco.outputHitCollection),
+            str(vtx_b_reco.outputHitCollection),
+            str(vtx_ec_reco.outputHitCollection),
+            str(gem_ec_reco.outputHitCollection) ],
+        trackingHits="trackingHits")
+algorithms.append(trk_hit_col)
 
 # Hit Source linker
-sourcelinker = TrackerSourcesLinker("trk_srcslnkr",
-        inputHitCollections = ["VertexBarrelRecHits", "TrackerBarrelRecHits"],
-        outputSourceLinks = "TrackerSourceLinks",
-        outputMeasurements = "TrackerMeasurements")
-
-#trk_hits_srclnkr = TrackerSourcesLinker("trk_srcslnkr",
-#        ITrackerBarrelHits = vtx_b_reco.outputHitCollection,
-#        ITrackerEndcapHits = vtx_ec_reco.outputHitCollection,
-#        OTrackerBarrelHits = trk_b_reco.outputHitCollection,
-#        OTrackerEndcapHits = trk_ec_reco.outputHitCollection,
-#        outputSourceLinks="TrackerMeasurements")
+sourcelinker = TrackerSourceLinker("trk_srcslnkr",
+        inputHitCollection = trk_hit_col.trackingHits,
+        outputSourceLinks = "TrackSourceLinks",
+        outputMeasurements = "TrackMeasurements")
+algorithms.append(sourcelinker)
 
 ## Track param init
 truth_trk_init = TrackParamTruthInit("truth_trk_init",
         inputMCParticles="mcparticles",
-        outputInitialTrackParameters="InitTrackParamsFromTruth")
-
-#clust_trk_init = TrackParamClusterInit("clust_trk_init",
-#        inputClusters="SimpleClusters",
-#        outputInitialTrackParameters="InitTrackParamsFromClusters")
-
-#vtxcluster_trk_init = TrackParamVertexClusterInit("vtxcluster_trk_init",
-#        inputVertexHits="VertexBarrelRecHits",
-#        inputClusters="EcalBarrelImagingClusters",
-#        outputInitialTrackParameters="InitTrackParamsFromVtxClusters",
-#        maxHitRadius=40.0*units.mm)
+        outputInitialTrackParameters="InitTrackParams")
+algorithms.append(truth_trk_init)
 
 # Tracking algorithms
 trk_find_alg = TrackFindingAlgorithm("trk_find_alg",
         inputSourceLinks = sourcelinker.outputSourceLinks,
         inputMeasurements = sourcelinker.outputMeasurements,
-        inputInitialTrackParameters = "InitTrackParamsFromTruth",
+        inputInitialTrackParameters = "InitTrackParams",
         outputTrajectories = "trajectories")
+algorithms.append(trk_find_alg)
 
 parts_from_fit = ParticlesFromTrackFit("parts_from_fit",
         inputTrajectories = "trajectories",
-        outputParticles = "ReconstructedParticlesInitFromTruth",
+        outputParticles = "ReconstructedParticles",
         outputTrackParameters = "outputTrackParameters")
+algorithms.append(parts_from_fit)
 
-#trk_find_alg1 = TrackFindingAlgorithm("trk_find_alg1",
-#        inputSourceLinks = sourcelinker.outputSourceLinks,
-#        inputMeasurements = sourcelinker.outputMeasurements,
-#        inputInitialTrackParameters= "InitTrackParamsFromClusters",
-#        outputTrajectories="trajectories1")
-
-#parts_from_fit1 = ParticlesFromTrackFit("parts_from_fit1",
-#        inputTrajectories="trajectories1",
-#        outputParticles="ReconstructedParticlesInitFromClusters",
-#        outputTrackParameters="outputTrackParameters1")
-
-#trk_find_alg2 = TrackFindingAlgorithm("trk_find_alg2",
-#        inputSourceLinks = trk_hits_srclnkr.outputSourceLinks,
-#        inputMeasurements = trk_hits_srclnkr.outputMeasurements,
-#        inputInitialTrackParameters= "InitTrackParamsFromVtxClusters",
-#        outputTrajectories="trajectories2")
-#parts_from_fit2 = ParticlesFromTrackFit("parts_from_fit2",
-#        inputTrajectories="trajectories2",
-#        outputParticles="ReconstructedParticles2",
-#        outputTrackParameters="outputTrackParameters2")
-
-
-pmtdigi = PhotoMultiplierDigi("pmtdigi",
+# DRICH
+drich_digi = PhotoMultiplierDigi("drich_digi",
         inputHitCollection="DRICHHits",
         outputHitCollection="DRICHRawHits",
         quantumEfficiency=[(a*units.eV, b) for a, b in qe_data])
+algorithms.append(drich_digi)
 
-pmtreco = PhotoMultiplierReco("pmtreco",
-        inputHitCollection=pmtdigi.outputHitCollection,
+drich_reco = PhotoMultiplierReco("drich_reco",
+        inputHitCollection=drich_digi.outputHitCollection,
         outputHitCollection="DRICHRecHits")
+algorithms.append(drich_reco)
+
+# FIXME
+#drich_cluster = PhotoRingClusters("drich_cluster",
+#        inputHitCollection=pmtreco.outputHitCollection,
+#        #inputTrackCollection="ReconstructedParticles",
+#        outputClusterCollection="ForwardRICHClusters")
+
+# MRICH
+mrich_digi = PhotoMultiplierDigi("mrich_digi",
+        inputHitCollection="MRICHHits",
+        outputHitCollection="MRICHRawHits",
+        quantumEfficiency=[(a*units.eV, b) for a, b in qe_data])
+algorithms.append(mrich_digi)
+
+mrich_reco = PhotoMultiplierReco("mrich_reco",
+        inputHitCollection=mrich_digi.outputHitCollection,
+        outputHitCollection="MRICHRecHits")
+algorithms.append(mrich_reco)
 
 # FIXME
-#richcluster = PhotoRingClusters("richcluster",
+#mrich_cluster = PhotoRingClusters("drich_cluster",
 #        inputHitCollection=pmtreco.outputHitCollection,
 #        #inputTrackCollection="ReconstructedParticles",
 #        outputClusterCollection="ForwardRICHClusters")
 
 # Output
-podout.outputCommands = ["keep *",
-        "keep *Hits",
+podout = PodioOutput("out", filename=output_rec)
+podout.outputCommands = [
+        "keep *",
+        "drop *Digi",
+        "keep *Reco*",
+        "keep *ClusterHits",
         "keep *Clusters",
         "keep *Layers",
-        "drop mcparticles"
+        "drop InitTrackParams",
         ]
+algorithms.append(podout)
 
 ApplicationMgr(
-    TopAlg = [podin, copier, trkcopier,
-              dummy,
-              ecal_digi, ecal_reco, #simple_cluster,
-              ce_ecal_digi, ce_ecal_reco, ce_ecal_cl, ce_ecal_clreco,
-              ci_ecal_digi, ci_ecal_reco, ci_ecal_merger, ci_ecal_cl, ci_ecal_clreco,
-              img_barrel_digi, img_barrel_reco, img_barrel_cl, img_barrel_clreco,
-              scfi_barrel_digi, scfi_barrel_reco, scfi_barrel_merger, scfi_barrel_cl, scfi_barrel_clreco,
-              cb_hcal_digi, cb_hcal_reco, cb_hcal_merger, cb_hcal_cl, cb_hcal_clreco,
-              ce_hcal_digi, ce_hcal_reco, ce_hcal_merger, ce_hcal_cl, ce_hcal_clreco,
-              ci_hcal_digi, ci_hcal_reco, ci_hcal_merger, ci_hcal_cl, ci_hcal_clreco,
-              trk_b_digi, trk_ec_digi, vtx_b_digi, vtx_ec_digi,
-              trk_b_reco, trk_ec_reco, vtx_b_reco, vtx_ec_reco,
-              sourcelinker, #trk_hits_srclnkr,
-              #clust_trk_init,
-              truth_trk_init,
-              #vtxcluster_trk_init,
-              trk_find_alg, parts_from_fit,
-              #trk_find_alg1, parts_from_fit1,
-              #trk_find_alg2, parts_from_fit2,
-              pmtcopier, pmtdigi, pmtreco, #richcluster,
-              podout
-              ],
+    TopAlg = algorithms,
     EvtSel = 'NONE',
     EvtMax   = n_events,
     ExtSvc = [podioevent,geo_service],