CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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:
64  buf += header2006.sizeInWords();
66  buf += alcts2006.sizeInWords();
67  break;
68 
69  case 2007:
71  buf += header2007.sizeInWords();
74  if (header2007.configPresent == 1) {
76  buf += virtexID.sizeInWords();
79  buf += configRegister.sizeInWords();
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: {
161  result = alcts2006.ALCTDigis();
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 =
246  result = bitset_utilities::append(header, alcts);
247 
248  bitset_utilities::bitsetToChar(result, (unsigned char *)data());
249  }
250 
251  else if (firmwareVersion == 2007) {
252  result = bitset_utilities::ushortToBitset(header2007.sizeInWords() * 16, (unsigned short *)&header2007);
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]);
257  result = bitset_utilities::append(result, alct);
258  }
259 
260  bitset_utilities::bitsetToChar(result, (unsigned char *)data());
261  }
262  return result;
263 }
264 
265 void CSCALCTHeader::selfTest(int firmware) {
266  firmwareVersion = firmware;
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
short unsigned int sizeInWords() const
short unsigned int sizeInWords() const
unsigned short int nLCTChipRead() const
for packing
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 ...
short unsigned int sizeInWords() const
CSCConfigurationRegister configRegister
string quality
CSCALCTHeader(int chamberType)
CSCALCTs2006 alcts2006
Log< level::Error, false > LogError
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:167
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 CSCID() const
Definition: CSCALCTHeader.h:61
tuple result
Definition: mps_fire.py:311
short unsigned int sizeInWords() const
uint16_t bitsInTime() const
Definition: CSCShowerDigi.h:32
unsigned short int theOriginalBuffer[116]
CSCALCTHeader2006 header2006
void setFromBuffer(unsigned short const *buf)
static short unsigned int sizeInWords()
std::vector< CSCALCT > theALCTs
void add(const std::vector< CSCALCTDigi > &digis)
CSCALCTHeader2007 header2007
void setFromBuffer(unsigned short const *buf)
boost::dynamic_bitset pack()
unsigned short iChamberType() const
Definition: CSCDetId.h:96
void setEventInformation(const CSCDMBHeader &)
unsigned short int sizeInWords2007_
size of the 2007 header in words
int sizeInWords()
in 16-bit words
std::vector< CSCALCTDigi > ALCTDigis() const
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
std::vector< CSCALCTDigi > ALCTDigis() const
unsigned short int L1Acc() const
Definition: CSCALCTHeader.h:98
void add(const std::vector< CSCALCTDigi > &digis)
should try to sort, but doesn&#39;t for now
unsigned short int NTBins() const
Definition: CSCALCTHeader.h:43
const uint16_t * header() const
Data Accessors.
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.
unsigned short int BXNCount() const
Definition: CSCALCTHeader.h:62
static std::atomic< bool > debug
unsigned short int * data()
unsigned short nLCTChipRead() const