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) == 0)
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 != 0) delete m_centralJetSorter;
91  if (m_forwardJetSorter != 0) delete m_forwardJetSorter;
92  if (m_tauJetSorter != 0) 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) != 0) { //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
Represents a GCT Wheel Jet FPGA.
static const unsigned int MAX_LEAF_CARDS
Max number of leaf card pointers.
virtual void fetchInput()
get input data from sources
std::vector< htComponentType > m_inputHy
bool m_verbose
Flag to control output messages.
virtual void resetPipelines()
~L1GctWheelJetFpga()
destructor
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.
std::vector< L1GctInternHtMiss > getInternalHtMiss() const
get the Et sums in internal component format
int numOfBx() const
std::vector< L1GctJetCand > JetVector
JetVector getSortedJets() const
ABC for a GCT trigger data processing unit.
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
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.
virtual void resetProcessor()
Separate reset methods for the processor itself and any data stored in pipelines. ...
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
virtual void setupObjects()
Initialise inputs with null objects for the correct bunch crossing if required.
virtual void process()
process the data, fill output buffers
void classifyJets()
Classifies jets into central, forward or tau.