File indexing completed on 2024-04-06 12:10:21
0001 #ifndef EventFilter_CSCRawToDigi_CSCComparatorData_h
0002 #define EventFilter_CSCRawToDigi_CSCComparatorData_h
0003 #include "DataFormats/CSCDigi/interface/CSCComparatorDigi.h"
0004 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0005 #include <vector>
0006 #include <cassert>
0007
0008 #ifndef LOCAL_UNPACK
0009 #include <atomic>
0010 #endif
0011
0012 struct CSCComparatorDataWord {
0013 CSCComparatorDataWord(unsigned cfeb, unsigned tbin, unsigned data) : data_(data), tbin_(tbin), cfeb_(cfeb) {}
0014 bool value(int distrip) { return (data_ >> distrip) & 0x1; }
0015
0016 void set(int distrip, bool value) { data_ |= (value << distrip); }
0017 unsigned short data_ : 8;
0018 unsigned short tbin_ : 4;
0019 unsigned short cfeb_ : 4;
0020 };
0021
0022 class CSCTMBHeader;
0023
0024 class CSCComparatorData {
0025 public:
0026 explicit CSCComparatorData(const CSCTMBHeader *tmbHeader);
0027 CSCComparatorData(int ncfebs, int ntbins, int firmware_version = 2007);
0028 CSCComparatorData(int ncfebs, int ntbins, const unsigned short *e0bbuf, int firmware_version = 2007);
0029
0030
0031 static void setDebug(const bool value) { debug = value; };
0032
0033
0034 std::vector<CSCComparatorDigi> comparatorDigis(int layer);
0035
0036
0037 std::vector<CSCComparatorDigi> comparatorDigis(uint32_t idlayer, unsigned icfeb);
0038
0039 unsigned short *data() { return theData; }
0040
0041 int sizeInWords() const { return size_; }
0042 int nlines() const { return ncfebs_ * ntbins_ * 6; }
0043
0044
0045 void add(const CSCComparatorDigi &digi, int layer);
0046
0047 void add(const CSCComparatorDigi &digi, const CSCDetId &id);
0048
0049 CSCComparatorDataWord &dataWord(int iline) const {
0050 #ifdef ASSERTS
0051 assert(iline < nlines());
0052 #endif
0053 union dataPtr {
0054 const unsigned short *s;
0055 CSCComparatorDataWord *d;
0056 } mptr;
0057 mptr.s = theData + iline;
0058 return *(mptr.d);
0059 }
0060
0061 CSCComparatorDataWord &dataWord(int cfeb, int tbin, int layer) const {
0062 int iline = (layer - 1) + tbin * 6 + cfeb * 6 * ntbins_;
0063 return dataWord(iline);
0064 }
0065
0066 bool bitValue(int cfeb, int tbin, int layer, int distrip) { return dataWord(cfeb, tbin, layer).value(distrip); }
0067
0068
0069 bool check() const;
0070
0071
0072 void dump() const;
0073
0074
0075 static void selfTest();
0076
0077 private:
0078
0079 void zero();
0080
0081 #ifdef LOCAL_UNPACK
0082 static bool debug;
0083 #else
0084 static std::atomic<bool> debug;
0085 #endif
0086
0087 int ncfebs_;
0088 int ntbins_;
0089 int size_;
0090 unsigned short theData[7 * 6 * 32];
0091 int theFirmwareVersion;
0092 };
0093
0094 #endif