Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-06-06 07:54:18

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/EDM4eicVersion.h>
0010 #include <edm4eic/InclusiveKinematics.h>
0011 #include <edm4eic/MCRecoClusterParticleAssociation.h>
0012 #include <edm4eic/MCRecoParticleAssociation.h>
0013 #include <edm4eic/ReconstructedParticle.h>
0014 #include <edm4hep/MCParticle.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/ChargedReconstructedParticleSelector_factory.h"
0030 #include "factories/reco/ClustersToParticles_factory.h"
0031 #include "factories/reco/LambdaReconstruction_factory.h"
0032 #include "factories/reco/FarForwardNeutralsReconstruction_factory.h"
0033 #include "factories/reco/HadronicFinalState_factory.h"
0034 #include "factories/reco/InclusiveKinematicsML_factory.h"
0035 #include "factories/reco/InclusiveKinematicsReconstructed_factory.h"
0036 #include "factories/reco/InclusiveKinematicsTruth_factory.h"
0037 #include "factories/reco/JetReconstruction_factory.h"
0038 #include "factories/reco/MC2ReconstructedParticle_factory.h"
0039 #include "factories/reco/MatchClusters_factory.h"
0040 #include "factories/reco/PrimaryVertices_factory.h"
0041 #include "factories/reco/ReconstructedElectrons_factory.h"
0042 #include "factories/reco/ScatteredElectronsEMinusPz_factory.h"
0043 #include "factories/reco/ScatteredElectronsTruth_factory.h"
0044 #include "factories/reco/SecondaryVerticesHelix_factory.h"
0045 #include "factories/reco/TrackClusterMatch_factory.h"
0046 #include "factories/reco/TransformBreitFrame_factory.h"
0047 #include "factories/reco/UndoAfterBurnerMCParticles_factory.h"
0048 
0049 extern "C" {
0050 void InitPlugin(JApplication* app) {
0051   InitJANAPlugin(app);
0052 
0053   using namespace eicrecon;
0054 
0055   // Finds associations matched to initial scattered electrons
0056   app->Add(
0057       new JOmniFactoryGeneratorT<FilterMatching_factory<
0058           edm4eic::MCRecoParticleAssociation, [](auto* obj) { return obj->getSim().getObjectID(); },
0059           edm4hep::MCParticle, [](auto* obj) { return obj->getObjectID(); }>>(
0060           "MCScatteredElectronAssociations",
0061           {"ReconstructedChargedParticleAssociations", "MCScatteredElectrons"},
0062           {"MCScatteredElectronAssociations", "MCNonScatteredElectronAssociations"}, app));
0063 
0064   app->Add(new JOmniFactoryGeneratorT<MC2ReconstructedParticle_factory>(
0065       "GeneratedParticles", {"MCParticles"}, {"GeneratedParticles"}, app));
0066 
0067   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::Cluster, true>>(
0068       "EcalClusters", {"EcalEndcapNClusters", "EcalBarrelScFiClusters", "EcalEndcapPClusters"},
0069       {"EcalClusters"}, app));
0070 
0071   app->Add(new JOmniFactoryGeneratorT<
0072            CollectionCollector_factory<edm4eic::MCRecoClusterParticleAssociation, true>>(
0073       "EcalClusterAssociations",
0074       {"EcalEndcapNClusterAssociations", "EcalBarrelScFiClusterAssociations",
0075        "EcalEndcapPClusterAssociations"},
0076       {"EcalClusterAssociations"}, app));
0077 
0078   app->Add(new JOmniFactoryGeneratorT<MatchClusters_factory>(
0079       "ReconstructedParticlesWithAssoc",
0080       {
0081           "MCParticles",
0082           "ReconstructedChargedParticles",
0083           "ReconstructedChargedParticleAssociations",
0084           "EcalClusters",
0085           "EcalClusterAssociations",
0086       },
0087       {
0088           "ReconstructedParticles", // edm4eic::ReconstructedParticle
0089 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0090           "ReconstructedParticleLinks", // edm4eic::MCRecoParticleLink
0091 #endif
0092           "ReconstructedParticleAssociations" // edm4eic::MCRecoParticleAssociation
0093       },
0094       app));
0095 
0096   app->Add(new JOmniFactoryGeneratorT<InclusiveKinematicsTruth_factory>(
0097       "InclusiveKinematicsTruth", {"MCParticles"}, {"InclusiveKinematicsTruth"}, app));
0098 
0099   app->Add(new JOmniFactoryGeneratorT<
0100            InclusiveKinematicsReconstructed_factory<InclusiveKinematicsElectron>>(
0101       "InclusiveKinematicsElectron",
0102       {"MCBeamElectrons", "MCBeamProtons", "ScatteredElectronsTruth", "HadronicFinalState"},
0103       {"InclusiveKinematicsElectron"}, app));
0104 
0105   app->Add(
0106       new JOmniFactoryGeneratorT<InclusiveKinematicsReconstructed_factory<InclusiveKinematicsJB>>(
0107           "InclusiveKinematicsJB",
0108           {"MCBeamElectrons", "MCBeamProtons", "ScatteredElectronsTruth", "HadronicFinalState"},
0109           {"InclusiveKinematicsJB"}, app));
0110 
0111   app->Add(
0112       new JOmniFactoryGeneratorT<InclusiveKinematicsReconstructed_factory<InclusiveKinematicsDA>>(
0113           "InclusiveKinematicsDA",
0114           {"MCBeamElectrons", "MCBeamProtons", "ScatteredElectronsTruth", "HadronicFinalState"},
0115           {"InclusiveKinematicsDA"}, app));
0116 
0117   app->Add(new JOmniFactoryGeneratorT<
0118            InclusiveKinematicsReconstructed_factory<InclusiveKinematicsESigma>>(
0119       "InclusiveKinematicsESigma",
0120       {"MCBeamElectrons", "MCBeamProtons", "ScatteredElectronsTruth", "HadronicFinalState"},
0121       {"InclusiveKinematicsESigma"}, app));
0122 
0123   // InclusiveKinematicseSigma is deprecated and will be removed, use InclusiveKinematicsESigma instead
0124   app->Add(new JOmniFactoryGeneratorT<CollectionCollector_factory<edm4eic::InclusiveKinematics>>(
0125       "InclusiveKinematicseSigma_legacy", {"InclusiveKinematicsESigma"},
0126       {"InclusiveKinematicseSigma"}, app));
0127 
0128   app->Add(new JOmniFactoryGeneratorT<
0129            InclusiveKinematicsReconstructed_factory<InclusiveKinematicsSigma>>(
0130       "InclusiveKinematicsSigma",
0131       {"MCBeamElectrons", "MCBeamProtons", "ScatteredElectronsTruth", "HadronicFinalState"},
0132       {"InclusiveKinematicsSigma"}, app));
0133 
0134   app->Add(new JOmniFactoryGeneratorT<InclusiveKinematicsML_factory>(
0135       "InclusiveKinematicsML", {"InclusiveKinematicsElectron", "InclusiveKinematicsDA"},
0136       {"InclusiveKinematicsML"}, app));
0137 
0138   app->Add(new JOmniFactoryGeneratorT<ReconstructedElectrons_factory>(
0139       "ReconstructedElectrons", {"ReconstructedParticles"}, {"ReconstructedElectrons"}, {}, app));
0140 
0141   app->Add(new JOmniFactoryGeneratorT<ReconstructedElectrons_factory>(
0142       "ReconstructedElectronsForDIS", {"ReconstructedParticles"}, {"ReconstructedElectronsForDIS"},
0143       {
0144           .min_energy_over_momentum = 0.7, // GeV
0145           .max_energy_over_momentum = 1.3  // GeV
0146       },
0147       app));
0148 
0149   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0150       "GeneratedJets", {"EventHeader", "GeneratedParticles"}, {"GeneratedJets"}, {}, app));
0151 
0152   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0153       "ReconstructedJets", {"EventHeader", "ReconstructedParticles"}, {"ReconstructedJets"}, {},
0154       app));
0155 
0156   app->Add(new JOmniFactoryGeneratorT<ChargedReconstructedParticleSelector_factory>(
0157       "GeneratedChargedParticles", {"GeneratedParticles"}, {"GeneratedChargedParticles"}, app));
0158 
0159   app->Add(new JOmniFactoryGeneratorT<ClustersToParticles_factory>(
0160       "ReconstructedNeutralParticles", {"EcalClusters", "EcalClusterAssociations"},
0161       {"ReconstructedNeutralParticles",
0162 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0163        "ReconstructedNeutralParticleLinks",
0164 #endif
0165        "ReconstructedNeutralParticleAssociations"},
0166       app));
0167 
0168   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0169       "GeneratedChargedJets", {"EventHeader", "GeneratedChargedParticles"},
0170       {"GeneratedChargedJets"}, {}, app));
0171 
0172   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0173       "ReconstructedChargedJets", {"EventHeader", "ReconstructedChargedParticles"},
0174       {"ReconstructedChargedJets"}, {}, app));
0175 
0176   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0177       "ReconstructedNeutralJets", {"EventHeader", "ReconstructedNeutralParticles"},
0178       {"ReconstructedNeutralJets"}, {}, app));
0179 
0180   app->Add(new JOmniFactoryGeneratorT<ScatteredElectronsTruth_factory>(
0181       "ScatteredElectronsTruth",
0182       {"MCParticles", "ReconstructedChargedParticles", "ReconstructedChargedParticleAssociations"},
0183       {"ScatteredElectronsTruth"}, app));
0184 
0185   app->Add(new JOmniFactoryGeneratorT<ScatteredElectronsEMinusPz_factory>(
0186       "ScatteredElectronsEMinusPz",
0187       {"ReconstructedChargedParticles", "ReconstructedElectronsForDIS"},
0188       {"ScatteredElectronsEMinusPz"},
0189       {
0190           .minEMinusPz = 0,         // GeV
0191           .maxEMinusPz = 10000000.0 // GeV
0192       },
0193       app));
0194 
0195   // Forward
0196   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0197       "EcalEndcapPTrackClusterMatches", {"CalorimeterTrackProjections", "EcalEndcapPClusters"},
0198       {"EcalEndcapPTrackClusterMatches"}, {.calo_id = "EcalEndcapP_ID"}, app));
0199 
0200   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0201       "LFHCALTrackClusterMatches", {"CalorimeterTrackProjections", "LFHCALClusters"},
0202       {"LFHCALTrackClusterMatches"}, {.calo_id = "LFHCAL_ID"}, app));
0203 
0204   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0205       "HcalEndcapPInsertClusterMatches",
0206       {"CalorimeterTrackProjections", "HcalEndcapPInsertClusters"},
0207       {"HcalEndcapPInsertTrackClusterMatches"}, {.calo_id = "HcalEndcapPInsert_ID"}, app));
0208 
0209   // Barrel
0210   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0211       "EcalBarrelTrackClusterMatches", {"CalorimeterTrackProjections", "EcalBarrelClusters"},
0212       {"EcalBarrelTrackClusterMatches"}, {.calo_id = "EcalBarrel_ID"}, app));
0213 
0214   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0215       "HcalBarrelTrackClusterMatches", {"CalorimeterTrackProjections", "HcalBarrelClusters"},
0216       {"HcalBarrelTrackClusterMatches"}, {.calo_id = "HcalBarrel_ID"}, app));
0217 
0218   // Backward
0219   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0220       "EcalEndcapNTrackClusterMatches", {"CalorimeterTrackProjections", "EcalEndcapNClusters"},
0221       {"EcalEndcapNTrackClusterMatches"}, {.calo_id = "EcalEndcapN_ID"}, app));
0222 
0223   app->Add(new JOmniFactoryGeneratorT<TrackClusterMatch_factory>(
0224       "HcalEndcapNTrackClusterMatches", {"CalorimeterTrackProjections", "HcalEndcapNClusters"},
0225       {"HcalEndcapNTrackClusterMatches"}, {.calo_id = "HcalEndcapN_ID"}, app));
0226 
0227   app->Add(new JOmniFactoryGeneratorT<TransformBreitFrame_factory>(
0228       "ReconstructedBreitFrameParticles",
0229       {"MCParticles", "InclusiveKinematicsElectron", "ReconstructedParticles"},
0230       {"ReconstructedBreitFrameParticles"}, {}, app));
0231 
0232   app->Add(new JOmniFactoryGeneratorT<FarForwardNeutralsReconstruction_factory>(
0233       "ReconstructedFarForwardNeutrals",
0234       {"HcalFarForwardZDCClusters", "B0ECalClusters", "EcalEndcapPClusters", "LFHCALClusters"},
0235       {"ReconstructedHcalFarForwardZDCNeutrals", "ReconstructedB0EcalNeutrals",
0236        "ReconstructedEcalEndcapPNeutrals", "ReconstructedLFHCALNeutrals"},
0237       {.offsetPositionName               = "HcalFarForwardZDC_SiPMonTile_r_pos",
0238        .neutronScaleCorrCoeffHcalZDC     = {2.4, 0.89},
0239        .gammaScaleCorrCoeffHcalZDC       = {1.1, 0.98},
0240        .neutronScaleCorrCoeffLFHCAL      = {2.55, 0.95},
0241        .gammaScaleCorrCoeffLFHCAL        = {0., 0.},
0242        .neutronScaleCorrCoeffB0Ecal      = {0., 0.},
0243        .gammaScaleCorrCoeffB0Ecal        = {0.99, 1.14},
0244        .neutronScaleCorrCoeffEcalEndcapP = {0., 0.},
0245        .gammaScaleCorrCoeffEcalEndcapP   = {1.05, 1.01},
0246        .clusterEminHcalZDC               = 0.0,
0247        .clusterEminB0Ecal                = 1.0,
0248        .clusterEminEcalEndcapP           = 1.0,
0249        .clusterEminLFHCAL                = 7.0,
0250        .globalToProtonRotation           = -0.025,
0251        .gammaZMaxOffset                  = 400,
0252        .gammaMaxLength                   = 100,
0253        .gammaMaxWidth                    = 12},
0254       app));
0255 
0256   app->Add(new JOmniFactoryGeneratorT<LambdaReconstruction_factory>(
0257       "ReconstructedLambdas",
0258       {"ReconstructedHcalFarForwardZDCNeutrals", "ReconstructedB0EcalNeutrals",
0259        "ReconstructedEcalEndcapPNeutrals", "ReconstructedLFHCALNeutrals"},
0260       {"ReconstructedLambdas", "ReconstructedLambdaDecayProductsCM"},
0261       {.offsetPositionName     = "HcalFarForwardZDC_SiPMonTile_r_pos",
0262        .globalToProtonRotation = -0.025,
0263        .lambdaMassWindow       = 0.1,
0264        .pi0Window              = 0.1,
0265        .iterations             = 10},
0266       app));
0267 
0268   app->Add(new JOmniFactoryGeneratorT<HadronicFinalState_factory<HadronicFinalState>>(
0269       "HadronicFinalState",
0270       {"MCBeamElectrons", "MCBeamProtons", "MCParticles", "ReconstructedParticles",
0271        "ReconstructedParticleAssociations"},
0272       {"HadronicFinalState"}, app));
0273 
0274   app->Add(new JOmniFactoryGeneratorT<TransformBreitFrame_factory>(
0275       "GeneratedBreitFrameParticles",
0276       {"MCParticles", "InclusiveKinematicsElectron", "GeneratedParticles"},
0277       {"GeneratedBreitFrameParticles"}, {}, app));
0278 
0279   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0280       "GeneratedCentauroJets", {"EventHeader", "GeneratedBreitFrameParticles"},
0281       {"GeneratedCentauroJets"},
0282       {.rJet = 0.8, .jetAlgo = "plugin_algorithm", .jetContribAlgo = "Centauro"}, app));
0283 
0284   app->Add(new JOmniFactoryGeneratorT<JetReconstruction_factory<edm4eic::ReconstructedParticle>>(
0285       "ReconstructedCentauroJets", {"EventHeader", "ReconstructedBreitFrameParticles"},
0286       {"ReconstructedCentauroJets"},
0287       {.rJet = 0.8, .jetAlgo = "plugin_algorithm", .jetContribAlgo = "Centauro"}, app));
0288 
0289   //Full correction for MCParticles --> MCParticlesHeadOnFrame
0290   app->Add(new JOmniFactoryGeneratorT<UndoAfterBurnerMCParticles_factory>(
0291       "MCParticlesHeadOnFrameNoBeamFX", {"MCParticles"}, {"MCParticlesHeadOnFrameNoBeamFX"},
0292       {
0293           .m_pid_assume_pion_mass = false,
0294           .m_crossing_angle       = -0.025 * dd4hep::rad,
0295           .m_pid_purity           = 0.51, //dummy value for MC truth information
0296           .m_correct_beam_FX      = true,
0297           .m_pid_use_MC_truth     = true,
0298       },
0299       app));
0300 
0301   app->Add(new JOmniFactoryGeneratorT<PrimaryVertices_factory>(
0302       "PrimaryVertices", {"CentralTrackVertices"}, {"PrimaryVertices"}, {}, app));
0303 
0304   app->Add(new JOmniFactoryGeneratorT<SecondaryVerticesHelix_factory>(
0305       "SecondaryVerticesHelix", {"PrimaryVertices", "ReconstructedParticles"},
0306       {"SecondaryVerticesHelix"}, {}, app));
0307 }
0308 } // extern "C"