Back to home page

EIC code displayed by LXR

 
 

    


Warning, file /EICrecon/src/global/reco/reco.cc was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

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