Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-04 08:28:01

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