diff --git a/PhysicsAnalysis/NeutrinoSearch/CMakeLists.txt b/PhysicsAnalysis/NeutrinoSearch/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cff2ab8575553261c18eb0736c211528e44f22bb
--- /dev/null
+++ b/PhysicsAnalysis/NeutrinoSearch/CMakeLists.txt
@@ -0,0 +1,12 @@
+atlas_subdir(NeutrinoSearch)
+
+atlas_add_component(
+        NeutrinoSearch
+        src/NeutrinoSearchAlg.h
+        src/NeutrinoSearchAlg.cxx
+        src/component/NeutrinoSearch_entries.cxx
+        LINK_LIBRARIES AthenaBaseComps StoreGateLib xAODFaserWaveform ScintIdentifier FaserCaloIdentifier GeneratorObjects FaserActsGeometryLib TrackerSimEvent TrackerSimData TrackerIdentifier TrackerReadoutGeometry TrkTrack GeoPrimitives TrackerRIO_OnTrack
+)
+
+atlas_install_python_modules(python/*.py)
+# atlas_install_scripts(test/*.py)
diff --git a/PhysicsAnalysis/NeutrinoSearch/python/FilterSearchConfig.py b/PhysicsAnalysis/NeutrinoSearch/python/FilterSearchConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..9b76c14b8b6682b6cfe77ed3331467d4f9737cfe
--- /dev/null
+++ b/PhysicsAnalysis/NeutrinoSearch/python/FilterSearchConfig.py
@@ -0,0 +1,530 @@
+"""
+    Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+"""
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg
+
+def NeutrinoSearchAlgCfg(flags, **kwargs):
+    # Initialize GeoModel
+    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
+    acc = FaserGeometryCfg(flags)
+
+    acc.merge(MagneticFieldSvcCfg(flags))
+    # acc.merge(FaserActsTrackingGeometrySvcCfg(flags))
+    # acc.merge(FaserActsAlignmentCondAlgCfg(flags))
+
+    actsExtrapolationTool = CompFactory.FaserActsExtrapolationTool("FaserActsExtrapolationTool")
+    actsExtrapolationTool.MaxSteps = 1000
+    actsExtrapolationTool.TrackingGeometryTool = CompFactory.FaserActsTrackingGeometryTool("TrackingGeometryTool")
+
+    NeutrinoSearchAlg = CompFactory.NeutrinoSearchAlg("NeutrinoSearchAlg",**kwargs)
+    NeutrinoSearchAlg.ExtrapolationTool = actsExtrapolationTool
+    acc.addEventAlgo(NeutrinoSearchAlg)
+
+    thistSvc = CompFactory.THistSvc()
+    thistSvc.Output += ["HIST2 DATAFILE='FilterSearch.root' OPT='RECREATE'"]
+    acc.addService(thistSvc)
+
+    return acc
+
+if __name__ == "__main__":
+
+    import sys
+    from AthenaCommon.Logging import log, logging
+    from AthenaCommon.Constants import DEBUG, VERBOSE, INFO
+    from AthenaCommon.Configurable import Configurable
+    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+    from AthenaConfiguration.TestDefaults import defaultTestFiles
+    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
+    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+    # from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+
+    # Set up logging and new style config
+    log.setLevel(DEBUG)
+    Configurable.configurableRun3Behavior = True
+
+    # Configure
+    ConfigFlags.Input.Files = [
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007613-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007705-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007720-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007725-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007728-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007729-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007730-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007733-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007734-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007802-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00004-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00014-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00018-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00019-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00020-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00021-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00022-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00023-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00024-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00025-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00026-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00027-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00028-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00029-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00030-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00031-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00032-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00033-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00034-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00035-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00036-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00037-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00038-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00039-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00040-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00041-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00042-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007833-00043-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00014-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00018-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00019-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00020-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00021-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00022-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00023-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00024-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00025-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00026-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00027-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00028-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00029-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00030-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00031-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00032-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00033-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00034-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00035-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00036-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00037-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00038-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00039-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00040-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00041-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00042-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00043-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00044-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00045-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00046-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00047-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00048-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00049-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00050-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00051-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00052-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00053-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00054-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00055-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007835-00061-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007836-00000-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007837-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007838-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007840-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007841-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007842-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007843-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007844-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007845-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007846-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007847-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00000-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00001-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00002-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00004-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00014-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007848-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00014-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00018-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00019-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00020-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00021-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00022-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00023-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00024-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00025-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00026-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00027-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00028-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00029-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007849-00030-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00002-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00004-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00014-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00018-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00019-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00020-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00021-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00022-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00023-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00024-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00025-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00026-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00027-TrigMask08-r0008-xAOD.root',
+        #   '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00028-TrigMask08-r0008-xAOD.root',  # not closed?
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00029-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00030-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00031-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00032-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00033-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00034-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00035-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00036-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00037-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00038-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00039-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00040-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00041-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00042-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00043-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00044-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00045-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00046-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00047-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00048-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00049-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00050-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00051-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00052-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00053-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00054-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007918-00055-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00001-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00002-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00004-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00014-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00018-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00019-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00020-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00021-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00022-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00023-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00024-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00025-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00027-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00028-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00030-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00031-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00033-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00035-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00037-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00038-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00043-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00044-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00045-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00046-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00047-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00048-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00049-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00050-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00051-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00052-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00053-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00054-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00055-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00056-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00057-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00058-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00059-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00060-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00061-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00062-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00063-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00064-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00065-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00066-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00067-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00068-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00069-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00070-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00071-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00072-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00073-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00074-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00075-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00076-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00077-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00078-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00079-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00080-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00081-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00082-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00083-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00084-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00085-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00086-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00087-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00088-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00089-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00090-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00091-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00092-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00093-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00094-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00095-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00096-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00097-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00098-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00099-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00100-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00101-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00102-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00103-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00104-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00105-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00106-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00107-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00108-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00109-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007930-00110-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00014-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00018-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00019-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00020-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00021-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00022-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00023-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00024-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00025-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00026-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00027-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00028-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00029-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00030-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00031-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00032-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00033-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00034-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00035-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00036-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00037-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00038-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00039-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00040-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00041-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00042-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00043-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00044-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00045-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00046-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00047-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007961-00048-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007972-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007973-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007974-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007975-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007976-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007977-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007978-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007979-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007980-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007981-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007982-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007983-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00000-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00001-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00002-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00004-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00005-TrigMask08-r0008-xAOD.root',
+        #   '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00006-TrigMask08-r0008-xAOD.root',  # not closed?
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007984-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00003-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00004-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00005-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00006-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00007-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00008-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00009-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00010-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00011-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00012-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00013-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00015-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00016-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00017-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00018-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00019-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00021-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00022-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00023-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00024-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00025-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00026-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00027-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00028-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00029-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00030-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00031-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00032-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00033-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00034-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00035-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00036-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00037-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00039-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00040-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00041-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00042-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00043-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00044-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00045-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00046-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00047-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00048-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00049-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00050-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00051-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00052-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00053-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00054-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00055-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00056-TrigMask08-r0008-xAOD.root',
+          '/run/media/dcasper/Data/faser/data/Faser-Physics-007985-00057-TrigMask08-r0008-xAOD.root',
+
+
+    ]
+    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-02"             # Always needed; must match FaserVersionS
+    ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"               # Use MC conditions for now
+    ConfigFlags.Input.ProjectName = "data21"                     # Needed to bypass autoconfig
+    ConfigFlags.Input.isMC = False                                # Needed to bypass autoconfig
+    ConfigFlags.GeoModel.FaserVersion     = "FASERNU-03"           # FASER geometry
+    ConfigFlags.Common.isOnline = False
+    ConfigFlags.GeoModel.Align.Dynamic = False
+    ConfigFlags.Beam.NumberOfCollisions = 0.
+
+    ConfigFlags.Detector.GeometryFaserSCT = True
+
+    ConfigFlags.lock()
+
+    # Core components
+    acc = MainServicesCfg(ConfigFlags)
+    acc.merge(PoolReadCfg(ConfigFlags))
+
+    # algorithm
+    acc.merge(NeutrinoSearchAlgCfg(ConfigFlags, UseFlukaWeights=True))
+
+    # # Hack to avoid problem with our use of MC databases when isMC = False
+    replicaSvc = acc.getService("DBReplicaSvc")
+    replicaSvc.COOLSQLiteVetoPattern = ""
+    replicaSvc.UseCOOLSQLite = True
+    replicaSvc.UseCOOLFrontier = False
+    replicaSvc.UseGeomSQLite = True
+
+    # Timing
+    #acc.merge(MergeRecoTimingObjCfg(ConfigFlags))
+
+    # Dump config
+    # logging.getLogger('forcomps').setLevel(VERBOSE)
+    # acc.foreach_component("*").OutputLevel = VERBOSE
+    # acc.foreach_component("*ClassID*").OutputLevel = INFO
+    # acc.getCondAlgo("FaserSCT_AlignCondAlg").OutputLevel = VERBOSE
+    # acc.getCondAlgo("FaserSCT_DetectorElementCondAlg").OutputLevel = VERBOSE
+    # acc.getService("StoreGateSvc").Dump = True
+    # acc.getService("ConditionStore").Dump = True
+    # acc.printConfig(withDetails=True)
+    # ConfigFlags.dump()
+
+    # Execute and finish
+    sc = acc.run(maxEvents=-1)
+
+    # Success should be 0
+    sys.exit(not sc.isSuccess())    
diff --git a/PhysicsAnalysis/NeutrinoSearch/python/FlukaSearchConfig.py b/PhysicsAnalysis/NeutrinoSearch/python/FlukaSearchConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..4e196a3794670d241bf8a26b91d409d260ac193d
--- /dev/null
+++ b/PhysicsAnalysis/NeutrinoSearch/python/FlukaSearchConfig.py
@@ -0,0 +1,140 @@
+"""
+    Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+"""
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg
+
+def NeutrinoSearchAlgCfg(flags, **kwargs):
+    # Initialize GeoModel
+    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
+    acc = FaserGeometryCfg(flags)
+
+    acc.merge(MagneticFieldSvcCfg(flags))
+    # acc.merge(FaserActsTrackingGeometrySvcCfg(flags))
+    # acc.merge(FaserActsAlignmentCondAlgCfg(flags))
+
+    actsExtrapolationTool = CompFactory.FaserActsExtrapolationTool("FaserActsExtrapolationTool")
+    actsExtrapolationTool.MaxSteps = 1000
+    actsExtrapolationTool.TrackingGeometryTool = CompFactory.FaserActsTrackingGeometryTool("TrackingGeometryTool")
+
+    NeutrinoSearchAlg = CompFactory.NeutrinoSearchAlg("NeutrinoSearchAlg",**kwargs)
+    NeutrinoSearchAlg.ExtrapolationTool = actsExtrapolationTool
+    acc.addEventAlgo(NeutrinoSearchAlg)
+
+    thistSvc = CompFactory.THistSvc()
+    thistSvc.Output += ["HIST2 DATAFILE='FlukaSearch.root' OPT='RECREATE'"]
+    acc.addService(thistSvc)
+
+    return acc
+
+if __name__ == "__main__":
+
+    import sys
+    from AthenaCommon.Logging import log, logging
+    from AthenaCommon.Constants import DEBUG, VERBOSE, INFO
+    from AthenaCommon.Configurable import Configurable
+    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+    from AthenaConfiguration.TestDefaults import defaultTestFiles
+    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
+    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+    # from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+
+    # Set up logging and new style config
+    log.setLevel(DEBUG)
+    Configurable.configurableRun3Behavior = True
+
+    # Configure
+    ConfigFlags.Input.Files = [
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00000-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00001-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00002-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00003-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00004-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00005-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00006-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00007-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00008-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00009-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00010-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00011-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00012-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00013-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00014-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00015-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00016-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00017-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00018-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00019-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00020-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00021-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00022-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00023-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00024-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00025-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00026-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210001/rec/r0008/FaserMC-MDC_Fluka_unit30_Nm_71m_m3750_v3-210001-00027-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00000-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00001-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00002-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00003-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00004-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00005-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00006-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00007-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00008-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00009-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00010-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00011-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00012-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00013-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00014-s0005-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/fluka/210002/rec/r0008/FaserMC-MDC_Fluka_unit30_Pm_71m_m3750_v3-210002-00015-s0005-r0008-xAOD.root'
+    ]
+    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-02"             # Always needed; must match FaserVersionS
+    ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"               # Use MC conditions for now
+    ConfigFlags.Input.ProjectName = "data21"                     # Needed to bypass autoconfig
+    ConfigFlags.Input.isMC = True                                # Needed to bypass autoconfig
+    ConfigFlags.GeoModel.FaserVersion     = "FASERNU-03"           # FASER geometry
+    ConfigFlags.Common.isOnline = False
+    ConfigFlags.GeoModel.Align.Dynamic = False
+    ConfigFlags.Beam.NumberOfCollisions = 0.
+
+    ConfigFlags.Detector.GeometryFaserSCT = True
+
+    ConfigFlags.lock()
+
+    # Core components
+    acc = MainServicesCfg(ConfigFlags)
+    acc.merge(PoolReadCfg(ConfigFlags))
+
+    # algorithm
+    acc.merge(NeutrinoSearchAlgCfg(ConfigFlags, UseFlukaWeights=True))
+
+    # # Hack to avoid problem with our use of MC databases when isMC = False
+    # replicaSvc = acc.getService("DBReplicaSvc")
+    # replicaSvc.COOLSQLiteVetoPattern = ""
+    # replicaSvc.UseCOOLSQLite = True
+    # replicaSvc.UseCOOLFrontier = False
+    # replicaSvc.UseGeomSQLite = True
+
+    # Timing
+    #acc.merge(MergeRecoTimingObjCfg(ConfigFlags))
+
+    # Dump config
+    # logging.getLogger('forcomps').setLevel(VERBOSE)
+    # acc.foreach_component("*").OutputLevel = VERBOSE
+    # acc.foreach_component("*ClassID*").OutputLevel = INFO
+    # acc.getCondAlgo("FaserSCT_AlignCondAlg").OutputLevel = VERBOSE
+    # acc.getCondAlgo("FaserSCT_DetectorElementCondAlg").OutputLevel = VERBOSE
+    # acc.getService("StoreGateSvc").Dump = True
+    # acc.getService("ConditionStore").Dump = True
+    # acc.printConfig(withDetails=True)
+    # ConfigFlags.dump()
+
+    # Execute and finish
+    sc = acc.run(maxEvents=-1)
+
+    # Success should be 0
+    sys.exit(not sc.isSuccess())    
diff --git a/PhysicsAnalysis/NeutrinoSearch/python/GenieSearchConfig.py b/PhysicsAnalysis/NeutrinoSearch/python/GenieSearchConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..a80de32bbc0643dbaca1ac12e28688535951b709
--- /dev/null
+++ b/PhysicsAnalysis/NeutrinoSearch/python/GenieSearchConfig.py
@@ -0,0 +1,104 @@
+"""
+    Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+"""
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg
+
+def NeutrinoSearchAlgCfg(flags, **kwargs):
+    # Initialize GeoModel
+    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
+    acc = FaserGeometryCfg(flags)
+
+    acc.merge(MagneticFieldSvcCfg(flags))
+    # acc.merge(FaserActsTrackingGeometrySvcCfg(flags))
+    # acc.merge(FaserActsAlignmentCondAlgCfg(flags))
+
+    actsExtrapolationTool = CompFactory.FaserActsExtrapolationTool("FaserActsExtrapolationTool")
+    actsExtrapolationTool.MaxSteps = 1000
+    actsExtrapolationTool.TrackingGeometryTool = CompFactory.FaserActsTrackingGeometryTool("TrackingGeometryTool")
+
+    NeutrinoSearchAlg = CompFactory.NeutrinoSearchAlg("NeutrinoSearchAlg",**kwargs)
+    NeutrinoSearchAlg.ExtrapolationTool = actsExtrapolationTool
+    acc.addEventAlgo(NeutrinoSearchAlg)
+
+    thistSvc = CompFactory.THistSvc()
+    thistSvc.Output += ["HIST2 DATAFILE='GenieSearch.root' OPT='RECREATE'"]
+    acc.addService(thistSvc)
+
+    return acc
+
+if __name__ == "__main__":
+
+    import sys
+    from AthenaCommon.Logging import log, logging
+    from AthenaCommon.Constants import DEBUG, VERBOSE, INFO
+    from AthenaCommon.Configurable import Configurable
+    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+    from AthenaConfiguration.TestDefaults import defaultTestFiles
+    from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
+    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+    # from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+
+    # Set up logging and new style config
+    log.setLevel(DEBUG)
+    Configurable.configurableRun3Behavior = True
+
+    # Configure
+    ConfigFlags.Input.Files = [
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00000-00007-s0006-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00008-00015-s0006-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00016-00023-s0006-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00024-00031-s0006-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00032-00039-s0006-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00040-00047-s0006-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00048-00055-s0006-r0008-xAOD.root',
+        '/run/media/dcasper/Data/faser/genie/rec/FaserMC-MDC_Genie_all_150invfb_v1-200001-00056-00063-s0006-r0008-xAOD.root'
+    ]
+    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-02"             # Always needed; must match FaserVersionS
+    ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"               # Use MC conditions for now
+    ConfigFlags.Input.ProjectName = "data21"                     # Needed to bypass autoconfig
+    ConfigFlags.Input.isMC = True                                # Needed to bypass autoconfig
+    ConfigFlags.GeoModel.FaserVersion     = "FASERNU-03"           # FASER geometry
+    ConfigFlags.Common.isOnline = False
+    ConfigFlags.GeoModel.Align.Dynamic = False
+    ConfigFlags.Beam.NumberOfCollisions = 0.
+
+    ConfigFlags.Detector.GeometryFaserSCT = True
+
+    ConfigFlags.lock()
+
+    # Core components
+    acc = MainServicesCfg(ConfigFlags)
+    acc.merge(PoolReadCfg(ConfigFlags))
+
+    # algorithm
+    acc.merge(NeutrinoSearchAlgCfg(ConfigFlags, UseGenieWeights=True))
+
+    # # Hack to avoid problem with our use of MC databases when isMC = False
+    # replicaSvc = acc.getService("DBReplicaSvc")
+    # replicaSvc.COOLSQLiteVetoPattern = ""
+    # replicaSvc.UseCOOLSQLite = True
+    # replicaSvc.UseCOOLFrontier = False
+    # replicaSvc.UseGeomSQLite = True
+
+    # Timing
+    #acc.merge(MergeRecoTimingObjCfg(ConfigFlags))
+
+    # Dump config
+    # logging.getLogger('forcomps').setLevel(VERBOSE)
+    # acc.foreach_component("*").OutputLevel = VERBOSE
+    # acc.foreach_component("*ClassID*").OutputLevel = INFO
+    # acc.getCondAlgo("FaserSCT_AlignCondAlg").OutputLevel = VERBOSE
+    # acc.getCondAlgo("FaserSCT_DetectorElementCondAlg").OutputLevel = VERBOSE
+    # acc.getService("StoreGateSvc").Dump = True
+    # acc.getService("ConditionStore").Dump = True
+    # acc.printConfig(withDetails=True)
+    # ConfigFlags.dump()
+
+    # Execute and finish
+    sc = acc.run(maxEvents=-1)
+
+    # Success should be 0
+    sys.exit(not sc.isSuccess())    
diff --git a/PhysicsAnalysis/NeutrinoSearch/src/NeutrinoSearchAlg.cxx b/PhysicsAnalysis/NeutrinoSearch/src/NeutrinoSearchAlg.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..e782dda9e3eb7d97da42edb1b5a79528268dac9f
--- /dev/null
+++ b/PhysicsAnalysis/NeutrinoSearch/src/NeutrinoSearchAlg.cxx
@@ -0,0 +1,637 @@
+#include "NeutrinoSearchAlg.h"
+#include "TrkTrack/Track.h"
+#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h"
+#include "TrackerIdentifier/FaserSCT_ID.h"
+#include "ScintIdentifier/VetoNuID.h"
+#include "ScintIdentifier/VetoID.h"
+#include "ScintIdentifier/TriggerID.h"
+#include "ScintIdentifier/PreshowerID.h"
+#include "FaserCaloIdentifier/EcalID.h"
+#include "TrackerPrepRawData/FaserSCT_Cluster.h"
+#include "Identifier/Identifier.h"
+#include "TrackerReadoutGeometry/SCT_DetectorManager.h"
+#include "TrackerReadoutGeometry/SiDetectorElement.h"
+#include "TrackerPrepRawData/FaserSCT_Cluster.h"
+#include "xAODTruth/TruthParticle.h"
+#include <cmath>
+
+
+
+NeutrinoSearchAlg::NeutrinoSearchAlg(const std::string &name, 
+                                    ISvcLocator *pSvcLocator)
+    : AthReentrantAlgorithm(name, pSvcLocator), 
+      AthHistogramming(name),
+      m_histSvc("THistSvc/THistSvc", name) {}
+
+
+StatusCode NeutrinoSearchAlg::initialize() 
+{
+  ATH_CHECK(m_truthEventContainer.initialize());
+  ATH_CHECK(m_truthParticleContainer.initialize());
+  ATH_CHECK(m_trackCollection.initialize());
+  ATH_CHECK(m_vetoNuContainer.initialize());
+  ATH_CHECK(m_vetoContainer.initialize());
+  ATH_CHECK(m_triggerContainer.initialize());
+  ATH_CHECK(m_preshowerContainer.initialize());
+  ATH_CHECK(m_ecalContainer.initialize());
+  ATH_CHECK(m_clusterContainer.initialize());
+  ATH_CHECK(m_simDataCollection.initialize());
+
+  ATH_CHECK(detStore()->retrieve(m_sctHelper,       "FaserSCT_ID"));
+  ATH_CHECK(detStore()->retrieve(m_vetoNuHelper,    "VetoNuID"));
+  ATH_CHECK(detStore()->retrieve(m_vetoHelper,      "VetoID"));
+  ATH_CHECK(detStore()->retrieve(m_triggerHelper,   "TriggerID"));
+  ATH_CHECK(detStore()->retrieve(m_preshowerHelper, "PreshowerID"));
+  ATH_CHECK(detStore()->retrieve(m_ecalHelper,      "EcalID"));
+
+  ATH_CHECK(detStore()->retrieve(m_detMgr, "SCT"));
+  ATH_CHECK(m_extrapolationTool.retrieve());
+
+  if (m_useFlukaWeights)
+  {
+    m_baseEventCrossSection = (m_flukaCrossSection * kfemtoBarnsPerMilliBarn)/m_flukaCollisions;
+  }
+  else if (m_useGenieWeights)
+  {
+    m_baseEventCrossSection = 1.0/m_genieLuminosity;
+  }
+  else
+  {
+    m_baseEventCrossSection = 1.0;
+  }
+
+  m_tree = new TTree("tree", "tree");
+  m_tree->Branch("run_number", &m_run_number, "run_number/I");
+  m_tree->Branch("event_number", &m_event_number, "event_number/I");
+
+  m_tree->Branch("VetoNuPmt0", &m_vetoNu0, "vetoNu0/D");
+  m_tree->Branch("VetoNuPmt1", &m_vetoNu1, "vetoNu1/D");
+
+  m_tree->Branch("VetoPmt00",  &m_veto00,  "veto00/D");
+  m_tree->Branch("VetoPmt01",  &m_veto01,  "veto01/D");
+  m_tree->Branch("VetoUpstream", &m_vetoUpstream, "vetoUpstream/D");
+  m_tree->Branch("VetoPmt10",  &m_veto10,  "veto10/D");
+  m_tree->Branch("VetoPmt11",  &m_veto11,  "veto11/D");
+  m_tree->Branch("VetoDownstream", &m_vetoDownstream, "vetoDownstream/D");
+
+  m_tree->Branch("TriggerPmt00", &m_trigger00, "trigger00/D");
+  m_tree->Branch("TriggerPmt01", &m_trigger01, "trigger01/D");
+  m_tree->Branch("TriggerPmt10", &m_trigger10, "trigger10/D");
+  m_tree->Branch("TriggerPmt11", &m_trigger11, "trigger11/D");
+  m_tree->Branch("TriggerTotal", &m_triggerTotal, "triggerTotal/D");
+
+  m_tree->Branch("PreshowerPmt0", &m_preshower0, "preshower0/D");
+  m_tree->Branch("PreshowerPmt1", &m_preshower1, "preshower1/D");
+
+  m_tree->Branch("EcalPmt00", &m_ecal00, "ecal00/D");
+  m_tree->Branch("EcalPmt01", &m_ecal01, "ecal01/D");
+  m_tree->Branch("EcalPmt10", &m_ecal10, "ecal10/D");
+  m_tree->Branch("EcalPmt11", &m_ecal11, "ecal11/D");
+  m_tree->Branch("EcalTotal", &m_ecalTotal, "ecalTotal/D");
+  
+  m_tree->Branch("Clust0", &m_station0Clusters, "clust0/I");
+  m_tree->Branch("Clust1", &m_station1Clusters, "clust0/I");
+  m_tree->Branch("Clust2", &m_station2Clusters, "clust0/I");
+  m_tree->Branch("Clust3", &m_station3Clusters, "clust0/I");
+
+  m_tree->Branch("x", &m_x, "x/D");
+  m_tree->Branch("y", &m_y, "y/D");
+  m_tree->Branch("z", &m_z, "z/D");
+  m_tree->Branch("px", &m_px, "px/D");
+  m_tree->Branch("py", &m_py, "py/D");
+  m_tree->Branch("pz", &m_pz, "pz/D");
+  m_tree->Branch("p", &m_p, "p/D");
+  m_tree->Branch("charge", &m_charge, "charge/I");
+  m_tree->Branch("chi2", &m_chi2, "chi2/D");
+  m_tree->Branch("ndof", &m_ndof, "ndof/I");
+  m_tree->Branch("longTracks", &m_longTracks, "longTracks/I");
+  m_tree->Branch("pTruthLepton", &m_truthLeptonMomentum, "pTruthLepton/D");
+  m_tree->Branch("truthBarcode", &m_truthBarcode, "truthBarcode/I");
+  m_tree->Branch("truthPdg", &m_truthPdg, "truthPdg/I");
+  m_tree->Branch("CrossSection", &m_crossSection, "crossSection/D");
+
+  ATH_CHECK(histSvc()->regTree("/HIST2/tree", m_tree));
+
+  if (m_enforceBlinding)
+  {
+    ATH_MSG_INFO("Blinding will be enforced for real data.");
+  }
+  else
+  {
+    ATH_MSG_INFO("Blinding will NOT be enforced for real data.");
+  }
+
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode NeutrinoSearchAlg::execute(const EventContext &ctx) const 
+{
+
+  clearTree();
+
+  m_run_number = ctx.eventID().run_number();
+  m_event_number = ctx.eventID().event_number();
+
+  bool realData = true;
+
+  // Work out effective cross section for MC
+  SG::ReadHandle<xAOD::TruthEventContainer> truthEventContainer { m_truthEventContainer, ctx };
+  if (truthEventContainer.isValid() && truthEventContainer->size() > 0)
+  {
+    realData = false;
+    if (m_useFlukaWeights)
+    {
+        double flukaWeight = truthEventContainer->at(0)->weights()[0];
+        ATH_MSG_ALWAYS("Found fluka weight = " << flukaWeight);
+        m_crossSection = m_baseEventCrossSection * flukaWeight;
+    }
+    else if (m_useGenieWeights)
+    {
+        m_crossSection = m_baseEventCrossSection;
+    }
+    else
+    {
+        ATH_MSG_WARNING("Monte carlo event with no weighting scheme specified.  Setting crossSection (weight) to " << m_baseEventCrossSection << " fb.");
+        m_crossSection = m_baseEventCrossSection;
+    }
+  }
+
+  // Find the primary lepton (if any)
+  SG::ReadHandle<xAOD::TruthParticleContainer> truthParticleContainer { m_truthParticleContainer, ctx };
+  if (truthParticleContainer.isValid() && truthParticleContainer->size() > 0)
+  {
+    for (auto particle : *truthParticleContainer)
+    {
+        if ( particle->absPdgId() == 11 || particle->absPdgId() == 13 || particle->absPdgId() == 15 )
+        {
+            if (particle->status() == 1 && (particle->nParents() == 0 || particle->nParents() == 2) )
+                m_truthLeptonMomentum = particle->p4().P();
+
+            break;
+        }
+    }
+  }
+
+  SG::ReadHandle<xAOD::WaveformHitContainer> vetoNuContainer { m_vetoNuContainer, ctx };
+  ATH_CHECK(vetoNuContainer.isValid());
+
+  // If real data, check for blinding before we do anything else
+
+  bool blinded = realData;
+  for (auto hit : *vetoNuContainer)
+  {
+    if (!waveformHitOK(hit)) continue;
+    blinded = false;
+    auto id = hit->identify();
+    if (m_vetoNuHelper->plate(id) == 0)
+    {
+        m_vetoNu0 += hit->integral();
+    }
+    else if (m_vetoNuHelper->plate(id) == 1)
+    {
+        m_vetoNu1 += hit->integral();
+    }
+    else
+    {
+        ATH_MSG_FATAL("Invalid VetoNu plate number: " << m_vetoNuHelper->plate(id));
+        return StatusCode::FAILURE;
+    }
+  }
+
+  if (m_enforceBlinding && blinded) return StatusCode::SUCCESS;
+
+  SG::ReadHandle<xAOD::WaveformHitContainer> vetoContainer { m_vetoContainer, ctx };
+  ATH_CHECK(vetoContainer.isValid());
+
+  SG::ReadHandle<xAOD::WaveformHitContainer> triggerContainer { m_triggerContainer, ctx };
+  ATH_CHECK(triggerContainer.isValid());
+
+  SG::ReadHandle<xAOD::WaveformHitContainer> preshowerContainer { m_preshowerContainer, ctx };
+  ATH_CHECK(preshowerContainer.isValid());
+
+  SG::ReadHandle<xAOD::WaveformHitContainer> ecalContainer { m_ecalContainer, ctx };
+  ATH_CHECK(ecalContainer.isValid());
+
+  for (auto hit : *vetoContainer)
+  {
+    if (!waveformHitOK(hit)) continue;
+    auto id = hit->identify();
+    auto station = m_vetoHelper->station(id);
+    auto plate   = m_vetoHelper->plate(id);
+    if (station == 0)
+    {
+        if (plate == 0)
+        {
+            m_veto00 += hit->integral();
+            m_vetoUpstream += hit->integral();
+        }
+        else if (plate == 1)
+        {
+            m_veto01 += hit->integral();
+            m_vetoUpstream += hit->integral();
+        }
+        else
+        {
+            ATH_MSG_FATAL("Invalid Veto plate number: " << plate);
+        }
+    }
+    else if (station == 1)
+    {
+        if (plate == 0)
+        {
+            m_veto10 += hit->integral();
+            m_vetoDownstream += hit->integral();
+        }
+        else if (plate == 1)
+        {
+            m_veto11 += hit->integral();
+            m_vetoDownstream += hit->integral();
+        }
+        else
+        {
+            ATH_MSG_FATAL("Invalid Veto plate number: " << plate);
+        }
+    }
+    else
+    {
+        ATH_MSG_FATAL("Invalid Veto station number: " << station);
+        return StatusCode::FAILURE;
+    }
+  }
+
+  for (auto hit : *triggerContainer)
+  {
+    if (!waveformHitOK(hit)) continue;
+    auto id = hit->identify();
+    auto plate = m_triggerHelper->plate(id);
+    auto pmt   = m_triggerHelper->pmt(id);
+    if (plate == 0)
+    {
+        if (pmt == 0)
+        {
+            m_trigger00 += hit->integral();
+            m_triggerTotal += hit->integral();
+        }
+        else if (pmt == 1)
+        {
+            m_trigger01 += hit->integral();
+            m_triggerTotal += hit->integral();
+        }
+        else
+        {
+            ATH_MSG_FATAL("Invalid Trigger pmt number: " << pmt);
+        }
+    }
+    else if (plate == 1)
+    {
+        if (pmt == 0)
+        {
+            m_trigger10 += hit->integral();
+            m_triggerTotal += hit->integral();
+        }
+        else if (pmt == 1)
+        {
+            m_trigger11 += hit->integral();
+            m_triggerTotal += hit->integral();
+        }
+        else
+        {
+            ATH_MSG_FATAL("Invalid Trigger pmt number: " << pmt);
+        }
+    }
+    else
+    {
+        ATH_MSG_FATAL("Invalid Trigger plate number: " << plate);
+        return StatusCode::FAILURE;
+    }
+  }
+
+  for (auto hit : *preshowerContainer)
+  {
+    if (!waveformHitOK(hit)) continue;
+    auto id = hit->identify();
+    if (m_preshowerHelper->plate(id) == 0)
+    {
+        m_preshower0 += hit->integral();
+    }
+    else if (m_preshowerHelper->plate(id) == 1)
+    {
+        m_preshower1 += hit->integral();
+    }
+    else
+    {
+        ATH_MSG_FATAL("Invalid Preshower plate number: " << m_preshowerHelper->plate(id));
+        return StatusCode::FAILURE;
+    }
+  }
+
+  for (auto hit : *ecalContainer)
+  {
+    if (!waveformHitOK(hit)) continue;
+    auto id = hit->identify();
+    auto row = m_ecalHelper->row(id);
+    auto mod = m_ecalHelper->module(id);
+    if (row == 0)
+    {
+        if (mod == 0)
+        {
+            m_ecal00 += hit->integral();
+            m_ecalTotal += hit->integral();
+        }
+        else if (mod == 1)
+        {
+            m_ecal01 += hit->integral();
+            m_ecalTotal += hit->integral();
+        }
+        else
+        {
+            ATH_MSG_FATAL("Invalid Ecal module number: " << mod);
+        }
+    }
+    else if (row == 1)
+    {
+        if (mod == 0)
+        {
+            m_ecal10 += hit->integral();
+            m_ecalTotal += hit->integral();
+        }
+        else if (mod == 1)
+        {
+            m_ecal11 += hit->integral();
+            m_ecalTotal += hit->integral();
+        }
+        else
+        {
+            ATH_MSG_FATAL("Invalid Ecal module number: " << mod);
+        }
+    }
+    else
+    {
+        ATH_MSG_FATAL("Invalid Ecal row number: " << row);
+        return StatusCode::FAILURE;
+    }
+  }
+
+  SG::ReadHandle<Tracker::FaserSCT_ClusterContainer> clusterContainer { m_clusterContainer, ctx };
+  ATH_CHECK(clusterContainer.isValid());
+
+  for (auto collection : *clusterContainer)
+  {
+    Identifier id = collection->identify();
+    int station = m_sctHelper->station(id);
+    int clusters = (int) collection->size();
+    switch (station)
+    {
+        case 0:
+            m_station0Clusters += clusters;
+            break;
+        case 1:
+            m_station1Clusters += clusters;
+            break;
+        case 2:
+            m_station2Clusters += clusters;
+            break;
+        case 3:
+            m_station3Clusters += clusters;
+            break;
+        default:
+            ATH_MSG_FATAL("Unknown tracker station number " << station);
+            break;
+    }
+  }
+
+
+  SG::ReadHandle<TrackCollection> trackCollection {m_trackCollection, ctx};
+  ATH_CHECK(trackCollection.isValid());
+
+  const Trk::TrackParameters* candidateParameters {nullptr};
+  const Trk::Track* candidateTrack {nullptr};
+
+  for (const Trk::Track* track : *trackCollection)
+  {
+    if (track == nullptr) continue;
+    std::set<int> stationMap;
+    std::set<std::pair<int, int>> layerMap;
+
+    // Check for hit in the three downstream stations
+    for (auto measurement : *(track->measurementsOnTrack()))
+    {
+        const Tracker::FaserSCT_ClusterOnTrack* cluster = dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement);
+        if (cluster != nullptr)
+        {
+            Identifier id = cluster->identify();
+            int station = m_sctHelper->station(id);
+            int layer = m_sctHelper->layer(id);
+            stationMap.emplace(station);
+            layerMap.emplace(station, layer);
+        }
+    }
+    if (stationMap.count(1) == 0 || stationMap.count(2) == 0 || stationMap.count(3) == 0) continue;
+
+    int nLayers = std::count_if(layerMap.begin(), layerMap.end(), [](std::pair<int,int> p){return p.first != 0;});
+    if (nLayers < m_minTrackerLayers) continue;
+    m_longTracks++;
+    const Trk::TrackParameters* upstreamParameters {nullptr};
+    for (auto params : *(track->trackParameters()))
+    {
+        if (upstreamParameters == nullptr || params->position().z() < upstreamParameters->position().z()) upstreamParameters = params;
+    }
+    if (candidateParameters == nullptr || upstreamParameters->momentum().mag() > candidateParameters->momentum().mag())
+    {
+        candidateParameters = upstreamParameters;
+        candidateTrack = track;
+        m_chi2 = track->fitQuality()->chiSquared();
+        m_ndof = track->fitQuality()->numberDoF();
+    }
+  }
+
+  SG::ReadHandle<TrackerSimDataCollection> simDataCollection {m_simDataCollection, ctx};
+//   ATH_MSG_INFO("SimData valid? " << simDataCollection.isValid());
+  if (candidateTrack != nullptr && simDataCollection.isValid())
+  {
+    std::map<int, float> truthMap;
+    for (auto measurement : *(candidateTrack->measurementsOnTrack()))
+    {
+        const Tracker::FaserSCT_ClusterOnTrack* cluster = dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement);
+        if (cluster != nullptr)
+        {
+            // ATH_MSG_INFO("ClusterOnTrack is OK");
+            cluster->dump(msg());
+
+// Hack to work around issue with cluster navigation
+
+            auto idRDO = cluster->identify();
+
+            if (simDataCollection->count(idRDO) > 0)
+            {
+                // ATH_MSG_INFO("rdo entry found");
+                const auto& simdata = simDataCollection->find(idRDO)->second;
+                const auto& deposits = simdata.getdeposits();
+                //loop through deposits and record contributions
+                HepMcParticleLink primary{};
+                for( const auto& depositPair : deposits)
+                {
+                    // ATH_MSG_INFO("Deposit found");
+                    float eDep = depositPair.second;
+                    int barcode = depositPair.first->barcode();
+                    // if( depositPair.second > highestDep)
+                    // {
+                    //     highestDep = depositPair.second;
+                    //     barcode = depositPair.first->barcode();
+                    //     primary = depositPair.first;
+                    //     depositPair.first->print(std::cout);
+                    //     ATH_MSG_INFO("pdg id "<<depositPair.first->pdg_id());
+                    // }
+                    if (truthMap.count(barcode) > 0)
+                    {
+                        truthMap[barcode] += eDep;
+                    }
+                    else
+                    {
+                        truthMap[barcode] = eDep;
+                    }
+                }
+            }
+                    
+                
+
+
+                // // const Tracker::FaserSCT_Cluster* origCluster = dynamic_cast<const Tracker::FaserSCT_Cluster*>(cluster->prepRawData());
+                // auto origCluster = cluster->prepRawData();
+                // if (origCluster != nullptr)
+                // {
+                //     ATH_MSG_INFO("Orig Cluster is OK");
+                //     auto rdoList = origCluster->rdoList();
+                //     for (auto idRDO : rdoList)
+                //     {
+                //         ATH_MSG_INFO("rdoList not empty");
+                //         if (simDataCollection->count(idRDO) > 0)
+                //         {
+                //             ATH_MSG_INFO("rdo entry found");
+                //             const auto& simdata = simDataCollection->find(idRDO)->second;
+                //             const auto& deposits = simdata.getdeposits();
+                //             //loop through deposits and record contributions
+                //             HepMcParticleLink primary{};
+                //             for( const auto& depositPair : deposits)
+                //             {
+                //                 ATH_MSG_INFO("Deposit found");
+                //                 float eDep = depositPair.second;
+                //                 int barcode = depositPair.first->barcode();
+                //                 // if( depositPair.second > highestDep)
+                //                 // {
+                //                 //     highestDep = depositPair.second;
+                //                 //     barcode = depositPair.first->barcode();
+                //                 //     primary = depositPair.first;
+                //                 //     depositPair.first->print(std::cout);
+                //                 //     ATH_MSG_INFO("pdg id "<<depositPair.first->pdg_id());
+                //                 // }
+                //                 if (truthMap.count(barcode) > 0)
+                //                 {
+                //                     truthMap[barcode] += eDep;
+                //                 }
+                //                 else
+                //                 {
+                //                     truthMap[barcode] = eDep;
+                //                 }
+                //             }
+                //         }
+                //     }
+                // }
+        }
+    }
+    std::vector<std::pair<int, float>> truth(truthMap.begin(), truthMap.end());
+    std::sort(truth.begin(), truth.end(), [](auto v1, auto v2) { return v1.second > v2.second; });
+    if (truth.size()>0) ATH_MSG_ALWAYS("Selected track truth info:");
+    for (auto v : truth)
+    {
+        auto truthParticle = (*(std::find_if(truthParticleContainer->cbegin(), truthParticleContainer->cend(), [v](const xAOD::TruthParticle* p){ return p->barcode() == v.first; })));
+        if (m_truthPdg == 0) m_truthPdg = truthParticle->pdgId();
+        if (m_truthBarcode == 0) m_truthBarcode = v.first;
+        ATH_MSG_ALWAYS("truth info: barcode = " << v.first << " ( " << truthParticle->p4().P()/1000 << " GeV/c, Id code = " << truthParticle->pdgId() << ") -> deposited energy: " << v.second/1000);
+    }
+  }
+
+  if (candidateParameters != nullptr)
+  {
+    m_x = candidateParameters->position().x();
+    m_y = candidateParameters->position().y();
+    m_z = candidateParameters->position().z();
+    m_px = candidateParameters->momentum().x();
+    m_py = candidateParameters->momentum().y();
+    m_pz = candidateParameters->momentum().z();
+    m_p = sqrt(m_px * m_px + m_py * m_py + m_pz * m_pz);
+    m_charge = (int) candidateParameters->charge();
+  }
+
+  // Here we apply the signal selection
+  // Very simple/unrealistic to start
+  if (m_vetoUpstream == 0 || m_vetoDownstream == 0 ||
+        m_triggerTotal == 0 ||
+        m_preshower0 == 0 || m_preshower1 == 0 ||
+        // m_ecalTotal == 0 ||
+        candidateParameters == nullptr)
+      return StatusCode::SUCCESS;
+
+  m_tree->Fill();
+
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode NeutrinoSearchAlg::finalize() 
+{
+  return StatusCode::SUCCESS;
+}
+
+bool NeutrinoSearchAlg::waveformHitOK(const xAOD::WaveformHit* hit) const
+{
+    if (hit->status_bit(xAOD::WaveformStatus::THRESHOLD_FAILED) || hit->status_bit(xAOD::WaveformStatus::SECONDARY)) return false;
+    return true;
+}
+
+void
+NeutrinoSearchAlg::clearTree() const
+{
+  m_run_number = 0;
+  m_event_number = 0;
+  m_vetoNu0 = 0;
+  m_vetoNu1 = 0;
+  m_veto00 = 0;
+  m_veto01 = 0;
+  m_veto10 = 0;
+  m_veto11 = 0;
+  m_vetoUpstream = 0;
+  m_vetoDownstream = 0;
+  m_trigger00 = 0;
+  m_trigger01 = 0;
+  m_trigger10 = 0;
+  m_trigger11 = 0;
+  m_triggerTotal = 0;
+  m_preshower0 = 0;
+  m_preshower1 = 0;
+  m_ecal00 = 0;
+  m_ecal01 = 0;
+  m_ecal10 = 0;
+  m_ecal11 = 0;
+  m_ecalTotal = 0;
+  m_station0Clusters = 0;
+  m_station1Clusters = 0;
+  m_station2Clusters = 0;
+  m_station3Clusters = 0;
+  m_crossSection = 0;
+  m_chi2 = 0;
+  m_ndof = 0;
+  m_px = 0;
+  m_py = 0;
+  m_pz = 0;
+  m_p = 0;
+  m_charge = 0;
+  m_x = 0;
+  m_y = 0;
+  m_z = 0;
+  m_longTracks = 0;
+  m_truthLeptonMomentum = 0;
+  m_truthBarcode = 0;
+  m_truthPdg = 0;
+}
\ No newline at end of file
diff --git a/PhysicsAnalysis/NeutrinoSearch/src/NeutrinoSearchAlg.h b/PhysicsAnalysis/NeutrinoSearch/src/NeutrinoSearchAlg.h
new file mode 100644
index 0000000000000000000000000000000000000000..d1732eb1238a15bb7b2fb397869b3c4486aa50b3
--- /dev/null
+++ b/PhysicsAnalysis/NeutrinoSearch/src/NeutrinoSearchAlg.h
@@ -0,0 +1,136 @@
+#ifndef NEUTRINOSEARCH_NEUTRINOSEARCHALG_H
+#define NEUTRINOSEARCH_NEUTRINOSEARCHALG_H
+
+#include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "AthenaBaseComps/AthHistogramming.h"
+#include "TrkTrack/TrackCollection.h"
+#include "xAODFaserWaveform/WaveformHitContainer.h"
+#include "xAODFaserWaveform/WaveformHit.h"
+#include "xAODTruth/TruthEventContainer.h"
+#include "xAODTruth/TruthParticleContainer.h"
+#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h"
+#include "TrackerSimData/TrackerSimDataCollection.h"
+#include "FaserActsGeometryInterfaces/IFaserActsExtrapolationTool.h"
+
+
+class TTree;
+class FaserSCT_ID;
+class VetoNuID;
+class VetoID;
+class TriggerID;
+class PreshowerID;
+class EcalID;
+namespace  TrackerDD
+{
+    class SCT_DetectorManager;
+}
+
+class NeutrinoSearchAlg : public AthReentrantAlgorithm, AthHistogramming {
+public:
+  NeutrinoSearchAlg(const std::string &name, ISvcLocator *pSvcLocator);
+  virtual ~NeutrinoSearchAlg() = default;
+  virtual StatusCode initialize() override;
+  virtual StatusCode execute(const EventContext &ctx) const override;
+  virtual StatusCode finalize() override;
+  const ServiceHandle <ITHistSvc> &histSvc() const;
+
+private:
+
+  bool waveformHitOK(const xAOD::WaveformHit* hit) const;
+  void clearTree() const;
+
+  ServiceHandle <ITHistSvc> m_histSvc;
+
+  SG::ReadHandleKey<xAOD::TruthEventContainer> m_truthEventContainer { this, "EventContainer", "TruthEvents", "Truth event container name." };
+  SG::ReadHandleKey<xAOD::TruthParticleContainer> m_truthParticleContainer { this, "ParticleContainer", "TruthParticles", "Truth particle container name." };
+  SG::ReadHandleKey<TrackerSimDataCollection> m_simDataCollection {this, "TrackerSimDataCollection", "SCT_SDO_Map"};
+
+  SG::ReadHandleKey<TrackCollection> m_trackCollection { this, "TrackCollection", "CKFTrackCollection", "Input track collection name" };
+  SG::ReadHandleKey<xAOD::WaveformHitContainer> m_vetoNuContainer { this, "VetoNuContainer", "VetoNuWaveformHits", "VetoNu hit container name" };
+  SG::ReadHandleKey<xAOD::WaveformHitContainer> m_vetoContainer { this, "VetoContainer", "VetoWaveformHits", "Veto hit container name" };
+  SG::ReadHandleKey<xAOD::WaveformHitContainer> m_triggerContainer { this, "TriggerContainer", "TriggerWaveformHits", "Trigger hit container name" };
+  SG::ReadHandleKey<xAOD::WaveformHitContainer> m_preshowerContainer { this, "PreshowerContainer", "PreshowerWaveformHits", "Preshower hit container name" };
+  SG::ReadHandleKey<xAOD::WaveformHitContainer> m_ecalContainer { this, "EcalContainer", "CaloWaveformHits", "Ecal hit container name" };
+  SG::ReadHandleKey<Tracker::FaserSCT_ClusterContainer> m_clusterContainer { this, "ClusterContainer", "SCT_ClusterContainer", "Tracker cluster container name" };
+
+  ToolHandle<IFaserActsExtrapolationTool> m_extrapolationTool { this, "ExtrapolationTool", "FaserActsExtrapolationTool" };  
+  const TrackerDD::SCT_DetectorManager* m_detMgr {nullptr};
+
+  const FaserSCT_ID* m_sctHelper;
+  const VetoNuID*    m_vetoNuHelper;
+  const VetoID*      m_vetoHelper;
+  const TriggerID*   m_triggerHelper;
+  const PreshowerID* m_preshowerHelper;
+  const EcalID*      m_ecalHelper;
+
+  // TODO: use realistic thresholds for MIP
+//   DoubleProperty m_vetoNuThreshold    { this, "VetoNuThreshold",    0, "Threshold for VetoNu pmts" };
+//   DoubleProperty m_vetoThreshold      { this, "VetoThreshold",      0, "Threshold for Veto pmts" };
+//   DoubleProperty m_triggerThreshold   { this, "TriggerThreshold",   0, "Threshold for Trigger pmts" };
+//   DoubleProperty m_preshowerThreshold { this, "PreshowerThreshold", 0, "Threshold for Preshower pmts" };
+//   DoubleProperty m_ecalThreshold      { this, "EcalThreshold",      0, "Threshold for Ecal pmts" };
+  IntegerProperty m_minTrackerLayers     { this, "MinTrackerLayers", 7, "Minimum number of layers with hits on track" };
+
+  BooleanProperty m_useFlukaWeights   { this, "UseFlukaWeights", false, "Flag to weight events according to value stored in HepMC::GenEvent" };
+  BooleanProperty m_useGenieWeights   { this, "UseGenieWeights", false, "Flag to weight events according to Genie luminosity" };
+  IntegerProperty m_flukaCollisions   { this, "FlukaCollisions", 137130000, "Number of proton-proton collisions in FLUKA sample." };
+  DoubleProperty  m_flukaCrossSection { this, "FlukaCrossSection", 80.0, "Fluka p-p inelastic cross-section in millibarns." };
+  DoubleProperty  m_genieLuminosity   { this, "GenieLuminosity", 150.0, "Genie luminosity in inverse fb." };
+
+//   BooleanProperty m_enforceBlinding   { this, "EnforceBlinding", true, "Ignore data events with no VetoNu signals." };
+  const bool m_enforceBlinding {true};
+
+  double m_baseEventCrossSection {1.0};
+  const double kfemtoBarnsPerMilliBarn {1.0e12};
+
+  mutable TTree* m_tree;
+  mutable unsigned int m_run_number;
+  mutable unsigned int m_event_number;
+  mutable double m_vetoNu0;
+  mutable double m_vetoNu1;
+  mutable double m_veto00;
+  mutable double m_veto01;
+  mutable double m_vetoUpstream;
+  mutable double m_veto10;
+  mutable double m_veto11;
+  mutable double m_vetoDownstream;
+  mutable double m_trigger00;
+  mutable double m_trigger01;
+  mutable double m_trigger10;
+  mutable double m_trigger11;
+  mutable double m_triggerTotal;
+  mutable double m_preshower0;
+  mutable double m_preshower1;
+  mutable double m_ecal00;
+  mutable double m_ecal01;
+  mutable double m_ecal10;
+  mutable double m_ecal11;
+  mutable double m_ecalTotal;
+  mutable int m_station0Clusters;
+  mutable int m_station1Clusters;
+  mutable int m_station2Clusters;
+  mutable int m_station3Clusters;
+
+  mutable double m_x;
+  mutable double m_y;
+  mutable double m_z;
+  mutable double m_px;
+  mutable double m_py;
+  mutable double m_pz;
+  mutable double m_p;
+  mutable int    m_charge;
+  mutable double m_chi2;
+  mutable int    m_ndof;
+  mutable int    m_longTracks;
+  mutable double m_truthLeptonMomentum;
+  mutable int    m_truthBarcode;
+  mutable int    m_truthPdg;
+  mutable double m_crossSection;
+
+};
+
+inline const ServiceHandle <ITHistSvc> &NeutrinoSearchAlg::histSvc() const {
+  return m_histSvc;
+}
+
+#endif  // NEUTRINOSEARCH_NEUTRINOSEARCHALG_H
diff --git a/PhysicsAnalysis/NeutrinoSearch/src/component/NeutrinoSearch_entries.cxx b/PhysicsAnalysis/NeutrinoSearch/src/component/NeutrinoSearch_entries.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d47072b60eb09ca5e38a86763f85ff0c5bc36e94
--- /dev/null
+++ b/PhysicsAnalysis/NeutrinoSearch/src/component/NeutrinoSearch_entries.cxx
@@ -0,0 +1,3 @@
+#include "../NeutrinoSearchAlg.h"
+
+DECLARE_COMPONENT(NeutrinoSearchAlg)
\ No newline at end of file
diff --git a/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/TrackerEventCnvTool.h b/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/TrackerEventCnvTool.h
index 29ef80259242bde365ddf83b6ec8bcff3ada41ac..f56577388e62f131d349f5e40a12383cf87e8b71 100644
--- a/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/TrackerEventCnvTool.h
+++ b/Tracker/TrackerEventCnv/TrackerEventCnvTools/TrackerEventCnvTools/TrackerEventCnvTool.h
@@ -89,7 +89,7 @@ class TrackerEventCnvTool :  public extends<AthAlgTool, Trk::ITrkEventCnvTool>
     // added to check TRT existence (SLHC geo check)
     const IdDictManager* m_idDictMgr;
 
-    SG::ReadHandleKey<FaserSCT_ClusterContainer>      m_sctClusContName       {this, "SCT_ClusterContainer",     "SCT_Clusters",             "SCT Cluster container name"};   //!< location of container of sct clusters
+    SG::ReadHandleKey<FaserSCT_ClusterContainer>      m_sctClusContName       {this, "SCT_ClusterContainer",     "SCT_ClusterContainer",             "SCT Cluster container name"};   //!< location of container of sct clusters
 
     SG::ReadCondHandleKey<TrackerDD::SiDetectorElementCollection> m_SCTDetEleCollKey{this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"};
   };
diff --git a/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/TrackerEventCnvTool.cxx b/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/TrackerEventCnvTool.cxx
index 92d62c99790494ae1c0a2b0cb3b62753fe0386fe..1eb3b38a4270226687a0eb12b700d8be54dde0a4 100644
--- a/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/TrackerEventCnvTool.cxx
+++ b/Tracker/TrackerEventCnv/TrackerEventCnvTools/src/TrackerEventCnvTool.cxx
@@ -27,7 +27,7 @@ Tracker::TrackerEventCnvTool::TrackerEventCnvTool(const std::string& t,
                                                   const IInterface*  p )
   :
   base_class(t,n,p),
-  m_setPrepRawDataLink(false),
+  m_setPrepRawDataLink(true),
   m_IDHelper(nullptr),
   m_SCTHelper(nullptr),
   m_idDictMgr(nullptr)
diff --git a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx
index 5567e5cf9ab507ce8e7f076917055adef219e8e8..ba438dd9eef7845724e259b0a2e387a598df548b 100644
--- a/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx
+++ b/Tracker/TrackerRecEvent/TrackerRIO_OnTrack/src/FaserSCT_ClusterOnTrack.cxx
@@ -87,8 +87,10 @@ const Trk::Surface& Tracker::FaserSCT_ClusterOnTrack::associatedSurface() const
     return ( detectorElement()->surface()); 
 }
   
-void Tracker::FaserSCT_ClusterOnTrack::setValues(const Trk::TrkDetElementBase* detEl, const Trk::PrepRawData* )
+void Tracker::FaserSCT_ClusterOnTrack::setValues(const Trk::TrkDetElementBase* detEl, const Trk::PrepRawData* prepRawData)
 {
+    const auto *cluster = dynamic_cast<const Tracker::FaserSCT_Cluster*>(prepRawData);
+    m_rio.setElement(cluster);
     m_detEl = dynamic_cast< const TrackerDD::SiDetectorElement* >(detEl);
     if (m_detEl) {
       // Set global position after setting the detector element
diff --git a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
index 6e9c7dc2f58cdd6a172e9f357915e7d18ac67ece..9377c4716810301c16fe7ca606ba31e6f5ba318c 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
+++ b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
@@ -71,6 +71,8 @@ atlas_add_component(FaserActsKalmanFilter
     src/CircleFit.cxx
     src/CircleFitTrackSeedTool.cxx
     src/CKF2.cxx
+    src/CreateTrkTrackTool.h
+    src/CreateTrkTrackTool.cxx
 #    src/ClusterTrackSeedTool.cxx
     src/CombinatorialKalmanFilterAlg.cxx
     src/EffPlotTool.cxx
diff --git a/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py b/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py
index ea2dc0cb9eb08c309bf0453216230fe0b2074b4f..0be78f0c7db5ac89ae7b06a4c79a9b5725c7ef9e 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py
@@ -63,18 +63,12 @@ def CKF2Cfg(flags, **kwargs):
     trajectory_states_writer_tool1 = CompFactory.RootTrajectoryStatesWriterTool()
     trajectory_states_writer_tool1.noDiagnostics = kwargs["noDiagnostics"]
     trajectory_states_writer_tool1.FilePath = "track_states_ckf1.root"
-    trajectory_states_writer_tool2 = CompFactory.RootTrajectoryStatesWriterTool()
-    trajectory_states_writer_tool2.FilePath = "track_states_ckf2.root"
-    trajectory_states_writer_tool2.noDiagnostics = kwargs["noDiagnostics"]
 
     trajectory_summary_writer_tool = CompFactory.RootTrajectorySummaryWriterTool(**kwargs)
     trajectory_summary_writer_tool.noDiagnostics = kwargs["noDiagnostics"]
     trajectory_summary_writer_tool1 = CompFactory.RootTrajectorySummaryWriterTool()
     trajectory_summary_writer_tool1.FilePath = "track_summary_ckf1.root"
     trajectory_summary_writer_tool1.noDiagnostics = kwargs["noDiagnostics"]
-    trajectory_summary_writer_tool2 = CompFactory.RootTrajectorySummaryWriterTool(**kwargs)
-    trajectory_summary_writer_tool2.FilePath = "track_summary_ckf2.root"
-    trajectory_summary_writer_tool2.noDiagnostics = kwargs["noDiagnostics"]
 
     actsExtrapolationTool = CompFactory.FaserActsExtrapolationTool("FaserActsExtrapolationTool")
     actsExtrapolationTool.MaxSteps = 1000
@@ -97,17 +91,6 @@ def CKF2Cfg(flags, **kwargs):
     kalman_fitter1.RootTrajectorySummaryWriterTool = trajectory_summary_writer_tool1
     ckf.KalmanFitterTool1 = kalman_fitter1
 
-    kalman_fitter2 = CompFactory.KalmanFitterTool(name="fitterTool2", **kwargs)
-    kalman_fitter2.noDiagnostics = kwargs["noDiagnostics"]
-    kalman_fitter2.ActsLogging = "INFO"
-    kalman_fitter2.SummaryWriter = True
-    kalman_fitter2.StatesWriter = False
-    kalman_fitter2.SeedCovarianceScale = 10
-    kalman_fitter2.isMC = flags.Input.isMC
-    kalman_fitter2.RootTrajectoryStatesWriterTool = trajectory_states_writer_tool2
-    kalman_fitter2.RootTrajectorySummaryWriterTool = trajectory_summary_writer_tool2
-    ckf.KalmanFitterTool2 = kalman_fitter2
-
     ckf.TrackSeed = track_seed_tool
     ckf.ActsLogging = "INFO"
     ckf.RootTrajectoryStatesWriterTool = trajectory_states_writer_tool
diff --git a/Tracking/Acts/FaserActsKalmanFilter/python/TI12CKF2Config.py b/Tracking/Acts/FaserActsKalmanFilter/python/TI12CKF2Config.py
index 748900ed86612abebc50a0f64557223c922d97c8..28b0aa9d1c4d98024f5b1e295c2e0256e2086c6c 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/python/TI12CKF2Config.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/python/TI12CKF2Config.py
@@ -63,18 +63,12 @@ def TI12CKF2Cfg(flags, **kwargs):
     trajectory_states_writer_tool1 = CompFactory.RootTrajectoryStatesWriterTool()
     trajectory_states_writer_tool1.noDiagnostics = kwargs["noDiagnostics"]
     trajectory_states_writer_tool1.FilePath = "track_states_ckf1.root"
-    trajectory_states_writer_tool2 = CompFactory.RootTrajectoryStatesWriterTool()
-    trajectory_states_writer_tool2.FilePath = "track_states_ckf2.root"
-    trajectory_states_writer_tool2.noDiagnostics = kwargs["noDiagnostics"]
 
     trajectory_summary_writer_tool = CompFactory.RootTrajectorySummaryWriterTool(**kwargs)
     trajectory_summary_writer_tool.noDiagnostics = kwargs["noDiagnostics"]
     trajectory_summary_writer_tool1 = CompFactory.RootTrajectorySummaryWriterTool()
     trajectory_summary_writer_tool1.FilePath = "track_summary_ckf1.root"
     trajectory_summary_writer_tool1.noDiagnostics = kwargs["noDiagnostics"]
-    trajectory_summary_writer_tool2 = CompFactory.RootTrajectorySummaryWriterTool(**kwargs)
-    trajectory_summary_writer_tool2.FilePath = "track_summary_ckf2.root"
-    trajectory_summary_writer_tool2.noDiagnostics = kwargs["noDiagnostics"]
 
     actsExtrapolationTool = CompFactory.FaserActsExtrapolationTool("FaserActsExtrapolationTool")
     actsExtrapolationTool.MaxSteps = 1000
@@ -97,17 +91,6 @@ def TI12CKF2Cfg(flags, **kwargs):
     kalman_fitter1.origin = origin
     ckf.KalmanFitterTool1 = kalman_fitter1
 
-    kalman_fitter2 = CompFactory.KalmanFitterTool(name="fitterTool2", **kwargs)
-    kalman_fitter2.noDiagnostics = kwargs["noDiagnostics"]
-    kalman_fitter2.ActsLogging = "INFO"
-    kalman_fitter2.SummaryWriter = True
-    kalman_fitter2.StatesWriter = True
-    kalman_fitter2.SeedCovarianceScale = 1
-    kalman_fitter2.RootTrajectoryStatesWriterTool = trajectory_states_writer_tool2
-    kalman_fitter2.RootTrajectorySummaryWriterTool = trajectory_summary_writer_tool2
-    kalman_fitter2.origin = origin
-    ckf.KalmanFitterTool2 = kalman_fitter2
-
     ckf.TrackSeed = track_seed_tool
     ckf.ActsLogging = "INFO"
     ckf.RootTrajectoryStatesWriterTool = trajectory_states_writer_tool
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
index d0d6f2138289fa0c5e387ae2897e0abcbd7dca8a..9a47b291ea948182fd3d7c19adaa7a3a6970e778 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
@@ -38,9 +38,8 @@ using TrajectoriesContainer = std::vector<FaserActsRecMultiTrajectory>;
 //std::array<Acts::BoundIndices, 2> indices = {Acts::eBoundLoc0, Acts::eBoundLoc1};
 
 
-CKF2::CKF2(
-    const std::string& name, ISvcLocator* pSvcLocator)
-    : AthAlgorithm(name, pSvcLocator) {}
+CKF2::CKF2(const std::string& name, ISvcLocator* pSvcLocator) :
+    AthAlgorithm(name, pSvcLocator) {}
 
 
 StatusCode CKF2::initialize() {
@@ -48,8 +47,8 @@ StatusCode CKF2::initialize() {
   ATH_CHECK(m_trackingGeometryTool.retrieve());
   ATH_CHECK(m_trackSeedTool.retrieve());
   ATH_CHECK(m_kalmanFitterTool1.retrieve());
-  ATH_CHECK(m_kalmanFitterTool2.retrieve());
-  //  ATH_CHECK(m_trackCollection.initialize());
+  ATH_CHECK(m_createTrkTrackTool.retrieve());
+  ATH_CHECK(m_trackCollection.initialize());
   if (m_performanceWriter && !m_noDiagnostics) {
     ATH_CHECK(m_performanceWriterTool.retrieve());
   }
@@ -79,8 +78,7 @@ StatusCode CKF2::execute() {
   const EventContext& ctx = Gaudi::Hive::currentContext();
   m_numberOfEvents++;
 
-  ATH_CHECK(m_trackCollection.initialize());
-  SG::WriteHandle<TrackCollection> trackContainer{m_trackCollection,ctx};
+  SG::WriteHandle trackContainer{m_trackCollection, ctx};
   std::unique_ptr<TrackCollection> outputTracks = std::make_unique<TrackCollection>();
 
   std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry
@@ -189,18 +187,12 @@ StatusCode CKF2::execute() {
     ATH_MSG_DEBUG("  position: " << params.position(gctx).transpose());
     ATH_MSG_DEBUG("  momentum: " << params.momentum().transpose());
     ATH_MSG_DEBUG("  charge:   " << params.charge());
-    std::unique_ptr<Trk::Track> track = makeTrack(gctx, traj);
-    if (track) {
+    std::unique_ptr<Trk::Track> track = m_createTrkTrackTool->createTrack(gctx, traj);
+    if (track != nullptr) {
       m_numberOfSelectedTracks++;
-      std::unique_ptr<Trk::Track> track2 = m_kalmanFitterTool1->fit(ctx, gctx, *track, trajectories, Acts::BoundVector::Zero(), m_isMC, origin);
+      std::unique_ptr<Trk::Track> track2 = m_kalmanFitterTool1->fit(ctx, gctx, track.get(), Acts::BoundVector::Zero(), m_isMC, origin);
       if (track2) {
-        std::unique_ptr<Trk::Track> track3 = m_kalmanFitterTool2->fit(ctx, gctx, *track2, trajectories, Acts::BoundVector::Zero(), m_isMC, origin);
-        if (track3) {
-          outputTracks->push_back(std::move(track3));
-        } else {
-          outputTracks->push_back(std::move(track2));
-          ATH_MSG_WARNING("Re-Fit failed.");
-        }
+        outputTracks->push_back(std::move(track2));
       } else {
         outputTracks->push_back(std::move(track));
         ATH_MSG_WARNING("Re-Fit failed.");
@@ -248,191 +240,6 @@ Acts::MagneticFieldContext CKF2::getMagneticFieldContext(const EventContext& ctx
 }
 
 
-std::unique_ptr<Trk::Track>
-CKF2::makeTrack(const Acts::GeometryContext &geoCtx, const FaserActsRecMultiTrajectory &traj) const {
-  using ConstTrackStateProxy =
-      Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>;
-  std::unique_ptr<Trk::Track> newtrack = nullptr;
-  //Get the fit output object
-  DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{};
-  std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam;
-  // Loop over all the output state to create track state
-  traj.multiTrajectory().visitBackwards(traj.tips().front(), [&](const ConstTrackStateProxy& state) {
-    auto flag = state.typeFlags();
-    if (state.referenceSurface().associatedDetectorElement() != nullptr) {
-      // We need to determine the type of state
-      std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
-      const Trk::TrackParameters *parm;
-
-      // State is a hole (no associated measurement), use predicted para meters
-      if (flag[Acts::TrackStateFlag::HoleFlag] == true) {
-        const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                   state.predicted(),
-                                                   state.predictedCovariance());
-        parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-        // auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*p arm);
-        typePattern.set(Trk::TrackStateOnSurface::Hole);
-      }
-        // The state was tagged as an outlier, use filtered parameters
-      else if (flag[Acts::TrackStateFlag::OutlierFlag] == true) {
-        const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                   state.filtered(), state.filteredCovariance());
-        parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-        typePattern.set(Trk::TrackStateOnSurface::Outlier);
-      }
-        // The state is a measurement state, use smoothed parameters
-      else {
-        const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                   state.smoothed(), state.smoothedCovariance());
-        actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam)));
-        //  const auto& psurface=actsParam.referenceSurface();
-        Acts::Vector2 local(actsParam.parameters()[Acts::eBoundLoc0], actsParam.parameters()[Acts::eBoundLoc1]);
-        //  const Acts::Vector3 dir = Acts::makeDirectionUnitFromPhiTheta(actsParam.parameters()[Acts::eBoundPhi], actsParam.parameters()[Acts::eBoundTheta]);
-        //  auto pos=actsParam.position(tgContext);
-        parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-        typePattern.set(Trk::TrackStateOnSurface::Measurement);
-      }
-      Tracker::FaserSCT_ClusterOnTrack* measState = nullptr;
-      if (state.hasUncalibrated()) {
-        const Tracker::FaserSCT_Cluster* fitCluster = state.uncalibrated().hit();
-        if (fitCluster->detectorElement() != nullptr) {
-          measState = new Tracker::FaserSCT_ClusterOnTrack{
-              fitCluster,
-              Trk::LocalParameters{
-                  Trk::DefinedParameter{fitCluster->localPosition()[0], Trk::loc1},
-                  Trk::DefinedParameter{fitCluster->localPosition()[1], Trk::loc2}
-              },
-              fitCluster->localCovariance(),
-              m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())
-          };
-        }
-      }
-      double nDoF = state.calibratedSize();
-      const Trk::FitQualityOnSurface *quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF);
-      const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(measState, parm, quality, nullptr, typePattern);
-      // If a state was succesfully created add it to the trajectory
-      if (perState) {
-        finalTrajectory->insert(finalTrajectory->begin(), perState);
-      }
-    }
-    return;
-  });
-
-  // Create the track using the states
-  const Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon);
-  // Trk::FitQuality* q = nullptr;
-  // newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::KalmanFitter     ); //Mark the fitter as KalmanFitter
-  newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), nullptr);
-  return newtrack;
-}
-
-
-std::unique_ptr<Trk::Track>
-CKF2::makeTrack(Acts::GeometryContext& geoCtx, TrackFitterResult& fitResult) const {
-  using ConstTrackStateProxy =
-  Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>;
-  std::unique_ptr<Trk::Track> newtrack = nullptr;
-  //Get the fit output object
-  const auto& fitOutput = fitResult.value();
-  if (fitOutput.fittedParameters.size() > 0) {
-    DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{};
-    std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam;
-    // Loop over all the output state to create track state
-    fitOutput.fittedStates.visitBackwards(fitOutput.lastMeasurementIndices.front(), [&](const ConstTrackStateProxy& state) {
-      auto flag = state.typeFlags();
-      if (state.referenceSurface().associatedDetectorElement() != nullptr) {
-        // We need to determine the type of state
-        std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
-        const Trk::TrackParameters *parm;
-
-        // State is a hole (no associated measurement), use predicted para meters
-        if (flag[Acts::TrackStateFlag::HoleFlag] == true) {
-          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                     state.predicted(),
-                                                     state.predictedCovariance());
-          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-          // auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*p arm);
-          typePattern.set(Trk::TrackStateOnSurface::Hole);
-        }
-          // The state was tagged as an outlier, use filtered parameters
-        else if (flag[Acts::TrackStateFlag::OutlierFlag] == true) {
-          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                     state.filtered(), state.filteredCovariance());
-          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-          typePattern.set(Trk::TrackStateOnSurface::Outlier);
-        }
-          // The state is a measurement state, use smoothed parameters
-        else {
-          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                     state.smoothed(), state.smoothedCovariance());
-          actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam)));
-          //  const auto& psurface=actsParam.referenceSurface();
-          Acts::Vector2 local(actsParam.parameters()[Acts::eBoundLoc0], actsParam.parameters()[Acts::eBoundLoc1]);
-          //  const Acts::Vector3 dir = Acts::makeDirectionUnitFromPhiTheta(actsParam.parameters()[Acts::eBoundPhi], actsParam.parameters()[Acts::eBoundTheta]);
-          //  auto pos=actsParam.position(tgContext);
-          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-          typePattern.set(Trk::TrackStateOnSurface::Measurement);
-        }
-        Tracker::FaserSCT_ClusterOnTrack* measState = nullptr;
-        if (state.hasUncalibrated()) {
-          const Tracker::FaserSCT_Cluster* fitCluster = state.uncalibrated().hit();
-          if (fitCluster->detectorElement() != nullptr) {
-            measState = new Tracker::FaserSCT_ClusterOnTrack{
-                fitCluster,
-                Trk::LocalParameters{
-                    Trk::DefinedParameter{fitCluster->localPosition()[0], Trk::loc1},
-                    Trk::DefinedParameter{fitCluster->localPosition()[1], Trk::loc2}
-                },
-                fitCluster->localCovariance(),
-                m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())
-            };
-          }
-        }
-        double nDoF = state.calibratedSize();
-        const Trk::FitQualityOnSurface *quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF);
-        const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(measState, parm, quality, nullptr, typePattern);
-        // If a state was succesfully created add it to the trajectory
-        if (perState) {
-          finalTrajectory->insert(finalTrajectory->begin(), perState);
-        }
-      }
-      return;
-    });
-
-    // Create the track using the states
-    const Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon);
-    // Trk::FitQuality* q = nullptr;
-    // newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::KalmanFitter     ); //Mark the fitter as KalmanFitter
-    newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), nullptr);
-  }
-  return newtrack;
-}
-
-const Trk::TrackParameters*
-CKF2::ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const      {
-  using namespace Acts::UnitLiterals;
-  std::optional<AmgSymMatrix(5)> cov = std::nullopt;
-  if (actsParameter.covariance()){
-    AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner(5, 5));
-    // Convert the covariance matrix to GeV
-    for(int i=0; i < newcov.rows(); i++){
-      newcov(i, 4) = newcov(i, 4)*1_MeV;
-    }
-    for(int i=0; i < newcov.cols(); i++){
-      newcov(4, i) = newcov(4, i)*1_MeV;
-    }
-    cov =  std::optional<AmgSymMatrix(5)>(newcov);
-  }
-  const Amg::Vector3D& pos=actsParameter.position(gctx);
-  double tphi=actsParameter.get<Acts::eBoundPhi>();
-  double ttheta=actsParameter.get<Acts::eBoundTheta>();
-  double tqOverP=actsParameter.get<Acts::eBoundQOverP>()*1_MeV;
-  double p = std::abs(1. / tqOverP);
-  Amg::Vector3D tmom(p * std::cos(tphi) * std::sin(ttheta), p * std::sin(tphi) * std::sin(ttheta), p * std::cos(ttheta));
-  double charge = tqOverP > 0. ? 1. : -1.;
-  const Trk::CurvilinearParameters * curv = new Trk::CurvilinearParameters(pos,tmom,charge, cov);
-  return curv;
-}
 
 void CKF2::computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, TrackFinderResult& results) const {
   // Compute shared hits from all the reconstructed tracks
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h
index c6b42b020766fa0e17b5693a2a0bc266057c6243..2c4f510a62cfb3f80f0de0e963ace4602f04bafa 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h
@@ -20,6 +20,7 @@
 #include "PerformanceWriterTool.h"
 #include "KalmanFitterTool.h"
 #include <boost/dynamic_bitset.hpp>
+#include "CreateTrkTrackTool.h"
 using ConstTrackStateProxy = Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>;
 using ClusterSet = boost::dynamic_bitset<>;
 
@@ -143,13 +144,9 @@ private:
   ToolHandle<RootTrajectoryStatesWriterTool> m_trajectoryStatesWriterTool {this, "RootTrajectoryStatesWriterTool", "RootTrajectoryStatesWriterTool"};
   ToolHandle<RootTrajectorySummaryWriterTool> m_trajectorySummaryWriterTool {this, "RootTrajectorySummaryWriterTool", "RootTrajectorySummaryWriterTool"};
   ToolHandle<KalmanFitterTool> m_kalmanFitterTool1 {this, "KalmanFitterTool1", "KalmanFitterTool"};
-  ToolHandle<KalmanFitterTool> m_kalmanFitterTool2 {this, "KalmanFitterTool2", "KalmanFitterTool"};
+  ToolHandle<CreateTrkTrackTool> m_createTrkTrackTool {this, "CreateTrkTrackTool", "CreateTrkTrackTool"};
   Gaudi::Property<bool> m_isMC {this, "isMC", false};
-
-  std::unique_ptr<Trk::Track> makeTrack(Acts::GeometryContext& tgContext, TrackFitterResult& fitResult) const;
-  std::unique_ptr<Trk::Track> makeTrack(const Acts::GeometryContext &geoCtx, const FaserActsRecMultiTrajectory &traj) const;
-  const Trk::TrackParameters* ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const;
-  SG::WriteHandleKey<TrackCollection> m_trackCollection { this, "CKFTrackCollection", "CKFTrackCollection" };
+  SG::WriteHandleKey<TrackCollection> m_trackCollection { this, "OutputCollection", "CKFTrackCollection", "Output track collection name" };
 };
 
 #endif // FASERACTSKALMANFILTER_CKF2_H
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..4928fc917e2b0bfe73e38848939690680fc3c19a
--- /dev/null
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.cxx
@@ -0,0 +1,106 @@
+#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h"
+#include "CreateTrkTrackTool.h"
+
+#include <Acts/EventData/MultiTrajectoryHelpers.hpp>
+#include "TrackerIdentifier/FaserSCT_ID.h"
+
+CreateTrkTrackTool::CreateTrkTrackTool(const std::string& type, const std::string& name, const IInterface* parent) :
+    AthAlgTool( type, name, parent ) {}
+
+StatusCode CreateTrkTrackTool::initialize() {
+  ATH_CHECK(detStore()->retrieve(m_idHelper,"FaserSCT_ID"));
+  return StatusCode::SUCCESS;
+}
+
+StatusCode CreateTrkTrackTool::finalize() {
+  return StatusCode::SUCCESS;
+}
+
+std::unique_ptr<Trk::Track>
+CreateTrkTrackTool::createTrack(const Acts::GeometryContext &gctx, const FaserActsRecMultiTrajectory &traj) const {
+  std::unique_ptr<Trk::Track> newtrack = nullptr;
+  DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{};
+  using ConstTrackStateProxy = Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>;
+  auto trajState = Acts::MultiTrajectoryHelpers::trajectoryState(traj.multiTrajectory(), traj.tips().front());
+  traj.multiTrajectory().visitBackwards(traj.tips().front(), [&](const ConstTrackStateProxy& state) {
+    auto flag = state.typeFlags();
+    if (state.referenceSurface().associatedDetectorElement() != nullptr) {
+      std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
+      const Trk::TrackParameters *parm;
+
+      if (flag[Acts::TrackStateFlag::HoleFlag]) {
+        const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                   state.predicted(), state.predictedCovariance());
+        parm = ConvertActsTrackParameterToATLAS(actsParam, gctx);
+        typePattern.set(Trk::TrackStateOnSurface::Hole);
+      }
+      else if (flag[Acts::TrackStateFlag::OutlierFlag]) {
+        const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                   state.filtered(), state.filteredCovariance());
+        parm = ConvertActsTrackParameterToATLAS(actsParam, gctx);
+        typePattern.set(Trk::TrackStateOnSurface::Outlier);
+      }
+      else {
+        const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                   state.smoothed(), state.smoothedCovariance());
+        parm = ConvertActsTrackParameterToATLAS(actsParam, gctx);
+        typePattern.set(Trk::TrackStateOnSurface::Measurement);
+      }
+      Tracker::FaserSCT_ClusterOnTrack* clusterOnTrack = nullptr;
+      if (state.hasUncalibrated()) {
+        const Tracker::FaserSCT_Cluster* cluster = state.uncalibrated().hit();
+        if (cluster->detectorElement() != nullptr) {
+          clusterOnTrack = new Tracker::FaserSCT_ClusterOnTrack{
+              cluster,
+              Trk::LocalParameters{
+                  Trk::DefinedParameter{cluster->localPosition()[0], Trk::loc1},
+                  Trk::DefinedParameter{cluster->localPosition()[1], Trk::loc2}
+              },
+              cluster->localCovariance(),
+              m_idHelper->wafer_hash(cluster->detectorElement()->identify())
+          };
+        }
+      }
+      const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(clusterOnTrack, parm);
+      if (perState) {
+        finalTrajectory->insert(finalTrajectory->begin(), perState);
+      }
+    }
+    return;
+  });
+
+  Trk::FitQuality* q = new Trk::FitQuality {trajState.chi2Sum, static_cast<double>(trajState.nMeasurements - 5)};
+  Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon);
+  std::unique_ptr<DataVector<const Trk::TrackStateOnSurface>> sink(finalTrajectory);
+  // newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), quality);
+  Trk::Track* tmpTrack = new Trk::Track(newInfo, std::move(*sink), q);
+  newtrack = std::unique_ptr<Trk::Track>(tmpTrack);
+  return newtrack;
+}
+
+
+const Trk::TrackParameters*
+CreateTrkTrackTool::ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const {
+  using namespace Acts::UnitLiterals;
+  std::optional<AmgSymMatrix(5)> cov = std::nullopt;
+  if (actsParameter.covariance()){
+    AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner(5, 5));
+    // Convert the covariance matrix to GeV
+    for(int i=0; i < newcov.rows(); i++){
+      newcov(i, 4) = newcov(i, 4)*1_MeV;
+    }
+    for(int i=0; i < newcov.cols(); i++){
+      newcov(4, i) = newcov(4, i)*1_MeV;
+    }
+    cov =  std::optional<AmgSymMatrix(5)>(newcov);
+  }
+  const Amg::Vector3D& pos=actsParameter.position(gctx);
+  double tphi=actsParameter.get<Acts::eBoundPhi>();
+  double ttheta=actsParameter.get<Acts::eBoundTheta>();
+  double tqOverP=actsParameter.get<Acts::eBoundQOverP>()*1_MeV;
+  double p = std::abs(1. / tqOverP);
+  Amg::Vector3D tmom(p * std::cos(tphi) * std::sin(ttheta), p * std::sin(tphi) * std::sin(ttheta), p * std::cos(ttheta));
+  double charge = tqOverP > 0. ? 1. : -1.;
+  const Trk::CurvilinearParameters * curv = new Trk::CurvilinearParameters(pos,tmom,charge, cov);
+  return curv;
+}
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..d0edfd5cb9aedb78d7fde03104377f3ff9aa5d1f
--- /dev/null
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.h
@@ -0,0 +1,27 @@
+#ifndef FASERACTSKALMANFILTER_CREATETRKTRACKTOOL_H
+#define FASERACTSKALMANFILTER_CREATETRKTRACKTOOL_H
+
+#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "TrkTrack/Track.h"
+#include "TrkParameters/TrackParameters.h"
+#include "Acts/Geometry/GeometryContext.hpp"
+#include "Acts/EventData/TrackParameters.hpp"
+#include "FaserActsRecMultiTrajectory.h"
+
+
+class FaserSCT_ID;
+
+class CreateTrkTrackTool: public AthAlgTool {
+public:
+  CreateTrkTrackTool(const std::string &type, const std::string &name, const IInterface *parent);
+  virtual ~CreateTrkTrackTool() = default;
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  std::unique_ptr<Trk::Track> createTrack(const Acts::GeometryContext &gctx, const FaserActsRecMultiTrajectory &traj) const;
+  const Trk::TrackParameters* ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const;
+private:
+  const FaserSCT_ID* m_idHelper {nullptr};
+};
+
+#endif //FASERACTSKALMANFILTER_CREATETRKTRACKTOOL_H
\ No newline at end of file
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.cxx
index 6bb846781ad859824897eed70486cea903897a66..051687e21c6d0b1c1874a26ac4ddeb5d55c55124 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.cxx
@@ -19,6 +19,7 @@ KalmanFitterTool::KalmanFitterTool(const std::string& type, const std::string& n
 StatusCode KalmanFitterTool::initialize() {
   ATH_CHECK(m_fieldCondObjInputKey.initialize());
   ATH_CHECK(m_trackingGeometryTool.retrieve());
+  ATH_CHECK(m_createTrkTrackTool.retrieve());
   ATH_CHECK(detStore()->retrieve(m_idHelper,"FaserSCT_ID"));
   if (m_statesWriter && !m_noDiagnostics) ATH_CHECK(m_trajectoryStatesWriterTool.retrieve());
   if (m_summaryWriter && !m_noDiagnostics) ATH_CHECK(m_trajectorySummaryWriterTool.retrieve());
@@ -39,18 +40,18 @@ StatusCode KalmanFitterTool::finalize() {
 }
 
 std::unique_ptr<Trk::Track>
-KalmanFitterTool::fit(const EventContext &ctx, const Acts::GeometryContext &gctx, const Trk::Track &inputTrack,
-                      std::vector<FaserActsRecMultiTrajectory> & /*trajectories*/,
-                      const Acts::BoundVector& inputVector, bool isMC, double origin) const {
+KalmanFitterTool::fit(const EventContext &ctx, const Acts::GeometryContext &gctx,
+                      Trk::Track* inputTrack, const Acts::BoundVector& inputVector,
+                      bool isMC, double origin) const {
   std::unique_ptr<Trk::Track> newTrack = nullptr;
   std::vector<FaserActsRecMultiTrajectory> myTrajectories;
 
-  if (!inputTrack.measurementsOnTrack() || inputTrack.measurementsOnTrack()->size() < m_minMeasurements) {
+  if (!inputTrack->measurementsOnTrack() || inputTrack->measurementsOnTrack()->size() < m_minMeasurements) {
     ATH_MSG_DEBUG("Input track has no or too little measurements and cannot be fitted");
     return nullptr;
   }
 
-  if (!inputTrack.trackParameters() || inputTrack.trackParameters()->empty()) {
+  if (!inputTrack->trackParameters() || inputTrack->trackParameters()->empty()) {
     ATH_MSG_DEBUG("Input track has no track parameters and cannot be fitted");
     return nullptr;
   }
@@ -63,7 +64,7 @@ KalmanFitterTool::fit(const EventContext &ctx, const Acts::GeometryContext &gctx
   Acts::CalibrationContext calibContext = Acts::CalibrationContext();
 
   auto [sourceLinks, measurements] = getMeasurementsFromTrack(inputTrack);
-  auto trackParameters = getParametersFromTrack(inputTrack.trackParameters()->front(), inputVector, origin);
+  auto trackParameters = getParametersFromTrack(inputTrack->trackParameters()->front(), inputVector, origin);
   ATH_MSG_DEBUG("trackParameters: " << trackParameters.parameters().transpose());
   ATH_MSG_DEBUG("position: " << trackParameters.position(gctx).transpose());
   ATH_MSG_DEBUG("momentum: " << trackParameters.momentum().transpose());
@@ -103,7 +104,7 @@ KalmanFitterTool::fit(const EventContext &ctx, const Acts::GeometryContext &gctx
     } else {
       ATH_MSG_DEBUG("No fitted parameters for track");
     }
-    newTrack = makeTrack(gctx, result);
+    newTrack = m_createTrkTrackTool->createTrack(gctx, myTrajectories.back());
   }
 
   if (m_statesWriter && !m_noDiagnostics) {
@@ -172,7 +173,7 @@ Acts::MagneticFieldContext KalmanFitterTool::getMagneticFieldContext(const Event
 
 
 std::tuple<std::vector<IndexSourceLink>, std::vector<Measurement>>
-KalmanFitterTool::getMeasurementsFromTrack(const Trk::Track &track) const {
+KalmanFitterTool::getMeasurementsFromTrack(Trk::Track *track) const {
   const int kSize = 1;
   std::array<Acts::BoundIndices, kSize> Indices = {Acts::eBoundLoc0};
   using ThisMeasurement = Acts::Measurement<IndexSourceLink, Acts::BoundIndices, kSize>;
@@ -181,7 +182,7 @@ KalmanFitterTool::getMeasurementsFromTrack(const Trk::Track &track) const {
   std::shared_ptr<IdentifierMap> identifierMap = m_trackingGeometryTool->getIdentifierMap();
   std::vector<IndexSourceLink> sourceLinks;
   std::vector<Measurement> measurements;
-  for (const Trk::MeasurementBase *meas : *track.measurementsOnTrack()) {
+  for (const Trk::MeasurementBase *meas : *track->measurementsOnTrack()) {
     const auto* clusterOnTrack = dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(meas);
     const Tracker::FaserSCT_Cluster* cluster = clusterOnTrack->prepRawData();
     if (clusterOnTrack) {
@@ -241,113 +242,3 @@ KalmanFitterTool::getParametersFromTrack(const Trk::TrackParameters *inputParame
 
   return Acts::BoundTrackParameters(pSurface, params, inputParameters->charge(), cov);
 }
-
-
-std::unique_ptr<Trk::Track>
-KalmanFitterTool::makeTrack(const Acts::GeometryContext &geoCtx, TrackFitterResult& fitResult) const {
-  using ConstTrackStateProxy =
-      Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>;
-  std::unique_ptr<Trk::Track> newtrack = nullptr;
-  //Get the fit output object
-  const auto& fitOutput = fitResult.value();
-  if (fitOutput.fittedParameters) {
-    DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{};
-    std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam;
-    // Loop over all the output state to create track state
-    fitOutput.fittedStates.visitBackwards(fitOutput.lastMeasurementIndex, [&](const ConstTrackStateProxy& state) {
-      auto flag = state.typeFlags();
-      if (state.referenceSurface().associatedDetectorElement() != nullptr) {
-        // We need to determine the type of state
-        std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
-        const Trk::TrackParameters *parm;
-
-        // State is a hole (no associated measurement), use predicted para meters
-        if (flag[Acts::TrackStateFlag::HoleFlag] == true) {
-          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                     state.predicted(),
-                                                     state.predictedCovariance());
-          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-          // auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*p arm);
-          typePattern.set(Trk::TrackStateOnSurface::Hole);
-        }
-          // The state was tagged as an outlier, use filtered parameters
-        else if (flag[Acts::TrackStateFlag::OutlierFlag] == true) {
-          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                     state.filtered(), state.filteredCovariance());
-          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-          typePattern.set(Trk::TrackStateOnSurface::Outlier);
-        }
-          // The state is a measurement state, use smoothed parameters
-        else {
-          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                     state.smoothed(), state.smoothedCovariance());
-          actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam)));
-          //  const auto& psurface=actsParam.referenceSurface();
-          // Acts::Vector2 local(actsParam.parameters()[Acts::eBoundLoc0], actsParam.parameters()[Acts::eBoundLoc1]);
-          //  const Acts::Vector3 dir = Acts::makeDirectionUnitFromPhiTheta(actsParam.parameters()[Acts::eBoundPhi], actsParam.parameters()[Acts::eBoundTheta]);
-          //  auto pos=actsParam.position(tgContext);
-          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
-          typePattern.set(Trk::TrackStateOnSurface::Measurement);
-        }
-        Tracker::FaserSCT_ClusterOnTrack* measState = nullptr;
-        if (state.hasUncalibrated()) {
-          const Tracker::FaserSCT_Cluster* fitCluster = state.uncalibrated().hit();
-          if (fitCluster->detectorElement() != nullptr) {
-            measState = new Tracker::FaserSCT_ClusterOnTrack{
-                fitCluster,
-                Trk::LocalParameters{
-                    Trk::DefinedParameter{fitCluster->localPosition()[0], Trk::loc1},
-                    Trk::DefinedParameter{fitCluster->localPosition()[1], Trk::loc2}
-                },
-                fitCluster->localCovariance(),
-                m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())
-            };
-          }
-        }
-        double nDoF = state.calibratedSize();
-        const Trk::FitQualityOnSurface *quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF);
-        const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(measState, parm, quality, nullptr, typePattern);
-        // If a state was successfully created add it to the trajectory
-        if (perState) {
-          finalTrajectory->insert(finalTrajectory->begin(), perState);
-        }
-      }
-      return;
-    });
-
-    // Create the track using the states
-    const Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon);
-    // Trk::FitQuality* q = nullptr;
-    // newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::KalmanFitter     ); //Mark the fitter as KalmanFitter
-    newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), nullptr);
-  }
-  return newtrack;
-}
-
-
-const Trk::TrackParameters*
-KalmanFitterTool::ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const {
-  using namespace Acts::UnitLiterals;
-  std::optional<AmgSymMatrix(5)> cov = std::nullopt;
-  if (actsParameter.covariance()){
-    AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner(5, 5));
-    // Convert the covariance matrix to GeV
-    for(int i=0; i < newcov.rows(); i++){
-      newcov(i, 4) = newcov(i, 4)*1_MeV;
-    }
-    for(int i=0; i < newcov.cols(); i++){
-      newcov(4, i) = newcov(4, i)*1_MeV;
-    }
-    cov =  std::optional<AmgSymMatrix(5)>(newcov);
-  }
-  const Amg::Vector3D& pos=actsParameter.position(gctx);
-  double tphi=actsParameter.get<Acts::eBoundPhi>();
-  double ttheta=actsParameter.get<Acts::eBoundTheta>();
-  double tqOverP=actsParameter.get<Acts::eBoundQOverP>()*1_MeV;
-  double p = std::abs(1. / tqOverP);
-  Amg::Vector3D tmom(p * std::cos(tphi) * std::sin(ttheta), p * std::sin(tphi) * std::sin(ttheta), p * std::cos(ttheta));
-  double charge = tqOverP > 0. ? 1. : -1.;
-  const Trk::CurvilinearParameters * curv = new Trk::CurvilinearParameters(pos,tmom,charge, cov);
-  return curv;
-}
-
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.h
index 9ed5b212266e29b0d6155bed1580a2c0397e036c..0894e3ab2139decc1f0950a89f6200dc9ea2930f 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/KalmanFitterTool.h
@@ -13,6 +13,8 @@
 #include "RootTrajectoryStatesWriterTool.h"
 #include "RootTrajectorySummaryWriterTool.h"
 #include "TrkTrack/Track.h"
+#include "TrkTrack/TrackCollection.h"
+#include "CreateTrkTrackTool.h"
 
 
 class FaserSCT_ID;
@@ -38,16 +40,16 @@ public:
   };
   static std::shared_ptr<TrackFitterFunction> makeTrackFitterFunction(
       std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry);
-
   virtual Acts::MagneticFieldContext getMagneticFieldContext(const EventContext& ctx) const;
-  std::unique_ptr<Trk::Track> fit(const EventContext &ctx, const Acts::GeometryContext &gctx, const Trk::Track &inputTrack,
-                        std::vector<FaserActsRecMultiTrajectory> & /*trajectories*/,
-                        const Acts::BoundVector& inputVector = Acts::BoundVector::Zero(), bool isMC=false, double origin=0) const;
+  std::unique_ptr<Trk::Track> fit(const EventContext &ctx, const Acts::GeometryContext &gctx,
+                                  Trk::Track *inputTrack,
+                                  const Acts::BoundVector& inputVector = Acts::BoundVector::Zero(),
+                                  bool isMC=false, double origin=0) const;
 
 private:
   const FaserSCT_ID* m_idHelper {nullptr};
   std::tuple<std::vector<IndexSourceLink>, std::vector<Measurement>>
-  getMeasurementsFromTrack(const Trk::Track &track) const;
+  getMeasurementsFromTrack(Trk::Track *track) const;
   // Acts::BoundTrackParameters getParametersFromTrack(const Acts::BoundVector& params, const Trk::TrackParameters *inputParameters) const;
   Acts::BoundTrackParameters getParametersFromTrack(const Trk::TrackParameters *inputParameters, const Acts::BoundVector& inputVector, double origin) const;
   std::shared_ptr<TrackFitterFunction> m_fit;
@@ -64,9 +66,7 @@ private:
   ToolHandle<IFaserActsTrackingGeometryTool> m_trackingGeometryTool {this, "TrackingGeometryTool", "FaserActsTrackingGeometryTool"};
   ToolHandle<RootTrajectoryStatesWriterTool> m_trajectoryStatesWriterTool {this, "RootTrajectoryStatesWriterTool", "RootTrajectoryStatesWriterTool"};
   ToolHandle<RootTrajectorySummaryWriterTool> m_trajectorySummaryWriterTool {this, "RootTrajectorySummaryWriterTool", "RootTrajectorySummaryWriterTool"};
-  std::unique_ptr<Trk::Track> makeTrack(const Acts::GeometryContext &gctx, TrackFitterResult& fitResult) const;
-  const Trk::TrackParameters* ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const;
+  ToolHandle<CreateTrkTrackTool> m_createTrkTrackTool {this, "CreateTrkTrackTool", "CreateTrkTrackTool"};
 };
 
 #endif //FASERACTSKALMANFILTER_KALMANFITTERTOOL_H
-
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx
index dae1d0d17b2e1d86a3b16f813dcd1a54d46735bd..967f80641f7846d303be4632c252ca30eaab6436 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx
@@ -28,6 +28,7 @@
 #include "../SeedingAlg.h"
 #include "../CircleFitTrackSeedTool.h"
 #include "../GhostBusters.h"
+#include "../CreateTrkTrackTool.h"
 
 DECLARE_COMPONENT(FaserActsKalmanFilterAlg)
 DECLARE_COMPONENT(CombinatorialKalmanFilterAlg)
@@ -55,3 +56,4 @@ DECLARE_COMPONENT(MyTrackSeedTool)
 DECLARE_COMPONENT(SeedingAlg)
 DECLARE_COMPONENT(CircleFitTrackSeedTool)
 DECLARE_COMPONENT(GhostBusters)
+DECLARE_COMPONENT(CreateTrkTrackTool)
diff --git a/Tracking/Acts/FaserActsKalmanFilter/test/CKF2.py b/Tracking/Acts/FaserActsKalmanFilter/test/CKF2.py
index afcef75d6ce5d335da6504c21ddf44ae8fc507e2..5585743c64083743a9cef6651b8099a13bc3046c 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/test/CKF2.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/test/CKF2.py
@@ -8,6 +8,7 @@ from CalypsoConfiguration.AllConfigFlags import ConfigFlags
 from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
 from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
 from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg
 from TrackerSpacePointFormation.TrackerSpacePointFormationConfig import TrackerSpacePointFinderCfg
 from TrackerSegmentFit.TrackerSegmentFitConfig import SegmentFitAlgCfg
@@ -30,11 +31,12 @@ ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-02"
 ConfigFlags.GeoModel.FaserVersion = "FASERNU-03"
 ConfigFlags.GeoModel.Align.Dynamic = False
 ConfigFlags.Beam.NumberOfCollisions = 0.
-ConfigFlags.TrackingGeometry.MaterialSource = "Input"
+ConfigFlags.TrackingGeometry.MaterialSource = "geometry-maps.json"
 ConfigFlags.Input.isMC = True
 ConfigFlags.lock()
 
 acc = MainServicesCfg(ConfigFlags)
+acc.merge(FaserGeometryCfg(ConfigFlags))
 acc.merge(PoolReadCfg(ConfigFlags))
 acc.merge(PoolWriteCfg(ConfigFlags))
 
diff --git a/Tracking/Acts/FaserActsKalmanFilter/test/TI12CKF2.py b/Tracking/Acts/FaserActsKalmanFilter/test/TI12CKF2.py
index f6c5a5af53581d986d57ee32ad2e4d5706c6f6e1..fffb07177a028816aa47fea33d0521692c6cc2f3 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/test/TI12CKF2.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/test/TI12CKF2.py
@@ -8,6 +8,7 @@ from CalypsoConfiguration.AllConfigFlags import ConfigFlags
 from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
 # from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
 from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
 from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg
 from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg
@@ -31,10 +32,11 @@ ConfigFlags.Common.isOnline = False
 ConfigFlags.GeoModel.Align.Dynamic = False
 ConfigFlags.Beam.NumberOfCollisions = 0.
 ConfigFlags.Detector.GeometryFaserSCT = True
-ConfigFlags.TrackingGeometry.MaterialSource = "Input"
+ConfigFlags.TrackingGeometry.MaterialSource = "geometry-maps.json"
 ConfigFlags.lock()
 
 acc = MainServicesCfg(ConfigFlags)
+acc.merge(FaserGeometryCfg(ConfigFlags))
 acc.merge(PoolWriteCfg(ConfigFlags))
 acc.merge(FaserByteStreamCnvSvcCfg(ConfigFlags))
 acc.merge(FaserSCT_ClusterizationCfg(ConfigFlags, DataObjectName="SCT_LEVELMODE_RDOs", ClusterToolTimingPattern="X1X"))