ATLAS Offline Software
Loading...
Searching...
No Matches
LVL1::CPMTobAlgorithm Class Reference

This is an internal class, used in the EM/Tau trigger. More...

#include <CPMTobAlgorithm.h>

Collaboration diagram for LVL1::CPMTobAlgorithm:

Public Member Functions

 CPMTobAlgorithm (double eta, double phi, const xAOD::CPMTowerMap_t *ttContainer, const TrigConf::L1Menu *l1menu, int slice=-1)
 ~CPMTobAlgorithm ()
double eta ()
 Accessors for TOB data.
double phi ()
 Returns phi coordinate of RoI, using standard ATLAS convention.
int EMClusET ()
 Returns EM cluster ET, limited to 8 bits.
int EMIsolWord ()
 Returns EM isolation word (5 bits).
int TauClusET ()
 Returns Tau cluster ET, limited to 8 bits.
int TauIsolWord ()
 Returns Tau isolation word (5 bits).
bool isEMRoI ()
 Report whether this passed as an EM TOB.
bool isTauRoI ()
 Report whether this passed as a Tau TOB.
bool isEtMax ()
 Does this window pass the local ET maximum condition.
int CoreET ()
 Additional information for reconstruction & performance studies.
int EMCoreET ()
 Returns EM core ET.
int HadCoreET ()
 Returns Had core ET (inner isolation sum).
int EMIsolET ()
 Returns EM isolation ET.
int HadIsolET ()
 Returns Had isolation ET.
int EMLUTClus ()
 Sums with the range & precision of isolation LUT inputs.
int EMLUTEMIsol ()
 Returns EM isolation ET with range and precision of EM LUT input.
int EMLUTHadVeto ()
 Returns Had veto ET with range and precision of EM LUT input.
int TauLUTClus ()
 Returns Tau cluster ET with range and precision of LUT input.
int TauLUTEMIsol ()
 Returns EM isolation ET with range and precision of Tau LUT input.
xAOD::CPMTobRoIEMCPMTobRoI ()
 Create CPMTobRoIs and return pointers to them.
xAOD::CPMTobRoITauCPMTobRoI ()
 Returns CPMTobRoI for TAU hypothesis, provided TAU Tob conditions passed.

Private Member Functions

void setRoICoord (double eta, double phi)
 threshold values
void testEtMax (const std::vector< unsigned int > &cores)
 Form all 2x2 clusters within window and test centre is a local ET maximum.
void emAlgorithm ()
 Check trigger condition and set hits if appropriate.
void tauAlgorithm ()
 Check trigger condition and set hits if appropriate.
xAOD::CPMTobRoIcreateTobRoI (int type)
 Create a pointer to a CPMTobRoI and return it.

Private Attributes

double m_refEta
double m_refPhi
const TrigConf::L1Menum_l1menu {nullptr}
double m_eta
 Algorithm results.
double m_phi
unsigned int m_Core
unsigned int m_EMClus
unsigned int m_TauClus
unsigned int m_EMIsolWord
unsigned int m_TauIsolWord
unsigned int m_EMCore
unsigned int m_EMIsol
unsigned int m_HadCore
unsigned int m_HadIsol
bool m_EtMax
bool m_EMThresh
bool m_TauThresh

Static Private Attributes

static const unsigned int m_maxClus = 0xFF
 Algorithm parameters.
static const unsigned int m_emLUT_ClusterFirstBit = 1
static const unsigned int m_emLUT_ClusterNBits = 6
static const unsigned int m_emLUT_EMIsolFirstBit = 0
static const unsigned int m_emLUT_EMIsolNBits = 4
static const unsigned int m_emLUT_HadVetoFirstBit = 0
static const unsigned int m_emLUT_HadVetoNBits = 3
static const unsigned int m_tauLUT_ClusterFirstBit = 1
static const unsigned int m_tauLUT_ClusterNBits = 7
static const unsigned int m_tauLUT_EMIsolFirstBit = 0
static const unsigned int m_tauLUT_EMIsolNBits = 6
static const unsigned int m_noIsol = 999
static const double m_maxEta = 2.5

Detailed Description

This is an internal class, used in the EM/Tau trigger.

The CPMTobAlgorithm:

  • identifies towers used in a particular trigger window (4x4 towers)
  • forms sums required for trigger algorithm
  • identifies whether passes the RoI condition (local ET maximum)
  • returns sums (with appropriate precision)
  • returns hit bits and RoI word (if all requirements met)

Definition at line 43 of file CPMTobAlgorithm.h.

Constructor & Destructor Documentation

◆ CPMTobAlgorithm()

LVL1::CPMTobAlgorithm::CPMTobAlgorithm ( double eta,
double phi,
const xAOD::CPMTowerMap_t * ttContainer,
const TrigConf::L1Menu * l1menu,
int slice = -1 )

RoI coordinates are centre of window, while key classes are designed for TT coordinates - differ by 0.5* TT_size. Using wrong coordinate convention can lead to precision errors in key generation.

Offsetting by TT_size/4 will put coordinates inside reference TT whether input was reference TT coordinate or RoI centre coordinate. To be extra safe, the code below will then compute the centre of the reference tower.

This should all ensure consistent & safe key generation however the initial coordinate was specified.

Now loop over towers within window and form clusters.

Interesting one is the 9 RoI cores. The logic below fills these as an a 9-element std::vector. The ordering of the elements is as follows: 2 5 8 1 4 7 0 3 6 So the RoI "ET maximum" condition is that 4 >= 0-3, 4 > 5-8 If you picture the cores in a 3x3 array, cores[iphi][ieta], then the index in the vector above = iphi + 3*ieta.

Definition at line 41 of file CPMTobAlgorithm.cxx.

42 :
43 m_l1menu(l1menu),
44 m_Core(0),
45 m_EMClus(0),
46 m_TauClus(0),
47 m_EMIsolWord(0),
49 m_EMCore(0),
50 m_EMIsol(0),
51 m_HadCore(0),
52 m_HadIsol(0),
53 m_EtMax(false),
54 m_EMThresh(false),
55 m_TauThresh(false)
56 //m_debug(false)
57{
70
71 TriggerTowerKey get(phi-M_PI/128.,eta-0.025);
72 Coordinate refCoord = get.coord();
73 m_refEta = refCoord.eta();
74 m_refPhi = refCoord.phi();
75
76 // Set coordinate of centre of RoI, starting from reference tower coordinate
78
92
93 std::vector<unsigned int> emEt(4);
94 std::vector<unsigned int> cores(9);
95 for (int etaOffset = -1; etaOffset <= 2; etaOffset++) {
96 double tempEta = m_refEta + etaOffset*0.1;
97 for (int phiOffset = -1; phiOffset <= 2; phiOffset++) {
98 double tempPhi = m_refPhi + phiOffset*M_PI/32;
99 int key = get.ttKey(tempPhi, tempEta);
100 xAOD::CPMTowerMap_t::const_iterator tt = ttContainer->find(key);
101 if (tt != ttContainer->end() && fabs(tempEta) < m_maxEta) {
102 // Get the TT ET values once here, rather than repeat function calls
103 int emTT = 0;
104 int hadTT = 0;
105 if (slice < 0) { // Default to using peak slice
106 emTT = (tt->second)->emEnergy();
107 hadTT = (tt->second)->hadEnergy();
108 }
109 else { // Use user-specified slice
110 emTT = (tt->second)->emSliceEnergy(slice);
111 hadTT = (tt->second)->hadSliceEnergy(slice);
112 }
113 // EM Trigger Clusters and Core clusters
114 if (etaOffset >= 0 && etaOffset <= 1 && phiOffset >= 0 && phiOffset <= 1) {
115 emEt[phiOffset+2*etaOffset] = emTT;
116 m_EMCore += emTT;
117 m_HadCore += hadTT;
118 }
119 // Isolation sums
120 else {
121 m_EMIsol += emTT;
122 m_HadIsol += hadTT;
123 }
124 // Each tower is part of up to 4 RoI core clusters
125 if (etaOffset >= 0) {
126 if (phiOffset >= 0) cores[phiOffset+3*etaOffset] += emTT + hadTT;
127 if (phiOffset < 2) cores[phiOffset+3*etaOffset+1] += emTT + hadTT;
128 }
129 if (etaOffset < 2) {
130 if (phiOffset >= 0) cores[phiOffset+3*etaOffset+3] += emTT + hadTT;
131 if (phiOffset < 2) cores[phiOffset+3*etaOffset+4] += emTT + hadTT;
132 }
133
134 }
135 } // phi offset loop
136 } // eta offset loop
137
138 // Core of this window is cores[4]
139 m_Core = cores[4];
140
141 // Form most energetic 2-tower EM cluster
142 m_EMClus = ( (emEt[0] > emEt[3]) ? emEt[0] : emEt[3] )
143 + ( (emEt[1] > emEt[2]) ? emEt[1] : emEt[2] );
144
145 // Tau cluster
147
148 // Check whether RoI condition is met.
149 testEtMax(cores);
150
151 // test cluster and isolation conditions
152 emAlgorithm();
153 tauAlgorithm();
154
155}
#define M_PI
static const double m_maxEta
void tauAlgorithm()
Check trigger condition and set hits if appropriate.
void setRoICoord(double eta, double phi)
threshold values
void testEtMax(const std::vector< unsigned int > &cores)
Form all 2x2 clusters within window and test centre is a local ET maximum.
double eta()
Accessors for TOB data.
const TrigConf::L1Menu * m_l1menu
void emAlgorithm()
Check trigger condition and set hits if appropriate.
double phi()
Returns phi coordinate of RoI, using standard ATLAS convention.
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:132

◆ ~CPMTobAlgorithm()

LVL1::CPMTobAlgorithm::~CPMTobAlgorithm ( )

Definition at line 157 of file CPMTobAlgorithm.cxx.

157 {
158}

Member Function Documentation

◆ CoreET()

int LVL1::CPMTobAlgorithm::CoreET ( )

Additional information for reconstruction & performance studies.

Returns RoI Core ET.

Definition at line 377 of file CPMTobAlgorithm.cxx.

377 {
378 return m_Core;
379}

◆ createTobRoI()

xAOD::CPMTobRoI * LVL1::CPMTobAlgorithm::createTobRoI ( int type)
private

Create a pointer to a CPMTobRoI and return it.

This function does not check whether a valid RoI exists - that is left to the calling functions (but as this is a private method that should be enough)

Definition at line 497 of file CPMTobAlgorithm.cxx.

497 {
498
499 xAOD::CPMTobRoI* pointer = 0;
500
501 int et = 0;
502 int isol = 0;
503
504 if (type == TrigT1CaloDefs::emTobType) {
505 et = EMClusET();
506 isol = EMIsolWord();
507 }
508 else if (type == TrigT1CaloDefs::tauTobType) {
509 et = TauClusET();
510 isol = TauIsolWord();
511 }
512 else return pointer;
513
514 // Need to calculate hardware coordinate
515 // Object coordinate is RoI centre, but this works better if use reference tower coord
516 float eta = m_eta - 0.05;
517 float phi = m_phi - M_PI/64;
518 if (phi < 0) phi += 2*M_PI;
519 Coordinate coord(phi, eta);
520 CoordToHardware convertor;
521
522 int crate = convertor.cpCrate(coord);
523 int module = convertor.cpModule(coord);
524 int chip = convertor.cpModuleFPGA(coord);
525 int location = convertor.cpModuleLocalRoI(coord);
526
527 /*
528 float phi = ( (m_phi >= 0) ? m_phi : 2.*M_PI + m_phi );
529 int crate = 2*phi/M_PI;
530 int module = (m_eta + 2.8)/0.4 + 1;
531 int iPhi = (phi - crate*M_PI/2)*32/M_PI;
532 int chip = iPhi/2;
533 int iEta = (m_eta + 2.8 - module*0.4)/0.1;
534 int iSide = iEta/2;
535 int location = (iSide << 2) + ((iPhi&1) << 1) + (iEta&1);
536 */
537
538 pointer = new xAOD::CPMTobRoI;
539 pointer->makePrivateStore();
540 pointer->initialize(crate, module, chip, location, type, et, isol);
541
542 return pointer;
543
544}
double coord
Type of coordination system.
float et(const xAOD::jFexSRJetRoI *j)
double m_eta
Algorithm results.
int EMIsolWord()
Returns EM isolation word (5 bits).
int TauIsolWord()
Returns Tau isolation word (5 bits).
int EMClusET()
Returns EM cluster ET, limited to 8 bits.
int TauClusET()
Returns Tau cluster ET, limited to 8 bits.
virtual void initialize(int crate, int cpm, int chip, int location, int type, int energy, int isol)
CPMTobRoI_v1 CPMTobRoI
Define the latest version of the CPMTobRoI class.

◆ emAlgorithm()

void LVL1::CPMTobAlgorithm::emAlgorithm ( )
private

Check trigger condition and set hits if appropriate.

Disable isolation by default, then set cut if defined and in range. Expect parameters to be on 100 MeV scale whatever the digit scale, so need to rescale if digit scale differs. Also must rescale ET sums to same scale for comparison

Definition at line 205 of file CPMTobAlgorithm.cxx.

205 {
206
207 // Initialise to correct defaults, to be sure
208 m_EMThresh = false;
209 m_EMIsolWord = 0;
210
211 // Don't waste time if it isn't an RoI candidate
212 if (!m_EtMax) return;
213
214 // Does this pass min TOB pT cut?
215 // Need to worry about digit scale not being GeV
216 float emEnergyScale{1};
217 unsigned int tobPtMinEM{0};
218 emEnergyScale = m_l1menu->thrExtraInfo().EM().emScale();
219 tobPtMinEM = m_l1menu->thrExtraInfo().EM().ptMinToTopo();
220
221 unsigned int thresh = tobPtMinEM * emEnergyScale;
222
223 if (m_EMClus <= thresh) return;
224
225 // Passed, so there is a TOB here
226 m_EMThresh = true;
227
228 // Now calculate isolation word
229 // Define cluster and isolation values with appropriate scales and range for isolation LUT
230 unsigned int clusMask = ( (1<<m_emLUT_ClusterNBits)-1 )<<m_emLUT_ClusterFirstBit;
231 unsigned int emIsolMask = ( (1<<m_emLUT_EMIsolNBits) -1 )<<m_emLUT_EMIsolFirstBit;
232 unsigned int hadIsolMask = ( (1<<m_emLUT_HadVetoNBits)-1 )<<m_emLUT_HadVetoFirstBit;
233
234 // If cluster overflows, set all threshold bits
235 if (m_EMClus >= clusMask) {
236 m_EMIsolWord = 0x1F;
237 return;
238 }
239
240 // For consistency with LUT filling and menu parameters, convert ET sums to 100 MeV units
241 int clus = (( (m_EMClus < clusMask) ? (m_EMClus & clusMask) : clusMask ) * 10)/emEnergyScale;
242 int emIsol = (( (m_EMIsol < emIsolMask) ? (m_EMIsol & emIsolMask) : emIsolMask ) * 10)/emEnergyScale;
243 int hadVeto = (( (m_HadCore < hadIsolMask) ? (m_HadCore & hadIsolMask) : hadIsolMask ) * 10)/emEnergyScale;
244
249 std::vector<int> emisolcuts(5,m_noIsol);
250 std::vector<int> hadisolcuts(5,m_noIsol);
251 const std::string emIsolationStr1{"EMIsoForEMthr"};
252 for(size_t bit = 1; bit<=5; ++bit) {
253 const TrigConf::IsolationLegacy & iso = m_l1menu->thrExtraInfo().EM().isolation(emIsolationStr1, bit);
254 if(! iso.isDefined() ) {
255 continue;
256 }
257 int offset = iso.offset();
258 int slope = iso.slope();
259 int mincut = iso.mincut();
260 int upperlimit = iso.upperlimit()*10;
261 if (clus < upperlimit && bit >= 1 && bit <= 5) {
262 // As "slope" = 10* slope, rescale clus too to get fraction right.
263 int cut = offset + (slope != 0 ? 10*clus/slope : 0);
264 if (cut < mincut) cut = mincut;
265 emisolcuts[bit-1] = cut;
266 }
267 }
268 const std::string emIsolationStr2{"HAIsoForEMthr"};
269 for(size_t bit = 1; bit<=5; ++bit) {
270 const TrigConf::IsolationLegacy & iso = m_l1menu->thrExtraInfo().EM().isolation(emIsolationStr2, bit);
271 if(! iso.isDefined() ) {
272 continue;
273 }
274 int offset = iso.offset();
275 int slope = iso.slope();
276 int mincut = iso.mincut();
277 int upperlimit = iso.upperlimit()*10;
278 if (clus < upperlimit && bit >= 1 && bit <= 5) {
279 // As "slope" = 10* slope, rescale clus too to get fraction right.
280 int cut = offset + (slope != 0 ? 10*clus/slope : 0);
281 if (cut < mincut) cut = mincut;
282 hadisolcuts[bit-1] = cut;
283 }
284 }
285
286 // Set isolation bits
287 for (unsigned int isol = 0; isol < 5; ++isol) {
288 if (emIsol <= emisolcuts[isol] && hadVeto <= hadisolcuts[isol]) m_EMIsolWord += (1 << isol);
289 }
290
291}
static const unsigned int m_emLUT_ClusterNBits
static const unsigned int m_emLUT_HadVetoFirstBit
static const unsigned int m_emLUT_HadVetoNBits
static const unsigned int m_emLUT_ClusterFirstBit
static const unsigned int m_emLUT_EMIsolFirstBit
static const unsigned int m_emLUT_EMIsolNBits
static const unsigned int m_noIsol
constexpr unsigned int bit(int n)

◆ EMClusET()

int LVL1::CPMTobAlgorithm::EMClusET ( )

Returns EM cluster ET, limited to 8 bits.

Definition at line 382 of file CPMTobAlgorithm.cxx.

382 {
383 return ( (m_EMClus < m_maxClus) ? m_EMClus : m_maxClus );
384}
static const unsigned int m_maxClus
Algorithm parameters.

◆ EMCoreET()

int LVL1::CPMTobAlgorithm::EMCoreET ( )

Returns EM core ET.

Definition at line 412 of file CPMTobAlgorithm.cxx.

412 {
413 return m_EMCore;
414}

◆ EMCPMTobRoI()

xAOD::CPMTobRoI * LVL1::CPMTobAlgorithm::EMCPMTobRoI ( )

Create CPMTobRoIs and return pointers to them.

Returns CPMTobRoI for EM hypothesis, provided EM Tob conditions passed.

Will return a null pointer if object does not pass hypothesis. It is the user's responsibility to check

Definition at line 472 of file CPMTobAlgorithm.cxx.

472 {
473 if (isEMRoI()) {
475 return pointer;
476 }
477
478 return 0;
479
480}
xAOD::CPMTobRoI * createTobRoI(int type)
Create a pointer to a CPMTobRoI and return it.
bool isEMRoI()
Report whether this passed as an EM TOB.

◆ EMIsolET()

int LVL1::CPMTobAlgorithm::EMIsolET ( )

Returns EM isolation ET.

Definition at line 402 of file CPMTobAlgorithm.cxx.

402 {
403 return m_EMIsol;
404}

◆ EMIsolWord()

int LVL1::CPMTobAlgorithm::EMIsolWord ( )

Returns EM isolation word (5 bits).

Definition at line 392 of file CPMTobAlgorithm.cxx.

392 {
393 return m_EMIsolWord;
394}

◆ EMLUTClus()

int LVL1::CPMTobAlgorithm::EMLUTClus ( )

Sums with the range & precision of isolation LUT inputs.

Returns EM cluster ET with range and precision of LUT input.

Definition at line 427 of file CPMTobAlgorithm.cxx.

427 {
428 int ET = (m_EMClus >> m_emLUT_ClusterFirstBit);
429 if (ET > (1<< m_emLUT_ClusterNBits) - 1) ET = (1<<m_emLUT_ClusterNBits) - 1;
430 return (ET << m_emLUT_ClusterFirstBit);
431}

◆ EMLUTEMIsol()

int LVL1::CPMTobAlgorithm::EMLUTEMIsol ( )

Returns EM isolation ET with range and precision of EM LUT input.

Definition at line 441 of file CPMTobAlgorithm.cxx.

441 {
442 int ET = (m_EMIsol >> m_emLUT_EMIsolFirstBit);
443 if (ET > (1<<m_emLUT_EMIsolNBits) - 1) ET = (1<<m_emLUT_EMIsolNBits) - 1;
444 return (ET << m_emLUT_EMIsolFirstBit);
445}

◆ EMLUTHadVeto()

int LVL1::CPMTobAlgorithm::EMLUTHadVeto ( )

Returns Had veto ET with range and precision of EM LUT input.

Definition at line 448 of file CPMTobAlgorithm.cxx.

448 {
450 if (ET > (1<<m_emLUT_HadVetoNBits) - 1) ET = (1<<m_emLUT_HadVetoNBits) - 1;
451 return (ET << m_emLUT_HadVetoFirstBit);
452}

◆ eta()

double LVL1::CPMTobAlgorithm::eta ( )

Accessors for TOB data.

Returns eta coordinate of RoI.

Definition at line 462 of file CPMTobAlgorithm.cxx.

462 {
463 return m_eta;
464}

◆ HadCoreET()

int LVL1::CPMTobAlgorithm::HadCoreET ( )

Returns Had core ET (inner isolation sum).

Definition at line 417 of file CPMTobAlgorithm.cxx.

417 {
418 return m_HadCore;
419}

◆ HadIsolET()

int LVL1::CPMTobAlgorithm::HadIsolET ( )

Returns Had isolation ET.

Definition at line 407 of file CPMTobAlgorithm.cxx.

407 {
408 return m_HadIsol;
409}

◆ isEMRoI()

bool LVL1::CPMTobAlgorithm::isEMRoI ( )

Report whether this passed as an EM TOB.

Definition at line 359 of file CPMTobAlgorithm.cxx.

359 {
360
361 bool passed = ( m_EMThresh && m_EtMax );
362
363 return passed;
364}
bool passed(DecisionID id, const DecisionIDContainer &)
checks if required decision ID is in the set of IDs in the container

◆ isEtMax()

bool LVL1::CPMTobAlgorithm::isEtMax ( )

Does this window pass the local ET maximum condition.

Definition at line 422 of file CPMTobAlgorithm.cxx.

422 {
423 return m_EtMax;
424}

◆ isTauRoI()

bool LVL1::CPMTobAlgorithm::isTauRoI ( )

Report whether this passed as a Tau TOB.

Definition at line 367 of file CPMTobAlgorithm.cxx.

367 {
368
369 bool passed = ( m_TauThresh && m_EtMax );
370
371 return passed;
372}

◆ phi()

double LVL1::CPMTobAlgorithm::phi ( )

Returns phi coordinate of RoI, using standard ATLAS convention.

Definition at line 467 of file CPMTobAlgorithm.cxx.

467 {
468 return ( (m_phi <= M_PI) ? m_phi : m_phi - 2.*M_PI);
469}

◆ setRoICoord()

void LVL1::CPMTobAlgorithm::setRoICoord ( double eta,
double phi )
private

threshold values

Compute RoI coordinate.

Input coordinate should be inside "reference tower" of window. Computes RoI coordinate as centre of 2x2 tower RoI core

Definition at line 162 of file CPMTobAlgorithm.cxx.

162 {
163
164 // TriggerTowerKey::coord() returns centre of TriggerTower
165 TriggerTowerKey keyLL(phi,eta);
166 Coordinate lowerLeft = keyLL.coord();
167
168 // Get centre of tower at eta+1, phi+1, i.e. opposite corner of RoI core
169 double dEta = keyLL.dEta(lowerLeft);
170 double dPhi = keyLL.dPhi(lowerLeft);
171
172 TriggerTowerKey keyUR(phi+dPhi, eta + dEta);
173 Coordinate upperRight = keyUR.coord();
174
175 // CoordinateRange object will compute centre, correcting for wrap-around
176 CoordinateRange roi(lowerLeft.phi(),upperRight.phi(),lowerLeft.eta(),upperRight.eta());
177 m_eta = roi.eta();
178 m_phi = roi.phi();
179
180 // Range check (shouldn't be needed, but floating point precision errors possible)
181 if (m_eta > 2.5) m_eta = 2.5;
182 else if (m_eta < -2.5) m_eta = -2.5;
183}
bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
bool dEta(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)

◆ tauAlgorithm()

void LVL1::CPMTobAlgorithm::tauAlgorithm ( )
private

Check trigger condition and set hits if appropriate.

Definition at line 295 of file CPMTobAlgorithm.cxx.

295 {
296
297 // Initialise to correct defaults, to be sure
298 m_TauThresh = false;
299 m_TauIsolWord = 0;
300
301 // Don't waste time if it isn't an RoI candidate
302 if (!m_EtMax) return;
303
304 // Does this pass min TOB pT cut?
305 // Need to worry about digit scale not being GeV
306 float emEnergyScale{1};
307 unsigned int tobPtMinTau{0};
308 emEnergyScale = m_l1menu->thrExtraInfo().EM().emScale();
309 tobPtMinTau = m_l1menu->thrExtraInfo().TAU().ptMinToTopo();
310 unsigned int thresh = tobPtMinTau * emEnergyScale;
311
312 if (m_TauClus <= thresh) return;
313
314 // Passed, so there is a TOB here
315 m_TauThresh = true;
316
317 // Now calculate isolation word
318 // Define cluster and isolation values with appropriate scales and range for isolation LUT
319 unsigned int clusMask = ( (1<<m_tauLUT_ClusterNBits)-1 )<<m_tauLUT_ClusterFirstBit;
320 unsigned int emIsolMask = ( (1<<m_tauLUT_EMIsolNBits) -1 )<<m_tauLUT_EMIsolFirstBit;
321
322 // If cluster overflows, set all threshold bits
323 if (m_TauClus >= clusMask) {
324 m_TauIsolWord = 0x1F;
325 return;
326 }
327
328 // Convert to 100 MeV units to match parameters
329 int clus = (( (m_TauClus < clusMask) ? (m_TauClus & clusMask) : clusMask ) * 10)/emEnergyScale;
330 int emIsol = (( (m_EMIsol < emIsolMask) ? (m_EMIsol & emIsolMask) : emIsolMask ) * 10)/emEnergyScale;
331
332 // Get isolation values from menu (placeholder code - example logic)
333 std::vector<int> emisolcuts(5,m_noIsol);
334 const std::string tauIsolationStr{"EMIsoForTAUthr"};
335 for(size_t bit = 1; bit<=5; ++bit) {
336 const TrigConf::IsolationLegacy & iso = m_l1menu->thrExtraInfo().TAU().isolation(tauIsolationStr, bit);
337 if(! iso.isDefined() ) {
338 continue;
339 }
340 int offset = iso.offset();
341 int slope = iso.slope();
342 int mincut = iso.mincut();
343 int upperlimit = iso.upperlimit()*10;
344 if (clus < upperlimit && bit >= 1 && bit <= 5) {
345 // As "slope" = 10* slope, rescale clus too to get fraction right.
346 int cut = offset + (slope != 0 ? 10*clus/slope : 0);
347 if (cut < mincut) cut = mincut;
348 emisolcuts[bit-1] = cut;
349 }
350 }
351
352 // Set isolation bits
353 for (unsigned int isol = 0; isol < 5; ++isol)
354 if (emIsol <= emisolcuts[isol]) m_TauIsolWord += (1 << isol);
355
356}
static const unsigned int m_tauLUT_EMIsolNBits
static const unsigned int m_tauLUT_ClusterFirstBit
static const unsigned int m_tauLUT_EMIsolFirstBit
static const unsigned int m_tauLUT_ClusterNBits

◆ TauClusET()

int LVL1::CPMTobAlgorithm::TauClusET ( )

Returns Tau cluster ET, limited to 8 bits.

Definition at line 387 of file CPMTobAlgorithm.cxx.

387 {
388 return ( (m_TauClus < m_maxClus) ? m_TauClus : m_maxClus );
389}

◆ TauCPMTobRoI()

xAOD::CPMTobRoI * LVL1::CPMTobAlgorithm::TauCPMTobRoI ( )

Returns CPMTobRoI for TAU hypothesis, provided TAU Tob conditions passed.

Definition at line 483 of file CPMTobAlgorithm.cxx.

483 {
484
485 xAOD::CPMTobRoI* pointer = 0;
486
488
489 return pointer;
490
491}
bool isTauRoI()
Report whether this passed as a Tau TOB.

◆ TauIsolWord()

int LVL1::CPMTobAlgorithm::TauIsolWord ( )

Returns Tau isolation word (5 bits).

Definition at line 397 of file CPMTobAlgorithm.cxx.

397 {
398 return m_TauIsolWord;
399}

◆ TauLUTClus()

int LVL1::CPMTobAlgorithm::TauLUTClus ( )

Returns Tau cluster ET with range and precision of LUT input.

Definition at line 434 of file CPMTobAlgorithm.cxx.

434 {
436 if (ET > (1<<m_tauLUT_ClusterNBits) - 1) ET = (1<<m_tauLUT_ClusterNBits) - 1;
437 return (ET << m_tauLUT_ClusterFirstBit);
438}

◆ TauLUTEMIsol()

int LVL1::CPMTobAlgorithm::TauLUTEMIsol ( )

Returns EM isolation ET with range and precision of Tau LUT input.

Definition at line 455 of file CPMTobAlgorithm.cxx.

455 {
456 int ET = (m_EMIsol >> m_tauLUT_EMIsolFirstBit);
457 if (ET > (1<<m_tauLUT_EMIsolNBits) - 1) ET = (1<<m_tauLUT_EMIsolNBits) - 1;
458 return (ET << m_tauLUT_EMIsolFirstBit);
459}

◆ testEtMax()

void LVL1::CPMTobAlgorithm::testEtMax ( const std::vector< unsigned int > & cores)
private

Form all 2x2 clusters within window and test centre is a local ET maximum.

Clusters form a list, arranged as
2 5 8
1 4 7
0 3 6
Then 4 = this window's RoI core, and ET max condition is
4 >= 0, 1, 2, 3 && 4 < 5, 6, 7, 8

Definition at line 186 of file CPMTobAlgorithm.cxx.

186 {
187
195
196 // RoI condition test
197 m_EtMax = true;
198 for (int i = 0; i < 4; i++) if (m_Core < cores[i]) m_EtMax = false;
199 for (int i = 5; i < 9; i++) if (m_Core <= cores[i]) m_EtMax = false;
200
201}

Member Data Documentation

◆ m_Core

unsigned int LVL1::CPMTobAlgorithm::m_Core
private

Definition at line 91 of file CPMTobAlgorithm.h.

◆ m_EMClus

unsigned int LVL1::CPMTobAlgorithm::m_EMClus
private

Definition at line 92 of file CPMTobAlgorithm.h.

◆ m_EMCore

unsigned int LVL1::CPMTobAlgorithm::m_EMCore
private

Definition at line 96 of file CPMTobAlgorithm.h.

◆ m_EMIsol

unsigned int LVL1::CPMTobAlgorithm::m_EMIsol
private

Definition at line 97 of file CPMTobAlgorithm.h.

◆ m_EMIsolWord

unsigned int LVL1::CPMTobAlgorithm::m_EMIsolWord
private

Definition at line 94 of file CPMTobAlgorithm.h.

◆ m_emLUT_ClusterFirstBit

const unsigned int LVL1::CPMTobAlgorithm::m_emLUT_ClusterFirstBit = 1
staticprivate

Definition at line 109 of file CPMTobAlgorithm.h.

◆ m_emLUT_ClusterNBits

const unsigned int LVL1::CPMTobAlgorithm::m_emLUT_ClusterNBits = 6
staticprivate

Definition at line 110 of file CPMTobAlgorithm.h.

◆ m_emLUT_EMIsolFirstBit

const unsigned int LVL1::CPMTobAlgorithm::m_emLUT_EMIsolFirstBit = 0
staticprivate

Definition at line 111 of file CPMTobAlgorithm.h.

◆ m_emLUT_EMIsolNBits

const unsigned int LVL1::CPMTobAlgorithm::m_emLUT_EMIsolNBits = 4
staticprivate

Definition at line 112 of file CPMTobAlgorithm.h.

◆ m_emLUT_HadVetoFirstBit

const unsigned int LVL1::CPMTobAlgorithm::m_emLUT_HadVetoFirstBit = 0
staticprivate

Definition at line 113 of file CPMTobAlgorithm.h.

◆ m_emLUT_HadVetoNBits

const unsigned int LVL1::CPMTobAlgorithm::m_emLUT_HadVetoNBits = 3
staticprivate

Definition at line 114 of file CPMTobAlgorithm.h.

◆ m_EMThresh

bool LVL1::CPMTobAlgorithm::m_EMThresh
private

Definition at line 101 of file CPMTobAlgorithm.h.

◆ m_eta

double LVL1::CPMTobAlgorithm::m_eta
private

Algorithm results.

Definition at line 89 of file CPMTobAlgorithm.h.

◆ m_EtMax

bool LVL1::CPMTobAlgorithm::m_EtMax
private

Definition at line 100 of file CPMTobAlgorithm.h.

◆ m_HadCore

unsigned int LVL1::CPMTobAlgorithm::m_HadCore
private

Definition at line 98 of file CPMTobAlgorithm.h.

◆ m_HadIsol

unsigned int LVL1::CPMTobAlgorithm::m_HadIsol
private

Definition at line 99 of file CPMTobAlgorithm.h.

◆ m_l1menu

const TrigConf::L1Menu* LVL1::CPMTobAlgorithm::m_l1menu {nullptr}
private

Definition at line 86 of file CPMTobAlgorithm.h.

86{nullptr};

◆ m_maxClus

const unsigned int LVL1::CPMTobAlgorithm::m_maxClus = 0xFF
staticprivate

Algorithm parameters.

Definition at line 107 of file CPMTobAlgorithm.h.

◆ m_maxEta

const double LVL1::CPMTobAlgorithm::m_maxEta = 2.5
staticprivate

Definition at line 123 of file CPMTobAlgorithm.h.

◆ m_noIsol

const unsigned int LVL1::CPMTobAlgorithm::m_noIsol = 999
staticprivate

Definition at line 121 of file CPMTobAlgorithm.h.

◆ m_phi

double LVL1::CPMTobAlgorithm::m_phi
private

Definition at line 90 of file CPMTobAlgorithm.h.

◆ m_refEta

double LVL1::CPMTobAlgorithm::m_refEta
private

Definition at line 84 of file CPMTobAlgorithm.h.

◆ m_refPhi

double LVL1::CPMTobAlgorithm::m_refPhi
private

Definition at line 85 of file CPMTobAlgorithm.h.

◆ m_TauClus

unsigned int LVL1::CPMTobAlgorithm::m_TauClus
private

Definition at line 93 of file CPMTobAlgorithm.h.

◆ m_TauIsolWord

unsigned int LVL1::CPMTobAlgorithm::m_TauIsolWord
private

Definition at line 95 of file CPMTobAlgorithm.h.

◆ m_tauLUT_ClusterFirstBit

const unsigned int LVL1::CPMTobAlgorithm::m_tauLUT_ClusterFirstBit = 1
staticprivate

Definition at line 116 of file CPMTobAlgorithm.h.

◆ m_tauLUT_ClusterNBits

const unsigned int LVL1::CPMTobAlgorithm::m_tauLUT_ClusterNBits = 7
staticprivate

Definition at line 117 of file CPMTobAlgorithm.h.

◆ m_tauLUT_EMIsolFirstBit

const unsigned int LVL1::CPMTobAlgorithm::m_tauLUT_EMIsolFirstBit = 0
staticprivate

Definition at line 118 of file CPMTobAlgorithm.h.

◆ m_tauLUT_EMIsolNBits

const unsigned int LVL1::CPMTobAlgorithm::m_tauLUT_EMIsolNBits = 6
staticprivate

Definition at line 119 of file CPMTobAlgorithm.h.

◆ m_TauThresh

bool LVL1::CPMTobAlgorithm::m_TauThresh
private

Definition at line 102 of file CPMTobAlgorithm.h.


The documentation for this class was generated from the following files: