From 4f60588fce61904e61a17ecb4c30801df386b805 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 21 Mar 2025 18:36:48 +0100 Subject: [PATCH 01/68] Add a --native option and code to use the algorithms in k4Reco --- CLDConfig/CLDReconstruction.py | 1 + CLDConfig/Tracking/ConformalTracking.py | 366 +++++++++++++++++++----- CLDConfig/Tracking/Refit.py | 51 ++-- CLDConfig/Tracking/TrackingDigi.py | 229 +++++++++------ CLDConfig/Tracking/TruthTracking.py | 41 ++- 5 files changed, 508 insertions(+), 180 deletions(-) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index bff1191..4c10b94 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -33,6 +33,7 @@ parser_group.add_argument("--enableLCFIJet", action="store_true", help="Enable LCFIPlus jet clustering parts", default=False) parser_group.add_argument("--cms", action="store", help="Choose a Centre-of-Mass energy", default=240, choices=(91, 160, 240, 365), type=int) parser_group.add_argument("--compactFile", help="Compact detector file to use", type=str, default=os.environ["K4GEO"] + "/FCCee/CLD/compact/CLD_o2_v07/CLD_o2_v07.xml") +parser_group.add_argument("--native", action="store_true", help="Use the native EDM4hep tracking", default=False) tracking_group = parser_group.add_mutually_exclusive_group() tracking_group.add_argument("--conformalTracking", action="store_true", default=True, help="Use conformal tracking pattern recognition") tracking_group.add_argument("--truthTracking", action="store_true", default=False, help="Cheat tracking pattern recognition") diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index b712f7a..6090a94 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -28,77 +28,303 @@ else: raise RuntimeError("Unknown detector model to chose CT_MAX_DISTANCE") -MyConformalTracking = MarlinProcessorWrapper("MyConformalTracking") -MyConformalTracking.OutputLevel = WARNING -MyConformalTracking.ProcessorType = "ConformalTrackingV2" -MyConformalTracking.Parameters = { - "DebugHits": ["DebugHits"], - "DebugPlots": ["false"], - "DebugTiming": ["false"], - "MCParticleCollectionName": ["MCParticle"], - "MaxHitInvertedFit": ["0"], - "MinClustersOnTrackAfterFit": ["3"], - "RelationsNames": ["VXDTrackerHitRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], - "RetryTooManyTracks": ["false"], - "SiTrackCollectionName": ["SiTracksCT"], - "SortTreeResults": ["true"], - "Steps": - [ - "[VXDBarrel]", - "@Collections", ":", "VXDTrackerHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.01;", "MaxCellAngleRZ", ":", "0.01;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker", - "@Functions", ":", "CombineCollections,", "BuildNewTracks", - "[VXDEncap]", - "@Collections", ":", "VXDEndcapTrackerHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.01;", "MaxCellAngleRZ", ":", "0.01;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker", - "@Functions", ":", "CombineCollections,", "ExtendTracks", - "[LowerCellAngle1]", - "@Collections", ":", "VXDTrackerHits,", "VXDEndcapTrackerHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.05;", "MaxCellAngleRZ", ":", "0.05;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", - "@Functions", ":", "CombineCollections,", "BuildNewTracks", - "[LowerCellAngle2]", - "@Collections", ":", - "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "2000;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", - "@Functions", ":", "BuildNewTracks,", "SortTracks", - "[Tracker]", - "@Collections", ":", "ITrackerHits,", "OTrackerHits,", "ITrackerEndcapHits,", "OTrackerEndcapHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "2000;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "1.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", - "@Functions", ":", "CombineCollections,", "ExtendTracks", - "[Displaced]", - "@Collections", ":", "VXDTrackerHits,", "VXDEndcapTrackerHits,", "ITrackerHits,", "OTrackerHits,", "ITrackerEndcapHits,", "OTrackerEndcapHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "1000;", "MinClustersOnTrack", ":", "5;", "MaxDistance", ":", "0.015;", "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "OnlyZSchi2cut,", "RadialSearch", - "@Functions", ":", "CombineCollections,", "BuildNewTracks" - ], - "ThetaRange": ["0.05"], - "TooManyTracks": ["100000"], - "TrackerHitCollectionNames": ["VXDTrackerHits", "VXDEndcapTrackerHits", "ITrackerHits", "OTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], - "trackPurity": ["0.7"] - } - -ClonesAndSplitTracksFinder = MarlinProcessorWrapper("ClonesAndSplitTracksFinder") -ClonesAndSplitTracksFinder.OutputLevel = WARNING -ClonesAndSplitTracksFinder.ProcessorType = "ClonesAndSplitTracksFinder" -ClonesAndSplitTracksFinder.Parameters = { - "EnergyLossOn": ["true"], - "InputTrackCollectionName": ["SiTracksCT"], - "MultipleScatteringOn": ["true"], - "OutputTrackCollectionName": ["SiTracks"], - "SmoothOn": ["false"], - "extrapolateForward": ["true"], - "maxSignificancePhi": ["3"], - "maxSignificancePt": ["2"], - "maxSignificanceTheta": ["3"], - "mergeSplitTracks": ["false"], - "minTrackPt": ["1"] - } +from k4FWCore.parseArgs import parser +args = parser.parse_known_args() + +collections = [ + ["VXDTrackerHits"], + ["VXDEndcapTrackerHits"], + ["VXDTrackerHits", "VXDEndcapTrackerHits"], + [], + ["ITrackerHits", "OTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], + [ + "VXDTrackerHits", + "VXDEndcapTrackerHits", + "ITrackerHits", + "OTrackerHits", + "ITrackerEndcapHits", + "OTrackerEndcapHits", + ], +] +params = [ + [ + "MaxCellAngle", + ":", + "0.01;", + "MaxCellAngleRZ", + ":", + "0.01;", + "Chi2Cut", + ":", + "100;", + "MinClustersOnTrack", + ":", + "4;", + "MaxDistance", + ":", + CT_MAX_DIST, + "SlopeZRange", + "10.0;", + "HighPTCut", + "10.0;", + ], + [ + "MaxCellAngle", + ":", + "0.01;", + "MaxCellAngleRZ", + ":", + "0.01;", + "Chi2Cut", + ":", + "100;", + "MinClustersOnTrack", + ":", + "4;", + "MaxDistance", + ":", + CT_MAX_DIST, + "SlopeZRange", + "10.0;", + "HighPTCut", + "10.0;", + ], + [ + "MaxCellAngle", + ":", + "0.05;", + "MaxCellAngleRZ", + ":", + "0.05;", + "Chi2Cut", + ":", + "100;", + "MinClustersOnTrack", + ":", + "4;", + "MaxDistance", + ":", + CT_MAX_DIST, + "SlopeZRange", + "10.0;", + "HighPTCut", + "10.0;", + ], + [ + "MaxCellAngle", + ":", + "0.1;", + "MaxCellAngleRZ", + ":", + "0.1;", + "Chi2Cut", + ":", + "2000;", + "MinClustersOnTrack", + ":", + "4;", + "MaxDistance", + ":", + CT_MAX_DIST, + "SlopeZRange", + "10.0;", + "HighPTCut", + "10.0;", + ], + [ + "MaxCellAngle", + ":", + "0.1;", + "MaxCellAngleRZ", + ":", + "0.1;", + "Chi2Cut", + ":", + "2000;", + "MinClustersOnTrack", + ":", + "4;", + "MaxDistance", + ":", + CT_MAX_DIST, + "SlopeZRange", + "10.0;", + "HighPTCut", + "1.0;", + ], + [ + "MaxCellAngle", + ":", + "0.1;", + "MaxCellAngleRZ", + ":", + "0.1;", + "Chi2Cut", + ":", + "1000;", + "MinClustersOnTrack", + ":", + "5;", + "MaxDistance", + ":", + "0.015;", + "SlopeZRange", + "10.0;", + "HighPTCut", + "10.0;", + ], +] +flags = [ + ["HighPTFit", "VertexToTracker"], + ["HighPTFit", "VertexToTracker"], + ["HighPTFit", "VertexToTracker", "RadialSearch"], + ["HighPTFit", "VertexToTracker", "RadialSearch"], + ["HighPTFit", "VertexToTracker", "RadialSearch"], + ["OnlyZSchi2cut", "RadialSearch"], +] +functions = [ + [ + "CombineCollections", + "BuildNewTracks", + ], + [ + "CombineCollections", + "ExtendTracks", + ], + [ + "CombineCollections", + "BuildNewTracks", + ], + [ + "BuildNewTracks", + "SortTracks", + ], + [ + "CombineCollections", + "ExtendTracks", + ], + [ + "CombineCollections", + "BuildNewTracks", + ], +] + +names = [] +values = [] +for ls in params: + current_names = [] + current_values = [] + ls = [x for x in ls if x != ":"] + for i in range(0, len(ls), 2): + current_names.append(ls[i]) + current_values.append(float(ls[i + 1].replace(";", ""))) + names.append(current_names) + values.append(current_values) + +conformal_tracking_args = { + "DebugHits": ["DebugHits"], + "DebugPlots": False, + "DebugTiming": False, + "MCParticleCollectionName": ["MCParticle"], + "MaxHitInvertedFit": 0, + "MinClustersOnTrackAfterFit": 3, + "RelationsNames": ["VXDTrackerHitRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], + "RetryTooManyTracks": False, + "SiTrackCollectionName": ["SiTracksCT"], + "SortTreeResults": True, + "Steps": + [ + "[VXDBarrel]", + "@Collections", ":", "VXDTrackerHits", + "@Parameters", ":", "MaxCellAngle", ":", "0.01;", "MaxCellAngleRZ", ":", "0.01;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", + "@Flags", ":", "HighPTFit,", "VertexToTracker", + "@Functions", ":", "CombineCollections,", "BuildNewTracks", + "[VXDEncap]", + "@Collections", ":", "VXDEndcapTrackerHits", + "@Parameters", ":", "MaxCellAngle", ":", "0.01;", "MaxCellAngleRZ", ":", "0.01;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", + "@Flags", ":", "HighPTFit,", "VertexToTracker", + "@Functions", ":", "CombineCollections,", "ExtendTracks", + "[LowerCellAngle1]", + "@Collections", ":", "VXDTrackerHits,", "VXDEndcapTrackerHits", + "@Parameters", ":", "MaxCellAngle", ":", "0.05;", "MaxCellAngleRZ", ":", "0.05;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", + "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", + "@Functions", ":", "CombineCollections,", "BuildNewTracks", + "[LowerCellAngle2]", + "@Collections", ":", + "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "2000;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", + "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", + "@Functions", ":", "BuildNewTracks,", "SortTracks", + "[Tracker]", + "@Collections", ":", "ITrackerHits,", "OTrackerHits,", "ITrackerEndcapHits,", "OTrackerEndcapHits", + "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "2000;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "1.0;", + "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", + "@Functions", ":", "CombineCollections,", "ExtendTracks", + "[Displaced]", + "@Collections", ":", "VXDTrackerHits,", "VXDEndcapTrackerHits,", "ITrackerHits,", "OTrackerHits,", "ITrackerEndcapHits,", "OTrackerEndcapHits", + "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "1000;", "MinClustersOnTrack", ":", "5;", "MaxDistance", ":", "0.015;", "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", + "@Flags", ":", "OnlyZSchi2cut,", "RadialSearch", + "@Functions", ":", "CombineCollections,", "BuildNewTracks" + ], + "ThetaRange": 0.05, + "TooManyTracks": 100000, + "TrackerHitCollectionNames": ["VXDTrackerHits", "VXDEndcapTrackerHits", "ITrackerHits", "OTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], + "trackPurity": 0.7 +} + +conformal_tracking_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in conformal_tracking_args.items()} +conformal_tracking_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in conformal_tracking_args_marlin.items()} + +conformal_tracking_args.pop("Steps") +conformal_tracking_args["stepCollections"] = collections +conformal_tracking_args["stepParametersNames"] = names +conformal_tracking_args["stepParametersValues"] = values +conformal_tracking_args["stepParametersFlags"] = flags +conformal_tracking_args["stepParametersFunctions"] = functions + +clones_and_split_tracks_finder_args = { + "EnergyLossOn": True, + "InputTrackCollectionName": ["SiTracksCT"], + "MultipleScatteringOn": True, + "OutputTrackCollectionName": ["SiTracks"], + "SmoothOn": False, + "extrapolateForward": True, + "maxSignificancePhi": 3., + "maxSignificancePt": 2., + "maxSignificanceTheta": 3., + "mergeSplitTracks": False, + "minTrackPt": 1., + "OutputLevel": WARNING, +} + +clone_and_split_tracks_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in clones_and_split_tracks_finder_args.items()} +clone_and_split_tracks_finder_args_marlin = {k: [str(v)] if isinstance(v, float) else v for k, v in clone_and_split_tracks_finder_args_marlin.items()} + +if args.native: + from Configurables import ConformalTracking, ClonesAndSplitTracksFinder + + MyConformalTracking = ConformalTracking( + "ConformalTracking", + **conformal_tracking_args + ) + + clones_and_split_tracks_finder = ClonesAndSplitTracksFinder( + "ClonesAndSplitTracksFinder", + **clones_and_split_tracks_finder_args + ) + +else: + from Configurables import MarlinProcessorWrapper + MyConformalTracking = MarlinProcessorWrapper("MyConformalTracking") + MyConformalTracking.OutputLevel = WARNING + MyConformalTracking.ProcessorType = "ConformalTrackingV2" + MyConformalTracking.Parameters = conformal_tracking_args_marlin + + clones_and_split_tracks_finder = MarlinProcessorWrapper("ClonesAndSplitTracksFinder") + clones_and_split_tracks_finder.OutputLevel = WARNING + clones_and_split_tracks_finder.ProcessorType = "ClonesAndSplitTracksFinder" + clones_and_split_tracks_finder.Parameters = clone_and_split_tracks_finder_args_marlin ConformalTrackingSequence = [ MyConformalTracking, - ClonesAndSplitTracksFinder, + clones_and_split_tracks_finder, ] diff --git a/CLDConfig/Tracking/Refit.py b/CLDConfig/Tracking/Refit.py index f50da2d..bebe217 100644 --- a/CLDConfig/Tracking/Refit.py +++ b/CLDConfig/Tracking/Refit.py @@ -17,25 +17,42 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper +from k4FWCore.parseArgs import parser +args = parser.parse_known_args() +refit_args = { + "EnergyLossOn": True, + "InputRelationCollectionName": ["SiTrackRelations"], + "InputTrackCollectionName": ["SiTracks"], + "Max_Chi2_Incr": 1.79769e30, + "MinClustersOnTrackAfterFit": 3, + "MultipleScatteringOn": True, + "OutputRelationCollectionName": ["SiTracks_Refitted_Relation"], + "OutputTrackCollectionName": ["SiTracks_Refitted"], + "ReferencePoint": -1, + "SmoothOn": False, + "extrapolateForward": True, + "OutputLevel": WARNING, +} -Refit = MarlinProcessorWrapper("Refit") -Refit.OutputLevel = WARNING -Refit.ProcessorType = "RefitFinal" -Refit.Parameters = { - "EnergyLossOn": ["true"], - "InputRelationCollectionName": ["SiTrackRelations"], - "InputTrackCollectionName": ["SiTracks"], - "Max_Chi2_Incr": ["1.79769e+30"], - "MinClustersOnTrackAfterFit": ["3"], - "MultipleScatteringOn": ["true"], - "OutputRelationCollectionName": ["SiTracks_Refitted_Relation"], - "OutputTrackCollectionName": ["SiTracks_Refitted"], - "ReferencePoint": ["-1"], - "SmoothOn": ["false"], - "extrapolateForward": ["true"] - } +refit_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in refit_args.items()} +refit_args_marlin = {k: [str(v)] if isinstance(v, float) else v for k, v in refit_args_marlin.items()} + + +if args.native: + from Configurables import RefitFinal + + Refit = RefitFinal( + "RefitFinal", + **refit_args + ) +else: + from Configurables import MarlinProcessorWrapper + + Refit = MarlinProcessorWrapper("Refit") + Refit.OutputLevel = WARNING + Refit.ProcessorType = "RefitFinal" + Refit.Parameters = refit_args_marlin RefitSequence = [ Refit, diff --git a/CLDConfig/Tracking/TrackingDigi.py b/CLDConfig/Tracking/TrackingDigi.py index 5d352ea..d6569e0 100644 --- a/CLDConfig/Tracking/TrackingDigi.py +++ b/CLDConfig/Tracking/TrackingDigi.py @@ -17,86 +17,155 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper - - -VXDBarrelDigitiser = MarlinProcessorWrapper("VXDBarrelDigitiser") -VXDBarrelDigitiser.OutputLevel = WARNING -VXDBarrelDigitiser.ProcessorType = "DDPlanarDigiProcessor" -VXDBarrelDigitiser.Parameters = { - "IsStrip": ["false"], - "ResolutionU": ["0.003", "0.003", "0.003", "0.003", "0.003", "0.003"], - "ResolutionV": ["0.003", "0.003", "0.003", "0.003", "0.003", "0.003"], - "SimTrackHitCollectionName": ["VertexBarrelCollection"], - "SimTrkHitRelCollection": ["VXDTrackerHitRelations"], - "SubDetectorName": ["Vertex"], - "TrackerHitCollectionName": ["VXDTrackerHits"] - } - -VXDEndcapDigitiser = MarlinProcessorWrapper("VXDEndcapDigitiser") -VXDEndcapDigitiser.OutputLevel = WARNING -VXDEndcapDigitiser.ProcessorType = "DDPlanarDigiProcessor" -VXDEndcapDigitiser.Parameters = { - "IsStrip": ["false"], - "ResolutionU": ["0.003", "0.003", "0.003", "0.003", "0.003", "0.003"], - "ResolutionV": ["0.003", "0.003", "0.003", "0.003", "0.003", "0.003"], - "SimTrackHitCollectionName": ["VertexEndcapCollection"], - "SimTrkHitRelCollection": ["VXDEndcapTrackerHitRelations"], - "SubDetectorName": ["Vertex"], - "TrackerHitCollectionName": ["VXDEndcapTrackerHits"] - } - -InnerPlanarDigiProcessor = MarlinProcessorWrapper("InnerPlanarDigiProcessor") -InnerPlanarDigiProcessor.OutputLevel = WARNING -InnerPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" -InnerPlanarDigiProcessor.Parameters = { - "IsStrip": ["false"], - "ResolutionU": ["0.007"], - "ResolutionV": ["0.09"], - "SimTrackHitCollectionName": ["InnerTrackerBarrelCollection"], - "SimTrkHitRelCollection": ["InnerTrackerBarrelHitsRelations"], - "SubDetectorName": ["InnerTrackers"], - "TrackerHitCollectionName": ["ITrackerHits"] - } - -InnerEndcapPlanarDigiProcessor = MarlinProcessorWrapper("InnerEndcapPlanarDigiProcessor") -InnerEndcapPlanarDigiProcessor.OutputLevel = WARNING -InnerEndcapPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" -InnerEndcapPlanarDigiProcessor.Parameters = { - "IsStrip": ["false"], - "ResolutionU": ["0.005", "0.007", "0.007", "0.007", "0.007", "0.007", "0.007"], - "ResolutionV": ["0.005", "0.09", "0.09", "0.09", "0.09", "0.09", "0.09"], - "SimTrackHitCollectionName": ["InnerTrackerEndcapCollection"], - "SimTrkHitRelCollection": ["InnerTrackerEndcapHitsRelations"], - "SubDetectorName": ["InnerTrackers"], - "TrackerHitCollectionName": ["ITrackerEndcapHits"] - } - -OuterPlanarDigiProcessor = MarlinProcessorWrapper("OuterPlanarDigiProcessor") -OuterPlanarDigiProcessor.OutputLevel = WARNING -OuterPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" -OuterPlanarDigiProcessor.Parameters = { - "IsStrip": ["false"], - "ResolutionU": ["0.007", "0.007", "0.007"], - "ResolutionV": ["0.09", "0.09", "0.09"], - "SimTrackHitCollectionName": ["OuterTrackerBarrelCollection"], - "SimTrkHitRelCollection": ["OuterTrackerBarrelHitsRelations"], - "SubDetectorName": ["OuterTrackers"], - "TrackerHitCollectionName": ["OTrackerHits"] - } - -OuterEndcapPlanarDigiProcessor = MarlinProcessorWrapper("OuterEndcapPlanarDigiProcessor") -OuterEndcapPlanarDigiProcessor.OutputLevel = WARNING -OuterEndcapPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" -OuterEndcapPlanarDigiProcessor.Parameters = { - "IsStrip": ["false"], - "ResolutionU": ["0.007", "0.007", "0.007", "0.007", "0.007"], - "ResolutionV": ["0.09", "0.09", "0.09", "0.09", "0.09"], - "SimTrackHitCollectionName": ["OuterTrackerEndcapCollection"], - "SimTrkHitRelCollection": ["OuterTrackerEndcapHitsRelations"], - "SubDetectorName": ["OuterTrackers"], - "TrackerHitCollectionName": ["OTrackerEndcapHits"] - } +from k4FWCore.parseArgs import parser +args = parser.parse_known_args() + +vxd_barrel_digitiser_args = { + "IsStrip": False, + "ResolutionU": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], + "ResolutionV": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], + "SimTrackerHitCollectionName": ["VertexBarrelCollection"], + "SimTrkHitRelCollection": ["VXDTrackerHitRelations"], + "SubDetectorName": ["Vertex"], + "TrackerHitCollectionName": ["VXDTrackerHits"], + "OutputLevel": WARNING, +} + +vxd_endcap_digitiser_args = { + "IsStrip": False, + "ResolutionU": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], + "ResolutionV": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], + "SimTrackerHitCollectionName": ["VertexEndcapCollection"], + "SimTrkHitRelCollection": ["VXDEndcapTrackerHitRelations"], + "SubDetectorName": ["Vertex"], + "TrackerHitCollectionName": ["VXDEndcapTrackerHits"], + "OutputLevel": WARNING, +} + +inner_planar_digi_processor_args = { + "IsStrip": False, + "ResolutionU": [0.007], + "ResolutionV": [0.09], + "SimTrackerHitCollectionName": ["InnerTrackerBarrelCollection"], + "SimTrkHitRelCollection": ["InnerTrackerBarrelHitsRelations"], + "SubDetectorName": ["InnerTrackers"], + "TrackerHitCollectionName": ["ITrackerHits"], + "OutputLevel": WARNING, +} + +inner_endcap_planar_digi_processor_args = { + "IsStrip": False, + "ResolutionU": [0.005, 0.007, 0.007, 0.007, 0.007, 0.007, 0.007], + "ResolutionV": [0.005, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09], + "SimTrackerHitCollectionName": ["InnerTrackerEndcapCollection"], + "SimTrkHitRelCollection": ["InnerTrackerEndcapHitsRelations"], + "SubDetectorName": ["InnerTrackers"], + "TrackerHitCollectionName": ["ITrackerEndcapHits"], + "OutputLevel": WARNING, +} + +outer_planar_digi_processor_args = { + "IsStrip": False, + "ResolutionU": [0.007, 0.007, 0.007], + "ResolutionV": [0.09, 0.09, 0.09], + "SimTrackerHitCollectionName": ["OuterTrackerBarrelCollection"], + "SimTrkHitRelCollection": ["OuterTrackerBarrelHitsRelations"], + "SubDetectorName": ["OuterTrackers"], + "TrackerHitCollectionName": ["OTrackerHits"], + "OutputLevel": WARNING, +} + +outer_endcap_planar_digi_processor_args = { + "IsStrip": False, + "ResolutionU": [0.007, 0.007, 0.007, 0.007, 0.007], + "ResolutionV": [0.09, 0.09, 0.09, 0.09, 0.09], + "SimTrackerHitCollectionName": ["OuterTrackerEndcapCollection"], + "SimTrkHitRelCollection": ["OuterTrackerEndcapHitsRelations"], + "SubDetectorName": ["OuterTrackers"], + "TrackerHitCollectionName": ["OTrackerEndcapHits"], + "OutputLevel": WARNING, +} + + +vxd_barrel_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_barrel_digitiser_args.items()} +vxd_barrel_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_barrel_digitiser_args_marlin.items()} +vxd_endcap_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_endcap_digitiser_args.items()} +vxd_endcap_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_endcap_digitiser_args_marlin.items()} +inner_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_planar_digi_processor_args.items()} +inner_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_planar_digi_processor_args_marlin.items()} +inner_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_endcap_planar_digi_processor_args.items()} +inner_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_endcap_planar_digi_processor_args_marlin.items()} +outer_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_planar_digi_processor_args.items()} +outer_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_planar_digi_processor_args_marlin.items()} +outer_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_endcap_planar_digi_processor_args.items()} +outer_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_endcap_planar_digi_processor_args_marlin.items()} + + +if args.native: + from Configurables import DDPlanarDigi + + VXDBarrelDigitiser = DDPlanarDigi( + "VXDBarrelDigitiser", + **vxd_barrel_digitiser_args + ) + VXDEndcapDigitiser = DDPlanarDigi( + "VXDEndcapDigitiser", + **vxd_endcap_digitiser_args + ) + InnerPlanarDigiProcessor = DDPlanarDigi( + "InnerPlanarDigiProcessor", + **inner_planar_digi_processor_args + ) + InnerEndcapPlanarDigiProcessor = DDPlanarDigi( + "InnerEndcapPlanarDigiProcessor", + **inner_endcap_planar_digi_processor_args + ) + OuterPlanarDigiProcessor = DDPlanarDigi( + "OuterPlanarDigiProcessor", + **outer_planar_digi_processor_args + ) + + OuterEndcapPlanarDigiProcessor = DDPlanarDigi( + "OuterEndcapPlanarDigiProcessor", + **outer_endcap_planar_digi_processor_args + ) + +else: + from Configurables import MarlinProcessorWrapper + + VXDBarrelDigitiser = MarlinProcessorWrapper("VXDBarrelDigitiser") + VXDBarrelDigitiser.OutputLevel = WARNING + VXDBarrelDigitiser.ProcessorType = "DDPlanarDigiProcessor" + VXDBarrelDigitiser.Parameters = vxd_barrel_digitiser_args_marlin + + VXDEndcapDigitiser = MarlinProcessorWrapper("VXDEndcapDigitiser") + VXDEndcapDigitiser.OutputLevel = WARNING + VXDEndcapDigitiser.ProcessorType = "DDPlanarDigiProcessor" + VXDEndcapDigitiser.Parameters = vxd_endcap_digitiser_args_marlin + + InnerPlanarDigiProcessor = MarlinProcessorWrapper("InnerPlanarDigiProcessor") + InnerPlanarDigiProcessor.OutputLevel = WARNING + InnerPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" + InnerPlanarDigiProcessor.Parameters = inner_planar_digi_processor_args_marlin + + InnerEndcapPlanarDigiProcessor = MarlinProcessorWrapper( + "InnerEndcapPlanarDigiProcessor" + ) + InnerEndcapPlanarDigiProcessor.OutputLevel = WARNING + InnerEndcapPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" + InnerEndcapPlanarDigiProcessor.Parameters = inner_endcap_planar_digi_processor_args_marlin + + OuterPlanarDigiProcessor = MarlinProcessorWrapper("OuterPlanarDigiProcessor") + OuterPlanarDigiProcessor.OutputLevel = WARNING + OuterPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" + OuterPlanarDigiProcessor.Parameters = outer_planar_digi_processor_args_marlin + + OuterEndcapPlanarDigiProcessor = MarlinProcessorWrapper( + "OuterEndcapPlanarDigiProcessor" + ) + OuterEndcapPlanarDigiProcessor.OutputLevel = WARNING + OuterEndcapPlanarDigiProcessor.ProcessorType = "DDPlanarDigiProcessor" + OuterEndcapPlanarDigiProcessor.Parameters = outer_endcap_planar_digi_processor_args_marlin TrackingDigiSequence = [ VXDBarrelDigitiser, diff --git a/CLDConfig/Tracking/TruthTracking.py b/CLDConfig/Tracking/TruthTracking.py index 3907067..b92f9d0 100644 --- a/CLDConfig/Tracking/TruthTracking.py +++ b/CLDConfig/Tracking/TruthTracking.py @@ -17,21 +17,36 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper +from k4FWCore.parseArgs import parser +args = parser.parse_known_args() +truth_track_finder_args = { + "FitForward": True, + "MCParticleCollectionName": ["MCParticles"], + "SiTrackCollectionName": ["SiTracks"], + "SiTrackRelationCollectionName": ["SiTrackRelations"], + "SimTrackerHitRelCollectionNames": ["VXDTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], + "TrackerHitCollectionNames": ["VXDTrackerHits", "ITrackerHits", "OTrackerHits", "VXDEndcapTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], + "UseTruthInPrefit": False, + "OutputLevel": WARNING +} +# Change True to ["true"] and False to ["false"] if using MarlinProcessorWrapper +truth_track_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in truth_track_finder_args.items()} -MyTruthTrackFinder = MarlinProcessorWrapper("MyTruthTrackFinder") -MyTruthTrackFinder.OutputLevel = WARNING -MyTruthTrackFinder.ProcessorType = "TruthTrackFinder" -MyTruthTrackFinder.Parameters = { - "FitForward": ["true"], - "MCParticleCollectionName": ["MCParticle"], - "SiTrackCollectionName": ["SiTracks"], - "SiTrackRelationCollectionName": ["SiTrackRelations"], - "SimTrackerHitRelCollectionNames": ["VXDTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], - "TrackerHitCollectionNames": ["VXDTrackerHits", "ITrackerHits", "OTrackerHits", "VXDEndcapTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], - "UseTruthInPrefit": ["false"] - } +if args.native: + from Configurables import TruthTrackFinder + MyTruthTrackFinder = TruthTrackFinder( + "TruthTrackFinder", + **truth_track_finder_args + ) + +else: + from Configurables import MarlinProcessorWrapper + + MyTruthTrackFinder = MarlinProcessorWrapper("MyTruthTrackFinder") + MyTruthTrackFinder.OutputLevel = WARNING + MyTruthTrackFinder.ProcessorType = "TruthTrackFinder" + MyTruthTrackFinder.Parameters = truth_track_finder_args_marlin TruthTrackingSequence = [ MyTruthTrackFinder, From fc8b36f542576eb8a9ffc471f5fd5276280b21e1 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 21 Mar 2025 18:38:38 +0100 Subject: [PATCH 02/68] Fix args --- CLDConfig/Tracking/ConformalTracking.py | 2 +- CLDConfig/Tracking/Refit.py | 2 +- CLDConfig/Tracking/TruthTracking.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 6090a94..bcc90e6 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -299,7 +299,7 @@ clone_and_split_tracks_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in clones_and_split_tracks_finder_args.items()} clone_and_split_tracks_finder_args_marlin = {k: [str(v)] if isinstance(v, float) else v for k, v in clone_and_split_tracks_finder_args_marlin.items()} -if args.native: +if args[0].native: from Configurables import ConformalTracking, ClonesAndSplitTracksFinder MyConformalTracking = ConformalTracking( diff --git a/CLDConfig/Tracking/Refit.py b/CLDConfig/Tracking/Refit.py index bebe217..6f2fe51 100644 --- a/CLDConfig/Tracking/Refit.py +++ b/CLDConfig/Tracking/Refit.py @@ -39,7 +39,7 @@ refit_args_marlin = {k: [str(v)] if isinstance(v, float) else v for k, v in refit_args_marlin.items()} -if args.native: +if args[0].native: from Configurables import RefitFinal Refit = RefitFinal( diff --git a/CLDConfig/Tracking/TruthTracking.py b/CLDConfig/Tracking/TruthTracking.py index b92f9d0..6e8d612 100644 --- a/CLDConfig/Tracking/TruthTracking.py +++ b/CLDConfig/Tracking/TruthTracking.py @@ -33,7 +33,7 @@ # Change True to ["true"] and False to ["false"] if using MarlinProcessorWrapper truth_track_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in truth_track_finder_args.items()} -if args.native: +if args[0].native: from Configurables import TruthTrackFinder MyTruthTrackFinder = TruthTrackFinder( "TruthTrackFinder", From 81c0cf06055a3d25f81f617ff9bce93dbe82e14e Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 21 Mar 2025 18:39:58 +0100 Subject: [PATCH 03/68] Fix another arg --- CLDConfig/Tracking/TrackingDigi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/TrackingDigi.py b/CLDConfig/Tracking/TrackingDigi.py index d6569e0..514453e 100644 --- a/CLDConfig/Tracking/TrackingDigi.py +++ b/CLDConfig/Tracking/TrackingDigi.py @@ -101,7 +101,7 @@ outer_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_endcap_planar_digi_processor_args_marlin.items()} -if args.native: +if args[0].native: from Configurables import DDPlanarDigi VXDBarrelDigitiser = DDPlanarDigi( From ce2d533ae2529b30ad53a1a911f7fe4b6f4fd079 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 07:52:04 +0100 Subject: [PATCH 04/68] Fix OutputLevel --- CLDConfig/Tracking/ConformalTracking.py | 7 ++++--- CLDConfig/Tracking/Refit.py | 4 ++-- CLDConfig/Tracking/TrackingDigi.py | 24 ++++++++++++------------ CLDConfig/Tracking/TruthTracking.py | 4 ++-- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index bcc90e6..9b92a38 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -293,7 +293,6 @@ "maxSignificanceTheta": 3., "mergeSplitTracks": False, "minTrackPt": 1., - "OutputLevel": WARNING, } clone_and_split_tracks_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in clones_and_split_tracks_finder_args.items()} @@ -304,12 +303,14 @@ MyConformalTracking = ConformalTracking( "ConformalTracking", - **conformal_tracking_args + **conformal_tracking_args, + OutputLevel=WARNING, ) clones_and_split_tracks_finder = ClonesAndSplitTracksFinder( "ClonesAndSplitTracksFinder", - **clones_and_split_tracks_finder_args + **clones_and_split_tracks_finder_args, + OutputLevel=WARNING, ) else: diff --git a/CLDConfig/Tracking/Refit.py b/CLDConfig/Tracking/Refit.py index 6f2fe51..658700f 100644 --- a/CLDConfig/Tracking/Refit.py +++ b/CLDConfig/Tracking/Refit.py @@ -32,7 +32,6 @@ "ReferencePoint": -1, "SmoothOn": False, "extrapolateForward": True, - "OutputLevel": WARNING, } refit_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in refit_args.items()} @@ -44,7 +43,8 @@ Refit = RefitFinal( "RefitFinal", - **refit_args + **refit_args, + OutputLevel=WARNING, ) else: from Configurables import MarlinProcessorWrapper diff --git a/CLDConfig/Tracking/TrackingDigi.py b/CLDConfig/Tracking/TrackingDigi.py index 514453e..0ec2622 100644 --- a/CLDConfig/Tracking/TrackingDigi.py +++ b/CLDConfig/Tracking/TrackingDigi.py @@ -28,7 +28,6 @@ "SimTrkHitRelCollection": ["VXDTrackerHitRelations"], "SubDetectorName": ["Vertex"], "TrackerHitCollectionName": ["VXDTrackerHits"], - "OutputLevel": WARNING, } vxd_endcap_digitiser_args = { @@ -39,7 +38,6 @@ "SimTrkHitRelCollection": ["VXDEndcapTrackerHitRelations"], "SubDetectorName": ["Vertex"], "TrackerHitCollectionName": ["VXDEndcapTrackerHits"], - "OutputLevel": WARNING, } inner_planar_digi_processor_args = { @@ -50,7 +48,6 @@ "SimTrkHitRelCollection": ["InnerTrackerBarrelHitsRelations"], "SubDetectorName": ["InnerTrackers"], "TrackerHitCollectionName": ["ITrackerHits"], - "OutputLevel": WARNING, } inner_endcap_planar_digi_processor_args = { @@ -61,7 +58,6 @@ "SimTrkHitRelCollection": ["InnerTrackerEndcapHitsRelations"], "SubDetectorName": ["InnerTrackers"], "TrackerHitCollectionName": ["ITrackerEndcapHits"], - "OutputLevel": WARNING, } outer_planar_digi_processor_args = { @@ -72,7 +68,6 @@ "SimTrkHitRelCollection": ["OuterTrackerBarrelHitsRelations"], "SubDetectorName": ["OuterTrackers"], "TrackerHitCollectionName": ["OTrackerHits"], - "OutputLevel": WARNING, } outer_endcap_planar_digi_processor_args = { @@ -83,7 +78,6 @@ "SimTrkHitRelCollection": ["OuterTrackerEndcapHitsRelations"], "SubDetectorName": ["OuterTrackers"], "TrackerHitCollectionName": ["OTrackerEndcapHits"], - "OutputLevel": WARNING, } @@ -106,28 +100,34 @@ VXDBarrelDigitiser = DDPlanarDigi( "VXDBarrelDigitiser", - **vxd_barrel_digitiser_args + **vxd_barrel_digitiser_args, + OutputLevel=WARNING ) VXDEndcapDigitiser = DDPlanarDigi( "VXDEndcapDigitiser", - **vxd_endcap_digitiser_args + **vxd_endcap_digitiser_args, + OutputLevel=WARNING ) InnerPlanarDigiProcessor = DDPlanarDigi( "InnerPlanarDigiProcessor", - **inner_planar_digi_processor_args + **inner_planar_digi_processor_args, + OutputLevel=WARNING ) InnerEndcapPlanarDigiProcessor = DDPlanarDigi( "InnerEndcapPlanarDigiProcessor", - **inner_endcap_planar_digi_processor_args + **inner_endcap_planar_digi_processor_args, + OutputLevel=WARNING ) OuterPlanarDigiProcessor = DDPlanarDigi( "OuterPlanarDigiProcessor", - **outer_planar_digi_processor_args + **outer_planar_digi_processor_args, + OutputLevel=WARNING ) OuterEndcapPlanarDigiProcessor = DDPlanarDigi( "OuterEndcapPlanarDigiProcessor", - **outer_endcap_planar_digi_processor_args + **outer_endcap_planar_digi_processor_args, + OutputLevel=WARNING ) else: diff --git a/CLDConfig/Tracking/TruthTracking.py b/CLDConfig/Tracking/TruthTracking.py index 6e8d612..9d232c0 100644 --- a/CLDConfig/Tracking/TruthTracking.py +++ b/CLDConfig/Tracking/TruthTracking.py @@ -28,7 +28,6 @@ "SimTrackerHitRelCollectionNames": ["VXDTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], "TrackerHitCollectionNames": ["VXDTrackerHits", "ITrackerHits", "OTrackerHits", "VXDEndcapTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], "UseTruthInPrefit": False, - "OutputLevel": WARNING } # Change True to ["true"] and False to ["false"] if using MarlinProcessorWrapper truth_track_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in truth_track_finder_args.items()} @@ -37,7 +36,8 @@ from Configurables import TruthTrackFinder MyTruthTrackFinder = TruthTrackFinder( "TruthTrackFinder", - **truth_track_finder_args + **truth_track_finder_args, + OutputLevel=WARNING, ) else: From 9a523ce055b6d96701911ad3767f25eae451fe17 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 07:57:58 +0100 Subject: [PATCH 05/68] Fix refit --- CLDConfig/Tracking/Refit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/Refit.py b/CLDConfig/Tracking/Refit.py index 658700f..d82dba3 100644 --- a/CLDConfig/Tracking/Refit.py +++ b/CLDConfig/Tracking/Refit.py @@ -35,7 +35,7 @@ } refit_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in refit_args.items()} -refit_args_marlin = {k: [str(v)] if isinstance(v, float) else v for k, v in refit_args_marlin.items()} +refit_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in refit_args_marlin.items()} if args[0].native: From d5362246c557428d20cbe42bb87ed7377677080e Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 08:18:34 +0100 Subject: [PATCH 06/68] Fix TruthTracking --- CLDConfig/Tracking/TruthTracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/TruthTracking.py b/CLDConfig/Tracking/TruthTracking.py index 9d232c0..298aee5 100644 --- a/CLDConfig/Tracking/TruthTracking.py +++ b/CLDConfig/Tracking/TruthTracking.py @@ -22,7 +22,7 @@ truth_track_finder_args = { "FitForward": True, - "MCParticleCollectionName": ["MCParticles"], + "MCParticleCollectionName": ["MCParticle"], "SiTrackCollectionName": ["SiTracks"], "SiTrackRelationCollectionName": ["SiTrackRelations"], "SimTrackerHitRelCollectionNames": ["VXDTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], From 938e1f6efceb068a03afdeac826aa73d49162df2 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 08:23:48 +0100 Subject: [PATCH 07/68] Fix DDPlanarDigi --- CLDConfig/Tracking/TrackingDigi.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/CLDConfig/Tracking/TrackingDigi.py b/CLDConfig/Tracking/TrackingDigi.py index 0ec2622..287fc8a 100644 --- a/CLDConfig/Tracking/TrackingDigi.py +++ b/CLDConfig/Tracking/TrackingDigi.py @@ -26,7 +26,7 @@ "ResolutionV": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], "SimTrackerHitCollectionName": ["VertexBarrelCollection"], "SimTrkHitRelCollection": ["VXDTrackerHitRelations"], - "SubDetectorName": ["Vertex"], + "SubDetectorName": "Vertex", "TrackerHitCollectionName": ["VXDTrackerHits"], } @@ -36,7 +36,7 @@ "ResolutionV": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], "SimTrackerHitCollectionName": ["VertexEndcapCollection"], "SimTrkHitRelCollection": ["VXDEndcapTrackerHitRelations"], - "SubDetectorName": ["Vertex"], + "SubDetectorName": "Vertex", "TrackerHitCollectionName": ["VXDEndcapTrackerHits"], } @@ -46,7 +46,7 @@ "ResolutionV": [0.09], "SimTrackerHitCollectionName": ["InnerTrackerBarrelCollection"], "SimTrkHitRelCollection": ["InnerTrackerBarrelHitsRelations"], - "SubDetectorName": ["InnerTrackers"], + "SubDetectorName": "InnerTrackers", "TrackerHitCollectionName": ["ITrackerHits"], } @@ -56,7 +56,7 @@ "ResolutionV": [0.005, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09], "SimTrackerHitCollectionName": ["InnerTrackerEndcapCollection"], "SimTrkHitRelCollection": ["InnerTrackerEndcapHitsRelations"], - "SubDetectorName": ["InnerTrackers"], + "SubDetectorName": "InnerTrackers", "TrackerHitCollectionName": ["ITrackerEndcapHits"], } @@ -66,7 +66,7 @@ "ResolutionV": [0.09, 0.09, 0.09], "SimTrackerHitCollectionName": ["OuterTrackerBarrelCollection"], "SimTrkHitRelCollection": ["OuterTrackerBarrelHitsRelations"], - "SubDetectorName": ["OuterTrackers"], + "SubDetectorName": "OuterTrackers", "TrackerHitCollectionName": ["OTrackerHits"], } @@ -76,23 +76,29 @@ "ResolutionV": [0.09, 0.09, 0.09, 0.09, 0.09], "SimTrackerHitCollectionName": ["OuterTrackerEndcapCollection"], "SimTrkHitRelCollection": ["OuterTrackerEndcapHitsRelations"], - "SubDetectorName": ["OuterTrackers"], + "SubDetectorName": "OuterTrackers", "TrackerHitCollectionName": ["OTrackerEndcapHits"], } vxd_barrel_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_barrel_digitiser_args.items()} vxd_barrel_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_barrel_digitiser_args_marlin.items()} +vxd_barrel_digitiser_args_marlin["SubDetectorName"] = [vxd_barrel_digitiser_args["SubDetectorName"]] vxd_endcap_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_endcap_digitiser_args.items()} vxd_endcap_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_endcap_digitiser_args_marlin.items()} +vxd_endcap_digitiser_args_marlin["SubDetectorName"] = [vxd_endcap_digitiser_args["SubDetectorName"]] inner_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_planar_digi_processor_args.items()} inner_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_planar_digi_processor_args_marlin.items()} +inner_planar_digi_processor_args_marlin["SubDetectorName"] = [inner_planar_digi_processor_args["SubDetectorName"]] inner_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_endcap_planar_digi_processor_args.items()} inner_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_endcap_planar_digi_processor_args_marlin.items()} +inner_endcap_planar_digi_processor_args_marlin["SubDetectorName"] = [inner_endcap_planar_digi_processor_args["SubDetectorName"]] outer_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_planar_digi_processor_args.items()} outer_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_planar_digi_processor_args_marlin.items()} +outer_planar_digi_processor_args_marlin["SubDetectorName"] = [outer_planar_digi_processor_args["SubDetectorName"]] outer_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_endcap_planar_digi_processor_args.items()} outer_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_endcap_planar_digi_processor_args_marlin.items()} +outer_endcap_planar_digi_processor_args_marlin["SubDetectorName"] = [outer_endcap_planar_digi_processor_args["SubDetectorName"]] if args[0].native: From ae72d61b6f02fa40f87c8665dd255a6dd162337f Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 08:25:12 +0100 Subject: [PATCH 08/68] Fix TruthTrackFinder --- CLDConfig/Tracking/TruthTracking.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/TruthTracking.py b/CLDConfig/Tracking/TruthTracking.py index 298aee5..d43363d 100644 --- a/CLDConfig/Tracking/TruthTracking.py +++ b/CLDConfig/Tracking/TruthTracking.py @@ -22,7 +22,7 @@ truth_track_finder_args = { "FitForward": True, - "MCParticleCollectionName": ["MCParticle"], + "MCParticleCollectionName": ["MCParticles"], "SiTrackCollectionName": ["SiTracks"], "SiTrackRelationCollectionName": ["SiTrackRelations"], "SimTrackerHitRelCollectionNames": ["VXDTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], @@ -31,6 +31,7 @@ } # Change True to ["true"] and False to ["false"] if using MarlinProcessorWrapper truth_track_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in truth_track_finder_args.items()} +truth_track_finder_args_marlin["MCParticleCollectionName"] = ["MCParticles"] if args[0].native: from Configurables import TruthTrackFinder From 5b50a165cceaf2310f7b62709dfb841d03b56341 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 09:37:07 +0100 Subject: [PATCH 09/68] Remove DebugHits --- CLDConfig/Tracking/ConformalTracking.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 9b92a38..52cbdcd 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -274,6 +274,9 @@ conformal_tracking_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in conformal_tracking_args.items()} conformal_tracking_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in conformal_tracking_args_marlin.items()} +# Not implemented in Gaudi +conformal_tracking_args.pop("DebugHits") + conformal_tracking_args.pop("Steps") conformal_tracking_args["stepCollections"] = collections conformal_tracking_args["stepParametersNames"] = names From 9c2f2fd32ab0abdd2fe2e8f8006c102d673b1c58 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 16:34:11 +0100 Subject: [PATCH 10/68] Fix the name of the MCParticle in LCIO --- CLDConfig/Tracking/TruthTracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/TruthTracking.py b/CLDConfig/Tracking/TruthTracking.py index d43363d..f36547a 100644 --- a/CLDConfig/Tracking/TruthTracking.py +++ b/CLDConfig/Tracking/TruthTracking.py @@ -31,7 +31,7 @@ } # Change True to ["true"] and False to ["false"] if using MarlinProcessorWrapper truth_track_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in truth_track_finder_args.items()} -truth_track_finder_args_marlin["MCParticleCollectionName"] = ["MCParticles"] +truth_track_finder_args_marlin["MCParticleCollectionName"] = ["MCParticle"] if args[0].native: from Configurables import TruthTrackFinder From 43e07ae2417a06f948e865bc3a38cef2ae2f50a0 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Sat, 22 Mar 2025 19:25:53 +0100 Subject: [PATCH 11/68] Fix the name of the SimTrackerHitCollection --- CLDConfig/Tracking/TrackingDigi.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CLDConfig/Tracking/TrackingDigi.py b/CLDConfig/Tracking/TrackingDigi.py index 287fc8a..bbc7c39 100644 --- a/CLDConfig/Tracking/TrackingDigi.py +++ b/CLDConfig/Tracking/TrackingDigi.py @@ -24,7 +24,7 @@ "IsStrip": False, "ResolutionU": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], "ResolutionV": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], - "SimTrackerHitCollectionName": ["VertexBarrelCollection"], + "SimTrackHitCollectionName": ["VertexBarrelCollection"], "SimTrkHitRelCollection": ["VXDTrackerHitRelations"], "SubDetectorName": "Vertex", "TrackerHitCollectionName": ["VXDTrackerHits"], @@ -34,7 +34,7 @@ "IsStrip": False, "ResolutionU": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], "ResolutionV": [0.003, 0.003, 0.003, 0.003, 0.003, 0.003], - "SimTrackerHitCollectionName": ["VertexEndcapCollection"], + "SimTrackHitCollectionName": ["VertexEndcapCollection"], "SimTrkHitRelCollection": ["VXDEndcapTrackerHitRelations"], "SubDetectorName": "Vertex", "TrackerHitCollectionName": ["VXDEndcapTrackerHits"], @@ -44,7 +44,7 @@ "IsStrip": False, "ResolutionU": [0.007], "ResolutionV": [0.09], - "SimTrackerHitCollectionName": ["InnerTrackerBarrelCollection"], + "SimTrackHitCollectionName": ["InnerTrackerBarrelCollection"], "SimTrkHitRelCollection": ["InnerTrackerBarrelHitsRelations"], "SubDetectorName": "InnerTrackers", "TrackerHitCollectionName": ["ITrackerHits"], @@ -54,7 +54,7 @@ "IsStrip": False, "ResolutionU": [0.005, 0.007, 0.007, 0.007, 0.007, 0.007, 0.007], "ResolutionV": [0.005, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09], - "SimTrackerHitCollectionName": ["InnerTrackerEndcapCollection"], + "SimTrackHitCollectionName": ["InnerTrackerEndcapCollection"], "SimTrkHitRelCollection": ["InnerTrackerEndcapHitsRelations"], "SubDetectorName": "InnerTrackers", "TrackerHitCollectionName": ["ITrackerEndcapHits"], @@ -64,7 +64,7 @@ "IsStrip": False, "ResolutionU": [0.007, 0.007, 0.007], "ResolutionV": [0.09, 0.09, 0.09], - "SimTrackerHitCollectionName": ["OuterTrackerBarrelCollection"], + "SimTrackHitCollectionName": ["OuterTrackerBarrelCollection"], "SimTrkHitRelCollection": ["OuterTrackerBarrelHitsRelations"], "SubDetectorName": "OuterTrackers", "TrackerHitCollectionName": ["OTrackerHits"], @@ -74,7 +74,7 @@ "IsStrip": False, "ResolutionU": [0.007, 0.007, 0.007, 0.007, 0.007], "ResolutionV": [0.09, 0.09, 0.09, 0.09, 0.09], - "SimTrackerHitCollectionName": ["OuterTrackerEndcapCollection"], + "SimTrackHitCollectionName": ["OuterTrackerEndcapCollection"], "SimTrkHitRelCollection": ["OuterTrackerEndcapHitsRelations"], "SubDetectorName": "OuterTrackers", "TrackerHitCollectionName": ["OTrackerEndcapHits"], @@ -84,18 +84,23 @@ vxd_barrel_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_barrel_digitiser_args.items()} vxd_barrel_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_barrel_digitiser_args_marlin.items()} vxd_barrel_digitiser_args_marlin["SubDetectorName"] = [vxd_barrel_digitiser_args["SubDetectorName"]] + vxd_endcap_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_endcap_digitiser_args.items()} vxd_endcap_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_endcap_digitiser_args_marlin.items()} vxd_endcap_digitiser_args_marlin["SubDetectorName"] = [vxd_endcap_digitiser_args["SubDetectorName"]] + inner_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_planar_digi_processor_args.items()} inner_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_planar_digi_processor_args_marlin.items()} inner_planar_digi_processor_args_marlin["SubDetectorName"] = [inner_planar_digi_processor_args["SubDetectorName"]] + inner_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_endcap_planar_digi_processor_args.items()} inner_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_endcap_planar_digi_processor_args_marlin.items()} inner_endcap_planar_digi_processor_args_marlin["SubDetectorName"] = [inner_endcap_planar_digi_processor_args["SubDetectorName"]] + outer_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_planar_digi_processor_args.items()} outer_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_planar_digi_processor_args_marlin.items()} outer_planar_digi_processor_args_marlin["SubDetectorName"] = [outer_planar_digi_processor_args["SubDetectorName"]] + outer_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_endcap_planar_digi_processor_args.items()} outer_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_endcap_planar_digi_processor_args_marlin.items()} outer_endcap_planar_digi_processor_args_marlin["SubDetectorName"] = [outer_endcap_planar_digi_processor_args["SubDetectorName"]] From a9c4f61ee1b2e224720fee4b13ac01fe58948a5f Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 27 Mar 2025 18:53:10 +0100 Subject: [PATCH 12/68] Fix the name of MCParticles --- CLDConfig/Tracking/ConformalTracking.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 52cbdcd..348e162 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -225,7 +225,7 @@ "DebugHits": ["DebugHits"], "DebugPlots": False, "DebugTiming": False, - "MCParticleCollectionName": ["MCParticle"], + "MCParticleCollectionName": ["MCParticles"], "MaxHitInvertedFit": 0, "MinClustersOnTrackAfterFit": 3, "RelationsNames": ["VXDTrackerHitRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], @@ -273,6 +273,7 @@ conformal_tracking_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in conformal_tracking_args.items()} conformal_tracking_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in conformal_tracking_args_marlin.items()} +conformal_tracking_args_marlin["MCParticleCollectionName"] = ["MCParticle"], # Not implemented in Gaudi conformal_tracking_args.pop("DebugHits") From b886718f243bdad8089a77d1b72f794b7bc1ac34 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Wed, 1 Oct 2025 20:42:52 +0200 Subject: [PATCH 13/68] Update --- CLDConfig/CLDReconstruction.py | 154 +++++++++++++++------------------ CLDConfig/Tracking/Refit.py | 5 +- 2 files changed, 76 insertions(+), 83 deletions(-) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index 4c10b94..1fb5468 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -19,15 +19,14 @@ import os from Gaudi.Configuration import INFO, WARNING, DEBUG -from Gaudi.Configurables import EventDataSvc, MarlinProcessorWrapper, GeoSvc, TrackingCellIDEncodingSvc -from k4FWCore import ApplicationMgr, IOSvc +from Configurables import EventDataSvc, MarlinProcessorWrapper +from k4FWCore import IOSvc, ApplicationMgr +from k4MarlinWrapper.inputReader import create_reader, attach_edm4hep2lcio_conversion from k4FWCore.parseArgs import parser -from py_utils import SequenceLoader, parse_collection_patch_file -from k4MarlinWrapper.io_helpers import IOHandlerHelper +from py_utils import SequenceLoader, attach_lcio2edm4hep_conversion, create_writer, parse_collection_patch_file parser_group = parser.add_argument_group("CLDReconstruction.py custom options") -# Need the dummy input such that the IOHandlerHelper.add_reader call below does not crash when called with --help -parser_group.add_argument("--inputFiles", action="store", nargs="+", metavar=("file1", "file2"), help="One or multiple input files", default=["dummy_input.edm4hep.root"]) +parser_group.add_argument("--inputFiles", action="extend", nargs="+", metavar=("file1", "file2"), help="One or multiple input files") parser_group.add_argument("--outputBasename", help="Basename of the output file(s)", default="output") parser_group.add_argument("--trackingOnly", action="store_true", help="Run only track reconstruction", default=False) parser_group.add_argument("--enableLCFIJet", action="store_true", help="Enable LCFIPlus jet clustering parts", default=False) @@ -39,12 +38,13 @@ tracking_group.add_argument("--truthTracking", action="store_true", default=False, help="Cheat tracking pattern recognition") reco_args = parser.parse_known_args()[0] +algList = [] +svcList = [] evtsvc = EventDataSvc("EventDataSvc") -iosvc = IOSvc() +svcList.append(evtsvc) -svcList = [evtsvc, iosvc] -algList = [] +iosvc = IOSvc("IOSvc") CONFIG = { "CalorimeterIntegrationTimeWindow": "10ns", @@ -59,6 +59,7 @@ REC_COLLECTION_CONTENTS_FILE = "collections_rec_level.txt" # file with the collections to be patched in when writing from LCIO to EDM4hep +from Configurables import GeoSvc, TrackingCellIDEncodingSvc, Lcio2EDM4hepTool geoservice = GeoSvc("GeoSvc") geoservice.detectors = [reco_args.compactFile] geoservice.OutputLevel = INFO @@ -91,28 +92,31 @@ }, ) -io_handler = IOHandlerHelper(algList, iosvc) -io_handler.add_reader(reco_args.inputFiles) - -MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") -MyAIDAProcessor.OutputLevel = WARNING -MyAIDAProcessor.ProcessorType = "AIDAProcessor" -MyAIDAProcessor.Parameters = { - "Compress": ["1"], - "FileName": [f"{reco_args.outputBasename}_aida"], - "FileType": ["root"] - } - -EventNumber = MarlinProcessorWrapper("EventNumber") -EventNumber.OutputLevel = WARNING -EventNumber.ProcessorType = "Statusmonitor" -EventNumber.Parameters = { - "HowOften": ["1"] - } +if reco_args.inputFiles: + iosvc.Input = reco_args.inputFiles +else: + print('WARNING: No input files specified, the CLD Reconstruction will fail') + read = None + +# MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") +# MyAIDAProcessor.OutputLevel = WARNING +# MyAIDAProcessor.ProcessorType = "AIDAProcessor" +# MyAIDAProcessor.Parameters = { +# "Compress": ["1"], +# "FileName": [f"{reco_args.outputBasename}_aida"], +# "FileType": ["root"] +# } + +# EventNumber = MarlinProcessorWrapper("EventNumber") +# EventNumber.OutputLevel = WARNING +# EventNumber.ProcessorType = "Statusmonitor" +# EventNumber.Parameters = { +# "HowOften": ["1"] +# } # setup AIDA histogramming and add eventual background overlay -algList.append(MyAIDAProcessor) -sequenceLoader.load("Overlay/Overlay") +# algList.append(MyAIDAProcessor) +# sequenceLoader.load("Overlay/Overlay") # tracker hit digitisation sequenceLoader.load("Tracking/TrackingDigi") @@ -124,67 +128,53 @@ sequenceLoader.load("Tracking/Refit") -# calorimeter digitization and pandora -if not reco_args.trackingOnly: - sequenceLoader.load("CaloDigi/CaloDigi") - sequenceLoader.load("CaloDigi/MuonDigi") - sequenceLoader.load("ParticleFlow/Pandora") - sequenceLoader.load("CaloDigi/LumiCal") -# monitoring and Reco to MCTruth linking -sequenceLoader.load("HighLevelReco/RecoMCTruthLink") -sequenceLoader.load("Diagnostics/Tracking") -# pfo selector (might need re-optimisation) -if not reco_args.trackingOnly: - sequenceLoader.load("HighLevelReco/PFOSelector") - sequenceLoader.load("HighLevelReco/JetClusteringOrRenaming") - sequenceLoader.load("HighLevelReco/JetAndVertex") -# event number processor, down here to attach the conversion back to edm4hep to it -algList.append(EventNumber) +# # calorimeter digitization and pandora +# if not reco_args.trackingOnly: +# sequenceLoader.load("CaloDigi/CaloDigi") +# sequenceLoader.load("CaloDigi/MuonDigi") +# sequenceLoader.load("ParticleFlow/Pandora") +# sequenceLoader.load("CaloDigi/LumiCal") +# # monitoring and Reco to MCTruth linking +# sequenceLoader.load("HighLevelReco/RecoMCTruthLink") +# sequenceLoader.load("Diagnostics/Tracking") +# # pfo selector (might need re-optimisation) +# if not reco_args.trackingOnly: +# sequenceLoader.load("HighLevelReco/PFOSelector") +# sequenceLoader.load("HighLevelReco/JetClusteringOrRenaming") +# sequenceLoader.load("HighLevelReco/JetAndVertex") +# # event number processor, down here to attach the conversion back to edm4hep to it +# algList.append(EventNumber) DST_KEEPLIST = ["MCParticlesSkimmed", "MCPhysicsParticles", "RecoMCTruthLink", "SiTracks", "SiTracks_Refitted", "PandoraClusters", "PandoraPFOs", "SelectedPandoraPFOs", "LooseSelectedPandoraPFOs", "TightSelectedPandoraPFOs", "RefinedVertexJets", "RefinedVertexJets_rel", "RefinedVertexJets_vtx", "RefinedVertexJets_vtx_RP", "BuildUpVertices", "BuildUpVertices_res", "BuildUpVertices_RP", "BuildUpVertices_res_RP", "BuildUpVertices_V0", "BuildUpVertices_V0_res", "BuildUpVertices_V0_RP", "BuildUpVertices_V0_res_RP", "PrimaryVertices", "PrimaryVertices_res", "PrimaryVertices_RP", "PrimaryVertices_res_RP", "RefinedVertices", "RefinedVertices_RP"] DST_SUBSETLIST = ["EfficientMCParticles", "InefficientMCParticles", "MCPhysicsParticles"] -# TODO: replace all the ugly strings by something sensible like Enum -if CONFIG["OutputMode"] == "LCIO": - Output_REC = io_handler.add_lcio_writer("Output_REC") - Output_REC.Parameters = { - "LCIOOutputFile": [f"{reco_args.outputBasename}_REC.slcio"], - "LCIOWriteMode": ["WRITE_NEW"], - } - - Output_DST = io_handler.add_lcio_writer("Output_DST") - dropped_types = ["MCParticle", "LCRelation", "SimCalorimeterHit", "CalorimeterHit", "SimTrackerHit", "TrackerHit", "TrackerHitPlane", "Track", "ReconstructedParticle", "LCFloatVec"] - Output_DST.Parameters = { - "LCIOOutputFile": [f"{reco_args.outputBasename}_DST.slcio"], - "LCIOWriteMode": ["WRITE_NEW"], - "DropCollectionNames": [], - "DropCollectionTypes": dropped_types, - "FullSubsetCollections": DST_SUBSETLIST, - "KeepCollectionNames": DST_KEEPLIST, - } - -if CONFIG["OutputMode"] == "EDM4Hep": - # Make sure that all collections are always available by patching in missing ones on-the-fly - collPatcherRec = MarlinProcessorWrapper( - "CollPatcherREC", OutputLevel=INFO, ProcessorType="PatchCollections" - ) - collPatcherRec.Parameters = { - "PatchCollections": parse_collection_patch_file(REC_COLLECTION_CONTENTS_FILE) - } - algList.append(collPatcherRec) - - io_handler.add_edm4hep_writer(f"{reco_args.outputBasename}_REC.edm4hep.root", ["keep *"]) - # FIXME: needs https://github.com/key4hep/k4FWCore/issues/226 - # - - -# We need to attach all the necessary converters -io_handler.finalize_converters() +# Make sure that all collections are always available by patching in missing ones on-the-fly +# collPatcherRec = MarlinProcessorWrapper( +# "CollPatcherREC", OutputLevel=INFO, ProcessorType="PatchCollections" +# ) +# collPatcherRec.Parameters = { +# "PatchCollections": parse_collection_patch_file(REC_COLLECTION_CONTENTS_FILE) +# } +# algList.append(collPatcherRec) + +# Output_REC = create_writer("edm4hep", "Output_REC", f"{reco_args.outputBasename}_REC") +# algList.append(Output_REC) +iosvc.Output = f"{reco_args.outputBasename}_REC.edm4hep.root" + +# FIXME: needs https://github.com/key4hep/k4FWCore/issues/226 +# Output_DST = create_writer("edm4hep", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST) +# algList.append(Output_DST) + +# We need to convert the inputs in case we have EDM4hep input +# attach_edm4hep2lcio_conversion(algList, read) + +# We need to convert the outputs in case we have EDM4hep output +# attach_lcio2edm4hep_conversion(algList) ApplicationMgr( TopAlg = algList, EvtSel = 'NONE', - EvtMax = 3, # Overridden by the --num-events switch to k4run + EvtMax = 1, # Overridden by the --num-events switch to k4run ExtSvc = svcList, OutputLevel=WARNING ) diff --git a/CLDConfig/Tracking/Refit.py b/CLDConfig/Tracking/Refit.py index d82dba3..94b0e0f 100644 --- a/CLDConfig/Tracking/Refit.py +++ b/CLDConfig/Tracking/Refit.py @@ -22,8 +22,8 @@ refit_args = { "EnergyLossOn": True, - "InputRelationCollectionName": ["SiTrackRelations"], "InputTrackCollectionName": ["SiTracks"], + "InputRelationCollectionName": ["SiTrackRelations"], "Max_Chi2_Incr": 1.79769e30, "MinClustersOnTrackAfterFit": 3, "MultipleScatteringOn": True, @@ -34,6 +34,9 @@ "extrapolateForward": True, } +if args[0].native and not args[0].truthTracking: + refit_args["InputRelationCollectionName"] = [] + refit_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in refit_args.items()} refit_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in refit_args_marlin.items()} From 64076a583c15cfb7493dfca5a5e20ef5b260e027 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 09:10:33 +0100 Subject: [PATCH 14/68] Update parameters for ConformalTracking --- CLDConfig/Tracking/ConformalTracking.py | 351 ++++++++---------------- 1 file changed, 118 insertions(+), 233 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 348e162..0818775 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -22,204 +22,120 @@ # geoservice comes from the `global_vars` of the SequenceLoader if any(small_vtx in geoservice.detectors[0] for small_vtx in ["_o2_", "_o3_", "_o4_"]): - CT_MAX_DIST = "0.05;" # semi-colon is important! + CT_MAX_DIST = 0.05 elif "_o1_" in geoservice.detectors[0]: - CT_MAX_DIST = "0.03;" # semi-colon is important! + CT_MAX_DIST = 0.03 else: raise RuntimeError("Unknown detector model to chose CT_MAX_DISTANCE") from k4FWCore.parseArgs import parser args = parser.parse_known_args() -collections = [ - ["VXDTrackerHits"], - ["VXDEndcapTrackerHits"], - ["VXDTrackerHits", "VXDEndcapTrackerHits"], - [], - ["ITrackerHits", "OTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], - [ - "VXDTrackerHits", - "VXDEndcapTrackerHits", - "ITrackerHits", - "OTrackerHits", - "ITrackerEndcapHits", - "OTrackerEndcapHits", - ], -] -params = [ - [ - "MaxCellAngle", - ":", - "0.01;", - "MaxCellAngleRZ", - ":", - "0.01;", - "Chi2Cut", - ":", - "100;", - "MinClustersOnTrack", - ":", - "4;", - "MaxDistance", - ":", - CT_MAX_DIST, - "SlopeZRange", - "10.0;", - "HighPTCut", - "10.0;", - ], - [ - "MaxCellAngle", - ":", - "0.01;", - "MaxCellAngleRZ", - ":", - "0.01;", - "Chi2Cut", - ":", - "100;", - "MinClustersOnTrack", - ":", - "4;", - "MaxDistance", - ":", - CT_MAX_DIST, - "SlopeZRange", - "10.0;", - "HighPTCut", - "10.0;", - ], - [ - "MaxCellAngle", - ":", - "0.05;", - "MaxCellAngleRZ", - ":", - "0.05;", - "Chi2Cut", - ":", - "100;", - "MinClustersOnTrack", - ":", - "4;", - "MaxDistance", - ":", - CT_MAX_DIST, - "SlopeZRange", - "10.0;", - "HighPTCut", - "10.0;", - ], - [ - "MaxCellAngle", - ":", - "0.1;", - "MaxCellAngleRZ", - ":", - "0.1;", - "Chi2Cut", - ":", - "2000;", - "MinClustersOnTrack", - ":", - "4;", - "MaxDistance", - ":", - CT_MAX_DIST, - "SlopeZRange", - "10.0;", - "HighPTCut", - "10.0;", - ], - [ - "MaxCellAngle", - ":", - "0.1;", - "MaxCellAngleRZ", - ":", - "0.1;", - "Chi2Cut", - ":", - "2000;", - "MinClustersOnTrack", - ":", - "4;", - "MaxDistance", - ":", - CT_MAX_DIST, - "SlopeZRange", - "10.0;", - "HighPTCut", - "1.0;", - ], - [ - "MaxCellAngle", - ":", - "0.1;", - "MaxCellAngleRZ", - ":", - "0.1;", - "Chi2Cut", - ":", - "1000;", - "MinClustersOnTrack", - ":", - "5;", - "MaxDistance", - ":", - "0.015;", - "SlopeZRange", - "10.0;", - "HighPTCut", - "10.0;", - ], -] -flags = [ - ["HighPTFit", "VertexToTracker"], - ["HighPTFit", "VertexToTracker"], - ["HighPTFit", "VertexToTracker", "RadialSearch"], - ["HighPTFit", "VertexToTracker", "RadialSearch"], - ["HighPTFit", "VertexToTracker", "RadialSearch"], - ["OnlyZSchi2cut", "RadialSearch"], -] -functions = [ - [ - "CombineCollections", - "BuildNewTracks", - ], - [ - "CombineCollections", - "ExtendTracks", - ], - [ - "CombineCollections", - "BuildNewTracks", - ], - [ - "BuildNewTracks", - "SortTracks", - ], - [ - "CombineCollections", - "ExtendTracks", - ], - [ - "CombineCollections", - "BuildNewTracks", - ], -] - -names = [] -values = [] -for ls in params: - current_names = [] - current_values = [] - ls = [x for x in ls if x != ":"] - for i in range(0, len(ls), 2): - current_names.append(ls[i]) - current_values.append(float(ls[i + 1].replace(";", ""))) - names.append(current_names) - values.append(current_values) +# The keys are simply a name are not passed to ConformalTracking +parameters = { + "VXDBarrel": { + "collections": ["VXDTrackerHits"], + "params": { + "MaxCellAngle": 0.01, + "MaxCellAngleRZ": 0.01, + "Chi2Cut": 100, + "MinClustersOnTrack": 4, + "MaxDistance": CT_MAX_DIST, + "SlopeZRange": 10.0, + "HighPTCut": 10.0, + }, + "flags": ["HighPTFit", "VertexToTracker"], + "functions": ["CombineCollections", "BuildNewTracks"], + }, + "VXDEncap": { + "collections": ["VXDEndcapTrackerHits"], + "params": { + "MaxCellAngle": 0.01, + "MaxCellAngleRZ": 0.01, + "Chi2Cut": 100, + "MinClustersOnTrack": 4, + "MaxDistance": CT_MAX_DIST, + "SlopeZRange": 10.0, + "HighPTCut": 10.0, + }, + "flags": ["HighPTFit", "VertexToTracker"], + "functions": ["CombineCollections", "ExtendTracks"], + }, + "LowerCellAngle1": { + "collections": ["VXDTrackerHits", "VXDEndcapTrackerHits"], + "params": { + "MaxCellAngle": 0.05, + "MaxCellAngleRZ": 0.05, + "Chi2Cut": 100, + "MinClustersOnTrack": 4, + "MaxDistance": CT_MAX_DIST, + "SlopeZRange": 10.0, + "HighPTCut": 10.0, + }, + "flags": ["HighPTFit", "VertexToTracker", "RadialSearch"], + "functions": ["CombineCollections", "BuildNewTracks"], + }, + "LowerCellAngle2": { + "collections": [], + "params": { + "MaxCellAngle": 0.1, + "MaxCellAngleRZ": 0.1, + "Chi2Cut": 2000, + "MinClustersOnTrack": 4, + "MaxDistance": CT_MAX_DIST, + "SlopeZRange": 10.0, + "HighPTCut": 10.0, + }, + "flags": ["HighPTFit", "VertexToTracker", "RadialSearch"], + "functions": ["BuildNewTracks", "SortTracks"], + }, + "Tracker": { + "collections": ["ITrackerHits", "OTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], + "params": { + "MaxCellAngle": 0.1, + "MaxCellAngleRZ": 0.1, + "Chi2Cut": 2000, + "MinClustersOnTrack": 4, + "MaxDistance": CT_MAX_DIST, + "SlopeZRange": 10.0, + "HighPTCut": 1.0, + }, + "flags": ["HighPTFit", "VertexToTracker", "RadialSearch"], + "functions": ["CombineCollections", "ExtendTracks"], + }, + "Displaced": { + "collections": ["VXDTrackerHits", "VXDEndcapTrackerHits", "ITrackerHits", "OTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], + "params": { + "MaxCellAngle": 0.1, + "MaxCellAngleRZ": 0.1, + "Chi2Cut": 1000, + "MinClustersOnTrack": 5, + "MaxDistance": 0.015, + "SlopeZRange": 10.0, + "HighPTCut": 10.0, + }, + "flags": ["OnlyZSchi2cut", "RadialSearch"], + "functions": ["CombineCollections", "BuildNewTracks"], + }, + } + +collections = [elem["collections"] for elem in parameters.values()] +names = [list(elem["params"].keys()) for elem in parameters.values()] +values = [list(elem["params"].values()) for elem in parameters.values()] +flags = [elem["flags"] for elem in parameters.values()] +functions = [elem["functions"] for elem in parameters.values()] + +steps_marlin = [] + +for name, param_dict in parameters.items(): + current_step = [ + f"[{name}]", + "@Collections", ":", ",".join(param_dict["collections"]), + "@Parameters", ":", *[f"{k}:{v};" for k, v in param_dict["params"].items()], + "@Flags", ":", ",".join(param_dict["flags"]), + "@Functions", ":", ",".join(param_dict["functions"]), + ] + steps_marlin.extend(current_step) conformal_tracking_args = { "DebugHits": ["DebugHits"], @@ -232,39 +148,6 @@ "RetryTooManyTracks": False, "SiTrackCollectionName": ["SiTracksCT"], "SortTreeResults": True, - "Steps": - [ - "[VXDBarrel]", - "@Collections", ":", "VXDTrackerHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.01;", "MaxCellAngleRZ", ":", "0.01;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker", - "@Functions", ":", "CombineCollections,", "BuildNewTracks", - "[VXDEncap]", - "@Collections", ":", "VXDEndcapTrackerHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.01;", "MaxCellAngleRZ", ":", "0.01;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker", - "@Functions", ":", "CombineCollections,", "ExtendTracks", - "[LowerCellAngle1]", - "@Collections", ":", "VXDTrackerHits,", "VXDEndcapTrackerHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.05;", "MaxCellAngleRZ", ":", "0.05;", "Chi2Cut", ":", "100;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", - "@Functions", ":", "CombineCollections,", "BuildNewTracks", - "[LowerCellAngle2]", - "@Collections", ":", - "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "2000;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", - "@Functions", ":", "BuildNewTracks,", "SortTracks", - "[Tracker]", - "@Collections", ":", "ITrackerHits,", "OTrackerHits,", "ITrackerEndcapHits,", "OTrackerEndcapHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "2000;", "MinClustersOnTrack", ":", "4;", "MaxDistance", ":", CT_MAX_DIST, "SlopeZRange:", "10.0;", "HighPTCut:", "1.0;", - "@Flags", ":", "HighPTFit,", "VertexToTracker,", "RadialSearch", - "@Functions", ":", "CombineCollections,", "ExtendTracks", - "[Displaced]", - "@Collections", ":", "VXDTrackerHits,", "VXDEndcapTrackerHits,", "ITrackerHits,", "OTrackerHits,", "ITrackerEndcapHits,", "OTrackerEndcapHits", - "@Parameters", ":", "MaxCellAngle", ":", "0.1;", "MaxCellAngleRZ", ":", "0.1;", "Chi2Cut", ":", "1000;", "MinClustersOnTrack", ":", "5;", "MaxDistance", ":", "0.015;", "SlopeZRange:", "10.0;", "HighPTCut:", "10.0;", - "@Flags", ":", "OnlyZSchi2cut,", "RadialSearch", - "@Functions", ":", "CombineCollections,", "BuildNewTracks" - ], "ThetaRange": 0.05, "TooManyTracks": 100000, "TrackerHitCollectionNames": ["VXDTrackerHits", "VXDEndcapTrackerHits", "ITrackerHits", "OTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], @@ -275,15 +158,17 @@ conformal_tracking_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in conformal_tracking_args_marlin.items()} conformal_tracking_args_marlin["MCParticleCollectionName"] = ["MCParticle"], -# Not implemented in Gaudi -conformal_tracking_args.pop("DebugHits") - -conformal_tracking_args.pop("Steps") -conformal_tracking_args["stepCollections"] = collections -conformal_tracking_args["stepParametersNames"] = names -conformal_tracking_args["stepParametersValues"] = values -conformal_tracking_args["stepParametersFlags"] = flags -conformal_tracking_args["stepParametersFunctions"] = functions +if args[0].native: + # Not implemented in Gaudi + conformal_tracking_args.pop("DebugHits") + + conformal_tracking_args["stepCollections"] = collections + conformal_tracking_args["stepParametersNames"] = names + conformal_tracking_args["stepParametersValues"] = values + conformal_tracking_args["stepParametersFlags"] = flags + conformal_tracking_args["stepParametersFunctions"] = functions +else: + conformal_tracking_args_marlin["Steps"] = steps_marlin clones_and_split_tracks_finder_args = { "EnergyLossOn": True, From f5457253d626eba622547144ea280b9c99f4c105 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 09:23:44 +0100 Subject: [PATCH 15/68] Reverse changes in CLDReconstruction.py --- CLDConfig/CLDReconstruction.py | 122 ++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 57 deletions(-) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index 1fb5468..007cf31 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -19,8 +19,7 @@ import os from Gaudi.Configuration import INFO, WARNING, DEBUG -from Configurables import EventDataSvc, MarlinProcessorWrapper -from k4FWCore import IOSvc, ApplicationMgr +from Configurables import k4DataSvc, MarlinProcessorWrapper from k4MarlinWrapper.inputReader import create_reader, attach_edm4hep2lcio_conversion from k4FWCore.parseArgs import parser from py_utils import SequenceLoader, attach_lcio2edm4hep_conversion, create_writer, parse_collection_patch_file @@ -32,7 +31,6 @@ parser_group.add_argument("--enableLCFIJet", action="store_true", help="Enable LCFIPlus jet clustering parts", default=False) parser_group.add_argument("--cms", action="store", help="Choose a Centre-of-Mass energy", default=240, choices=(91, 160, 240, 365), type=int) parser_group.add_argument("--compactFile", help="Compact detector file to use", type=str, default=os.environ["K4GEO"] + "/FCCee/CLD/compact/CLD_o2_v07/CLD_o2_v07.xml") -parser_group.add_argument("--native", action="store_true", help="Use the native EDM4hep tracking", default=False) tracking_group = parser_group.add_mutually_exclusive_group() tracking_group.add_argument("--conformalTracking", action="store_true", default=True, help="Use conformal tracking pattern recognition") tracking_group.add_argument("--truthTracking", action="store_true", default=False, help="Cheat tracking pattern recognition") @@ -41,11 +39,9 @@ algList = [] svcList = [] -evtsvc = EventDataSvc("EventDataSvc") +evtsvc = k4DataSvc("EventDataSvc") svcList.append(evtsvc) -iosvc = IOSvc("IOSvc") - CONFIG = { "CalorimeterIntegrationTimeWindow": "10ns", "CalorimeterIntegrationTimeWindowChoices": ["10ns", "400ns"], @@ -93,30 +89,32 @@ ) if reco_args.inputFiles: - iosvc.Input = reco_args.inputFiles + read = create_reader(reco_args.inputFiles, evtsvc) + read.OutputLevel = INFO + algList.append(read) else: print('WARNING: No input files specified, the CLD Reconstruction will fail') read = None -# MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") -# MyAIDAProcessor.OutputLevel = WARNING -# MyAIDAProcessor.ProcessorType = "AIDAProcessor" -# MyAIDAProcessor.Parameters = { -# "Compress": ["1"], -# "FileName": [f"{reco_args.outputBasename}_aida"], -# "FileType": ["root"] -# } - -# EventNumber = MarlinProcessorWrapper("EventNumber") -# EventNumber.OutputLevel = WARNING -# EventNumber.ProcessorType = "Statusmonitor" -# EventNumber.Parameters = { -# "HowOften": ["1"] -# } +MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") +MyAIDAProcessor.OutputLevel = WARNING +MyAIDAProcessor.ProcessorType = "AIDAProcessor" +MyAIDAProcessor.Parameters = { + "Compress": ["1"], + "FileName": [f"{reco_args.outputBasename}_aida"], + "FileType": ["root"] + } + +EventNumber = MarlinProcessorWrapper("EventNumber") +EventNumber.OutputLevel = WARNING +EventNumber.ProcessorType = "Statusmonitor" +EventNumber.Parameters = { + "HowOften": ["1"] + } # setup AIDA histogramming and add eventual background overlay -# algList.append(MyAIDAProcessor) -# sequenceLoader.load("Overlay/Overlay") +algList.append(MyAIDAProcessor) +sequenceLoader.load("Overlay/Overlay") # tracker hit digitisation sequenceLoader.load("Tracking/TrackingDigi") @@ -128,53 +126,63 @@ sequenceLoader.load("Tracking/Refit") -# # calorimeter digitization and pandora -# if not reco_args.trackingOnly: -# sequenceLoader.load("CaloDigi/CaloDigi") -# sequenceLoader.load("CaloDigi/MuonDigi") -# sequenceLoader.load("ParticleFlow/Pandora") -# sequenceLoader.load("CaloDigi/LumiCal") -# # monitoring and Reco to MCTruth linking -# sequenceLoader.load("HighLevelReco/RecoMCTruthLink") -# sequenceLoader.load("Diagnostics/Tracking") -# # pfo selector (might need re-optimisation) -# if not reco_args.trackingOnly: -# sequenceLoader.load("HighLevelReco/PFOSelector") -# sequenceLoader.load("HighLevelReco/JetClusteringOrRenaming") -# sequenceLoader.load("HighLevelReco/JetAndVertex") -# # event number processor, down here to attach the conversion back to edm4hep to it -# algList.append(EventNumber) +# calorimeter digitization and pandora +if not reco_args.trackingOnly: + sequenceLoader.load("CaloDigi/CaloDigi") + sequenceLoader.load("CaloDigi/MuonDigi") + sequenceLoader.load("ParticleFlow/Pandora") + sequenceLoader.load("CaloDigi/LumiCal") +# monitoring and Reco to MCTruth linking +sequenceLoader.load("HighLevelReco/RecoMCTruthLink") +sequenceLoader.load("Diagnostics/Tracking") +# pfo selector (might need re-optimisation) +if not reco_args.trackingOnly: + sequenceLoader.load("HighLevelReco/PFOSelector") + sequenceLoader.load("HighLevelReco/JetClusteringOrRenaming") + sequenceLoader.load("HighLevelReco/JetAndVertex") +# event number processor, down here to attach the conversion back to edm4hep to it +algList.append(EventNumber) DST_KEEPLIST = ["MCParticlesSkimmed", "MCPhysicsParticles", "RecoMCTruthLink", "SiTracks", "SiTracks_Refitted", "PandoraClusters", "PandoraPFOs", "SelectedPandoraPFOs", "LooseSelectedPandoraPFOs", "TightSelectedPandoraPFOs", "RefinedVertexJets", "RefinedVertexJets_rel", "RefinedVertexJets_vtx", "RefinedVertexJets_vtx_RP", "BuildUpVertices", "BuildUpVertices_res", "BuildUpVertices_RP", "BuildUpVertices_res_RP", "BuildUpVertices_V0", "BuildUpVertices_V0_res", "BuildUpVertices_V0_RP", "BuildUpVertices_V0_res_RP", "PrimaryVertices", "PrimaryVertices_res", "PrimaryVertices_RP", "PrimaryVertices_res_RP", "RefinedVertices", "RefinedVertices_RP"] DST_SUBSETLIST = ["EfficientMCParticles", "InefficientMCParticles", "MCPhysicsParticles"] -# Make sure that all collections are always available by patching in missing ones on-the-fly -# collPatcherRec = MarlinProcessorWrapper( -# "CollPatcherREC", OutputLevel=INFO, ProcessorType="PatchCollections" -# ) -# collPatcherRec.Parameters = { -# "PatchCollections": parse_collection_patch_file(REC_COLLECTION_CONTENTS_FILE) -# } -# algList.append(collPatcherRec) +# TODO: replace all the ugly strings by something sensible like Enum +if CONFIG["OutputMode"] == "LCIO": + Output_REC = create_writer("lcio", "Output_REC", f"{reco_args.outputBasename}_REC") + algList.append(Output_REC) + + Output_DST = create_writer("lcio", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST, DST_SUBSETLIST) + algList.append(Output_DST) + +if CONFIG["OutputMode"] == "EDM4Hep": + # Make sure that all collections are always available by patching in missing ones on-the-fly + collPatcherRec = MarlinProcessorWrapper( + "CollPatcherREC", OutputLevel=INFO, ProcessorType="PatchCollections" + ) + collPatcherRec.Parameters = { + "PatchCollections": parse_collection_patch_file(REC_COLLECTION_CONTENTS_FILE) + } + algList.append(collPatcherRec) + + Output_REC = create_writer("edm4hep", "Output_REC", f"{reco_args.outputBasename}_REC") + algList.append(Output_REC) -# Output_REC = create_writer("edm4hep", "Output_REC", f"{reco_args.outputBasename}_REC") -# algList.append(Output_REC) -iosvc.Output = f"{reco_args.outputBasename}_REC.edm4hep.root" + # FIXME: needs https://github.com/key4hep/k4FWCore/issues/226 + # Output_DST = create_writer("edm4hep", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST) + # algList.append(Output_DST) -# FIXME: needs https://github.com/key4hep/k4FWCore/issues/226 -# Output_DST = create_writer("edm4hep", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST) -# algList.append(Output_DST) # We need to convert the inputs in case we have EDM4hep input -# attach_edm4hep2lcio_conversion(algList, read) +attach_edm4hep2lcio_conversion(algList, read) # We need to convert the outputs in case we have EDM4hep output -# attach_lcio2edm4hep_conversion(algList) +attach_lcio2edm4hep_conversion(algList) +from Configurables import ApplicationMgr ApplicationMgr( TopAlg = algList, EvtSel = 'NONE', - EvtMax = 1, # Overridden by the --num-events switch to k4run + EvtMax = 3, # Overridden by the --num-events switch to k4run ExtSvc = svcList, OutputLevel=WARNING ) From 42614db4491cbc049b11fdc52ba539fa2d909b22 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 09:23:52 +0100 Subject: [PATCH 16/68] Add a file to be used with IOSvc --- CLDConfig/CLDReconstruction_iosvc.py | 184 +++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 CLDConfig/CLDReconstruction_iosvc.py diff --git a/CLDConfig/CLDReconstruction_iosvc.py b/CLDConfig/CLDReconstruction_iosvc.py new file mode 100644 index 0000000..5fe66a3 --- /dev/null +++ b/CLDConfig/CLDReconstruction_iosvc.py @@ -0,0 +1,184 @@ +# +# Copyright (c) 2014-2024 Key4hep-Project. +# +# This file is part of Key4hep. +# See https://key4hep.github.io/key4hep-doc/ for further info. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import os +from Gaudi.Configuration import INFO, WARNING, DEBUG + +from Configurables import EventDataSvc, MarlinProcessorWrapper +from k4FWCore import IOSvc, ApplicationMgr +from k4MarlinWrapper.inputReader import create_reader, attach_edm4hep2lcio_conversion +from k4FWCore.parseArgs import parser +from py_utils import SequenceLoader, attach_lcio2edm4hep_conversion, create_writer, parse_collection_patch_file + +import ROOT +ROOT.gROOT.SetBatch(True) + + +parser_group = parser.add_argument_group("CLDReconstruction.py custom options") +parser_group.add_argument("--inputFiles", action="extend", nargs="+", metavar=("file1", "file2"), help="One or multiple input files") +parser_group.add_argument("--outputBasename", help="Basename of the output file(s)", default="output") +parser_group.add_argument("--trackingOnly", action="store_true", help="Run only track reconstruction", default=False) +parser_group.add_argument("--enableLCFIJet", action="store_true", help="Enable LCFIPlus jet clustering parts", default=False) +parser_group.add_argument("--cms", action="store", help="Choose a Centre-of-Mass energy", default=240, choices=(91, 160, 240, 365), type=int) +parser_group.add_argument("--compactFile", help="Compact detector file to use", type=str, default=os.environ["K4GEO"] + "/FCCee/CLD/compact/CLD_o2_v07/CLD_o2_v07.xml") +parser_group.add_argument("--native", action="store_true", help="Use the native EDM4hep tracking", default=False) +tracking_group = parser_group.add_mutually_exclusive_group() +tracking_group.add_argument("--conformalTracking", action="store_true", default=True, help="Use conformal tracking pattern recognition") +tracking_group.add_argument("--truthTracking", action="store_true", default=False, help="Cheat tracking pattern recognition") +reco_args = parser.parse_known_args()[0] + +algList = [] +svcList = [] + +evtsvc = EventDataSvc("EventDataSvc") +svcList.append(evtsvc) + +iosvc = IOSvc("IOSvc") + +CONFIG = { + "CalorimeterIntegrationTimeWindow": "10ns", + "CalorimeterIntegrationTimeWindowChoices": ["10ns", "400ns"], + "Overlay": "False", + "OverlayChoices": ["False", "91GeV", "365GeV"], + "VertexUnconstrained": "OFF", + "VertexUnconstrainedChoices": ["ON", "OFF"], + "OutputMode": "EDM4Hep", + "OutputModeChoices": ["LCIO", "EDM4hep"] #, "both"] FIXME: both is not implemented yet +} + +REC_COLLECTION_CONTENTS_FILE = "collections_rec_level.txt" # file with the collections to be patched in when writing from LCIO to EDM4hep + +from Configurables import GeoSvc, TrackingCellIDEncodingSvc, Lcio2EDM4hepTool +geoservice = GeoSvc("GeoSvc") +geoservice.detectors = [reco_args.compactFile] +geoservice.OutputLevel = INFO +geoservice.EnableGeant4Geo = False +svcList.append(geoservice) + +cellIDSvc = TrackingCellIDEncodingSvc("CellIDSvc") +cellIDSvc.EncodingStringParameterName = "GlobalTrackerReadoutID" +cellIDSvc.GeoSvcName = geoservice.name() +cellIDSvc.OutputLevel = INFO +svcList.append(cellIDSvc) + +if len(geoservice.detectors) > 1: + # we are making assumptions for reconstruction parameters based on the detector option, so we limit the possibilities + raise RuntimeError("Too many XML files for the detector path, please only specify the main file!") + +# from https://github.com/HEP-FCC/FCCeePhysicsPerformance/blob/d6ecee2c2c3ed5d76db55a3ae18ced349b2b914a/General/README.md?plain=1#L457-L467 +# for december 2022 +BEAM_SPOT_SIZES = { 91: (5.96e-3, 23.8e-6, 0.397), + 160: (14.7e-3, 46.5e-6, 0.97), + 240: (9.8e-3, 25.4e-6, 0.65), + 365: (27.3e-3, 48.8e-6, 1.33), + } + +sequenceLoader = SequenceLoader( + algList, + # global_vars can be used in sequence-loaded modules without explicit import + global_vars={"CONFIG": CONFIG, "geoservice": geoservice, "reco_args": reco_args, + "BEAM_SPOT_SIZES": BEAM_SPOT_SIZES, + }, +) + +if reco_args.inputFiles: + iosvc.Input = reco_args.inputFiles +else: + print('WARNING: No input files specified, the CLD Reconstruction will fail') + read = None + +# MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") +# MyAIDAProcessor.OutputLevel = WARNING +# MyAIDAProcessor.ProcessorType = "AIDAProcessor" +# MyAIDAProcessor.Parameters = { +# "Compress": ["1"], +# "FileName": [f"{reco_args.outputBasename}_aida"], +# "FileType": ["root"] +# } + +# EventNumber = MarlinProcessorWrapper("EventNumber") +# EventNumber.OutputLevel = WARNING +# EventNumber.ProcessorType = "Statusmonitor" +# EventNumber.Parameters = { +# "HowOften": ["1"] +# } + +# setup AIDA histogramming and add eventual background overlay +# algList.append(MyAIDAProcessor) +# sequenceLoader.load("Overlay/Overlay") +# tracker hit digitisation +sequenceLoader.load("Tracking/TrackingDigi") + +# tracking +if reco_args.truthTracking: + sequenceLoader.load("Tracking/TruthTracking") +elif reco_args.conformalTracking: + sequenceLoader.load("Tracking/ConformalTracking") + +sequenceLoader.load("Tracking/Refit") + +# # calorimeter digitization and pandora +# if not reco_args.trackingOnly: +# sequenceLoader.load("CaloDigi/CaloDigi") +# sequenceLoader.load("CaloDigi/MuonDigi") +# sequenceLoader.load("ParticleFlow/Pandora") +# sequenceLoader.load("CaloDigi/LumiCal") +# # monitoring and Reco to MCTruth linking +# sequenceLoader.load("HighLevelReco/RecoMCTruthLink") +# sequenceLoader.load("Diagnostics/Tracking") +# # pfo selector (might need re-optimisation) +# if not reco_args.trackingOnly: +# sequenceLoader.load("HighLevelReco/PFOSelector") +# sequenceLoader.load("HighLevelReco/JetClusteringOrRenaming") +# sequenceLoader.load("HighLevelReco/JetAndVertex") +# # event number processor, down here to attach the conversion back to edm4hep to it +# algList.append(EventNumber) + +DST_KEEPLIST = ["MCParticlesSkimmed", "MCPhysicsParticles", "RecoMCTruthLink", "SiTracks", "SiTracks_Refitted", "PandoraClusters", "PandoraPFOs", "SelectedPandoraPFOs", "LooseSelectedPandoraPFOs", "TightSelectedPandoraPFOs", "RefinedVertexJets", "RefinedVertexJets_rel", "RefinedVertexJets_vtx", "RefinedVertexJets_vtx_RP", "BuildUpVertices", "BuildUpVertices_res", "BuildUpVertices_RP", "BuildUpVertices_res_RP", "BuildUpVertices_V0", "BuildUpVertices_V0_res", "BuildUpVertices_V0_RP", "BuildUpVertices_V0_res_RP", "PrimaryVertices", "PrimaryVertices_res", "PrimaryVertices_RP", "PrimaryVertices_res_RP", "RefinedVertices", "RefinedVertices_RP"] + +DST_SUBSETLIST = ["EfficientMCParticles", "InefficientMCParticles", "MCPhysicsParticles"] + +# Make sure that all collections are always available by patching in missing ones on-the-fly +# collPatcherRec = MarlinProcessorWrapper( +# "CollPatcherREC", OutputLevel=INFO, ProcessorType="PatchCollections" +# ) +# collPatcherRec.Parameters = { +# "PatchCollections": parse_collection_patch_file(REC_COLLECTION_CONTENTS_FILE) +# } +# algList.append(collPatcherRec) + +# Output_REC = create_writer("edm4hep", "Output_REC", f"{reco_args.outputBasename}_REC") +# algList.append(Output_REC) +iosvc.Output = f"{reco_args.outputBasename}_REC.edm4hep.root" + +# FIXME: needs https://github.com/key4hep/k4FWCore/issues/226 +# Output_DST = create_writer("edm4hep", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST) +# algList.append(Output_DST) + +# We need to convert the inputs in case we have EDM4hep input +# attach_edm4hep2lcio_conversion(algList, read) + +# We need to convert the outputs in case we have EDM4hep output +# attach_lcio2edm4hep_conversion(algList) + +ApplicationMgr( TopAlg = algList, + EvtSel = 'NONE', + EvtMax = 1, # Overridden by the --num-events switch to k4run + ExtSvc = svcList, + OutputLevel=WARNING + ) From 372468bc4889a9c6f621c6f1ee3ec96bcd3c7123 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 09:38:11 +0100 Subject: [PATCH 17/68] Add a native option to the main file that is always off --- CLDConfig/CLDReconstruction.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index 007cf31..df2b530 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -23,6 +23,8 @@ from k4MarlinWrapper.inputReader import create_reader, attach_edm4hep2lcio_conversion from k4FWCore.parseArgs import parser from py_utils import SequenceLoader, attach_lcio2edm4hep_conversion, create_writer, parse_collection_patch_file +from Configurables import GeoSvc, TrackingCellIDEncodingSvc +from Configurables import ApplicationMgr parser_group = parser.add_argument_group("CLDReconstruction.py custom options") parser_group.add_argument("--inputFiles", action="extend", nargs="+", metavar=("file1", "file2"), help="One or multiple input files") @@ -31,11 +33,15 @@ parser_group.add_argument("--enableLCFIJet", action="store_true", help="Enable LCFIPlus jet clustering parts", default=False) parser_group.add_argument("--cms", action="store", help="Choose a Centre-of-Mass energy", default=240, choices=(91, 160, 240, 365), type=int) parser_group.add_argument("--compactFile", help="Compact detector file to use", type=str, default=os.environ["K4GEO"] + "/FCCee/CLD/compact/CLD_o2_v07/CLD_o2_v07.xml") +parser_group.add_argument("--native", action="store_true", help="Use the native EDM4hep tracking", default=False) tracking_group = parser_group.add_mutually_exclusive_group() tracking_group.add_argument("--conformalTracking", action="store_true", default=True, help="Use conformal tracking pattern recognition") tracking_group.add_argument("--truthTracking", action="store_true", default=False, help="Cheat tracking pattern recognition") reco_args = parser.parse_known_args()[0] +if reco_args.native: + raise RuntimeError("The native implementation is not in this file, use CLDReconstruction_iosvc.py instead") + algList = [] svcList = [] @@ -55,7 +61,6 @@ REC_COLLECTION_CONTENTS_FILE = "collections_rec_level.txt" # file with the collections to be patched in when writing from LCIO to EDM4hep -from Configurables import GeoSvc, TrackingCellIDEncodingSvc, Lcio2EDM4hepTool geoservice = GeoSvc("GeoSvc") geoservice.detectors = [reco_args.compactFile] geoservice.OutputLevel = INFO @@ -179,7 +184,6 @@ # We need to convert the outputs in case we have EDM4hep output attach_lcio2edm4hep_conversion(algList) -from Configurables import ApplicationMgr ApplicationMgr( TopAlg = algList, EvtSel = 'NONE', EvtMax = 3, # Overridden by the --num-events switch to k4run From b3ab1bf0c277bebcc71ee950885e2ed207a8a4b5 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 09:51:37 +0100 Subject: [PATCH 18/68] Update --- CLDConfig/Tracking/ConformalTracking.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 0818775..8ca15df 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -128,12 +128,27 @@ steps_marlin = [] for name, param_dict in parameters.items(): + marlin_collections = [] + for i in range(len(param_dict["collections"])): + marlin_collections.append(f"{param_dict['collections'][i]}") + if i < len(param_dict["collections"]) - 1: + marlin_collections.append(",") + marlin_flags = [] + for i in range(len(param_dict["flags"])): + marlin_flags.append(f"{param_dict['flags'][i]}") + if i < len(param_dict["flags"]) - 1: + marlin_flags.append(",") + marlin_functions = [] + for i in range(len(param_dict["functions"])): + marlin_functions.append(f"{param_dict['functions'][i]}") + if i < len(param_dict["functions"]) - 1: + marlin_functions.append(",") current_step = [ f"[{name}]", - "@Collections", ":", ",".join(param_dict["collections"]), + "@Collections", ":", *marlin_collections, "@Parameters", ":", *[f"{k}:{v};" for k, v in param_dict["params"].items()], - "@Flags", ":", ",".join(param_dict["flags"]), - "@Functions", ":", ",".join(param_dict["functions"]), + "@Flags", ":", *marlin_flags, + "@Functions", ":", *marlin_functions, ] steps_marlin.extend(current_step) From fbf98095a67585f86cdafecf2ed082f0a6407b40 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 09:53:56 +0100 Subject: [PATCH 19/68] Update --- CLDConfig/Tracking/ConformalTracking.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 8ca15df..7af9dd2 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -133,6 +133,10 @@ marlin_collections.append(f"{param_dict['collections'][i]}") if i < len(param_dict["collections"]) - 1: marlin_collections.append(",") + marlin_parameters = [] + for i, (k, v) in enumerate(param_dict["params"].items()): + marlin_parameters.extend([k, ":", f"{v};"]) + marlin_flags = [] for i in range(len(param_dict["flags"])): marlin_flags.append(f"{param_dict['flags'][i]}") @@ -146,7 +150,7 @@ current_step = [ f"[{name}]", "@Collections", ":", *marlin_collections, - "@Parameters", ":", *[f"{k}:{v};" for k, v in param_dict["params"].items()], + "@Parameters", ":", *marlin_parameters, "@Flags", ":", *marlin_flags, "@Functions", ":", *marlin_functions, ] From a79e240fb671b6dc10abfa3ad36fb91167f474ac Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 09:54:56 +0100 Subject: [PATCH 20/68] Update --- CLDConfig/Tracking/ConformalTracking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 7af9dd2..18e2279 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -132,7 +132,7 @@ for i in range(len(param_dict["collections"])): marlin_collections.append(f"{param_dict['collections'][i]}") if i < len(param_dict["collections"]) - 1: - marlin_collections.append(",") + marlin_collections[-1] += "," marlin_parameters = [] for i, (k, v) in enumerate(param_dict["params"].items()): marlin_parameters.extend([k, ":", f"{v};"]) @@ -141,12 +141,12 @@ for i in range(len(param_dict["flags"])): marlin_flags.append(f"{param_dict['flags'][i]}") if i < len(param_dict["flags"]) - 1: - marlin_flags.append(",") + marlin_flags[-1] += "," marlin_functions = [] for i in range(len(param_dict["functions"])): marlin_functions.append(f"{param_dict['functions'][i]}") if i < len(param_dict["functions"]) - 1: - marlin_functions.append(",") + marlin_functions[-1] += "," current_step = [ f"[{name}]", "@Collections", ":", *marlin_collections, From 0b47c170620e62158ff0d184ae5b6aac8c46f96a Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 10:15:27 +0100 Subject: [PATCH 21/68] Fix extra comma --- CLDConfig/Tracking/ConformalTracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 18e2279..46583ab 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -175,7 +175,7 @@ conformal_tracking_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in conformal_tracking_args.items()} conformal_tracking_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in conformal_tracking_args_marlin.items()} -conformal_tracking_args_marlin["MCParticleCollectionName"] = ["MCParticle"], +conformal_tracking_args_marlin["MCParticleCollectionName"] = ["MCParticle"] if args[0].native: # Not implemented in Gaudi From 0e1825e49df8986002f175dd3d7a71673a2a5f6d Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 28 Mar 2025 10:25:53 +0100 Subject: [PATCH 22/68] Fix pre-commit --- CLDConfig/Tracking/ConformalTracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 46583ab..c98ef97 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -136,7 +136,7 @@ marlin_parameters = [] for i, (k, v) in enumerate(param_dict["params"].items()): marlin_parameters.extend([k, ":", f"{v};"]) - + marlin_flags = [] for i in range(len(param_dict["flags"])): marlin_flags.append(f"{param_dict['flags'][i]}") From 56ac1905cbca1196fb071833b54bd70dcf527708 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 14 Apr 2025 10:15:59 +0200 Subject: [PATCH 23/68] Add a function to convert to the format accepted by processors --- CLDConfig/Tracking/Refit.py | 5 ++--- CLDConfig/Tracking/TrackingDigi.py | 19 +++++++------------ CLDConfig/Tracking/TruthTracking.py | 4 ++-- CLDConfig/py_utils.py | 13 +++++++++++++ 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/CLDConfig/Tracking/Refit.py b/CLDConfig/Tracking/Refit.py index 94b0e0f..f51632e 100644 --- a/CLDConfig/Tracking/Refit.py +++ b/CLDConfig/Tracking/Refit.py @@ -18,6 +18,7 @@ # from Gaudi.Configuration import WARNING from k4FWCore.parseArgs import parser +from py_utils import toMarlinDict args = parser.parse_known_args() refit_args = { @@ -37,9 +38,7 @@ if args[0].native and not args[0].truthTracking: refit_args["InputRelationCollectionName"] = [] -refit_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in refit_args.items()} -refit_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in refit_args_marlin.items()} - +refit_args_marlin = toMarlinDict(refit_args) if args[0].native: from Configurables import RefitFinal diff --git a/CLDConfig/Tracking/TrackingDigi.py b/CLDConfig/Tracking/TrackingDigi.py index bbc7c39..b936f1c 100644 --- a/CLDConfig/Tracking/TrackingDigi.py +++ b/CLDConfig/Tracking/TrackingDigi.py @@ -18,6 +18,7 @@ # from Gaudi.Configuration import WARNING from k4FWCore.parseArgs import parser +from py_utils import toMarlinDict args = parser.parse_known_args() vxd_barrel_digitiser_args = { @@ -81,28 +82,22 @@ } -vxd_barrel_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_barrel_digitiser_args.items()} -vxd_barrel_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_barrel_digitiser_args_marlin.items()} +vxd_barrel_digitiser_args_marlin = toMarlinDict(vxd_barrel_digitiser_args) vxd_barrel_digitiser_args_marlin["SubDetectorName"] = [vxd_barrel_digitiser_args["SubDetectorName"]] -vxd_endcap_digitiser_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in vxd_endcap_digitiser_args.items()} -vxd_endcap_digitiser_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in vxd_endcap_digitiser_args_marlin.items()} +vxd_endcap_digitiser_args_marlin = toMarlinDict(vxd_endcap_digitiser_args) vxd_endcap_digitiser_args_marlin["SubDetectorName"] = [vxd_endcap_digitiser_args["SubDetectorName"]] -inner_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_planar_digi_processor_args.items()} -inner_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_planar_digi_processor_args_marlin.items()} +inner_planar_digi_processor_args_marlin = toMarlinDict(inner_planar_digi_processor_args) inner_planar_digi_processor_args_marlin["SubDetectorName"] = [inner_planar_digi_processor_args["SubDetectorName"]] -inner_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in inner_endcap_planar_digi_processor_args.items()} -inner_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in inner_endcap_planar_digi_processor_args_marlin.items()} +inner_endcap_planar_digi_processor_args_marlin = toMarlinDict(inner_endcap_planar_digi_processor_args) inner_endcap_planar_digi_processor_args_marlin["SubDetectorName"] = [inner_endcap_planar_digi_processor_args["SubDetectorName"]] -outer_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_planar_digi_processor_args.items()} -outer_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_planar_digi_processor_args_marlin.items()} +outer_planar_digi_processor_args_marlin = toMarlinDict(outer_planar_digi_processor_args) outer_planar_digi_processor_args_marlin["SubDetectorName"] = [outer_planar_digi_processor_args["SubDetectorName"]] -outer_endcap_planar_digi_processor_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in outer_endcap_planar_digi_processor_args.items()} -outer_endcap_planar_digi_processor_args_marlin = {k: [str(elem) for elem in v] if isinstance(v, list) else v for k, v in outer_endcap_planar_digi_processor_args_marlin.items()} +outer_endcap_planar_digi_processor_args_marlin = toMarlinDict(outer_endcap_planar_digi_processor_args) outer_endcap_planar_digi_processor_args_marlin["SubDetectorName"] = [outer_endcap_planar_digi_processor_args["SubDetectorName"]] diff --git a/CLDConfig/Tracking/TruthTracking.py b/CLDConfig/Tracking/TruthTracking.py index f36547a..a3c2c35 100644 --- a/CLDConfig/Tracking/TruthTracking.py +++ b/CLDConfig/Tracking/TruthTracking.py @@ -18,6 +18,7 @@ # from Gaudi.Configuration import WARNING from k4FWCore.parseArgs import parser +from py_utils import toMarlinDict args = parser.parse_known_args() truth_track_finder_args = { @@ -29,8 +30,7 @@ "TrackerHitCollectionNames": ["VXDTrackerHits", "ITrackerHits", "OTrackerHits", "VXDEndcapTrackerHits", "ITrackerEndcapHits", "OTrackerEndcapHits"], "UseTruthInPrefit": False, } -# Change True to ["true"] and False to ["false"] if using MarlinProcessorWrapper -truth_track_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in truth_track_finder_args.items()} +truth_track_finder_args_marlin = toMarlinDict(truth_track_finder_args) truth_track_finder_args_marlin["MCParticleCollectionName"] = ["MCParticle"] if args[0].native: diff --git a/CLDConfig/py_utils.py b/CLDConfig/py_utils.py index 1b2143a..8297d68 100644 --- a/CLDConfig/py_utils.py +++ b/CLDConfig/py_utils.py @@ -228,3 +228,16 @@ def parse_collection_patch_file(patch_file: Union[str, os.PathLike]) -> List[str # Flatten the list of lists into one large list return [s for strings in patch_colls for s in strings] + + +def toMarlinDict(dict: Dict[str, Any]) -> Dict[str, Any]: + """Convert a dictionary to a Marlin-compatible format. + + Args: + dict (Dict[str, Any]): The dictionary to convert. + + Returns: + Dict[str, Any]: The converted dictionary. + """ + + return {k: [str(v).lower()] if isinstance(v, bool) else [str(elem) for elem in v] if isinstance(v, list) else [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in dict.items()} From 011bc17306f5f4a9742274793ccf3c6ac163e794 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 14 Apr 2025 10:32:52 +0200 Subject: [PATCH 24/68] Add DDCaloDigi to the native reconstruction chain --- CLDConfig/CLDReconstruction_iosvc.py | 4 +- CLDConfig/CaloDigi/CaloDigi.py | 231 +++++++++++++++------------ 2 files changed, 134 insertions(+), 101 deletions(-) diff --git a/CLDConfig/CLDReconstruction_iosvc.py b/CLDConfig/CLDReconstruction_iosvc.py index 5fe66a3..3c1cb26 100644 --- a/CLDConfig/CLDReconstruction_iosvc.py +++ b/CLDConfig/CLDReconstruction_iosvc.py @@ -133,8 +133,8 @@ sequenceLoader.load("Tracking/Refit") # # calorimeter digitization and pandora -# if not reco_args.trackingOnly: -# sequenceLoader.load("CaloDigi/CaloDigi") +if not reco_args.trackingOnly: + sequenceLoader.load("CaloDigi/CaloDigi") # sequenceLoader.load("CaloDigi/MuonDigi") # sequenceLoader.load("ParticleFlow/Pandora") # sequenceLoader.load("CaloDigi/LumiCal") diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index e403afa..821c09d 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -17,117 +17,150 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper +from Configurables import MarlinProcessorWrapper, DDCaloDigi import sys +ECALCollections = ["ECalBarrelCollection", "ECalEndcapCollection"] +ECALOutputCollections = ["ECALBarrel", "ECALEndcap", ""] +HCALCollections = ["HCalBarrelCollection", "HCalEndcapCollection", "HCalRingCollection"] +HCALOutputCollections = ["HCALBarrel", "HCALEndcap", "HCALOther"] + MyDDCaloDigiParameters = { - "Histograms": ["0"], - "RootFile": ["Digi_SiW.root"], - "RelationOutputCollection": ["RelationCaloHit"], - "energyPerEHpair": ["3.6"], - # ECAL - "ECALCollections": ["ECalBarrelCollection", "ECalEndcapCollection"], - "ECALOutputCollection0": ["ECALBarrel"], - "ECALOutputCollection1": ["ECALEndcap"], - "ECALOutputCollection2": [""], - "IfDigitalEcal": ["0"], - "ECALLayers": ["41", "100"], - "ECAL_default_layerConfig": ["000000000000000"], - "StripEcal_default_nVirtualCells": ["9"], - "CalibECALMIP": ["0.0001"], - "ECALThreshold": ["5e-05"], - "ECALThresholdUnit": ["GeV"], - "ECALGapCorrection": ["1"], - "ECALGapCorrectionFactor": ["1"], - "ECALModuleGapCorrectionFactor": ["0.0"], - "MapsEcalCorrection": ["0"], - "ECAL_PPD_N_Pixels": ["10000"], - "ECAL_PPD_N_Pixels_uncertainty": ["0.05"], - "ECAL_PPD_PE_per_MIP": ["7"], - "ECAL_apply_realistic_digi": ["0"], - "ECAL_deadCellRate": ["0"], - "ECAL_deadCell_memorise": ["false"], - "ECAL_elec_noise_mips": ["0"], - "ECAL_maxDynamicRange_MIP": ["2500"], - "ECAL_miscalibration_correl": ["0"], - "ECAL_miscalibration_uncorrel": ["0"], - "ECAL_miscalibration_uncorrel_memorise": ["false"], - "ECAL_pixel_spread": ["0.05"], - "ECAL_strip_absorbtionLength": ["1e+06"], - "UseEcalTiming": ["1"], - "ECALCorrectTimesForPropagation": ["1"], - "ECALTimeWindowMin": ["-1"], - "ECALSimpleTimingCut": ["true"], - "ECALDeltaTimeHitResolution": ["10"], - "ECALTimeResolution": ["10"], - # HCAL - "HCALCollections": ["HCalBarrelCollection", "HCalEndcapCollection", "HCalRingCollection"], - "HCALOutputCollection0": ["HCALBarrel"], - "HCALOutputCollection1": ["HCALEndcap"], - "HCALOutputCollection2": ["HCALOther"], - "IfDigitalHcal": ["0"], - "HCALLayers": ["100"], - "CalibHCALMIP": ["0.0001"], - "HCALThreshold": ["0.00025"], - "HCALThresholdUnit": ["GeV"], - "HCALEndcapCorrectionFactor": ["1.000"], - "HCALGapCorrection": ["1"], - "HCALModuleGapCorrectionFactor": ["0.5"], - "HCAL_PPD_N_Pixels": ["400"], - "HCAL_PPD_N_Pixels_uncertainty": ["0.05"], - "HCAL_PPD_PE_per_MIP": ["10"], - "HCAL_apply_realistic_digi": ["0"], - "HCAL_deadCellRate": ["0"], - "HCAL_deadCell_memorise": ["false"], - "HCAL_elec_noise_mips": ["0"], - "HCAL_maxDynamicRange_MIP": ["200"], - "HCAL_miscalibration_correl": ["0"], - "HCAL_miscalibration_uncorrel": ["0"], - "HCAL_miscalibration_uncorrel_memorise": ["false"], - "HCAL_pixel_spread": ["0"], - "UseHcalTiming": ["1"], - "HCALCorrectTimesForPropagation": ["1"], - "HCALTimeWindowMin": ["-1"], - "HCALSimpleTimingCut": ["true"], - "HCALDeltaTimeHitResolution": ["10"], - "HCALTimeResolution": ["10"], + "Histograms": 0, + "RootFile": "Digi_SiW.root", + "energyPerEHpair": 3.6, + # ECAL + "IfDigitalEcal": 0, + "ECALLayers": [41, 100], + "ECAL_default_layerConfig": "000000000000000", + "StripEcal_default_nVirtualCells": 9, + "CalibECALMIP": 0.0001, + "ECALThreshold": 5e-05, + "ECALThresholdUnit": "GeV", + "ECALGapCorrection": 1, + "ECALGapCorrectionFactor": 1, + "ECALModuleGapCorrectionFactor": 0.0, + "MapsEcalCorrection": 0, + "ECAL_PPD_N_Pixels": 10000, + "ECAL_PPD_N_Pixels_uncertainty": 0.05, + "ECAL_PPD_PE_per_MIP": 7, + "ECAL_apply_realistic_digi": 0, + "ECAL_deadCellRate": 0, + "ECAL_deadCell_memorise": False, + "ECAL_elec_noise_mips": 0, + "ECAL_maxDynamicRange_MIP": 2500, + "ECAL_miscalibration_correl": 0, + "ECAL_miscalibration_uncorrel": 0, + "ECAL_miscalibration_uncorrel_memorise": False, + "ECAL_pixel_spread": 0.05, + "ECAL_strip_absorbtionLength": 1e+06, + "UseEcalTiming": 1, + "ECALCorrectTimesForPropagation": 1, + "ECALTimeWindowMin": -1, + "ECALSimpleTimingCut": True, + "ECALDeltaTimeHitResolution": 10, + "ECALTimeResolution": 10, + # HCAL + "IfDigitalHcal": 0, + "HCALLayers": [100], + "CalibHCALMIP": 0.0001, + "HCALThreshold": [0.00025], + "HCALThresholdUnit": "GeV", + "HCALEndcapCorrectionFactor": 1.000, + "HCALGapCorrection": 1, + "HCALModuleGapCorrectionFactor": 0.5, + "HCAL_PPD_N_Pixels": 400, + "HCAL_PPD_N_Pixels_uncertainty": 0.05, + "HCAL_PPD_PE_per_MIP": 10, + "HCAL_apply_realistic_digi": 0, + "HCAL_deadCellRate": 0, + "HCAL_deadCell_memorise": False, + "HCAL_elec_noise_mips": 0, + "HCAL_maxDynamicRange_MIP": 200, + "HCAL_miscalibration_correl": 0, + "HCAL_miscalibration_uncorrel": 0, + "HCAL_miscalibration_uncorrel_memorise": False, + "HCAL_pixel_spread": 0, + "UseHcalTiming": 1, + "HCALCorrectTimesForPropagation": 1, + "HCALTimeWindowMin": -1, + "HCALSimpleTimingCut": True, + "HCALDeltaTimeHitResolution": 10, + "HCALTimeResolution": 10, +} + +parameters_10ns = { + "CalibrECAL": [37.5227197175, 37.5227197175], + "ECALEndcapCorrectionFactor": 1.03245503522, + "ECALBarrelTimeWindowMax": 10, + "ECALEndcapTimeWindowMax": 10, + "CalibrHCALBarrel": [45.9956826061], + "CalibrHCALEndcap": [46.9252540291], + "CalibrHCALOther": [57.4588011802], + "HCALBarrelTimeWindowMax": 10, + "HCALEndcapTimeWindowMax": 10, } +parameters_400ns = { + "CalibrECAL": [37.4591745147, 37.4591745147], + "ECALEndcapCorrectionFactor": 1.01463983425, + "ECALBarrelTimeWindowMax": 400, + "ECALEndcapTimeWindowMax": 400, + "CalibrHCALBarrel": [42.544403752], + "CalibrHCALEndcap": [42.9667604345], + "CalibrHCALOther": [51.3503963688], + "HCALBarrelTimeWindowMax": 400, + "HCALEndcapTimeWindowMax": 400, +} -MyDDCaloDigi = MarlinProcessorWrapper(f"MyDDCaloDigi_{CONFIG['CalorimeterIntegrationTimeWindow']}") -MyDDCaloDigi.OutputLevel = WARNING -MyDDCaloDigi.ProcessorType = "DDCaloDigi" -MyDDCaloDigi.Parameters = MyDDCaloDigiParameters.copy() -if CONFIG["CalorimeterIntegrationTimeWindow"] == "10ns": - MyDDCaloDigi.Parameters |= { - "CalibrECAL": ["37.5227197175", "37.5227197175"], - "ECALEndcapCorrectionFactor": ["1.03245503522"], - "ECALBarrelTimeWindowMax": ["10"], - "ECALEndcapTimeWindowMax": ["10"], - "CalibrHCALBarrel": ["45.9956826061"], - "CalibrHCALEndcap": ["46.9252540291"], - "CalibrHCALOther": ["57.4588011802"], - "HCALBarrelTimeWindowMax": ["10"], - "HCALEndcapTimeWindowMax": ["10"], - } +if reco_args.native: + # Not implemented + for key in ["Histograms", "RootFile", "ECAL_apply_realistic_digi", "HCAL_apply_realistic_digi"]: + MyDDCaloDigiParameters.pop(key) +else: + MyDDCaloDigiParameters["RelationOutputCollection"] = "RelationCaloHit" + MyDDCaloDigiParameters["ECALCollections"] = ECALCollections + for i in range(len(ECALCollections)): + MyDDCaloDigiParameters[f"ECALOutputCollection{i}"] = ECALOutputCollections[i] + MyDDCaloDigiParameters["HCALCollections"] = HCALCollections + for i in range(len(HCALCollections)): + MyDDCaloDigiParameters[f"HCALOutputCollection{i}"] = HCALOutputCollections[i] + MyDDCaloDigi = [MarlinProcessorWrapper(f"MyDDCaloDigi_{CONFIG['CalorimeterIntegrationTimeWindow']}")] + MyDDCaloDigi[0].OutputLevel = WARNING + MyDDCaloDigi[0].ProcessorType = "DDCaloDigi" + MyDDCaloDigi[0].Parameters = MyDDCaloDigiParameters + + +if CONFIG["CalorimeterIntegrationTimeWindow"] == "10ns": + parameters = parameters_10ns elif CONFIG["CalorimeterIntegrationTimeWindow"] == "400ns": - MyDDCaloDigi.Parameters |= { - "CalibrECAL": ["37.4591745147", "37.4591745147"], - "ECALEndcapCorrectionFactor": ["1.01463983425"], - "ECALBarrelTimeWindowMax": ["400"], - "ECALEndcapTimeWindowMax": ["400"], - "CalibrHCALBarrel": ["42.544403752"], - "CalibrHCALEndcap": ["42.9667604345"], - "CalibrHCALOther": ["51.3503963688"], - "HCALBarrelTimeWindowMax": ["400"], - "HCALEndcapTimeWindowMax": ["400"], - } + parameters = parameters_400ns else: print(f"The value {CONFIG['CalorimeterIntegrationTimeWindow']} " "for the calorimeter integration time window is not a valid choice") sys.exit(1) -CaloDigiSequence = [MyDDCaloDigi] +if reco_args.native: + final_parameters = MyDDCaloDigiParameters | parameters + MyDDCaloDigi = [] + collections = ECALCollections + HCALCollections + out_collections = [elem for elem in ECALOutputCollections + HCALOutputCollections if elem] + for incol, outcol in zip(collections, out_collections): + MyDDCaloDigi.append( + DDCaloDigi( + f"{incol}Digitiser", + **final_parameters, + InputCaloHitCollection=[incol], + OutputCaloHitCollection=[outcol], + RelationOutputCollection=[f"GaudiRelationCaloHit{outcol}"], + OutputLevel=WARNING, + ) + ) +else: + MyDDCaloDigi.Parameters |= toMarlinDict(parameters_10ns) + + +CaloDigiSequence = MyDDCaloDigi From 7aacef30e792e0d93bc8dcfbe48c6b7853509409 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 14 Apr 2025 10:34:17 +0200 Subject: [PATCH 25/68] Fix list --- CLDConfig/CaloDigi/CaloDigi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index 821c09d..cb3ab67 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -160,7 +160,7 @@ ) ) else: - MyDDCaloDigi.Parameters |= toMarlinDict(parameters_10ns) + MyDDCaloDigi[0].Parameters |= toMarlinDict(parameters_10ns) CaloDigiSequence = MyDDCaloDigi From 9b6892fc273c833c082a1d7d9694452ea0cda9e4 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 14 Apr 2025 10:34:59 +0200 Subject: [PATCH 26/68] Add missing import --- CLDConfig/CaloDigi/CaloDigi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index cb3ab67..d5d64db 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -18,6 +18,7 @@ # from Gaudi.Configuration import WARNING from Configurables import MarlinProcessorWrapper, DDCaloDigi +from py_utils import toMarlinDict import sys From dc73ea08c0dc7c966a5014549bff65f783fbc092 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 14 Apr 2025 10:36:14 +0200 Subject: [PATCH 27/68] Transform to the Marlin format --- CLDConfig/CaloDigi/CaloDigi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index d5d64db..8246a88 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -132,7 +132,7 @@ MyDDCaloDigi = [MarlinProcessorWrapper(f"MyDDCaloDigi_{CONFIG['CalorimeterIntegrationTimeWindow']}")] MyDDCaloDigi[0].OutputLevel = WARNING MyDDCaloDigi[0].ProcessorType = "DDCaloDigi" - MyDDCaloDigi[0].Parameters = MyDDCaloDigiParameters + MyDDCaloDigi[0].Parameters = toMarlinDict(MyDDCaloDigiParameters) if CONFIG["CalorimeterIntegrationTimeWindow"] == "10ns": From ad102ae28d9ec2abdf41c239a45a19c2ac715586 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 14 Apr 2025 10:40:49 +0200 Subject: [PATCH 28/68] Use lists for Marlin --- CLDConfig/CaloDigi/CaloDigi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index 8246a88..0c91272 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -121,13 +121,13 @@ for key in ["Histograms", "RootFile", "ECAL_apply_realistic_digi", "HCAL_apply_realistic_digi"]: MyDDCaloDigiParameters.pop(key) else: - MyDDCaloDigiParameters["RelationOutputCollection"] = "RelationCaloHit" + MyDDCaloDigiParameters["RelationOutputCollection"] = ["RelationCaloHit"] MyDDCaloDigiParameters["ECALCollections"] = ECALCollections for i in range(len(ECALCollections)): - MyDDCaloDigiParameters[f"ECALOutputCollection{i}"] = ECALOutputCollections[i] + MyDDCaloDigiParameters[f"ECALOutputCollection{i}"] = [ECALOutputCollections[i]] MyDDCaloDigiParameters["HCALCollections"] = HCALCollections for i in range(len(HCALCollections)): - MyDDCaloDigiParameters[f"HCALOutputCollection{i}"] = HCALOutputCollections[i] + MyDDCaloDigiParameters[f"HCALOutputCollection{i}"] = [HCALOutputCollections[i]] MyDDCaloDigi = [MarlinProcessorWrapper(f"MyDDCaloDigi_{CONFIG['CalorimeterIntegrationTimeWindow']}")] MyDDCaloDigi[0].OutputLevel = WARNING From 0848a390d8eae94873b43b0b1db8ed2d8ade1f82 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 14 Apr 2025 11:14:26 +0200 Subject: [PATCH 29/68] Also convert strings --- CLDConfig/py_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/py_utils.py b/CLDConfig/py_utils.py index 8297d68..cbd3093 100644 --- a/CLDConfig/py_utils.py +++ b/CLDConfig/py_utils.py @@ -240,4 +240,4 @@ def toMarlinDict(dict: Dict[str, Any]) -> Dict[str, Any]: Dict[str, Any]: The converted dictionary. """ - return {k: [str(v).lower()] if isinstance(v, bool) else [str(elem) for elem in v] if isinstance(v, list) else [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in dict.items()} + return {k: [str(v).lower()] if isinstance(v, bool) else [str(elem) for elem in v] if isinstance(v, list) else [str(v)] if isinstance(v, float) or isinstance(v, int) else [v] if isinstance(v, str) else v for k, v in dict.items()} From 1d1a7578a5486e994cbc167434a4ef213986925c Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 08:58:39 +0200 Subject: [PATCH 30/68] Add MuonDigi --- CLDConfig/CLDReconstruction_iosvc.py | 2 +- CLDConfig/CaloDigi/MuonDigi.py | 33 +++++++++++++++++----------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/CLDConfig/CLDReconstruction_iosvc.py b/CLDConfig/CLDReconstruction_iosvc.py index 3c1cb26..f9d06b2 100644 --- a/CLDConfig/CLDReconstruction_iosvc.py +++ b/CLDConfig/CLDReconstruction_iosvc.py @@ -135,7 +135,7 @@ # # calorimeter digitization and pandora if not reco_args.trackingOnly: sequenceLoader.load("CaloDigi/CaloDigi") -# sequenceLoader.load("CaloDigi/MuonDigi") + sequenceLoader.load("CaloDigi/MuonDigi") # sequenceLoader.load("ParticleFlow/Pandora") # sequenceLoader.load("CaloDigi/LumiCal") # # monitoring and Reco to MCTruth linking diff --git a/CLDConfig/CaloDigi/MuonDigi.py b/CLDConfig/CaloDigi/MuonDigi.py index 195bc96..bf59c54 100644 --- a/CLDConfig/CaloDigi/MuonDigi.py +++ b/CLDConfig/CaloDigi/MuonDigi.py @@ -17,21 +17,28 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper +from py_utils import toMarlinDict +from Configurables import DDSimpleMuonDigi +MyDDSimpleMuonDigiParameters = { + "CalibrMUON": 70.1, + "MUONCollection": ["YokeBarrelCollection", "YokeEndcapCollection"], + "MUONOutputCollection": ["MUON"], + "MaxHitEnergyMUON": 2.0, + "MuonThreshold": 1e-06, + "RelationOutputCollection": ["RelationMuonHit"] +} -MyDDSimpleMuonDigi = MarlinProcessorWrapper("MyDDSimpleMuonDigi") -MyDDSimpleMuonDigi.OutputLevel = WARNING -MyDDSimpleMuonDigi.ProcessorType = "DDSimpleMuonDigi" -MyDDSimpleMuonDigi.Parameters = { - "CalibrMUON": ["70.1"], - "MUONCollections": ["YokeBarrelCollection", "YokeEndcapCollection"], - "MUONOutputCollection": ["MUON"], - "MaxHitEnergyMUON": ["2.0"], - "MuonThreshold": ["1e-06"], - "RelationOutputCollection": ["RelationMuonHit"] - } - +if reco_args.native: + MyDDSimpleMuonDigi = DDSimpleMuonDigi(**MyDDSimpleMuonDigiParameters) +else: + from Configurables import MarlinProcessorWrapper + MyDDSimpleMuonDigiParameters["MUONCollections"] = MyDDSimpleMuonDigiParameters["MUONCollection"] + MyDDSimpleMuonDigiParameters["MUONOutputCollections"] = MyDDSimpleMuonDigiParameters["MUONOutputCollection"] + MyDDSimpleMuonDigi = MarlinProcessorWrapper("MyDDSimpleMuonDigi") + MyDDSimpleMuonDigi.OutputLevel = WARNING + MyDDSimpleMuonDigi.ProcessorType = "DDSimpleMuonDigi" + MyDDSimpleMuonDigi.Parameters = toMarlinDict(MyDDSimpleMuonDigiParameters) MuonDigiSequence = [ MyDDSimpleMuonDigi, ] From 8cbf3d5c3159389bcaef5e03fbe8154b45d3824b Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 09:27:56 +0200 Subject: [PATCH 31/68] Give a name to the muon digi algorithm --- CLDConfig/CaloDigi/MuonDigi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CLDConfig/CaloDigi/MuonDigi.py b/CLDConfig/CaloDigi/MuonDigi.py index bf59c54..a0dec00 100644 --- a/CLDConfig/CaloDigi/MuonDigi.py +++ b/CLDConfig/CaloDigi/MuonDigi.py @@ -16,9 +16,9 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from Configurables import DDSimpleMuonDigi from Gaudi.Configuration import WARNING from py_utils import toMarlinDict -from Configurables import DDSimpleMuonDigi MyDDSimpleMuonDigiParameters = { "CalibrMUON": 70.1, @@ -30,7 +30,7 @@ } if reco_args.native: - MyDDSimpleMuonDigi = DDSimpleMuonDigi(**MyDDSimpleMuonDigiParameters) + MyDDSimpleMuonDigi = DDSimpleMuonDigi("MyDDSimpleMuonDigi", **MyDDSimpleMuonDigiParameters) else: from Configurables import MarlinProcessorWrapper MyDDSimpleMuonDigiParameters["MUONCollections"] = MyDDSimpleMuonDigiParameters["MUONCollection"] From 870671ab105ffc7d8556158868477c456d54b7b1 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 09:33:52 +0200 Subject: [PATCH 32/68] Add LumiCal --- CLDConfig/CLDReconstruction_iosvc.py | 2 +- CLDConfig/CaloDigi/LumiCal.py | 63 ++++++++++++++++------------ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/CLDConfig/CLDReconstruction_iosvc.py b/CLDConfig/CLDReconstruction_iosvc.py index f9d06b2..0f3b257 100644 --- a/CLDConfig/CLDReconstruction_iosvc.py +++ b/CLDConfig/CLDReconstruction_iosvc.py @@ -136,8 +136,8 @@ if not reco_args.trackingOnly: sequenceLoader.load("CaloDigi/CaloDigi") sequenceLoader.load("CaloDigi/MuonDigi") + sequenceLoader.load("CaloDigi/LumiCal") # sequenceLoader.load("ParticleFlow/Pandora") -# sequenceLoader.load("CaloDigi/LumiCal") # # monitoring and Reco to MCTruth linking # sequenceLoader.load("HighLevelReco/RecoMCTruthLink") # sequenceLoader.load("Diagnostics/Tracking") diff --git a/CLDConfig/CaloDigi/LumiCal.py b/CLDConfig/CaloDigi/LumiCal.py index 5b5a07f..882e84c 100644 --- a/CLDConfig/CaloDigi/LumiCal.py +++ b/CLDConfig/CaloDigi/LumiCal.py @@ -16,35 +16,46 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from Configurables import GaudiLumiCalClusterer from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper +from py_utils import toMarlinDict +LumiCalParameters = { + "ClusterMinNumHits": 15, + "ElementsPercentInShowerPeakLayer": 0.03, + "EnergyCalibConst": 0.01213, + "LogWeigthConstant": 6.5, + "LumiCal_Clusters": ["LumiCalClusters"], + "LumiCal_Collection": ["LumiCalCollection"], + "LumiCal_RecoParticles": ["LumiCalRecoParticles"], + "MaxRecordNumber": 10, + "MemoryResidentTree": 0, + "MiddleEnergyHitBoundFrac": 0.01, + "MinClusterEngy": 2.0, + "MinHitEnergy": 20e-06, + "MoliereRadius": 20, + "NumEventsTree": 500, + "NumOfNearNeighbor": 6, + "OutDirName": "rootOut", + "OutRootFileName": "", + "SkipNEvents": 0, + "WeightingMethod": "LogMethod", + "ZLayerPhiOffset": 0.0 +} -LumiCalReco = MarlinProcessorWrapper("LumiCalReco") -LumiCalReco.OutputLevel = WARNING -LumiCalReco.ProcessorType = "MarlinLumiCalClusterer" -LumiCalReco.Parameters = { - "ClusterMinNumHits": ["15"], - "ElementsPercentInShowerPeakLayer": ["0.03"], - "EnergyCalibConst": ["0.01213"], - "LogWeigthConstant": ["6.5"], - "LumiCal_Clusters": ["LumiCalClusters"], - "LumiCal_Collection": ["LumiCalCollection"], - "LumiCal_RecoParticles": ["LumiCalRecoParticles"], - "MaxRecordNumber": ["10"], - "MemoryResidentTree": ["0"], - "MiddleEnergyHitBoundFrac": ["0.01"], - "MinClusterEngy": ["2.0"], - "MinHitEnergy": ["20e-06"], - "MoliereRadius": ["20"], - "NumEventsTree": ["500"], - "NumOfNearNeighbor": ["6"], - "OutDirName": ["rootOut"], - "OutRootFileName": [], - "SkipNEvents": ["0"], - "WeightingMethod": ["LogMethod"], - "ZLayerPhiOffset": ["0.0"] - } +if reco_args.native: + # Not used in the algorithm since this is controlled by Gaudi + LumiCalParameters.pop("SkipNEvents") + # Not used, as it is only used in the function removed in https://github.com/FCALSW/FCalClusterer/pull/75 + # that has been removed in the algorithm + LumiCalParameters.pop("ZLayerPhiOffset") + LumiCalReco = GaudiLumiCalClusterer("LumiCalReco", **LumiCalParameters) +else: + from Configurables import MarlinProcessorWrapper + LumiCalReco = MarlinProcessorWrapper("LumiCalReco") + LumiCalReco.OutputLevel = WARNING + LumiCalReco.ProcessorType = "MarlinLumiCalClusterer" + LumiCalReco.Parameters = toMarlinDict(LumiCalParameters) LumiCalSequence = [ LumiCalReco, From ee4159a2f3a0478505efb4f196aad0ada5a31b97 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 10:03:06 +0200 Subject: [PATCH 33/68] Simplify lists --- CLDConfig/CaloDigi/LumiCal.py | 4 +--- CLDConfig/CaloDigi/MuonDigi.py | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/CLDConfig/CaloDigi/LumiCal.py b/CLDConfig/CaloDigi/LumiCal.py index 882e84c..2c1f8a1 100644 --- a/CLDConfig/CaloDigi/LumiCal.py +++ b/CLDConfig/CaloDigi/LumiCal.py @@ -57,6 +57,4 @@ LumiCalReco.ProcessorType = "MarlinLumiCalClusterer" LumiCalReco.Parameters = toMarlinDict(LumiCalParameters) -LumiCalSequence = [ - LumiCalReco, -] +LumiCalSequence = [LumiCalReco] diff --git a/CLDConfig/CaloDigi/MuonDigi.py b/CLDConfig/CaloDigi/MuonDigi.py index a0dec00..85083d6 100644 --- a/CLDConfig/CaloDigi/MuonDigi.py +++ b/CLDConfig/CaloDigi/MuonDigi.py @@ -39,6 +39,5 @@ MyDDSimpleMuonDigi.OutputLevel = WARNING MyDDSimpleMuonDigi.ProcessorType = "DDSimpleMuonDigi" MyDDSimpleMuonDigi.Parameters = toMarlinDict(MyDDSimpleMuonDigiParameters) -MuonDigiSequence = [ - MyDDSimpleMuonDigi, -] + +MuonDigiSequence = [MyDDSimpleMuonDigi] From 71585cbd2dba0bf87f27ee2db7561208a9f2b44f Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 10:45:24 +0200 Subject: [PATCH 34/68] Add a collection merger to have a single link collection as output for the DDCaloDigi --- CLDConfig/CaloDigi/CaloDigi.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index 0c91272..388cc73 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -17,7 +17,8 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper, DDCaloDigi +from Configurables import DDCaloDigi +from Configurables import CollectionMerger from py_utils import toMarlinDict import sys @@ -121,6 +122,7 @@ for key in ["Histograms", "RootFile", "ECAL_apply_realistic_digi", "HCAL_apply_realistic_digi"]: MyDDCaloDigiParameters.pop(key) else: + from Configurables import MarlinProcessorWrapper MyDDCaloDigiParameters["RelationOutputCollection"] = ["RelationCaloHit"] MyDDCaloDigiParameters["ECALCollections"] = ECALCollections for i in range(len(ECALCollections)): @@ -160,6 +162,13 @@ OutputLevel=WARNING, ) ) + merger = CollectionMerger( + "CollectionMerger", + InputCollections=[f"GaudiRelationCaloHit{outcol}" for outcol in out_collections], + OutputCollection=["RelationCaloHit"], + ) + MyDDCaloDigi.append(merger) + else: MyDDCaloDigi[0].Parameters |= toMarlinDict(parameters_10ns) From 669ead7f7a6e2ae4af0469f2ea0b201d98dbb478 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 10:52:56 +0200 Subject: [PATCH 35/68] Add Pandora --- CLDConfig/CLDReconstruction_iosvc.py | 2 +- CLDConfig/ParticleFlow/Pandora.py | 242 ++++++++++++++------------- 2 files changed, 127 insertions(+), 117 deletions(-) diff --git a/CLDConfig/CLDReconstruction_iosvc.py b/CLDConfig/CLDReconstruction_iosvc.py index 0f3b257..a5825bb 100644 --- a/CLDConfig/CLDReconstruction_iosvc.py +++ b/CLDConfig/CLDReconstruction_iosvc.py @@ -137,7 +137,7 @@ sequenceLoader.load("CaloDigi/CaloDigi") sequenceLoader.load("CaloDigi/MuonDigi") sequenceLoader.load("CaloDigi/LumiCal") -# sequenceLoader.load("ParticleFlow/Pandora") + sequenceLoader.load("ParticleFlow/Pandora") # # monitoring and Reco to MCTruth linking # sequenceLoader.load("HighLevelReco/RecoMCTruthLink") # sequenceLoader.load("Diagnostics/Tracking") diff --git a/CLDConfig/ParticleFlow/Pandora.py b/CLDConfig/ParticleFlow/Pandora.py index 1a4a556..15ad101 100644 --- a/CLDConfig/ParticleFlow/Pandora.py +++ b/CLDConfig/ParticleFlow/Pandora.py @@ -17,138 +17,148 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper +from Configurables import DDPandoraPFANewAlgorithm +from py_utils import toMarlinDict import sys +# Define Pandora parameters as a python dictionary (not everything is a string) MyDDMarlinPandoraParameters = { - "FinalEnergyDensityBin": ["110."], - "MaxClusterEnergyToApplySoftComp": ["200."], - "TrackCollections": ["SiTracks_Refitted"], - "ECalCaloHitCollections": ["ECALBarrel", "ECALEndcap"], - "HCalCaloHitCollections": ["HCALBarrel", "HCALEndcap", "HCALOther"], - "LCalCaloHitCollections": [], - "LHCalCaloHitCollections": [], - "MuonCaloHitCollections": ["MUON"], - "MCParticleCollections": ["MCParticle"], - "RelCaloHitCollections": ["RelationCaloHit", "RelationMuonHit"], - "RelTrackCollections": ["SiTracks_Refitted_Relation"], - "KinkVertexCollections": [], - "ProngVertexCollections": [], - "SplitVertexCollections": [], - "V0VertexCollections": [], - "ClusterCollectionName": ["PandoraClusters"], - "PFOCollectionName": ["PandoraPFOs"], - "NEventsToSkip": ["0"], - "CreateGaps": ["false"], - "MinBarrelTrackerHitFractionOfExpected": ["0"], - "MinFtdHitsForBarrelTrackerHitFraction": ["0"], - "MinFtdTrackHits": ["0"], - "MinMomentumForTrackHitChecks": ["0"], - "MinTrackECalDistanceFromIp": ["0"], - "MinTrackHits": ["0"], - "ReachesECalBarrelTrackerOuterDistance": ["-100"], - "ReachesECalBarrelTrackerZMaxDistance": ["-50"], - "ReachesECalFtdZMaxDistance": ["1"], - "ReachesECalMinFtdLayer": ["0"], - "ReachesECalNBarrelTrackerHits": ["0"], - "ReachesECalNFtdHits": ["0"], - "UnmatchedVertexTrackMaxEnergy": ["5"], - "UseNonVertexTracks": ["1"], - "UseUnmatchedNonVertexTracks": ["0"], - "UseUnmatchedVertexTracks": ["1"], - "Z0TrackCut": ["200"], - "Z0UnmatchedVertexTrackCut": ["5"], - "ZCutForNonVertexTracks": ["250"], - "MaxTrackHits": ["5000"], - "MaxTrackSigmaPOverP": ["0.15"], - "CurvatureToMomentumFactor": ["0.00015"], - "D0TrackCut": ["200"], - "D0UnmatchedVertexTrackCut": ["5"], - "StartVertexAlgorithmName": ["PandoraPFANew"], - "StartVertexCollectionName": ["PandoraStartVertices"], - "YokeBarrelNormalVector": ["0", "0", "1"], - "HCalBarrelNormalVector": ["0", "0", "1"], - "ECalBarrelNormalVector": ["0", "0", "1"], - "MuonBarrelBField": ["-1.0"], - "MuonEndCapBField": ["0.01"], - "EMConstantTerm": ["0.01"], - "EMStochasticTerm": ["0.17"], - "HadConstantTerm": ["0.03"], - "HadStochasticTerm": ["0.6"], - "InputEnergyCorrectionPoints": [], - "LayersFromEdgeMaxRearDistance": ["250"], - "NOuterSamplingLayers": ["3"], - "TrackStateTolerance": ["0"], - "MaxBarrelTrackerInnerRDistance": ["200"], - "MinCleanCorrectedHitEnergy": ["0.1"], - "MinCleanHitEnergy": ["0.5"], - "MinCleanHitEnergyFraction": ["0.01"], - "MuonHitEnergy": ["0.5"], - "ShouldFormTrackRelationships": ["1"], - "TrackCreatorName": ["DDTrackCreatorCLIC"], - "TrackSystemName": ["DDKalTest"], - "OutputEnergyCorrectionPoints": [], - "UseEcalScLayers": ["0"], - "ECalScMipThreshold": ["0"], - "ECalScToEMGeVCalibration": ["1"], - "ECalScToHadGeVCalibrationBarrel": ["1"], - "ECalScToHadGeVCalibrationEndCap": ["1"], - "ECalScToMipCalibration": ["1"], - "ECalSiMipThreshold": ["0"], - "ECalSiToEMGeVCalibration": ["1"], - "ECalSiToHadGeVCalibrationBarrel": ["1"], - "ECalSiToHadGeVCalibrationEndCap": ["1"], - "ECalSiToMipCalibration": ["1"], - "StripSplittingOn": ["0"], + "FinalEnergyDensityBin": 110.0, + "MaxClusterEnergyToApplySoftComp": 200.0, + "TrackCollections": ["SiTracks_Refitted"], + "ECalCaloHitCollections": ["ECALBarrel", "ECALEndcap"], + "HCalCaloHitCollections": ["HCALBarrel", "HCALEndcap", "HCALOther"], + "LCalCaloHitCollections": [], + "LHCalCaloHitCollections": [], + "MuonCaloHitCollections": ["MUON"], + "MCParticleCollections": ["MCParticles"], + "RelCaloHitCollections": ["RelationCaloHit", "RelationMuonHit"], + # "RelTrackCollections": ["SiTracks_Refitted_Relation"], + "KinkVertexCollections": [], + "ProngVertexCollections": [], + "SplitVertexCollections": [], + "V0VertexCollections": [], + "ClusterCollectionName": ["PandoraClusters"], + "PFOCollectionName": ["PandoraPFOs"], + "NEventsToSkip": 0, + "CreateGaps": False, + "MinBarrelTrackerHitFractionOfExpected": 0, + "MinFtdHitsForBarrelTrackerHitFraction": 0, + "MinFtdTrackHits": 0, + "MinMomentumForTrackHitChecks": 0, + "MinTrackECalDistanceFromIp": 0, + "MinTrackHits": 0, + "ReachesECalBarrelTrackerOuterDistance": -100, + "ReachesECalBarrelTrackerZMaxDistance": -50, + "ReachesECalFtdZMaxDistance": 1, + "ReachesECalMinFtdLayer": 0, + "ReachesECalNBarrelTrackerHits": 0, + "ReachesECalNFtdHits": 0, + "UnmatchedVertexTrackMaxEnergy": 5, + "UseNonVertexTracks": True, + "UseUnmatchedNonVertexTracks": False, + "UseUnmatchedVertexTracks": True, + "Z0TrackCut": 200, + "Z0UnmatchedVertexTrackCut": 5, + "ZCutForNonVertexTracks": 250, + "MaxTrackHits": 5000, + "MaxTrackSigmaPOverP": 0.15, + "CurvatureToMomentumFactor": 0.00015, + "D0TrackCut": 200, + "D0UnmatchedVertexTrackCut": 5, + "StartVertexAlgorithmName": "PandoraPFANew", + "StartVertexCollectionName": ["PandoraStartVertices"], + "YokeBarrelNormalVector": [0, 0, 1], + "HCalBarrelNormalVector": [0, 0, 1], + "ECalBarrelNormalVector": [0, 0, 1], + "MuonBarrelBField": -1.0, + "MuonEndCapBField": 0.01, + "EMConstantTerm": 0.01, + "EMStochasticTerm": 0.17, + "HadConstantTerm": 0.03, + "HadStochasticTerm": 0.6, + "InputEnergyCorrectionPoints": [], + "LayersFromEdgeMaxRearDistance": 250, + "NOuterSamplingLayers": 3, + "TrackStateTolerance": 0, + "MaxBarrelTrackerInnerRDistance": 200, + "MinCleanCorrectedHitEnergy": 0.1, + "MinCleanHitEnergy": 0.5, + "MinCleanHitEnergyFraction": 0.01, + "MuonHitEnergy": 0.5, + "ShouldFormTrackRelationships": True, + "TrackCreatorName": "DDTrackCreatorCLIC", + "TrackSystemName": "DDKalTest", + "OutputEnergyCorrectionPoints": [], + "UseEcalScLayers": False, + "ECalScMipThreshold": 0, + "ECalScToEMGeVCalibration": 1, + "ECalScToHadGeVCalibrationBarrel": 1, + "ECalScToHadGeVCalibrationEndCap": 1, + "ECalScToMipCalibration": 1, + "ECalSiMipThreshold": 0, + "ECalSiToEMGeVCalibration": 1, + "ECalSiToHadGeVCalibrationBarrel": 1, + "ECalSiToHadGeVCalibrationEndCap": 1, + "ECalSiToMipCalibration": 1, + "StripSplittingOn": False, } -MyDDMarlinPandora = MarlinProcessorWrapper(f"MyDDMarlinPandora_{CONFIG['CalorimeterIntegrationTimeWindow']}") -MyDDMarlinPandora.OutputLevel = WARNING -MyDDMarlinPandora.ProcessorType = "DDPandoraPFANewProcessor" -MyDDMarlinPandora.Parameters = MyDDMarlinPandoraParameters.copy() if CONFIG["CalorimeterIntegrationTimeWindow"] == "10ns": - MyDDMarlinPandora.Parameters |= { - "PandoraSettingsXmlFile": ["PandoraSettingsCLD/PandoraSettingsDefault.xml"], - "SoftwareCompensationWeights": ["2.40821", "-0.0515852", "0.000711414", "-0.0254891", "-0.0121505", "-1.63084e-05", "0.062149", "0.0690735", "-0.223064"], - "ECalToMipCalibration": ["175.439"], - "HCalToMipCalibration": ["45.6621"], - "ECalMipThreshold": ["0.5"], - "HCalMipThreshold": ["0.3"], - "ECalToEMGeVCalibration": ["1.01776966108"], - "HCalToEMGeVCalibration": ["1.01776966108"], - "ECalToHadGeVCalibrationBarrel": ["1.11490774181"], - "ECalToHadGeVCalibrationEndCap": ["1.11490774181"], - "HCalToHadGeVCalibration": ["1.00565042407"], - "MuonToMipCalibration": ["20703.9"], - "DigitalMuonHits": ["0"], - "MaxHCalHitHadronicEnergy": ["10000000."], - } + MyDDMarlinPandoraParameters |= { + "PandoraSettingsXmlFile": "PandoraSettingsCLD/PandoraSettingsDefault.xml", + "SoftwareCompensationWeights": [2.40821, -0.0515852, 0.000711414, -0.0254891, -0.0121505, -1.63084e-05, 0.062149, 0.0690735, -0.223064], + "ECalToMipCalibration": 175.439, + "HCalToMipCalibration": 45.6621, + "ECalMipThreshold": 0.5, + "HCalMipThreshold": 0.3, + "ECalToEMGeVCalibration": 1.01776966108, + "HCalToEMGeVCalibration": 1.01776966108, + "ECalToHadGeVCalibrationBarrel": 1.11490774181, + "ECalToHadGeVCalibrationEndCap": 1.11490774181, + "HCalToHadGeVCalibration": 1.00565042407, + "MuonToMipCalibration": 20703.9, + "DigitalMuonHits": 0, + "MaxHCalHitHadronicEnergy": 10000000.0, + } elif CONFIG["CalorimeterIntegrationTimeWindow"] == "400ns": - MyDDMarlinPandora.Parameters |= { - "PandoraSettingsXmlFile": ["PandoraSettingsCLD/PandoraSettingsDefault_400nsCalTimeWindow.xml"], - "SoftwareCompensationWeights": ["2.43375", "-0.0430951", "0.000244914", "-0.145478", "-0.00044577", "-8.37222e-05", "0.237484", "0.243491", "-0.0713701"], - "ECalToMipCalibration": ["175.439"], - "HCalToMipCalibration": ["49.7512"], - "ECalMipThreshold": ["0.5"], - "HCalMipThreshold": ["0.3"], - "ECalToEMGeVCalibration": ["1.02513816926"], - "HCalToEMGeVCalibration": ["1.02513816926"], - "ECalToHadGeVCalibrationBarrel": ["1.07276660331"], - "ECalToHadGeVCalibrationEndCap": ["1.07276660331"], - "HCalToHadGeVCalibration": ["1.01147686143"], - "MuonToMipCalibration": ["20703.9"], - "DigitalMuonHits": ["0"], - "MaxHCalHitHadronicEnergy": ["10000000."], - } + MyDDMarlinPandoraParameters |= { + "PandoraSettingsXmlFile": "PandoraSettingsCLD/PandoraSettingsDefault_400nsCalTimeWindow.xml", + "SoftwareCompensationWeights": [2.43375, -0.0430951, 0.000244914, -0.145478, -0.00044577, -8.37222e-05, 0.237484, 0.243491, -0.0713701], + "ECalToMipCalibration": 175.439, + "HCalToMipCalibration": 49.7512, + "ECalMipThreshold": 0.5, + "HCalMipThreshold": 0.3, + "ECalToEMGeVCalibration": 1.02513816926, + "HCalToEMGeVCalibration": 1.02513816926, + "ECalToHadGeVCalibrationBarrel": 1.07276660331, + "ECalToHadGeVCalibrationEndCap": 1.07276660331, + "HCalToHadGeVCalibration": 1.01147686143, + "MuonToMipCalibration": 20703.9, + "DigitalMuonHits": 0, + "MaxHCalHitHadronicEnergy": 10000000.0, + } else: print(f"The value {CONFIG['CalorimeterIntegrationTimeWindow']} " "for the calorimeter integration time window is not a valid choice") sys.exit(1) +if reco_args.native: + MyDDMarlinPandoraParameters.pop("NEventsToSkip") + MyDDMarlinPandora = DDPandoraPFANewAlgorithm(f"MyDDMarlinPandora_{CONFIG['CalorimeterIntegrationTimeWindow']}", **MyDDMarlinPandoraParameters) +else: + from Configurables import MarlinProcessorWrapper + MyDDMarlinPandoraParameters["MCParticleCollectionName"] = ["MCParticle"] + MyDDMarlinPandora = MarlinProcessorWrapper(f"MyDDMarlinPandora_{CONFIG['CalorimeterIntegrationTimeWindow']}") + MyDDMarlinPandora.OutputLevel = WARNING + MyDDMarlinPandora.ProcessorType = "DDPandoraPFANewProcessor" + MyDDMarlinPandora.Parameters = toMarlinDict(MyDDMarlinPandoraParameters) + + PandoraSequence = [MyDDMarlinPandora] From 642c3820800d09fb305b8e4a2ac4ea973602150e Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 17:54:25 +0200 Subject: [PATCH 36/68] Add a script and a test to compare collections --- test/CMakeLists.txt | 8 ++++++ test/scripts/compare-native.py | 49 ++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100755 test/scripts/compare-native.py diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 1d77134..22172aa 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -88,3 +88,11 @@ add_test(NAME marlin COMMAND Marlin --global.LCIOInputFiles=test.slcio --InitDD4hep.DD4hepXMLFile=${DETECTOR} CLDReconstruction.xml ) set_property(TEST marlin APPEND PROPERTY DEPENDS ddsim_lcio) + +add_test(NAME "run_wrapper_native" + COMMAND k4run CLDReconstruction_native.py --inputFiles sim.edm4hep.root --native --outputBasename output_REC_native +) + +add_test(NAME "compare_native" + COMMAND "${PROJECT_SOURCE_DIR}/test/scripts/compare-native.py" +) diff --git a/test/scripts/compare-native.py b/test/scripts/compare-native.py new file mode 100755 index 0000000..2e2dea3 --- /dev/null +++ b/test/scripts/compare-native.py @@ -0,0 +1,49 @@ +# A simple script to compare the PFOs from the Gaudi and Marlin output +import argparse +from podio.reading import get_reader + +parser = argparse.ArgumentParser(description="Compare hits from Gaudi and Marlin") +parser.add_argument( + "--native-file", default="output_native_REC.edm4hep.root", help="Gaudi native output file" +) +parser.add_argument( + "--wrapped-file", default="output_REC.edm4hep.root", help="Wrapped output file" +) + +args = parser.parse_args() + +reader_native = get_reader(args.native_file) +reader_wrapped = get_reader(args.wrapped_file) + +events_native = reader_native.get("events") +events_wrapped = reader_wrapped.get("events") + +EXPECTED_MISSING = set([]) +EXPECTED_EXTRA = set([]) + +for i, frame_native in enumerate(events_native): + frame_wrapped = events_wrapped[i] + collections_native = set(frame_native.getAvailableCollections()) + collections_wrapped = set(frame_wrapped.getAvailableCollections()) + missing = collections_native - collections_wrapped + extra = collections_wrapped - collections_native + common = collections_native & collections_wrapped + if missing: + print(f"Event {i}: Missing collections in wrapped: {missing}") + if not missing.issubset(EXPECTED_MISSING): + print("Unexpected missing collections found!") + if extra: + print(f"Event {i}: Extra collections in wrapped: {extra}") + if not extra.issubset(EXPECTED_EXTRA): + print("Unexpected extra collections found!") + are_sizes_different = False + for coll in common: + data_native = frame_native.get(coll) + data_wrapped = frame_wrapped.get(coll) + if len(data_native) != len(data_wrapped): + print(f"Event {i}: Collection '{coll}' has different lengths: " + f"{len(data_native)} in native, {len(data_wrapped)} in wrapped.") + are_sizes_different = True + if missing or extra: + raise ValueError("Collections do not match between Gaudi and wrapped Marlin output.") + From c5493458ba5f2364fb6edce6e0cbb1cf4a0287f0 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Wed, 23 Jul 2025 18:16:45 +0200 Subject: [PATCH 37/68] Fix tests --- test/CMakeLists.txt | 6 ++++-- test/scripts/compare-native.py | 12 +++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 22172aa..13e5e52 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -90,9 +90,11 @@ add_test(NAME marlin set_property(TEST marlin APPEND PROPERTY DEPENDS ddsim_lcio) add_test(NAME "run_wrapper_native" - COMMAND k4run CLDReconstruction_native.py --inputFiles sim.edm4hep.root --native --outputBasename output_REC_native + WORKING_DIRECTORY ${CLDConfig_DIR} + COMMAND k4run CLDReconstruction_iosvc.py --inputFiles sim.edm4hep.root --native --outputBasename output_REC_native ) add_test(NAME "compare_native" - COMMAND "${PROJECT_SOURCE_DIR}/test/scripts/compare-native.py" + WORKING_DIRECTORY ${CLDConfig_DIR} + COMMAND "${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py" ) diff --git a/test/scripts/compare-native.py b/test/scripts/compare-native.py index 2e2dea3..41a9b13 100755 --- a/test/scripts/compare-native.py +++ b/test/scripts/compare-native.py @@ -1,4 +1,6 @@ -# A simple script to compare the PFOs from the Gaudi and Marlin output +#!/usr/bin/env python + +# A simple script to compare collections between the native and wrapped Marlin reconstruction output import argparse from podio.reading import get_reader @@ -25,15 +27,15 @@ frame_wrapped = events_wrapped[i] collections_native = set(frame_native.getAvailableCollections()) collections_wrapped = set(frame_wrapped.getAvailableCollections()) - missing = collections_native - collections_wrapped - extra = collections_wrapped - collections_native + extra = collections_native - collections_wrapped + missing = collections_wrapped - collections_native common = collections_native & collections_wrapped if missing: - print(f"Event {i}: Missing collections in wrapped: {missing}") + print(f"Event {i}: Missing collections in native: {missing}") if not missing.issubset(EXPECTED_MISSING): print("Unexpected missing collections found!") if extra: - print(f"Event {i}: Extra collections in wrapped: {extra}") + print(f"Event {i}: Extra collections in native: {extra}") if not extra.issubset(EXPECTED_EXTRA): print("Unexpected extra collections found!") are_sizes_different = False From 1f0703469a623435148c3e8e8e2b1807f5792bef Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 09:33:08 +0200 Subject: [PATCH 38/68] Fix tests --- test/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 13e5e52..623c202 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -91,10 +91,11 @@ set_property(TEST marlin APPEND PROPERTY DEPENDS ddsim_lcio) add_test(NAME "run_wrapper_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND k4run CLDReconstruction_iosvc.py --inputFiles sim.edm4hep.root --native --outputBasename output_REC_native + COMMAND k4run CLDReconstruction_iosvc.py --inputFiles sim.edm4hep.root --native --outputBasename output_native ) add_test(NAME "compare_native" WORKING_DIRECTORY ${CLDConfig_DIR} COMMAND "${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py" ) +set_property(TEST compare_native APPEND PROPERTY DEPENDS "run_wrapper_native") From e0846d4fa95d3ef1fd89ad29bd93d7e2d3073519 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 09:58:25 +0200 Subject: [PATCH 39/68] Fix the MuonDigi --- CLDConfig/CaloDigi/MuonDigi.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/CLDConfig/CaloDigi/MuonDigi.py b/CLDConfig/CaloDigi/MuonDigi.py index 85083d6..35da7f6 100644 --- a/CLDConfig/CaloDigi/MuonDigi.py +++ b/CLDConfig/CaloDigi/MuonDigi.py @@ -17,27 +17,44 @@ # limitations under the License. # from Configurables import DDSimpleMuonDigi +from Configurables import CollectionMerger from Gaudi.Configuration import WARNING from py_utils import toMarlinDict +input_collections = ["YokeBarrelCollection", "YokeEndcapCollection"] +output_collections = ["MuonYokeBarrelCollection", "MuonYokeEndcapCollection"] +output_relation = ["RelationMuonYokeBarrelHit", "RelationMuonYokeEndcapHit"] + MyDDSimpleMuonDigiParameters = { "CalibrMUON": 70.1, - "MUONCollection": ["YokeBarrelCollection", "YokeEndcapCollection"], - "MUONOutputCollection": ["MUON"], "MaxHitEnergyMUON": 2.0, "MuonThreshold": 1e-06, - "RelationOutputCollection": ["RelationMuonHit"] } if reco_args.native: - MyDDSimpleMuonDigi = DDSimpleMuonDigi("MyDDSimpleMuonDigi", **MyDDSimpleMuonDigiParameters) + MuonDigiSequence = [] + for i in range(len(input_collections)): + MyDDSimpleMuonDigi = DDSimpleMuonDigi("MyDDSimpleMuonDigi", + MUONCollection=[input_collections[i]], + MUONOutputCollection=[output_collections[i]], + MUONRelationOutputCollection=[output_relation[i]], + **MyDDSimpleMuonDigiParameters) + MuonDigiSequence.append(MyDDSimpleMuonDigi) + merger = CollectionMerger("MuonYokeMerger") + merger.InputCollections = output_collections + merger.OutputCollection = ["MUON"] + + relation_merger = CollectionMerger("MuonRelationMerger") + relation_merger.InputCollections = output_relation + relation_merger.OutputCollection = ["RelationMuonHit"] + MuonDigiSequence += [merger, relation_merger] else: from Configurables import MarlinProcessorWrapper - MyDDSimpleMuonDigiParameters["MUONCollections"] = MyDDSimpleMuonDigiParameters["MUONCollection"] - MyDDSimpleMuonDigiParameters["MUONOutputCollections"] = MyDDSimpleMuonDigiParameters["MUONOutputCollection"] + MyDDSimpleMuonDigiParameters["MUONCollection"] = input_collections + MyDDSimpleMuonDigiParameters["MUONCollections"] = ["MUON"] + MyDDSimpleMuonDigiParameters["MUONOutputCollections"] = ["RelationMuonHit"] MyDDSimpleMuonDigi = MarlinProcessorWrapper("MyDDSimpleMuonDigi") MyDDSimpleMuonDigi.OutputLevel = WARNING MyDDSimpleMuonDigi.ProcessorType = "DDSimpleMuonDigi" MyDDSimpleMuonDigi.Parameters = toMarlinDict(MyDDSimpleMuonDigiParameters) - -MuonDigiSequence = [MyDDSimpleMuonDigi] + MuonDigiSequence = [MyDDSimpleMuonDigi] From 811296c201102f5d4e967f5f07207b79e1484921 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 09:59:56 +0200 Subject: [PATCH 40/68] Fix property name --- CLDConfig/CaloDigi/MuonDigi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/CaloDigi/MuonDigi.py b/CLDConfig/CaloDigi/MuonDigi.py index 35da7f6..2fb3c8f 100644 --- a/CLDConfig/CaloDigi/MuonDigi.py +++ b/CLDConfig/CaloDigi/MuonDigi.py @@ -37,7 +37,7 @@ MyDDSimpleMuonDigi = DDSimpleMuonDigi("MyDDSimpleMuonDigi", MUONCollection=[input_collections[i]], MUONOutputCollection=[output_collections[i]], - MUONRelationOutputCollection=[output_relation[i]], + RelationOutputCollection=[output_relation[i]], **MyDDSimpleMuonDigiParameters) MuonDigiSequence.append(MyDDSimpleMuonDigi) merger = CollectionMerger("MuonYokeMerger") From 102065cd17b15e60822b93ea45ead9b6d5b1ed95 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 10:01:06 +0200 Subject: [PATCH 41/68] Give different names to the muon digi --- CLDConfig/CaloDigi/MuonDigi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CLDConfig/CaloDigi/MuonDigi.py b/CLDConfig/CaloDigi/MuonDigi.py index 2fb3c8f..bc7e088 100644 --- a/CLDConfig/CaloDigi/MuonDigi.py +++ b/CLDConfig/CaloDigi/MuonDigi.py @@ -24,6 +24,7 @@ input_collections = ["YokeBarrelCollection", "YokeEndcapCollection"] output_collections = ["MuonYokeBarrelCollection", "MuonYokeEndcapCollection"] output_relation = ["RelationMuonYokeBarrelHit", "RelationMuonYokeEndcapHit"] +names = ["Barrel", "Endcap"] MyDDSimpleMuonDigiParameters = { "CalibrMUON": 70.1, @@ -34,7 +35,7 @@ if reco_args.native: MuonDigiSequence = [] for i in range(len(input_collections)): - MyDDSimpleMuonDigi = DDSimpleMuonDigi("MyDDSimpleMuonDigi", + MyDDSimpleMuonDigi = DDSimpleMuonDigi(f"MyDDSimpleMuonDigi_{names[i]}", MUONCollection=[input_collections[i]], MUONOutputCollection=[output_collections[i]], RelationOutputCollection=[output_relation[i]], From d5d27936e44c1a82e859914d5c7fc9e9e1072bb2 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 10:59:56 +0200 Subject: [PATCH 42/68] Reorganize CaloDigi --- CLDConfig/CaloDigi/CaloDigi.py | 51 +++++++++++++++------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index 388cc73..fabbd0b 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -24,7 +24,7 @@ import sys ECALCollections = ["ECalBarrelCollection", "ECalEndcapCollection"] -ECALOutputCollections = ["ECALBarrel", "ECALEndcap", ""] +ECALOutputCollections = ["ECALBarrel", "ECALEndcap"] HCALCollections = ["HCalBarrelCollection", "HCalEndcapCollection", "HCalRingCollection"] HCALOutputCollections = ["HCALBarrel", "HCALEndcap", "HCALOther"] @@ -116,41 +116,25 @@ "HCALEndcapTimeWindowMax": 400, } - -if reco_args.native: - # Not implemented - for key in ["Histograms", "RootFile", "ECAL_apply_realistic_digi", "HCAL_apply_realistic_digi"]: - MyDDCaloDigiParameters.pop(key) -else: - from Configurables import MarlinProcessorWrapper - MyDDCaloDigiParameters["RelationOutputCollection"] = ["RelationCaloHit"] - MyDDCaloDigiParameters["ECALCollections"] = ECALCollections - for i in range(len(ECALCollections)): - MyDDCaloDigiParameters[f"ECALOutputCollection{i}"] = [ECALOutputCollections[i]] - MyDDCaloDigiParameters["HCALCollections"] = HCALCollections - for i in range(len(HCALCollections)): - MyDDCaloDigiParameters[f"HCALOutputCollection{i}"] = [HCALOutputCollections[i]] - - MyDDCaloDigi = [MarlinProcessorWrapper(f"MyDDCaloDigi_{CONFIG['CalorimeterIntegrationTimeWindow']}")] - MyDDCaloDigi[0].OutputLevel = WARNING - MyDDCaloDigi[0].ProcessorType = "DDCaloDigi" - MyDDCaloDigi[0].Parameters = toMarlinDict(MyDDCaloDigiParameters) - - if CONFIG["CalorimeterIntegrationTimeWindow"] == "10ns": - parameters = parameters_10ns + MyDDCaloDigiParameters |= parameters_10ns elif CONFIG["CalorimeterIntegrationTimeWindow"] == "400ns": - parameters = parameters_400ns + MyDDCaloDigiParameters |= parameters_400ns else: print(f"The value {CONFIG['CalorimeterIntegrationTimeWindow']} " "for the calorimeter integration time window is not a valid choice") sys.exit(1) + if reco_args.native: - final_parameters = MyDDCaloDigiParameters | parameters + # Not implemented in the algorithm + for key in ["Histograms", "RootFile", "ECAL_apply_realistic_digi", "HCAL_apply_realistic_digi"]: + MyDDCaloDigiParameters.pop(key) + + final_parameters = MyDDCaloDigiParameters MyDDCaloDigi = [] collections = ECALCollections + HCALCollections - out_collections = [elem for elem in ECALOutputCollections + HCALOutputCollections if elem] + out_collections = ECALOutputCollections + HCALOutputCollections for incol, outcol in zip(collections, out_collections): MyDDCaloDigi.append( DDCaloDigi( @@ -168,9 +152,20 @@ OutputCollection=["RelationCaloHit"], ) MyDDCaloDigi.append(merger) - else: - MyDDCaloDigi[0].Parameters |= toMarlinDict(parameters_10ns) + from Configurables import MarlinProcessorWrapper + MyDDCaloDigiParameters["RelationOutputCollection"] = ["RelationCaloHit"] + MyDDCaloDigiParameters["ECALCollections"] = ECALCollections + for i in range(len(ECALCollections)): + MyDDCaloDigiParameters[f"ECALOutputCollection{i}"] = [ECALOutputCollections[i]] + MyDDCaloDigiParameters["HCALCollections"] = HCALCollections + for i in range(len(HCALCollections)): + MyDDCaloDigiParameters[f"HCALOutputCollection{i}"] = [HCALOutputCollections[i]] + + MyDDCaloDigi = [MarlinProcessorWrapper(f"MyDDCaloDigi_{CONFIG['CalorimeterIntegrationTimeWindow']}")] + MyDDCaloDigi[0].OutputLevel = WARNING + MyDDCaloDigi[0].ProcessorType = "DDCaloDigi" + MyDDCaloDigi[0].Parameters = toMarlinDict(MyDDCaloDigiParameters) CaloDigiSequence = MyDDCaloDigi From 4b81c2ea330ad01052b0d3e987a1d1e1a5c5f978 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 11:15:52 +0200 Subject: [PATCH 43/68] Use the actual wrapped file --- test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 623c202..75cf528 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -96,6 +96,6 @@ add_test(NAME "run_wrapper_native" add_test(NAME "compare_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND "${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py" + COMMAND "${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py --wrapped-file rec_test_edm4hep_REC.edm4hep.root" ) set_property(TEST compare_native APPEND PROPERTY DEPENDS "run_wrapper_native") From 95da13f73a8f57ceb4f19a1688e919b827fd0fd1 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 14:08:47 +0200 Subject: [PATCH 44/68] Make sure to set if it's ECAL or HCAL for the CaloDigi --- CLDConfig/CaloDigi/CaloDigi.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index fabbd0b..7dc057b 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -27,6 +27,7 @@ ECALOutputCollections = ["ECALBarrel", "ECALEndcap"] HCALCollections = ["HCalBarrelCollection", "HCalEndcapCollection", "HCalRingCollection"] HCALOutputCollections = ["HCALBarrel", "HCALEndcap", "HCALOther"] +ECALorHCAL = [True, True, False, False, False] MyDDCaloDigiParameters = { "Histograms": 0, @@ -135,13 +136,14 @@ MyDDCaloDigi = [] collections = ECALCollections + HCALCollections out_collections = ECALOutputCollections + HCALOutputCollections - for incol, outcol in zip(collections, out_collections): + for i, (incol, outcol) in enumerate(zip(collections, out_collections)): MyDDCaloDigi.append( DDCaloDigi( f"{incol}Digitiser", **final_parameters, InputCaloHitCollection=[incol], OutputCaloHitCollection=[outcol], + InputColIsECAL=ECALorHCAL[i], RelationOutputCollection=[f"GaudiRelationCaloHit{outcol}"], OutputLevel=WARNING, ) From 8b705a061036b2678b2055a820c54541a5cb965a Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 14:17:57 +0200 Subject: [PATCH 45/68] Fix tests --- test/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 75cf528..268e283 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -91,8 +91,9 @@ set_property(TEST marlin APPEND PROPERTY DEPENDS ddsim_lcio) add_test(NAME "run_wrapper_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND k4run CLDReconstruction_iosvc.py --inputFiles sim.edm4hep.root --native --outputBasename output_native + COMMAND k4run CLDReconstruction_iosvc.py --inputFiles test.edm4hep.root --native --outputBasename output_native ) +set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS edm4hep_input) add_test(NAME "compare_native" WORKING_DIRECTORY ${CLDConfig_DIR} From f53c8e4cabc6e62409e0dffc557fadd96099e6d0 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 14:18:39 +0200 Subject: [PATCH 46/68] Fix test command --- test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 268e283..e37bca6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -97,6 +97,6 @@ set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS edm4hep_input) add_test(NAME "compare_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND "${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py --wrapped-file rec_test_edm4hep_REC.edm4hep.root" + COMMAND ${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py --wrapped-file rec_test_edm4hep_REC.edm4hep.root ) set_property(TEST compare_native APPEND PROPERTY DEPENDS "run_wrapper_native") From ff0aae4b4533f1492f84de5aa10e1aafa1fc984b Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 15:10:44 +0200 Subject: [PATCH 47/68] Make sure to turn True/False variables back to int --- CLDConfig/ParticleFlow/Pandora.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CLDConfig/ParticleFlow/Pandora.py b/CLDConfig/ParticleFlow/Pandora.py index 15ad101..720a7c7 100644 --- a/CLDConfig/ParticleFlow/Pandora.py +++ b/CLDConfig/ParticleFlow/Pandora.py @@ -155,6 +155,9 @@ else: from Configurables import MarlinProcessorWrapper MyDDMarlinPandoraParameters["MCParticleCollectionName"] = ["MCParticle"] + # These have been changed from int to True/False in the algorithm, so they have to be changed back + for var in ["UseNonVertexTracks", "UseUnmatchedNonVertexTracks", "UseUnmatchedVertexTracks", "ShouldFormTrackRelationships", "UseEcalScLayers", "StripSplittingOn"]: + MyDDMarlinPandoraParameters[var] = int(MyDDMarlinPandoraParameters[var]) MyDDMarlinPandora = MarlinProcessorWrapper(f"MyDDMarlinPandora_{CONFIG['CalorimeterIntegrationTimeWindow']}") MyDDMarlinPandora.OutputLevel = WARNING MyDDMarlinPandora.ProcessorType = "DDPandoraPFANewProcessor" From b494b6c39629b69923fbdd1904ecefc6e07485ad Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 15:17:45 +0200 Subject: [PATCH 48/68] Fix test dependency --- test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e37bca6..93e5834 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -93,10 +93,10 @@ add_test(NAME "run_wrapper_native" WORKING_DIRECTORY ${CLDConfig_DIR} COMMAND k4run CLDReconstruction_iosvc.py --inputFiles test.edm4hep.root --native --outputBasename output_native ) -set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS edm4hep_input) +set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS ddsim_edm4hep) add_test(NAME "compare_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND ${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py --wrapped-file rec_test_edm4hep_REC.edm4hep.root + COMMAND ${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py --wrapped-file rec_test_edm4hep_REC.edm4hep.root --native-file output_native_REC.edm4hep.root ) set_property(TEST compare_native APPEND PROPERTY DEPENDS "run_wrapper_native") From 21213a6d169e21e3cc641ad82ba2c76d1a47adc4 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 20:24:28 +0200 Subject: [PATCH 49/68] Possibly fix the muon digitizer --- CLDConfig/CaloDigi/MuonDigi.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/CLDConfig/CaloDigi/MuonDigi.py b/CLDConfig/CaloDigi/MuonDigi.py index bc7e088..2f684eb 100644 --- a/CLDConfig/CaloDigi/MuonDigi.py +++ b/CLDConfig/CaloDigi/MuonDigi.py @@ -25,6 +25,8 @@ output_collections = ["MuonYokeBarrelCollection", "MuonYokeEndcapCollection"] output_relation = ["RelationMuonYokeBarrelHit", "RelationMuonYokeEndcapHit"] names = ["Barrel", "Endcap"] +single_output_collection = "MUON" +single_output_relation = "RelationMuonHit" MyDDSimpleMuonDigiParameters = { "CalibrMUON": 70.1, @@ -41,19 +43,19 @@ RelationOutputCollection=[output_relation[i]], **MyDDSimpleMuonDigiParameters) MuonDigiSequence.append(MyDDSimpleMuonDigi) - merger = CollectionMerger("MuonYokeMerger") + merger = CollectionMerger("MuonCollectionMerger") merger.InputCollections = output_collections - merger.OutputCollection = ["MUON"] + merger.OutputCollection = [single_output_collection] relation_merger = CollectionMerger("MuonRelationMerger") relation_merger.InputCollections = output_relation - relation_merger.OutputCollection = ["RelationMuonHit"] + relation_merger.OutputCollection = [single_output_relation] MuonDigiSequence += [merger, relation_merger] else: from Configurables import MarlinProcessorWrapper - MyDDSimpleMuonDigiParameters["MUONCollection"] = input_collections - MyDDSimpleMuonDigiParameters["MUONCollections"] = ["MUON"] - MyDDSimpleMuonDigiParameters["MUONOutputCollections"] = ["RelationMuonHit"] + MyDDSimpleMuonDigiParameters["MUONCollections"] = input_collections + MyDDSimpleMuonDigiParameters["MUONOutputCollection"] = [single_output_collection] + MyDDSimpleMuonDigiParameters["RelationOutputCollection"] = [single_output_relation] MyDDSimpleMuonDigi = MarlinProcessorWrapper("MyDDSimpleMuonDigi") MyDDSimpleMuonDigi.OutputLevel = WARNING MyDDSimpleMuonDigi.ProcessorType = "DDSimpleMuonDigi" From 0ed537f42be89dc707874fbcd217c4329c8eb96e Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Thu, 24 Jul 2025 20:41:37 +0200 Subject: [PATCH 50/68] Reorder imports to be able to run without the wrapper --- CLDConfig/Tracking/ConformalTracking.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index c98ef97..6cab77c 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -17,7 +17,7 @@ # limitations under the License. # from Gaudi.Configuration import WARNING -from Configurables import MarlinProcessorWrapper +from k4FWCore.parseArgs import parser # geoservice comes from the `global_vars` of the SequenceLoader @@ -28,7 +28,6 @@ else: raise RuntimeError("Unknown detector model to chose CT_MAX_DISTANCE") -from k4FWCore.parseArgs import parser args = parser.parse_known_args() # The keys are simply a name are not passed to ConformalTracking From 25a7beffdfa8d3e702bddcede4d8602e2006c360 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Fri, 25 Jul 2025 08:39:17 +0200 Subject: [PATCH 51/68] Simplify the configuration of ConformalTracking --- CLDConfig/Tracking/ConformalTracking.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 6cab77c..1d0c7d2 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -19,6 +19,7 @@ from Gaudi.Configuration import WARNING from k4FWCore.parseArgs import parser +from conformal_tracking_utils import configure_conformal_tracking_steps # geoservice comes from the `global_vars` of the SequenceLoader if any(small_vtx in geoservice.detectors[0] for small_vtx in ["_o2_", "_o3_", "_o4_"]): @@ -118,12 +119,6 @@ }, } -collections = [elem["collections"] for elem in parameters.values()] -names = [list(elem["params"].keys()) for elem in parameters.values()] -values = [list(elem["params"].values()) for elem in parameters.values()] -flags = [elem["flags"] for elem in parameters.values()] -functions = [elem["functions"] for elem in parameters.values()] - steps_marlin = [] for name, param_dict in parameters.items(): @@ -179,12 +174,6 @@ if args[0].native: # Not implemented in Gaudi conformal_tracking_args.pop("DebugHits") - - conformal_tracking_args["stepCollections"] = collections - conformal_tracking_args["stepParametersNames"] = names - conformal_tracking_args["stepParametersValues"] = values - conformal_tracking_args["stepParametersFlags"] = flags - conformal_tracking_args["stepParametersFunctions"] = functions else: conformal_tracking_args_marlin["Steps"] = steps_marlin @@ -213,6 +202,7 @@ **conformal_tracking_args, OutputLevel=WARNING, ) + configure_conformal_tracking_steps(MyConformalTracking, parameters) clones_and_split_tracks_finder = ClonesAndSplitTracksFinder( "ClonesAndSplitTracksFinder", From 7e510bbd8b6d345664496b466db0f2f40256ac23 Mon Sep 17 00:00:00 2001 From: jmcarcell Date: Mon, 28 Jul 2025 14:36:18 +0200 Subject: [PATCH 52/68] Comment out the cellIDSvc --- CLDConfig/CLDReconstruction_iosvc.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CLDConfig/CLDReconstruction_iosvc.py b/CLDConfig/CLDReconstruction_iosvc.py index a5825bb..4a78032 100644 --- a/CLDConfig/CLDReconstruction_iosvc.py +++ b/CLDConfig/CLDReconstruction_iosvc.py @@ -70,11 +70,11 @@ geoservice.EnableGeant4Geo = False svcList.append(geoservice) -cellIDSvc = TrackingCellIDEncodingSvc("CellIDSvc") -cellIDSvc.EncodingStringParameterName = "GlobalTrackerReadoutID" -cellIDSvc.GeoSvcName = geoservice.name() -cellIDSvc.OutputLevel = INFO -svcList.append(cellIDSvc) +# cellIDSvc = TrackingCellIDEncodingSvc("CellIDSvc") +# cellIDSvc.EncodingStringParameterName = "GlobalTrackerReadoutID" +# cellIDSvc.GeoSvcName = geoservice.name() +# cellIDSvc.OutputLevel = INFO +# svcList.append(cellIDSvc) if len(geoservice.detectors) > 1: # we are making assumptions for reconstruction parameters based on the detector option, so we limit the possibilities From 08f1bd4ba2568d7f097ac3dc274b5f1d902c11b7 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Wed, 1 Oct 2025 20:44:46 +0200 Subject: [PATCH 53/68] Reverse changes after moving to IOSvc in CLDReconstruction.py --- CLDConfig/CLDReconstruction.py | 64 ++++++++++++++++------------------ 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index df2b530..4c10b94 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -19,15 +19,15 @@ import os from Gaudi.Configuration import INFO, WARNING, DEBUG -from Configurables import k4DataSvc, MarlinProcessorWrapper -from k4MarlinWrapper.inputReader import create_reader, attach_edm4hep2lcio_conversion +from Gaudi.Configurables import EventDataSvc, MarlinProcessorWrapper, GeoSvc, TrackingCellIDEncodingSvc +from k4FWCore import ApplicationMgr, IOSvc from k4FWCore.parseArgs import parser -from py_utils import SequenceLoader, attach_lcio2edm4hep_conversion, create_writer, parse_collection_patch_file -from Configurables import GeoSvc, TrackingCellIDEncodingSvc -from Configurables import ApplicationMgr +from py_utils import SequenceLoader, parse_collection_patch_file +from k4MarlinWrapper.io_helpers import IOHandlerHelper parser_group = parser.add_argument_group("CLDReconstruction.py custom options") -parser_group.add_argument("--inputFiles", action="extend", nargs="+", metavar=("file1", "file2"), help="One or multiple input files") +# Need the dummy input such that the IOHandlerHelper.add_reader call below does not crash when called with --help +parser_group.add_argument("--inputFiles", action="store", nargs="+", metavar=("file1", "file2"), help="One or multiple input files", default=["dummy_input.edm4hep.root"]) parser_group.add_argument("--outputBasename", help="Basename of the output file(s)", default="output") parser_group.add_argument("--trackingOnly", action="store_true", help="Run only track reconstruction", default=False) parser_group.add_argument("--enableLCFIJet", action="store_true", help="Enable LCFIPlus jet clustering parts", default=False) @@ -39,14 +39,12 @@ tracking_group.add_argument("--truthTracking", action="store_true", default=False, help="Cheat tracking pattern recognition") reco_args = parser.parse_known_args()[0] -if reco_args.native: - raise RuntimeError("The native implementation is not in this file, use CLDReconstruction_iosvc.py instead") -algList = [] -svcList = [] +evtsvc = EventDataSvc("EventDataSvc") +iosvc = IOSvc() -evtsvc = k4DataSvc("EventDataSvc") -svcList.append(evtsvc) +svcList = [evtsvc, iosvc] +algList = [] CONFIG = { "CalorimeterIntegrationTimeWindow": "10ns", @@ -93,13 +91,8 @@ }, ) -if reco_args.inputFiles: - read = create_reader(reco_args.inputFiles, evtsvc) - read.OutputLevel = INFO - algList.append(read) -else: - print('WARNING: No input files specified, the CLD Reconstruction will fail') - read = None +io_handler = IOHandlerHelper(algList, iosvc) +io_handler.add_reader(reco_args.inputFiles) MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") MyAIDAProcessor.OutputLevel = WARNING @@ -154,11 +147,22 @@ # TODO: replace all the ugly strings by something sensible like Enum if CONFIG["OutputMode"] == "LCIO": - Output_REC = create_writer("lcio", "Output_REC", f"{reco_args.outputBasename}_REC") - algList.append(Output_REC) + Output_REC = io_handler.add_lcio_writer("Output_REC") + Output_REC.Parameters = { + "LCIOOutputFile": [f"{reco_args.outputBasename}_REC.slcio"], + "LCIOWriteMode": ["WRITE_NEW"], + } - Output_DST = create_writer("lcio", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST, DST_SUBSETLIST) - algList.append(Output_DST) + Output_DST = io_handler.add_lcio_writer("Output_DST") + dropped_types = ["MCParticle", "LCRelation", "SimCalorimeterHit", "CalorimeterHit", "SimTrackerHit", "TrackerHit", "TrackerHitPlane", "Track", "ReconstructedParticle", "LCFloatVec"] + Output_DST.Parameters = { + "LCIOOutputFile": [f"{reco_args.outputBasename}_DST.slcio"], + "LCIOWriteMode": ["WRITE_NEW"], + "DropCollectionNames": [], + "DropCollectionTypes": dropped_types, + "FullSubsetCollections": DST_SUBSETLIST, + "KeepCollectionNames": DST_KEEPLIST, + } if CONFIG["OutputMode"] == "EDM4Hep": # Make sure that all collections are always available by patching in missing ones on-the-fly @@ -170,19 +174,13 @@ } algList.append(collPatcherRec) - Output_REC = create_writer("edm4hep", "Output_REC", f"{reco_args.outputBasename}_REC") - algList.append(Output_REC) - + io_handler.add_edm4hep_writer(f"{reco_args.outputBasename}_REC.edm4hep.root", ["keep *"]) # FIXME: needs https://github.com/key4hep/k4FWCore/issues/226 - # Output_DST = create_writer("edm4hep", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST) - # algList.append(Output_DST) - + # -# We need to convert the inputs in case we have EDM4hep input -attach_edm4hep2lcio_conversion(algList, read) -# We need to convert the outputs in case we have EDM4hep output -attach_lcio2edm4hep_conversion(algList) +# We need to attach all the necessary converters +io_handler.finalize_converters() ApplicationMgr( TopAlg = algList, EvtSel = 'NONE', From 35df621103e7ebf73d2afda54de78ae34c80cea6 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 21 Oct 2025 15:39:15 +0200 Subject: [PATCH 54/68] Use strings instead of lists for some input and output collections --- CLDConfig/CaloDigi/LumiCal.py | 6 +++--- CLDConfig/Tracking/ConformalTracking.py | 6 +++--- CLDConfig/Tracking/Refit.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CLDConfig/CaloDigi/LumiCal.py b/CLDConfig/CaloDigi/LumiCal.py index 2c1f8a1..a379004 100644 --- a/CLDConfig/CaloDigi/LumiCal.py +++ b/CLDConfig/CaloDigi/LumiCal.py @@ -25,9 +25,9 @@ "ElementsPercentInShowerPeakLayer": 0.03, "EnergyCalibConst": 0.01213, "LogWeigthConstant": 6.5, - "LumiCal_Clusters": ["LumiCalClusters"], - "LumiCal_Collection": ["LumiCalCollection"], - "LumiCal_RecoParticles": ["LumiCalRecoParticles"], + "LumiCal_Clusters": "LumiCalClusters", + "LumiCal_Collection": "LumiCalCollection", + "LumiCal_RecoParticles": "LumiCalRecoParticles", "MaxRecordNumber": 10, "MemoryResidentTree": 0, "MiddleEnergyHitBoundFrac": 0.01, diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 1d0c7d2..17bd4b5 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -159,7 +159,7 @@ "MinClustersOnTrackAfterFit": 3, "RelationsNames": ["VXDTrackerHitRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], "RetryTooManyTracks": False, - "SiTrackCollectionName": ["SiTracksCT"], + "SiTrackCollectionName": "SiTracksCT", "SortTreeResults": True, "ThetaRange": 0.05, "TooManyTracks": 100000, @@ -179,9 +179,9 @@ clones_and_split_tracks_finder_args = { "EnergyLossOn": True, - "InputTrackCollectionName": ["SiTracksCT"], + "InputTrackCollectionName": "SiTracksCT", "MultipleScatteringOn": True, - "OutputTrackCollectionName": ["SiTracks"], + "OutputTrackCollectionName": "SiTracks", "SmoothOn": False, "extrapolateForward": True, "maxSignificancePhi": 3., diff --git a/CLDConfig/Tracking/Refit.py b/CLDConfig/Tracking/Refit.py index f51632e..0e5f462 100644 --- a/CLDConfig/Tracking/Refit.py +++ b/CLDConfig/Tracking/Refit.py @@ -23,13 +23,13 @@ refit_args = { "EnergyLossOn": True, - "InputTrackCollectionName": ["SiTracks"], + "InputTrackCollectionName": "SiTracks", "InputRelationCollectionName": ["SiTrackRelations"], "Max_Chi2_Incr": 1.79769e30, "MinClustersOnTrackAfterFit": 3, "MultipleScatteringOn": True, - "OutputRelationCollectionName": ["SiTracks_Refitted_Relation"], - "OutputTrackCollectionName": ["SiTracks_Refitted"], + "OutputRelationCollectionName": "SiTracks_Refitted_Relation", + "OutputTrackCollectionName": "SiTracks_Refitted", "ReferencePoint": -1, "SmoothOn": False, "extrapolateForward": True, From 0f067cdfad0543be692d4edef632a65e54a75a9b Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 21 Oct 2025 15:40:38 +0200 Subject: [PATCH 55/68] Do not provide an additional top-level steering file --- CLDConfig/CLDReconstruction_iosvc.py | 184 --------------------------- 1 file changed, 184 deletions(-) delete mode 100644 CLDConfig/CLDReconstruction_iosvc.py diff --git a/CLDConfig/CLDReconstruction_iosvc.py b/CLDConfig/CLDReconstruction_iosvc.py deleted file mode 100644 index 4a78032..0000000 --- a/CLDConfig/CLDReconstruction_iosvc.py +++ /dev/null @@ -1,184 +0,0 @@ -# -# Copyright (c) 2014-2024 Key4hep-Project. -# -# This file is part of Key4hep. -# See https://key4hep.github.io/key4hep-doc/ for further info. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -import os -from Gaudi.Configuration import INFO, WARNING, DEBUG - -from Configurables import EventDataSvc, MarlinProcessorWrapper -from k4FWCore import IOSvc, ApplicationMgr -from k4MarlinWrapper.inputReader import create_reader, attach_edm4hep2lcio_conversion -from k4FWCore.parseArgs import parser -from py_utils import SequenceLoader, attach_lcio2edm4hep_conversion, create_writer, parse_collection_patch_file - -import ROOT -ROOT.gROOT.SetBatch(True) - - -parser_group = parser.add_argument_group("CLDReconstruction.py custom options") -parser_group.add_argument("--inputFiles", action="extend", nargs="+", metavar=("file1", "file2"), help="One or multiple input files") -parser_group.add_argument("--outputBasename", help="Basename of the output file(s)", default="output") -parser_group.add_argument("--trackingOnly", action="store_true", help="Run only track reconstruction", default=False) -parser_group.add_argument("--enableLCFIJet", action="store_true", help="Enable LCFIPlus jet clustering parts", default=False) -parser_group.add_argument("--cms", action="store", help="Choose a Centre-of-Mass energy", default=240, choices=(91, 160, 240, 365), type=int) -parser_group.add_argument("--compactFile", help="Compact detector file to use", type=str, default=os.environ["K4GEO"] + "/FCCee/CLD/compact/CLD_o2_v07/CLD_o2_v07.xml") -parser_group.add_argument("--native", action="store_true", help="Use the native EDM4hep tracking", default=False) -tracking_group = parser_group.add_mutually_exclusive_group() -tracking_group.add_argument("--conformalTracking", action="store_true", default=True, help="Use conformal tracking pattern recognition") -tracking_group.add_argument("--truthTracking", action="store_true", default=False, help="Cheat tracking pattern recognition") -reco_args = parser.parse_known_args()[0] - -algList = [] -svcList = [] - -evtsvc = EventDataSvc("EventDataSvc") -svcList.append(evtsvc) - -iosvc = IOSvc("IOSvc") - -CONFIG = { - "CalorimeterIntegrationTimeWindow": "10ns", - "CalorimeterIntegrationTimeWindowChoices": ["10ns", "400ns"], - "Overlay": "False", - "OverlayChoices": ["False", "91GeV", "365GeV"], - "VertexUnconstrained": "OFF", - "VertexUnconstrainedChoices": ["ON", "OFF"], - "OutputMode": "EDM4Hep", - "OutputModeChoices": ["LCIO", "EDM4hep"] #, "both"] FIXME: both is not implemented yet -} - -REC_COLLECTION_CONTENTS_FILE = "collections_rec_level.txt" # file with the collections to be patched in when writing from LCIO to EDM4hep - -from Configurables import GeoSvc, TrackingCellIDEncodingSvc, Lcio2EDM4hepTool -geoservice = GeoSvc("GeoSvc") -geoservice.detectors = [reco_args.compactFile] -geoservice.OutputLevel = INFO -geoservice.EnableGeant4Geo = False -svcList.append(geoservice) - -# cellIDSvc = TrackingCellIDEncodingSvc("CellIDSvc") -# cellIDSvc.EncodingStringParameterName = "GlobalTrackerReadoutID" -# cellIDSvc.GeoSvcName = geoservice.name() -# cellIDSvc.OutputLevel = INFO -# svcList.append(cellIDSvc) - -if len(geoservice.detectors) > 1: - # we are making assumptions for reconstruction parameters based on the detector option, so we limit the possibilities - raise RuntimeError("Too many XML files for the detector path, please only specify the main file!") - -# from https://github.com/HEP-FCC/FCCeePhysicsPerformance/blob/d6ecee2c2c3ed5d76db55a3ae18ced349b2b914a/General/README.md?plain=1#L457-L467 -# for december 2022 -BEAM_SPOT_SIZES = { 91: (5.96e-3, 23.8e-6, 0.397), - 160: (14.7e-3, 46.5e-6, 0.97), - 240: (9.8e-3, 25.4e-6, 0.65), - 365: (27.3e-3, 48.8e-6, 1.33), - } - -sequenceLoader = SequenceLoader( - algList, - # global_vars can be used in sequence-loaded modules without explicit import - global_vars={"CONFIG": CONFIG, "geoservice": geoservice, "reco_args": reco_args, - "BEAM_SPOT_SIZES": BEAM_SPOT_SIZES, - }, -) - -if reco_args.inputFiles: - iosvc.Input = reco_args.inputFiles -else: - print('WARNING: No input files specified, the CLD Reconstruction will fail') - read = None - -# MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") -# MyAIDAProcessor.OutputLevel = WARNING -# MyAIDAProcessor.ProcessorType = "AIDAProcessor" -# MyAIDAProcessor.Parameters = { -# "Compress": ["1"], -# "FileName": [f"{reco_args.outputBasename}_aida"], -# "FileType": ["root"] -# } - -# EventNumber = MarlinProcessorWrapper("EventNumber") -# EventNumber.OutputLevel = WARNING -# EventNumber.ProcessorType = "Statusmonitor" -# EventNumber.Parameters = { -# "HowOften": ["1"] -# } - -# setup AIDA histogramming and add eventual background overlay -# algList.append(MyAIDAProcessor) -# sequenceLoader.load("Overlay/Overlay") -# tracker hit digitisation -sequenceLoader.load("Tracking/TrackingDigi") - -# tracking -if reco_args.truthTracking: - sequenceLoader.load("Tracking/TruthTracking") -elif reco_args.conformalTracking: - sequenceLoader.load("Tracking/ConformalTracking") - -sequenceLoader.load("Tracking/Refit") - -# # calorimeter digitization and pandora -if not reco_args.trackingOnly: - sequenceLoader.load("CaloDigi/CaloDigi") - sequenceLoader.load("CaloDigi/MuonDigi") - sequenceLoader.load("CaloDigi/LumiCal") - sequenceLoader.load("ParticleFlow/Pandora") -# # monitoring and Reco to MCTruth linking -# sequenceLoader.load("HighLevelReco/RecoMCTruthLink") -# sequenceLoader.load("Diagnostics/Tracking") -# # pfo selector (might need re-optimisation) -# if not reco_args.trackingOnly: -# sequenceLoader.load("HighLevelReco/PFOSelector") -# sequenceLoader.load("HighLevelReco/JetClusteringOrRenaming") -# sequenceLoader.load("HighLevelReco/JetAndVertex") -# # event number processor, down here to attach the conversion back to edm4hep to it -# algList.append(EventNumber) - -DST_KEEPLIST = ["MCParticlesSkimmed", "MCPhysicsParticles", "RecoMCTruthLink", "SiTracks", "SiTracks_Refitted", "PandoraClusters", "PandoraPFOs", "SelectedPandoraPFOs", "LooseSelectedPandoraPFOs", "TightSelectedPandoraPFOs", "RefinedVertexJets", "RefinedVertexJets_rel", "RefinedVertexJets_vtx", "RefinedVertexJets_vtx_RP", "BuildUpVertices", "BuildUpVertices_res", "BuildUpVertices_RP", "BuildUpVertices_res_RP", "BuildUpVertices_V0", "BuildUpVertices_V0_res", "BuildUpVertices_V0_RP", "BuildUpVertices_V0_res_RP", "PrimaryVertices", "PrimaryVertices_res", "PrimaryVertices_RP", "PrimaryVertices_res_RP", "RefinedVertices", "RefinedVertices_RP"] - -DST_SUBSETLIST = ["EfficientMCParticles", "InefficientMCParticles", "MCPhysicsParticles"] - -# Make sure that all collections are always available by patching in missing ones on-the-fly -# collPatcherRec = MarlinProcessorWrapper( -# "CollPatcherREC", OutputLevel=INFO, ProcessorType="PatchCollections" -# ) -# collPatcherRec.Parameters = { -# "PatchCollections": parse_collection_patch_file(REC_COLLECTION_CONTENTS_FILE) -# } -# algList.append(collPatcherRec) - -# Output_REC = create_writer("edm4hep", "Output_REC", f"{reco_args.outputBasename}_REC") -# algList.append(Output_REC) -iosvc.Output = f"{reco_args.outputBasename}_REC.edm4hep.root" - -# FIXME: needs https://github.com/key4hep/k4FWCore/issues/226 -# Output_DST = create_writer("edm4hep", "Output_DST", f"{reco_args.outputBasename}_DST", DST_KEEPLIST) -# algList.append(Output_DST) - -# We need to convert the inputs in case we have EDM4hep input -# attach_edm4hep2lcio_conversion(algList, read) - -# We need to convert the outputs in case we have EDM4hep output -# attach_lcio2edm4hep_conversion(algList) - -ApplicationMgr( TopAlg = algList, - EvtSel = 'NONE', - EvtMax = 1, # Overridden by the --num-events switch to k4run - ExtSvc = svcList, - OutputLevel=WARNING - ) From 3d757d001de8a7fa1114f29a7d8abc70637bc9f7 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 21 Oct 2025 15:50:22 +0200 Subject: [PATCH 56/68] Disable a few of the Marlin-specific things when running with native --- CLDConfig/CLDReconstruction.py | 46 ++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index 4c10b94..d6f6109 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -91,28 +91,29 @@ }, ) -io_handler = IOHandlerHelper(algList, iosvc) -io_handler.add_reader(reco_args.inputFiles) - -MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") -MyAIDAProcessor.OutputLevel = WARNING -MyAIDAProcessor.ProcessorType = "AIDAProcessor" -MyAIDAProcessor.Parameters = { - "Compress": ["1"], - "FileName": [f"{reco_args.outputBasename}_aida"], - "FileType": ["root"] +if not reco_args.native: + io_handler = IOHandlerHelper(algList, iosvc) + io_handler.add_reader(reco_args.inputFiles) + + MyAIDAProcessor = MarlinProcessorWrapper("MyAIDAProcessor") + MyAIDAProcessor.OutputLevel = WARNING + MyAIDAProcessor.ProcessorType = "AIDAProcessor" + MyAIDAProcessor.Parameters = { + "Compress": ["1"], + "FileName": [f"{reco_args.outputBasename}_aida"], + "FileType": ["root"] + } + + EventNumber = MarlinProcessorWrapper("EventNumber") + EventNumber.OutputLevel = WARNING + EventNumber.ProcessorType = "Statusmonitor" + EventNumber.Parameters = { + "HowOften": ["1"] } -EventNumber = MarlinProcessorWrapper("EventNumber") -EventNumber.OutputLevel = WARNING -EventNumber.ProcessorType = "Statusmonitor" -EventNumber.Parameters = { - "HowOften": ["1"] - } - -# setup AIDA histogramming and add eventual background overlay -algList.append(MyAIDAProcessor) -sequenceLoader.load("Overlay/Overlay") + # setup AIDA histogramming and add eventual background overlay + algList.append(MyAIDAProcessor) + sequenceLoader.load("Overlay/Overlay") # tracker hit digitisation sequenceLoader.load("Tracking/TrackingDigi") @@ -164,7 +165,7 @@ "KeepCollectionNames": DST_KEEPLIST, } -if CONFIG["OutputMode"] == "EDM4Hep": +if CONFIG["OutputMode"] == "EDM4Hep" and not reco_args.native: # Make sure that all collections are always available by patching in missing ones on-the-fly collPatcherRec = MarlinProcessorWrapper( "CollPatcherREC", OutputLevel=INFO, ProcessorType="PatchCollections" @@ -180,7 +181,8 @@ # We need to attach all the necessary converters -io_handler.finalize_converters() +if not reco_args.native: + io_handler.finalize_converters() ApplicationMgr( TopAlg = algList, EvtSel = 'NONE', From 046db010d18dd2515a390b93fec6bc1d8b6a0b9b Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 21 Oct 2025 15:55:50 +0200 Subject: [PATCH 57/68] Fix test --- test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 93e5834..3b93fa7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -91,7 +91,7 @@ set_property(TEST marlin APPEND PROPERTY DEPENDS ddsim_lcio) add_test(NAME "run_wrapper_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND k4run CLDReconstruction_iosvc.py --inputFiles test.edm4hep.root --native --outputBasename output_native + COMMAND k4run CLDReconstruction.py --inputFiles test.edm4hep.root --native --outputBasename output_native ) set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS ddsim_edm4hep) From 2149323bef46768df8167e70f7df6464031a9a69 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 21 Oct 2025 16:03:39 +0200 Subject: [PATCH 58/68] Disable a few more things with native --- CLDConfig/CLDReconstruction.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index d6f6109..f48a513 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -65,11 +65,12 @@ geoservice.EnableGeant4Geo = False svcList.append(geoservice) -cellIDSvc = TrackingCellIDEncodingSvc("CellIDSvc") -cellIDSvc.EncodingStringParameterName = "GlobalTrackerReadoutID" -cellIDSvc.GeoSvcName = geoservice.name() -cellIDSvc.OutputLevel = INFO -svcList.append(cellIDSvc) +if not reco_args.native: + cellIDSvc = TrackingCellIDEncodingSvc("CellIDSvc") + cellIDSvc.EncodingStringParameterName = "GlobalTrackerReadoutID" + cellIDSvc.GeoSvcName = geoservice.name() + cellIDSvc.OutputLevel = INFO + svcList.append(cellIDSvc) if len(geoservice.detectors) > 1: # we are making assumptions for reconstruction parameters based on the detector option, so we limit the possibilities @@ -132,15 +133,17 @@ sequenceLoader.load("ParticleFlow/Pandora") sequenceLoader.load("CaloDigi/LumiCal") # monitoring and Reco to MCTruth linking -sequenceLoader.load("HighLevelReco/RecoMCTruthLink") -sequenceLoader.load("Diagnostics/Tracking") +if not reco_args.native: + sequenceLoader.load("HighLevelReco/RecoMCTruthLink") + sequenceLoader.load("Diagnostics/Tracking") # pfo selector (might need re-optimisation) -if not reco_args.trackingOnly: +if not reco_args.trackingOnly and not reco_args.native: sequenceLoader.load("HighLevelReco/PFOSelector") sequenceLoader.load("HighLevelReco/JetClusteringOrRenaming") sequenceLoader.load("HighLevelReco/JetAndVertex") # event number processor, down here to attach the conversion back to edm4hep to it -algList.append(EventNumber) +if not reco_args.native: + algList.append(EventNumber) DST_KEEPLIST = ["MCParticlesSkimmed", "MCPhysicsParticles", "RecoMCTruthLink", "SiTracks", "SiTracks_Refitted", "PandoraClusters", "PandoraPFOs", "SelectedPandoraPFOs", "LooseSelectedPandoraPFOs", "TightSelectedPandoraPFOs", "RefinedVertexJets", "RefinedVertexJets_rel", "RefinedVertexJets_vtx", "RefinedVertexJets_vtx_RP", "BuildUpVertices", "BuildUpVertices_res", "BuildUpVertices_RP", "BuildUpVertices_res_RP", "BuildUpVertices_V0", "BuildUpVertices_V0_res", "BuildUpVertices_V0_RP", "BuildUpVertices_V0_res_RP", "PrimaryVertices", "PrimaryVertices_res", "PrimaryVertices_RP", "PrimaryVertices_res_RP", "RefinedVertices", "RefinedVertices_RP"] @@ -148,6 +151,8 @@ # TODO: replace all the ugly strings by something sensible like Enum if CONFIG["OutputMode"] == "LCIO": + if reco_args.native: + raise RuntimeError("LCIO output is not supported with --native") Output_REC = io_handler.add_lcio_writer("Output_REC") Output_REC.Parameters = { "LCIOOutputFile": [f"{reco_args.outputBasename}_REC.slcio"], From fb12d1c306ac8c24dd5778bb9d39a0ff0cfc6567 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 21 Oct 2025 16:44:36 +0200 Subject: [PATCH 59/68] Make sure to use an input --- CLDConfig/CLDReconstruction.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index f48a513..ec1e206 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -42,6 +42,8 @@ evtsvc = EventDataSvc("EventDataSvc") iosvc = IOSvc() +if reco_args.native: + iosvc.Input = reco_args.inputFiles svcList = [evtsvc, iosvc] algList = [] From eef14c64a6d8d8f2f01955d829c58588f84c96e0 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Thu, 23 Oct 2025 14:57:17 +0200 Subject: [PATCH 60/68] Do not remove parameters that now exist --- CLDConfig/CaloDigi/CaloDigi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/CaloDigi/CaloDigi.py b/CLDConfig/CaloDigi/CaloDigi.py index 7dc057b..9deb956 100644 --- a/CLDConfig/CaloDigi/CaloDigi.py +++ b/CLDConfig/CaloDigi/CaloDigi.py @@ -129,7 +129,7 @@ if reco_args.native: # Not implemented in the algorithm - for key in ["Histograms", "RootFile", "ECAL_apply_realistic_digi", "HCAL_apply_realistic_digi"]: + for key in ["Histograms", "RootFile"]: MyDDCaloDigiParameters.pop(key) final_parameters = MyDDCaloDigiParameters From 4b6694706d3960dd2e4fdbc394b9eca94ea6a841 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 10:51:10 +0100 Subject: [PATCH 61/68] Fix collection types for Marlin in ConformalTracking.py --- CLDConfig/Tracking/ConformalTracking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 17bd4b5..1d0c7d2 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -159,7 +159,7 @@ "MinClustersOnTrackAfterFit": 3, "RelationsNames": ["VXDTrackerHitRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], "RetryTooManyTracks": False, - "SiTrackCollectionName": "SiTracksCT", + "SiTrackCollectionName": ["SiTracksCT"], "SortTreeResults": True, "ThetaRange": 0.05, "TooManyTracks": 100000, @@ -179,9 +179,9 @@ clones_and_split_tracks_finder_args = { "EnergyLossOn": True, - "InputTrackCollectionName": "SiTracksCT", + "InputTrackCollectionName": ["SiTracksCT"], "MultipleScatteringOn": True, - "OutputTrackCollectionName": "SiTracks", + "OutputTrackCollectionName": ["SiTracks"], "SmoothOn": False, "extrapolateForward": True, "maxSignificancePhi": 3., From bc841340ca2cdb3574281048e3f31dcfe658ac8b Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 14:29:32 +0100 Subject: [PATCH 62/68] Use toMarlinDict --- CLDConfig/Tracking/ConformalTracking.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 1d0c7d2..f32167d 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -20,6 +20,7 @@ from k4FWCore.parseArgs import parser from conformal_tracking_utils import configure_conformal_tracking_steps +from py_utils import toMarlinDict # geoservice comes from the `global_vars` of the SequenceLoader if any(small_vtx in geoservice.detectors[0] for small_vtx in ["_o2_", "_o3_", "_o4_"]): @@ -167,8 +168,7 @@ "trackPurity": 0.7 } -conformal_tracking_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in conformal_tracking_args.items()} -conformal_tracking_args_marlin = {k: [str(v)] if isinstance(v, float) or isinstance(v, int) else v for k, v in conformal_tracking_args_marlin.items()} +conformal_tracking_args_marlin = toMarlinDict(conformal_tracking_args) conformal_tracking_args_marlin["MCParticleCollectionName"] = ["MCParticle"] if args[0].native: @@ -191,8 +191,7 @@ "minTrackPt": 1., } -clone_and_split_tracks_finder_args_marlin = {k: [str(v).lower()] if isinstance(v, bool) else v for k, v in clones_and_split_tracks_finder_args.items()} -clone_and_split_tracks_finder_args_marlin = {k: [str(v)] if isinstance(v, float) else v for k, v in clone_and_split_tracks_finder_args_marlin.items()} +clone_and_split_tracks_finder_args_marlin = toMarlinDict(clones_and_split_tracks_finder_args) if args[0].native: from Configurables import ConformalTracking, ClonesAndSplitTracksFinder From 07dfe1d15359a1be819089b73d8c5ebea9135f81 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 14:34:04 +0100 Subject: [PATCH 63/68] Make the collection names strings again --- CLDConfig/Tracking/ConformalTracking.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index f32167d..276b8c9 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -155,12 +155,12 @@ "DebugHits": ["DebugHits"], "DebugPlots": False, "DebugTiming": False, - "MCParticleCollectionName": ["MCParticles"], + "MCParticleCollectionName": "MCParticles", "MaxHitInvertedFit": 0, "MinClustersOnTrackAfterFit": 3, "RelationsNames": ["VXDTrackerHitRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], "RetryTooManyTracks": False, - "SiTrackCollectionName": ["SiTracksCT"], + "SiTrackCollectionName": "SiTracksCT", "SortTreeResults": True, "ThetaRange": 0.05, "TooManyTracks": 100000, @@ -179,9 +179,9 @@ clones_and_split_tracks_finder_args = { "EnergyLossOn": True, - "InputTrackCollectionName": ["SiTracksCT"], + "InputTrackCollectionName": "SiTracksCT", "MultipleScatteringOn": True, - "OutputTrackCollectionName": ["SiTracks"], + "OutputTrackCollectionName": "SiTracks", "SmoothOn": False, "extrapolateForward": True, "maxSignificancePhi": 3., From 5311a586c736c01ddc0b3a96041bba7d20d5ad33 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 14:44:32 +0100 Subject: [PATCH 64/68] Change from string to list --- CLDConfig/Tracking/ConformalTracking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLDConfig/Tracking/ConformalTracking.py b/CLDConfig/Tracking/ConformalTracking.py index 276b8c9..9f41329 100644 --- a/CLDConfig/Tracking/ConformalTracking.py +++ b/CLDConfig/Tracking/ConformalTracking.py @@ -155,7 +155,7 @@ "DebugHits": ["DebugHits"], "DebugPlots": False, "DebugTiming": False, - "MCParticleCollectionName": "MCParticles", + "MCParticleCollectionName": ["MCParticles"], "MaxHitInvertedFit": 0, "MinClustersOnTrackAfterFit": 3, "RelationsNames": ["VXDTrackerHitRelations", "VXDEndcapTrackerHitRelations", "InnerTrackerBarrelHitsRelations", "OuterTrackerBarrelHitsRelations", "InnerTrackerEndcapHitsRelations", "OuterTrackerEndcapHitsRelations"], From 33fddab9f2f1d72ec8270c7bf9b0accc5b0e3705 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 14:57:03 +0100 Subject: [PATCH 65/68] Make sure to write an output file --- CLDConfig/CLDReconstruction.py | 1 + 1 file changed, 1 insertion(+) diff --git a/CLDConfig/CLDReconstruction.py b/CLDConfig/CLDReconstruction.py index ec1e206..ec5f20e 100644 --- a/CLDConfig/CLDReconstruction.py +++ b/CLDConfig/CLDReconstruction.py @@ -44,6 +44,7 @@ iosvc = IOSvc() if reco_args.native: iosvc.Input = reco_args.inputFiles + iosvc.Output = f"{reco_args.outputBasename}_REC.edm4hep.root" svcList = [evtsvc, iosvc] algList = [] From e90e22f21abcf22721c1908dc3a79005f5a592b6 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 15:10:54 +0100 Subject: [PATCH 66/68] Remove Overlay and others to compare the native version --- test/CMakeLists.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3b93fa7..8d4e506 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -89,11 +89,16 @@ add_test(NAME marlin ) set_property(TEST marlin APPEND PROPERTY DEPENDS ddsim_lcio) +add_test(NAME "remove_overlay_and_others" + WORKING_DIRECTORY ${CLDConfig_DIR} + COMMAND bash -c "sed -e '/Overlay.Overlay/d' -e '/HighLevelReco.RecoMCTruthLink/d' CLDReconstruction.py > CLDReconstruction_no_overlay.py" +) + add_test(NAME "run_wrapper_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND k4run CLDReconstruction.py --inputFiles test.edm4hep.root --native --outputBasename output_native + COMMAND k4run CLDReconstruction_no_overlay.py --inputFiles test.edm4hep.root --native --outputBasename output_native ) -set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS ddsim_edm4hep) +set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS "ddsim_edm4hep;remove_overlay_and_others") add_test(NAME "compare_native" WORKING_DIRECTORY ${CLDConfig_DIR} From 97db37f00977e1bcf45b02edddf07b6f67b5c0eb Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 15:21:48 +0100 Subject: [PATCH 67/68] Add a test running without Overlay --- test/CMakeLists.txt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8d4e506..b63bccc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -94,14 +94,21 @@ add_test(NAME "remove_overlay_and_others" COMMAND bash -c "sed -e '/Overlay.Overlay/d' -e '/HighLevelReco.RecoMCTruthLink/d' CLDReconstruction.py > CLDReconstruction_no_overlay.py" ) +add_test(NAME edm4hep_input_no_overlay + WORKING_DIRECTORY ${CLDConfig_DIR} + COMMAND k4run --inputFiles=test.edm4hep.root --outputBasename=rec_test_edm4hep_no_overlay CLDReconstruction_no_overlay.py --GeoSvc.detectors=${DETECTOR} +) +set_property(TEST edm4hep_input APPEND PROPERTY DEPENDS "ddsim_edm4hep;remove_overlay_and_others") + + add_test(NAME "run_wrapper_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND k4run CLDReconstruction_no_overlay.py --inputFiles test.edm4hep.root --native --outputBasename output_native + COMMAND k4run CLDReconstruction.py --inputFiles test.edm4hep.root --native --outputBasename output_native ) -set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS "ddsim_edm4hep;remove_overlay_and_others") +set_property(TEST "run_wrapper_native" APPEND PROPERTY DEPENDS "ddsim_edm4hep") add_test(NAME "compare_native" WORKING_DIRECTORY ${CLDConfig_DIR} - COMMAND ${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py --wrapped-file rec_test_edm4hep_REC.edm4hep.root --native-file output_native_REC.edm4hep.root + COMMAND ${CMAKE_CURRENT_LIST_DIR}/scripts/compare-native.py --wrapped-file rec_test_edm4hep_no_overlay_REC.edm4hep.root --native-file output_native_REC.edm4hep.root ) set_property(TEST compare_native APPEND PROPERTY DEPENDS "run_wrapper_native") From d5a3c5a7148cc3fd5348536e6605e56dcdf2f191 Mon Sep 17 00:00:00 2001 From: Juan Miguel Carceller Date: Tue, 25 Nov 2025 15:29:57 +0100 Subject: [PATCH 68/68] Fix dep --- test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b63bccc..c17ec5d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -98,7 +98,7 @@ add_test(NAME edm4hep_input_no_overlay WORKING_DIRECTORY ${CLDConfig_DIR} COMMAND k4run --inputFiles=test.edm4hep.root --outputBasename=rec_test_edm4hep_no_overlay CLDReconstruction_no_overlay.py --GeoSvc.detectors=${DETECTOR} ) -set_property(TEST edm4hep_input APPEND PROPERTY DEPENDS "ddsim_edm4hep;remove_overlay_and_others") +set_property(TEST edm4hep_input_no_overlay APPEND PROPERTY DEPENDS "ddsim_edm4hep;remove_overlay_and_others") add_test(NAME "run_wrapper_native"