Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:10:29

0001 #ifndef CSCSPHeader_h
0002 #define CSCSPHeader_h
0003 
0004 #include <cstring>  // memcpy
0005 
0006 class CSCSPHeader {
0007 private:
0008   /////////////
0009   unsigned sp_l1a_low : 12;
0010   unsigned header_mark_1 : 4;  // constant, should be 1001 = 0x9
0011 
0012   unsigned sp_l1a_high : 12;
0013   unsigned header_mark_2 : 4;  // constant, should be 1001 = 0x9
0014 
0015   unsigned zero_1 : 12;        // constant, should be 0
0016   unsigned header_mark_3 : 4;  // constant, should be 1001 = 0x9
0017 
0018   unsigned sp_bxn : 12;
0019   unsigned header_mark_4 : 4;  // constant, should be 1001 = 0x9
0020 
0021   /////////////
0022   unsigned zero_2 : 12;        // constant, should be 0
0023   unsigned header_mark_5 : 4;  // constant, should be 1010 = 0xA
0024 
0025   unsigned sp_slot_number : 5;  // SP_PADR, or physical address, or slot number
0026   unsigned sp_ersv : 3;         // event record structure version
0027   unsigned
0028       sp_trigger_sector : 4;  // SP Trigger Sector 1, 2, 3, 4, 5, 6 for +Z EMU side and 7, 8, 9, 10, 11, 12 for -Z EMU side
0029 
0030   unsigned header_mark_6 : 4;  // constant, should be 1010 = 0xA
0031                                /*
0032     unsigned warning_overflow : 1; // FMM: L1A rate is too high
0033     unsigned out_of_sync      : 1; // FMM: L1 Reset is required
0034     unsigned busy             : 1; // FMM: L1A rate higher than SP can handle - start flushing events
0035     unsigned ready            : 1; // FMM: L1A rate is fine
0036     unsigned fa_out_of_sync   : 1; // FMM: FA out of sync: one of Front_FPGA's L1A doesn't match DDU_FPGA L1A
0037     unsigned sp_out_of_sync   : 1; // FMM: SP out of sync: SP_FPGA's L1A doesn't match DDU_FPGA L1A
0038     unsigned spare_1          : 1; // not used yet
0039     unsigned zero_3           : 5; // constant, should be 0
0040     unsigned header_mark_7    : 4; // constant, should be 1010 = 0xA
0041 */
0042   unsigned fmm_status : 6;     // see FMM above
0043   unsigned ddm : 1;            // readout mode: 0/1 = DDU/VME
0044   unsigned zero_3 : 5;         // constant, should be 0
0045   unsigned header_mark_7 : 4;  // constant, should be 1010 = 0xA
0046 
0047   /*
0048     // DD/CSR_DFC: DAQ FIFO Configuration
0049     unsigned tbin             : 3; // sp record may contain up to 7 consequetive BXs
0050     unsigned zero_suppression : 1; // zero suppression: if set - put only valid LCTs, stubs, and track in the record
0051     unsigned f1_active        : 1; // read(1)/suppress(0) F1 record in the event
0052     unsigned f2_active        : 1; // read(1)/suppress(0) F2 record in the event
0053     unsigned f3_active        : 1; // read(1)/suppress(0) F3 record in the event
0054     unsigned f4_active        : 1; // read(1)/suppress(0) F4 record in the event
0055     unsigned f5_active        : 1; // read(1)/suppress(0) F5 record in the event
0056     unsigned dt_active        : 1; // read(1)/suppress(0) DT record in the event
0057     unsigned sp_active        : 1; // read(1)/suppress(0) SP record in the event
0058     unsigned skip             : 1; // event is skiped, only this header + trailer exist in the record
0059     unsigned header_mark_8    : 4; // constant, should be 1010 = 0xA
0060 */
0061   // DD/CSR_DFC: DAQ FIFO Configuration
0062   unsigned csr_dfc : 11;       //
0063   unsigned skip : 1;           // event is skiped, only this header + trailer exist in the record
0064   unsigned header_mark_8 : 4;  // constant, should be 1010 = 0xA
0065 
0066   friend class CSCTFPacker;
0067 
0068 public:
0069   bool check(void) const {
0070     return header_mark_1 != 0x9 || header_mark_2 != 0x9 || header_mark_3 != 0x9 || header_mark_4 != 0x9 ||
0071            header_mark_5 != 0xA || header_mark_6 != 0xA || header_mark_7 != 0xA || header_mark_8 != 0xA ||
0072            zero_1 != 0 || zero_2 != 0 || zero_3 != 0;
0073   }
0074 
0075   unsigned int BXN(void) const throw() { return sp_bxn; }
0076   unsigned int L1A(void) const throw() { return (sp_l1a_high << 12) | sp_l1a_low; }
0077 
0078   unsigned int slot(void) const throw() { return sp_slot_number; }
0079   unsigned int trigger_sector(void) const throw() { return sp_trigger_sector; }
0080   // following two functions are kept for compatibility with earlier versions of TF data format:
0081   unsigned int sector(void) const throw() {
0082     if (sp_ersv < 2)
0083       return sp_trigger_sector & 0x7;
0084     else
0085       return (sp_trigger_sector <= 6 ? sp_trigger_sector : sp_trigger_sector - 6);
0086   }
0087   unsigned int endcap(void) const throw() {
0088     if (sp_ersv < 2)
0089       return sp_trigger_sector & 0x8;
0090     else
0091       return (sp_trigger_sector <= 6 ? 1 : 0);
0092   }
0093 
0094   enum FMM { WOF = 1, OSY = 2, BUZY = 4, READY = 8, FA_OSY = 16, SP_OSY = 32 };
0095   unsigned int status(void) const throw() { return fmm_status; }
0096 
0097   unsigned int nTBINs(void) const throw() { return csr_dfc & 0x7; }
0098 
0099   bool suppression(void) const throw() { return csr_dfc & 0x8; }
0100 
0101   enum ACTIVE { F1 = 1, F2 = 2, F3 = 4, F4 = 8, F5 = 16, DT = 32, SP = 64 };
0102   unsigned int active(void) const throw() { return csr_dfc >> 4; }
0103 
0104   bool empty(void) const throw() { return skip; }
0105 
0106   int format_version(void) const throw() { return sp_ersv; }
0107   bool ddu_readout(void) const throw() { return ddm; }
0108 
0109   bool unpack(const unsigned short *&buf) throw() {
0110     memcpy((void *)this, buf, 8 * sizeof(short));
0111     buf += 8;
0112     return check();
0113   }
0114 
0115   CSCSPHeader(void) {}
0116 };
0117 
0118 #endif