15 theDMBHeader(format_version),
20 theDMBTrailer(format_version),
21 theChamberType(chamberType),
24 theFormatVersion(format_version)
45 unsigned short * pos = buf;
48 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"The event data ";
49 for (
int i = 0;
i < 16; ++
i)
51 LogTrace (
"CSCEventData|CSCRawToDigi") << std::hex << pos[
i ] <<
" ";
58 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Bad DMB Header??? " <<
" first four words: ";
59 for (
int i = 0;
i < 4; ++
i)
61 LogTrace (
"CSCEventData|CSCRawToDigi") << std::hex << pos[
i ] <<
" ";
68 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"nalct = " <<
nalct();
69 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"nclct = " <<
nclct();
87 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"+++WARNING: Corrupt ALCT data - won't attempt to decode";
117 int sizeInWord_ZSE =0;
127 int nWG_round_up = int(nWGs_per_layer/12)+(nWGs_per_layer%3?1:0);
129 unsigned short * posZSE = pos;
130 std::vector<unsigned short> alctZSErecoveredVector;
131 alctZSErecoveredVector.clear();
155 int alctZSErecoveredPos=0;
156 while (*posZSE != 0xDE0D)
158 if ( (*posZSE == 0x1000) && (*posZSE != 0x3000))
160 for (
int j=0;
j<nWG_round_up;
j++)
162 alctZSErecoveredVector.push_back(0x0000);
164 alctZSErecoveredPos+=nWG_round_up;
168 alctZSErecoveredVector.push_back(*posZSE);
169 ++alctZSErecoveredPos;
178 for (
int l=0;
l<(int)alctZSErecoveredVector.size();
l++)
201 pos +=sizeInWord_ZSE;
216 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Error:nalct reported but no ALCT data found!!!";
230 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Error:nclct reported but no TMB data found!!!";
235 bool dmbTrailerReached=
false;
236 for (
int i=0;
i<12000; ++
i)
239 (*(
i+pos) & 0xF000) == 0xF000 && (*(
i+pos+1) & 0xF000) == 0xF000
240 && (*(
i+pos+2) & 0xF000) == 0xF000 && (*(
i+pos+3) & 0xF000) == 0xF000
241 && (*(
i+pos+4) & 0xF000) == 0xE000 && (*(
i+pos+5) & 0xF000) == 0xE000
242 && (*(
i+pos+6) & 0xF000) == 0xE000 && (*(
i+pos+7) & 0xF000) == 0xE000;
243 if (dmbTrailerReached)
250 if (dmbTrailerReached)
252 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
258 if ( cfeb_available==1 )
260 if ((cfebTimeout >> icfeb) & 1)
262 if (
debug)
LogTrace (
"CSCEventData|CSCRawToDigi") <<
"CFEB Timed out! ";
270 bool isDCFEB =
false;
283 LogTrace (
"CSCEventData|CSCRawToDigi") <<
"Critical Error: DMB Trailer was not found!!! ";
291 return (((buf[0]&0xFFFF)==0xDB0A)||(((buf[0]&0xF800)==0x6000)&&((buf[1]&0xF800)==0)));
296 return ((buf[0]&0xFFF)==0xB0C);
328 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
351 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
374 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
388 std::vector<CSCStripDigi>
result;
389 for (
unsigned icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
391 std::vector<CSCStripDigi> newDigis =
stripDigis(idlayer, icfeb);
392 result.insert(result.end(), newDigis.begin(), newDigis.end());
401 std::vector<CSCStripDigi>
result;
405 result.insert(result.end(), newDigis.begin(), newDigis.end());
416 return std::vector<CSCWireDigi>();
427 std::vector < std::vector<CSCStripDigi> >
result;
428 for (
int layer = 1; layer <= 6; ++layer)
430 std::vector<CSCStripDigi> digis =
stripDigis(layer);
431 result.push_back(digis);
438 std::vector < std::vector<CSCWireDigi> >
result;
439 for (
int layer = 1; layer <= 6; ++layer)
521 for (
unsigned cfeb=0; cfeb< 7; cfeb++)
568 unsigned cfeb = (digi.
getStrip()-1)/16;
569 bool sixteenSamples =
false;
570 if (digi.
getADCCounts().size()==16) sixteenSamples =
true;
573 bool isDCFEB =
false;
633 for (
int ilayer = 1; ilayer <= 6; ++ilayer)
635 std::vector<CSCStripDigi> stripDigis = evt.
stripDigis(ilayer);
638 std::vector<CSCWireDigi> wireDigis = evt.
wireDigis(ilayer);
650 std::vector<std::pair<unsigned int, unsigned short*> > crcvec;
680 for (
int icfeb = 0; icfeb <
MAX_CFEB; ++icfeb)
701 for (
unsigned int n = 0;
n < vec.size();
n++)
704 for (uint16_t
j=0,
w=0;
j<vec[
n].first;
j++ )
708 w = vec[
n].second[
j] & 0xffff;
709 for (uint32_t
i=15,
t=0, ncrc=0;
i<16;
i--)
711 t = ((
w >>
i) & 1) ^ ((CRC >> 21) & 1);
712 ncrc = (CRC << 1) & 0x3ffffc;
713 ncrc |= (
t ^ (CRC & 1)) << 1;
733 std::vector<CSCCLCTDigi> clctDigis;
736 clctDigis.push_back(
CSCCLCTDigi(1, 1, 4, 1, 0, 30, 3, 2, 1));
737 clctDigis.push_back(
CSCCLCTDigi(1, 1, 2, 1, 1, 31, 1, 2, 2));
741 std::vector<CSCCorrelatedLCTDigi> corrDigis;
742 corrDigis.push_back(
CSCCorrelatedLCTDigi(1, 1, 2, 10, 98, 5, 0, 1, 0, 0, 0, 0));
743 corrDigis.push_back(
CSCCorrelatedLCTDigi(2, 1, 2, 20, 15, 9, 1, 0, 0, 0, 0, 0));
745 chamberData.
add(clctDigis);
746 chamberData.
add(corrDigis);
750 chamberData.
add(wireDigi, 3);
751 chamberData.
add(comparatorDigi, 3);
769 std::vector<int> sca(16, 600);
770 std::vector<unsigned short> overflow(16, 0),
overlap(16, 0), errorfl(16,0);
777 forward.
add(me1a, me1adet1.
layer());
778 forward.
add(me1b, me1bdet1.
layer());
779 backward.
add(me1a, me1adet2.
layer());
780 backward.
add(me1b, me1adet2.
layer());
781 std::vector<CSCStripDigi> me1afs = forward.
stripDigis(me1adet1);
782 std::vector<CSCStripDigi> me1bfs = forward.
stripDigis(me1bdet1);
783 std::vector<CSCStripDigi> me1abs = backward.
stripDigis(me1adet2);
784 std::vector<CSCStripDigi> me1bbs = backward.
stripDigis(me1bdet2);
787 assert(me1afs.size() == 16);
788 assert(me1bfs.size() == 16);
789 assert(me1abs.size() == 16);
790 assert(me1bbs.size() == 16);
792 assert(me1afs[4].getStrip() == 5);
793 assert(me1bfs[7].getStrip() == 8);
794 assert(me1abs[4].getStrip() == 5);
795 assert(me1bbs[7].getStrip() == 8);
796 assert(me1afs[4].
pedestal() == 600);
797 assert(me1bfs[7].
pedestal() == 600);
798 assert(me1abs[4].
pedestal() == 600);
799 assert(me1bbs[7].
pedestal() == 600);
void setEventInformation(int bxnum, int lvl1num)
bool isALCT(const short unsigned int *buf)
if dealing with ALCT data
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.
void digis(uint32_t idlayer, std::vector< CSCStripDigi > &result)
faster way to get to digis
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)
unsigned sizeInWords() const
std::ostream & operator<<(std::ostream &out, const ALILine &li)
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
uint32_t rawId() const
get the raw id
U second(std::pair< T, U > const &p)
CSCCFEBData * theCFEBData[MAX_CFEB]
for up to MAX_CFEB CFEB boards
CSCDMBHeader theDMBHeader
CSCCLCTData * clctData() const
user must check if nclct > 0
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.
CSCTMBData * tmbData() const
user must check in nclct > 0
void add(const CSCWireDigi &wireDigi, int layer)
CSCDMBTrailer theDMBTrailer
void unpack_data(unsigned short *buf)
CSCEventData operator=(const CSCEventData &data)
CSCALCTTrailer * theALCTTrailer
bool isTMB(const short unsigned int *buf)
if dealing with TMB data
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.
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
char data[epos_bytes_allocation]
CSCCFEBData * cfebData(unsigned icfeb) const
unpacked in long mode: has overflow and error bits decoded
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