CMS 3D CMS Logo

CSCALCTHeader.cc
Go to the documentation of this file.
6 #include <iomanip>
7 
8 #ifdef LOCAL_UNPACK
9 
10 bool CSCALCTHeader::debug = false;
11 short unsigned int CSCALCTHeader::firmwareVersion = 2007;
12 
13 #else
14 
15 #include <atomic>
16 
17 std::atomic<bool> CSCALCTHeader::debug{false};
18 std::atomic<short unsigned int> CSCALCTHeader::firmwareVersion{2007};
19 
20 #endif
21 
23  : header2006(chamberType), header2007(chamberType) { //constructor for digi->raw packing based on header2006
24  if (firmwareVersion == 2006) {
26  } else if (firmwareVersion == 2007) {
28  // assume no virtex or masks or registers
30  theALCTs.resize(header2007.lctBins * 2);
31  } else {
32  edm::LogError("CSCALCTHeader|CSCRawToDigi")
33  << "Cannot construct ALCT header: ALCT firmware version is bad/not defined!" << firmwareVersion;
34  }
35 }
36 
37 CSCALCTHeader::CSCALCTHeader(const unsigned short *buf) {
42  constexpr unsigned short int collisionMaskWordcount[7] = {8, 8, 12, 16, 16, 24, 28};
43  constexpr unsigned short int hotChannelMaskWordcount[7] = {18, 18, 24, 36, 36, 48, 60};
44 
46  if (buf[0] == 0xDB0A) {
47  firmwareVersion = 2007;
48  } else if ((buf[0] & 0xF800) == 0x6000) {
49  firmwareVersion = 2006;
50  } else {
51  edm::LogError("CSCALCTHeader|CSCRawToDigi") << "failed to determine ALCT firmware version!!";
52  }
53 
54  LogTrace("CSCALCTHeader|CSCRawToDigi") << "firmware version - " << firmwareVersion;
55 
57 #ifdef LOCAL_UNPACK
58  switch (firmwareVersion) {
59 #else
60  switch (firmwareVersion.load()) {
61 #endif
62  case 2006:
67  break;
68 
69  case 2007:
74  if (header2007.configPresent == 1) {
81 
82  collisionMasks.resize(collisionMaskWordcount[header2007.boardType]);
83  for (unsigned int i = 0; i < collisionMaskWordcount[header2007.boardType]; ++i) {
84  collisionMasks[i].setFromBuffer(buf);
85  buf += collisionMasks[i].sizeInWords();
86  sizeInWords2007_ += collisionMasks[i].sizeInWords();
87  }
88 
89  hotChannelMasks.resize(hotChannelMaskWordcount[header2007.boardType]);
90  for (unsigned int i = 0; i < hotChannelMaskWordcount[header2007.boardType]; ++i) {
91  hotChannelMasks[i].setFromBuffer(buf);
92  buf += hotChannelMasks[i].sizeInWords();
93  sizeInWords2007_ += hotChannelMasks[i].sizeInWords();
94  }
95  }
96 
97  theALCTs.resize(header2007.lctBins * 2);
98  for (int i = 0; i < header2007.lctBins * 2; ++i) {
99  theALCTs[i].setFromBuffer(buf);
100  buf += theALCTs[i].sizeInWords();
101  sizeInWords2007_ += theALCTs[i].sizeInWords();
102  }
103 
104  ALCTDigis();
105  break;
106 
107  default:
108  edm::LogError("CSCALCTHeader|CSCRawToDigi") << "couldn't construct: ALCT firmware version is bad/not defined!";
109  break;
110  }
111 
113  if ((firmwareVersion == 2006) || (firmwareVersion == 2007))
114  memcpy(theOriginalBuffer, buf - sizeInWords(), sizeInWords() * 2);
115 }
116 
118 
120 #ifdef LOCAL_UNPACK
121  switch (firmwareVersion) {
122 #else
123  switch (firmwareVersion.load()) {
124 #endif
125  case 2006: {
127  break;
128  }
129  case 2007: {
131  break;
132  }
133  default:
134  edm::LogError("CSCALCTHeader|CSCRawToDigi")
135  << "setEventInformation: ALCT firmware version is bad/not defined!" << firmwareVersion;
136  break;
137  }
138 }
139 
140 unsigned short CSCALCTHeader::nLCTChipRead() const {
141  if (firmwareVersion == 2006) {
142  return header2006.nLCTChipRead();
143  } else {
144  // nLCTChip obsolete in ALCT2007 format (email Andrey K. & Victor B., 20.10.2008)
145  // and we don't think anyone makes uses of this call.
146  // edm::LogError("CSCALCTHeader|CSCRawToDigi")
147  // <<"How is nLCTChipRead() supposed to work for ALCTHeader2007?";
148  }
149  return 0;
150 }
151 
152 std::vector<CSCALCTDigi> CSCALCTHeader::ALCTDigis() const {
153  std::vector<CSCALCTDigi> result;
154 
155 #ifdef LOCAL_UNPACK
156  switch (firmwareVersion) {
157 #else
158  switch (firmwareVersion.load()) {
159 #endif
160  case 2006: {
162  break;
163  }
164  case 2007: {
165  result.reserve(theALCTs.size());
166  for (unsigned int i = 0; i < theALCTs.size(); ++i) {
167  CSCALCTDigi digi(theALCTs[i].valid,
168  theALCTs[i].quality,
169  theALCTs[i].accel,
170  theALCTs[i].pattern,
171  theALCTs[i].keyWire,
172  (int)i / 2,
173  i % 2 + 1);
174  result.push_back(digi);
175  }
176  break;
177  }
178  default:
179  edm::LogError("CSCALCTHeader|CSCRawToDigi")
180  << "Empty Digis: ALCT firmware version is bad/not defined!" << firmwareVersion;
181  break;
182  }
183  for (unsigned i = 0; i < result.size(); ++i) {
184  result[i].setFullBX(BXNCount());
185  }
186  return result;
187 }
188 
189 void CSCALCTHeader::add(const std::vector<CSCALCTDigi> &digis) {
190  if (firmwareVersion == 2006) {
191  alcts2006.add(digis);
192  } else if (firmwareVersion == 2007) {
193  if (theALCTs.empty()) {
194  theALCTs.resize(header2007.lctBins * 2);
195  }
196  for (std::vector<CSCALCTDigi>::const_iterator digi = digis.begin(); digi != digis.end(); ++digi) {
197  int bx = digi->getBX();
198  if (bx < (int)header2007.lctBins) {
199  // 2 ALCTs per bx
200  int i = bx * 2;
201  int q1 = theALCTs[i].quality;
202  int q2 = theALCTs[i + 1].quality;
203  // see if it's non=blank
204  if (!theALCTs[i].valid) {
205  theALCTs[i] = CSCALCT(*digi);
206  }
207  // new best LCT
208  else if (digi->getQuality() > q1) {
209  theALCTs[i + 1] = theALCTs[i];
210  theALCTs[i] = CSCALCT(*digi);
211  }
212  // new second best
213  else if (!theALCTs[i + 1].valid || (digi->getQuality() > q2)) {
214  theALCTs[i + 1] = CSCALCT(*digi);
215  }
216  }
217  }
218  }
219 }
220 
222 void CSCALCTHeader::addShower(const std::vector<CSCShowerDigi> &digis) {
223  if (firmwareVersion == 2007) {
224  if (theALCTs.empty()) {
225  theALCTs.resize(header2007.lctBins * 2);
226  }
227  for (std::vector<CSCShowerDigi>::const_iterator digi = digis.begin(); digi != digis.end(); ++digi) {
228  int bx = digi - digis.begin();
229  if (bx < (int)header2007.lctBins) {
230  const CSCShowerDigi &digi = digis[bx];
231  int i = bx * 2;
232  unsigned hmt_bits = digi.isValid() ? digi.bitsInTime() : 0;
233  theALCTs[i].reserved = hmt_bits & 0x3;
234  theALCTs[i + 1].reserved = hmt_bits & 0x3;
235  }
236  }
237  }
238 }
239 
240 boost::dynamic_bitset<> CSCALCTHeader::pack() {
241  boost::dynamic_bitset<> result;
242  if (firmwareVersion == 2006) {
243  boost::dynamic_bitset<> header =
245  boost::dynamic_bitset<> alcts =
248 
249  bitset_utilities::bitsetToChar(result, (unsigned char *)data());
250  }
251 
252  else if (firmwareVersion == 2007) {
254 
255  for (unsigned i = 0; i < theALCTs.size(); ++i) {
256  boost::dynamic_bitset<> alct =
257  bitset_utilities::ushortToBitset(theALCTs[i].sizeInWords() * 16, (unsigned short *)&theALCTs[i]);
259  }
260 
261  bitset_utilities::bitsetToChar(result, (unsigned char *)data());
262  }
263  return result;
264 }
265 
268  CSCALCTDigi alct0(true, 1, 1, 1, 10, 6, 1);
269  CSCALCTDigi alct1(true, 1, 1, 0, 11, 6, 2);
270 
271  // tests packing and unpacking
272  for (int station = 1; station <= 4; ++station) {
273  CSCDetId detId(1, station, 1, 1, 0);
274 
275  std::vector<CSCALCTDigi> oldAlcts;
276  oldAlcts.push_back(alct0);
277  oldAlcts.push_back(alct1);
278  CSCALCTHeader alctHeader(detId.iChamberType());
279 
280  alctHeader.add(oldAlcts);
281 
282  std::vector<CSCALCTDigi> alcts = alctHeader.ALCTDigis();
283  // pick out the valid ones
284  std::vector<CSCALCTDigi> validALCTs;
285  for (std::vector<CSCALCTDigi>::const_iterator alctItr = alcts.begin(); alctItr != alcts.end(); ++alctItr) {
286  if (alctItr->isValid()) {
287  validALCTs.push_back(*alctItr);
288  }
289  }
290  assert(validALCTs[0] == alct0);
291  assert(validALCTs[1] == alct1);
292  //cscClassPackerCompare(alctHeader);
293  }
294 }
295 
296 std::ostream &operator<<(std::ostream &os, const CSCALCTHeader &header) {
297  os << "ALCT HEADER CSCID " << header.CSCID() << " L1ACC " << header.L1Acc() << std::endl;
298  os << " time samples " << header.NTBins() << std::endl;
299  return os;
300 }
std::vector< CSCHotChannelMask > hotChannelMasks
std::vector< CSCCollisionMask > collisionMasks
CSCVirtexID virtexID
boost::dynamic_bitset append(const boost::dynamic_bitset<> &bs1, const boost::dynamic_bitset<> &bs2)
this method takes two bitsets bs1 and bs2 and returns result of bs2 appended to the end of bs1 ...
bool isValid() const
data
CSCConfigurationRegister configRegister
CSCALCTHeader(int chamberType)
CSCALCTs2006 alcts2006
Log< level::Error, false > LogError
unsigned short iChamberType() const
Definition: CSCDetId.h:96
assert(be >=bs)
void setEventInformation(const CSCDMBHeader &)
void setFromBuffer(unsigned short const *buf)
static std::atomic< unsigned short int > firmwareVersion
static void selfTest(int firmware)
tests that we unpack what we packed
void setEventInformation(const CSCDMBHeader &)
#define LogTrace(id)
unsigned short int theOriginalBuffer[116]
string quality
unsigned short nLCTChipRead() const
CSCALCTHeader2006 header2006
void setFromBuffer(unsigned short const *buf)
static short unsigned int sizeInWords()
std::ostream & operator<<(std::ostream &os, const CSCALCTHeader &header)
std::vector< CSCALCT > theALCTs
short unsigned int sizeInWords() const
void add(const std::vector< CSCALCTDigi > &digis)
CSCALCTHeader2007 header2007
void setFromBuffer(unsigned short const *buf)
boost::dynamic_bitset pack()
short unsigned int sizeInWords() const
void setEventInformation(const CSCDMBHeader &)
unsigned short int sizeInWords2007_
size of the 2007 header in words
std::vector< CSCALCTDigi > ALCTDigis() const
int sizeInWords()
in 16-bit words
unsigned short int BXNCount() const
Definition: CSCALCTHeader.h:62
void setFromBuffer(unsigned short const *buf)
void bitsetToChar(const boost::dynamic_bitset<> &bs, unsigned char *result)
this method takes bitset obj and returns char * array
void add(const std::vector< CSCALCTDigi > &digis)
should try to sort, but doesn&#39;t for now
uint16_t bitsInTime() const
Definition: CSCShowerDigi.h:48
std::vector< CSCALCTDigi > ALCTDigis() const
short unsigned int sizeInWords() const
boost::dynamic_bitset ushortToBitset(const unsigned int numberOfBits, unsigned short *buf)
this method takes numberOfBits bits from unsigned short * array and returns them in the bitset obj...
short unsigned int sizeInWords() const
for packing
void setFromBuffer(unsigned short const *buf)
void addShower(const std::vector< CSCShowerDigi > &digis)
Add Run3 ALCT HMT shower bits.
short unsigned int sizeInWords() const
static std::atomic< bool > debug
const uint16_t * header() const
Data Accessors.
unsigned short int * data()
unsigned short int nLCTChipRead() const
for packing