18 : theDMBHeader(format_version),
23 theDMBTrailer(format_version),
24 theChamberType(chamberType),
27 theFormatVersion(format_version) {
41 const uint16_t*
pos = buf;
43 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"The event data ";
44 for (
int i = 0;
i < 16; ++
i) {
45 LogTrace(
"CSCEventData|CSCRawToDigi") << std::hex << pos[
i] <<
" ";
51 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Bad DMB Header??? " 52 <<
" first four words: ";
53 for (
int i = 0;
i < 4; ++
i) {
54 LogTrace(
"CSCEventData|CSCRawToDigi") << std::hex << pos[
i] <<
" ";
59 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"nalct = " <<
nalct();
60 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"nclct = " <<
nclct();
75 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"+++WARNING: Corrupt ALCT data - won't attempt to decode";
102 int sizeInWord_ZSE = 0;
111 int nWG_round_up =
int(nWGs_per_layer / 12) + (nWGs_per_layer % 3 ? 1 : 0);
113 const uint16_t* posZSE = pos;
114 std::vector<unsigned short> alctZSErecoveredVector;
115 alctZSErecoveredVector.clear();
139 int alctZSErecoveredPos = 0;
140 while (*posZSE != 0xDE0D) {
141 if ((*posZSE == 0x1000) && (*posZSE != 0x3000)) {
142 for (
int j = 0;
j < nWG_round_up;
j++) {
143 alctZSErecoveredVector.push_back(0x0000);
145 alctZSErecoveredPos += nWG_round_up;
147 alctZSErecoveredVector.push_back(*posZSE);
148 ++alctZSErecoveredPos;
157 for (
int l = 0;
l < (
int)alctZSErecoveredVector.size();
l++) {
179 pos += sizeInWord_ZSE;
190 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Error:nalct reported but no ALCT data found!!!";
200 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Error:nclct reported but no TMB data found!!!";
205 bool dmbTrailerReached =
false;
206 for (
int i = 0;
i < 12000; ++
i)
208 dmbTrailerReached = (*(
i + pos) & 0xF000) == 0xF000 && (*(
i + pos + 1) & 0xF000) == 0xF000 &&
209 (*(
i + pos + 2) & 0xF000) == 0xF000 && (*(
i + pos + 3) & 0xF000) == 0xF000 &&
210 (*(
i + pos + 4) & 0xF000) == 0xE000 && (*(
i + pos + 5) & 0xF000) == 0xE000 &&
211 (*(
i + pos + 6) & 0xF000) == 0xE000 && (*(
i + pos + 7) & 0xF000) == 0xE000;
212 if (dmbTrailerReached) {
218 if (dmbTrailerReached) {
219 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb) {
224 if (cfeb_available == 1) {
225 if ((cfebTimeout >> icfeb) & 1) {
227 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"CFEB Timed out! ";
233 bool isDCFEB =
false;
245 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Critical Error: DMB Trailer was not found!!! ";
252 return (((buf[0] & 0xFFFF) == 0xDB0A) || (((buf[0] & 0xF800) == 0x6000) && ((buf[1] & 0xF800) == 0)));
275 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb) {
295 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb) {
312 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb) {
323 std::vector<CSCStripDigi>
result;
324 for (
unsigned icfeb = 0; icfeb <
MAX_CFEB; ++icfeb) {
325 std::vector<CSCStripDigi> newDigis =
stripDigis(idlayer, icfeb);
326 result.insert(result.end(), newDigis.begin(), newDigis.end());
333 std::vector<CSCStripDigi>
result;
336 result.insert(result.end(), newDigis.begin(), newDigis.end());
344 return std::vector<CSCWireDigi>();
351 std::vector<std::vector<CSCStripDigi> >
result;
352 for (
int layer = 1; layer <= 6; ++layer) {
353 std::vector<CSCStripDigi> digis =
stripDigis(layer);
354 result.push_back(digis);
360 std::vector<std::vector<CSCWireDigi> >
result;
361 for (
int layer = 1; layer <= 6; ++layer) {
430 for (
unsigned cfeb = 0; cfeb < 7; cfeb++) {
469 unsigned cfeb = (digi.
getStrip() - 1) / 16;
470 bool sixteenSamples =
false;
472 sixteenSamples =
true;
474 bool isDCFEB =
false;
516 for (
int ilayer = 1; ilayer <= 6; ++ilayer) {
527 boost::dynamic_bitset<>
result =
531 std::vector<std::pair<unsigned int, unsigned short*> > crcvec;
539 boost::dynamic_bitset<> anodeData =
555 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb) {
573 for (
unsigned int n = 0;
n < vec.size();
n++) {
575 for (uint16_t
j = 0,
w = 0;
j < vec[
n].first;
j++) {
576 if (vec[
n].
second !=
nullptr) {
577 w = vec[
n].second[
j] & 0xffff;
578 for (uint32_t
i = 15,
t = 0, ncrc = 0;
i < 16;
i--) {
579 t = ((
w >>
i) & 1) ^ ((CRC >> 21) & 1);
580 ncrc = (CRC << 1) & 0x3ffffc;
581 ncrc |= (
t ^ (CRC & 1)) << 1;
596 std::vector<CSCCLCTDigi> clctDigis;
599 clctDigis.push_back(
CSCCLCTDigi(1, 1, 4, 1, 0, 30, 3, 2, 1));
600 clctDigis.push_back(
CSCCLCTDigi(1, 1, 2, 1, 1, 31, 1, 2, 2));
604 std::vector<CSCCorrelatedLCTDigi> corrDigis;
605 corrDigis.push_back(
CSCCorrelatedLCTDigi(1, 1, 2, 10, 98, 5, 0, 1, 0, 0, 0, 0));
606 corrDigis.push_back(
CSCCorrelatedLCTDigi(2, 1, 2, 20, 15, 9, 1, 0, 0, 0, 0, 0));
608 chamberData.
add(clctDigis);
609 chamberData.
add(corrDigis);
613 chamberData.
add(wireDigi, 3);
614 chamberData.
add(comparatorDigi, 3);
632 std::vector<int> sca(16, 600);
633 std::vector<unsigned short> overflow(16, 0),
overlap(16, 0), errorfl(16, 0);
640 forward.
add(me1a, me1adet1.
layer());
641 forward.
add(me1b, me1bdet1.
layer());
642 backward.
add(me1a, me1adet2.
layer());
643 backward.
add(me1b, me1adet2.
layer());
644 std::vector<CSCStripDigi> me1afs = forward.
stripDigis(me1adet1);
645 std::vector<CSCStripDigi> me1bfs = forward.
stripDigis(me1bdet1);
646 std::vector<CSCStripDigi> me1abs = backward.
stripDigis(me1adet2);
647 std::vector<CSCStripDigi> me1bbs = backward.
stripDigis(me1bdet2);
650 assert(me1afs.size() == 16);
651 assert(me1bfs.size() == 16);
652 assert(me1abs.size() == 16);
653 assert(me1bbs.size() == 16);
655 assert(me1afs[4].getStrip() == 5);
656 assert(me1bfs[7].getStrip() == 8);
657 assert(me1abs[4].getStrip() == 5);
658 assert(me1bbs[7].getStrip() == 8);
659 assert(me1afs[4].
pedestal() == 600);
660 assert(me1bfs[7].
pedestal() == 600);
661 assert(me1abs[4].
pedestal() == 600);
662 assert(me1bbs[7].
pedestal() == 600);
void unpack_data(const uint16_t *buf)
void setEventInformation(int bxnum, int lvl1num)
unsigned short int sizeInWords() const
the amount of the input binary buffer read, in 16-bit words
unsigned int calcALCTcrc(std::vector< std::pair< unsigned int, unsigned short * > > &vec)
unsigned short * alctZSErecovered
Auxiliary bufer to recove the ALCT raw payload from zero suppression.
int nclct() const
the number of CLCTs
uint16_t theFormatVersion
Output Format Version (2005, 2013)
std::vector< std::vector< CSCStripDigi > > stripDigis() const
deprecated. Use the above methods instead
#define MAX_CFEB
Maximum available CFEBs per chamber (for old system 5, for new ME11 should be 7)
void checkALCTClasses()
makes new ALCT classes, if needed
std::vector< std::vector< CSCWireDigi > > wireDigis() const
deprecated. Use the above method instead.
boost::dynamic_bitset pack()
not const because it sets size int TMBTrailer
std::vector< int > const & getADCCounts() const
Get ADC readings.
unsigned cfeb_endtimeout() const
const CSCDMBTrailer * dmbTrailer() const
DMB trailer.
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 ...
const unsigned short size() const
void checkTMBClasses()
makes new TMB classes, if needed
void add(const CSCStripDigi &, int layer)
void setL1A(unsigned l1a)
constexpr uint32_t rawId() const
get the raw id
unsigned sizeInWords() const
CSCAnodeData * alctData() const
user must check if nalct > 0
std::vector< CSCWireDigi > wireDigis(unsigned ilayer) const
CSCALCTHeader * alctHeader() const
user must check if nalct > 0
int nalct() const
the flag for existence of ALCT data
static int sizeInWords()
in 16-bit frames
bool isALCT(const uint16_t *buf)
if dealing with ALCT data
U second(std::pair< T, U > const &p)
CSCDMBHeader theDMBHeader
CSCCLCTData * clctData() const
user must check if nclct > 0
void digis(uint32_t idlayer, std::vector< CSCStripDigi > &result) const
faster way to get to digis
CSCALCTTrailer * alctTrailer() const
user must check if nalct > 0
CSCALCTHeader * theALCTHeader
unsigned cfeb_starttimeout() const
std::vector< CSCStripDigi > stripDigis(const CSCDetId &idlayer) const
returns all the strip digis in the chamber, with the comparator information.
std::ostream & operator<<(std::ostream &os, const CSCEventData &evt)
CSCTMBData * tmbData() const
user must check in nclct > 0
void add(const CSCWireDigi &wireDigi, int layer)
CSCDMBTrailer theDMBTrailer
CSCEventData operator=(const CSCEventData &data)
CSCCFEBData * theCFEBData[7]
for up to MAX_CFEB CFEB boards
CSCALCTTrailer * theALCTTrailer
int getWireGroup() const
default
void copy(const CSCEventData &)
int getWireGroupBX() const
return BX assigned for the wire group (16 upper bits from the wire group number)
std::vector< CSCWireDigi > wireDigis(int layer) const
input layer is from 1 to 6
void add(const CSCComparatorDigi &digi, int layer)
TODO for packing. Doesn't do flipping yet.
bool isTMB(const uint16_t *buf)
if dealing with TMB data
unsigned sizeInWords() const
unsigned short size() const
size of the data buffer used, in bytes
bool cscPackerCompare(const T &t1, const T &t2)
void add(const CSCStripDigi &, int layer)
routines to add digis to the data
CSCTMBHeader * tmbHeader()
CSCTMBHeader * tmbHeader() const
user must check if nclct > 0
const CSCCFEBData * cfebData(unsigned icfeb) const
unpacked in long mode: has overflow and error bits decoded
char data[epos_bytes_allocation]
static std::atomic< bool > debug
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...
boost::dynamic_bitset pack()
returns the packed event data.
void setCRC(unsigned int crc)
CSCAnodeData * theAnodeData