File indexing completed on 2024-07-03 04:17:41
0001 #ifndef DataFormats_HcalDigi_HcalDigiSoA_h
0002 #define DataFormats_HcalDigi_HcalDigiSoA_h
0003
0004
0005
0006
0007
0008 #include "DataFormats/Common/interface/StdArray.h"
0009 #include "DataFormats/SoATemplate/interface/SoALayout.h"
0010 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
0011
0012 namespace hcal {
0013
0014
0015 struct Flavor1 {
0016 static constexpr int WORDS_PER_SAMPLE = 1;
0017 static constexpr int SAMPLES_PER_WORD = 1;
0018 static constexpr int HEADER_WORDS = 1;
0019
0020 static constexpr uint8_t adc(uint16_t const* const sample_start) { return (*sample_start & 0xff); }
0021 static constexpr uint8_t tdc(uint16_t const* const sample_start) { return (*sample_start >> 8) & 0x3f; }
0022 static constexpr uint8_t soibit(uint16_t const* const sample_start) { return (*sample_start >> 14) & 0x1; }
0023 };
0024
0025
0026 struct Flavor3 {
0027 static constexpr int WORDS_PER_SAMPLE = 1;
0028 static constexpr int SAMPLES_PER_WORD = 1;
0029 static constexpr int HEADER_WORDS = 1;
0030
0031 static constexpr uint8_t adc(uint16_t const* const sample_start) { return (*sample_start & 0xff); }
0032 static constexpr uint8_t tdc(uint16_t const* const sample_start) { return ((*sample_start >> 8) & 0x3); }
0033 static constexpr uint8_t soibit(uint16_t const* const sample_start) { return ((*sample_start >> 14) & 0x1); }
0034 static constexpr uint8_t capid(uint16_t const* const sample_start) { return ((*sample_start >> 10) & 0x3); }
0035 };
0036
0037
0038 struct Flavor5 {
0039 static constexpr float WORDS_PER_SAMPLE = 0.5;
0040 static constexpr int SAMPLES_PER_WORD = 2;
0041 static constexpr int HEADER_WORDS = 1;
0042
0043 static constexpr uint8_t adc(uint16_t const* const sample_start, uint8_t const shifter) {
0044 return ((*sample_start >> shifter * 8) & 0x7f);
0045 }
0046 };
0047
0048 template <typename Flavor>
0049 constexpr uint8_t capid_for_sample(uint16_t const* const dfstart, uint32_t const sample) {
0050 auto const capid_first = (*dfstart >> 8) & 0x3;
0051 return (capid_first + sample) & 0x3;
0052 }
0053
0054 template <>
0055 constexpr uint8_t capid_for_sample<Flavor3>(uint16_t const* const dfstart, uint32_t const sample) {
0056 return Flavor3::capid(dfstart + Flavor3::HEADER_WORDS + sample * Flavor3::WORDS_PER_SAMPLE);
0057 }
0058
0059 template <typename Flavor>
0060 constexpr uint8_t soibit_for_sample(uint16_t const* const dfstart, uint32_t const sample) {
0061 return Flavor::soibit(dfstart + Flavor::HEADER_WORDS + sample * Flavor::WORDS_PER_SAMPLE);
0062 }
0063
0064 template <typename Flavor>
0065 constexpr uint8_t adc_for_sample(uint16_t const* const dfstart, uint32_t const sample) {
0066 return Flavor::adc(dfstart + Flavor::HEADER_WORDS + sample * Flavor::WORDS_PER_SAMPLE);
0067 }
0068
0069 template <typename Flavor>
0070 constexpr uint8_t tdc_for_sample(uint16_t const* const dfstart, uint32_t const sample) {
0071 return Flavor::tdc(dfstart + Flavor::HEADER_WORDS + sample * Flavor::WORDS_PER_SAMPLE);
0072 }
0073
0074 template <>
0075 constexpr uint8_t adc_for_sample<Flavor5>(uint16_t const* const dfstart, uint32_t const sample) {
0076
0077 return Flavor5::adc(dfstart + Flavor5::HEADER_WORDS + (sample >> 1), sample % 2);
0078 }
0079
0080 template <typename Flavor>
0081 constexpr uint32_t compute_stride(uint32_t const nsamples) {
0082 return static_cast<uint32_t>(nsamples * Flavor::WORDS_PER_SAMPLE) + Flavor::HEADER_WORDS;
0083 }
0084
0085 template <typename Flavor>
0086 constexpr uint32_t compute_nsamples(uint32_t const nwords) {
0087 if constexpr (Flavor::SAMPLES_PER_WORD >= 1)
0088 return (nwords - Flavor::HEADER_WORDS) * Flavor::SAMPLES_PER_WORD;
0089 else
0090 return (nwords - Flavor::HEADER_WORDS) / Flavor::WORDS_PER_SAMPLE;
0091 }
0092
0093 using QIE11dataArray = edm::StdArray<uint16_t, QIE11DigiCollection::MAXSAMPLES + Flavor1::HEADER_WORDS>;
0094 using QIE10dataArray = edm::StdArray<uint16_t, HBHEDataFrame::MAXSAMPLES + Flavor5::HEADER_WORDS>;
0095
0096
0097
0098
0099 GENERATE_SOA_LAYOUT(HcalPhase1DigiSoALayout,
0100 SOA_COLUMN(uint32_t, ids),
0101
0102 SOA_COLUMN(QIE11dataArray, data),
0103 SOA_SCALAR(uint32_t, stride),
0104 SOA_SCALAR(uint32_t, size))
0105 GENERATE_SOA_LAYOUT(HcalPhase0DigiSoALayout,
0106 SOA_COLUMN(uint32_t, ids),
0107 SOA_COLUMN(uint32_t, npresamples),
0108
0109 SOA_COLUMN(QIE10dataArray, data),
0110 SOA_SCALAR(uint32_t, stride),
0111 SOA_SCALAR(uint32_t, size))
0112
0113 using HcalPhase1DigiSoA = HcalPhase1DigiSoALayout<>;
0114 using HcalPhase0DigiSoA = HcalPhase0DigiSoALayout<>;
0115
0116 }
0117
0118 #endif