CMS 3D CMS Logo

CalibPixel.h
Go to the documentation of this file.
1 #ifndef RecoLocalTracker_SiPixelClusterizer_plugins_alpaka_CalibPixel_h
2 #define RecoLocalTracker_SiPixelClusterizer_plugins_alpaka_CalibPixel_h
3 
4 #include <algorithm>
5 #include <cstdint>
6 #include <cstdio>
7 #include <type_traits>
8 
9 #include <alpaka/alpaka.hpp>
10 
20 
21 //#define GPU_DEBUG
22 
23 namespace calibPixel {
24  using namespace cms::alpakatools;
25 
27  // must be > MaxNumModules
28 
29  struct CalibDigis {
30  template <typename TAcc>
31  ALPAKA_FN_ACC void operator()(const TAcc& acc,
32  SiPixelClusterThresholds clusterThresholds,
34  SiPixelClustersSoAView clus_view,
36  int numElements) const {
37  const float VCaltoElectronGain = clusterThresholds.vCaltoElectronGain;
38  const float VCaltoElectronGain_L1 = clusterThresholds.vCaltoElectronGain_L1;
39  const float VCaltoElectronOffset = clusterThresholds.vCaltoElectronOffset;
40  const float VCaltoElectronOffset_L1 = clusterThresholds.vCaltoElectronOffset_L1;
41 
42  // zero for next kernels...
44  clus_view[0].clusModuleStart() = clus_view[0].moduleStart() = 0;
45  }
46 
48  acc, phase1PixelTopology::numberOfModules, [&](uint32_t i) { clus_view[i].clusInModule() = 0; });
50  auto dvgi = view[i];
51  if (dvgi.moduleId() != InvId) {
52  bool isDeadColumn = false, isNoisyColumn = false;
53  int row = dvgi.xx();
54  int col = dvgi.yy();
55  auto ret = SiPixelGainUtilities::getPedAndGain(gains, dvgi.moduleId(), col, row, isDeadColumn, isNoisyColumn);
56  float pedestal = ret.first;
57  float gain = ret.second;
58  if (isDeadColumn | isNoisyColumn) {
59  dvgi.moduleId() = InvId;
60  dvgi.adc() = 0;
61  printf("bad pixel at %d in %d\n", i, dvgi.moduleId());
62  } else {
63  float vcal = dvgi.adc() * gain - pedestal * gain;
64 
65  float conversionFactor = dvgi.moduleId() < 96 ? VCaltoElectronGain_L1 : VCaltoElectronGain;
66  float offset = dvgi.moduleId() < 96 ? VCaltoElectronOffset_L1 : VCaltoElectronOffset;
67 #ifdef GPU_DEBUG
68  auto old_adc = dvgi.adc();
69 #endif
70  dvgi.adc() = std::max(100, int(vcal * conversionFactor + offset));
71 #ifdef GPU_DEBUG
73  printf(
74  "module %d pixel %d -> old_adc = %d; vcal = %.2f; conversionFactor = %.2f; offset = %.2f; new_adc = "
75  "%d \n",
76  dvgi.moduleId(),
77  i,
78  old_adc,
79  vcal,
80  conversionFactor,
81  offset,
82  dvgi.adc());
83  }
84 #endif
85  }
86  }
87  });
88  }
89  };
91  template <typename TAcc>
92  ALPAKA_FN_ACC void operator()(const TAcc& acc,
93  SiPixelClusterThresholds clusterThresholds,
95  SiPixelClustersSoAView clus_view,
96  int numElements) const {
97  const float ElectronPerADCGain = clusterThresholds.electronPerADCGain;
98  const int8_t Phase2ReadoutMode = clusterThresholds.phase2ReadoutMode;
99  const uint16_t Phase2DigiBaseline = clusterThresholds.phase2DigiBaseline;
100  const uint8_t Phase2KinkADC = clusterThresholds.phase2KinkADC;
101 
102  // zero for next kernels...
104  clus_view[0].clusModuleStart() = clus_view[0].moduleStart() = 0;
105  }
106 
108  acc, phase2PixelTopology::numberOfModules, [&](uint32_t i) { clus_view[i].clusInModule() = 0; });
110  auto dvgi = view[i];
111  if (pixelClustering::invalidModuleId != dvgi.moduleId()) {
112  const int mode = (Phase2ReadoutMode < -1 ? -1 : Phase2ReadoutMode);
113  int adc_int = dvgi.adc();
114  if (mode < 0)
115  adc_int = int(adc_int * ElectronPerADCGain);
116  else {
117  if (adc_int < Phase2KinkADC)
118  adc_int = int((adc_int + 0.5) * ElectronPerADCGain);
119  else {
120  const int8_t dspp = (Phase2ReadoutMode < 10 ? Phase2ReadoutMode : 10);
121  const int8_t ds = int8_t(dspp <= 1 ? 1 : (dspp - 1) * (dspp - 1));
122  adc_int -= Phase2KinkADC;
123  adc_int *= ds;
124  adc_int += Phase2KinkADC;
125  adc_int = ((adc_int + 0.5 * ds) * ElectronPerADCGain);
126  }
127  adc_int += int(Phase2DigiBaseline);
128  }
129  dvgi.adc() = std::min(adc_int, int(std::numeric_limits<uint16_t>::max()));
130  }
131  });
132  }
133  };
134 } // namespace calibPixel
135 
136 #endif // RecoLocalTracker_SiPixelClusterizer_plugins_alpaka_CalibPixel_h
ALPAKA_FN_ACC void operator()(const TAcc &acc, SiPixelClusterThresholds clusterThresholds, SiPixelDigisSoAView view, SiPixelClustersSoAView clus_view, int numElements) const
Definition: CalibPixel.h:92
ret
prodAgent to be discontinued
constexpr uint16_t numberOfModules
ALPAKA_FN_ACC void for_each_element_in_grid_strided(const TAcc &acc, const Idx maxNumberOfElements, const Idx elementIdxShift, const Func func, const unsigned int dimIndex=0)
Definition: workdivision.h:975
constexpr float gains[NGAINS]
Definition: EcalConstants.h:20
ALPAKA_FN_ACC void operator()(const TAcc &acc, SiPixelClusterThresholds clusterThresholds, SiPixelDigisSoAView view, SiPixelClustersSoAView clus_view, const SiPixelGainCalibrationForHLTSoAConstView gains, int numElements) const
Definition: CalibPixel.h:31
uint16_t *__restrict__ uint16_t const *__restrict__ uint32_t const *__restrict__ uint32_t *__restrict__ uint32_t const *__restrict__ int32_t *__restrict__ uint32_t numElements
constexpr uint16_t InvId
Definition: CalibPixel.h:26
ALPAKA_FN_ACC constexpr bool once_per_grid(TAcc const &acc)
Definition: workdivision.h:793
ALPAKA_FN_HOST_ACC ALPAKA_FN_ACC static ALPAKA_FN_INLINE std::pair< float, float > getPedAndGain(const SiPixelGainCalibrationForHLTSoAConstView &view, uint32_t moduleInd, int col, int row, bool &isDeadColumn, bool &isNoisyColumn)
col
Definition: cuy.py:1009
constexpr uint16_t numberOfModules
constexpr uint16_t invalidModuleId