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 = (((L1CaloRegionDetId::N_ETA)/2)+N_EXTRA_REGIONS_ETA00)*L1GctHardwareJetFinder::N_COLS
 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 21 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 8 of file L1GctHardwareJetFinder.cc.

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

8  :
13  m_localMax00(2),
14  m_cluster00 (2)
15 {
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.

24 {
25 }

Member Function Documentation

unsigned L1GctHardwareJetFinder::centralCol0 ( ) const
inlineoverrideprotectedvirtual

Reimplemented from L1GctJetFinderBase.

Definition at line 47 of file L1GctHardwareJetFinder.h.

References CENTRAL_COL0.

Referenced by findFinalClusters(), and findLocalMaxima().

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

Organise the final clustered jets into L1GctJets.

Definition at line 434 of file L1GctHardwareJetFinder.cc.

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

Referenced by findJets().

435 {
436  for (unsigned j=0; j<MAX_JETS_OUT; ++j) {
437  bool isForward = (m_clusters.at(j).rctEta()>=m_EtaBoundry);
438  unsigned JET_THRESHOLD = ( isForward ? m_FwdJetSeed : m_CenJetSeed);
439  if (m_clusters.at(j).et()>=JET_THRESHOLD) {
440  L1GctJet temp(m_clusters.at(j).et(), m_clusters.at(j).gctEta(), m_clusters.at(j).gctPhi(),
441  m_clusters.at(j).overFlow(), isForward, m_clusters.at(j).tauVeto(), m_clusters.at(j).bx());
442  m_outputJets.at(j) = temp;
443  }
444  }
445 }
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:27
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 421 of file L1GctHardwareJetFinder.cc.

References ecaldqm::isForward(), 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().

422 {
423  for (unsigned j=0; j<MAX_JETS_OUT; ++j) {
424  bool isForward = (m_clusters.at(j).rctEta()>=m_EtaBoundry);
425  unsigned JET_THRESHOLD = ( isForward ? m_FwdJetSeed : m_CenJetSeed);
426  if (m_clusters.at(j).et()>=JET_THRESHOLD) {
427  m_keptProtoJets.at(j) = m_clusters.at(j);
428  m_sentProtoJets.at(j) = m_clusters.at(j);
429  }
430  }
431 }
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 40 of file L1GctHardwareJetFinder.cc.

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

41 {
42  if (setupOk()) {
43  findProtoJets();
44  }
45 }
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 322 of file L1GctHardwareJetFinder.cc.

References centralCol0(), L1GctJetFinderBase::COL_OFFSET, PVValHelper::eta, GlobalTrackerMuonAlignment_cfi::isolated, gen::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().

323 {
324  m_clusters.clear();
325  m_clusters.resize(MAX_JETS_OUT);
326 
327  // Loop over proto-jets received from neighbours.
328  // Form a jet to send to the output if there is no proto-jet nearby in the
329  // list of jets found locally. If local jets are found nearby, form a jet
330  // if the received jet has higher Et than any one of the local ones.
331  for (unsigned j=0; j<MAX_JETS_OUT; ++j) {
332  unsigned et0 = m_rcvdProtoJets.at(j).et();
333  unsigned localEta0 = m_rcvdProtoJets.at(j).rctEta();
334  unsigned localPhi0 = m_rcvdProtoJets.at(j).rctPhi();
335  unsigned JET_THRESHOLD = ( (localEta0 >= m_EtaBoundry) ? m_FwdJetSeed : m_CenJetSeed);
336  if (et0>=JET_THRESHOLD) {
337  bool storeJet=false;
338  bool isolated=true;
339  // eta00 boundary check/veto
340  if (localEta0==0) {
341  unsigned neighbourEt=m_cluster00.at(1-localPhi0).et();
342  isolated &= et0 >= neighbourEt;
343  }
344  // If the jet is NOT vetoed, look at the jets found locally (m_keptProtoJets).
345  // We accept the jet if there are no local jets nearby, or if the local jet
346  // (there should be no more than one) has lower Et.
347  if (isolated) {
348  for (unsigned k=0; k<MAX_JETS_OUT; ++k) {
349  unsigned et1 = m_keptProtoJets.at(k).et();
350  unsigned localEta1 = m_keptProtoJets.at(k).rctEta();
351  unsigned localPhi1 = m_keptProtoJets.at(k).rctPhi();
352  if (et1>0) {
353  bool distantJet = ((localPhi0==localPhi1) ||
354  (localEta1 > localEta0+1) || (localEta0 > localEta1+1));
355 
356  isolated &= distantJet;
357  storeJet |= !distantJet && ((et0 > et1) || ((et0 == et1) && localPhi0==1));
358  }
359  }
360  }
361 
362  storeJet |= isolated;
363 
364  if (storeJet) {
365  // Start with the et sum, tau veto and overflow flags of the protoJet (2x3 regions)
366  unsigned etCluster = et0;
367  bool ovrFlowOr = m_rcvdProtoJets.at(j).overFlow();
368  bool tauVetoOr = m_rcvdProtoJets.at(j).tauVeto();
369  unsigned rgnsAboveIsoThreshold = ( m_rcvdProtoJets.at(j).featureBit0() ? 1 : 0);
370 
371  // Combine with the corresponding regions from
372  // the local array to make a 3x3 jet cluster
373  unsigned column=1-localPhi0;
374  // Which rows are we looking over?
375  unsigned rowStart, rowEnd;
376  static const unsigned row0 = N_EXTRA_REGIONS_ETA00 - 1;
377  rowStart = row0 + localEta0;
378  if (localEta0 < COL_OFFSET - row0 - 2) {
379  rowEnd = rowStart + 3;
380  } else {
381  rowEnd = COL_OFFSET;
382  }
383  unsigned index = COL_OFFSET*(this->centralCol0()+column) + rowStart;
384  for (unsigned row=rowStart; row<rowEnd; ++row) {
385  etCluster += m_inputRegions.at(index).et();
386  ovrFlowOr |= m_inputRegions.at(index).overFlow();
387  if (m_useImprovedTauAlgo) {
389  tauVetoOr |= m_inputRegions.at(index).tauVeto();
390  }
391  // check the region energy against the isolation threshold
392  if (m_inputRegions.at(index).et() >= m_tauIsolationThreshold) {
393  rgnsAboveIsoThreshold++;
394  }
395  } else {
396  tauVetoOr |= m_inputRegions.at(index).tauVeto();
397  }
398 
399  ++index;
400  }
401 
402  // Store the new jet
403  unsigned eta = m_rcvdProtoJets.at(j).gctEta();
404  unsigned phi = m_rcvdProtoJets.at(j).gctPhi();
405  int16_t bx = m_rcvdProtoJets.at(j).bx();
406 
407  // Use the number of towers over threshold for the isolated tau algorithm
408  if (m_useImprovedTauAlgo) {
409  tauVetoOr |= (rgnsAboveIsoThreshold > 1);
410  }
411 
412  L1GctRegion temp(L1GctRegion::makeFinalJetRegion(etCluster, ovrFlowOr, tauVetoOr, eta, phi, bx));
413  m_clusters.at(j) = temp;
414 
415  }
416  }
417  }
418 }
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:26
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
int k[5][pyjets_maxn]
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 68 of file L1GctHardwareJetFinder.cc.

References convertClustersToOutputJets(), and findFinalClusters().

Referenced by process().

69 {
72 }
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 76 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().

77 {
78  m_localMaxima.clear();
80  m_localMax00.clear();
81  m_localMax00.resize(2);
82 
83  UShort jetNum = 0; //holds the number of jets currently found
84  UShort centreIndex = COL_OFFSET*this->centralCol0();
85  for(UShort column = 0; column <2; ++column) //Find jets in the central search region
86  {
87  // The input regions include two extra bins on the other side of eta=0. This allows "seamless"
88  // jetfinding across the eta=0 boundary. We skip the first input region in each row. We perform
89  // the full pre-clustering on the next region but store the resulting clusters separately
90  // from the main list of output pre-clusters - they will be used in the final cluster stage to
91  // make sure we do not produce jets in adjacent regions on opposite sides of eta=0.
92  ++centreIndex;
93  for (UShort row = 1; row < COL_OFFSET; ++row)
94  {
95  // Here's the array of greater-than and greater-or-equal tests
96  // to ensure each localMaximum appears once and only once in the list
97  // It is different for forward and backward eta.
98  unsigned JET_THRESHOLD = ( (row > m_EtaBoundry) ? m_FwdJetSeed : m_CenJetSeed);
99  bool localMax = !m_inputRegions.at(centreIndex).empty() && (m_inputRegions.at(centreIndex).et()>=JET_THRESHOLD);
100  if (m_positiveEtaWheel) { // Forward eta
101  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex-1).et());
102  if (row < (COL_OFFSET-1)) {
103  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex+1).et());
104  }
105  if (column==0) {
106  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex+COL_OFFSET).et());
107  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex+COL_OFFSET-1).et());
108  if (row < (COL_OFFSET-1)) {
109  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex+COL_OFFSET+1).et());
110  }
111  } else {
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  }
118  } else { // Backward eta
119  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex-1).et());
120  if (row < (COL_OFFSET-1)) {
121  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex+1).et());
122  }
123  if (column==0) {
124  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex+COL_OFFSET).et());
125  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex+COL_OFFSET-1).et());
126  if (row < (COL_OFFSET-1)) {
127  localMax &= (m_inputRegions.at(centreIndex).et() >= m_inputRegions.at(centreIndex+COL_OFFSET+1).et());
128  }
129  } else {
130  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex-COL_OFFSET).et());
131  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex-COL_OFFSET-1).et());
132  if (row < (COL_OFFSET-1)) {
133  localMax &= (m_inputRegions.at(centreIndex).et() > m_inputRegions.at(centreIndex-COL_OFFSET+1).et());
134  }
135  }
136  }
137  if (localMax) {
138  if (row>1) {
139  if (jetNum < MAX_JETS_OUT) {
140  m_localMaxima.at(jetNum) = m_inputRegions.at(centreIndex);
141  ++jetNum;
142  }
143  }
144  // Treat row 1 as a separate case. It's not required for jetfinding but
145  // is used for vetoing of jets double counted across the eta=0 boundary
146  else {
147  unsigned phi = m_inputRegions.at(centreIndex).rctPhi();
148  m_localMax00.at(phi) = m_inputRegions.at(centreIndex);
149  }
150  }
151  ++centreIndex;
152  }
153  }
154 
155  m_numberOfClusters = jetNum;
156 }
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 161 of file L1GctHardwareJetFinder.cc.

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

Referenced by findProtoJets().

162 {
163  m_clusters.clear();
164  m_clusters.resize(MAX_JETS_OUT);
165  m_cluster00.clear();
166  m_cluster00.resize(2);
167 
168  RegionsVector topJets(MAX_JETS_OUT), botJets(MAX_JETS_OUT);
169  std::vector<unsigned> topJetsPosition(MAX_JETS_OUT), botJetsPosition(MAX_JETS_OUT);
170  unsigned numberOfTopJets=0, numberOfBotJets=0;
171 
172  // Loop over local maxima
173  for (unsigned j=0; j<m_numberOfClusters; ++j) {
174  // Make a proto-jet cluster
176 
177  if (m_localMaxima.at(j).rctPhi()==0) {
178  // Store "top edge" jets
179  topJets.at(numberOfTopJets) = temp;
180  topJetsPosition.at(numberOfTopJets) = 0;
181  for (unsigned k=0; k<numberOfTopJets; ++k) {
182  if (topJets.at(numberOfTopJets).et() >= topJets.at(k).et()) { ++topJetsPosition.at(k); }
183  if (topJets.at(numberOfTopJets).et() <= topJets.at(k).et()) { ++topJetsPosition.at(numberOfTopJets); }
184  }
185  ++numberOfTopJets;
186  } else {
187  // Store "bottom edge" jets
188  botJets.at(numberOfBotJets) = temp;
189  botJetsPosition.at(numberOfBotJets) = 0;
190  for (unsigned k=0; k<numberOfBotJets; ++k) {
191  if (botJets.at(numberOfBotJets).et() >= botJets.at(k).et()) { ++botJetsPosition.at(k); }
192  if (botJets.at(numberOfBotJets).et() <= botJets.at(k).et()) { ++botJetsPosition.at(numberOfBotJets); }
193  }
194  ++numberOfBotJets;
195  }
196  }
197  // Now we've found all the proto-jets, copy the best ones to the output array
198  //
199  // We fill the first half of the array with "bottom jets"
200  // and the remainder with "top jets". For cases where
201  // we have found too many jets in one phi column,
202  // we keep those with the highest Et.
203  static const unsigned int MAX_TOPBOT_JETS = MAX_JETS_OUT/2;
204  unsigned pos=0;
205  for (unsigned j=0; j<numberOfBotJets; ++j) {
206  if (botJetsPosition.at(j)<MAX_TOPBOT_JETS) {
207  m_clusters.at(pos++) = botJets.at(j);
208  }
209  }
210  pos=MAX_TOPBOT_JETS;
211  for (unsigned j=0; j<numberOfTopJets; ++j) {
212  if (topJetsPosition.at(j)<MAX_TOPBOT_JETS) {
213  m_clusters.at(pos++) = topJets.at(j);
214  }
215  }
216  // Finally, deal with eta00 maxima
217  if (!m_localMax00.at(0).empty()) m_cluster00.at(0) = makeProtoJet(m_localMax00.at(0));
218  if (!m_localMax00.at(1).empty()) m_cluster00.at(1) = makeProtoJet(m_localMax00.at(1));
219 }
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.
int k[5][pyjets_maxn]
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 60 of file L1GctHardwareJetFinder.cc.

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

Referenced by fetchInput().

61 {
65 }
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 223 of file L1GctHardwareJetFinder.cc.

References 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().

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

References MAX_REGIONS_IN.

46 { 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 48 of file L1GctHardwareJetFinder.h.

References N_COLS.

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

process the data, fill output buffers

Implements L1GctJetFinderBase.

Definition at line 47 of file L1GctHardwareJetFinder.cc.

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

48 {
49  if (setupOk()) {
51  findJets();
52  sortJets();
53  doEnergySums();
54  }
55 }
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 35 of file L1GctHardwareJetFinder.cc.

References L1GctProcessor::reset().

Referenced by L1GctHardwareJetFinder().

36 {
38 }
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 27 of file L1GctHardwareJetFinder.cc.

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

Member Data Documentation

const unsigned int L1GctHardwareJetFinder::CENTRAL_COL0 = 0
staticprivate

Definition at line 55 of file L1GctHardwareJetFinder.h.

Referenced by centralCol0(), and L1GctHardwareJetFinder().

RegionsVector L1GctHardwareJetFinder::m_cluster00
private

Definition at line 67 of file L1GctHardwareJetFinder.h.

Referenced by findFinalClusters(), and findProtoClusters().

RegionsVector L1GctHardwareJetFinder::m_clusters
private

Each local maximum becomes a cluster.

Definition at line 60 of file L1GctHardwareJetFinder.h.

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

RegionsVector L1GctHardwareJetFinder::m_localMax00
private

Definition at line 66 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 58 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 63 of file L1GctHardwareJetFinder.h.

Referenced by findLocalMaxima(), and findProtoClusters().

const unsigned int L1GctHardwareJetFinder::MAX_REGIONS_IN = (((L1CaloRegionDetId::N_ETA)/2)+N_EXTRA_REGIONS_ETA00)*L1GctHardwareJetFinder::N_COLS
staticprivate

The real jetFinders must define these constants.

Dependent on number of rows and columns.

Definition at line 53 of file L1GctHardwareJetFinder.h.

Referenced by maxRegionsIn().

const unsigned int L1GctHardwareJetFinder::N_COLS = 2
staticprivate

Definition at line 54 of file L1GctHardwareJetFinder.h.

Referenced by nCols().