CMS 3D CMS Logo

generateQIEShapes.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <sstream>
3 #include <vector>
4 
5 //
6 // Pregenerate QIE Shapes using hardcoded arrays
7 // This is taken directly from CondFormats/HcalObjects/srcHcalQIEData.cc
8 // This generation is running upon conditions retrieval typically for the cpu workload
9 //
10 // For the GPU workload, it is better to put generated values into constant memory.
11 // Either this or just use global memory (for global mem, we need getters...).
12 // Choosign constant memory as thsese
13 // values are statically known and never change. Any change in any case requires
14 // recompilation!
15 //
16 
17 const float binMin[32] = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
18  16, 18, 20, 22, 24, 26, 28, 31, 34, 37, 40, 44, 48, 52, 57, 62};
19 
20 const float binMin2[64] = {-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
21  10.5, 11.5, 12.5, 13.5, 14.5, // 16 bins with width 1x
22  15.5, 17.5, 19.5, 21.5, 23.5, 25.5, 27.5, 29.5, 31.5, 33.5, 35.5,
23  37.5, 39.5, 41.5, 43.5, 45.5, 47.5, 49.5, 51.5, 53.5, // 20 bins with width 2x
24  55.5, 59.5, 63.5, 67.5, 71.5, 75.5, 79.5, 83.5, 87.5, 91.5, 95.5,
25  99.5, 103.5, 107.5, 111.5, 115.5, 119.5, 123.5, 127.5, 131.5, 135.5, // 21 bins with width 4x
26  139.5, 147.5, 155.5, 163.5, 171.5, 179.5, 187.5}; // 7 bins with width 8x
27 
28 constexpr uint32_t nbins_qie8 = 32;
29 constexpr uint32_t nbins_qie11 = 64;
30 
31 void dump(std::vector<float> const& vec, std::string const& name) {
32  std::stringstream str;
33  str << "float const " << name << "[" << vec.size() << "] = {";
34  uint32_t counter = 0;
35  for (auto const& value : vec) {
36  if (counter % 8 == 0)
37  str << std::endl;
38  if (counter == vec.size() - 1)
39  str << value;
40  else
41  str << value << ", ";
42  counter++;
43  }
44  str << "};";
45  std::cout << str.str() << std::endl;
46 }
47 
48 void generate(uint32_t const nbins, float const* initValues, std::vector<float>& values) {
49  // preset the first range
50  for (uint32_t adc = 0; adc < nbins; adc++)
51  values[adc] = initValues[adc];
52 
53  // do the rest
54  int scale = 1;
55  for (uint32_t range = 1; range < 4; range++) {
56  int factor = nbins == 32 ? 5 : 8;
57  scale *= factor;
58 
59  auto const index_offset = range * nbins;
60  uint32_t const overlap = nbins == 32 ? 2 : 3;
61  values[index_offset] = values[index_offset - overlap];
62 
63  for (uint32_t i = 1; i < nbins; i++)
64  values[index_offset + i] = values[index_offset + i - 1] + scale * (values[i] - values[i - 1]);
65  }
66 
67  values[nbins * 4] = 2 * values[nbins * 4 - 1] - values[nbins * 4 - 2];
68 }
69 
70 int main(int argc, char* argv[]) {
71  //
72  // run 128 bins
73  //
74  std::vector<float> valuesqie8(nbins_qie8 * 4 + 1), valuesqie11(nbins_qie11 * 4 + 1);
75  generate(nbins_qie8, binMin, valuesqie8);
76  generate(nbins_qie11, binMin2, valuesqie11);
77 
78  dump(valuesqie8, std::string{"qie8shape"});
79  dump(valuesqie11, std::string{"qie11shape"});
80 
81  return 0;
82 }
constexpr uint32_t nbins_qie8
void dump(std::vector< float > const &vec, std::string const &name)
void generate(uint32_t const nbins, float const *initValues, std::vector< float > &values)
constexpr uint32_t nbins_qie11
const float binMin2[64]
Definition: value.py:1
int main(int argc, char *argv[])
const float binMin[32]
#define str(s)
uint16_t *__restrict__ uint16_t const *__restrict__ adc