Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:28:06

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/TrackerHitReconstruction_factory.h"
0026 
0027 extern "C" {
0028 void InitPlugin(JApplication* app) {
0029   InitJANAPlugin(app);
0030 
0031   using namespace eicrecon;
0032 
0033   // Digitization
0034   app->Add(new JOmniFactoryGeneratorT<SiliconTrackerDigi_factory>(
0035       "TOFEndcapRawHits", {"EventHeader", "TOFEndcapHits"},
0036       {"TOFEndcapRawHits", "TOFEndcapRawHitAssociations"},
0037       {
0038           .threshold      = 6.0 * dd4hep::keV,
0039           .timeResolution = 0.025,
0040       },
0041       app));
0042 
0043   // Convert raw digitized hits into hits with geometry info (ready for tracking)
0044   app->Add(new JOmniFactoryGeneratorT<TrackerHitReconstruction_factory>(
0045       "TOFEndcapRecHits", {"TOFEndcapRawHits"}, // Input data collection tags
0046       {"TOFEndcapRecHits"},                     // Output data tag
0047       {
0048           .timeResolution = 0.025,
0049       },
0050       app));
0051 
0052   app->Add(new JOmniFactoryGeneratorT<SiliconChargeSharing_factory>(
0053       "TOFEndcapSharedHits", {"TOFEndcapHits"}, {"TOFEndcapSharedHits"},
0054       {
0055 
0056           .sigma_mode     = SiliconChargeSharingConfig::ESigmaMode::rel,
0057           .sigma_sharingx = 1,
0058           .sigma_sharingy = 1,
0059           .min_edep       = 0.001 * dd4hep::keV,
0060           .readout        = "TOFEndcapHits",
0061       },
0062       app));
0063 
0064   const double x_when_landau_min = -0.22278;
0065   const double landau_min        = TMath::Landau(x_when_landau_min, 0, 1, true);
0066   const double sigma_analog      = 0.293951 * edm4eic::unit::ns;
0067   const double Vm                = 3e-4 * dd4hep::GeV;
0068   const double adc_range         = 256;
0069 
0070   const double gain = -adc_range / Vm / landau_min * sigma_analog;
0071   const int offset  = 3;
0072   app->Add(new JOmniFactoryGeneratorT<PulseGeneration_factory<edm4hep::SimTrackerHit>>(
0073       "TOFEndcapSmoothPulses", {"TOFEndcapSharedHits"}, {"TOFEndcapSmoothPulses"},
0074       {
0075           .pulse_shape_function = "LandauPulse",
0076           .pulse_shape_params   = {gain, sigma_analog, offset},
0077           .ignore_thres         = 0.05 * adc_range,
0078           .timestep             = 0.01 * edm4eic::unit::ns,
0079       },
0080       app));
0081 
0082   app->Add(new JOmniFactoryGeneratorT<PulseCombiner_factory>(
0083       "TOFEndcapCombinedPulses", {"TOFEndcapSmoothPulses"}, {"TOFEndcapCombinedPulses"},
0084       {
0085           .minimum_separation = 25 * edm4eic::unit::ns,
0086       },
0087       app));
0088 
0089   double risetime = 0.45 * edm4eic::unit::ns;
0090   app->Add(new JOmniFactoryGeneratorT<SiliconPulseDiscretization_factory>(
0091       "TOFEndcapPulses", {"TOFEndcapCombinedPulses"}, {"TOFEndcapPulses"},
0092       {
0093           .EICROC_period = 25 * edm4eic::unit::ns,
0094           .local_period  = 25 * edm4eic::unit::ns / 1024,
0095           .global_offset = -offset * sigma_analog + risetime,
0096       },
0097       app));
0098 
0099   app->Add(new JOmniFactoryGeneratorT<EICROCDigitization_factory>(
0100       "TOFEndcapADCTDC", {"TOFEndcapPulses"}, {"TOFEndcapADCTDC"}, {}, app));
0101 }
0102 } // extern "C"