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"))