Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-07-03 04:17:41

0001 #ifndef DataFormats_HcalDigi_HcalDigiSoA_h
0002 #define DataFormats_HcalDigi_HcalDigiSoA_h
0003 
0004 //TODO: Use Eigen column for data(?)
0005 //#include <Eigen/Core>
0006 //#include <Eigen/Dense>
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   // FLAVOR_HE_QIE11 = 1; Phase1 upgrade
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   // FLAVOR_HB_QIE11 = 3; Phase1 upgrade
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   // FLAVOR_HB_QIE10 = 5; Phase0
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;  // same as % 4
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     // avoid using WORDS_PER_SAMPLE and simply shift
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   //using QIE11dataVector = Eigen::Matrix<uint16_t,  QIE11DigiCollection::MAXSAMPLES, 1>;
0097   //using QIE10dataVector = Eigen::Matrix<uint16_t,  HBHEDataFrame::MAXSAMPLES, 1>;
0098 
0099   GENERATE_SOA_LAYOUT(HcalPhase1DigiSoALayout,
0100                       SOA_COLUMN(uint32_t, ids),
0101                       //SOA_EIGEN_COLUMN(QIE11dataVector, data),
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                       //SOA_EIGEN_COLUMN(QIE10dataVector, data),
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 }  // namespace hcal
0117 
0118 #endif