Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-13 08:03:22

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2021 - 2025, Chao Peng, Sylvester Joosten, Whitney Armstrong, David Lawrence, Friederike Bock, Wouter Deconinck, Nathan Brei, Sebouh Paul, Dmitry Kalinkin, Barak Schmookler
0003 
0004 #include <Evaluator/DD4hepUnits.h>
0005 #include <JANA/JApplicationFwd.h>
0006 #include <JANA/Utils/JTypeInfo.h>
0007 #include <edm4eic/EDM4eicVersion.h>
0008 #include <string>
0009 #include <variant>
0010 #include <vector>
0011 
0012 #include "algorithms/calorimetry/HEXPLITConfig.h"
0013 #include "algorithms/calorimetry/ImagingTopoClusterConfig.h"
0014 #include "extensions/jana/JOmniFactoryGeneratorT.h"
0015 #include "factories/calorimetry/CalorimeterClusterRecoCoG_factory.h"
0016 #include "factories/calorimetry/CalorimeterClusterShape_factory.h"
0017 #include "factories/calorimetry/CalorimeterHitDigi_factory.h"
0018 #include "factories/calorimetry/CalorimeterHitReco_factory.h"
0019 #include "factories/calorimetry/CalorimeterIslandCluster_factory.h"
0020 #include "factories/calorimetry/CalorimeterTruthClustering_factory.h"
0021 #include "factories/calorimetry/HEXPLIT_factory.h"
0022 #include "factories/calorimetry/ImagingTopoCluster_factory.h"
0023 
0024 extern "C" {
0025 void InitPlugin(JApplication* app) {
0026 
0027   using namespace eicrecon;
0028 
0029   InitJANAPlugin(app);
0030 
0031   // LYSO part of the ZDC
0032   app->Add(new JOmniFactoryGeneratorT<CalorimeterHitDigi_factory>(
0033       "EcalFarForwardZDCRawHits", {"EventHeader", "EcalFarForwardZDCHits"},
0034       {"EcalFarForwardZDCRawHits",
0035 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0036        "EcalFarForwardZDCRawHitLinks",
0037 #endif
0038        "EcalFarForwardZDCRawHitAssociations"},
0039       {
0040           .eRes{},
0041           .tRes          = 0.0 * dd4hep::ns,
0042           .capADC        = 32768,
0043           .dyRangeADC    = 2000 * dd4hep::MeV,
0044           .pedMeanADC    = 400,
0045           .pedSigmaADC   = 3.2,
0046           .resolutionTDC = 10 * dd4hep::picosecond,
0047           .corrMeanScale = "1.0",
0048           .readout       = "EcalFarForwardZDCHits",
0049       },
0050       app // TODO: Remove me once fixed
0051       ));
0052   app->Add(new JOmniFactoryGeneratorT<CalorimeterHitReco_factory>(
0053       "EcalFarForwardZDCRecHits", {"EcalFarForwardZDCRawHits"}, {"EcalFarForwardZDCRecHits"},
0054       {
0055           .capADC          = 32768,
0056           .dyRangeADC      = 2000. * dd4hep::MeV,
0057           .pedMeanADC      = 400,
0058           .pedSigmaADC     = 3.2,
0059           .resolutionTDC   = 10 * dd4hep::picosecond,
0060           .thresholdFactor = 4.0,
0061           .thresholdValue  = 0.0,
0062           .sampFrac        = "1.0",
0063           .readout         = "EcalFarForwardZDCHits",
0064       },
0065       app // TODO: Remove me once fixed
0066       ));
0067   app->Add(new JOmniFactoryGeneratorT<CalorimeterTruthClustering_factory>(
0068       "EcalFarForwardZDCTruthProtoClusters", {"EcalFarForwardZDCRecHits", "EcalFarForwardZDCHits"},
0069       {"EcalFarForwardZDCTruthProtoClusters"},
0070       app // TODO: Remove me once fixed
0071       ));
0072   app->Add(new JOmniFactoryGeneratorT<CalorimeterIslandCluster_factory>(
0073       "EcalFarForwardZDCIslandProtoClusters", {"EcalFarForwardZDCRecHits"},
0074       {"EcalFarForwardZDCIslandProtoClusters"},
0075       {
0076           .adjacencyMatrix{},
0077           .peakNeighbourhoodMatrix{},
0078           .readout{},
0079           .sectorDist  = 5.0 * dd4hep::cm,
0080           .localDistXY = {50 * dd4hep::cm, 50 * dd4hep::cm},
0081           .localDistXZ{},
0082           .localDistYZ{},
0083           .globalDistRPhi{},
0084           .globalDistEtaPhi{},
0085           .dimScaledLocalDistXY{},
0086           .splitCluster                  = true,
0087           .minClusterHitEdep             = 0.1 * dd4hep::MeV,
0088           .minClusterCenterEdep          = 3.0 * dd4hep::MeV,
0089           .transverseEnergyProfileMetric = "globalDistEtaPhi",
0090           .transverseEnergyProfileScale  = 1.,
0091           .transverseEnergyProfileScaleUnits{},
0092       },
0093       app // TODO: Remove me once fixed
0094       ));
0095 
0096   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterRecoCoG_factory>(
0097       "EcalFarForwardZDCTruthClustersWithoutShapes",
0098       {
0099           "EcalFarForwardZDCTruthProtoClusters", // edm4eic::ProtoClusterCollection
0100 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0101           "EcalFarForwardZDCRawHitLinks", // edm4eic::MCRecoCalorimeterHitLink
0102 #endif
0103           "EcalFarForwardZDCRawHitAssociations" // edm4eic::MCRecoCalorimeterHitAssociation
0104       },
0105       {"EcalFarForwardZDCTruthClustersWithoutShapes",
0106 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0107        "EcalFarForwardZDCTruthClusterLinksWithoutShapes",
0108 #endif
0109        "EcalFarForwardZDCTruthClusterAssociationsWithoutShapes"}, // edm4eic::MCRecoClusterParticleAssociation
0110       {.energyWeight = "log", .sampFrac = 1.0, .logWeightBase = 3.6, .enableEtaBounds = false},
0111       app // TODO: Remove me once fixed
0112       ));
0113 
0114   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterShape_factory>(
0115       "EcalFarForwardZDCTruthClusters",
0116       {"EcalFarForwardZDCTruthClustersWithoutShapes",
0117        "EcalFarForwardZDCTruthClusterAssociationsWithoutShapes"},
0118       {"EcalFarForwardZDCTruthClusters",
0119 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0120        "EcalFarForwardZDCTruthClusterLinks",
0121 #endif
0122        "EcalFarForwardZDCTruthClusterAssociations"},
0123       {.longitudinalShowerInfoAvailable = true, .energyWeight = "log", .logWeightBase = 3.6}, app));
0124 
0125   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterRecoCoG_factory>(
0126       "EcalFarForwardZDCClustersWithoutShapes",
0127       {
0128           "EcalFarForwardZDCIslandProtoClusters", // edm4eic::ProtoClusterCollection
0129 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0130           "EcalFarForwardZDCRawHitLinks", // edm4eic::MCRecoCalorimeterHitLink
0131 #endif
0132           "EcalFarForwardZDCRawHitAssociations" // edm4eic::MCRecoCalorimeterHitAssociation
0133       },
0134       {"EcalFarForwardZDCClustersWithoutShapes",
0135 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0136        "EcalFarForwardZDCClusterLinksWithoutShapes",
0137 #endif
0138        "EcalFarForwardZDCClusterAssociationsWithoutShapes"}, // edm4eic::MCRecoClusterParticleAssociation
0139       {
0140           .energyWeight    = "log",
0141           .sampFrac        = 1.0,
0142           .logWeightBase   = 6.2,
0143           .enableEtaBounds = false,
0144       },
0145       app // TODO: Remove me once fixed
0146       ));
0147 
0148   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterShape_factory>(
0149       "EcalFarForwardZDCClusters",
0150       {"EcalFarForwardZDCClustersWithoutShapes",
0151        "EcalFarForwardZDCClusterAssociationsWithoutShapes"},
0152       {"EcalFarForwardZDCClusters",
0153 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0154        "EcalFarForwardZDCClusterLinks",
0155 #endif
0156        "EcalFarForwardZDCClusterAssociations"},
0157       {.longitudinalShowerInfoAvailable = true, .energyWeight = "log", .logWeightBase = 6.2}, app));
0158 
0159   app->Add(new JOmniFactoryGeneratorT<CalorimeterHitDigi_factory>(
0160       "HcalFarForwardZDCRawHits", {"EventHeader", "HcalFarForwardZDCHits"},
0161       {"HcalFarForwardZDCRawHits",
0162 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0163        "HcalFarForwardZDCRawHitLinks",
0164 #endif
0165        "HcalFarForwardZDCRawHitAssociations"},
0166       {
0167           .eRes{},
0168           .tRes          = 0.0 * dd4hep::ns,
0169           .capADC        = 65536,
0170           .dyRangeADC    = 1000. * dd4hep::MeV,
0171           .pedMeanADC    = 400,
0172           .pedSigmaADC   = 2,
0173           .resolutionTDC = 10 * dd4hep::picosecond,
0174           .corrMeanScale = "1.0",
0175           .readout       = "HcalFarForwardZDCHits",
0176       },
0177       app // TODO: Remove me once fixed
0178       ));
0179 
0180   app->Add(new JOmniFactoryGeneratorT<CalorimeterHitReco_factory>(
0181       "HcalFarForwardZDCRecHits", {"HcalFarForwardZDCRawHits"}, {"HcalFarForwardZDCRecHits"},
0182       {
0183           .capADC          = 65536,
0184           .dyRangeADC      = 1000. * dd4hep::MeV,
0185           .pedMeanADC      = 400,
0186           .pedSigmaADC     = 2,
0187           .resolutionTDC   = 10 * dd4hep::picosecond,
0188           .thresholdFactor = 3.0,
0189           .thresholdValue  = 0.0,
0190           .sampFrac        = "1.0",
0191           .readout         = "HcalFarForwardZDCHits",
0192           .layerField      = "layer",
0193           .sectorField     = "system",
0194       },
0195       app // TODO: Remove me once fixed
0196       ));
0197 
0198   app->Add(new JOmniFactoryGeneratorT<HEXPLIT_factory>(
0199       "HcalFarForwardZDCSubcellHits", {"HcalFarForwardZDCRecHits"},
0200       {"HcalFarForwardZDCSubcellHits"},
0201       {
0202           .MIP           = 630. * dd4hep::keV,
0203           .Emin_in_MIPs  = 0.5,
0204           .delta_in_MIPs = 0.01,
0205           .tmax          = 269 * dd4hep::ns,
0206           .stag_type     = HEXPLITConfig::StaggerType::S2,
0207       },
0208       app // TODO: Remove me once fixed
0209       ));
0210 
0211   double side_length = 48.8 * dd4hep::mm;
0212   app->Add(new JOmniFactoryGeneratorT<ImagingTopoCluster_factory>(
0213       "HcalFarForwardZDCImagingProtoClusters", {"HcalFarForwardZDCSubcellHits"},
0214       {"HcalFarForwardZDCImagingProtoClusters"},
0215       {
0216           .neighbourLayersRange = 1,
0217           .sameLayerDistXY      = {side_length * 0.75, side_length * 0.75},
0218           .diffLayerDistXY      = {side_length * 0.75, side_length * 0.75},
0219           .sameLayerMode        = eicrecon::ImagingTopoClusterConfig::ELayerMode::xy,
0220           .diffLayerMode        = eicrecon::ImagingTopoClusterConfig::ELayerMode::xy,
0221           .sectorDist           = 10.0 * dd4hep::cm,
0222           .minClusterHitEdep    = 315.0 * dd4hep::keV,
0223           .minClusterCenterEdep = 25 * dd4hep::MeV,
0224           .minClusterEdep       = 50.0 * dd4hep::MeV,
0225           .minClusterNhits      = 10,
0226       },
0227       app));
0228 
0229   app->Add(new JOmniFactoryGeneratorT<CalorimeterIslandCluster_factory>(
0230       "HcalFarForwardZDCIslandProtoClusters", {"HcalFarForwardZDCSubcellHits"},
0231       {"HcalFarForwardZDCIslandProtoClusters"},
0232       {.adjacencyMatrix{},
0233        .peakNeighbourhoodMatrix{},
0234        .readout{},
0235        .sectorDist  = 1.5 * dd4hep::cm,
0236        .localDistXY = {"0.55 * HcalFarForwardZDC_SiPMonTile_SquareSideLength",
0237                        "0.55 * HcalFarForwardZDC_SiPMonTile_SquareSideLength"},
0238        .localDistXZ{},
0239        .localDistYZ{},
0240        .globalDistRPhi{},
0241        .globalDistEtaPhi{},
0242        .dimScaledLocalDistXY{},
0243        .splitCluster         = false,
0244        .minClusterHitEdep    = 100.0 * dd4hep::keV,
0245        .minClusterCenterEdep = 1.0 * dd4hep::MeV,
0246        .transverseEnergyProfileMetric{}, // = "globalDistEtaPhi",
0247        .transverseEnergyProfileScale{},  // = 1.,
0248        .transverseEnergyProfileScaleUnits{}},
0249       app));
0250 
0251   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterRecoCoG_factory>(
0252       "HcalFarForwardZDCClustersWithoutShapes",
0253       {
0254           "HcalFarForwardZDCImagingProtoClusters", // edm4eic::ProtoClusterCollection
0255 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0256           "HcalFarForwardZDCRawHitLinks", // edm4eic::MCRecoCalorimeterHitLink
0257 #endif
0258           "HcalFarForwardZDCRawHitAssociations" // edm4eic::MCRecoCalorimeterHitAssociationCollection
0259       },
0260       {"HcalFarForwardZDCClustersWithoutShapes",
0261 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0262        "HcalFarForwardZDCClusterLinksWithoutShapes",
0263 #endif
0264        "HcalFarForwardZDCClusterAssociationsWithoutShapes"}, // edm4eic::MCRecoClusterParticleAssociation
0265       {.energyWeight        = "log",
0266        .sampFrac            = 0.0273,
0267        .logWeightBaseCoeffs = {5.8, 0.65, 0.31},
0268        .logWeightBase_Eref  = 50 * dd4hep::GeV},
0269       app // TODO: Remove me once fixed
0270       ));
0271 
0272   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterShape_factory>(
0273       "HcalFarForwardZDCClusters",
0274       {"HcalFarForwardZDCClustersWithoutShapes",
0275        "HcalFarForwardZDCClusterAssociationsWithoutShapes"},
0276       {"HcalFarForwardZDCClusters",
0277 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0278        "HcalFarForwardZDCClusterLinks",
0279 #endif
0280        "HcalFarForwardZDCClusterAssociations"},
0281       {.longitudinalShowerInfoAvailable = true,
0282        .energyWeight                    = "log",
0283        .sampFrac                        = 0.0273,
0284        .logWeightBaseCoeffs             = {5.8, 0.65, 0.31},
0285        .logWeightBase_Eref              = 50 * dd4hep::GeV},
0286       app));
0287 
0288   app->Add(new JOmniFactoryGeneratorT<CalorimeterTruthClustering_factory>(
0289       "HcalFarForwardZDCTruthProtoClusters", {"HcalFarForwardZDCRecHits", "HcalFarForwardZDCHits"},
0290       {"HcalFarForwardZDCTruthProtoClusters"},
0291       app // TODO: Remove me once fixed
0292       ));
0293 
0294   //Clusters with the baseline algorithm (no HEXPLIT)
0295   app->Add(new JOmniFactoryGeneratorT<CalorimeterIslandCluster_factory>(
0296       "HcalFarForwardZDCIslandProtoClustersBaseline", {"HcalFarForwardZDCRecHits"},
0297       {"HcalFarForwardZDCIslandProtoClustersBaseline"},
0298       {.adjacencyMatrix{},
0299        .peakNeighbourhoodMatrix{},
0300        .readout{},
0301        .sectorDist  = 5.0 * dd4hep::cm,
0302        .localDistXY = {50 * dd4hep::cm, 50 * dd4hep::cm},
0303        .localDistXZ{},
0304        .localDistYZ{},
0305        .globalDistRPhi{},
0306        .globalDistEtaPhi{},
0307        .dimScaledLocalDistXY{},
0308        .splitCluster                  = true,
0309        .minClusterHitEdep             = 0.1 * dd4hep::MeV,
0310        .minClusterCenterEdep          = 3.0 * dd4hep::MeV,
0311        .transverseEnergyProfileMetric = "globalDistEtaPhi",
0312        .transverseEnergyProfileScale  = 1.,
0313        .transverseEnergyProfileScaleUnits{}},
0314       app // TODO: Remove me once fixed
0315       ));
0316 
0317   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterRecoCoG_factory>(
0318       "HcalFarForwardZDCTruthClustersWithoutShapes",
0319       {
0320           "HcalFarForwardZDCTruthProtoClusters", // edm4eic::ProtoClusterCollection
0321 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0322           "HcalFarForwardZDCRawHitLinks", // edm4eic::MCRecoCalorimeterHitLink
0323 #endif
0324           "HcalFarForwardZDCRawHitAssociations" // edm4eic::MCRecoCalorimeterHitAssociationCollection
0325       },
0326       {"HcalFarForwardZDCTruthClustersWithoutShapes",
0327 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0328        "HcalFarForwardZDCTruthClusterLinksWithoutShapes",
0329 #endif
0330        "HcalFarForwardZDCTruthClusterAssociationsWithoutShapes"}, // edm4eic::MCRecoClusterParticleAssociation
0331       {.energyWeight = "log", .sampFrac = 1.0, .logWeightBase = 3.6, .enableEtaBounds = false},
0332       app // TODO: Remove me once fixed
0333       ));
0334 
0335   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterShape_factory>(
0336       "HcalFarForwardZDCTruthClusters",
0337       {"HcalFarForwardZDCTruthClustersWithoutShapes",
0338        "HcalFarForwardZDCTruthClusterAssociationsWithoutShapes"},
0339       {"HcalFarForwardZDCTruthClusters",
0340 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0341        "HcalFarForwardZDCTruthClusterLinks",
0342 #endif
0343        "HcalFarForwardZDCTruthClusterAssociations"},
0344       {.longitudinalShowerInfoAvailable = true, .energyWeight = "log", .logWeightBase = 3.6}, app));
0345 
0346   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterRecoCoG_factory>(
0347       "HcalFarForwardZDCClustersBaselineWithoutShapes",
0348       {
0349           "HcalFarForwardZDCIslandProtoClustersBaseline", // edm4eic::ProtoClusterCollection
0350 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0351           "HcalFarForwardZDCRawHitLinks", // edm4eic::MCRecoCalorimeterHitLink
0352 #endif
0353           "HcalFarForwardZDCRawHitAssociations" // edm4eic::MCRecoCalorimeterHitAssociationCollection
0354       },
0355       {"HcalFarForwardZDCClustersBaselineWithoutShapes", // edm4eic::Cluster
0356 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0357        "HcalFarForwardZDCClusterLinksBaselineWithoutShapes",
0358 #endif
0359        "HcalFarForwardZDCClusterAssociationsBaselineWithoutShapes"}, // edm4eic::MCRecoClusterParticleAssociation
0360       {
0361           .energyWeight    = "log",
0362           .sampFrac        = 0.0273,
0363           .logWeightBase   = 6.2,
0364           .enableEtaBounds = false,
0365       },
0366       app // TODO: Remove me once fixed
0367       ));
0368 
0369   app->Add(new JOmniFactoryGeneratorT<CalorimeterClusterShape_factory>(
0370       "HcalFarForwardZDCClustersBaseline",
0371       {"HcalFarForwardZDCClustersBaselineWithoutShapes",
0372        "HcalFarForwardZDCClusterAssociationsBaselineWithoutShapes"},
0373       {"HcalFarForwardZDCClustersBaseline",
0374 #if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
0375        "HcalFarForwardZDCClusterLinksBaseline",
0376 #endif
0377        "HcalFarForwardZDCClusterAssociationsBaseline"},
0378       {.longitudinalShowerInfoAvailable = true,
0379        .energyWeight                    = "log",
0380        .sampFrac                        = 0.0273,
0381        .logWeightBase                   = 6.2},
0382       app));
0383 }
0384 }