Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-10-27 08:40:19

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 <Acts/Definitions/Units.hpp>
0005 #include <Evaluator/DD4hepUnits.h>
0006 #include <JANA/JApplication.h>
0007 #include <JANA/JApplicationFwd.h>
0008 #include <JANA/Utils/JTypeInfo.h>
0009 #include <edm4eic/MCRecoTrackParticleAssociationCollection.h>
0010 #include <edm4eic/MCRecoTrackerHitAssociationCollection.h>
0011 #include <edm4eic/MCRecoTrackerHitLinkCollection.h>
0012 #include <edm4eic/Measurement2D.h>
0013 #include <edm4eic/MCRecoTrackParticleLinkCollection.h>
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 <memory>
0022 #include <string>
0023 #include <utility>
0024 #include <variant>
0025 #include <vector>
0026 
0027 #include "algorithms/meta/SubDivideFunctors.h"
0028 #include "algorithms/tracking/TrackPropagationConfig.h"
0029 #include "extensions/jana/JOmniFactoryGeneratorT.h"
0030 #include "factories/meta/CollectionCollector_factory.h"
0031 #include "factories/meta/SubDivideCollection_factory.h"
0032 #include "factories/tracking/ActsToTracks_factory.h"
0033 #include "factories/tracking/ActsTrackMerger_factory.h"
0034 #include "factories/tracking/AmbiguitySolver_factory.h"
0035 #include "factories/tracking/CKFTracking_factory.h"
0036 #include "factories/tracking/IterativeVertexFinder_factory.h"
0037 #include "factories/tracking/SecondaryVertexFinder_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       "TrackerTruthSeeds", {"EventHeader", "MCParticles"},
0054       {"TrackerTruthSeeds", "TrackerTruthSeedParameters"}, {}, 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       "CentralB0TrackerTruthSeeds", {"TrackerTruthSeeds"},
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        "MPGDBarrelRecHits", "OuterMPGDBarrelRecHits", "BackwardMPGDEndcapRecHits",
0075        "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", "MPGDBarrelRawHitAssociations",
0085        "OuterMPGDBarrelRawHitAssociations", "BackwardMPGDEndcapRawHitAssociations",
0086        "ForwardMPGDEndcapRawHitAssociations", "TOFBarrelSharedRawHitAssociations",
0087        "TOFEndcapSharedRawHitAssociations"},
0088       {"CentralTrackingRawHitAssociations"}, // Output collection name
0089       app));
0090 
0091   // Tracker hit links collector
0092   app->Add(
0093       new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::MCRecoTrackerHitLink, true>>(
0094           "CentralTrackingRawHitLinks",
0095           {"SiBarrelRawHitLinks", "SiBarrelVertexRawHitLinks", "SiEndcapTrackerRawHitLinks",
0096            "TOFBarrelSharedRawHitLinks", "TOFEndcapSharedRawHitLinks", "MPGDBarrelRawHitLinks",
0097            "OuterMPGDBarrelRawHitLinks", "BackwardMPGDEndcapRawHitLinks",
0098            "ForwardMPGDEndcapRawHitLinks"},
0099           {"CentralTrackingRawHitLinks"}, // Output collection name
0100           app));
0101 
0102   app->Add(new JOmniFactoryGeneratorT<TrackerMeasurementFromHits_factory>(
0103       "CentralWithoutTOFTrackerMeasurements", {"CentralTrackingRecHits"},
0104       {"CentralWithoutTOFTrackerMeasurements"}, app));
0105 
0106   // add trackers that generate Measurement2D directly
0107   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Measurement2D, true>>(
0108       "CentralTrackerMeasurements",
0109       {"CentralWithoutTOFTrackerMeasurements", "TOFBarrelClusterHits", "TOFEndcapClusterHits"},
0110       {"CentralTrackerMeasurements"}, // Output collection name
0111       app));
0112 
0113   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0114       "CentralCKFTruthSeededTrajectories",
0115       {"CentralTrackerTruthSeeds", "CentralTrackerMeasurements"},
0116       {
0117           "CentralCKFTruthSeededActsTrackStatesUnfiltered",
0118           "CentralCKFTruthSeededActsTracksUnfiltered",
0119       },
0120       app));
0121 
0122   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0123       "CentralCKFTruthSeededTracksUnfiltered",
0124       {
0125           "CentralTrackerMeasurements",
0126           "CentralTrackerTruthSeeds",
0127           "CentralCKFTruthSeededActsTrackStatesUnfiltered",
0128           "CentralCKFTruthSeededActsTracksUnfiltered",
0129           "CentralTrackingRawHitAssociations",
0130       },
0131       {
0132           "CentralCKFTruthSeededTrajectoriesUnfiltered",
0133           "CentralCKFTruthSeededTrackParametersUnfiltered",
0134           "CentralCKFTruthSeededTracksUnfiltered",
0135           "CentralCKFTruthSeededTrackUnfilteredLinks",
0136           "CentralCKFTruthSeededTrackUnfilteredAssociations",
0137       },
0138       app));
0139 
0140   // Variant of CentralCKFTruthSeeded tracking that includes measurement time in the calibration
0141   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0142       "CentralCKFTruthSeededTimeTrajectories",
0143       {"CentralTrackerTruthSeeds", "CentralTrackerMeasurements"},
0144       {
0145           "CentralCKFTruthSeededTimeActsTrackStatesUnfiltered",
0146           "CentralCKFTruthSeededTimeActsTracksUnfiltered",
0147       },
0148       {
0149           .useTime = true,
0150       },
0151       app));
0152 
0153   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0154       "CentralCKFTruthSeededTimeTracksUnfiltered",
0155       {
0156           "CentralTrackerMeasurements",
0157           "CentralTrackerTruthSeeds",
0158           "CentralCKFTruthSeededTimeActsTrackStatesUnfiltered",
0159           "CentralCKFTruthSeededTimeActsTracksUnfiltered",
0160           "CentralTrackingRawHitAssociations",
0161       },
0162       {
0163           "CentralCKFTruthSeededTimeTrajectoriesUnfiltered",
0164           "CentralCKFTruthSeededTimeTrackParametersUnfiltered",
0165           "CentralCKFTruthSeededTimeTracksUnfiltered",
0166           "CentralCKFTruthSeededTimeTrackUnfilteredLinks",
0167           "CentralCKFTruthSeededTimeTrackUnfilteredAssociations",
0168       },
0169       app));
0170 
0171   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0172       "CentralCKFTruthSeededTimeAmbiguityResolutionSolver",
0173       {"CentralCKFTruthSeededTimeActsTrackStatesUnfiltered",
0174        "CentralCKFTruthSeededTimeActsTracksUnfiltered"},
0175       {
0176           "CentralCKFTruthSeededTimeActsTrackStates",
0177           "CentralCKFTruthSeededTimeActsTracks",
0178       },
0179       app));
0180 
0181   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0182       "CentralCKFTruthSeededTimeTracks",
0183       {
0184           "CentralTrackerMeasurements",
0185           "CentralTrackerTruthSeeds",
0186           "CentralCKFTruthSeededTimeActsTrackStates",
0187           "CentralCKFTruthSeededTimeActsTracks",
0188           "CentralTrackingRawHitAssociations",
0189       },
0190       {
0191           "CentralCKFTruthSeededTimeTrajectories",
0192           "CentralCKFTruthSeededTimeTrackParameters",
0193           "CentralCKFTruthSeededTimeTracks",
0194           "CentralCKFTruthSeededTimeTrackLinks",
0195           "CentralCKFTruthSeededTimeTrackAssociations",
0196       },
0197       app));
0198 
0199   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0200       "TruthSeededAmbiguityResolutionSolver",
0201       {"CentralCKFTruthSeededActsTrackStatesUnfiltered",
0202        "CentralCKFTruthSeededActsTracksUnfiltered"},
0203       {
0204           "CentralCKFTruthSeededActsTrackStates",
0205           "CentralCKFTruthSeededActsTracks",
0206       },
0207       app));
0208 
0209   app->Add(
0210       new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTruthSeededTracks",
0211                                                        {
0212                                                            "CentralTrackerMeasurements",
0213                                                            "CentralTrackerTruthSeeds",
0214                                                            "CentralCKFTruthSeededActsTrackStates",
0215                                                            "CentralCKFTruthSeededActsTracks",
0216                                                            "CentralTrackingRawHitAssociations",
0217                                                        },
0218                                                        {
0219                                                            "CentralCKFTruthSeededTrajectories",
0220                                                            "CentralCKFTruthSeededTrackParameters",
0221                                                            "CentralCKFTruthSeededTracks",
0222                                                            "CentralCKFTruthSeededTrackLinks",
0223                                                            "CentralCKFTruthSeededTrackAssociations",
0224                                                        },
0225                                                        app));
0226 
0227   app->Add(new JOmniFactoryGeneratorT<TrackSeeding_factory>(
0228       "CentralTrackSeeds", {"CentralTrackingRecHits"},
0229       {"CentralTrackSeeds", "CentralTrackSeedParameters"}, {}, app));
0230 
0231   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0232       "CentralCKFTrajectories", {"CentralTrackSeeds", "CentralTrackerMeasurements"},
0233       {
0234           "CentralCKFActsTrackStatesUnfiltered",
0235           "CentralCKFActsTracksUnfiltered",
0236       },
0237       app));
0238 
0239   app->Add(
0240       new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTracksUnfiltered",
0241                                                        {
0242                                                            "CentralTrackerMeasurements",
0243                                                            "CentralTrackSeeds",
0244                                                            "CentralCKFActsTrackStatesUnfiltered",
0245                                                            "CentralCKFActsTracksUnfiltered",
0246                                                            "CentralTrackingRawHitAssociations",
0247                                                        },
0248                                                        {
0249                                                            "CentralCKFTrajectoriesUnfiltered",
0250                                                            "CentralCKFTrackParametersUnfiltered",
0251                                                            "CentralCKFTracksUnfiltered",
0252                                                            "CentralCKFTrackUnfilteredLinks",
0253                                                            "CentralCKFTrackUnfilteredAssociations",
0254                                                        },
0255                                                        app));
0256 
0257   // Variant of CentralCKF tracking that includes measurement time in the calibration
0258   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0259       "CentralCKFTimeTrajectories", {"CentralTrackSeeds", "CentralTrackerMeasurements"},
0260       {
0261           "CentralCKFTimeActsTrackStatesUnfiltered",
0262           "CentralCKFTimeActsTracksUnfiltered",
0263       },
0264       {
0265           .useTime = true,
0266       },
0267       app));
0268 
0269   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0270       "CentralCKFTimeTracksUnfiltered",
0271       {
0272           "CentralTrackerMeasurements",
0273           "CentralTrackSeeds",
0274           "CentralCKFTimeActsTrackStatesUnfiltered",
0275           "CentralCKFTimeActsTracksUnfiltered",
0276           "CentralTrackingRawHitAssociations",
0277       },
0278       {
0279           "CentralCKFTimeTrajectoriesUnfiltered",
0280           "CentralCKFTimeTrackParametersUnfiltered",
0281           "CentralCKFTimeTracksUnfiltered",
0282           "CentralCKFTimeTrackUnfilteredLinks",
0283           "CentralCKFTimeTrackUnfilteredAssociations",
0284       },
0285       app));
0286 
0287   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0288       "CentralCKFTimeAmbiguityResolutionSolver",
0289       {"CentralCKFTimeActsTrackStatesUnfiltered", "CentralCKFTimeActsTracksUnfiltered"},
0290       {
0291           "CentralCKFTimeActsTrackStates",
0292           "CentralCKFTimeActsTracks",
0293       },
0294       app));
0295 
0296   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTimeTracks",
0297                                                             {
0298                                                                 "CentralTrackerMeasurements",
0299                                                                 "CentralTrackSeeds",
0300                                                                 "CentralCKFTimeActsTrackStates",
0301                                                                 "CentralCKFTimeActsTracks",
0302                                                                 "CentralTrackingRawHitAssociations",
0303                                                             },
0304                                                             {
0305                                                                 "CentralCKFTimeTrajectories",
0306                                                                 "CentralCKFTimeTrackParameters",
0307                                                                 "CentralCKFTimeTracks",
0308                                                                 "CentralCKFTimeTrackLinks",
0309                                                                 "CentralCKFTimeTrackAssociations",
0310                                                             },
0311                                                             app));
0312 
0313   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0314       "AmbiguityResolutionSolver",
0315       {"CentralCKFActsTrackStatesUnfiltered", "CentralCKFActsTracksUnfiltered"},
0316       {
0317           "CentralCKFActsTrackStates",
0318           "CentralCKFActsTracks",
0319       },
0320       app));
0321 
0322   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTracks",
0323                                                             {
0324                                                                 "CentralTrackerMeasurements",
0325                                                                 "CentralTrackSeeds",
0326                                                                 "CentralCKFActsTrackStates",
0327                                                                 "CentralCKFActsTracks",
0328                                                                 "CentralTrackingRawHitAssociations",
0329                                                             },
0330                                                             {
0331                                                                 "CentralCKFTrajectories",
0332                                                                 "CentralCKFTrackParameters",
0333                                                                 "CentralCKFTracks",
0334                                                                 "CentralCKFTrackLinks",
0335                                                                 "CentralCKFTrackAssociations",
0336                                                             },
0337                                                             app));
0338 
0339   app->Add(new JOmniFactoryGeneratorT<TrackProjector_factory>("CentralTrackSegments",
0340                                                               {
0341                                                                   "CentralCKFActsTrackStates",
0342                                                                   "CentralCKFActsTracks",
0343                                                                   "CentralCKFTracks",
0344                                                               },
0345                                                               {
0346                                                                   "CentralTrackSegments",
0347                                                               },
0348                                                               app));
0349 
0350   app->Add(
0351       new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>("CentralTrackVertices",
0352                                                                 {
0353                                                                     "CentralCKFActsTrackStates",
0354                                                                     "CentralCKFActsTracks",
0355                                                                     "ReconstructedChargedParticles",
0356                                                                 },
0357                                                                 {
0358                                                                     "CentralTrackVertices",
0359                                                                 },
0360                                                                 {}, app));
0361 
0362   app->Add(new JOmniFactoryGeneratorT<TrackPropagation_factory>(
0363       "CalorimeterTrackPropagator",
0364       {"CentralCKFTracks", "CentralCKFActsTrackStates", "CentralCKFActsTracks"},
0365       {"CalorimeterTrackProjections"},
0366       {.target_surfaces{
0367           // DIRC
0368           eicrecon::CylinderSurfaceConfig{.id   = "BarrelDIRC_ID",
0369                                           .rmin = "DIRC_rmin",
0370                                           .zmin = "DIRC_offset - DIRC_length / 2.0",
0371                                           .zmax = "DIRC_offset + DIRC_length / 2.0"},
0372           // Ecal
0373           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapN_ID",
0374                                       .zmin = "- EcalEndcapN_zmin",
0375                                       .rmin = 0.,
0376                                       .rmax = "1.1*EcalEndcapN_rmax"},
0377           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapN_ID",
0378                                       .zmin = "- EcalEndcapN_zmin - 50*mm",
0379                                       .rmin = 0.,
0380                                       .rmax = "1.1*EcalEndcapN_rmax"},
0381           eicrecon::CylinderSurfaceConfig{
0382               .id   = "EcalBarrel_ID",
0383               .rmin = "EcalBarrel_rmin",
0384               .zmin = "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0385               .zmax = "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"},
0386           eicrecon::CylinderSurfaceConfig{
0387               .id   = "EcalBarrel_ID",
0388               .rmin = "EcalBarrel_rmin + 50*mm",
0389               .zmin = "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0390               .zmax = "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"},
0391           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapP_ID",
0392                                       .zmin = "EcalEndcapP_zmin",
0393                                       .rmin = 0.,
0394                                       .rmax = "1.1*EcalEndcapP_rmax"},
0395           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapP_ID",
0396                                       .zmin = "EcalEndcapP_zmin + 50*mm",
0397                                       .rmin = 0.,
0398                                       .rmax = "1.1*EcalEndcapP_rmax"},
0399           // Hcal
0400           eicrecon::DiscSurfaceConfig{.id   = "HcalEndcapN_ID",
0401                                       .zmin = "- HcalEndcapN_zmin",
0402                                       .rmin = 0.,
0403                                       .rmax = "1.1*HcalEndcapN_rmax"},
0404           eicrecon::DiscSurfaceConfig{.id   = "HcalEndcapN_ID",
0405                                       .zmin = "- HcalEndcapN_zmin - 150*mm",
0406                                       .rmin = 0.,
0407                                       .rmax = "1.1*HcalEndcapN_rmax"},
0408           eicrecon::CylinderSurfaceConfig{
0409               .id   = "HcalBarrel_ID",
0410               .rmin = "HcalBarrel_rmin",
0411               .zmin = "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0412               .zmax = "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"},
0413           eicrecon::CylinderSurfaceConfig{
0414               .id   = "HcalBarrel_ID",
0415               .rmin = "HcalBarrel_rmin + 150*mm",
0416               .zmin = "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0417               .zmax = "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"},
0418           eicrecon::DiscSurfaceConfig{
0419               .id = "LFHCAL_ID", .zmin = "LFHCAL_zmin", .rmin = 0., .rmax = "1.1*LFHCAL_rmax"},
0420           eicrecon::DiscSurfaceConfig{.id   = "LFHCAL_ID",
0421                                       .zmin = "LFHCAL_zmin + 150*mm",
0422                                       .rmin = 0.,
0423                                       .rmax = "1.1*LFHCAL_rmax"},
0424       }},
0425       app));
0426 
0427   // B0 TRACKER
0428 
0429   app->Add(new JOmniFactoryGeneratorT<TrackerMeasurementFromHits_factory>(
0430       "B0TrackerMeasurements", {"B0TrackerRecHits"}, {"B0TrackerMeasurements"}, app));
0431 
0432   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0433       "B0TrackerCKFTruthSeededTrajectories", {"B0TrackerTruthSeeds", "B0TrackerMeasurements"},
0434       {
0435           "B0TrackerCKFTruthSeededActsTrackStatesUnfiltered",
0436           "B0TrackerCKFTruthSeededActsTracksUnfiltered",
0437       },
0438       {
0439           .numMeasurementsMin = 3,
0440       },
0441       app));
0442 
0443   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0444       "B0TrackerCKFTruthSeededTracksUnfiltered",
0445       {
0446           "B0TrackerMeasurements",
0447           "B0TrackerTruthSeeds",
0448           "B0TrackerCKFTruthSeededActsTrackStatesUnfiltered",
0449           "B0TrackerCKFTruthSeededActsTracksUnfiltered",
0450           "B0TrackerRawHitAssociations",
0451       },
0452       {
0453           "B0TrackerCKFTruthSeededTrajectoriesUnfiltered",
0454           "B0TrackerCKFTruthSeededTrackParametersUnfiltered",
0455           "B0TrackerCKFTruthSeededTracksUnfiltered",
0456           "B0TrackerCKFTruthSeededTrackUnfilteredLinks",
0457           "B0TrackerCKFTruthSeededTrackUnfilteredAssociations",
0458       },
0459       app));
0460 
0461   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0462       "B0TrackerTruthSeededAmbiguityResolutionSolver",
0463       {"B0TrackerCKFTruthSeededActsTrackStatesUnfiltered",
0464        "B0TrackerCKFTruthSeededActsTracksUnfiltered"},
0465       {
0466           "B0TrackerCKFTruthSeededActsTrackStates",
0467           "B0TrackerCKFTruthSeededActsTracks",
0468       },
0469       {
0470           .n_measurements_min = 3,
0471       },
0472       app));
0473 
0474   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0475       "B0TrackerCKFTruthSeededTracks",
0476       {
0477           "B0TrackerMeasurements",
0478           "B0TrackerTruthSeeds",
0479           "B0TrackerCKFTruthSeededActsTrackStates",
0480           "B0TrackerCKFTruthSeededActsTracks",
0481           "B0TrackerRawHitAssociations",
0482       },
0483       {
0484           "B0TrackerCKFTruthSeededTrajectories",
0485           "B0TrackerCKFTruthSeededTrackParameters",
0486           "B0TrackerCKFTruthSeededTracks",
0487           "B0TrackerCKFTruthSeededTrackLinks",
0488           "B0TrackerCKFTruthSeededTrackAssociations",
0489       },
0490       app));
0491 
0492   app->Add(new JOmniFactoryGeneratorT<TrackSeeding_factory>(
0493       "B0TrackerSeeds", {"B0TrackerRecHits"}, {"B0TrackerSeeds", "B0TrackerSeedParameters"}, {},
0494       app));
0495 
0496   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0497       "B0TrackerCKFTrajectories", {"B0TrackerSeeds", "B0TrackerMeasurements"},
0498       {
0499           "B0TrackerCKFActsTrackStatesUnfiltered",
0500           "B0TrackerCKFActsTracksUnfiltered",
0501       },
0502       app));
0503 
0504   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0505       "B0TrackerCKFTracksUnfiltered",
0506       {
0507           "B0TrackerMeasurements",
0508           "B0TrackerSeeds",
0509           "B0TrackerCKFActsTrackStatesUnfiltered",
0510           "B0TrackerCKFActsTracksUnfiltered",
0511           "B0TrackerRawHitAssociations",
0512       },
0513       {
0514           "B0TrackerCKFTrajectoriesUnfiltered",
0515           "B0TrackerCKFTrackParametersUnfiltered",
0516           "B0TrackerCKFTracksUnfiltered",
0517           "B0TrackerCKFTrackUnfilteredLinks",
0518           "B0TrackerCKFTrackUnfilteredAssociations",
0519       },
0520       app));
0521 
0522   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0523       "B0TrackerAmbiguityResolutionSolver",
0524       {"B0TrackerCKFActsTrackStatesUnfiltered", "B0TrackerCKFActsTracksUnfiltered"},
0525       {
0526           "B0TrackerCKFActsTrackStates",
0527           "B0TrackerCKFActsTracks",
0528       },
0529       app));
0530 
0531   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>("B0TrackerCKFTracks",
0532                                                             {
0533                                                                 "B0TrackerMeasurements",
0534                                                                 "B0TrackerSeeds",
0535                                                                 "B0TrackerCKFActsTrackStates",
0536                                                                 "B0TrackerCKFActsTracks",
0537                                                                 "B0TrackerRawHitAssociations",
0538                                                             },
0539                                                             {
0540                                                                 "B0TrackerCKFTrajectories",
0541                                                                 "B0TrackerCKFTrackParameters",
0542                                                                 "B0TrackerCKFTracks",
0543                                                                 "B0TrackerCKFTrackLinks",
0544                                                                 "B0TrackerCKFTrackAssociations",
0545                                                             },
0546                                                             app));
0547 
0548   // COMBINED TRACKING
0549 
0550   // Use both central and B0 tracks for vertexing
0551   app->Add(new JOmniFactoryGeneratorT<ActsTrackMerger_factory>(
0552       "CentralAndB0TrackerCKFActsTracks",
0553       {
0554           "CentralCKFActsTrackStates",
0555           "CentralCKFActsTracks",
0556           "B0TrackerCKFActsTrackStates",
0557           "B0TrackerCKFActsTracks",
0558       },
0559       {
0560           "CentralAndB0TrackerCKFActsTrackStates",
0561           "CentralAndB0TrackerCKFActsTracks",
0562       },
0563       app));
0564 
0565   app->Add(new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>(
0566       "CentralAndB0TrackVertices",
0567       {
0568           "CentralAndB0TrackerCKFActsTrackStates",
0569           "CentralAndB0TrackerCKFActsTracks",
0570           "ReconstructedChargedParticles",
0571       },
0572       {
0573           "CentralAndB0TrackVertices",
0574       },
0575       {}, app));
0576 
0577   // Add central and B0 tracks
0578   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Track, true>>(
0579       "CombinedTracks", {"CentralCKFTracks", "B0TrackerCKFTracks"}, {"CombinedTracks"}, app));
0580 
0581   app->Add(new JOmniFactoryGeneratorT<SecondaryVertexFinder_factory>(
0582       "PrimaryVerticesAMVF",
0583       {"ReconstructedParticles", "CentralCKFActsTrackStates", "CentralCKFActsTracks"},
0584       {
0585           "PrimaryVerticesAMVF",
0586       },
0587       {
0588           .isPrimary = true,
0589       },
0590       app));
0591 
0592   app->Add(new JOmniFactoryGeneratorT<SecondaryVertexFinder_factory>(
0593       "SecondaryVerticesAMVF",
0594       {"ReconstructedParticles", "CentralCKFActsTrackStates", "CentralCKFActsTracks"},
0595       {
0596           "SecondaryVerticesAMVF",
0597       },
0598       {
0599           .isPrimary          = false,
0600           .maxIterations      = 1000,
0601           .tracksMaxZinterval = 10. * Acts::UnitConstants::mm,
0602           .useSeedConstraint  = true,
0603       },
0604       app));
0605 
0606   app->Add(new JOmniFactoryGeneratorT<
0607            CollectionCollector_factory<edm4eic::MCRecoTrackParticleAssociation, true>>(
0608       "CombinedTrackAssociations", {"CentralCKFTrackAssociations", "B0TrackerCKFTrackAssociations"},
0609       {"CombinedTrackAssociations"}, app));
0610 
0611   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Track, true>>(
0612       "CombinedTruthSeededTracks", {"CentralCKFTruthSeededTracks", "B0TrackerCKFTruthSeededTracks"},
0613       {"CombinedTruthSeededTracks"}, app));
0614 
0615   app->Add(new JOmniFactoryGeneratorT<
0616            CollectionCollector_factory<edm4eic::MCRecoTrackParticleAssociation, true>>(
0617       "CombinedTruthSeededTrackAssociations",
0618       {"CentralCKFTruthSeededTrackAssociations", "B0TrackerCKFTruthSeededTrackAssociations"},
0619       {"CombinedTruthSeededTrackAssociations"}, app));
0620 
0621   app->Add(new JOmniFactoryGeneratorT<
0622            CollectionCollector_factory<edm4eic::MCRecoTrackParticleLink, true>>(
0623       "CombinedTruthSeededTrackLinks",
0624       {"CentralCKFTruthSeededTrackLinks", "B0TrackerCKFTruthSeededTrackLinks"},
0625       {"CombinedTruthSeededTrackLinks"}, app));
0626 
0627   app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0628       "ChargedTruthSeededParticlesWithAssociations",
0629       {
0630           "CombinedTruthSeededTracks",
0631           "CombinedTruthSeededTrackAssociations",
0632       },
0633       {"ReconstructedTruthSeededChargedWithoutPIDParticles",
0634        "ReconstructedTruthSeededChargedWithoutPIDParticleLinks",
0635        "ReconstructedTruthSeededChargedWithoutPIDParticleAssociations"},
0636       {}, app));
0637 
0638   app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0639       "ChargedParticlesWithAssociations",
0640       {
0641           "CombinedTracks",
0642           "CombinedTrackAssociations",
0643       },
0644       {"ReconstructedChargedWithoutPIDParticles", "ReconstructedChargedWithoutPIDParticleLinks",
0645        "ReconstructedChargedWithoutPIDParticleAssociations"},
0646       {}, app));
0647 }
0648 } // extern "C"