19 : theDMBHeader(format_version),
20 theALCTHeader(nullptr),
21 theAnodeData(nullptr),
22 theALCTTrailer(nullptr),
24 theDMBTrailer(format_version),
25 theChamberType(chamberType),
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 int alctZSErecoveredPos = 0;
141 while (*posZSE != 0xDE0D) {
142 if ((*posZSE == 0x1000) && (*posZSE != 0x3000)) {
143 for (
int j = 0;
j < nWG_round_up;
j++) {
144 alctZSErecoveredVector.push_back(0x0000);
146 alctZSErecoveredPos += nWG_round_up;
148 alctZSErecoveredVector.push_back(*posZSE);
149 ++alctZSErecoveredPos;
158 for (
int l = 0;
l < (
int)alctZSErecoveredVector.size();
l++) {
180 pos += sizeInWord_ZSE;
191 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Error:nalct reported but no ALCT data found!!!";
201 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Error:nclct reported but no TMB data found!!!";
206 bool dmbTrailerReached =
false;
207 for (
int i = 0;
i < 12000; ++
i)
209 dmbTrailerReached = (*(
i +
pos) & 0xF000) == 0xF000 && (*(
i +
pos + 1) & 0xF000) == 0xF000 &&
210 (*(
i +
pos + 2) & 0xF000) == 0xF000 && (*(
i +
pos + 3) & 0xF000) == 0xF000 &&
211 (*(
i +
pos + 4) & 0xF000) == 0xE000 && (*(
i +
pos + 5) & 0xF000) == 0xE000 &&
212 (*(
i +
pos + 6) & 0xF000) == 0xE000 && (*(
i +
pos + 7) & 0xF000) == 0xE000;
213 if (dmbTrailerReached) {
219 if (dmbTrailerReached) {
225 if (cfeb_available == 1) {
226 if ((cfebTimeout >> icfeb) & 1) {
228 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"CFEB Timed out! ";
234 bool isDCFEB =
false;
246 LogTrace(
"CSCEventData|CSCRawToDigi") <<
"Critical Error: DMB Trailer was not found!!! ";
253 return (((
buf[0] & 0xFFFF) == 0xDB0A) || (((
buf[0] & 0xF800) == 0x6000) && ((
buf[1] & 0xF800) == 0)));
288 if (
data.theALCTHeader !=
nullptr)
290 if (
data.theAnodeData !=
nullptr)
292 if (
data.theALCTTrailer !=
nullptr)
294 if (
data.theTMBData !=
nullptr)
298 if (
data.theCFEBData[icfeb] !=
nullptr)
324 std::vector<CSCStripDigi>
result;
326 std::vector<CSCStripDigi> newDigis =
stripDigis(idlayer, icfeb);
327 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;
360 std::vector<std::vector<CSCWireDigi> >
result;
468 unsigned cfeb = digi.
getCFEB();
469 bool sixteenSamples =
false;
471 sixteenSamples =
true;
473 bool isDCFEB =
false;
517 for (
auto it : digis) {
525 for (
auto it : digis) {
533 for (
auto it : digis) {
548 int gem_layer = gemdetid.
layer();
549 int eta_roll = gemdetid.
roll();
560 std::vector<CSCStripDigi> stripDigis = evt.
stripDigis(ilayer);
563 std::vector<CSCWireDigi> wireDigis = evt.
wireDigis(ilayer);
570 boost::dynamic_bitset<>
result =
574 std::vector<std::pair<unsigned int, unsigned short*> > crcvec;
582 boost::dynamic_bitset<> anodeData =
615 for (
unsigned int n = 0;
n < vec.size();
n++) {
616 for (uint16_t
j = 0,
w = 0;
j < vec[
n].first;
j++) {
617 if (vec[
n].
second !=
nullptr) {
618 w = vec[
n].second[
j] & 0xffff;
619 for (uint32_t
i = 15,
t = 0, ncrc = 0;
i < 16;
i--) {
620 t = ((
w >>
i) & 1) ^ ((
CRC >> 21) & 1);
621 ncrc = (
CRC << 1) & 0x3ffffc;
622 ncrc |= (
t ^ (
CRC & 1)) << 1;
636 std::vector<CSCCLCTDigi> clctDigis;
639 clctDigis.push_back(
CSCCLCTDigi(1, 1, 4, 1, 0, 30, 3, 2, 1));
640 clctDigis.push_back(
CSCCLCTDigi(1, 1, 2, 1, 1, 31, 1, 2, 2));
644 std::vector<CSCCorrelatedLCTDigi> corrDigis;
645 corrDigis.push_back(
CSCCorrelatedLCTDigi(1, 1, 2, 10, 98, 5, 0, 1, 0, 0, 0, 0));
646 corrDigis.push_back(
CSCCorrelatedLCTDigi(2, 1, 2, 20, 15, 9, 1, 0, 0, 0, 0, 0));
648 chamberData.
add(clctDigis);
649 chamberData.
add(corrDigis);
653 chamberData.
add(wireDigi, 3);
654 chamberData.
add(comparatorDigi, 3);
672 std::vector<int> sca(16, 600);
673 std::vector<unsigned short> overflow(16, 0),
overlap(16, 0), errorfl(16, 0);
680 forward.
add(me1a, me1adet1.
layer());
681 forward.
add(me1b, me1bdet1.
layer());
682 backward.
add(me1a, me1adet2.
layer());
683 backward.
add(me1b, me1adet2.
layer());
684 std::vector<CSCStripDigi> me1afs = forward.
stripDigis(me1adet1);
685 std::vector<CSCStripDigi> me1bfs = forward.
stripDigis(me1bdet1);
686 std::vector<CSCStripDigi> me1abs = backward.
stripDigis(me1adet2);
687 std::vector<CSCStripDigi> me1bbs = backward.
stripDigis(me1bdet2);
690 assert(me1afs.size() == 16);
691 assert(me1bfs.size() == 16);
692 assert(me1abs.size() == 16);
693 assert(me1bbs.size() == 16);
695 assert(me1afs[4].getStrip() == 5);
696 assert(me1bfs[7].getStrip() == 8);
697 assert(me1abs[4].getStrip() == 5);
698 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)
constexpr std::array< uint8_t, layerIndexSize > layer
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 &)
constexpr uint32_t rawId() const
get the raw id
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