Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-09 08:25:42

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 Chao Peng, Wouter Deconinck, Sylvester Joosten, Barak Schmookler, David Lawrence
0003 
0004 // A general digitization for CalorimeterHit from simulation
0005 // 1. Smear energy deposit with a/sqrt(E/GeV) + b + c/E or a/sqrt(E/GeV) (relative value)
0006 // 2. Digitize the energy with dynamic ADC range and add pedestal (mean +- sigma)
0007 // 3. Time conversion with smearing resolution (absolute value)
0008 // 4. Signal is summed if the SumFields are provided
0009 //
0010 // Author: Chao Peng
0011 // Date: 06/02/2021
0012 
0013 #pragma once
0014 
0015 #include <DD4hep/IDDescriptor.h>
0016 #include <algorithms/algorithm.h>
0017 #include <algorithms/geo.h>
0018 #include <edm4eic/MCRecoCalorimeterHitAssociationCollection.h>
0019 #include <edm4eic/MCRecoCalorimeterHitLinkCollection.h>
0020 #include <edm4hep/EventHeaderCollection.h>
0021 #include <edm4hep/RawCalorimeterHitCollection.h>
0022 #include <edm4hep/SimCalorimeterHitCollection.h>
0023 #include <stdint.h>
0024 #include <functional>
0025 #include <string>
0026 #include <string_view>
0027 
0028 #include "CalorimeterHitDigiConfig.h"
0029 #include "algorithms/interfaces/UniqueIDGenSvc.h"
0030 #include "algorithms/interfaces/WithPodConfig.h"
0031 
0032 namespace eicrecon {
0033 
0034 using CalorimeterHitDigiAlgorithm = algorithms::Algorithm<
0035     algorithms::Input<edm4hep::EventHeaderCollection, edm4hep::SimCalorimeterHitCollection>,
0036     algorithms::Output<edm4hep::RawCalorimeterHitCollection,
0037                        edm4eic::MCRecoCalorimeterHitLinkCollection,
0038                        edm4eic::MCRecoCalorimeterHitAssociationCollection>>;
0039 
0040 class CalorimeterHitDigi : public CalorimeterHitDigiAlgorithm,
0041                            public WithPodConfig<CalorimeterHitDigiConfig> {
0042 
0043 public:
0044   CalorimeterHitDigi(std::string_view name)
0045       : CalorimeterHitDigiAlgorithm{
0046             name,
0047             {"eventHeader", "inputHitCollection"},
0048             {"outputRawHitCollection", "outputHitLinks", "outputRawHitAssociationCollection"},
0049             "Smear energy deposit, digitize within ADC range, add pedestal, "
0050             "convert time with smearing resolution, and sum signals."} {}
0051 
0052   void init() final;
0053   void process(const Input&, const Output&) const final;
0054 
0055 private:
0056   // unitless counterparts of inputs
0057   double stepTDC{0}, tRes{0};
0058 
0059   uint64_t id_mask{0};
0060 
0061   std::function<double(const edm4hep::SimCalorimeterHit& h)> corrMeanScale;
0062 
0063   dd4hep::IDDescriptor id_spec;
0064 
0065   enum readout_enum { kSimpleReadout, kPoissonPhotonReadout, kSipmReadout };
0066   enum readout_enum readoutType { kSimpleReadout };
0067 
0068 private:
0069   const algorithms::GeoSvc& m_geo         = algorithms::GeoSvc::instance();
0070   const algorithms::UniqueIDGenSvc& m_uid = algorithms::UniqueIDGenSvc::instance();
0071 };
0072 
0073 } // namespace eicrecon