CMS 3D CMS Logo

List of all members | Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | Friends
L1GctHardwareJetFinder Class Reference

Emulation of the hardware jet finder. More...

#include <L1GctHardwareJetFinder.h>

Inheritance diagram for L1GctHardwareJetFinder:
L1GctJetFinderBase L1GctProcessor

Public Member Functions

void fetchInput () override
 get input data from sources More...
 
 L1GctHardwareJetFinder (int id)
 id is 0-8 for -ve Eta jetfinders, 9-17 for +ve Eta, for increasing Phi. More...
 
void process () override
 process the data, fill output buffers More...
 
virtual void reset ()
 include additional reset functionality More...
 
 ~L1GctHardwareJetFinder () override
 
- Public Member Functions inherited from L1GctJetFinderBase
unsigned getCenJetSeed () const
 
unsigned getEtaBoundry () const
 
etTotalType getEtSum () const
 Get the scalar sum of Et summed over the input regions. More...
 
etCompInternJfType getExSum () const
 Get the x component of vector Et summed over the input regions. More...
 
etCompInternJfType getEySum () const
 Get the y component of vector Et summed over the input regions. More...
 
unsigned getFwdJetSeed () const
 
hfTowerSumsType getHfSums () const
 Get the Hf tower Et sums and tower-over-threshold counts. More...
 
unsigned getHtmSumJetThreshold () const
 
etHadType getHtSum () const
 Get the scalar sum of Ht summed over jets above threshold. More...
 
unsigned getHttSumJetThreshold () const
 
htCompInternJfType getHxSum () const
 Get the x component of vector Ht summed over jets above threshold. More...
 
htCompInternJfType getHySum () const
 Get the y component of vector Ht summed over jets above threshold. More...
 
RegionsVector getInputRegions () const
 Return input data. More...
 
std::vector< L1GctInternEtSumgetInternalEtSums () const
 get et sums in raw format - to be stored in the event More...
 
std::vector< L1GctInternHtMissgetInternalHtMiss () const
 
std::vector< L1GctInternJetDatagetInternalJets () const
 get output jets in raw format - to be stored in the event More...
 
const lutPtrVector getJetEtCalLuts () const
 Return pointers to calibration LUTs. More...
 
JetVector getJets () const
 Get the located jets. More...
 
RegionsVector getKeptProtoJets () const
 get protoJets kept More...
 
RawJetVector getRawJets () const
 get output jets in raw format More...
 
RegionsVector getRcvdProtoJets () const
 get protoJets received from neighbour More...
 
RegionsVector getSentProtoJets () const
 get protoJets sent to neighbour More...
 
unsigned getTauIsolationThreshold () const
 
unsigned getTauJetSeed () const
 
 L1GctJetFinderBase (int id)
 id is 0-8 for -ve Eta jetfinders, 9-17 for +ve Eta, for increasing Phi. More...
 
void setEnergySumMasks (const L1GctChannelMask *chmask)
 Set masks for energy summing. More...
 
void setInputRegion (const L1CaloRegion &region)
 Set input data. More...
 
void setJetEtCalibrationLuts (const lutPtrVector &jfluts)
 Set pointer to calibration Lut - needed to complete the setup. More...
 
void setJetFinderParams (const L1GctJetFinderParams *jfpars)
 Set pointer to parameters - needed to complete the setup. More...
 
void setNeighbourJetFinders (const std::vector< L1GctJetFinderBase * > &neighbours)
 Set pointers to neighbours - needed to complete the setup. More...
 
bool setupOk () const
 Check setup is Ok. More...
 
void setupTauAlgo (const bool useImprovedAlgo, const bool ignoreVetoBitsForIsolation)
 Setup the tau algorithm parameters. More...
 
 ~L1GctJetFinderBase () override
 
- Public Member Functions inherited from L1GctProcessor
 L1GctProcessor ()
 
void reset ()
 complete reset of processor More...
 
void setBxRange (const int firstBx, const int numberOfBx)
 define the bunch crossing range to process More...
 
void setNextBx (const int bxnum)
 clear input data buffers and process a new bunch crossing More...
 
void setTerse ()
 
bool setupOk () const
 Method to check the setup for this processor. Returns true by default. More...
 
void setVerbose ()
 control output messages More...
 
virtual ~L1GctProcessor ()
 

Protected Member Functions

unsigned centralCol0 () const override
 
unsigned maxRegionsIn () const override
 
unsigned nCols () const override
 
- Protected Member Functions inherited from L1GctJetFinderBase
etTotalType calcEtStrip (const UShort strip) const
 Calculates total (raw) energy in a phi strip. More...
 
hfTowerSumsType calcHfSums () const
 Calculates Et sum and number of towers over threshold in Hf. More...
 
etTotalType calcHtStrip (const UShort strip) const
 Calculates total calibrated energy in jets (Ht) sum. More...
 
void doEnergySums ()
 Fill the Et strip sums and Ht sum. All jetFinders should call this in process(). More...
 
void doEtSums ()
 Calculates scalar and vector sum of Et over input regions. More...
 
void doHtSums ()
 Calculates scalar and vector sum of Ht over calibrated jets. More...
 
void fetchProtoJetsFromNeighbour (const fetchType ft)
 fetch the protoJets from neighbour jetFinder More...
 
void resetPipelines () override
 
void resetProcessor () override
 Separate reset methods for the processor itself and any data stored in pipelines. More...
 
void setupObjects () override
 Initialise inputs with null objects for the correct bunch crossing if required. More...
 
void sortJets ()
 Sort the found jets. All jetFinders should call this in process(). More...
 
- Protected Member Functions inherited from L1GctProcessor
int bxAbs () const
 
int bxMax () const
 
int bxMin () const
 Support for multiple beam crossing operation. More...
 
int bxRel () const
 
int numOfBx () const
 

Private Member Functions

void convertClustersToOutputJets ()
 Organise the final clustered jets into L1GctJets. More...
 
void convertClustersToProtoJets ()
 Organise the pre-clustered jets into the ones we keep and those we send to the neighbour. More...
 
void findFinalClusters ()
 Convert protojets to final jets. More...
 
void findJets ()
 The second stage of clustering, called by process() More...
 
void findLocalMaxima ()
 Find local maxima in the search array. More...
 
void findProtoClusters ()
 Convert local maxima to clusters. More...
 
void findProtoJets ()
 The first stage of clustering, called by fetchInput() More...
 
L1GctRegion makeProtoJet (L1GctRegion localMax)
 Method to make a single proto-jet. More...
 

Private Attributes

RegionsVector m_cluster00
 
RegionsVector m_clusters
 Each local maximum becomes a cluster. More...
 
RegionsVector m_localMax00
 
RegionsVector m_localMaxima
 Local vectors used during both stages of clustering. More...
 
unsigned m_numberOfClusters
 The number of local Maxima/clusters found at each stage of clustering. More...
 

Static Private Attributes

static const unsigned int CENTRAL_COL0 = 0
 
static const unsigned int MAX_REGIONS_IN
 The real jetFinders must define these constants. More...
 
static const unsigned int N_COLS = 2
 

Friends

std::ostream & operator<< (std::ostream &os, const L1GctHardwareJetFinder &algo)
 Overload << operator. More...
 

Additional Inherited Members

- Public Types inherited from L1GctJetFinderBase
typedef L1GctTwosComplement< L1GctInternEtSum::kJetMissEtNBitsetCompInternJfType
 
typedef L1GctUnsignedInt< L1GctInternEtSum::kTotEtOrHtNBitsetHadType
 
typedef L1GctUnsignedInt< L1GctInternEtSum::kTotEtOrHtNBitsetTotalType
 
typedef L1GctTwosComplement< L1GctInternHtMiss::kJetMissHtNBitshtCompInternJfType
 
typedef std::vector< L1GctJetCandJetVector
 
typedef L1GctJet::lutPtr lutPtr
 
typedef std::vector< lutPtrlutPtrVector
 
enum  maxValues { etTotalMaxValue = L1GctInternEtSum::kTotEtOrHtMaxValue, htTotalMaxValue = L1GctInternEtSum::kTotEtOrHtMaxValue }
 
typedef Pipeline< L1GctJetRawJetPipeline
 
typedef std::vector< L1GctJetRawJetVector
 
typedef std::vector< L1GctRegionRegionsVector
 
typedef unsigned long int ULong
 
typedef unsigned short int UShort
 
- Static Public Attributes inherited from L1GctJetFinderBase
static const unsigned int COL_OFFSET = L1GctJetFinderParams::NUMBER_ETA_VALUES + N_EXTRA_REGIONS_ETA00
 The index offset between columns. More...
 
static const unsigned int MAX_JETS_OUT = 6
 Max of 6 jets found per jetfinder in a 2*11 search area. More...
 
static const unsigned int N_EXTRA_REGIONS_ETA00 = 2
 Number of additional regions to process on the "wrong" side of eta=0 (determines COL_OFFSET) More...
 
static const unsigned int N_JF_PER_WHEEL = ((L1CaloRegionDetId::N_PHI) / 2)
 No of jetFinders per Wheel. More...
 
- Protected Types inherited from L1GctJetFinderBase
enum  fetchType { TOP, BOT, TOPBOT }
 different ways of getting the neighbour data More...
 
- Protected Attributes inherited from L1GctJetFinderBase
unsigned m_CenJetSeed
 
unsigned m_EtaBoundry
 
bool m_EtmMask [11]
 
bool m_EttMask [11]
 
unsigned m_FwdJetSeed
 
bool m_gotChannelMask
 Remember whether channel mask have been stored. More...
 
bool m_gotJetEtCalLuts
 Remember whether jet Et calibration Lut pointers have been stored. More...
 
bool m_gotJetFinderParams
 Remember whether jetfinder parameters have been stored. More...
 
bool m_gotNeighbourPointers
 Remember whether the neighbour pointers have been stored. More...
 
bool m_HtmMask [11]
 
unsigned m_HtmSumJetThreshold
 
bool m_HttMask [11]
 
unsigned m_HttSumJetThreshold
 
int m_id
 algo ID More...
 
bool m_idInRange
 Remember whether range check on the input ID was ok. More...
 
bool m_ignoreTauVetoBitsForIsolation
 
RegionsVector m_inputRegions
 
lutPtrVector m_jetEtCalLuts
 Jet Et Conversion LUT pointer. More...
 
RegionsVector m_keptProtoJets
 List of pre-clustered jets retained locally as input to the final clustering. More...
 
unsigned m_minColThisJf
 parameter to determine which Regions belong in our acceptance More...
 
std::vector< L1GctJetFinderBase * > m_neighbourJetFinders
 Store neighbour pointers. More...
 
etTotalType m_outputEtSum
 output Et strip sums and Ht - refactored More...
 
etCompInternJfType m_outputExSum
 
etCompInternJfType m_outputEySum
 
hfTowerSumsType m_outputHfSums
 
etHadType m_outputHtSum
 
htCompInternJfType m_outputHxSum
 
htCompInternJfType m_outputHySum
 
RawJetVector m_outputJets
 output jets More...
 
bool m_positiveEtaWheel
 
RegionsVector m_rcvdProtoJets
 List of pre-clustered jets received from neighbour before the final stage of clustering. More...
 
RegionsVector m_sentProtoJets
 List of pre-clustered jets to be sent to neighbour after the first stage of clustering. More...
 
JetVector m_sortedJets
 
unsigned m_tauIsolationThreshold
 
unsigned m_TauJetSeed
 
bool m_useImprovedTauAlgo
 Setup parameters for the tau jet algorithm. More...
 
- Protected Attributes inherited from L1GctProcessor
bool m_verbose
 Flag to control output messages. More...
 

Detailed Description

Emulation of the hardware jet finder.

Definition at line 18 of file L1GctHardwareJetFinder.h.

Constructor & Destructor Documentation

L1GctHardwareJetFinder::L1GctHardwareJetFinder ( int  id)

id is 0-8 for -ve Eta jetfinders, 9-17 for +ve Eta, for increasing Phi.

Definition at line 9 of file L1GctHardwareJetFinder.cc.

References CENTRAL_COL0, L1GctJetFinderBase::m_id, L1GctJetFinderBase::m_minColThisJf, L1CaloRegionDetId::N_PHI, and reset().

10  : L1GctJetFinderBase(id),
14  m_localMax00(2),
15  m_cluster00(2) {
16  this->reset();
17  // Initialise parameters for Region input calculations in the
18  // derived class so we get the right values of constants.
19  static const unsigned NPHI = L1CaloRegionDetId::N_PHI;
20  m_minColThisJf = (NPHI + m_id * 2 - CENTRAL_COL0) % NPHI;
21 }
unsigned m_numberOfClusters
The number of local Maxima/clusters found at each stage of clustering.
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
RegionsVector m_clusters
Each local maximum becomes a cluster.
L1GctJetFinderBase(int id)
id is 0-8 for -ve Eta jetfinders, 9-17 for +ve Eta, for increasing Phi.
virtual void reset()
include additional reset functionality
static const unsigned N_PHI
unsigned m_minColThisJf
parameter to determine which Regions belong in our acceptance
static const unsigned int CENTRAL_COL0
RegionsVector m_localMaxima
Local vectors used during both stages of clustering.
L1GctHardwareJetFinder::~L1GctHardwareJetFinder ( )
override

Definition at line 23 of file L1GctHardwareJetFinder.cc.

23 {}

Member Function Documentation

unsigned L1GctHardwareJetFinder::centralCol0 ( ) const
inlineoverrideprotectedvirtual

Reimplemented from L1GctJetFinderBase.

Definition at line 41 of file L1GctHardwareJetFinder.h.

References CENTRAL_COL0.

Referenced by findFinalClusters(), and findLocalMaxima().

41 { return CENTRAL_COL0; }
static const unsigned int CENTRAL_COL0
void L1GctHardwareJetFinder::convertClustersToOutputJets ( )
private

Organise the final clustered jets into L1GctJets.

Definition at line 425 of file L1GctHardwareJetFinder.cc.

References ecaldqm::isForward(), dqmiolumiharvest::j, L1GctJetFinderBase::m_CenJetSeed, m_clusters, L1GctJetFinderBase::m_EtaBoundry, L1GctJetFinderBase::m_FwdJetSeed, L1GctJetFinderBase::m_outputJets, L1GctJetFinderBase::MAX_JETS_OUT, and groupFilesInBlocks::temp.

Referenced by findJets().

425  {
426  for (unsigned j = 0; j < MAX_JETS_OUT; ++j) {
427  bool isForward = (m_clusters.at(j).rctEta() >= m_EtaBoundry);
428  unsigned JET_THRESHOLD = (isForward ? m_FwdJetSeed : m_CenJetSeed);
429  if (m_clusters.at(j).et() >= JET_THRESHOLD) {
430  L1GctJet temp(m_clusters.at(j).et(),
431  m_clusters.at(j).gctEta(),
432  m_clusters.at(j).gctPhi(),
433  m_clusters.at(j).overFlow(),
434  isForward,
435  m_clusters.at(j).tauVeto(),
436  m_clusters.at(j).bx());
437  m_outputJets.at(j) = temp;
438  }
439  }
440 }
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
bool isForward(DetId const &)
RegionsVector m_clusters
Each local maximum becomes a cluster.
A Level-1 jet candidate, used within GCT emulation.
Definition: L1GctJet.h:26
RawJetVector m_outputJets
output jets
void L1GctHardwareJetFinder::convertClustersToProtoJets ( )
private

Organise the pre-clustered jets into the ones we keep and those we send to the neighbour.

Definition at line 413 of file L1GctHardwareJetFinder.cc.

References ecaldqm::isForward(), dqmiolumiharvest::j, L1GctJetFinderBase::m_CenJetSeed, m_clusters, L1GctJetFinderBase::m_EtaBoundry, L1GctJetFinderBase::m_FwdJetSeed, L1GctJetFinderBase::m_keptProtoJets, L1GctJetFinderBase::m_sentProtoJets, and L1GctJetFinderBase::MAX_JETS_OUT.

Referenced by findProtoJets().

413  {
414  for (unsigned j = 0; j < MAX_JETS_OUT; ++j) {
415  bool isForward = (m_clusters.at(j).rctEta() >= m_EtaBoundry);
416  unsigned JET_THRESHOLD = (isForward ? m_FwdJetSeed : m_CenJetSeed);
417  if (m_clusters.at(j).et() >= JET_THRESHOLD) {
418  m_keptProtoJets.at(j) = m_clusters.at(j);
419  m_sentProtoJets.at(j) = m_clusters.at(j);
420  }
421  }
422 }
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
RegionsVector m_sentProtoJets
List of pre-clustered jets to be sent to neighbour after the first stage of clustering.
bool isForward(DetId const &)
RegionsVector m_clusters
Each local maximum becomes a cluster.
RegionsVector m_keptProtoJets
List of pre-clustered jets retained locally as input to the final clustering.
void L1GctHardwareJetFinder::fetchInput ( )
overridevirtual

get input data from sources

Implements L1GctJetFinderBase.

Definition at line 34 of file L1GctHardwareJetFinder.cc.

References findProtoJets(), and L1GctJetFinderBase::setupOk().

34  {
35  if (setupOk()) {
36  findProtoJets();
37  }
38 }
void findProtoJets()
The first stage of clustering, called by fetchInput()
bool setupOk() const
Check setup is Ok.
void L1GctHardwareJetFinder::findFinalClusters ( )
private

Convert protojets to final jets.

Definition at line 317 of file L1GctHardwareJetFinder.cc.

References l1GtPatternGenerator_cfi::bx, centralCol0(), L1GctJetFinderBase::COL_OFFSET, PVValHelper::eta, GlobalTrackerMuonAlignment_cfi::isolated, dqmiolumiharvest::j, dqmdumpme::k, L1GctJetFinderBase::m_CenJetSeed, m_cluster00, m_clusters, L1GctJetFinderBase::m_EtaBoundry, L1GctJetFinderBase::m_FwdJetSeed, L1GctJetFinderBase::m_ignoreTauVetoBitsForIsolation, L1GctJetFinderBase::m_inputRegions, L1GctJetFinderBase::m_keptProtoJets, L1GctJetFinderBase::m_rcvdProtoJets, L1GctJetFinderBase::m_tauIsolationThreshold, L1GctJetFinderBase::m_useImprovedTauAlgo, L1GctRegion::makeFinalJetRegion(), L1GctJetFinderBase::MAX_JETS_OUT, L1GctJetFinderBase::N_EXTRA_REGIONS_ETA00, phi, and groupFilesInBlocks::temp.

Referenced by findJets().

317  {
318  m_clusters.clear();
319  m_clusters.resize(MAX_JETS_OUT);
320 
321  // Loop over proto-jets received from neighbours.
322  // Form a jet to send to the output if there is no proto-jet nearby in the
323  // list of jets found locally. If local jets are found nearby, form a jet
324  // if the received jet has higher Et than any one of the local ones.
325  for (unsigned j = 0; j < MAX_JETS_OUT; ++j) {
326  unsigned et0 = m_rcvdProtoJets.at(j).et();
327  unsigned localEta0 = m_rcvdProtoJets.at(j).rctEta();
328  unsigned localPhi0 = m_rcvdProtoJets.at(j).rctPhi();
329  unsigned JET_THRESHOLD = ((localEta0 >= m_EtaBoundry) ? m_FwdJetSeed : m_CenJetSeed);
330  if (et0 >= JET_THRESHOLD) {
331  bool storeJet = false;
332  bool isolated = true;
333  // eta00 boundary check/veto
334  if (localEta0 == 0) {
335  unsigned neighbourEt = m_cluster00.at(1 - localPhi0).et();
336  isolated &= et0 >= neighbourEt;
337  }
338  // If the jet is NOT vetoed, look at the jets found locally (m_keptProtoJets).
339  // We accept the jet if there are no local jets nearby, or if the local jet
340  // (there should be no more than one) has lower Et.
341  if (isolated) {
342  for (unsigned k = 0; k < MAX_JETS_OUT; ++k) {
343  unsigned et1 = m_keptProtoJets.at(k).et();
344  unsigned localEta1 = m_keptProtoJets.at(k).rctEta();
345  unsigned localPhi1 = m_keptProtoJets.at(k).rctPhi();
346  if (et1 > 0) {
347  bool distantJet = ((localPhi0 == localPhi1) || (localEta1 > localEta0 + 1) || (localEta0 > localEta1 + 1));
348 
349  isolated &= distantJet;
350  storeJet |= !distantJet && ((et0 > et1) || ((et0 == et1) && localPhi0 == 1));
351  }
352  }
353  }
354 
355  storeJet |= isolated;
356 
357  if (storeJet) {
358  // Start with the et sum, tau veto and overflow flags of the protoJet (2x3 regions)
359  unsigned etCluster = et0;
360  bool ovrFlowOr = m_rcvdProtoJets.at(j).overFlow();
361  bool tauVetoOr = m_rcvdProtoJets.at(j).tauVeto();
362  unsigned rgnsAboveIsoThreshold = (m_rcvdProtoJets.at(j).featureBit0() ? 1 : 0);
363 
364  // Combine with the corresponding regions from
365  // the local array to make a 3x3 jet cluster
366  unsigned column = 1 - localPhi0;
367  // Which rows are we looking over?
368  unsigned rowStart, rowEnd;
369  static const unsigned row0 = N_EXTRA_REGIONS_ETA00 - 1;
370  rowStart = row0 + localEta0;
371  if (localEta0 < COL_OFFSET - row0 - 2) {
372  rowEnd = rowStart + 3;
373  } else {
374  rowEnd = COL_OFFSET;
375  }
376  unsigned index = COL_OFFSET * (this->centralCol0() + column) + rowStart;
377  for (unsigned row = rowStart; row < rowEnd; ++row) {
378  etCluster += m_inputRegions.at(index).et();
379  ovrFlowOr |= m_inputRegions.at(index).overFlow();
380  if (m_useImprovedTauAlgo) {
382  tauVetoOr |= m_inputRegions.at(index).tauVeto();
383  }
384  // check the region energy against the isolation threshold
385  if (m_inputRegions.at(index).et() >= m_tauIsolationThreshold) {
386  rgnsAboveIsoThreshold++;
387  }
388  } else {
389  tauVetoOr |= m_inputRegions.at(index).tauVeto();
390  }
391 
392  ++index;
393  }
394 
395  // Store the new jet
396  unsigned eta = m_rcvdProtoJets.at(j).gctEta();
397  unsigned phi = m_rcvdProtoJets.at(j).gctPhi();
398  int16_t bx = m_rcvdProtoJets.at(j).bx();
399 
400  // Use the number of towers over threshold for the isolated tau algorithm
401  if (m_useImprovedTauAlgo) {
402  tauVetoOr |= (rgnsAboveIsoThreshold > 1);
403  }
404 
405  L1GctRegion temp(L1GctRegion::makeFinalJetRegion(etCluster, ovrFlowOr, tauVetoOr, eta, phi, bx));
406  m_clusters.at(j) = temp;
407  }
408  }
409  }
410 }
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
unsigned centralCol0() const override
Gct version of a calorimeter region, used within GCT emulation.
Definition: L1GctRegion.h:17
RegionsVector m_clusters
Each local maximum becomes a cluster.
static L1GctRegion makeFinalJetRegion(const unsigned et, const bool overFlow, const bool fineGrain, const unsigned ieta, const unsigned iphi, const int16_t bx)
Definition: L1GctRegion.cc:29
static const unsigned int N_EXTRA_REGIONS_ETA00
Number of additional regions to process on the "wrong" side of eta=0 (determines COL_OFFSET) ...
RegionsVector m_keptProtoJets
List of pre-clustered jets retained locally as input to the final clustering.
static const unsigned int COL_OFFSET
The index offset between columns.
RegionsVector m_inputRegions
RegionsVector m_rcvdProtoJets
List of pre-clustered jets received from neighbour before the final stage of clustering.
bool m_useImprovedTauAlgo
Setup parameters for the tau jet algorithm.
void L1GctHardwareJetFinder::findJets ( )
private

The second stage of clustering, called by process()

Definition at line 59 of file L1GctHardwareJetFinder.cc.

References convertClustersToOutputJets(), and findFinalClusters().

Referenced by process().

59  {
62 }
void findFinalClusters()
Convert protojets to final jets.
void convertClustersToOutputJets()
Organise the final clustered jets into L1GctJets.
void L1GctHardwareJetFinder::findLocalMaxima ( )
private

Find local maxima in the search array.

Both clustering stages need to find local maxima in the search array.

Definition at line 66 of file L1GctHardwareJetFinder.cc.

References centralCol0(), L1GctJetFinderBase::COL_OFFSET, L1GctJetFinderBase::m_CenJetSeed, L1GctJetFinderBase::m_EtaBoundry, L1GctJetFinderBase::m_FwdJetSeed, L1GctJetFinderBase::m_inputRegions, m_localMax00, m_localMaxima, m_numberOfClusters, L1GctJetFinderBase::m_positiveEtaWheel, L1GctJetFinderBase::MAX_JETS_OUT, and phi.

Referenced by findProtoJets().

66  {
67  m_localMaxima.clear();
69  m_localMax00.clear();
70  m_localMax00.resize(2);
71 
72  UShort jetNum = 0; //holds the number of jets currently found
73  UShort centreIndex = COL_OFFSET * this->centralCol0();
74  for (UShort column = 0; column < 2; ++column) //Find jets in the central search region
75  {
76  // The input regions include two extra bins on the other side of eta=0. This allows "seamless"
77  // jetfinding across the eta=0 boundary. We skip the first input region in each row. We perform
78  // the full pre-clustering on the next region but store the resulting clusters separately
79  // from the main list of output pre-clusters - they will be used in the final cluster stage to
80  // make sure we do not produce jets in adjacent regions on opposite sides of eta=0.
81  ++centreIndex;
82  for (UShort row = 1; row < COL_OFFSET; ++row) {
83  // Here's the array of greater-than and greater-or-equal tests
84  // to ensure each localMaximum appears once and only once in the list
85  // It is different for forward and backward eta.
86  unsigned JET_THRESHOLD = ((row > m_EtaBoundry) ? m_FwdJetSeed : m_CenJetSeed);
87  bool localMax = !m_inputRegions.at(centreIndex).empty() && (m_inputRegions.at(centreIndex).et() >= JET_THRESHOLD);
88  if (m_positiveEtaWheel) { // Forward eta
89  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex - 1).et());
90  if (row < (COL_OFFSET - 1)) {
91  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex + 1).et());
92  }
93  if (column == 0) {
94  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex + COL_OFFSET).et());
95  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex + COL_OFFSET - 1).et());
96  if (row < (COL_OFFSET - 1)) {
97  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex + COL_OFFSET + 1).et());
98  }
99  } else {
100  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex - COL_OFFSET).et());
101  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex - COL_OFFSET - 1).et());
102  if (row < (COL_OFFSET - 1)) {
103  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex - COL_OFFSET + 1).et());
104  }
105  }
106  } else { // Backward eta
107  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex - 1).et());
108  if (row < (COL_OFFSET - 1)) {
109  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex + 1).et());
110  }
111  if (column == 0) {
112  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex + COL_OFFSET).et());
113  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex + COL_OFFSET - 1).et());
114  if (row < (COL_OFFSET - 1)) {
115  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex + COL_OFFSET + 1).et());
116  }
117  } else {
118  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex - COL_OFFSET).et());
119  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex - COL_OFFSET - 1).et());
120  if (row < (COL_OFFSET - 1)) {
121  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex - COL_OFFSET + 1).et());
122  }
123  }
124  }
125  if (localMax) {
126  if (row > 1) {
127  if (jetNum < MAX_JETS_OUT) {
128  m_localMaxima.at(jetNum) = m_inputRegions.at(centreIndex);
129  ++jetNum;
130  }
131  }
132  // Treat row 1 as a separate case. It's not required for jetfinding but
133  // is used for vetoing of jets double counted across the eta=0 boundary
134  else {
135  unsigned phi = m_inputRegions.at(centreIndex).rctPhi();
136  m_localMax00.at(phi) = m_inputRegions.at(centreIndex);
137  }
138  }
139  ++centreIndex;
140  }
141  }
142 
143  m_numberOfClusters = jetNum;
144 }
unsigned m_numberOfClusters
The number of local Maxima/clusters found at each stage of clustering.
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
unsigned centralCol0() const override
unsigned short int UShort
static const unsigned int COL_OFFSET
The index offset between columns.
RegionsVector m_inputRegions
RegionsVector m_localMaxima
Local vectors used during both stages of clustering.
void L1GctHardwareJetFinder::findProtoClusters ( )
private

Convert local maxima to clusters.

Definition at line 149 of file L1GctHardwareJetFinder.cc.

References dqmiolumiharvest::j, dqmdumpme::k, m_cluster00, m_clusters, m_localMax00, m_localMaxima, m_numberOfClusters, makeProtoJet(), L1GctJetFinderBase::MAX_JETS_OUT, and groupFilesInBlocks::temp.

Referenced by findProtoJets().

149  {
150  m_clusters.clear();
151  m_clusters.resize(MAX_JETS_OUT);
152  m_cluster00.clear();
153  m_cluster00.resize(2);
154 
155  RegionsVector topJets(MAX_JETS_OUT), botJets(MAX_JETS_OUT);
156  std::vector<unsigned> topJetsPosition(MAX_JETS_OUT), botJetsPosition(MAX_JETS_OUT);
157  unsigned numberOfTopJets = 0, numberOfBotJets = 0;
158 
159  // Loop over local maxima
160  for (unsigned j = 0; j < m_numberOfClusters; ++j) {
161  // Make a proto-jet cluster
163 
164  if (m_localMaxima.at(j).rctPhi() == 0) {
165  // Store "top edge" jets
166  topJets.at(numberOfTopJets) = temp;
167  topJetsPosition.at(numberOfTopJets) = 0;
168  for (unsigned k = 0; k < numberOfTopJets; ++k) {
169  if (topJets.at(numberOfTopJets).et() >= topJets.at(k).et()) {
170  ++topJetsPosition.at(k);
171  }
172  if (topJets.at(numberOfTopJets).et() <= topJets.at(k).et()) {
173  ++topJetsPosition.at(numberOfTopJets);
174  }
175  }
176  ++numberOfTopJets;
177  } else {
178  // Store "bottom edge" jets
179  botJets.at(numberOfBotJets) = temp;
180  botJetsPosition.at(numberOfBotJets) = 0;
181  for (unsigned k = 0; k < numberOfBotJets; ++k) {
182  if (botJets.at(numberOfBotJets).et() >= botJets.at(k).et()) {
183  ++botJetsPosition.at(k);
184  }
185  if (botJets.at(numberOfBotJets).et() <= botJets.at(k).et()) {
186  ++botJetsPosition.at(numberOfBotJets);
187  }
188  }
189  ++numberOfBotJets;
190  }
191  }
192  // Now we've found all the proto-jets, copy the best ones to the output array
193  //
194  // We fill the first half of the array with "bottom jets"
195  // and the remainder with "top jets". For cases where
196  // we have found too many jets in one phi column,
197  // we keep those with the highest Et.
198  static const unsigned int MAX_TOPBOT_JETS = MAX_JETS_OUT / 2;
199  unsigned pos = 0;
200  for (unsigned j = 0; j < numberOfBotJets; ++j) {
201  if (botJetsPosition.at(j) < MAX_TOPBOT_JETS) {
202  m_clusters.at(pos++) = botJets.at(j);
203  }
204  }
205  pos = MAX_TOPBOT_JETS;
206  for (unsigned j = 0; j < numberOfTopJets; ++j) {
207  if (topJetsPosition.at(j) < MAX_TOPBOT_JETS) {
208  m_clusters.at(pos++) = topJets.at(j);
209  }
210  }
211  // Finally, deal with eta00 maxima
212  if (!m_localMax00.at(0).empty())
213  m_cluster00.at(0) = makeProtoJet(m_localMax00.at(0));
214  if (!m_localMax00.at(1).empty())
215  m_cluster00.at(1) = makeProtoJet(m_localMax00.at(1));
216 }
unsigned m_numberOfClusters
The number of local Maxima/clusters found at each stage of clustering.
static const unsigned int MAX_JETS_OUT
Max of 6 jets found per jetfinder in a 2*11 search area.
Gct version of a calorimeter region, used within GCT emulation.
Definition: L1GctRegion.h:17
RegionsVector m_clusters
Each local maximum becomes a cluster.
std::vector< L1GctRegion > RegionsVector
L1GctRegion makeProtoJet(L1GctRegion localMax)
Method to make a single proto-jet.
RegionsVector m_localMaxima
Local vectors used during both stages of clustering.
void L1GctHardwareJetFinder::findProtoJets ( )
private

The first stage of clustering, called by fetchInput()

HERE IS THE JETFINDER CODE.

The first stage of clustering, called by fetchInput()

Definition at line 52 of file L1GctHardwareJetFinder.cc.

References convertClustersToProtoJets(), findLocalMaxima(), and findProtoClusters().

Referenced by fetchInput().

52  {
56 }
void convertClustersToProtoJets()
Organise the pre-clustered jets into the ones we keep and those we send to the neighbour.
void findLocalMaxima()
Find local maxima in the search array.
void findProtoClusters()
Convert local maxima to clusters.
L1GctRegion L1GctHardwareJetFinder::makeProtoJet ( L1GctRegion  localMax)
private

Method to make a single proto-jet.

Definition at line 219 of file L1GctHardwareJetFinder.cc.

References l1GtPatternGenerator_cfi::bx, L1CaloRegion::bx(), L1GctJetFinderBase::COL_OFFSET, PVValHelper::eta, L1CaloRegion::gctEta(), L1CaloRegion::gctPhi(), L1GctJetFinderBase::m_ignoreTauVetoBitsForIsolation, L1GctJetFinderBase::m_inputRegions, L1GctJetFinderBase::m_positiveEtaWheel, L1GctJetFinderBase::m_tauIsolationThreshold, L1GctJetFinderBase::m_useImprovedTauAlgo, L1GctRegion::makeProtoJetRegion(), L1CaloRegionDetId::N_ETA, L1GctJetFinderBase::N_EXTRA_REGIONS_ETA00, phi, L1GctRegion::rctEta(), L1CaloRegion::rctPhi(), and groupFilesInBlocks::temp.

Referenced by findProtoClusters().

219  {
220  unsigned eta = localMax.gctEta();
221  unsigned phi = localMax.gctPhi();
222  int16_t bx = localMax.bx();
223 
224  unsigned localEta = localMax.rctEta();
225  unsigned localPhi = localMax.rctPhi();
226 
227  unsigned etCluster = 0;
228  bool ovrFlowOr = false;
229  bool tauVetoOr = false;
230  unsigned rgnsAboveIsoThreshold = 0;
231 
232  // check for row00
233  const unsigned midEta = (L1CaloRegionDetId::N_ETA) / 2;
234  bool wrongEtaWheel = ((!m_positiveEtaWheel) && (eta >= midEta)) || ((m_positiveEtaWheel) && (eta < midEta));
235 
236  // Which rows are we looking over?
237  unsigned rowStart, rowEnd, rowMid;
238  static const unsigned row0 = N_EXTRA_REGIONS_ETA00 - 1;
239  if (wrongEtaWheel) {
240  if (localEta > row0 - 1) {
241  rowStart = 0;
242  rowMid = 0;
243  } else {
244  rowStart = row0 - 1 - localEta;
245  rowMid = rowStart + 1;
246  }
247  if (localEta > row0 + 2) { // Shouldn't happen, but big problems if it does
248  rowEnd = 0;
249  } else {
250  rowEnd = row0 + 2 - localEta;
251  }
252  } else {
253  rowStart = row0 + localEta;
254  rowMid = rowStart + 1;
255  if (localEta < COL_OFFSET - row0 - 2) {
256  rowEnd = rowStart + 3;
257  } else {
258  rowEnd = COL_OFFSET;
259  }
260  }
261 
262  for (unsigned row = rowStart; row < rowEnd; ++row) {
263  for (unsigned column = 0; column < 2; ++column) {
264  unsigned index = column * COL_OFFSET + row;
265  etCluster += m_inputRegions.at(index).et();
266  ovrFlowOr |= m_inputRegions.at(index).overFlow();
267  // Distinguish between central and tau-flagged jets. Two versions of the algorithm.
268  if (m_useImprovedTauAlgo) {
269  //===========================================================================================
270  // "Old" version of improved tau algorithm tests the tau veto for the central region always
271  // if ((row==(localEta+N_EXTRA_REGIONS_ETA00)) && (column==localPhi)) {
272  // // central region - check the tau veto
273  // tauVetoOr |= m_inputRegions.at(index).tauVeto();
274  // } else {
275  // // other regions - check the tau veto if required
276  // if (!m_ignoreTauVetoBitsForIsolation) {
277  // tauVetoOr |= m_inputRegions.at(index).tauVeto();
278  // }
279  // // check the region energy against the isolation threshold
280  // if (m_inputRegions.at(index).et() >= m_tauIsolationThreshold) {
281  // rgnsAboveIsoThreshold++;
282  // }
283  // }
284  //===========================================================================================
285 
286  // In the hardware, the ignoreTauVetoBitsForIsolation switch ignores all the veto bits,
287  // including the one for the central region.
288  if (!((row == rowMid) && (column == localPhi))) {
289  // non-central region - check the region energy against the isolation threshold
290  if (m_inputRegions.at(index).et() >= m_tauIsolationThreshold) {
291  rgnsAboveIsoThreshold++;
292  }
293  }
294  // all regions - check the tau veto if required
296  tauVetoOr |= m_inputRegions.at(index).tauVeto();
297  }
298  // End of improved tau algorithm
299  } else {
300  // Original tau algorithm
301  tauVetoOr |= m_inputRegions.at(index).tauVeto();
302  }
303  }
304  }
305  // Encode the number of towers over threshold for the isolated tau algorithm
306  bool tauFeatureBit = false;
307  if (m_useImprovedTauAlgo) {
308  tauVetoOr |= (rgnsAboveIsoThreshold > 1);
309  tauFeatureBit |= (rgnsAboveIsoThreshold == 1);
310  }
311 
312  L1GctRegion temp(L1GctRegion::makeProtoJetRegion(etCluster, ovrFlowOr, tauVetoOr, tauFeatureBit, eta, phi, bx));
313  return temp;
314 }
int16_t bx() const
get bunch-crossing index
Definition: L1CaloRegion.h:165
unsigned rctEta() const
Definition: L1GctRegion.h:50
Gct version of a calorimeter region, used within GCT emulation.
Definition: L1GctRegion.h:17
static L1GctRegion makeProtoJetRegion(const unsigned et, const bool overFlow, const bool fineGrain, const bool tauIsolationVeto, const unsigned ieta, const unsigned iphi, const int16_t bx)
Definition: L1GctRegion.cc:13
static const unsigned N_ETA
unsigned rctPhi() const
get local phi index (within RCT crate)
Definition: L1CaloRegion.h:150
static const unsigned int N_EXTRA_REGIONS_ETA00
Number of additional regions to process on the "wrong" side of eta=0 (determines COL_OFFSET) ...
static const unsigned int COL_OFFSET
The index offset between columns.
RegionsVector m_inputRegions
unsigned gctEta() const
get GCT eta index
Definition: L1CaloRegion.h:153
unsigned gctPhi() const
get GCT phi index
Definition: L1CaloRegion.h:156
bool m_useImprovedTauAlgo
Setup parameters for the tau jet algorithm.
unsigned L1GctHardwareJetFinder::maxRegionsIn ( ) const
inlineoverrideprotectedvirtual

*** End of event data ***


Reimplemented from L1GctJetFinderBase.

Definition at line 40 of file L1GctHardwareJetFinder.h.

References MAX_REGIONS_IN.

40 { return MAX_REGIONS_IN; }
static const unsigned int MAX_REGIONS_IN
The real jetFinders must define these constants.
unsigned L1GctHardwareJetFinder::nCols ( ) const
inlineoverrideprotectedvirtual

Reimplemented from L1GctJetFinderBase.

Definition at line 42 of file L1GctHardwareJetFinder.h.

References N_COLS.

42 { return N_COLS; }
static const unsigned int N_COLS
void L1GctHardwareJetFinder::process ( )
overridevirtual

process the data, fill output buffers

Implements L1GctJetFinderBase.

Definition at line 40 of file L1GctHardwareJetFinder.cc.

References L1GctJetFinderBase::doEnergySums(), L1GctJetFinderBase::fetchProtoJetsFromNeighbour(), findJets(), L1GctJetFinderBase::setupOk(), L1GctJetFinderBase::sortJets(), and L1GctJetFinderBase::TOPBOT.

40  {
41  if (setupOk()) {
43  findJets();
44  sortJets();
45  doEnergySums();
46  }
47 }
void findJets()
The second stage of clustering, called by process()
bool setupOk() const
Check setup is Ok.
void sortJets()
Sort the found jets. All jetFinders should call this in process().
void fetchProtoJetsFromNeighbour(const fetchType ft)
fetch the protoJets from neighbour jetFinder
void doEnergySums()
Fill the Et strip sums and Ht sum. All jetFinders should call this in process().
void L1GctHardwareJetFinder::reset ( void  )
virtual

include additional reset functionality

Definition at line 32 of file L1GctHardwareJetFinder.cc.

References L1GctProcessor::reset().

Referenced by L1GctHardwareJetFinder().

void reset()
complete reset of processor

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  os,
const L1GctHardwareJetFinder algo 
)
friend

Overload << operator.

Definition at line 25 of file L1GctHardwareJetFinder.cc.

25  {
26  os << "===L1GctHardwareJetFinder===" << std::endl;
27  const L1GctJetFinderBase* temp = &algo;
28  os << *temp;
29  return os;
30 }
Base class to allow implementation of jetFinder algorithms.

Member Data Documentation

const unsigned int L1GctHardwareJetFinder::CENTRAL_COL0 = 0
staticprivate

Definition at line 48 of file L1GctHardwareJetFinder.h.

Referenced by centralCol0(), and L1GctHardwareJetFinder().

RegionsVector L1GctHardwareJetFinder::m_cluster00
private

Definition at line 60 of file L1GctHardwareJetFinder.h.

Referenced by findFinalClusters(), and findProtoClusters().

RegionsVector L1GctHardwareJetFinder::m_clusters
private

Each local maximum becomes a cluster.

Definition at line 53 of file L1GctHardwareJetFinder.h.

Referenced by convertClustersToOutputJets(), convertClustersToProtoJets(), findFinalClusters(), and findProtoClusters().

RegionsVector L1GctHardwareJetFinder::m_localMax00
private

Definition at line 59 of file L1GctHardwareJetFinder.h.

Referenced by findLocalMaxima(), and findProtoClusters().

RegionsVector L1GctHardwareJetFinder::m_localMaxima
private

Local vectors used during both stages of clustering.

Definition at line 51 of file L1GctHardwareJetFinder.h.

Referenced by findLocalMaxima(), and findProtoClusters().

unsigned L1GctHardwareJetFinder::m_numberOfClusters
private

The number of local Maxima/clusters found at each stage of clustering.

Definition at line 56 of file L1GctHardwareJetFinder.h.

Referenced by findLocalMaxima(), and findProtoClusters().

const unsigned int L1GctHardwareJetFinder::MAX_REGIONS_IN
staticprivate
Initial value:

The real jetFinders must define these constants.

Dependent on number of rows and columns.

Definition at line 46 of file L1GctHardwareJetFinder.h.

Referenced by maxRegionsIn().

const unsigned int L1GctHardwareJetFinder::N_COLS = 2
staticprivate

Definition at line 47 of file L1GctHardwareJetFinder.h.

Referenced by nCols().