Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-11-01 07:57:35

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/MCRecoTrackParticleAssociationCollection.h>
0009 #include <edm4eic/MCRecoTrackerHitAssociationCollection.h>
0010 #include <edm4eic/TrackCollection.h>
0011 #include <edm4eic/TrackParameters.h>
0012 #include <edm4eic/TrackerHitCollection.h>
0013 #include <fmt/core.h>
0014 #include <cmath>
0015 #include <functional>
0016 #include <map>
0017 #include <memory>
0018 #include <string>
0019 #include <utility>
0020 #include <variant>
0021 #include <vector>
0022 
0023 #include "algorithms/meta/SubDivideFunctors.h"
0024 #include "algorithms/tracking/TrackPropagationConfig.h"
0025 #include "extensions/jana/JOmniFactoryGeneratorT.h"
0026 #include "factories/meta/CollectionCollector_factory.h"
0027 #include "factories/meta/SubDivideCollection_factory.h"
0028 #include "factories/tracking/ActsToTracks_factory.h"
0029 #include "factories/tracking/ActsTrajectoriesMerger_factory.h"
0030 #include "factories/tracking/AmbiguitySolver_factory.h"
0031 #include "factories/tracking/CKFTracking_factory.h"
0032 #include "factories/tracking/IterativeVertexFinder_factory.h"
0033 #include "factories/tracking/TrackParamTruthInit_factory.h"
0034 #include "factories/tracking/TrackProjector_factory.h"
0035 #include "factories/tracking/TrackPropagation_factory.h"
0036 #include "factories/tracking/TrackSeeding_factory.h"
0037 #include "factories/tracking/TrackerMeasurementFromHits_factory.h"
0038 #include "factories/tracking/TracksToParticles_factory.h"
0039 
0040 //
0041 extern "C" {
0042 void InitPlugin(JApplication* app) {
0043   InitJANAPlugin(app);
0044 
0045   using namespace eicrecon;
0046 
0047   app->Add(new JOmniFactoryGeneratorT<TrackParamTruthInit_factory>(
0048       "TrackTruthSeeds", {"EventHeader", "MCParticles"}, {"TrackTruthSeeds"}, {}, app));
0049 
0050   std::vector<std::pair<double, double>> thetaRanges{{0, 50 * dd4hep::mrad},
0051                                                      {50 * dd4hep::mrad, 180 * dd4hep::deg}};
0052   app->Add(new JOmniFactoryGeneratorT<SubDivideCollection_factory<edm4eic::TrackParameters>>(
0053       "CentralB0TrackTruthSeeds", {"TrackTruthSeeds"},
0054       {"B0TrackerTruthSeeds", "CentralTrackerTruthSeeds"},
0055       {
0056           .function = RangeSplit<&edm4eic::TrackParameters::getTheta>(thetaRanges),
0057       },
0058       app));
0059 
0060   // CENTRAL TRACKER
0061 
0062   // Tracker hits collector
0063   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::TrackerHit, true>>(
0064       "CentralTrackingRecHits",
0065       {"SiBarrelTrackerRecHits", "SiBarrelVertexRecHits", "SiEndcapTrackerRecHits",
0066        "TOFBarrelRecHits", "TOFEndcapRecHits", "MPGDBarrelRecHits", "OuterMPGDBarrelRecHits",
0067        "BackwardMPGDEndcapRecHits", "ForwardMPGDEndcapRecHits"},
0068       {"CentralTrackingRecHits"}, // Output collection name
0069       app));
0070 
0071   // Tracker hit associations collector
0072   app->Add(new JOmniFactoryGeneratorT<
0073            CollectionCollector_factory<edm4eic::MCRecoTrackerHitAssociation, true>>(
0074       "CentralTrackingRawHitAssociations",
0075       {"SiBarrelRawHitAssociations", "SiBarrelVertexRawHitAssociations",
0076        "SiEndcapTrackerRawHitAssociations", "TOFBarrelRawHitAssociations",
0077        "TOFEndcapRawHitAssociations", "MPGDBarrelRawHitAssociations",
0078        "OuterMPGDBarrelRawHitAssociations", "BackwardMPGDEndcapRawHitAssociations",
0079        "ForwardMPGDEndcapRawHitAssociations"},
0080       {"CentralTrackingRawHitAssociations"}, // Output collection name
0081       app));
0082 
0083   app->Add(new JOmniFactoryGeneratorT<TrackerMeasurementFromHits_factory>(
0084       "CentralTrackerMeasurements", {"CentralTrackingRecHits"}, {"CentralTrackerMeasurements"},
0085       app));
0086 
0087   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0088       "CentralCKFTruthSeededTrajectories",
0089       {"CentralTrackerTruthSeeds", "CentralTrackerMeasurements"},
0090       {
0091           "CentralCKFTruthSeededActsTrajectoriesUnfiltered",
0092           "CentralCKFTruthSeededActsTracksUnfiltered",
0093       },
0094       app));
0095 
0096   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0097       "CentralCKFTruthSeededTracksUnfiltered",
0098       {
0099           "CentralTrackerMeasurements",
0100           "CentralCKFTruthSeededActsTrajectoriesUnfiltered",
0101           "CentralTrackingRawHitAssociations",
0102       },
0103       {
0104           "CentralCKFTruthSeededTrajectoriesUnfiltered",
0105           "CentralCKFTruthSeededTrackParametersUnfiltered",
0106           "CentralCKFTruthSeededTracksUnfiltered",
0107           "CentralCKFTruthSeededTrackUnfilteredAssociations",
0108       },
0109       app));
0110 
0111   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0112       "TruthSeededAmbiguityResolutionSolver",
0113       {"CentralCKFTruthSeededActsTracksUnfiltered", "CentralTrackerMeasurements"},
0114       {
0115           "CentralCKFTruthSeededActsTracks",
0116           "CentralCKFTruthSeededActsTrajectories",
0117       },
0118       app));
0119 
0120   app->Add(
0121       new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTruthSeededTracks",
0122                                                        {
0123                                                            "CentralTrackerMeasurements",
0124                                                            "CentralCKFTruthSeededActsTrajectories",
0125                                                            "CentralTrackingRawHitAssociations",
0126                                                        },
0127                                                        {
0128                                                            "CentralCKFTruthSeededTrajectories",
0129                                                            "CentralCKFTruthSeededTrackParameters",
0130                                                            "CentralCKFTruthSeededTracks",
0131                                                            "CentralCKFTruthSeededTrackAssociations",
0132                                                        },
0133                                                        app));
0134 
0135   app->Add(new JOmniFactoryGeneratorT<TrackSeeding_factory>(
0136       "CentralTrackSeedingResults", {"CentralTrackingRecHits"}, {"CentralTrackSeedingResults"}, {},
0137       app));
0138 
0139   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0140       "CentralCKFTrajectories", {"CentralTrackSeedingResults", "CentralTrackerMeasurements"},
0141       {
0142           "CentralCKFActsTrajectoriesUnfiltered",
0143           "CentralCKFActsTracksUnfiltered",
0144       },
0145       app));
0146 
0147   app->Add(
0148       new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTracksUnfiltered",
0149                                                        {
0150                                                            "CentralTrackerMeasurements",
0151                                                            "CentralCKFActsTrajectoriesUnfiltered",
0152                                                            "CentralTrackingRawHitAssociations",
0153                                                        },
0154                                                        {
0155                                                            "CentralCKFTrajectoriesUnfiltered",
0156                                                            "CentralCKFTrackParametersUnfiltered",
0157                                                            "CentralCKFTracksUnfiltered",
0158                                                            "CentralCKFTrackUnfilteredAssociations",
0159                                                        },
0160                                                        app));
0161 
0162   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0163       "AmbiguityResolutionSolver", {"CentralCKFActsTracksUnfiltered", "CentralTrackerMeasurements"},
0164       {
0165           "CentralCKFActsTracks",
0166           "CentralCKFActsTrajectories",
0167       },
0168       app));
0169 
0170   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>("CentralCKFTracks",
0171                                                             {
0172                                                                 "CentralTrackerMeasurements",
0173                                                                 "CentralCKFActsTrajectories",
0174                                                                 "CentralTrackingRawHitAssociations",
0175                                                             },
0176                                                             {
0177                                                                 "CentralCKFTrajectories",
0178                                                                 "CentralCKFTrackParameters",
0179                                                                 "CentralCKFTracks",
0180                                                                 "CentralCKFTrackAssociations",
0181                                                             },
0182                                                             app));
0183 
0184   app->Add(new JOmniFactoryGeneratorT<TrackProjector_factory>("CentralTrackSegments",
0185                                                               {
0186                                                                   "CentralCKFActsTrajectories",
0187                                                                   "CentralCKFTracks",
0188                                                               },
0189                                                               {
0190                                                                   "CentralTrackSegments",
0191                                                               },
0192                                                               app));
0193 
0194   app->Add(
0195       new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>("CentralTrackVertices",
0196                                                                 {
0197                                                                     "CentralCKFActsTrajectories",
0198                                                                     "ReconstructedChargedParticles",
0199                                                                 },
0200                                                                 {
0201                                                                     "CentralTrackVertices",
0202                                                                 },
0203                                                                 {}, app));
0204 
0205   app->Add(new JOmniFactoryGeneratorT<TrackPropagation_factory>(
0206       "CalorimeterTrackPropagator",
0207       {"CentralCKFTracks", "CentralCKFActsTrajectories", "CentralCKFActsTracks"},
0208       {"CalorimeterTrackProjections"},
0209       {.target_surfaces{
0210           // Ecal
0211           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapN_ID",
0212                                       .zmin = "- EcalEndcapN_zmin",
0213                                       .rmin = 0.,
0214                                       .rmax = "1.1*EcalEndcapN_rmax"},
0215           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapN_ID",
0216                                       .zmin = "- EcalEndcapN_zmin - 50*mm",
0217                                       .rmin = 0.,
0218                                       .rmax = "1.1*EcalEndcapN_rmax"},
0219           eicrecon::CylinderSurfaceConfig{
0220               .id   = "EcalBarrel_ID",
0221               .rmin = "EcalBarrel_rmin",
0222               .zmin = "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0223               .zmax = "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"},
0224           eicrecon::CylinderSurfaceConfig{
0225               .id   = "EcalBarrel_ID",
0226               .rmin = "EcalBarrel_rmin + 50*mm",
0227               .zmin = "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0228               .zmax = "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"},
0229           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapP_ID",
0230                                       .zmin = "EcalEndcapP_zmin",
0231                                       .rmin = 0.,
0232                                       .rmax = "1.1*EcalEndcapP_rmax"},
0233           eicrecon::DiscSurfaceConfig{.id   = "EcalEndcapP_ID",
0234                                       .zmin = "EcalEndcapP_zmin + 50*mm",
0235                                       .rmin = 0.,
0236                                       .rmax = "1.1*EcalEndcapP_rmax"},
0237           // Hcal
0238           eicrecon::DiscSurfaceConfig{.id   = "HcalEndcapN_ID",
0239                                       .zmin = "- HcalEndcapN_zmin",
0240                                       .rmin = 0.,
0241                                       .rmax = "1.1*HcalEndcapN_rmax"},
0242           eicrecon::DiscSurfaceConfig{.id   = "HcalEndcapN_ID",
0243                                       .zmin = "- HcalEndcapN_zmin - 150*mm",
0244                                       .rmin = 0.,
0245                                       .rmax = "1.1*HcalEndcapN_rmax"},
0246           eicrecon::CylinderSurfaceConfig{
0247               .id   = "HcalBarrel_ID",
0248               .rmin = "HcalBarrel_rmin",
0249               .zmin = "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0250               .zmax = "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"},
0251           eicrecon::CylinderSurfaceConfig{
0252               .id   = "HcalBarrel_ID",
0253               .rmin = "HcalBarrel_rmin + 150*mm",
0254               .zmin = "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0255               .zmax = "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"},
0256           eicrecon::DiscSurfaceConfig{
0257               .id = "LFHCAL_ID", .zmin = "LFHCAL_zmin", .rmin = 0., .rmax = "1.1*LFHCAL_rmax"},
0258           eicrecon::DiscSurfaceConfig{.id   = "LFHCAL_ID",
0259                                       .zmin = "LFHCAL_zmin + 150*mm",
0260                                       .rmin = 0.,
0261                                       .rmax = "1.1*LFHCAL_rmax"},
0262       }},
0263       app));
0264 
0265   // B0 TRACKER
0266 
0267   app->Add(new JOmniFactoryGeneratorT<TrackerMeasurementFromHits_factory>(
0268       "B0TrackerMeasurements", {"B0TrackerRecHits"}, {"B0TrackerMeasurements"}, app));
0269 
0270   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0271       "B0TrackerCKFTruthSeededTrajectories", {"B0TrackerTruthSeeds", "B0TrackerMeasurements"},
0272       {
0273           "B0TrackerCKFTruthSeededActsTrajectoriesUnfiltered",
0274           "B0TrackerCKFTruthSeededActsTracksUnfiltered",
0275       },
0276       app));
0277 
0278   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0279       "B0TrackerCKFTruthSeededTracksUnfiltered",
0280       {
0281           "B0TrackerMeasurements",
0282           "B0TrackerCKFTruthSeededActsTrajectoriesUnfiltered",
0283           "B0TrackerRawHitAssociations",
0284       },
0285       {
0286           "B0TrackerCKFTruthSeededTrajectoriesUnfiltered",
0287           "B0TrackerCKFTruthSeededTrackParametersUnfiltered",
0288           "B0TrackerCKFTruthSeededTracksUnfiltered",
0289           "B0TrackerCKFTruthSeededTrackUnfilteredAssociations",
0290       },
0291       app));
0292 
0293   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0294       "B0TrackerTruthSeededAmbiguityResolutionSolver",
0295       {"B0TrackerCKFTruthSeededActsTracksUnfiltered", "B0TrackerMeasurements"},
0296       {
0297           "B0TrackerCKFTruthSeededActsTracks",
0298           "B0TrackerCKFTruthSeededActsTrajectories",
0299       },
0300       app));
0301 
0302   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0303       "B0TrackerCKFTruthSeededTracks",
0304       {
0305           "B0TrackerMeasurements",
0306           "B0TrackerCKFTruthSeededActsTrajectories",
0307           "B0TrackerRawHitAssociations",
0308       },
0309       {
0310           "B0TrackerCKFTruthSeededTrajectories",
0311           "B0TrackerCKFTruthSeededTrackParameters",
0312           "B0TrackerCKFTruthSeededTracks",
0313           "B0TrackerCKFTruthSeededTrackAssociations",
0314       },
0315       app));
0316 
0317   app->Add(new JOmniFactoryGeneratorT<TrackSeeding_factory>(
0318       "B0TrackerTrackSeedingResults", {"B0TrackerRecHits"}, {"B0TrackerSeedingResults"}, {}, app));
0319 
0320   app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0321       "B0TrackerCKFTrajectories", {"B0TrackerSeedingResults", "B0TrackerMeasurements"},
0322       {
0323           "B0TrackerCKFActsTrajectoriesUnfiltered",
0324           "B0TrackerCKFActsTracksUnfiltered",
0325       },
0326       app));
0327 
0328   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0329       "B0TrackerCKFTracksUnfiltered",
0330       {
0331           "B0TrackerMeasurements",
0332           "B0TrackerCKFActsTrajectoriesUnfiltered",
0333           "B0TrackerRawHitAssociations",
0334       },
0335       {
0336           "B0TrackerCKFTrajectoriesUnfiltered",
0337           "B0TrackerCKFTrackParametersUnfiltered",
0338           "B0TrackerCKFTracksUnfiltered",
0339           "B0TrackerCKFTrackUnfilteredAssociations",
0340       },
0341       app));
0342 
0343   app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0344       "B0TrackerAmbiguityResolutionSolver",
0345       {"B0TrackerCKFActsTracksUnfiltered", "B0TrackerMeasurements"},
0346       {
0347           "B0TrackerCKFActsTracks",
0348           "B0TrackerCKFActsTrajectories",
0349       },
0350       app));
0351 
0352   app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>("B0TrackerCKFTracks",
0353                                                             {
0354                                                                 "B0TrackerMeasurements",
0355                                                                 "B0TrackerCKFActsTrajectories",
0356                                                                 "B0TrackerRawHitAssociations",
0357                                                             },
0358                                                             {
0359                                                                 "B0TrackerCKFTrajectories",
0360                                                                 "B0TrackerCKFTrackParameters",
0361                                                                 "B0TrackerCKFTracks",
0362                                                                 "B0TrackerCKFTrackAssociations",
0363                                                             },
0364                                                             app));
0365 
0366   // COMBINED TRACKING
0367 
0368   // Use both central and B0 tracks for vertexing
0369   app->Add(new JOmniFactoryGeneratorT<ActsTrajectoriesMerger_factory>(
0370       "CentralB0CKFActsTrajectories",
0371       {
0372           "CentralCKFActsTrajectories",
0373           "B0TrackerCKFActsTrajectories",
0374       },
0375       {
0376           "CentralAndB0TrackerCKFActsTrajectories",
0377       },
0378       app));
0379 
0380   app->Add(new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>(
0381       "CentralAndB0TrackVertices",
0382       {
0383           "CentralAndB0TrackerCKFActsTrajectories",
0384           "ReconstructedChargedParticles",
0385       },
0386       {
0387           "CentralAndB0TrackVertices",
0388       },
0389       {}, app));
0390 
0391   // Add central and B0 tracks
0392   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Track, true>>(
0393       "CombinedTracks", {"CentralCKFTracks", "B0TrackerCKFTracks"}, {"CombinedTracks"}, app));
0394 
0395   app->Add(new JOmniFactoryGeneratorT<
0396            CollectionCollector_factory<edm4eic::MCRecoTrackParticleAssociation, true>>(
0397       "CombinedTrackAssociations", {"CentralCKFTrackAssociations", "B0TrackerCKFTrackAssociations"},
0398       {"CombinedTrackAssociations"}, app));
0399 
0400   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Track, true>>(
0401       "CombinedTruthSeededTracks", {"CentralCKFTruthSeededTracks", "B0TrackerCKFTruthSeededTracks"},
0402       {"CombinedTruthSeededTracks"}, app));
0403 
0404   app->Add(new JOmniFactoryGeneratorT<
0405            CollectionCollector_factory<edm4eic::MCRecoTrackParticleAssociation, true>>(
0406       "CombinedTruthSeededTrackAssociations",
0407       {"CentralCKFTruthSeededTrackAssociations", "B0TrackerCKFTruthSeededTrackAssociations"},
0408       {"CombinedTruthSeededTrackAssociations"}, app));
0409 
0410   app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0411       "ChargedTruthSeededParticlesWithAssociations",
0412       {
0413           "CombinedTruthSeededTracks",
0414           "CombinedTruthSeededTrackAssociations",
0415       },
0416       {"ReconstructedTruthSeededChargedWithoutPIDParticles",
0417        "ReconstructedTruthSeededChargedWithoutPIDParticleAssociations"},
0418       {}, app));
0419 
0420   app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0421       "ChargedParticlesWithAssociations",
0422       {
0423           "CombinedTracks",
0424           "CombinedTrackAssociations",
0425       },
0426       {"ReconstructedChargedWithoutPIDParticles",
0427        "ReconstructedChargedWithoutPIDParticleAssociations"},
0428       {}, app));
0429 }
0430 } // extern "C"