File indexing completed on 2024-04-06 12:20:42
0001 #include "L1Trigger/L1THGCal/interface/veryfrontend/HGCalVFELinearizationImpl.h"
0002
0003 #include <cmath>
0004
0005 HGCalVFELinearizationImpl::HGCalVFELinearizationImpl(const edm::ParameterSet& conf)
0006 : linLSB_(conf.getParameter<double>("linLSB")),
0007 adcsaturation_(conf.getParameter<double>("adcsaturation")),
0008 tdcnBits_(conf.getParameter<uint32_t>("tdcnBits")),
0009 tdcOnset_(conf.getParameter<double>("tdcOnset")),
0010 adcnBits_(conf.getParameter<uint32_t>("adcnBits")),
0011 tdcsaturation_(conf.getParameter<double>("tdcsaturation")),
0012 linnBits_(conf.getParameter<uint32_t>("linnBits")),
0013 oot_coefficients_(conf.getParameter<std::vector<double>>("oot_coefficients")) {
0014 constexpr int kOot_order = 2;
0015 if (oot_coefficients_.size() != kOot_order) {
0016 throw cms::Exception("BadConfiguration") << "OOT subtraction needs " << kOot_order << " coefficients";
0017 }
0018 adcLSB_ = std::ldexp(adcsaturation_, -adcnBits_);
0019 tdcLSB_ = std::ldexp(tdcsaturation_, -tdcnBits_);
0020 linMax_ = (0x1 << linnBits_) - 1;
0021 }
0022
0023 void HGCalVFELinearizationImpl::linearize(const std::vector<HGCalDataFrame>& dataframes,
0024 std::vector<std::pair<DetId, uint32_t>>& linearized_dataframes) {
0025 constexpr int kIntimeSample = 2;
0026 constexpr int kOuttime1Sample = 1;
0027 constexpr int kOuttime2Sample = 0;
0028
0029 for (const auto& frame : dataframes) {
0030 double amplitude = 0.;
0031 if (frame[kIntimeSample].mode()) {
0032 amplitude = (std::floor(tdcOnset_ / adcLSB_) + 1.0) * adcLSB_ + double(frame[kIntimeSample].data()) * tdcLSB_;
0033 } else {
0034 double data = frame[kIntimeSample].data();
0035
0036 if (!frame[kOuttime1Sample].mode()) {
0037 data += oot_coefficients_[kOuttime1Sample] * frame[kOuttime1Sample].data();
0038 if (!frame[kOuttime2Sample].mode()) {
0039 data += oot_coefficients_[kOuttime2Sample] * frame[kOuttime2Sample].data();
0040 }
0041 }
0042 amplitude = std::max(0., data) * adcLSB_;
0043 }
0044 uint32_t amplitude_int = uint32_t(std::floor(amplitude / linLSB_ + 0.5));
0045 if (amplitude_int == 0)
0046 continue;
0047 if (amplitude_int > linMax_)
0048 amplitude_int = linMax_;
0049
0050 linearized_dataframes.emplace_back(frame.id(), amplitude_int);
0051 }
0052 }