Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-24 08:25:36

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 - 2025, Dmitry Romanov,  Wouter Deconinck, Kolja Kauder, Barak Schmookler, Honey Khindri, Dmitry Kalinkin
0003 
0004 #include <Evaluator/DD4hepUnits.h>
0005 #include <JANA/JApplication.h>
0006 #include <JANA/JApplicationFwd.h>
0007 #include <JANA/Utils/JTypeInfo.h>
0008 #include <TMath.h>
0009 #include <edm4eic/unit_system.h>
0010 #include <edm4hep/SimTrackerHit.h>
0011 #include <cmath>
0012 #include <map>
0013 #include <memory>
0014 #include <string>
0015 #include <vector>
0016 
0017 #include "algorithms/digi/SiliconChargeSharingConfig.h"
0018 #include "extensions/jana/JOmniFactoryGeneratorT.h"
0019 #include "factories/digi/EICROCDigitization_factory.h"
0020 #include "factories/digi/PulseCombiner_factory.h"
0021 #include "factories/digi/PulseGeneration_factory.h"
0022 #include "factories/digi/SiliconChargeSharing_factory.h"
0023 #include "factories/digi/SiliconPulseDiscretization_factory.h"
0024 #include "factories/digi/SiliconTrackerDigi_factory.h"
0025 #include "factories/tracking/LGADHitClustering_factory.h"
0026 #include "factories/tracking/TrackerHitReconstruction_factory.h"
0027 
0028 extern "C" {
0029 void InitPlugin(JApplication* app) {
0030   InitJANAPlugin(app);
0031 
0032   using namespace eicrecon;
0033 
0034   // cluster all hits in a sensor into one hit location
0035   // Currently it's just a simple weighted average
0036   // More sophisticated algorithm TBD
0037   app->Add(new JOmniFactoryGeneratorT<LGADHitClustering_factory>(
0038       "TOFEndcapClusterHits", {"TOFEndcapSharedRecHits"}, // Input data collection tags
0039       {"TOFEndcapClusterHits"},                           // Output data tag
0040       {
0041           .readout = "TOFEndcapHits",
0042           .useAve  = true,
0043       },
0044       app));
0045 
0046   app->Add(new JOmniFactoryGeneratorT<SiliconChargeSharing_factory>(
0047       "TOFEndcapSharedHits", {"TOFEndcapHits"}, {"TOFEndcapSharedHits"},
0048       {
0049 
0050           .sigma_mode     = SiliconChargeSharingConfig::ESigmaMode::rel,
0051           .sigma_sharingx = 0.5,
0052           .sigma_sharingy = 0.5,
0053           .min_edep       = 6 * dd4hep::keV,
0054           .readout        = "TOFEndcapHits",
0055       },
0056       app));
0057 
0058   // temporary steps to bypass pulse digitization and jump right from ChargeSharing to clusters
0059   // Avoid efficiency loss until we can simulate hardware accurately
0060   app->Add(new JOmniFactoryGeneratorT<SiliconTrackerDigi_factory>(
0061       "TOFEndcapSharedRawHits", {"EventHeader", "TOFEndcapSharedHits"},
0062       {"TOFEndcapSharedRawHits", "TOFEndcapSharedRawHitLinks", "TOFEndcapSharedRawHitAssociations"},
0063       {
0064           .threshold      = 0.0,
0065           .timeResolution = 0.025, // [ns]
0066       },
0067       app));
0068 
0069   // Convert raw digitized hits into hits with geometry info (ready for tracking)
0070   app->Add(new JOmniFactoryGeneratorT<TrackerHitReconstruction_factory>(
0071       "TOFEndcapSharedRecHits", {"TOFEndcapSharedRawHits"}, // Input data collection tags
0072       {"TOFEndcapSharedRecHits"},                           // Output data tag
0073       {},
0074       app)); // Hit reco default config for factories
0075 
0076   const double x_when_landau_min = -0.22278;
0077   const double landau_min        = TMath::Landau(x_when_landau_min, 0, 1, true);
0078   const double sigma_analog      = 0.293951 * edm4eic::unit::ns;
0079   const double Vm                = 3e-4 * dd4hep::GeV;
0080   const double adc_range         = 256;
0081 
0082   const double gain = -adc_range / Vm / landau_min * sigma_analog;
0083   const int offset  = 3;
0084   app->Add(new JOmniFactoryGeneratorT<PulseGeneration_factory<edm4hep::SimTrackerHit>>(
0085       "TOFEndcapSmoothPulses", {"TOFEndcapSharedHits"}, {"TOFEndcapSmoothPulses"},
0086       {
0087           .pulse_shape_function = "LandauPulse",
0088           .pulse_shape_params   = {gain, sigma_analog, offset},
0089           .ignore_thres         = 0.05 * adc_range,
0090           .timestep             = 0.01 * edm4eic::unit::ns,
0091       },
0092       app));
0093 
0094   app->Add(new JOmniFactoryGeneratorT<PulseCombiner_factory>(
0095       "TOFEndcapCombinedPulses", {"TOFEndcapSmoothPulses"}, {"TOFEndcapCombinedPulses"},
0096       {
0097           .minimum_separation = 25 * edm4eic::unit::ns,
0098       },
0099       app));
0100 
0101   double risetime = 0.45 * edm4eic::unit::ns;
0102   app->Add(new JOmniFactoryGeneratorT<SiliconPulseDiscretization_factory>(
0103       "TOFEndcapPulses", {"TOFEndcapCombinedPulses"}, {"TOFEndcapPulses"},
0104       {
0105           .EICROC_period = 25 * edm4eic::unit::ns,
0106           .local_period  = 25 * edm4eic::unit::ns / 1024,
0107           .global_offset = -offset * sigma_analog + risetime,
0108       },
0109       app));
0110 
0111   app->Add(new JOmniFactoryGeneratorT<EICROCDigitization_factory>(
0112       "TOFEndcapADCTDC", {"TOFEndcapPulses"}, {"TOFEndcapADCTDC"}, {}, app));
0113 }
0114 } // extern "C"