CMS 3D CMS Logo

L1GctJetFinderBase.cc
Go to the documentation of this file.
2 
7 
10 
12 
13 //DEFINE STATICS
14 const unsigned int L1GctJetFinderBase::MAX_JETS_OUT = 6;
15 const unsigned int L1GctJetFinderBase::N_EXTRA_REGIONS_ETA00 = 2;
16 const unsigned int L1GctJetFinderBase::COL_OFFSET = L1GctJetFinderParams::NUMBER_ETA_VALUES + N_EXTRA_REGIONS_ETA00;
18 
20 const unsigned int L1GctJetFinderBase::N_COLS = 2;
21 const unsigned int L1GctJetFinderBase::CENTRAL_COL0 = 0;
22 
24  : L1GctProcessor(),
25  m_id(id),
26  m_neighbourJetFinders(2),
27  m_idInRange(false),
28  m_gotNeighbourPointers(false),
29  m_gotJetFinderParams(false),
30  m_gotJetEtCalLuts(false),
31  m_gotChannelMask(false),
32  m_positiveEtaWheel(id >= (int)(L1CaloRegionDetId::N_PHI / 2)),
33  m_minColThisJf(0),
34  m_CenJetSeed(0),
35  m_FwdJetSeed(0),
36  m_TauJetSeed(0),
37  m_EtaBoundry(0),
38  m_jetEtCalLuts(),
39  m_useImprovedTauAlgo(false),
40  m_ignoreTauVetoBitsForIsolation(false),
41  m_tauIsolationThreshold(0),
42  m_HttSumJetThreshold(0),
43  m_HtmSumJetThreshold(0),
44  m_EttMask(),
45  m_EtmMask(),
46  m_HttMask(),
47  m_HtmMask(),
48  m_inputRegions(MAX_REGIONS_IN),
49  m_sentProtoJets(MAX_JETS_OUT),
50  m_rcvdProtoJets(MAX_JETS_OUT),
51  m_keptProtoJets(MAX_JETS_OUT),
52  m_outputJets(MAX_JETS_OUT),
53  m_sortedJets(MAX_JETS_OUT),
54  m_outputHfSums(),
55  m_outputJetsPipe(MAX_JETS_OUT),
56  m_outputEtSumPipe(),
57  m_outputExSumPipe(),
58  m_outputEySumPipe(),
59  m_outputHtSumPipe(),
60  m_outputHxSumPipe(),
61  m_outputHySumPipe() {
62  // Call reset to initialise vectors for input and output
63  this->reset();
64  //Check jetfinder setup
65  if (m_id < 0 || m_id >= static_cast<int>(L1CaloRegionDetId::N_PHI)) {
66  if (m_verbose) {
67  edm::LogWarning("L1GctSetupError") << "L1GctJetFinderBase::L1GctJetFinderBase() : Jet Finder ID " << m_id
68  << " has been incorrectly constructed!\n"
69  << "ID number should be between the range of 0 to "
70  << L1CaloRegionDetId::N_PHI - 1 << "\n";
71  }
72  } else {
73  m_idInRange = true;
74  }
75 }
76 
78 
80 void L1GctJetFinderBase::setNeighbourJetFinders(const std::vector<L1GctJetFinderBase*>& neighbours) {
82  if (neighbours.size() == 2) {
83  m_neighbourJetFinders = neighbours;
84  } else {
85  m_gotNeighbourPointers = false;
86  if (m_verbose) {
87  edm::LogWarning("L1GctSetupError") << "L1GctJetFinderBase::setNeighbourJetFinders() : In Jet Finder ID " << m_id
88  << " size of input vector should be 2, but is in fact " << neighbours.size()
89  << "\n";
90  }
91  }
92  if (m_neighbourJetFinders.at(0) == nullptr) {
93  m_gotNeighbourPointers = false;
94  if (m_verbose) {
95  edm::LogWarning("L1GctSetupError") << "L1GctJetFinderBase::setNeighbourJetFinders() : In Jet Finder ID " << m_id
96  << " first neighbour pointer is set to zero\n";
97  }
98  }
99  if (m_neighbourJetFinders.at(1) == nullptr) {
100  m_gotNeighbourPointers = false;
101  if (m_verbose) {
102  edm::LogWarning("L1GctSetupError") << "L1GctJetFinderBase::setNeighbourJetFinders() : In Jet Finder ID " << m_id
103  << " second neighbour pointer is set to zero\n";
104  }
105  }
107  edm::LogError("L1GctSetupError") << "Jet Finder ID " << m_id << " has incorrect assignment of neighbour pointers";
108  }
109 }
110 
113  m_CenJetSeed = jfpars->getCenJetEtSeedGct();
114  m_FwdJetSeed = jfpars->getForJetEtSeedGct();
115  m_TauJetSeed = jfpars->getTauJetEtSeedGct();
120  m_gotJetFinderParams = true;
121 }
122 
125  m_jetEtCalLuts = jfluts;
127 }
128 
131  bool matchCheckEttAndEtm = true;
132  if (chmask != nullptr) {
133  static const unsigned N_ETA = L1GctJetFinderParams::NUMBER_ETA_VALUES;
134  for (unsigned ieta = 0; ieta < N_ETA; ++ieta) {
135  unsigned globalEta = (m_positiveEtaWheel ? N_ETA + ieta : N_ETA - (ieta + 1));
136  m_EttMask[ieta] = chmask->totalEtMask(globalEta);
137  m_EtmMask[ieta] = chmask->missingEtMask(globalEta);
138  m_HttMask[ieta] = chmask->totalHtMask(globalEta);
139  m_HtmMask[ieta] = chmask->missingHtMask(globalEta);
140 
141  matchCheckEttAndEtm &= (m_EttMask[ieta] == m_EtmMask[ieta]);
142  }
143  if (!matchCheckEttAndEtm)
144  edm::LogWarning("L1GctSetupError")
145  << "L1GctJetFinderBase::setEnergySumMasks() : In Jet Finder ID " << m_id
146  << " setting eta-dependent masks for Et sums: you cannot have different masks for total and missing Et\n";
147  m_gotChannelMask = true;
148  }
149 }
150 
151 std::ostream& operator<<(std::ostream& os, const L1GctJetFinderBase& algo) {
152  using std::endl;
153  os << "ID = " << algo.m_id << endl;
154  os << "Calibration lut pointers stored for " << algo.m_jetEtCalLuts.size() << " eta bins" << endl;
155  for (unsigned ieta = 0; ieta < algo.m_jetEtCalLuts.size(); ieta++) {
156  os << "Eta bin " << ieta << ", JetEtCalibrationLut* = " << algo.m_jetEtCalLuts.at(ieta) << endl;
157  }
158  os << "No of input regions " << algo.m_inputRegions.size() << endl;
159  // for(unsigned i=0; i < algo.m_inputRegions.size(); ++i)
160  // {
161  // os << algo.m_inputRegions.at(i);
162  // }
163  os << "No of output jets " << algo.m_outputJets.size() << endl;
164  // for(unsigned i=0; i < algo.m_outputJets.size(); ++i)
165  // {
166  // os << algo.m_outputJets.at(i);
167  // }
168  os << "Output total scalar Et " << algo.m_outputEtSum << endl;
169  os << "Output vector Et x component " << algo.m_outputExSum << endl;
170  os << "Output vector Et y component " << algo.m_outputEySum << endl;
171  os << "Output total scalar Ht " << algo.m_outputHtSum << endl;
172  os << "Output vector Ht x component " << algo.m_outputHxSum << endl;
173  os << "Output vector Ht y component " << algo.m_outputHySum << endl;
174  os << endl;
175 
176  return os;
177 }
178 
180  m_inputRegions.clear();
181  m_inputRegions.resize(this->maxRegionsIn());
182  m_outputJets.clear();
183  m_outputJets.resize(MAX_JETS_OUT);
184  m_sortedJets.clear();
185  m_sortedJets.resize(MAX_JETS_OUT);
186 
187  m_sentProtoJets.clear();
189  m_rcvdProtoJets.clear();
191  m_keptProtoJets.clear();
193 
194  m_outputEtSum = 0;
195  m_outputExSum = 0;
196  m_outputEySum = 0;
197  m_outputHtSum = 0;
198  m_outputHxSum = 0;
199  m_outputHySum = 0;
200 
202 }
203 
206  m_outputEtSumPipe.reset(numOfBx());
207  m_outputExSumPipe.reset(numOfBx());
208  m_outputEySumPipe.reset(numOfBx());
209  m_outputHtSumPipe.reset(numOfBx());
210  m_outputHxSumPipe.reset(numOfBx());
211  m_outputHySumPipe.reset(numOfBx());
212 }
213 
220  L1GctRegion tempRgn;
221  tempRgn.setBx(bxAbs());
222  m_inputRegions.assign(this->maxRegionsIn(), tempRgn);
223 
226  m_sentProtoJets.assign(MAX_JETS_OUT, tempRgn);
227  m_rcvdProtoJets.assign(MAX_JETS_OUT, tempRgn);
228  m_keptProtoJets.assign(MAX_JETS_OUT, tempRgn);
229 
231  L1GctJet tempJet;
232  tempJet.setBx(bxAbs());
233  m_outputJets.assign(MAX_JETS_OUT, tempJet);
234 }
235 
236 // This is how the regions from the RCT get into the GCT for processing
238  static const unsigned NPHI = L1CaloRegionDetId::N_PHI;
239  static const unsigned N_00 = N_EXTRA_REGIONS_ETA00;
240  unsigned crate = region.rctCrate();
241  // Find the column for this region in a global (eta,phi) array
242  // Note the column numbers here are not the same as region->gctPhi()
243  // because the RCT crates are not numbered from phi=0.
244  unsigned colAbsolute = (crate + 1) * 2 + region.rctPhi();
245  unsigned colRelative = ((colAbsolute + NPHI) - m_minColThisJf) % NPHI;
246  if (colRelative < this->nCols()) {
247  // We are in the right range in phi
248  // Now check we are in the right wheel (positive or negative eta)
249  if ((crate / N_JF_PER_WHEEL) == (m_id / N_JF_PER_WHEEL)) {
250  unsigned i = colRelative * COL_OFFSET + N_00 + region.rctEta();
252  } else {
253  // Accept neighbouring regions from the other wheel
254  if (region.rctEta() < N_00) {
255  unsigned i = colRelative * COL_OFFSET + N_00 - (region.rctEta() + 1);
257  }
258  }
259  }
260 }
261 
263 std::vector<L1GctInternJetData> L1GctJetFinderBase::getInternalJets() const {
264  std::vector<L1GctInternJetData> result;
265  for (RawJetVector::const_iterator jet = m_outputJetsPipe.contents.begin(); jet != m_outputJetsPipe.contents.end();
266  jet++) {
267  result.push_back(L1GctInternJetData::fromEmulator(jet->id(),
268  jet->bx(),
269  jet->calibratedEt(m_jetEtCalLuts.at(jet->rctEta())),
270  jet->overFlow(),
271  jet->tauVeto(),
272  jet->hwEta(),
273  jet->hwPhi(),
274  jet->rank(m_jetEtCalLuts.at(jet->rctEta()))));
275  }
276  return result;
277 }
278 
280 std::vector<L1GctInternEtSum> L1GctJetFinderBase::getInternalEtSums() const {
281  std::vector<L1GctInternEtSum> result;
282  for (int bx = 0; bx < numOfBx(); bx++) {
283  result.push_back(L1GctInternEtSum::fromEmulatorJetTotEt(m_outputEtSumPipe.contents.at(bx).value(),
284  m_outputEtSumPipe.contents.at(bx).overFlow(),
285  static_cast<int16_t>(bx - bxMin())));
286  result.push_back(L1GctInternEtSum::fromEmulatorJetMissEt(m_outputExSumPipe.contents.at(bx).value(),
287  m_outputExSumPipe.contents.at(bx).overFlow(),
288  static_cast<int16_t>(bx - bxMin())));
289  result.push_back(L1GctInternEtSum::fromEmulatorJetMissEt(m_outputEySumPipe.contents.at(bx).value(),
290  m_outputEySumPipe.contents.at(bx).overFlow(),
291  static_cast<int16_t>(bx - bxMin())));
292  result.push_back(L1GctInternEtSum::fromEmulatorJetTotHt(m_outputHtSumPipe.contents.at(bx).value(),
293  m_outputHtSumPipe.contents.at(bx).overFlow(),
294  static_cast<int16_t>(bx - bxMin())));
295  }
296  return result;
297 }
298 
299 std::vector<L1GctInternHtMiss> L1GctJetFinderBase::getInternalHtMiss() const {
300  std::vector<L1GctInternHtMiss> result;
301  for (int bx = 0; bx < numOfBx(); bx++) {
302  result.push_back(L1GctInternHtMiss::emulatorJetMissHt(m_outputHxSumPipe.contents.at(bx).value(),
303  m_outputHySumPipe.contents.at(bx).value(),
304  m_outputHxSumPipe.contents.at(bx).overFlow(),
305  static_cast<int16_t>(bx - bxMin())));
306  }
307  return result;
308 }
309 
310 // PROTECTED METHODS BELOW
313  switch (ft) {
314  case TOP:
315  m_rcvdProtoJets = m_neighbourJetFinders.at(0)->getSentProtoJets();
316  break;
317  case BOT:
318  m_rcvdProtoJets = m_neighbourJetFinders.at(1)->getSentProtoJets();
319  break;
320  case TOPBOT:
321  // Copy half the jets from each neighbour
322  static const unsigned int MAX_TOPBOT_JETS = MAX_JETS_OUT / 2;
323  unsigned j = 0;
325  temp = m_neighbourJetFinders.at(0)->getSentProtoJets();
326  for (; j < MAX_TOPBOT_JETS; ++j) {
327  m_rcvdProtoJets.at(j) = temp.at(j);
328  }
329  temp = m_neighbourJetFinders.at(1)->getSentProtoJets();
330  for (; j < MAX_JETS_OUT; ++j) {
331  m_rcvdProtoJets.at(j) = temp.at(j);
332  }
333  break;
334  }
335 }
336 
339  JetVector tempJets(MAX_JETS_OUT);
340  for (unsigned j = 0; j < MAX_JETS_OUT; j++) {
341  tempJets.at(j) = m_outputJets.at(j).jetCand(m_jetEtCalLuts);
342  }
343 
344  // Sort the jets
345  L1GctJetSorter jSorter(tempJets);
346  m_sortedJets = jSorter.getSortedJets();
347 
348  //store jets in "pipeline memory" for checking
350 }
351 
354  // Refactored energy sums code - find scalar and vector sums
355  // of Et and Ht instead of strip stums
356  doEtSums();
357  doHtSums();
358 
359  //calculate the Hf tower Et sums and tower-over-threshold counts
361 
362  return;
363 }
364 
365 // Calculates scalar and vector sum of Et over input regions
367  unsigned et0 = 0;
368  unsigned et1 = 0;
369  bool of = false;
370 
371  // Add the Et values from regions 2 to 12 for strip 0,
372  // the Et values from regions 15 to 25 for strip 1.
373  unsigned offset = COL_OFFSET * centralCol0();
374  unsigned ieta = 0;
375  for (UShort i = offset + N_EXTRA_REGIONS_ETA00; i < offset + COL_OFFSET; ++i, ++ieta) {
376  if (!m_EttMask[ieta]) {
377  et0 += m_inputRegions.at(i).et();
378  of |= m_inputRegions.at(i).overFlow();
379  et1 += m_inputRegions.at(i + COL_OFFSET).et();
380  of |= m_inputRegions.at(i + COL_OFFSET).overFlow();
381  }
382  }
383 
384  etTotalType etStrip0(et0);
385  etTotalType etStrip1(et1);
386  etStrip0.setOverFlow(etStrip0.overFlow() || of);
387  etStrip1.setOverFlow(etStrip1.overFlow() || of);
388  unsigned xfact0 = (4 * m_id + 6) % 36;
389  unsigned xfact1 = (4 * m_id + 8) % 36;
390  unsigned yfact0 = (4 * m_id + 15) % 36;
391  unsigned yfact1 = (4 * m_id + 17) % 36;
392  m_outputEtSum = etStrip0 + etStrip1;
393  if (m_outputEtSum.overFlow())
395  m_outputExSum = etComponentForJetFinder<L1GctInternEtSum::kTotEtOrHtNBits, L1GctInternEtSum::kJetMissEtNBits>(
396  etStrip0, xfact0, etStrip1, xfact1);
397  m_outputEySum = etComponentForJetFinder<L1GctInternEtSum::kTotEtOrHtNBits, L1GctInternEtSum::kJetMissEtNBits>(
398  etStrip0, yfact0, etStrip1, yfact1);
399 
402  m_outputEySumPipe.store(m_outputEySum, bxRel());
403 }
404 
405 // Calculates scalar and vector sum of Ht over calibrated jets
407  unsigned htt = 0;
408  unsigned ht0 = 0;
409  unsigned ht1 = 0;
410  bool of = false;
411 
412  for (UShort i = 0; i < MAX_JETS_OUT; ++i) {
413  // Only sum Ht for valid jets
414  if (!m_outputJets.at(i).isNullJet()) {
415  unsigned ieta = m_outputJets.at(i).rctEta();
416  unsigned htJet = m_outputJets.at(i).calibratedEt(m_jetEtCalLuts.at(ieta));
417  // Scalar sum of Htt, with associated threshold
418  if (htJet >= m_HttSumJetThreshold && !m_HttMask[ieta]) {
419  htt += htJet;
420  }
421  // Strip sums, for input to Htm calculation, with associated threshold
422  if (htJet >= m_HtmSumJetThreshold && !m_HtmMask[ieta]) {
423  if (m_outputJets.at(i).rctPhi() == 0) {
424  ht0 += htJet;
425  }
426  if (m_outputJets.at(i).rctPhi() == 1) {
427  ht1 += htJet;
428  }
429  of |= m_outputJets.at(i).overFlow();
430  }
431  }
432  }
433 
434  etHadType httTotal(htt);
435  etHadType htStrip0(ht0);
436  etHadType htStrip1(ht1);
437  httTotal.setOverFlow(httTotal.overFlow() || of);
438  if (httTotal.overFlow())
439  httTotal.setValue(htTotalMaxValue);
440  htStrip0.setOverFlow(htStrip0.overFlow() || of);
441  htStrip1.setOverFlow(htStrip1.overFlow() || of);
442  unsigned xfact0 = (4 * m_id + 10) % 36;
443  unsigned xfact1 = (4 * m_id + 4) % 36;
444  unsigned yfact0 = (4 * m_id + 19) % 36;
445  unsigned yfact1 = (4 * m_id + 13) % 36;
446  m_outputHtSum = httTotal;
447  m_outputHxSum = etComponentForJetFinder<L1GctInternEtSum::kTotEtOrHtNBits, L1GctInternHtMiss::kJetMissHtNBits>(
448  htStrip0, xfact0, htStrip1, xfact1);
449  m_outputHySum = etComponentForJetFinder<L1GctInternEtSum::kTotEtOrHtNBits, L1GctInternHtMiss::kJetMissHtNBits>(
450  htStrip0, yfact0, htStrip1, yfact1);
451 
452  // Common overflow for Ht components
453  bool htmOverFlow = m_outputHxSum.overFlow() || m_outputHySum.overFlow();
454  m_outputHxSum.setOverFlow(htmOverFlow);
455  m_outputHySum.setOverFlow(htmOverFlow);
456 
459  m_outputHySumPipe.store(m_outputHySum, bxRel());
460 }
461 
462 // Calculates Hf inner rings Et sum, and counts number of "fineGrain" bits set
464  static const UShort NUMBER_OF_FRWRD_RINGS = 4;
465  static const UShort NUMBER_OF_INNER_RINGS = 2;
466  std::vector<unsigned> et(NUMBER_OF_INNER_RINGS, 0);
467  std::vector<bool> of(NUMBER_OF_INNER_RINGS, false);
468  std::vector<unsigned> nt(NUMBER_OF_INNER_RINGS, 0);
469 
470  UShort offset = COL_OFFSET * (centralCol0() + 1);
471  for (UShort i = 0; i < NUMBER_OF_FRWRD_RINGS; ++i) {
472  offset--;
473 
474  // Sum HF Et and count jets above threshold over "inner rings"
475  if (i < NUMBER_OF_INNER_RINGS) {
476  et.at(i) += m_inputRegions.at(offset).et();
477  of.at(i) = of.at(i) || m_inputRegions.at(offset).overFlow();
478 
479  et.at(i) += m_inputRegions.at(offset + COL_OFFSET).et();
480  of.at(i) = of.at(i) || m_inputRegions.at(offset + COL_OFFSET).overFlow();
481 
482  if (m_inputRegions.at(offset).fineGrain())
483  nt.at(i)++;
484  if (m_inputRegions.at(offset + COL_OFFSET).fineGrain())
485  nt.at(i)++;
486  }
487  }
488  hfTowerSumsType temp(et.at(0), et.at(1), nt.at(0), nt.at(1));
489  temp.etSum0.setOverFlow(temp.etSum0.overFlow() || of.at(0));
490  temp.etSum1.setOverFlow(temp.etSum1.overFlow() || of.at(1));
491  return temp;
492 }
493 
494 // Here is where the rotations are actually done
495 // Procedure suitable for implementation in hardware, using
496 // integer multiplication and bit shifting operations
497 
498 template <int kBitsInput, int kBitsOutput>
500  const L1GctUnsignedInt<kBitsInput>& etStrip0,
501  const unsigned& fact0,
502  const L1GctUnsignedInt<kBitsInput>& etStrip1,
503  const unsigned& fact1) {
504  // typedefs and constants
505  typedef L1GctTwosComplement<kBitsOutput> OutputType;
506 
507  // The sin(phi), cos(phi) factors are represented in 15 bits,
508  // as numbers in the range -2^14 to 2^14.
509  // We multiply each input strip Et by the required factor
510  // then shift, to divide by 2^13. This gives an extra bit
511  // of precision on the LSB of the output values.
512  // It's important to avoid systematically biasing the Ex, Ey
513  // component values because this results in an asymmetric
514  // distribution in phi for the final MEt.
515  // The extra LSB is required because one of the factors is 0.5.
516  // Applying this factor without the extra LSB corrects odd values
517  // systematically down by 0.5; or all values by 0.25
518  // on average, giving a shift of -2 units in Ex.
519 
520  static const int internalComponentSize = 15;
521  static const int maxEt = 1 << internalComponentSize;
522 
523  static const int kBitsFactor = internalComponentSize + kBitsInput + 1;
524  static const int maxFactor = 1 << kBitsFactor;
525 
526  static const int bitsToShift = internalComponentSize - 2;
527  static const int halfInputLsb = 1 << (bitsToShift - 1);
528 
529  // These factors correspond to the sine of angles from -90 degrees to
530  // 90 degrees in 10 degree steps, multiplied by 16383 and written
531  // as a <kBitsFactor>-bit 2s-complement number.
532  const int factors[19] = {maxFactor - 16383,
533  maxFactor - 16134,
534  maxFactor - 15395,
535  maxFactor - 14188,
536  maxFactor - 12550,
537  maxFactor - 10531,
538  maxFactor - 8192,
539  maxFactor - 5603,
540  maxFactor - 2845,
541  0,
542  2845,
543  5603,
544  8192,
545  10531,
546  12550,
547  14188,
548  15395,
549  16134,
550  16383};
551 
552  int rotatedValue0, rotatedValue1, myFact;
553  int etComponentSum = 0;
554 
555  if (fact0 >= 36 || fact1 >= 36) {
556  if (m_verbose) {
557  edm::LogError("L1GctProcessingError") << "L1GctJetLeafCard::rotateEtValue() has been called with factor numbers "
558  << fact0 << " and " << fact1 << "; should be less than 36 \n";
559  }
560  } else {
561  // First strip - choose the required multiplication factor
562  if (fact0 > 18) {
563  myFact = factors[(36 - fact0)];
564  } else {
565  myFact = factors[fact0];
566  }
567 
568  // Multiply the Et value by the factor.
569  rotatedValue0 = static_cast<int>(etStrip0.value()) * myFact;
570 
571  // Second strip - choose the required multiplication factor
572  if (fact1 > 18) {
573  myFact = factors[(36 - fact1)];
574  } else {
575  myFact = factors[fact1];
576  }
577 
578  // Multiply the Et value by the factor.
579  rotatedValue1 = static_cast<int>(etStrip1.value()) * myFact;
580 
581  // Add the two scaled values together, with full resolution including
582  // fractional parts from the sin(phi), cos(phi) scaling.
583  // Adjust the value to avoid truncation errors since these
584  // accumulate and cause problems for the missing Et measurement.
585  // Then discard the 13 LSB and interpret the result as
586  // a 15-bit twos complement integer.
587  etComponentSum = ((rotatedValue0 + rotatedValue1) + halfInputLsb) >> bitsToShift;
588 
589  etComponentSum = etComponentSum & (maxEt - 1);
590  if (etComponentSum >= (maxEt / 2)) {
591  etComponentSum = etComponentSum - maxEt;
592  }
593  }
594 
595  // Store as a TwosComplement format integer and return
596  OutputType temp(etComponentSum);
597  temp.setOverFlow(temp.overFlow() || etStrip0.overFlow() || etStrip1.overFlow());
598  return temp;
599 }
600 
601 // Declare the specific versions we want to use, to help the linker out
602 // One for the MET components
604 L1GctJetFinderBase::etComponentForJetFinder<L1GctInternEtSum::kTotEtOrHtNBits, L1GctInternEtSum::kJetMissEtNBits>(
605  const L1GctJetFinderBase::etTotalType&, const unsigned&, const L1GctJetFinderBase::etTotalType&, const unsigned&);
606 
607 // One for the MHT components
609 L1GctJetFinderBase::etComponentForJetFinder<L1GctInternEtSum::kTotEtOrHtNBits, L1GctInternHtMiss::kJetMissHtNBits>(
610  const L1GctJetFinderBase::etTotalType&, const unsigned&, const L1GctJetFinderBase::etTotalType&, const unsigned&);
bool m_idInRange
Remember whether range check on the input ID was ok.
bool overFlow() const
access overflow
void setOverFlow(bool oflow)
set the overflow bit
void reset()
complete reset of processor
etTotalType m_outputEtSum
output Et strip sums and Ht - refactored
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
std::vector< L1GctJetCand > JetVector
void doEtSums()
Calculates scalar and vector sum of Et over input regions.
void setOverFlow(bool oflow)
set the overflow bit
RegionsVector m_sentProtoJets
List of pre-clustered jets to be sent to neighbour after the first stage of clustering.
htCompInternJfType m_outputHySum
static L1GctInternEtSum fromEmulatorJetTotEt(unsigned totEt, bool overFlow, int16_t bx)
Emulator constructors.
hfTowerSumsType calcHfSums() const
Calculates Et sum and number of towers over threshold in Hf.
unsigned rctEta() const
get local eta index (within RCT crate)
Definition: L1CaloRegion.h:147
unsigned rctCrate() const
get RCT crate ID
Definition: L1CaloRegion.h:138
void store(const T &thisBx, const int bxNum)
bool m_verbose
Flag to control output messages.
~L1GctJetFinderBase() override
unsigned getCenJetEtSeedGct() const
unsigned getTauJetEtSeedGct() const
std::vector< L1GctInternHtMiss > getInternalHtMiss() const
bool m_gotChannelMask
Remember whether channel mask have been stored.
Gct version of a calorimeter region, used within GCT emulation.
Definition: L1GctRegion.h:17
void setBx(int16_t bx)
set bx
int bxRel() const
bool totalHtMask(unsigned ieta) const
int bxMin() const
Support for multiple beam crossing operation.
void setNeighbourJetFinders(const std::vector< L1GctJetFinderBase * > &neighbours)
Set pointers to neighbours - needed to complete the setup.
bool missingHtMask(unsigned ieta) const
fetchType
different ways of getting the neighbour data
htCompInternJfType m_outputHxSum
unsigned getTauIsoEtThresholdGct() const
int numOfBx() const
Pipeline< etTotalType > m_outputEtSumPipe
"Pipeline memories" for energy sums
L1GctJetFinderBase(int id)
id is 0-8 for -ve Eta jetfinders, 9-17 for +ve Eta, for increasing Phi.
A Level-1 jet candidate, used within GCT emulation.
Definition: L1GctJet.h:26
void setBx(const int16_t bx)
Definition: L1GctJet.h:53
virtual unsigned centralCol0() const
JetVector getSortedJets() const
Base class to allow implementation of jetFinder algorithms.
static L1GctRegion makeJfInputRegion(const L1CaloRegion &)
Definition: L1GctRegion.cc:7
ABC for a GCT trigger data processing unit.
static L1GctInternEtSum fromEmulatorJetTotHt(unsigned totHt, bool overFlow, int16_t bx)
unsigned value() const
access value as unsigned
unsigned getMHtJetEtThresholdGct() const
L1GctTwosComplement< kBitsOutput > etComponentForJetFinder(const L1GctUnsignedInt< kBitsInput > &etStrip0, const unsigned &fact0, const L1GctUnsignedInt< kBitsInput > &etStrip1, const unsigned &fact1)
Private method for calculating MEt and MHt components.
friend std::ostream & operator<<(std::ostream &os, const L1GctJetFinderBase &algo)
Overload << operator.
bool m_gotNeighbourPointers
Remember whether the neighbour pointers have been stored.
Pipeline< etHadType > m_outputHtSumPipe
std::vector< L1GctInternJetData > getInternalJets() const
get output jets in raw format - to be stored in the event
void doHtSums()
Calculates scalar and vector sum of Ht over calibrated jets.
Definition of signed integer types with overflow.
static L1GctInternHtMiss emulatorJetMissHt(const int htx, const int hty, const bool overFlow, const int16_t bx)
Named ctor for making missing Ht x & y components object from emulator (jetFinder output)...
void sortJets()
Sort the found jets. All jetFinders should call this in process().
std::vector< L1GctInternEtSum > getInternalEtSums() const
get et sums in raw format - to be stored in the event
unsigned rctPhi() const
get local phi index (within RCT crate)
Definition: L1CaloRegion.h:150
void setJetEtCalibrationLuts(const lutPtrVector &jfluts)
Set pointer to calibration Lut - needed to complete the setup.
lutPtrVector m_jetEtCalLuts
Jet Et Conversion LUT pointer.
std::vector< L1GctJetFinderBase * > m_neighbourJetFinders
Store neighbour pointers.
static const unsigned int N_EXTRA_REGIONS_ETA00
Number of additional regions to process on the "wrong" side of eta=0 (determines COL_OFFSET) ...
void setupObjects() override
Initialise inputs with null objects for the correct bunch crossing if required.
unsigned short int UShort
static const unsigned int CENTRAL_COL0
RegionsVector m_keptProtoJets
List of pre-clustered jets retained locally as input to the final clustering.
static const unsigned int MAX_REGIONS_IN
The real jetFinders must define these constants.
void resetProcessor() override
Separate reset methods for the processor itself and any data stored in pipelines. ...
static const unsigned int COL_OFFSET
The index offset between columns.
RawJetVector m_outputJets
output jets
void setJetFinderParams(const L1GctJetFinderParams *jfpars)
Set pointer to parameters - needed to complete the setup.
RegionsVector m_inputRegions
static const unsigned NUMBER_ETA_VALUES
Number of eta bins used in correction.
int nt
Definition: AMPTWrapper.h:42
RawJetPipeline m_outputJetsPipe
Output jets "pipeline memory" for checking.
static L1GctInternJetData fromEmulator(L1CaloRegionDetId rgn, int16_t bx, uint16_t et, bool overFlow, bool tauVeto, uint8_t eta, uint8_t phi, uint16_t rank)
void reset(const unsigned nBx)
unsigned getCenForJetEtaBoundary() const
void setInputRegion(const L1CaloRegion &region)
Set input data.
virtual unsigned nCols() const
void resetPipelines() override
void setEnergySumMasks(const L1GctChannelMask *chmask)
Set masks for energy summing.
std::vector< lutPtr > lutPtrVector
void fetchProtoJetsFromNeighbour(const fetchType ft)
fetch the protoJets from neighbour jetFinder
unsigned getHtJetEtThresholdGct() const
bool totalEtMask(unsigned ieta) const
etCompInternJfType m_outputEySum
Pipeline< etCompInternJfType > m_outputExSumPipe
void setValue(unsigned value)
Set value from unsigned.
int bxAbs() const
unsigned getForJetEtSeedGct() const
bool m_gotJetFinderParams
Remember whether jetfinder parameters have been stored.
A calorimeter trigger region (sum of 4x4 trigger towers)
Definition: L1CaloRegion.h:21
virtual unsigned maxRegionsIn() const
static L1GctInternEtSum fromEmulatorJetMissEt(int missEtxOrEty, bool overFlow, int16_t bx)
Pipeline< htCompInternJfType > m_outputHySumPipe
static const unsigned N_PHI
unsigned m_minColThisJf
parameter to determine which Regions belong in our acceptance
bool overFlow() const
access overflow
RegionsVector m_rcvdProtoJets
List of pre-clustered jets received from neighbour before the final stage of clustering.
static const unsigned int N_COLS
std::vector< T > contents
std::vector< L1GctRegion > RegionsVector
etCompInternJfType m_outputExSum
bool missingEtMask(unsigned ieta) const
bool m_gotJetEtCalLuts
Remember whether jet Et calibration Lut pointers have been stored.
Pipeline< etCompInternJfType > m_outputEySumPipe
void doEnergySums()
Fill the Et strip sums and Ht sum. All jetFinders should call this in process().
hfTowerSumsType m_outputHfSums
static const unsigned int N_JF_PER_WHEEL
No of jetFinders per Wheel.
Pipeline< htCompInternJfType > m_outputHxSumPipe