Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-03-31 07:48:29

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 - 2025, Dmitry Romanov, Tyler Kutz, Wouter Deconinck, Dmitry Kalinkin
0003 
0004 #include <Evaluator/DD4hepUnits.h>
0005 #include <JANA/JApplication.h>
0006 #include <JANA/JApplicationFwd.h>
0007 #include <JANA/Utils/JTypeInfo.h>
0008 #include <edm4eic/EDM4eicVersion.h>
0009 #include <edm4eic/MCRecoTrackParticleAssociationCollection.h>
0010 #include <edm4eic/MCRecoTrackerHitAssociationCollection.h>
0011 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0012 #include <edm4eic/MCRecoTrackerHitLinkCollection.h>
0013 #endif
0014 #include <edm4eic/TrackCollection.h>
0015 #include <edm4eic/TrackParameters.h>
0016 #include <edm4eic/TrackSeed.h>
0017 #include <edm4eic/TrackerHitCollection.h>
0018 #include <podio/detail/Link.h>
0019 #include <deque>
0020 #include <functional>
0021 #include <map>
0022 #include <memory>
0023 #include <string>
0024 #include <utility>
0025 #include <variant>
0026 #include <vector>
0027 
0028 #include "algorithms/meta/SubDivideFunctors.h"
0029 #include "algorithms/tracking/TrackPropagationConfig.h"
0030 #include "extensions/jana/JOmniFactoryGeneratorT.h"
0031 #include "factories/meta/CollectionCollector_factory.h"
0032 #include "factories/meta/SubDivideCollection_factory.h"
0033 #include "factories/tracking/ActsToTracks_factory.h"
0034 #include "factories/tracking/ActsTrackMerger_factory.h"
0035 #include "factories/tracking/AmbiguitySolver_factory.h"
0036 #include "factories/tracking/CKFTracking_factory.h"
0037 #include "factories/tracking/IterativeVertexFinder_factory.h"
0038 #include "factories/tracking/TrackParamTruthInit_factory.h"
0039 #include "factories/tracking/TrackProjector_factory.h"
0040 #include "factories/tracking/TrackPropagation_factory.h"
0041 #include "factories/tracking/TrackSeeding_factory.h"
0042 #include "factories/tracking/TrackerMeasurementFromHits_factory.h"
0043 #include "factories/tracking/TracksToParticles_factory.h"
0044 
0045 //
0046 extern "C" {
0047 void InitPlugin(JApplication* app) {
0048   InitJANAPlugin(app);
0049 
0050   using namespace eicrecon;
0051 
0052   app->Add(new JOmniFactoryGeneratorT<TrackParamTruthInit_factory>(
0053       "TrackTruthSeeds", {"EventHeader", "MCParticles"},
0054       {"TrackTruthSeeds", "TrackTruthSeedParameters"}, {}, app));
0055 
0056   std::vector<std::pair<double, double>> thetaRanges{{0, 50 * dd4hep::mrad},
0057                                                      {50 * dd4hep::mrad, 180 * dd4hep::deg}};
0058   app->Add(new JOmniFactoryGeneratorT<SubDivideCollection_factory<edm4eic::TrackSeed>>(
0059       "CentralB0TrackTruthSeeds", {"TrackTruthSeeds"},
0060       {"B0TrackerTruthSeeds", "CentralTrackerTruthSeeds"},
0061       {
0062           .function = RangeSplit<
0063               Chain<&edm4eic::TrackSeed::getParams, &edm4eic::TrackParameters::getTheta>>(
0064               thetaRanges),
0065       },
0066       app));
0067 
0068   // CENTRAL TRACKER
0069 
0070   // Tracker hits collector
0071   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::TrackerHit, true>>(
0072       "CentralTrackingRecHits",
0073       {"SiBarrelTrackerRecHits", "SiBarrelVertexRecHits", "SiEndcapTrackerRecHits",
0074        "TOFBarrelRecHits", "TOFEndcapRecHits", "MPGDBarrelRecHits", "OuterMPGDBarrelRecHits",
0075        "BackwardMPGDEndcapRecHits", "ForwardMPGDEndcapRecHits"},
0076       {"CentralTrackingRecHits"}, // Output collection name
0077       app));
0078 
0079   // Tracker hit associations collector
0080   app->Add(new JOmniFactoryGeneratorT<
0081            CollectionCollector_factory<edm4eic::MCRecoTrackerHitAssociation, true>>(
0082       "CentralTrackingRawHitAssociations",
0083       {"SiBarrelRawHitAssociations", "SiBarrelVertexRawHitAssociations",
0084        "SiEndcapTrackerRawHitAssociations", "TOFBarrelRawHitAssociations",
0085        "TOFEndcapRawHitAssociations", "MPGDBarrelRawHitAssociations",
0086        "OuterMPGDBarrelRawHitAssociations", "BackwardMPGDEndcapRawHitAssociations",
0087        "ForwardMPGDEndcapRawHitAssociations"},
0088       {"CentralTrackingRawHitAssociations"}, // Output collection name
0089       app));
0090 
0091 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0092   // Tracker hit links collector
0093   app->Add(
0094       new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::MCRecoTrackerHitLink, true>>(
0095           "CentralTrackingRawHitLinks",
0096           {"SiBarrelRawHitLinks", "SiBarrelVertexRawHitLinks", "SiEndcapTrackerRawHitLinks",
0097            "TOFBarrelRawHitLinks", "TOFEndcapRawHitLinks", "MPGDBarrelRawHitLinks",
0098            "OuterMPGDBarrelRawHitLinks", "BackwardMPGDEndcapRawHitLinks",
0099            "ForwardMPGDEndcapRawHitLinks"},
0100           {"CentralTrackingRawHitLinks"}, // Output collection name
0101           app));
0102 #endif
0103 
0104   app->Add(new JOmniFactoryGeneratorT<TrackerMeasurementFromHits_factory>(
0105       "CentralTrackerMeasurements", {"CentralTrackingRecHits"}, {"CentralTrackerMeasurements"},
0106       app));
0107 
0108   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0109       "CentralCKFTruthSeededTrajectories",
0110       {"CentralTrackerTruthSeeds", "CentralTrackerMeasurements"},
0111       {
0112           "CentralCKFTruthSeededActsTrackStatesUnfiltered",
0113           "CentralCKFTruthSeededActsTracksUnfiltered",
0114       },
0115       app));
0116 
0117   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0118       "CentralCKFTruthSeededTracksUnfiltered",
0119       {
0120           "CentralTrackerMeasurements",
0121           "CentralTrackerTruthSeeds",
0122           "CentralCKFTruthSeededActsTrackStatesUnfiltered",
0123           "CentralCKFTruthSeededActsTracksUnfiltered",
0124           "CentralTrackingRawHitAssociations",
0125       },
0126       {
0127           "CentralCKFTruthSeededTrajectoriesUnfiltered",
0128           "CentralCKFTruthSeededTrackParametersUnfiltered",
0129           "CentralCKFTruthSeededTracksUnfiltered",
0130 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0131           "CentralCKFTruthSeededTrackUnfilteredLinks",
0132 #endif
0133           "CentralCKFTruthSeededTrackUnfilteredAssociations",
0134       },
0135       app));
0136 
0137   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0138       "TruthSeededAmbiguityResolutionSolver",
0139       {"CentralCKFTruthSeededActsTrackStatesUnfiltered",
0140        "CentralCKFTruthSeededActsTracksUnfiltered"},
0141       {
0142           "CentralCKFTruthSeededActsTrackStates",
0143           "CentralCKFTruthSeededActsTracks",
0144       },
0145       app));
0146 
0147   app->Add(
0148       new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTruthSeededTracks",
0149                                                        {
0150                                                            "CentralTrackerMeasurements",
0151                                                            "CentralTrackerTruthSeeds",
0152                                                            "CentralCKFTruthSeededActsTrackStates",
0153                                                            "CentralCKFTruthSeededActsTracks",
0154                                                            "CentralTrackingRawHitAssociations",
0155                                                        },
0156                                                        {
0157                                                            "CentralCKFTruthSeededTrajectories",
0158                                                            "CentralCKFTruthSeededTrackParameters",
0159                                                            "CentralCKFTruthSeededTracks",
0160 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0161                                                            "CentralCKFTruthSeededTrackLinks",
0162 #endif
0163                                                            "CentralCKFTruthSeededTrackAssociations",
0164                                                        },
0165                                                        app));
0166 
0167   app->Add(new JOmniFactoryGeneratorT<TrackSeeding_factory>(
0168       "CentralTrackSeeds", {"CentralTrackingRecHits"},
0169       {"CentralTrackSeeds", "CentralTrackSeedParameters"}, {}, app));
0170 
0171   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0172       "CentralCKFTrajectories", {"CentralTrackSeeds", "CentralTrackerMeasurements"},
0173       {
0174           "CentralCKFActsTrackStatesUnfiltered",
0175           "CentralCKFActsTracksUnfiltered",
0176       },
0177       app));
0178 
0179   app->Add(
0180       new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTracksUnfiltered",
0181                                                        {
0182                                                            "CentralTrackerMeasurements",
0183                                                            "CentralTrackSeeds",
0184                                                            "CentralCKFActsTrackStatesUnfiltered",
0185                                                            "CentralCKFActsTracksUnfiltered",
0186                                                            "CentralTrackingRawHitAssociations",
0187                                                        },
0188                                                        {
0189                                                            "CentralCKFTrajectoriesUnfiltered",
0190                                                            "CentralCKFTrackParametersUnfiltered",
0191                                                            "CentralCKFTracksUnfiltered",
0192 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0193                                                            "CentralCKFTrackUnfilteredLinks",
0194 #endif
0195                                                            "CentralCKFTrackUnfilteredAssociations",
0196                                                        },
0197                                                        app));
0198 
0199   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0200       "AmbiguityResolutionSolver",
0201       {"CentralCKFActsTrackStatesUnfiltered", "CentralCKFActsTracksUnfiltered"},
0202       {
0203           "CentralCKFActsTrackStates",
0204           "CentralCKFActsTracks",
0205       },
0206       app));
0207 
0208   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTracks",
0209                                                             {
0210                                                                 "CentralTrackerMeasurements",
0211                                                                 "CentralTrackSeeds",
0212                                                                 "CentralCKFActsTrackStates",
0213                                                                 "CentralCKFActsTracks",
0214                                                                 "CentralTrackingRawHitAssociations",
0215                                                             },
0216                                                             {
0217                                                                 "CentralCKFTrajectories",
0218                                                                 "CentralCKFTrackParameters",
0219                                                                 "CentralCKFTracks",
0220 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0221                                                                 "CentralCKFTrackLinks",
0222 #endif
0223                                                                 "CentralCKFTrackAssociations",
0224                                                             },
0225                                                             app));
0226 
0227   app->Add(new JOmniFactoryGeneratorT<TrackProjector_factory>("CentralTrackSegments",
0228                                                               {
0229                                                                   "CentralCKFActsTrackStates",
0230                                                                   "CentralCKFActsTracks",
0231                                                                   "CentralCKFTracks",
0232                                                               },
0233                                                               {
0234                                                                   "CentralTrackSegments",
0235                                                               },
0236                                                               app));
0237 
0238   app->Add(
0239       new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>("CentralTrackVertices",
0240                                                                 {
0241                                                                     "CentralCKFActsTrackStates",
0242                                                                     "CentralCKFActsTracks",
0243                                                                     "ReconstructedChargedParticles",
0244                                                                 },
0245                                                                 {
0246                                                                     "CentralTrackVertices",
0247                                                                 },
0248                                                                 {}, app));
0249 
0250   app->Add(
0251       new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>("CentralTrack4HitCutVertices",
0252                                                                 {
0253                                                                     "CentralCKFActsTrackStates",
0254                                                                     "CentralCKFActsTracks",
0255                                                                     "ReconstructedChargedParticles",
0256                                                                 },
0257                                                                 {
0258                                                                     "CentralTrack4HitCutVertices",
0259                                                                 },
0260                                                                 {.minTrackHits = 4}, app));
0261 
0262   app->Add(new JOmniFactoryGeneratorT<TrackPropagation_factory>(
0263       "CalorimeterTrackPropagator",
0264       {"CentralCKFTracks", "CentralCKFActsTrackStates", "CentralCKFActsTracks"},
0265       {"CalorimeterTrackProjections"},
0266       {.target_surfaces{
0267           // Ecal
0268           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapN_ID",
0269                                       .zmin = "- EcalEndcapN_zmin",
0270                                       .rmin = 0.,
0271                                       .rmax = "1.1*EcalEndcapN_rmax"},
0272           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapN_ID",
0273                                       .zmin = "- EcalEndcapN_zmin - 50*mm",
0274                                       .rmin = 0.,
0275                                       .rmax = "1.1*EcalEndcapN_rmax"},
0276           eicrecon::CylinderSurfaceConfig{
0277               .id   = "EcalBarrel_ID",
0278               .rmin = "EcalBarrel_rmin",
0279               .zmin = "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0280               .zmax = "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"},
0281           eicrecon::CylinderSurfaceConfig{
0282               .id   = "EcalBarrel_ID",
0283               .rmin = "EcalBarrel_rmin + 50*mm",
0284               .zmin = "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0285               .zmax = "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"},
0286           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapP_ID",
0287                                       .zmin = "EcalEndcapP_zmin",
0288                                       .rmin = 0.,
0289                                       .rmax = "1.1*EcalEndcapP_rmax"},
0290           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapP_ID",
0291                                       .zmin = "EcalEndcapP_zmin + 50*mm",
0292                                       .rmin = 0.,
0293                                       .rmax = "1.1*EcalEndcapP_rmax"},
0294           // Hcal
0295           eicrecon::DiscSurfaceConfig{.id   = "HcalEndcapN_ID",
0296                                       .zmin = "- HcalEndcapN_zmin",
0297                                       .rmin = 0.,
0298                                       .rmax = "1.1*HcalEndcapN_rmax"},
0299           eicrecon::DiscSurfaceConfig{.id   = "HcalEndcapN_ID",
0300                                       .zmin = "- HcalEndcapN_zmin - 150*mm",
0301                                       .rmin = 0.,
0302                                       .rmax = "1.1*HcalEndcapN_rmax"},
0303           eicrecon::CylinderSurfaceConfig{
0304               .id   = "HcalBarrel_ID",
0305               .rmin = "HcalBarrel_rmin",
0306               .zmin = "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0307               .zmax = "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"},
0308           eicrecon::CylinderSurfaceConfig{
0309               .id   = "HcalBarrel_ID",
0310               .rmin = "HcalBarrel_rmin + 150*mm",
0311               .zmin = "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0312               .zmax = "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"},
0313           eicrecon::DiscSurfaceConfig{
0314               .id = "LFHCAL_ID", .zmin = "LFHCAL_zmin", .rmin = 0., .rmax = "1.1*LFHCAL_rmax"},
0315           eicrecon::DiscSurfaceConfig{.id   = "LFHCAL_ID",
0316                                       .zmin = "LFHCAL_zmin + 150*mm",
0317                                       .rmin = 0.,
0318                                       .rmax = "1.1*LFHCAL_rmax"},
0319       }},
0320       app));
0321 
0322   // B0 TRACKER
0323 
0324   app->Add(new JOmniFactoryGeneratorT<TrackerMeasurementFromHits_factory>(
0325       "B0TrackerMeasurements", {"B0TrackerRecHits"}, {"B0TrackerMeasurements"}, app));
0326 
0327   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0328       "B0TrackerCKFTruthSeededTrajectories", {"B0TrackerTruthSeeds", "B0TrackerMeasurements"},
0329       {
0330           "B0TrackerCKFTruthSeededActsTrackStatesUnfiltered",
0331           "B0TrackerCKFTruthSeededActsTracksUnfiltered",
0332       },
0333       app));
0334 
0335   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0336       "B0TrackerCKFTruthSeededTracksUnfiltered",
0337       {
0338           "B0TrackerMeasurements",
0339           "B0TrackerTruthSeeds",
0340           "B0TrackerCKFTruthSeededActsTrackStatesUnfiltered",
0341           "B0TrackerCKFTruthSeededActsTracksUnfiltered",
0342           "B0TrackerRawHitAssociations",
0343       },
0344       {
0345           "B0TrackerCKFTruthSeededTrajectoriesUnfiltered",
0346           "B0TrackerCKFTruthSeededTrackParametersUnfiltered",
0347           "B0TrackerCKFTruthSeededTracksUnfiltered",
0348 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0349           "B0TrackerCKFTruthSeededTrackUnfilteredLinks",
0350 #endif
0351           "B0TrackerCKFTruthSeededTrackUnfilteredAssociations",
0352       },
0353       app));
0354 
0355   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0356       "B0TrackerTruthSeededAmbiguityResolutionSolver",
0357       {"B0TrackerCKFTruthSeededActsTrackStatesUnfiltered",
0358        "B0TrackerCKFTruthSeededActsTracksUnfiltered"},
0359       {
0360           "B0TrackerCKFTruthSeededActsTrackStates",
0361           "B0TrackerCKFTruthSeededActsTracks",
0362       },
0363       app));
0364 
0365   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0366       "B0TrackerCKFTruthSeededTracks",
0367       {
0368           "B0TrackerMeasurements",
0369           "B0TrackerTruthSeeds",
0370           "B0TrackerCKFTruthSeededActsTrackStates",
0371           "B0TrackerCKFTruthSeededActsTracks",
0372           "B0TrackerRawHitAssociations",
0373       },
0374       {
0375           "B0TrackerCKFTruthSeededTrajectories",
0376           "B0TrackerCKFTruthSeededTrackParameters",
0377           "B0TrackerCKFTruthSeededTracks",
0378 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0379           "B0TrackerCKFTruthSeededTrackLinks",
0380 #endif
0381           "B0TrackerCKFTruthSeededTrackAssociations",
0382       },
0383       app));
0384 
0385   app->Add(new JOmniFactoryGeneratorT<TrackSeeding_factory>(
0386       "B0TrackerSeeds", {"B0TrackerRecHits"}, {"B0TrackerSeeds", "B0TrackerSeedParameters"}, {},
0387       app));
0388 
0389   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0390       "B0TrackerCKFTrajectories", {"B0TrackerSeeds", "B0TrackerMeasurements"},
0391       {
0392           "B0TrackerCKFActsTrackStatesUnfiltered",
0393           "B0TrackerCKFActsTracksUnfiltered",
0394       },
0395       app));
0396 
0397   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0398       "B0TrackerCKFTracksUnfiltered",
0399       {
0400           "B0TrackerMeasurements",
0401           "B0TrackerSeeds",
0402           "B0TrackerCKFActsTrackStatesUnfiltered",
0403           "B0TrackerCKFActsTracksUnfiltered",
0404           "B0TrackerRawHitAssociations",
0405       },
0406       {
0407           "B0TrackerCKFTrajectoriesUnfiltered",
0408           "B0TrackerCKFTrackParametersUnfiltered",
0409           "B0TrackerCKFTracksUnfiltered",
0410 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0411           "B0TrackerCKFTrackUnfilteredLinks",
0412 #endif
0413           "B0TrackerCKFTrackUnfilteredAssociations",
0414       },
0415       app));
0416 
0417   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0418       "B0TrackerAmbiguityResolutionSolver",
0419       {"B0TrackerCKFActsTrackStatesUnfiltered", "B0TrackerCKFActsTracksUnfiltered"},
0420       {
0421           "B0TrackerCKFActsTrackStates",
0422           "B0TrackerCKFActsTracks",
0423       },
0424       app));
0425 
0426   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>("B0TrackerCKFTracks",
0427                                                             {
0428                                                                 "B0TrackerMeasurements",
0429                                                                 "B0TrackerSeeds",
0430                                                                 "B0TrackerCKFActsTrackStates",
0431                                                                 "B0TrackerCKFActsTracks",
0432                                                                 "B0TrackerRawHitAssociations",
0433                                                             },
0434                                                             {
0435                                                                 "B0TrackerCKFTrajectories",
0436                                                                 "B0TrackerCKFTrackParameters",
0437                                                                 "B0TrackerCKFTracks",
0438 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0439                                                                 "B0TrackerCKFTrackLinks",
0440 #endif
0441                                                                 "B0TrackerCKFTrackAssociations",
0442                                                             },
0443                                                             app));
0444 
0445   // COMBINED TRACKING
0446 
0447   // Use both central and B0 tracks for vertexing
0448   app->Add(new JOmniFactoryGeneratorT<ActsTrackMerger_factory>(
0449       "CentralAndB0TrackerCKFActsTracks",
0450       {
0451           "CentralCKFActsTrackStates",
0452           "CentralCKFActsTracks",
0453           "B0TrackerCKFActsTrackStates",
0454           "B0TrackerCKFActsTracks",
0455       },
0456       {
0457           "CentralAndB0TrackerCKFActsTrackStates",
0458           "CentralAndB0TrackerCKFActsTracks",
0459       },
0460       app));
0461 
0462   app->Add(new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>(
0463       "CentralAndB0TrackVertices",
0464       {
0465           "CentralAndB0TrackerCKFActsTrackStates",
0466           "CentralAndB0TrackerCKFActsTracks",
0467           "ReconstructedChargedParticles",
0468       },
0469       {
0470           "CentralAndB0TrackVertices",
0471       },
0472       {}, app));
0473 
0474   app->Add(new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>(
0475       "CentralAndB0Track4HitCutVertices",
0476       {
0477           "CentralAndB0TrackerCKFActsTrackStates",
0478           "CentralAndB0TrackerCKFActsTracks",
0479           "ReconstructedChargedParticles",
0480       },
0481       {
0482           "CentralAndB0Track4HitCutVertices",
0483       },
0484       {.minTrackHits = 4}, app));
0485 
0486   // Add central and B0 tracks
0487   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Track, true>>(
0488       "CombinedTracks", {"CentralCKFTracks", "B0TrackerCKFTracks"}, {"CombinedTracks"}, app));
0489 
0490   app->Add(new JOmniFactoryGeneratorT<
0491            CollectionCollector_factory<edm4eic::MCRecoTrackParticleAssociation, true>>(
0492       "CombinedTrackAssociations", {"CentralCKFTrackAssociations", "B0TrackerCKFTrackAssociations"},
0493       {"CombinedTrackAssociations"}, app));
0494 
0495   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Track, true>>(
0496       "CombinedTruthSeededTracks", {"CentralCKFTruthSeededTracks", "B0TrackerCKFTruthSeededTracks"},
0497       {"CombinedTruthSeededTracks"}, app));
0498 
0499   app->Add(new JOmniFactoryGeneratorT<
0500            CollectionCollector_factory<edm4eic::MCRecoTrackParticleAssociation, true>>(
0501       "CombinedTruthSeededTrackAssociations",
0502       {"CentralCKFTruthSeededTrackAssociations", "B0TrackerCKFTruthSeededTrackAssociations"},
0503       {"CombinedTruthSeededTrackAssociations"}, app));
0504 
0505   app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0506       "ChargedTruthSeededParticlesWithAssociations",
0507       {
0508           "CombinedTruthSeededTracks",
0509           "CombinedTruthSeededTrackAssociations",
0510       },
0511       {"ReconstructedTruthSeededChargedWithoutPIDParticles",
0512 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0513        "ReconstructedTruthSeededChargedWithoutPIDParticleLinks",
0514 #endif
0515        "ReconstructedTruthSeededChargedWithoutPIDParticleAssociations"},
0516       {}, app));
0517 
0518   app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0519       "ChargedParticlesWithAssociations",
0520       {
0521           "CombinedTracks",
0522           "CombinedTrackAssociations",
0523       },
0524       {"ReconstructedChargedWithoutPIDParticles",
0525 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0526        "ReconstructedChargedWithoutPIDParticleLinks",
0527 #endif
0528        "ReconstructedChargedWithoutPIDParticleAssociations"},
0529       {}, app));
0530 }
0531 } // extern "C"