CMS 3D CMS Logo

L1GctWheelJetFpga.cc
Go to the documentation of this file.
2 
4 
8 
9 //DEFINE STATICS
11 const unsigned int L1GctWheelJetFpga::MAX_LEAF_CARDS = 3;
14 
16  const std::vector<L1GctJetLeafCard*>& inputLeafCards) :
18  m_id(id),
19  m_inputLeafCards(inputLeafCards),
20  m_centralJetSorter(new L1GctJetSorter()),
21  m_forwardJetSorter(new L1GctJetSorter()),
22  m_tauJetSorter(new L1GctJetSorter()),
23  m_inputJets(MAX_JETS_IN),
24  m_rawCentralJets(MAX_JETS_IN),
25  m_rawForwardJets(MAX_JETS_IN),
26  m_rawTauJets(MAX_JETS_IN),
27  m_inputHx(MAX_LEAF_CARDS),
28  m_inputHy(MAX_LEAF_CARDS),
29  m_inputHfSums(MAX_LEAF_CARDS),
30  m_centralJets(MAX_JETS_OUT),
31  m_forwardJets(MAX_JETS_OUT),
32  m_tauJets(MAX_JETS_OUT),
33  m_outputHx(0), m_outputHy(0), m_outputHfSums(),
34  m_outputHxPipe(), m_outputHyPipe()
35 {
36  if (checkSetup()) {
37 
38  setupJetsVectors(0); //Initialises all the jet vectors with jets of the correct type.
39 
40  } else {
41  if (m_verbose) {
42  edm::LogError("L1GctSetupError") << "L1GctWheelJetFpga has been incorrectly constructed";
43  }
44  }
45 }
46 
48 {
49  bool result=true;
50 
51  //Check object construction is ok
52  if(m_id < 0 || m_id > 1)
53  {
54  result = false;
55  if (m_verbose) {
56  edm::LogWarning("L1GctSetupError")
57  << "L1GctWheelJetFpga::L1GctWheelJetFpga() : Wheel Jet FPGA ID " << m_id << " has been incorrectly constructed!\n"
58  << "ID number should be between the range of 0 to 1\n";
59  }
60  }
61 
62  if(m_inputLeafCards.size() != MAX_LEAF_CARDS)
63  {
64  result = false;
65  if (m_verbose) {
66  edm::LogWarning("L1GctSetupError")
67  << "L1GctWheelJetFpga::L1GctWheelJetFpga() : Wheel Jet FPGA ID " << m_id << " has been incorrectly constructed!\n"
68  << "This class needs " << MAX_LEAF_CARDS << " jet leaf card pointers, yet only " << m_inputLeafCards.size()
69  << " leaf card pointers are present.\n";
70  }
71  }
72 
73  for(unsigned int i = 0; i < MAX_LEAF_CARDS; ++i)
74  {
75  if(m_inputLeafCards.at(i) == nullptr)
76  {
77  result = false;
78  if (m_verbose) {
79  edm::LogWarning("L1GctSetupError")
80  << "L1GctWheelJetFpga::L1GctWheelJetFpga() : Wheel Jet FPGA ID " << m_id << " has been incorrectly constructed!\n"
81  << "Leaf card pointer " << i << " has not been set!\n";
82  }
83  }
84  }
85  return result;
86 }
87 
89 {
90  if (m_centralJetSorter != nullptr) delete m_centralJetSorter;
91  if (m_forwardJetSorter != nullptr) delete m_forwardJetSorter;
92  if (m_tauJetSorter != nullptr) delete m_tauJetSorter;
93 }
94 
95 std::ostream& operator << (std::ostream& os, const L1GctWheelJetFpga& fpga)
96 {
97  using std::endl;
98  os << "===L1GctWheelJetFPGA===" << endl;
99  os << "ID = " << fpga.m_id << endl;
100  os << "No of Input Leaf Cards " << fpga.m_inputLeafCards.size() << endl;
101  for(unsigned i=0; i < fpga.m_inputLeafCards.size(); i++)
102  {
103  os << "InputLeafCard* " << i << " = " << fpga.m_inputLeafCards.at(i) << endl;
104  }
105 // os << "No. of Input Jets " << fpga.m_inputJets.size() << endl;
106 // for(unsigned i=0; i < fpga.m_inputJets.size(); i++)
107 // {
108 // os << fpga.m_inputJets.at(i);
109 // }
110 // os << "No. of raw central Jets " << fpga.m_rawCentralJets.size() << endl;
111 // for(unsigned i=0; i < fpga.m_rawCentralJets.size(); i++)
112 // {
113 // os << fpga.m_rawCentralJets.at(i);
114 // }
115 // os << "No. of raw forward Jets " << fpga.m_rawForwardJets.size() << endl;
116 // for(unsigned i=0; i < fpga.m_rawForwardJets.size(); i++)
117 // {
118 // os << fpga.m_rawForwardJets.at(i);
119 // }
120 // os << "No. of raw tau Jets " << fpga.m_rawTauJets.size() << endl;
121 // for(unsigned i=0; i < fpga.m_rawTauJets.size(); i++)
122 // {
123 // os << fpga.m_rawTauJets.at(i);
124 // }
125 // os << "No. of output central Jets " << fpga.m_centralJets.size() << endl;
126 // for(unsigned i=0; i < fpga.m_centralJets.size(); i++)
127 // {
128 // os << fpga.m_centralJets.at(i);
129 // }
130 // os << "No. of output forward Jets " << fpga.m_forwardJets.size() << endl;
131 // for(unsigned i=0; i < fpga.m_forwardJets.size(); i++)
132 // {
133 // os << fpga.m_forwardJets.at(i);
134 // }
135 // os << "No. of output tau Jets " << fpga.m_tauJets.size() << endl;
136 // for(unsigned i=0; i < fpga.m_tauJets.size(); i++)
137 // {
138 // os << fpga.m_tauJets.at(i);
139 // }
140  os << endl;
141  return os;
142 }
143 
145 {
146  for (unsigned int i=0; i<MAX_LEAF_CARDS; ++i)
147  {
148  m_inputHx.at(i).reset();
149  m_inputHy.at(i).reset();
150  m_inputHfSums.at(i).reset();
151  }
152  m_outputHx.reset();
153  m_outputHy.reset();
155 }
156 
158 {
159  setupJetsVectors(static_cast<int16_t>(bxAbs()));
160 }
161 
163 {
164  m_outputHxPipe.reset(numOfBx());
165  m_outputHyPipe.reset(numOfBx());
166 }
167 
169 {
170  if (checkSetup()) {
171  //Get Jets
172  for(unsigned short iLeaf = 0; iLeaf < MAX_LEAF_CARDS; ++iLeaf)
173  {
174  if (m_inputLeafCards.at(iLeaf) != nullptr) { //check that the pointers have been set up!
175 
176  storeJets(m_inputLeafCards.at(iLeaf)->getOutputJetsA(), iLeaf, 0);
177  storeJets(m_inputLeafCards.at(iLeaf)->getOutputJetsB(), iLeaf, L1GctJetFinderBase::MAX_JETS_OUT);
178  storeJets(m_inputLeafCards.at(iLeaf)->getOutputJetsC(), iLeaf, 2*L1GctJetFinderBase::MAX_JETS_OUT);
179 
180  // Deal with the Ht inputs
181  m_inputHx.at(iLeaf) = m_inputLeafCards.at(iLeaf)->getOutputHx();
182  m_inputHy.at(iLeaf) = m_inputLeafCards.at(iLeaf)->getOutputHy();
183 
184  // Deal with the Hf tower sum inputs
185  m_inputHfSums.at(iLeaf) = m_inputLeafCards.at(iLeaf)->getOutputHfSums();
186  }
187  }
188  }
189 }
190 
192 {
193  if (checkSetup()) {
194  classifyJets();
195 
199 
203 
204  for(unsigned short iJet = 0; iJet < MAX_JETS_OUT; ++iJet)
205  {
206  m_centralJets.at(iJet) = m_rawCentralJets.at(iJet);
207  m_forwardJets.at(iJet) = m_rawForwardJets.at(iJet);
208  m_tauJets.at(iJet) = m_rawTauJets.at(iJet);
209  }
210 
211  //Ht processing
212  m_outputHx = m_inputHx.at(0) + m_inputHx.at(1) + m_inputHx.at(2);
213  m_outputHy = m_inputHy.at(0) + m_inputHy.at(1) + m_inputHy.at(2);
214 
215  //Hf tower sums processing
217 
218  m_outputHxPipe.store( m_outputHx, bxRel());
219  m_outputHyPipe.store( m_outputHy, bxRel());
220  }
221 
222 }
223 
225 {
226  if(i >=0 && i < MAX_JETS_IN)
227  {
228  m_inputJets.at(i) = jet;
229  }
230  else
231  {
232  if (m_verbose) {
233  edm::LogError("L1GctInputError")
234  << "L1GctWheelJetFpga::setInputJet() : In WheelJetFpga ID " << m_id << ", inputted jet candidate "
235  << i << " is outside input index range of 0 to " << (MAX_JETS_IN-1) << "\n";
236  }
237  }
238 }
239 
241 std::vector< L1GctInternHtMiss > L1GctWheelJetFpga::getInternalHtMiss() const
242 {
243 
244  std::vector< L1GctInternHtMiss > result;
245  for (int bx=0; bx<numOfBx(); bx++) {
246  result.push_back( L1GctInternHtMiss::emulatorMissHtx( m_outputHxPipe.contents.at(bx).value(),
247  m_outputHxPipe.contents.at(bx).overFlow(),
248  static_cast<int16_t> (bx-bxMin()) ) );
249  result.push_back( L1GctInternHtMiss::emulatorMissHty( m_outputHyPipe.contents.at(bx).value(),
250  m_outputHyPipe.contents.at(bx).overFlow(),
251  static_cast<int16_t> (bx-bxMin()) ) );
252  }
253  return result;
254 }
255 
256 void L1GctWheelJetFpga::storeJets(const JetVector& jets, unsigned short iLeaf, unsigned short offset)
257 {
258  for(unsigned short iJet = 0; iJet < L1GctJetFinderBase::MAX_JETS_OUT; ++iJet)
259  {
260  m_inputJets.at(iLeaf*MAX_JETS_PER_LEAF + offset + iJet) = jets.at(iJet);
261  }
262 }
263 
265 {
266  JetVector::iterator currentJet;
267 
268  unsigned short pos=0;
269  // In the case of two jets of equal rank, the sort will take the lower priority.
270  // This corresponds to the lower position in the array. In order to mimic the hardware
271  // behaviour, the order of jets from the input leaf cards is maintained here.
272  for(currentJet = m_inputJets.begin(); currentJet != m_inputJets.end(); ++currentJet, ++pos)
273  {
274  if (!currentJet->empty()) {
275  if(currentJet->isForward()) //forward jet
276  {
277  m_rawForwardJets.at(pos) = *currentJet;
278  }
279  else
280  {
281  if(currentJet->isCentral()) //central non-tau jet.
282  {
283  m_rawCentralJets.at(pos) = *currentJet;
284  }
285  else //must be central tau-jet
286  {
287  if(currentJet->isTau())
288  {
289  m_rawTauJets.at(pos) = *currentJet;
290  }
291  else
292  { //shouldn't get here!
293  if (m_verbose) {
294  edm::LogWarning("L1GctProcessingError")
295  << "Unclassified jet found by WheelJetFpga id " << m_id
296  << ". Jet details follow." << std::endl << *currentJet << std::endl;
297  }
298  }
299  }
300  }
301  }
302  }
303 }
304 
306 {
307  // Create empty jet candidates with the three different combinations
308  // of flags, corresponding to central, forward and tau jets
309  L1GctJetCand tempCen(0, 0, 0, false, false, (uint16_t) 0, (uint16_t) 0, bx);
310  L1GctJetCand tempTau(0, 0, 0, true, false, (uint16_t) 0, (uint16_t) 0, bx);
311  L1GctJetCand tempFwd(0, 0, 0, false, true, (uint16_t) 0, (uint16_t) 0, bx);
312 
313  // Initialize the jet vectors with copies of the appropriate empty jet type
314  m_rawCentralJets.assign(MAX_JETS_IN, tempCen);
315  m_rawTauJets.assign (MAX_JETS_IN, tempTau);
316  m_rawForwardJets.assign(MAX_JETS_IN, tempFwd);
317 
318  m_centralJets.assign(MAX_JETS_OUT, tempCen);
319  m_tauJets.assign (MAX_JETS_OUT, tempTau);
320  m_forwardJets.assign(MAX_JETS_OUT, tempFwd);
321 }
L1GctWheelJetFpga(int id, const std::vector< L1GctJetLeafCard * > &inputLeafCards)
id must be 0 / 1 for -ve/+ve eta halves of CMS
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
void setupJetsVectors(const int16_t bx)
Initialises all the jet vectors with jets of the correct type.
static L1GctInternHtMiss emulatorMissHty(const int hty, const bool overFlow, const int16_t bx)
Named ctor for making missing Ht y component object from emulator.
htComponentType m_outputHy
void setupObjects() override
Initialise inputs with null objects for the correct bunch crossing if required.
Represents a GCT Wheel Jet FPGA.
static const unsigned int MAX_LEAF_CARDS
Max number of leaf card pointers.
std::vector< htComponentType > m_inputHy
bool m_verbose
Flag to control output messages.
void process() override
process the data, fill output buffers
Level-1 Trigger jet candidate.
Definition: L1GctJetCand.h:18
JetVector m_inputJets
input data. Jets 0-5 from leaf card 0, jetfinderA. Jets 6-11 from leaf card 0, jetfinder B...
int bxRel() const
int bxMin() const
Support for multiple beam crossing operation.
void fetchInput() override
get input data from sources
std::vector< L1GctInternHtMiss > getInternalHtMiss() const
get the Et sums in internal component format
int numOfBx() const
std::vector< L1GctJetCand > JetVector
void resetPipelines() override
JetVector getSortedJets() const
ABC for a GCT trigger data processing unit.
void resetProcessor() override
Separate reset methods for the processor itself and any data stored in pipelines. ...
void storeJets(const JetVector &jets, unsigned short iLeaf, unsigned short offset)
Puts the output from a jetfinder into the correct index range of the m_inputJets array.
L1GctJetSorter * m_centralJetSorter
Jet sorters.
Pipeline< htComponentType > m_outputHyPipe
vector< PseudoJet > jets
htComponentType m_outputHx
friend std::ostream & operator<<(std::ostream &os, const L1GctWheelJetFpga &fpga)
Overload << operator.
std::vector< hfTowerSumsType > m_inputHfSums
Pipeline< htComponentType > m_outputHxPipe
static L1GctInternHtMiss emulatorMissHtx(const int htx, const bool overFlow, const int16_t bx)
Named ctor for making missing Ht x component object from emulator.
std::vector< htComponentType > m_inputHx
static const int MAX_JET_FINDERS
Number of jetfinders per jet leaf card.
void setInputJet(int i, const L1GctJetCand &jet)
set input data
~L1GctWheelJetFpga() override
destructor
static const int MAX_JETS_IN
Maximum number of jets we can have as input.
static const int MAX_JETS_OUT
Max number of jets of each type we output.
std::vector< L1GctJetLeafCard * > m_inputLeafCards
the jet leaf cards
int bxAbs() const
void reset()
reset value and overflow to zero
L1GctJetSorter * m_tauJetSorter
void setJets(JetVector &inputJets)
hfTowerSumsType m_outputHfSums
bool checkSetup() const
Check the setup, independently of how we have been constructed.
static const unsigned int MAX_JETS_PER_LEAF
Max number of jets input from each leaf card.
L1GctJetSorter * m_forwardJetSorter
void classifyJets()
Classifies jets into central, forward or tau.