Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-31 08:20:50

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 - 2025, Dmitry Romanov, Nathan Brei, Tooba Ali, Wouter Deconinck, Dmitry Kalinkin, John Lajoie, Simon Gardner, Tristan Protzman, Daniel Brandenburg, Derek M Anderson, Sebouh Paul, Tyler Kutz, Alex Jentsch, Jihee Kim, Brian Page
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/Cluster.h>
0009 #include <edm4eic/InclusiveKinematics.h>
0010 #include <edm4eic/MCRecoClusterParticleAssociation.h>
0011 #include <edm4eic/MCRecoParticleAssociation.h>
0012 #include <edm4eic/ReconstructedParticle.h>
0013 #include <edm4hep/MCParticle.h>
0014 #include <fmt/core.h>
0015 #include <map>
0016 #include <memory>
0017 #include <string>
0018 #include <vector>
0019 
0020 #include "algorithms/reco/HadronicFinalState.h"
0021 #include "algorithms/reco/InclusiveKinematicsDA.h"
0022 #include "algorithms/reco/InclusiveKinematicsESigma.h"
0023 #include "algorithms/reco/InclusiveKinematicsElectron.h"
0024 #include "algorithms/reco/InclusiveKinematicsJB.h"
0025 #include "algorithms/reco/InclusiveKinematicsSigma.h"
0026 #include "extensions/jana/JOmniFactoryGeneratorT.h"
0027 #include "factories/meta/CollectionCollector_factory.h"
0028 #include "factories/meta/FilterMatching_factory.h"
0029 #include "factories/reco/FarForwardLambdaReconstruction_factory.h"
0030 #include "factories/reco/FarForwardNeutralsReconstruction_factory.h"
0031 #include "factories/reco/InclusiveKinematicsML_factory.h"
0032 #include "factories/reco/ChargedReconstructedParticleSelector_factory.h"
0033 #include "factories/reco/HadronicFinalState_factory.h"
0034 #include "factories/reco/InclusiveKinematicsReconstructed_factory.h"
0035 #include "factories/reco/InclusiveKinematicsTruth_factory.h"
0036 #include "factories/reco/JetReconstruction_factory.h"
0037 #include "factories/reco/MC2ReconstructedParticle_factory.h"
0038 #include "factories/reco/MatchClusters_factory.h"
0039 #include "factories/reco/PrimaryVertices_factory.h"
0040 #include "factories/reco/ReconstructedElectrons_factory.h"
0041 #include "factories/reco/ScatteredElectronsEMinusPz_factory.h"
0042 #include "factories/reco/ScatteredElectronsTruth_factory.h"
0043 #include "factories/reco/TrackClusterMatch_factory.h"
0044 #include "factories/reco/TransformBreitFrame_factory.h"
0045 #include "factories/reco/UndoAfterBurnerMCParticles_factory.h"
0046 
0047 extern "C" {
0048 void InitPlugin(JApplication* app) {
0049   InitJANAPlugin(app);
0050 
0051   using namespace eicrecon;
0052 
0053   // Finds associations matched to initial scattered electrons
0054   app->Add(
0055       new JOmniFactoryGeneratorT<FilterMatching_factory<
0056           edm4eic::MCRecoParticleAssociation, [](auto* obj) { return obj->getSim().getObjectID(); },
0057           edm4hep::MCParticle, [](auto* obj) { return obj->getObjectID(); }>>(
0058           "MCScatteredElectronAssociations",
0059           {"ReconstructedChargedParticleAssociations", "MCScatteredElectrons"},
0060           {"MCScatteredElectronAssociations", "MCNonScatteredElectronAssociations"}, app));
0061 
0062   app->Add(new JOmniFactoryGeneratorT<MC2ReconstructedParticle_factory>(
0063       "GeneratedParticles", {"MCParticles"}, {"GeneratedParticles"}, app));
0064 
0065   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Cluster, true>>(
0066       "EcalClusters", {"EcalEndcapNClusters", "EcalBarrelScFiClusters", "EcalEndcapPClusters"},
0067       {"EcalClusters"}, app));
0068 
0069   app->Add(new JOmniFactoryGeneratorT<
0070            CollectionCollector_factory<edm4eic::MCRecoClusterParticleAssociation, true>>(
0071       "EcalClusterAssociations",
0072       {"EcalEndcapNClusterAssociations", "EcalBarrelScFiClusterAssociations",
0073        "EcalEndcapPClusterAssociations"},
0074       {"EcalClusterAssociations"}, app));
0075 
0076   // Create ReconstructedParticles
0077   app->Add(new JOmniFactoryGeneratorT<MatchClusters_factory>(
0078       "ReconstructedParticlesWithAssoc",
0079       {
0080           "MCParticles",
0081           "ReconstructedChargedParticles",
0082           "ReconstructedChargedParticleAssociations",
0083           "EcalClusters",
0084           "EcalClusterAssociations",
0085       },
0086       {
0087           "ReconstructedParticles",           // edm4eic::ReconstructedParticle
0088           "ReconstructedParticleAssociations" // edm4eic::MCRecoParticleAssociation
0089       },
0090       app));
0091 
0092   app->Add(new JOmniFactoryGeneratorT<InclusiveKinematicsTruth_factory>(
0093       "InclusiveKinematicsTruth", {"MCParticles"}, {"InclusiveKinematicsTruth"}, app));
0094 
0095   app->Add(new JOmniFactoryGeneratorT<
0096            InclusiveKinematicsReconstructed_factory<InclusiveKinematicsElectron>>(
0097       "InclusiveKinematicsElectron",
0098       {"MCParticles", "ScatteredElectronsTruth", "HadronicFinalState"},
0099       {"InclusiveKinematicsElectron"}, app));
0100 
0101   app->Add(
0102       new JOmniFactoryGeneratorT<InclusiveKinematicsReconstructed_factory<InclusiveKinematicsJB>>(
0103           "InclusiveKinematicsJB", {"MCParticles", "ScatteredElectronsTruth", "HadronicFinalState"},
0104           {"InclusiveKinematicsJB"}, app));
0105 
0106   app->Add(
0107       new JOmniFactoryGeneratorT<InclusiveKinematicsReconstructed_factory<InclusiveKinematicsDA>>(
0108           "InclusiveKinematicsDA", {"MCParticles", "ScatteredElectronsTruth", "HadronicFinalState"},
0109           {"InclusiveKinematicsDA"}, app));
0110 
0111   app->Add(new JOmniFactoryGeneratorT<
0112            InclusiveKinematicsReconstructed_factory<InclusiveKinematicsESigma>>(
0113       "InclusiveKinematicsESigma", {"MCParticles", "ScatteredElectronsTruth", "HadronicFinalState"},
0114       {"InclusiveKinematicsESigma"}, app));
0115 
0116   // InclusiveKinematicseSigma is deprecated and will be removed, use InclusiveKinematicsESigma instead
0117   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::InclusiveKinematics>>(
0118       "InclusiveKinematicseSigma_legacy", {"InclusiveKinematicsESigma"},
0119       {"InclusiveKinematicseSigma"}, app));
0120 
0121   app->Add(new JOmniFactoryGeneratorT<
0122            InclusiveKinematicsReconstructed_factory<InclusiveKinematicsSigma>>(
0123       "InclusiveKinematicsSigma", {"MCParticles", "ScatteredElectronsTruth", "HadronicFinalState"},
0124       {"InclusiveKinematicsSigma"}, app));
0125 
0126   app->Add(new JOmniFactoryGeneratorT<InclusiveKinematicsML_factory>(
0127       "InclusiveKinematicsML", {"InclusiveKinematicsElectron", "InclusiveKinematicsDA"},
0128       {"InclusiveKinematicsML"}, app));
0129 
0130   app->Add(new JOmniFactoryGeneratorT<ReconstructedElectrons_factory>(
0131       "ReconstructedElectrons", {"ReconstructedParticles"}, {"ReconstructedElectrons"}, {}, app));
0132 
0133   app->Add(new JOmniFactoryGeneratorT<ReconstructedElectrons_factory>(
0134       "ReconstructedElectronsForDIS", {"ReconstructedParticles"}, {"ReconstructedElectronsForDIS"},
0135       {
0136           .min_energy_over_momentum = 0.7, // GeV
0137           .max_energy_over_momentum = 1.3  // GeV
0138       },
0139       app));
0140 
0141   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0142       "GeneratedJets", {"GeneratedParticles"}, {"GeneratedJets"}, {}, app));
0143 
0144   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0145       "ReconstructedJets", {"ReconstructedParticles"}, {"ReconstructedJets"}, {}, app));
0146 
0147   app->Add(new JOmniFactoryGeneratorT<ChargedReconstructedParticleSelector_factory>(
0148       "GeneratedChargedParticles", {"GeneratedParticles"}, {"GeneratedChargedParticles"}, app));
0149 
0150   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0151       "GeneratedChargedJets", {"GeneratedChargedParticles"}, {"GeneratedChargedJets"}, {}, app));
0152 
0153   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0154       "ReconstructedChargedJets", {"ReconstructedChargedParticles"}, {"ReconstructedChargedJets"},
0155       {}, app));
0156 
0157   app->Add(new JOmniFactoryGeneratorT<ScatteredElectronsTruth_factory>(
0158       "ScatteredElectronsTruth",
0159       {"MCParticles", "ReconstructedChargedParticles", "ReconstructedChargedParticleAssociations"},
0160       {"ScatteredElectronsTruth"}, app));
0161 
0162   app->Add(new JOmniFactoryGeneratorT<ScatteredElectronsEMinusPz_factory>(
0163       "ScatteredElectronsEMinusPz",
0164       {"ReconstructedChargedParticles", "ReconstructedElectronsForDIS"},
0165       {"ScatteredElectronsEMinusPz"},
0166       {
0167           .minEMinusPz = 0,         // GeV
0168           .maxEMinusPz = 10000000.0 // GeV
0169       },
0170       app));
0171 
0172   // Forward
0173   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0174       "EcalEndcapPTrackClusterMatches", {"CalorimeterTrackProjections", "EcalEndcapPClusters"},
0175       {"EcalEndcapPTrackClusterMatches"}, {.calo_id = "EcalEndcapP_ID"}, app));
0176 
0177   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0178       "LFHCALTrackClusterMatches", {"CalorimeterTrackProjections", "LFHCALClusters"},
0179       {"LFHCALTrackClusterMatches"}, {.calo_id = "LFHCAL_ID"}, app));
0180 
0181   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0182       "HcalEndcapPInsertClusterMatches",
0183       {"CalorimeterTrackProjections", "HcalEndcapPInsertClusters"},
0184       {"HcalEndcapPInsertTrackClusterMatches"}, {.calo_id = "HcalEndcapPInsert_ID"}, app));
0185 
0186   // Barrel
0187   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0188       "EcalBarrelTrackClusterMatches", {"CalorimeterTrackProjections", "EcalBarrelClusters"},
0189       {"EcalBarrelTrackClusterMatches"}, {.calo_id = "EcalBarrel_ID"}, app));
0190 
0191   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0192       "HcalBarrelTrackClusterMatches", {"CalorimeterTrackProjections", "HcalBarrelClusters"},
0193       {"HcalBarrelTrackClusterMatches"}, {.calo_id = "HcalBarrel_ID"}, app));
0194 
0195   // Backward
0196   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0197       "EcalEndcapNBarrelTrackClusterMatches",
0198       {"CalorimeterTrackProjections", "EcalEndcapNClusters"}, {"EcalEndcapNTrackClusterMatches"},
0199       {.calo_id = "EcalEndcapN_ID"}, app));
0200 
0201   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0202       "HcalEndcapNBarrelTrackClusterMatches",
0203       {"CalorimeterTrackProjections", "HcalEndcapNClusters"}, {"HcalEndcapNTrackClusterMatches"},
0204       {.calo_id = "HcalEndcapN_ID"}, app));
0205 
0206   app->Add(new JOmniFactoryGeneratorT<TransformBreitFrame_factory>(
0207       "ReconstructedBreitFrameParticles",
0208       {"MCParticles", "InclusiveKinematicsElectron", "ReconstructedParticles"},
0209       {"ReconstructedBreitFrameParticles"}, {}, app));
0210 
0211   app->Add(new JOmniFactoryGeneratorT<FarForwardNeutralsReconstruction_factory>(
0212       "ReconstructedFarForwardZDCNeutrons",
0213       {"HcalFarForwardZDCClusters"},          // edm4eic::ClusterCollection
0214       {"ReconstructedFarForwardZDCNeutrals"}, // edm4eic::ReconstrutedParticleCollection,
0215       {.offsetPositionName        = "HcalFarForwardZDC_SiPMonTile_r_pos",
0216        .neutronScaleCorrCoeffHcal = {-0.11, -1.5, 0},
0217        .gammaScaleCorrCoeffHcal   = {0, -.13, 0},
0218        .globalToProtonRotation    = -0.025,
0219        .gammaZMaxOffset           = 300 * dd4hep::mm,
0220        .gammaMaxLength            = 100 * dd4hep::mm,
0221        .gammaMaxWidth             = 12 * dd4hep::mm},
0222       app // TODO: Remove me once fixed
0223       ));
0224 
0225   app->Add(new JOmniFactoryGeneratorT<FarForwardLambdaReconstruction_factory>(
0226       "ReconstructedFarForwardZDCLambdas",
0227       {"ReconstructedFarForwardZDCNeutrals"}, // edm4eic::ReconstrutedParticleCollection,
0228       {"ReconstructedFarForwardZDCLambdas", "ReconstructedFarForwardZDCLambdaDecayProductsC"
0229                                             "M"}, // edm4eic::ReconstrutedParticleCollection,
0230       {.offsetPositionName     = "HcalFarForwardZDC_SiPMonTile_r_pos",
0231        .globalToProtonRotation = -0.025,
0232        .lambdaMaxMassDev       = 0.030 * dd4hep::GeV,
0233        .iterations             = 10},
0234       app // TODO: Remove me once fixed
0235       ));
0236 
0237   app->Add(new JOmniFactoryGeneratorT<HadronicFinalState_factory<HadronicFinalState>>(
0238       "HadronicFinalState",
0239       {"MCParticles", "ReconstructedParticles", "ReconstructedParticleAssociations"},
0240       {"HadronicFinalState"}, app));
0241 
0242   app->Add(new JOmniFactoryGeneratorT<TransformBreitFrame_factory>(
0243       "GeneratedBreitFrameParticles",
0244       {"MCParticles", "InclusiveKinematicsElectron", "GeneratedParticles"},
0245       {"GeneratedBreitFrameParticles"}, {}, app));
0246 
0247   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0248       "GeneratedCentauroJets", {"GeneratedBreitFrameParticles"}, {"GeneratedCentauroJets"},
0249       {.rJet = 0.8, .jetAlgo = "plugin_algorithm", .jetContribAlgo = "Centauro"}, app));
0250 
0251   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0252       "ReconstructedCentauroJets", {"ReconstructedBreitFrameParticles"},
0253       {"ReconstructedCentauroJets"},
0254       {.rJet = 0.8, .jetAlgo = "plugin_algorithm", .jetContribAlgo = "Centauro"}, app));
0255 
0256   //Full correction for MCParticles --> MCParticlesHeadOnFrame
0257   app->Add(new JOmniFactoryGeneratorT<UndoAfterBurnerMCParticles_factory>(
0258       "MCParticlesHeadOnFrameNoBeamFX", {"MCParticles"}, {"MCParticlesHeadOnFrameNoBeamFX"},
0259       {
0260           .m_pid_assume_pion_mass = false,
0261           .m_crossing_angle       = -0.025 * dd4hep::rad,
0262           .m_pid_purity           = 0.51, //dummy value for MC truth information
0263           .m_correct_beam_FX      = true,
0264           .m_pid_use_MC_truth     = true,
0265       },
0266       app));
0267 
0268   app->Add(new JOmniFactoryGeneratorT<PrimaryVertices_factory>(
0269       "PrimaryVertices", {"CentralTrackVertices"}, {"PrimaryVertices"}, {}, app));
0270 }
0271 } // extern "C"