CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MPUnpacker_0x10010033.cc
Go to the documentation of this file.
1 #define EDM_ML_DEBUG 1
2 
4 
6 
8 
9 #include "CaloCollections.h"
10 
12 
13 namespace l1t {
14  namespace stage2 {
16  public:
17  virtual bool unpack(const Block& block, UnpackerCollections *coll) override;
18  };
19  }
20 }
21 
22 // Implementation
23 
24 namespace l1t {
25 namespace stage2 {
26  bool
28  {
29 
30  LogDebug("L1T") << "Block ID = " << block.header().getID() << " size = " << block.header().getSize() << " AMC = " << block.amc().getAMCNumber();
31 
32  // check this is the correct MP
33  unsigned int tmt = block.amc().getBoardID() - l1t::stage2::layer2::mp::offsetBoardId + 1;
34  unsigned int bxid = block.amc().getBX();
35 
36  // handle offset between BC0 marker and actual BC0...
37  if( (tmt-1) != ((bxid-1+3)%9) ) return true;
38  LogDebug("L1T") << "Unpacking TMT # " << tmt << " for BX " << bxid;
39 
40  auto res1_ = static_cast<CaloCollections*>(coll)->getMPJets();
41  auto res2_ = static_cast<CaloCollections*>(coll)->getMPEtSums();
42  auto res3_ = static_cast<CaloCollections*>(coll)->getMPEGammas();
43  auto res4_ = static_cast<CaloCollections*>(coll)->getMPTaus();
44 
45  res1_->setBXRange(0,0);
46  res2_->setBXRange(0,0);
47  res3_->setBXRange(0,0);
48  res4_->setBXRange(0,0);
49 
50  // Initialise frame indices for each data type
51  int unsigned fet = 0;
52  int unsigned fht = 2;
53  int unsigned feg = 4;
54  int unsigned ftau = 6;
55  int unsigned fjet = 8;
56  int unsigned faux = 10;
57 
58  // ===== Jets and Sums =====
59 
60  // ET / MET(x) / MET (y) with HF (configurable)
61 
62  uint32_t raw_data = block.payload()[fet];
63 
64  l1t::EtSum ethf = l1t::EtSum();
65 
66  switch(block.header().getID()){
67  case 123: // 61
69  ethf.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
70  break;
71  case 121: // 60
73  ethf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
74  break;
75  case 127: // 63
77  ethf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
78  break;
79  case 125: // 62
81  ethf.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
82  break;
83  case 131: // 65
85  ethf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
86  break;
87  case 129: // 64
89  ethf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
90  break;
91  default:
92  break;
93  }
94 
95  LogDebug("L1T") << "ET/METx/METy: pT " << ethf.hwPt();
96 
97  res2_->push_back(0,ethf);
98 
99 
100  // ET / MET(x) / MET (y) without HF
101 
102  raw_data = block.payload()[fet + 1];
103 
104  l1t::EtSum etNoHF = l1t::EtSum();
105  l1t::EtSum etEm = l1t::EtSum();
106 
107  switch(block.header().getID()){
108  case 123: // 61
110  etNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
111  break;
112  case 121: // 60
114  etNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
115  break;
116  case 127: // 63
118  etNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
119  break;
120  case 125: // 62
122  etNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
123  break;
124  case 131: // 65
126  etNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
127  break;
128  case 129: // 64
130  etNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
131  break;
132  default:
133  break;
134  }
135 
136  LogDebug("L1T") << "ET/METx/METy (no HF): pT " << etNoHF.hwPt();
137 
138  res2_->push_back(0,etNoHF);
139 
140 
141  // ET EM
142  if(block.header().getID()==123 || block.header().getID()==125){
144  etEm.setHwPt( static_cast<int32_t>( uint32_t( ( raw_data >> 16 ) & 0xFFFF )) );
145  res2_->push_back(0,etEm);
146 
147  }
148 
149 
150  // HT / MHT(x)/ MHT (y) with HF
151 
152  raw_data = block.payload()[fht];
153 
154  l1t::EtSum hthf = l1t::EtSum();
155 
156  switch(block.header().getID()){
157  case 123: // 61
159  hthf.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
160  break;
161  case 121: // 60
163  hthf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
164  break;
165  case 127: // 63
167  hthf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
168  break;
169  case 125: // 62
171  hthf.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
172  break;
173  case 131: // 65
175  hthf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
176  break;
177  case 129: // 64
179  hthf.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
180  break;
181  default:
182  break;
183  }
184 
185  LogDebug("L1T") << "HTHF/MHTHFx/MHTHFy: pT " << hthf.hwPt();
186 
187  res2_->push_back(0,hthf);
188 
189 
190  // HT / MHT(x)/ MHT (y) no HF
191 
192  raw_data = block.payload()[fht+1];
193 
194  l1t::EtSum htNoHF = l1t::EtSum();
195 
196  switch(block.header().getID()){
197  case 123: // 61
199  htNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
200  break;
201  case 121: // 60
203  htNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
204  break;
205  case 127: // 63
207  htNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
208  break;
209  case 125: // 62
211  htNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data & 0xFFFF)) );
212  break;
213  case 131: // 65
215  htNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
216  break;
217  case 129: // 64
219  htNoHF.setHwPt( static_cast<int32_t>( uint32_t(raw_data) ) );
220  break;
221  default:
222  break;
223  }
224 
225 
226  LogDebug("L1T") << "HTNOHF/MHTNOHFx/MHTNOHFy: pT " << htNoHF.hwPt();
227 
228  res2_->push_back(0,htNoHF);
229 
230 
231  // Two jets
232  for (unsigned nJet=0; nJet < 2; nJet++){
233 
234  raw_data = block.payload()[fjet+nJet];
235 
236  if (raw_data == 0)
237  continue;
238 
239  l1t::Jet jet = l1t::Jet();
240 
241  int etasign = 1;
242  if ((block.header().getID() == 125) ||
243  (block.header().getID() == 131) ||
244  (block.header().getID() == 129)) {
245  etasign = -1;
246  }
247 
248  LogDebug("L1") << "block ID=" << block.header().getID() << " etasign=" << etasign;
249 
250  int mpEta = etasign*(raw_data & 0x3F);
251  jet.setHwEta(CaloTools::caloEta(mpEta));
252  jet.setHwPhi((raw_data >> 6) & 0x7F);
253  jet.setHwPt((raw_data >> 13) & 0xFFFF);
254  jet.setHwQual((raw_data>>29) & 0x1 );
255 
256  if (jet.hwPt()==0) continue;
257 
258  LogDebug("L1T") << "Jet: eta " << jet.hwEta() << " phi " << jet.hwPhi() << " pT " << jet.hwPt() << " qual " << jet.hwQual();
259 
260  jet.setP4( l1t::CaloTools::p4MP(&jet) );
261  res1_->push_back(0,jet);
262 
263  }
264 
265  // ===== EGammas =====
266 
267  // Two EGammas
268 
269 
270  for (unsigned nEG=0; nEG < 2; nEG++){
271 
272  raw_data = block.payload()[feg+nEG];
273 
274  if (raw_data == 0)
275  continue;
276 
277  l1t::EGamma eg = l1t::EGamma();
278 
279  int etasign = 1;
280  if ((block.header().getID() == 125) ||
281  (block.header().getID() == 131) ||
282  (block.header().getID() == 129)) {
283  etasign = -1;
284  }
285 
286  LogDebug("L1") << "block ID=" << block.header().getID() << " etasign=" << etasign;
287 
288  eg.setHwEta(etasign*((raw_data >> 3) & 0x3F));
289  eg.setHwPhi((raw_data >> 9) & 0x7F);
290  eg.setHwPt((raw_data >> 20) & 0xFFF);
291  eg.setHwIso((raw_data>>1) & 0x3);
292  eg.setHwQual((raw_data>>16) & 0xf );
293 
294  if (eg.hwPt()==0) continue;
295 
296  LogDebug("L1T") << "Egamma: eta " << eg.hwEta() << " phi " << eg.hwPhi() << " pT " << eg.hwPt() << " qual " << eg.hwQual();
297 
298  eg.setP4( l1t::CaloTools::p4MP(&eg) );
299  res3_->push_back(0,eg);
300  }
301 
302 
303  // ===== Taus =====
304 
305  // Two taus
306 
307  for (unsigned nTau=0; nTau < 2; nTau++){
308 
309  raw_data = block.payload()[ftau+nTau];
310 
311  if (raw_data == 0)
312  continue;
313 
314  l1t::Tau tau = l1t::Tau();
315 
316  int etasign = 1;
317  if ((block.header().getID() == 125) ||
318  (block.header().getID() == 131) ||
319  (block.header().getID() == 129)) {
320  etasign = -1;
321  }
322 
323  LogDebug("L1") << "block ID=" << block.header().getID() << " etasign=" << etasign;
324 
325  tau.setHwEta(etasign*((raw_data >> 3) & 0x3F));
326  tau.setHwPhi((raw_data >> 9) & 0x7F);
327  tau.setHwPt((raw_data >> 20) & 0xFFF);
328  tau.setHwIso((raw_data>>1) & 0x3);
329  tau.setHwQual((raw_data>>16) & 0xf );
330 
331  if (tau.hwPt()==0) continue;
332 
333  LogDebug("L1T") << "Tau: eta " << tau.hwEta() << " phi " << tau.hwPhi() << " pT " << tau.hwPt() << " qual " << tau.hwQual();
334 
335  tau.setP4( l1t::CaloTools::p4MP(&tau) );
336  res4_->push_back(0,tau);
337  }
338 
339  // ===== Aux =====
340  raw_data = block.payload()[faux];
341 
342  // create a sum object for each type of HF sum
343  l1t::EtSum mbp0 = l1t::EtSum();
344  l1t::EtSum mbm0 = l1t::EtSum();
345  l1t::EtSum mbm1 = l1t::EtSum();
346  l1t::EtSum mbp1 = l1t::EtSum();
347  l1t::EtSum towCount = l1t::EtSum();
348 
349  // readout the sums only if the correct block is being processed (first frame of AUX)
350  switch(block.header().getID()){
351  case 121: // this should correspond to the first link
352  // read 4 bits starting at position 24 (24 -> 28)
353  mbp0.setHwPt( ( raw_data >> 24 ) & 0xF );
355 
356  // read 4 bits starting at position 16 (16 -> 20)
357  mbm0.setHwPt( ( raw_data >> 16 ) & 0xF );
359 
360  // read 4 bits starting at position 8 (8 -> 12)
361  mbp1.setHwPt( ( raw_data >> 8 ) & 0xF );
363 
364  // read the first 4 bits by masking with 0xF
365  mbm1.setHwPt( raw_data & 0xF );
367 
368  LogDebug("L1T") << "mbp0 HF sum: " << mbp0.hwPt();
369  LogDebug("L1T") << "mbm0 HF sum: " << mbm0.hwPt();
370  LogDebug("L1T") << "mbp1 HF sum: " << mbp1.hwPt();
371  LogDebug("L1T") << "mbm1 HF sum: " << mbm1.hwPt();
372 
373  res2_->push_back(0,mbp0);
374  res2_->push_back(0,mbm0);
375  res2_->push_back(0,mbp1);
376  res2_->push_back(0,mbm1);
377  break;
378  case 127:
379  towCount.setHwPt( raw_data & 0x1FFF );
380  towCount.setType( l1t::EtSum::kTowerCount );
381  res2_->push_back(0,towCount);
382  break;
383  default:
384  break;
385  }
386 
387  return true;
388  }
389 }
390 }
391 
#define LogDebug(id)
unsigned int getID() const
Definition: Block.h:22
virtual bool unpack(const Block &block, UnpackerCollections *coll) override
Definition: Tau.h:16
BlockHeader header() const
Definition: Block.h:56
static math::PtEtaPhiMLorentzVector p4MP(l1t::L1Candidate *)
Definition: CaloTools.cc:373
void setHwQual(int qual)
Definition: L1Candidate.h:44
int hwPhi() const
Definition: L1Candidate.h:50
std::vector< uint32_t > payload() const
Definition: Block.h:57
void setType(EtSumType type)
Definition: EtSum.cc:32
Definition: Jet.h:16
int hwEta() const
Definition: L1Candidate.h:49
int hwQual() const
Definition: L1Candidate.h:51
DEFINE_L1T_UNPACKER(l1t::stage2::MPUnpacker_0x10010033)
void setHwPhi(int phi)
Definition: L1Candidate.h:43
void setHwIso(int iso)
Definition: L1Candidate.h:45
JetCorrectorParametersCollection coll
Definition: classes.h:10
int hwPt() const
Definition: L1Candidate.h:48
virtual void setP4(const LorentzVector &p4) final
set 4-momentum
static int caloEta(int ietaMP)
Definition: CaloTools.cc:203
void setHwPt(int pt)
Definition: L1Candidate.h:41
unsigned int getSize() const
Definition: Block.h:23
void setHwEta(int eta)
Definition: L1Candidate.h:42
void amc(const amc::Header &h)
Definition: Block.h:59