CMS 3D CMS Logo

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