CMS 3D CMS Logo

mySiStripNoises.cc
Go to the documentation of this file.
2 #include <algorithm>
3 bool mySiStripNoises::put(const uint32_t DetId, InputVector& input) {
4  // put in SiStripNoises of DetId
5  std::vector<unsigned char> Vo_CHAR;
6  encode(input, Vo_CHAR);
7  Registry::iterator p = std::lower_bound(indexes.begin(), indexes.end(), DetId, mySiStripNoises::StrictWeakOrdering());
8  if (p != indexes.end() && p->detid == DetId)
9  return false;
10  size_t sd = Vo_CHAR.end() - Vo_CHAR.begin();
11  DetRegistry detregistry;
12  detregistry.detid = DetId;
13  detregistry.ibegin = v_noises.size();
14  detregistry.iend = v_noises.size() + sd;
15  indexes.insert(p, detregistry);
16  v_noises.insert(v_noises.end(), Vo_CHAR.begin(), Vo_CHAR.end());
17  return true;
18 }
19 
21  // get SiStripNoises Range of DetId
23  if (p == indexes.end() || p->detid != DetId)
24  return mySiStripNoises::Range(v_noises.end(), v_noises.end());
25  else
26  return mySiStripNoises::Range(v_noises.begin() + p->ibegin, v_noises.begin() + p->iend);
27 }
28 
29 void mySiStripNoises::getDetIds(std::vector<uint32_t>& DetIds) const {
30  // returns vector of DetIds in map
33  for (mySiStripNoises::RegistryIterator p = begin; p != end; ++p) {
34  DetIds.push_back(p->detid);
35  }
36 }
37 
38 float mySiStripNoises::getNoise(const uint16_t& strip, const Range& range) const {
39  return static_cast<float>(decode(strip, range) / 10.0);
40 }
41 
42 void mySiStripNoises::setData(float noise_, std::vector<short>& v) {
43  v.push_back((static_cast<int16_t>(noise_ * 10.0 + 0.5) & 0x01FF));
44 }
45 
46 void mySiStripNoises::encode(InputVector& Vi, std::vector<unsigned char>& Vo) {
47  static const uint16_t BITS_PER_STRIP = 9;
48  const size_t VoSize = (size_t)((Vi.size() * BITS_PER_STRIP) / 8 + .999);
49  Vo.resize(VoSize);
50  for (size_t i = 0; i < Vo.size(); ++i)
51  Vo[i] &= 0x00u;
52 
53  for (unsigned int stripIndex = 0; stripIndex < Vi.size(); ++stripIndex) {
54  unsigned char* data = &Vo[Vo.size() - 1];
55  uint32_t lowBit = stripIndex * BITS_PER_STRIP;
56  uint8_t firstByteBit = (lowBit & 0x7);
57  uint8_t firstByteNBits = 8 - firstByteBit;
58  uint8_t firstByteMask = 0xffu << firstByteBit;
59  uint8_t secondByteNbits = (BITS_PER_STRIP - firstByteNBits);
60  uint8_t secondByteMask = ~(0xffu << secondByteNbits);
61 
62  *(data - lowBit / 8) = (*(data - lowBit / 8) & ~(firstByteMask)) | ((Vi[stripIndex] & 0xffu) << firstByteBit);
63  *(data - lowBit / 8 - 1) =
64  (*(data - lowBit / 8 - 1) & ~(secondByteMask)) | ((Vi[stripIndex] >> firstByteNBits) & secondByteMask);
65  }
66 }
67 
68 uint16_t mySiStripNoises::decode(const uint16_t& strip, const Range& range) const {
69  const unsigned char* data = &*(range.second - 1); // pointer to the last byte of data
70  static const uint16_t BITS_PER_STRIP = 9;
71 
72  uint32_t lowBit = strip * BITS_PER_STRIP;
73  uint8_t firstByteBit = (lowBit & 7); //module 8
74  uint8_t firstByteNBits = 8 - firstByteBit;
75  uint8_t firstByteMask = 0xffu << firstByteBit;
76  uint8_t secondByteMask = ~(0xffu << (BITS_PER_STRIP - firstByteNBits));
77  uint16_t value = ((uint16_t(*(data - lowBit / 8)) & firstByteMask) >> firstByteBit) |
78  ((uint16_t(*(data - lowBit / 8 - 1)) & secondByteMask) << firstByteNBits);
79  return value;
80 }
static const char noise_[]
const Range getRange(const uint32_t &detID) const
Registry::const_iterator RegistryIterator
static std::string const input
Definition: EdmProvDump.cc:50
bool put(const uint32_t detID, InputVector &input)
__host__ __device__ std::uint32_t stripIndex(fedId_t fed, fedCh_t channel, stripId_t strip)
std::pair< ContainerIterator, ContainerIterator > Range
uint16_t decode(const uint16_t &strip, const Range &range) const
Definition: value.py:1
std::vector< DetRegistry > indexes
Definition: DetId.h:17
const std::vector< short > InputVector
void getDetIds(std::vector< uint32_t > &DetIds) const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:80
void setData(float noise_, std::vector< short > &vped)
float getNoise(const uint16_t &strip, const Range &range) const
std::vector< unsigned char > v_noises
void encode(InputVector &Vi, std::vector< unsigned char > &Vo_CHAR)