Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-09-27 07:03:06

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 - 2024, Dmitry Romanov, Tyler Kutz, Wouter Deconinck, Dmitry Kalinkin
0003 
0004 #include <DD4hep/Detector.h>
0005 #include <JANA/JApplication.h>
0006 #include <edm4eic/MCRecoTrackerHitAssociationCollection.h>
0007 #include <edm4eic/TrackCollection.h>
0008 #include <edm4eic/TrackerHitCollection.h>
0009 #include <algorithm>
0010 #include <gsl/pointers>
0011 #include <map>
0012 #include <memory>
0013 #include <string>
0014 #include <tuple>
0015 #include <vector>
0016 
0017 #include "ActsToTracks.h"
0018 #include "ActsToTracks_factory.h"
0019 #include "AmbiguitySolver_factory.h"
0020 #include "CKFTracking_factory.h"
0021 #include "IterativeVertexFinder_factory.h"
0022 #include "TrackParamTruthInit_factory.h"
0023 #include "TrackProjector_factory.h"
0024 #include "TrackPropagationConfig.h"
0025 #include "TrackPropagation_factory.h"
0026 #include "TrackSeeding_factory.h"
0027 #include "TrackerMeasurementFromHits_factory.h"
0028 #include "TracksToParticles_factory.h"
0029 #include "extensions/jana/JOmniFactoryGeneratorT.h"
0030 #include "factories/meta/CollectionCollector_factory.h"
0031 #include "services/geometry/dd4hep/DD4hep_service.h"
0032 
0033 //
0034 extern "C" {
0035 void InitPlugin(JApplication *app) {
0036     InitJANAPlugin(app);
0037 
0038     using namespace eicrecon;
0039 
0040     app->Add(new JOmniFactoryGeneratorT<TrackParamTruthInit_factory>(
0041             "InitTrackParams",
0042             {"MCParticles"},
0043             {"InitTrackParams"},
0044             {},
0045             app
0046             ));
0047 
0048     // Possible collections from arches, brycecanyon and craterlake configurations
0049     std::vector<std::tuple<std::string, std::string, std::string, std::string>> possible_collections = {
0050         {"SiBarrelHits", "SiBarrelRawHits", "SiBarrelRawHitAssociations", "SiBarrelTrackerRecHits"},
0051         {"VertexBarrelHits", "SiBarrelVertexRawHits", "SiBarrelVertexRawHitAssociations", "SiBarrelVertexRecHits"},
0052         {"TrackerEndcapHits", "SiEndcapTrackerRawHits", "SiEndcapTrackerRawHitAssociations", "SiEndcapTrackerRecHits"},
0053         {"TOFBarrelHits", "TOFBarrelRawHits", "TOFBarrelRawHitAssociations", "TOFBarrelRecHit"},
0054         {"TOFEndcapHits", "TOFEndcapRawHits", "TOFEndcapRawHitAssociations", "TOFEndcapRecHits"},
0055         {"MPGDBarrelHits", "MPGDBarrelRawHits", "MPGDBarrelRawHitAssociations", "MPGDBarrelRecHits"},
0056         {"OuterMPGDBarrelHits", "OuterMPGDBarrelRawHits", "OuterMPGDBarrelRawHitAssociations", "OuterMPGDBarrelRecHits"},
0057         {"BackwardMPGDEndcapHits", "BackwardMPGDEndcapRawHits", "BackwardMPGDEndcapRawHitAssociations", "BackwardMPGDEndcapRecHits"},
0058         {"ForwardMPGDEndcapHits", "ForwardMPGDEndcapRawHits", "ForwardMPGDEndcapRawHitAssociations", "ForwardMPGDEndcapRecHits"},
0059         {"B0TrackerHits", "B0TrackerRawHits", "B0TrackerRawHitAssociations", "B0TrackerRecHits"}
0060     };
0061 
0062     // Filter out collections that are not present in the current configuration
0063     std::vector<std::string> input_rec_collections;
0064     std::vector<std::string> input_raw_assoc_collections;
0065     auto readouts = app->GetService<DD4hep_service>()->detector()->readouts();
0066     for (const auto& [hit_collection, raw_collection, raw_assoc_collection, rec_collection] : possible_collections) {
0067       if (readouts.find(hit_collection) != readouts.end()) {
0068         // Add the collection to the list of input collections
0069         input_rec_collections.push_back(rec_collection);
0070         input_raw_assoc_collections.push_back(raw_assoc_collection);
0071       }
0072     }
0073 
0074     // Tracker hits collector
0075     app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::TrackerHit>>(
0076         "CentralTrackingRecHits",
0077         input_rec_collections,
0078         {"CentralTrackingRecHits"}, // Output collection name
0079         app));
0080 
0081     // Tracker hit associations collector
0082     app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::MCRecoTrackerHitAssociation>>(
0083         "CentralTrackingRawHitAssociations",
0084         input_raw_assoc_collections,
0085         {"CentralTrackingRawHitAssociations"}, // Output collection name
0086         app));
0087 
0088     app->Add(new JOmniFactoryGeneratorT<TrackerMeasurementFromHits_factory>(
0089             "CentralTrackerMeasurements",
0090             {"CentralTrackingRecHits"},
0091             {"CentralTrackerMeasurements"},
0092             app
0093             ));
0094 
0095     app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0096         "CentralCKFTruthSeededTrajectories",
0097         {
0098             "InitTrackParams",
0099             "CentralTrackerMeasurements"
0100         },
0101         {
0102             "CentralCKFTruthSeededActsTrajectoriesUnfiltered",
0103             "CentralCKFTruthSeededActsTracksUnfiltered",
0104         },
0105         app
0106     ));
0107 
0108     app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0109         "CentralCKFTruthSeededTracksUnfiltered",
0110         {
0111             "CentralTrackerMeasurements",
0112             "CentralCKFTruthSeededActsTrajectoriesUnfiltered",
0113             "CentralTrackingRawHitAssociations",
0114         },
0115         {
0116             "CentralCKFTruthSeededTrajectoriesUnfiltered",
0117             "CentralCKFTruthSeededTrackParametersUnfiltered",
0118             "CentralCKFTruthSeededTracksUnfiltered",
0119             "CentralCKFTruthSeededTrackUnfilteredAssociations",
0120         },
0121         app
0122     ));
0123 
0124     app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0125         "TruthSeededAmbiguityResolutionSolver",
0126         {
0127              "CentralCKFTruthSeededActsTracksUnfiltered",
0128              "CentralTrackerMeasurements"
0129         },
0130         {
0131              "CentralCKFTruthSeededActsTracks",
0132              "CentralCKFTruthSeededActsTrajectories",
0133         },
0134         app
0135     ));
0136 
0137     app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0138         "CentralCKFTruthSeededTracks",
0139         {
0140             "CentralTrackerMeasurements",
0141             "CentralCKFTruthSeededActsTrajectories",
0142             "CentralTrackingRawHitAssociations",
0143         },
0144         {
0145             "CentralCKFTruthSeededTrajectories",
0146             "CentralCKFTruthSeededTrackParameters",
0147             "CentralCKFTruthSeededTracks",
0148             "CentralCKFTruthSeededTrackAssociations",
0149         },
0150         app
0151     ));
0152 
0153     app->Add(new JOmniFactoryGeneratorT<TrackSeeding_factory>(
0154         "CentralTrackSeedingResults",
0155         {"CentralTrackingRecHits"},
0156         {"CentralTrackSeedingResults"},
0157         {},
0158         app
0159         ));
0160 
0161     app->Add(new JOmniFactoryGeneratorT<CKFTracking_factory>(
0162         "CentralCKFTrajectories",
0163         {
0164             "CentralTrackSeedingResults",
0165             "CentralTrackerMeasurements"
0166         },
0167         {
0168             "CentralCKFActsTrajectoriesUnfiltered",
0169             "CentralCKFActsTracksUnfiltered",
0170         },
0171         app
0172     ));
0173 
0174     app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0175         "CentralCKFTracksUnfiltered",
0176         {
0177             "CentralTrackerMeasurements",
0178             "CentralCKFActsTrajectoriesUnfiltered",
0179             "CentralTrackingRawHitAssociations",
0180         },
0181         {
0182             "CentralCKFTrajectoriesUnfiltered",
0183             "CentralCKFTrackParametersUnfiltered",
0184             "CentralCKFTracksUnfiltered",
0185             "CentralCKFTrackUnfilteredAssociations",
0186         },
0187         app
0188     ));
0189 
0190     app->Add(new JOmniFactoryGeneratorT<AmbiguitySolver_factory>(
0191         "AmbiguityResolutionSolver",
0192         {
0193              "CentralCKFActsTracksUnfiltered",
0194              "CentralTrackerMeasurements"
0195         },
0196         {
0197              "CentralCKFActsTracks",
0198              "CentralCKFActsTrajectories",
0199         },
0200         app
0201     ));
0202 
0203     app->Add(new JOmniFactoryGeneratorT<ActsToTracks_factory>(
0204         "CentralCKFTracks",
0205         {
0206             "CentralTrackerMeasurements",
0207             "CentralCKFActsTrajectories",
0208             "CentralTrackingRawHitAssociations",
0209         },
0210         {
0211             "CentralCKFTrajectories",
0212             "CentralCKFTrackParameters",
0213             "CentralCKFTracks",
0214             "CentralCKFTrackAssociations",
0215         },
0216         app
0217     ));
0218 
0219     app->Add(new JOmniFactoryGeneratorT<TrackProjector_factory>(
0220             "CentralTrackSegments",
0221             {"CentralCKFActsTrajectories"},
0222             {"CentralTrackSegments"},
0223             app
0224             ));
0225 
0226     app->Add(new JOmniFactoryGeneratorT<IterativeVertexFinder_factory>(
0227             "CentralTrackVertices",
0228             {"CentralCKFActsTrajectories","ReconstructedChargedParticles"},
0229             {"CentralTrackVertices"},
0230             {},
0231             app
0232             ));
0233 
0234     app->Add(new JOmniFactoryGeneratorT<TrackPropagation_factory>(
0235             "CalorimeterTrackPropagator",
0236             {"CentralCKFTracks", "CentralCKFActsTrajectories", "CentralCKFActsTracks"},
0237             {"CalorimeterTrackProjections"},
0238             {
0239                 .target_surfaces{
0240                     // Ecal
0241                     eicrecon::DiscSurfaceConfig{"EcalEndcapN_ID", "- EcalEndcapN_zmin", 0., "1.1*EcalEndcapN_rmax"},
0242                     eicrecon::DiscSurfaceConfig{"EcalEndcapN_ID", "- EcalEndcapN_zmin - 50*mm", 0., "1.1*EcalEndcapN_rmax"},
0243                     eicrecon::CylinderSurfaceConfig{"EcalBarrel_ID", "EcalBarrel_rmin",
0244                         "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0245                         "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"
0246                     },
0247                     eicrecon::CylinderSurfaceConfig{"EcalBarrel_ID", "EcalBarrel_rmin + 50*mm",
0248                         "- 1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)",
0249                         "1.1*max(EcalBarrelBackward_zmax,EcalBarrelForward_zmax)"
0250                     },
0251                     eicrecon::DiscSurfaceConfig{"EcalEndcapP_ID", "EcalEndcapP_zmin", 0., "1.1*EcalEndcapP_rmax"},
0252                     eicrecon::DiscSurfaceConfig{"EcalEndcapP_ID", "EcalEndcapP_zmin + 50*mm", 0., "1.1*EcalEndcapP_rmax"},
0253                     // Hcal
0254                     eicrecon::DiscSurfaceConfig{"HcalEndcapN_ID", "- HcalEndcapN_zmin", 0., "1.1*HcalEndcapN_rmax"},
0255                     eicrecon::DiscSurfaceConfig{"HcalEndcapN_ID", "- HcalEndcapN_zmin - 150*mm", 0., "1.1*HcalEndcapN_rmax"},
0256                     eicrecon::CylinderSurfaceConfig{"HcalBarrel_ID", "HcalBarrel_rmin",
0257                         "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0258                         "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"
0259                     },
0260                     eicrecon::CylinderSurfaceConfig{"HcalBarrel_ID", "HcalBarrel_rmin + 150*mm",
0261                         "- 1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)",
0262                         "1.1*max(HcalBarrelBackward_zmax,HcalBarrelForward_zmax)"
0263                     },
0264                     eicrecon::DiscSurfaceConfig{"LFHCAL_ID", "LFHCAL_zmin", 0., "1.1*LFHCAL_rmax"},
0265                     eicrecon::DiscSurfaceConfig{"LFHCAL_ID", "LFHCAL_zmin + 150*mm", 0., "1.1*LFHCAL_rmax"},
0266                 }
0267             },
0268             app
0269             ));
0270 
0271 
0272 
0273     std::vector<std::string> input_track_collections;
0274     //Check size of input_rec_collections to determine if CentralCKFTracks should be added to the input_track_collections
0275     if (input_rec_collections.size() > 0) {
0276         input_track_collections.push_back("CentralCKFTracks");
0277     }
0278     //Check if the TaggerTracker readout is present in the current configuration
0279     if (readouts.find("TaggerTrackerHits") != readouts.end()) {
0280         input_track_collections.push_back("TaggerTrackerTracks");
0281     }
0282 
0283     // Add central and other tracks
0284     app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Track>>(
0285             "CombinedTracks",
0286             input_track_collections,
0287             {"CombinedTracks"},
0288             app
0289             ));
0290 
0291     app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0292             "ChargedTruthSeededParticlesWithAssociations",
0293             {
0294               "CentralCKFTruthSeededTracks",
0295               "CentralCKFTruthSeededTrackAssociations",
0296             },
0297             {"ReconstructedTruthSeededChargedWithoutPIDParticles",
0298              "ReconstructedTruthSeededChargedWithoutPIDParticleAssociations"
0299             },
0300             {},
0301             app
0302             ));
0303 
0304     app->Add(new JOmniFactoryGeneratorT<TracksToParticles_factory>(
0305             "ChargedParticlesWithAssociations",
0306             {
0307               "CombinedTracks",
0308               "CentralCKFTrackAssociations",
0309             },
0310             {
0311               "ReconstructedChargedWithoutPIDParticles",
0312               "ReconstructedChargedWithoutPIDParticleAssociations"
0313             },
0314             {},
0315             app
0316             ));
0317 }
0318 } // extern "C"