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  theALCTs[i].reserved = digi.bitsInTime() & 0x3;
233  theALCTs[i + 1].reserved = digi.bitsInTime() & 0x3;
234  }
235  }
236  }
237 }
238 
239 boost::dynamic_bitset<> CSCALCTHeader::pack() {
240  boost::dynamic_bitset<> result;
241  if (firmwareVersion == 2006) {
242  boost::dynamic_bitset<> header =
244  boost::dynamic_bitset<> alcts =
247 
248  bitset_utilities::bitsetToChar(result, (unsigned char *)data());
249  }
250 
251  else if (firmwareVersion == 2007) {
253 
254  for (unsigned i = 0; i < theALCTs.size(); ++i) {
255  boost::dynamic_bitset<> alct =
256  bitset_utilities::ushortToBitset(theALCTs[i].sizeInWords() * 16, (unsigned short *)&theALCTs[i]);
258  }
259 
260  bitset_utilities::bitsetToChar(result, (unsigned char *)data());
261  }
262  return result;
263 }
264 
267  CSCALCTDigi alct0(true, 1, 1, 1, 10, 6, 1);
268  CSCALCTDigi alct1(true, 1, 1, 0, 11, 6, 2);
269 
270  // tests packing and unpacking
271  for (int station = 1; station <= 4; ++station) {
272  CSCDetId detId(1, station, 1, 1, 0);
273 
274  std::vector<CSCALCTDigi> oldAlcts;
275  oldAlcts.push_back(alct0);
276  oldAlcts.push_back(alct1);
277  CSCALCTHeader alctHeader(detId.iChamberType());
278 
279  alctHeader.add(oldAlcts);
280 
281  std::vector<CSCALCTDigi> alcts = alctHeader.ALCTDigis();
282  // pick out the valid ones
283  std::vector<CSCALCTDigi> validALCTs;
284  for (std::vector<CSCALCTDigi>::const_iterator alctItr = alcts.begin(); alctItr != alcts.end(); ++alctItr) {
285  if (alctItr->isValid()) {
286  validALCTs.push_back(*alctItr);
287  }
288  }
289  assert(validALCTs[0] == alct0);
290  assert(validALCTs[1] == alct1);
291  //cscClassPackerCompare(alctHeader);
292  }
293 }
294 
295 std::ostream &operator<<(std::ostream &os, const CSCALCTHeader &header) {
296  os << "ALCT HEADER CSCID " << header.CSCID() << " L1ACC " << header.L1Acc() << std::endl;
297  os << " time samples " << header.NTBins() << std::endl;
298  return os;
299 }
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 ...
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]
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:32
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
string quality
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