19 : theDMBHeader(format_version),
20 theALCTHeader(nullptr),
21 theAnodeData(nullptr),
22 theALCTTrailer(nullptr),
24 theDMBTrailer(format_version),
26 alctZSErecovered(nullptr),
28 theFormatVersion(format_version) {
44 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"The event data ";
45 for (
int i = 0;
i < 16; ++
i) {
46 LogTrace(
"CSCEventData|CSCRawToDigi") << std::hex <<
pos[
i] <<
" ";
52 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Bad DMB Header??? " 53 <<
" first four words: ";
54 for (
int i = 0;
i < 4; ++
i) {
55 LogTrace(
"CSCEventData|CSCRawToDigi") << std::hex <<
pos[
i] <<
" ";
60 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"nalct = " <<
nalct();
61 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"nclct = " <<
nclct();
76 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"+++WARNING: Corrupt ALCT data - won't attempt to decode";
103 int sizeInWord_ZSE = 0;
112 int nWG_round_up =
int(nWGs_per_layer / 12) + (nWGs_per_layer % 3 ? 1 : 0);
114 const uint16_t* posZSE =
pos;
115 std::vector<unsigned short> alctZSErecoveredVector;
116 alctZSErecoveredVector.clear();
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);
146 alctZSErecoveredVector.push_back(*posZSE);
155 for (
int l = 0;
l < (
int)alctZSErecoveredVector.size();
l++) {
176 pos += sizeInWord_ZSE;
187 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Error:nalct reported but no ALCT data found!!!";
197 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Error:nclct reported but no TMB data found!!!";
202 bool dmbTrailerReached =
false;
203 for (
int i = 0;
i < 12000; ++
i)
205 dmbTrailerReached = (*(
i +
pos) & 0xF000) == 0xF000 && (*(
i +
pos + 1) & 0xF000) == 0xF000 &&
206 (*(
i +
pos + 2) & 0xF000) == 0xF000 && (*(
i +
pos + 3) & 0xF000) == 0xF000 &&
207 (*(
i +
pos + 4) & 0xF000) == 0xE000 && (*(
i +
pos + 5) & 0xF000) == 0xE000 &&
208 (*(
i +
pos + 6) & 0xF000) == 0xE000 && (*(
i +
pos + 7) & 0xF000) == 0xE000;
209 if (dmbTrailerReached) {
215 if (dmbTrailerReached) {
221 if (cfeb_available == 1) {
222 if ((cfebTimeout >> icfeb) & 1) {
224 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"CFEB Timed out! ";
230 bool isDCFEB =
false;
242 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Critical Error: DMB Trailer was not found!!! ";
249 return (((
buf[0] & 0xFFFF) == 0xDB0A) || (((
buf[0] & 0xF800) == 0x6000) && ((
buf[1] & 0xF800) == 0)));
284 if (
data.theALCTHeader !=
nullptr)
286 if (
data.theAnodeData !=
nullptr)
288 if (
data.theALCTTrailer !=
nullptr)
290 if (
data.theTMBData !=
nullptr)
294 if (
data.theCFEBData[icfeb] !=
nullptr)
320 std::vector<CSCStripDigi>
result;
322 std::vector<CSCStripDigi> newDigis =
stripDigis(idlayer, icfeb);
323 result.insert(
result.end(), newDigis.begin(), newDigis.end());
329 std::vector<CSCStripDigi>
result;
332 result.insert(
result.end(), newDigis.begin(), newDigis.end());
340 return std::vector<CSCWireDigi>();
347 std::vector<std::vector<CSCStripDigi> >
result;
356 std::vector<std::vector<CSCWireDigi> >
result;
464 unsigned cfeb = digi.
getCFEB();
465 bool sixteenSamples =
false;
467 sixteenSamples =
true;
469 bool isDCFEB =
false;
513 for (
auto it : digis) {
521 for (
auto it : digis) {
529 for (
auto it : digis) {
544 int gem_layer = gemdetid.
layer();
545 int eta_roll = gemdetid.
roll();
556 std::vector<CSCStripDigi> stripDigis = evt.
stripDigis(ilayer);
559 std::vector<CSCWireDigi> wireDigis = evt.
wireDigis(ilayer);
566 boost::dynamic_bitset<>
result =
570 std::vector<std::pair<unsigned int, unsigned short*> > crcvec;
578 boost::dynamic_bitset<> anodeData =
611 for (
unsigned int n = 0;
n < vec.size();
n++) {
612 for (uint16_t
j = 0,
w = 0;
j < vec[
n].first;
j++) {
613 if (vec[
n].
second !=
nullptr) {
614 w = vec[
n].second[
j] & 0xffff;
615 for (uint32_t
i = 15,
t = 0, ncrc = 0;
i < 16;
i--) {
616 t = ((
w >>
i) & 1) ^ ((
CRC >> 21) & 1);
617 ncrc = (
CRC << 1) & 0x3ffffc;
618 ncrc |= (
t ^ (
CRC & 1)) << 1;
632 std::vector<CSCCLCTDigi> clctDigis;
635 clctDigis.push_back(
CSCCLCTDigi(1, 1, 4, 1, 0, 30, 3, 2, 1));
636 clctDigis.push_back(
CSCCLCTDigi(1, 1, 2, 1, 1, 31, 1, 2, 2));
640 std::vector<CSCCorrelatedLCTDigi> corrDigis;
641 corrDigis.push_back(
CSCCorrelatedLCTDigi(1, 1, 2, 10, 98, 5, 0, 1, 0, 0, 0, 0));
642 corrDigis.push_back(
CSCCorrelatedLCTDigi(2, 1, 2, 20, 15, 9, 1, 0, 0, 0, 0, 0));
644 chamberData.
add(clctDigis);
645 chamberData.
add(corrDigis);
649 chamberData.
add(wireDigi, 3);
650 chamberData.
add(comparatorDigi, 3);
668 std::vector<int> sca(16, 600);
669 std::vector<unsigned short> overflow(16, 0),
overlap(16, 0), errorfl(16, 0);
676 forward.
add(me1a, me1adet1.
layer());
677 forward.
add(me1b, me1bdet1.
layer());
678 backward.
add(me1a, me1adet2.
layer());
679 backward.
add(me1b, me1adet2.
layer());
680 std::vector<CSCStripDigi> me1afs = forward.
stripDigis(me1adet1);
681 std::vector<CSCStripDigi> me1bfs = forward.
stripDigis(me1bdet1);
682 std::vector<CSCStripDigi> me1abs = backward.
stripDigis(me1adet2);
683 std::vector<CSCStripDigi> me1bbs = backward.
stripDigis(me1bdet2);
686 assert(me1afs.size() == 16);
687 assert(me1bfs.size() == 16);
688 assert(me1abs.size() == 16);
689 assert(me1bbs.size() == 16);
691 assert(me1afs[4].getStrip() == 5);
692 assert(me1bfs[7].getStrip() == 8);
693 assert(me1abs[4].getStrip() == 5);
694 assert(me1bbs[7].getStrip() == 8);
void unpack_data(const uint16_t *buf)
void setEventInformation(int bxnum, int lvl1num)
unsigned short * alctZSErecovered
Auxiliary bufer to recove the ALCT raw payload from zero suppression.
uint16_t theFormatVersion
Output Format Version (2005, 2013)
void addEtaPadCluster(const GEMPadDigiCluster &digi, int gem_chamber, int eta_roll)
Add and pack GEMPadDigiCluster digis.
void checkALCTClasses()
makes new ALCT classes, if needed
CSCCFEBData * theCFEBData[CSCConstants::MAX_CFEBS_RUN2]
for up to MAX_CFEB CFEB boards
boost::dynamic_bitset pack()
not const because it sets size int TMBTrailer
unsigned sizeInWords() const
unsigned cfeb_starttimeout() const
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 ...
unsigned sizeInWords() const
void checkTMBClasses()
makes new TMB classes, if needed
void add(const CSCStripDigi &, int layer)
void setL1A(unsigned l1a)
CSCAnodeData * alctData() const
user must check if nalct > 0
unsigned short size() const
size of the data buffer used, in bytes
const CSCCFEBData * cfebData(unsigned icfeb) const
unpacked in long mode: has overflow and error bits decoded
unsigned short int sizeInWords() const
the amount of the input binary buffer read, in 16-bit words
constexpr int layer() const
std::vector< CSCStripDigi > stripDigis(const CSCDetId &idlayer) const
returns all the strip digis in the chamber, with the comparator information.
int getWireGroupBX() const
return BX assigned for the wire group (16 upper bits from the wire group number)
void addAnodeShower(const std::vector< CSCShowerDigi > &)
Add/pack anode CSCShower object (from OTMB header)
const unsigned short size() const
static int sizeInWords()
in 16-bit frames
CSCComparatorData * comparatorData() const
user must check if nclct > 0
void addAnodeALCTShower(const std::vector< CSCShowerDigi > &)
Add/pack anode CSCShower objects (from ALCT board data)
bool isALCT(const uint16_t *buf)
if dealing with ALCT data
U second(std::pair< T, U > const &p)
unsigned cfeb_endtimeout() const
CSCDMBHeader theDMBHeader
int nalct() const
the flag for existence of ALCT data
void addShower(const std::vector< CSCShowerDigi > &)
Run3 CSC Shower HMT objects.
CSCALCTHeader * theALCTHeader
std::ostream & operator<<(std::ostream &os, const CSCEventData &evt)
std::vector< CSCWireDigi > wireDigis(int layer) const
input layer is from 1 to 6
void add(const CSCWireDigi &wireDigi, int layer)
const CSCDMBTrailer * dmbTrailer() const
DMB trailer.
CSCDMBTrailer theDMBTrailer
CSCEventData operator=(const CSCEventData &data)
CSCALCTTrailer * theALCTTrailer
CSCComparatorData * comparatorData()
void copy(const CSCEventData &)
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
void digis(uint32_t idlayer, std::vector< CSCStripDigi > &result) const
faster way to get to digis
std::vector< std::vector< CSCStripDigi > > stripDigis() const
deprecated. Use the above methods instead
bool cscPackerCompare(const T &t1, const T &t2)
CSCALCTTrailer * alctTrailer() const
user must check if nalct > 0
void add(const CSCStripDigi &, int layer)
routines to add digis to the data
CSCTMBHeader * tmbHeader()
int getCFEB() const
Get the CFEB number. Counts from 0.
int nclct() const
the number of CLCTs
char data[epos_bytes_allocation]
constexpr int roll() const
static std::atomic< bool > debug
CSCALCTHeader * alctHeader() const
user must check if nalct > 0
CSCTMBData * tmbData() const
user must check in nclct > 0
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.
std::vector< CSCWireDigi > wireDigis(unsigned ilayer) const
std::vector< std::vector< CSCWireDigi > > wireDigis() const
deprecated. Use the above method instead.
void addCathodeShower(const std::vector< CSCShowerDigi > &)
Add/pack cathode CSCShower object (from OTMB header)
unsigned int calcALCTcrc(std::vector< std::pair< unsigned int, unsigned short *> > &vec)
CSCTMBHeader * tmbHeader() const
user must check if nclct > 0
void setCRC(unsigned int crc)
std::vector< int > const & getADCCounts() const
Get ADC readings.
int getWireGroup() const
default
CSCAnodeData * theAnodeData