File indexing completed on 2024-04-23 22:56:02
0001 #ifndef CondFormats_SiPixelObjects_interface_alpaka_SiPixelGainCalibrationForHLTUtilities_h
0002 #define CondFormats_SiPixelObjects_interface_alpaka_SiPixelGainCalibrationForHLTUtilities_h
0003
0004 #include <cstdint>
0005
0006 #include <alpaka/alpaka.hpp>
0007
0008 #include "CondFormats/SiPixelObjects/interface/SiPixelGainCalibrationForHLTLayout.h"
0009
0010 struct SiPixelGainUtilities {
0011 ALPAKA_FN_HOST_ACC ALPAKA_FN_ACC ALPAKA_FN_INLINE static std::pair<float, float> getPedAndGain(
0012 const SiPixelGainCalibrationForHLTSoAConstView& view,
0013 uint32_t moduleInd,
0014 int col,
0015 int row,
0016 bool& isDeadColumn,
0017 bool& isNoisyColumn) {
0018 auto start = view.modStarts()[moduleInd];
0019 auto end = view.modEnds()[moduleInd];
0020 auto nCols = view.modCols()[moduleInd];
0021
0022 unsigned int lengthOfColumnData = (end - start) / nCols;
0023 unsigned int lengthOfAveragedDataInEachColumn = 2;
0024 unsigned int numberOfDataBlocksToSkip = row / view.numberOfRowsAveragedOver();
0025
0026 auto offset = start + col * lengthOfColumnData + lengthOfAveragedDataInEachColumn * numberOfDataBlocksToSkip;
0027 ALPAKA_ASSERT_ACC(offset < end);
0028 ALPAKA_ASSERT_ACC(offset < 3088384);
0029 ALPAKA_ASSERT_ACC(0 == offset % 2);
0030
0031 auto lp = view.v_pedestals();
0032 auto s = lp[offset / 2];
0033
0034 isDeadColumn = (s.ped & 0xFF) == view.deadFlag();
0035 isNoisyColumn = (s.ped & 0xFF) == view.noisyFlag();
0036 float decodeGain = float(s.gain & 0xFF) * view.gainPrecision() + view.minGain();
0037 float decodePed = float(s.ped & 0xFF) * view.pedPrecision() + view.minPed();
0038
0039 return std::make_pair(decodePed, decodeGain);
0040 };
0041 };
0042
0043 #endif