CMS 3D CMS Logo

CaloTowerUnpacker.cc
Go to the documentation of this file.
3 
5 
6 #include "CaloCollections.h"
7 #include "CaloTowerUnpacker.h"
9 
10 namespace l1t {
11 namespace stage2 {
12  bool
14  {
15 
16  // check this is the correct MP
17  unsigned int tmt = block.amc().getBoardID() - l1t::stage2::layer2::mp::offsetBoardId + 1;
18  unsigned int bxid = block.amc().getBX();
19 
20  // handle offset between BC0 marker and actual BC0...
21  if( (tmt-1) != ((bxid-1+3)%9) ) return true;
22  LogDebug("L1T") << "Unpacking TMT # " << tmt << " for BX " << bxid;
23 
24  // Link number is block_ID / 2
25  unsigned link = block.header().getID()/2;
26 
27  // Also need link number rounded down to even number
28  unsigned link_phi = (link % 2 == 0) ? link : (link -1);
29 
30  // number of frames used in a few different places
31  unsigned nframes=40;
32 
33  int nBX = int(ceil(block.header().getSize()/nframes)); // Since there are two Rx links per block with 2*28 slices in barrel and endcap + 2*13 for upgraded HF
34 
35  // Find the first and last BXs
36  int firstBX = -(std::ceil((double)nBX/2.)-1);
37  int lastBX;
38  if (nBX % 2 == 0) {
39  lastBX = std::ceil((double)nBX/2.);
40  } else {
41  lastBX = std::ceil((double)nBX/2.)-1;
42  }
43 
44  auto res_ = static_cast<CaloCollections*>(coll)->getTowers();
45  res_->setBXRange(std::min(firstBX, res_->getFirstBX()), std::max(lastBX, res_->getLastBX()));
46 
47  LogDebug("L1T") << "Block : id=" << block.header().getID() << ", size=" << block.header().getSize() << ", link=" << link << ", link_phi=" << link_phi << ", nBX=" << nBX << ", firstBX=" << firstBX << ", lastBX=" << lastBX;
48 
49  // Loop over multiple BX and fill towers collection
50  for (int bx=firstBX; bx<=lastBX; bx++){
51 
52  for (unsigned iframe=0; iframe<nframes && iframe<block.header().getSize(); ++iframe) {
53 
54  uint32_t raw_data = block.payload().at(iframe);
55 
56  if ((raw_data & 0xFFFF) != 0) {
57 
58  l1t::CaloTower tower1 = l1t::CaloTower();
59 
60  // First calo tower is in the LSW with phi
61  tower1.setHwPt(raw_data & 0x1FF);
62  tower1.setHwQual((raw_data >> 12) & 0xF);
63  tower1.setHwEtRatio((raw_data >>9) & 0x7);
64  tower1.setHwPhi(link_phi+1); // iPhi starts at 1
65 
66  int ieta=iframe+1;
67  if (link % 2!=0) ieta = ieta * -1;
68 
69  tower1.setHwEta( CaloTools::caloEta(ieta) );
70 
71  LogDebug("L1T") << "Tower 1: Eta " << tower1.hwEta()
72  << " phi " << tower1.hwPhi()
73  << " pT " << tower1.hwPt()
74  << " frame " << iframe
75  << " qual " << tower1.hwQual()
76  << " EtRatio " << tower1.hwEtRatio();
77 
78  res_->push_back(bx,tower1);
79  }
80 
81  if (((raw_data >> 16)& 0xFFFF) != 0) {
82 
83  // Second calo tower is in the MSW with phi+1
84  l1t::CaloTower tower2 = l1t::CaloTower();
85 
86  tower2.setHwPt((raw_data >> 16) & 0x1FF);
87  tower2.setHwQual((raw_data >> 28 ) & 0xF);
88  tower2.setHwEtRatio((raw_data >> 25) & 0x7);
89  tower2.setHwPhi(link_phi+2);
90 
91  int ieta = iframe+1;
92  if (link % 2!=0) ieta = ieta * -1;
93  tower2.setHwEta( CaloTools::caloEta(ieta) );
94 
95  LogDebug("L1T") << "Tower 2: Eta " << tower2.hwEta()
96  << " phi " << tower2.hwPhi()
97  << " pT " << tower2.hwPt()
98  << " frame " << iframe
99  << " qual " << tower2.hwQual()
100  << " EtRatio " << tower2.hwEtRatio();
101 
102  res_->push_back(bx,tower2);
103  }
104  }
105  }
106 
107  return true;
108 
109  }
110 }
111 }
112 
#define LogDebug(id)
unsigned int getID() const
Definition: Block.h:22
BlockHeader header() const
Definition: Block.h:60
int hwEtRatio() const
Definition: CaloTower.cc:74
void setHwQual(int qual)
Definition: L1Candidate.h:44
int hwPhi() const
Definition: L1Candidate.h:50
delete x;
Definition: CaloConfig.h:22
std::vector< uint32_t > payload() const
Definition: Block.h:61
int hwEta() const
Definition: L1Candidate.h:49
T min(T a, T b)
Definition: MathUtil.h:58
int hwQual() const
Definition: L1Candidate.h:51
void setHwEtRatio(int ratio)
Definition: CaloTower.cc:49
void setHwPhi(int phi)
Definition: L1Candidate.h:43
JetCorrectorParametersCollection coll
Definition: classes.h:10
int hwPt() const
Definition: L1Candidate.h:48
virtual bool unpack(const Block &block, UnpackerCollections *coll) override
static int caloEta(int ietaMP)
Definition: CaloTools.cc:203
void setHwPt(int pt)
Definition: L1Candidate.h:41
#define DEFINE_L1T_UNPACKER(type)
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:63