CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EMTFBlockTrailers.cc
Go to the documentation of this file.
1 #include <memory>
3 
4 #include "EMTFCollections.h"
5 #include "EMTFUnpackerTools.h"
6 #include "EMTFBlockTrailers.h"
7 
8 namespace l1t {
9  namespace stage2 {
10  namespace emtf {
11 
13 
14  auto payload = block.payload();
15  int errors = 0;
16 
17  //Check the number of 16-bit words
18  if(payload.size() != 8) { errors += 1; edm::LogError("L1T|EMTF") << "Payload size in 'AMC Data Trailer' is different than expected"; }
19 
20  //Check that each word is 16 bits
21  if(GetHexBits(payload[0], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[0] has more than 16 bits in 'AMC Data Trailer'"; }
22  if(GetHexBits(payload[1], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[1] has more than 16 bits in 'AMC Data Trailer'"; }
23  if(GetHexBits(payload[2], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[2] has more than 16 bits in 'AMC Data Trailer'"; }
24  if(GetHexBits(payload[3], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[3] has more than 16 bits in 'AMC Data Trailer'"; }
25  if(GetHexBits(payload[3], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[3] has more than 16 bits in 'AMC Data Trailer'"; }
26  if(GetHexBits(payload[3], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[3] has more than 16 bits in 'AMC Data Trailer'"; }
27  if(GetHexBits(payload[3], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[3] has more than 16 bits in 'AMC Data Trailer'"; }
28  if(GetHexBits(payload[3], 16, 31) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Payload[3] has more than 16 bits in 'AMC Data Trailer'"; }
29 
30  // Assign payload to 16-bit words
31  uint16_t TR1a = payload[0];
32  uint16_t TR1b = payload[1];
33  uint16_t TR1c = payload[2];
34  uint16_t TR1d = payload[3];
35  uint16_t TR2a = payload[4];
36  uint16_t TR2b = payload[5];
37  uint16_t TR2c = payload[6];
38  uint16_t TR2d = payload[7];
39 
40  //Check Format
41  if(GetHexBits(TR1a, 12, 15) != 15) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR1a are incorrect"; }
42  if(GetHexBits(TR1b, 12, 15) != 15) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR1b are incorrect"; }
43  if(GetHexBits(TR1b, 0, 3) != 15) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR1b are incorrect"; }
44  if(GetHexBits(TR1b, 4, 6) != 7) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR1b are incorrect"; }
45  if(GetHexBits(TR1c, 9, 11) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR1c are incorrect"; }
46  // FIXME: we are consistently reading GetHexBits(TR1c, 12, 15) == 14 - AWB 10.02.16
47  // if(GetHexBits(TR1c, 12, 15) != 15) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR1c are incorrect"; }
48  if(GetHexBits(TR1d, 12, 15) != 15) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR1d are incorrect"; }
49  // FIXME: we are consistently reading GetHexBits(TR2a, 5, 11) == 18 - AWB 10.02.16
50  // if(GetHexBits(TR2a, 5, 11) != 0) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR2a are incorrect"; }
51  if(GetHexBits(TR2a, 12, 15) != 14) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR2a are incorrect"; }
52  if(GetHexBits(TR2b, 12, 15) != 14) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR2b are incorrect"; }
53  if(GetHexBits(TR2c, 12, 15) != 14) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR2c are incorrect"; }
54  if(GetHexBits(TR2d, 12, 15) != 14) { errors += 1; edm::LogError("L1T|EMTF") << "Format identifier bits in TR2d are incorrect"; }
55 
56  return errors;
57 
58  }
59 
61 
62  // std::cout << "Inside EMTFBlockTrailers.cc: unpack" << std::endl;
63 
64  // Get the payload for this block, made up of 16-bit words (0xffff)
65  // Format defined in MTF7Payload::getBlock() in src/Block.cc
66  // payload[0] = bits 0-15, payload[1] = 16-31, payload[3] = 32-47, etc.
67  auto payload = block.payload();
68 
69 
70  // Check Format of Payload
71  l1t::emtf::AMC13Trailer AMC13Trailer_;
72  l1t::emtf::MTF7Trailer MTF7Trailer_;
73  l1t::emtf::EventTrailer EventTrailer_;
74  for (int err = 0; err < checkFormat(block); err++) EventTrailer_.add_format_error();
75 
76  // Assign payload to 16-bit words
77  uint16_t TR1a = payload[0];
78  uint16_t TR1b = payload[1];
79  uint16_t TR1c = payload[2];
80  uint16_t TR1d = payload[3];
81  uint16_t TR2a = payload[4];
82  uint16_t TR2b = payload[5];
83  uint16_t TR2c = payload[6];
84  uint16_t TR2d = payload[7];
85 
86  // res is a pointer to a collection of EMTFDaqOut class objects
87  // There is one EMTFDaqOut for each MTF7 (60 deg. sector) in the event
89  res = static_cast<EMTFCollections*>(coll)->getEMTFDaqOuts();
90  int iOut = res->size() - 1;
91 
93  // Unpack the Event Record trailer information
95 
96  if ( (res->at(iOut)).HasEventTrailer() == true )
97  { (res->at(iOut)).add_format_error(); edm::LogError("L1T|EMTF") << "Why is there already an EventTrailer object?"; goto write_Event; }
98  if (EventTrailer_.Format_Errors() > 0) goto write_Event;
99 
100  EventTrailer_.set_l1a ( GetHexBits(TR1a, 0, 7) );
101  EventTrailer_.set_ddcsr_lf ( GetHexBits(TR1a, 8, 11, TR1b, 8, 11) );
102 
103  EventTrailer_.set_lfff ( GetHexBits(TR1b, 7, 7) );
104 
105  // EventTrailer_.set_ddcsr_bid ( GetHexBits(TR2a, 0, 4, TR1c, 0, 8) ); // Probably incorrect
106  EventTrailer_.set_mm ( GetHexBits(TR1c, 0, 3) );
107  EventTrailer_.set_yy ( GetHexBits(TR1c, 4, 7) );
108  EventTrailer_.set_bb ( GetHexBits(TR1c, 8, 8) );
109 
110  EventTrailer_.set_spcsr_scc ( GetHexBits(TR1d, 0, 11) );
111 
112  EventTrailer_.set_dd ( GetHexBits(TR2a, 0, 4) );
113 
114  EventTrailer_.set_sp_padr ( GetHexBits(TR2b, 0, 4) );
115  EventTrailer_.set_sp_ersv ( GetHexBits(TR2b, 5, 7) );
116  EventTrailer_.set_sp_ladr ( GetHexBits(TR2b, 8, 11) );
117 
118  EventTrailer_.set_crc22 ( GetHexBits(TR2c, 0, 10, TR2d, 0, 10) );
119  EventTrailer_.set_lp ( GetHexBits(TR2c, 11, 11) );
120  EventTrailer_.set_hp ( GetHexBits(TR2d, 11, 11) );
121 
122  // EventTrailer_.set_dataword(uint64_t bits) { dataword = bits; };
123 
124  write_Event:
125 
126  (res->at(iOut)).set_EventTrailer(EventTrailer_);
127 
129  // Unpack the MTF7 trailer information
131 
132  if ( (res->at(iOut)).HasMTF7Trailer() == true )
133  { (res->at(iOut)).add_format_error(); edm::LogError("L1T|EMTF") << "Why is there already an MTF7Trailer object?"; goto write_MTF7; }
134 
135  // // AMC trailer info defined in interface/AMCSpec.h ... but not implemented in interface/Block.h?
136  // MTF7Trailer_.set_crc_32( GetHexBits(payload[], , ) );
137  // MTF7Trailer_.set_lv1_id( GetHexBits(payload[], , ) );
138  // MTF7Trailer_.set_data_length( GetHexBits(payload[], , ) );
139  // MTF7Trailer_.set_dataword(uint64_t bits) { dataword = bits; };
140 
141  write_MTF7:
142 
143  (res->at(iOut)).set_MTF7Trailer(MTF7Trailer_);
144 
146  // Unpack the AMC13 trailer information
148 
149  if ( (res->at(iOut)).HasAMC13Trailer() == true )
150  { (res->at(iOut)).add_format_error(); edm::LogError("L1T|EMTF") << "Why is there already an AMC13Trailer object?"; goto write_AMC13; }
151 
152  // TODO: Write functions in interface/AMC13Spec.h (as in AMCSpec.h) to extract all AMC13 header and trailer info
153  // TODO: Edit interface/Block.h to have a amc13() function similar to amc()
154 
155  // AMC13Trailer_.set_evt_lgth( GetHexBits(payload[], , ) );
156  // AMC13Trailer_.set_crc16( GetHexBits(payload[], , ) );
157  // AMC13Trailer_.set_evt_stat( GetHexBits(payload[], , ) );
158  // AMC13Trailer_.set_tts( GetHexBits(payload[], , ) );
159  // AMC13Trailer_.set_c( GetHexBits(payload[], , ) );
160  // AMC13Trailer_.set_f( GetHexBits(payload[], , ) );
161  // AMC13Trailer_.set_t( GetHexBits(payload[], , ) );
162  // AMC13Trailer_.set_r( GetHexBits(payload[], , ) );
163  // AMC13Trailer_.set_dataword(uint64_t bits) { dataword = bits; };
164 
165  write_AMC13:
166 
167  (res->at(iOut)).set_AMC13Trailer(AMC13Trailer_);
168 
169  // Finished with unpacking trailers
170  return true;
171 
172  } // End bool TrailersBlockUnpacker::unpack
173 
174  // bool TrailersBlockPacker::pack(const Block& block, UnpackerCollections *coll) {
175  // std::cout << "Inside TrailersBlockPacker::pack" << std::endl;
176  // return true;
177  // } // End bool TrailersBlockPacker::pack
178 
179  } // End namespace emtf
180  } // End namespace stage2
181 } // End namespace l1t
182 
184 // DEFINE_L1T_PACKER(l1t::stage2::TrailersBlockPacker);
void set_spcsr_scc(int bits)
Definition: EventTrailer.h:33
void set_mm(int bits)
Definition: EventTrailer.h:36
void set_lp(int bits)
Definition: EventTrailer.h:29
void set_ddcsr_lf(int bits)
Definition: EventTrailer.h:32
std::vector< uint32_t > payload() const
Definition: Block.h:57
virtual int checkFormat(const Block &block)
std::vector< EMTFDaqOut > EMTFDaqOutCollection
Definition: EMTFDaqOut.h:130
void set_yy(int bits)
Definition: EventTrailer.h:35
void set_hp(int bits)
Definition: EventTrailer.h:30
JetCorrectorParametersCollection coll
Definition: classes.h:10
int Format_Errors() const
Definition: EventTrailer.h:61
virtual bool unpack(const Block &block, UnpackerCollections *coll) override
void set_sp_ladr(int bits)
Definition: EventTrailer.h:38
void set_sp_padr(int bits)
Definition: EventTrailer.h:40
#define DEFINE_L1T_UNPACKER(type)
void set_crc22(int bits)
Definition: EventTrailer.h:28
void set_bb(int bits)
Definition: EventTrailer.h:42
uint16_t GetHexBits(uint16_t word, uint16_t lowBit, uint16_t highBit)
void set_lfff(int bits)
Definition: EventTrailer.h:41
void set_sp_ersv(int bits)
Definition: EventTrailer.h:39
void set_l1a(int bits)
Definition: EventTrailer.h:34
void set_dd(int bits)
Definition: EventTrailer.h:37