19 theDMBHeader(format_version),
24 theDMBTrailer(format_version),
25 theChamberType(chamberType),
28 theFormatVersion(format_version)
49 const uint16_t *
pos = buf;
52 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"The event data ";
53 for (
int i = 0;
i < 16; ++
i)
55 LogTrace (
"CSCEventData|CSCRawToDigi") << std::hex << pos[
i ] <<
" ";
62 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Bad DMB Header??? " <<
" first four words: ";
63 for (
int i = 0;
i < 4; ++
i)
65 LogTrace (
"CSCEventData|CSCRawToDigi") << std::hex << pos[
i ] <<
" ";
72 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"nalct = " <<
nalct();
73 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"nclct = " <<
nclct();
91 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"+++WARNING: Corrupt ALCT data - won't attempt to decode";
121 int sizeInWord_ZSE =0;
131 int nWG_round_up =
int(nWGs_per_layer/12)+(nWGs_per_layer%3?1:0);
133 const uint16_t * posZSE = pos;
134 std::vector<unsigned short> alctZSErecoveredVector;
135 alctZSErecoveredVector.clear();
159 int alctZSErecoveredPos=0;
160 while (*posZSE != 0xDE0D)
162 if ( (*posZSE == 0x1000) && (*posZSE != 0x3000))
164 for (
int j=0; j<nWG_round_up; j++)
166 alctZSErecoveredVector.push_back(0x0000);
168 alctZSErecoveredPos+=nWG_round_up;
172 alctZSErecoveredVector.push_back(*posZSE);
173 ++alctZSErecoveredPos;
182 for (
int l=0;
l<(
int)alctZSErecoveredVector.size();
l++)
205 pos +=sizeInWord_ZSE;
220 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Error:nalct reported but no ALCT data found!!!";
234 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Error:nclct reported but no TMB data found!!!";
239 bool dmbTrailerReached=
false;
240 for (
int i=0;
i<12000; ++
i)
243 (*(
i+pos) & 0xF000) == 0xF000 && (*(
i+pos+1) & 0xF000) == 0xF000
244 && (*(
i+pos+2) & 0xF000) == 0xF000 && (*(
i+pos+3) & 0xF000) == 0xF000
245 && (*(
i+pos+4) & 0xF000) == 0xE000 && (*(
i+pos+5) & 0xF000) == 0xE000
246 && (*(
i+pos+6) & 0xF000) == 0xE000 && (*(
i+pos+7) & 0xF000) == 0xE000;
247 if (dmbTrailerReached)
254 if (dmbTrailerReached)
256 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
262 if ( cfeb_available==1 )
264 if ((cfebTimeout >> icfeb) & 1)
266 if (
debug)
LogTrace (
"CSCEventData|CSCRawToDigi") <<
"CFEB Timed out! ";
274 bool isDCFEB =
false;
287 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Critical Error: DMB Trailer was not found!!! ";
295 return (((buf[0]&0xFFFF)==0xDB0A)||(((buf[0]&0xF800)==0x6000)&&((buf[1]&0xF800)==0)));
300 return ((buf[0]&0xFFF)==0xB0C);
332 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
355 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
378 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
392 std::vector<CSCStripDigi>
result;
393 for (
unsigned icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
395 std::vector<CSCStripDigi> newDigis =
stripDigis(idlayer, icfeb);
396 result.insert(result.end(), newDigis.begin(), newDigis.end());
405 std::vector<CSCStripDigi>
result;
409 result.insert(result.end(), newDigis.begin(), newDigis.end());
420 return std::vector<CSCWireDigi>();
431 std::vector < std::vector<CSCStripDigi> >
result;
432 for (
int layer = 1; layer <= 6; ++layer)
434 std::vector<CSCStripDigi> digis =
stripDigis(layer);
435 result.push_back(digis);
442 std::vector < std::vector<CSCWireDigi> >
result;
443 for (
int layer = 1; layer <= 6; ++layer)
525 for (
unsigned cfeb=0; cfeb< 7; cfeb++)
572 unsigned cfeb = (digi.
getStrip()-1)/16;
573 bool sixteenSamples =
false;
574 if (digi.
getADCCounts().size()==16) sixteenSamples =
true;
577 bool isDCFEB =
false;
637 for (
int ilayer = 1; ilayer <= 6; ++ilayer)
654 std::vector<std::pair<unsigned int, unsigned short*> > crcvec;
684 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
705 for (
unsigned int n = 0;
n < vec.size();
n++)
708 for (uint16_t j=0,
w=0; j<vec[
n].first; j++ )
711 if (vec[
n].
second !=
nullptr) {
712 w = vec[
n].second[j] & 0xffff;
713 for (uint32_t
i=15,
t=0, ncrc=0;
i<16;
i--)
715 t = ((
w >>
i) & 1) ^ ((CRC >> 21) & 1);
716 ncrc = (CRC << 1) & 0x3ffffc;
717 ncrc |= (
t ^ (CRC & 1)) << 1;
737 std::vector<CSCCLCTDigi> clctDigis;
740 clctDigis.push_back(
CSCCLCTDigi(1, 1, 4, 1, 0, 30, 3, 2, 1));
741 clctDigis.push_back(
CSCCLCTDigi(1, 1, 2, 1, 1, 31, 1, 2, 2));
745 std::vector<CSCCorrelatedLCTDigi> corrDigis;
746 corrDigis.push_back(
CSCCorrelatedLCTDigi(1, 1, 2, 10, 98, 5, 0, 1, 0, 0, 0, 0));
747 corrDigis.push_back(
CSCCorrelatedLCTDigi(2, 1, 2, 20, 15, 9, 1, 0, 0, 0, 0, 0));
749 chamberData.
add(clctDigis);
750 chamberData.
add(corrDigis);
754 chamberData.
add(wireDigi, 3);
755 chamberData.
add(comparatorDigi, 3);
773 std::vector<int> sca(16, 600);
774 std::vector<unsigned short> overflow(16, 0),
overlap(16, 0), errorfl(16,0);
781 forward.
add(me1a, me1adet1.
layer());
782 forward.
add(me1b, me1bdet1.
layer());
783 backward.
add(me1a, me1adet2.
layer());
784 backward.
add(me1b, me1adet2.
layer());
785 std::vector<CSCStripDigi> me1afs = forward.
stripDigis(me1adet1);
786 std::vector<CSCStripDigi> me1bfs = forward.
stripDigis(me1bdet1);
787 std::vector<CSCStripDigi> me1abs = backward.
stripDigis(me1adet2);
788 std::vector<CSCStripDigi> me1bbs = backward.
stripDigis(me1bdet2);
791 assert(me1afs.size() == 16);
792 assert(me1bfs.size() == 16);
793 assert(me1abs.size() == 16);
794 assert(me1bbs.size() == 16);
796 assert(me1afs[4].getStrip() == 5);
797 assert(me1bfs[7].getStrip() == 8);
798 assert(me1abs[4].getStrip() == 5);
799 assert(me1bbs[7].getStrip() == 8);
800 assert(me1afs[4].
pedestal() == 600);
801 assert(me1bfs[7].
pedestal() == 600);
802 assert(me1abs[4].
pedestal() == 600);
803 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
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
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