37#include "GaudiKernel/IIncidentSvc.h"
42#include "GaudiKernel/ThreadLocalContext.h"
44#include "CLHEP/Random/RandGaussZiggurat.h"
45#include "CLHEP/Random/Randomize.h"
46#include "CLHEP/Random/RandomEngine.h"
55#include <unordered_map>
62 template <
typename MSG,
typename T>
63 void printVec(
MSG&
msg,
const std::vector<T>& v) {
67 template <
typename MSG,
typename T, std::
size_t N>
68 void printVec(
MSG&
msg,
const std::array<T, N>& v) {
72 constexpr static int ADCMAX = 1023;
73 constexpr static int SATURATIONVALUE = 255;
86 m_bstowertool(
"LVL1BS__TrigT1CaloDataAccessV2/TrigT1CaloDataAccessV2", this),
133 for(
unsigned int i = 0; i < 25; i++) {
145 m_sinThetaHash[ (
unsigned int)(32 + (0.5*0.425)*10.) ] = 1.0/cosh(3.2 + 0.5*0.425);
146 m_sinThetaHash[ (
unsigned int)(32 + (1.5*0.425)*10.) ] = 1.0/cosh(3.2 + 1.5*0.425);
147 m_sinThetaHash[ (
unsigned int)(32 + (2.5*0.425)*10.) ] = 1.0/cosh(3.2 + 2.5*0.425);
148 m_sinThetaHash[ (
unsigned int)(32 + (3.5*0.425)*10.) ] = 1.0/cosh(3.2 + 3.5*0.425);
166 return StatusCode::FAILURE;
172 incSvc->addListener(
this,
"BeginRun");
208 return StatusCode::SUCCESS;
215 if(inc.type() !=
"BeginRun")
return;
222 }
catch(
const std::out_of_range&) {
223 ATH_MSG_DEBUG(
"No Legacy triggers in menu, using default scales");
239 throw std::runtime_error(
"Overlay no longer supported in Run2TriggerTowerMaker");
266 if(
detStore()->retrieve(tileInfo,
"TileInfo").isFailure()) {
278 if(
evtStore()->retrieve(evtinfo)!=StatusCode::SUCCESS) {
279 ATH_MSG_WARNING(
"Could not determine if input file is data or simulation. Will assume simulation.");
285 ATH_MSG_INFO(
"Detected data reprocessing. Will take pedestal correction values from input trigger towers.");
294 ATH_MSG_INFO(
"L1Calo overlay job - setting m_isDataReprocessing to false");
302 return StatusCode::SUCCESS;
326 auto*
defaults = pprChanDefaults->pprChanDefaults(0);
328 ATH_MSG_ERROR(
"Could not retrieve channel 0 PprChanDefaults folder. Aborting ...");
329 throw std::runtime_error(
"Run2TriggerTowerMaker: channel 0 of PprChanDefaults not accesible");
333 const EventContext& ctx = Gaudi::Hive::currentContext();
353 ATH_MSG_ERROR(
"Unsupported Cell Type!!!!!!");
return StatusCode::FAILURE;
360 const float mu = muDecor(0);
371 return StatusCode::SUCCESS;
377 if (!db)
return false;
378 if (db->errorCode() > 0 || db->noiseCut() > 0)
return true;
384 if (!db)
return false;
385 if (db->disabledBits() > 0)
return true;
393 if (!isDead && !isDisabled)
return true;
402 overlayDataTTs->setStore( &overlayDataTTsAux );
406 std::unordered_map<uint32_t,xAOD::TriggerTower*> overlayMap;
407 typedef std::unordered_map<uint32_t,xAOD::TriggerTower*>::iterator Itr;
410 char decor_ttNotUsedInOverlay = 0;
411 char decor_ttUsedInOverlay = 1;
413 for (
auto tt:*overlayDataTTs) {
416 decor(*tt) = decor_ttNotUsedInOverlay;
417 overlayMap.insert( std::make_pair( tt->coolId() , tt ) );
422 bool findSizeOfPrimaryLUT(
true);
423 unsigned int sizeOfPrimaryLUT(0);
424 uint8_t peakOfPrimary(0);
430 if (findSizeOfPrimaryLUT) {
431 findSizeOfPrimaryLUT =
false;
432 sizeOfPrimaryLUT = tt->lut_cp().size();
433 peakOfPrimary = tt->peak();
437 Itr
match = overlayMap.find( tt->coolId() );
438 if (
match != overlayMap.end()) {
443 decor(*
match->second) = decor_ttUsedInOverlay;
449 for (Itr i=overlayMap.begin();i!=overlayMap.end();++i) {
451 if (decor(*tt) == decor_ttNotUsedInOverlay) {
453 std::vector<uint8_t> overlay_lut_cp(sizeOfPrimaryLUT,0.);
454 std::vector<uint8_t> overlay_lut_jep(sizeOfPrimaryLUT,0.);
457 overlay_lut_cp.at(peakOfPrimary) = tt->cpET();
458 overlay_lut_jep.at(peakOfPrimary) = tt->jepET();
461 tt->setPeak( peakOfPrimary );
462 tt->setLut_cp( overlay_lut_cp );
463 tt->setLut_jep( overlay_lut_jep );
471 return StatusCode::SUCCESS;
482 ATH_MSG_ERROR(
"Cannot find signal DB for tower 0x"<<std::hex<<sigTT->
coolId()<<std::dec<<
" Aborting...");
483 return StatusCode::FAILURE;
487 ATH_MSG_ERROR(
"Cannot find overlay DB for tower 0x"<<std::hex<<ovTT->
coolId()<<std::dec<<
" Aborting...");
488 return StatusCode::FAILURE;
493 std::vector<int> sigDigits( std::begin(sigTT->
adc()) , std::end(sigTT->
adc()) );
494 std::vector<int> ovDigits( std::begin(ovTT->
adc()) , std::end(ovTT->
adc()) );
495 std::vector<int> normOverlayDigits;
499 std::vector<int> sigLutIn,ovLutIn;
504 std::vector<int> lutOut_cp,lutOut_jep;
510 std::size_t peak = lutOut_jep.size()/2;
511 std::vector<uint_least8_t> etResultVectorCp { uint8_t(lutOut_cp[peak]) };
512 std::vector<uint_least8_t> etResultVectorJep { uint8_t(lutOut_jep[peak]) };
514 sigTT->
setLut_cp(std::move(etResultVectorCp));
515 sigTT->
setLut_jep(std::move(etResultVectorJep));
517 return StatusCode::SUCCESS;
523 ATH_MSG_ERROR(
"Cannot process calcLutOutCP as lutCpStrategy > 2");
524 return StatusCode::FAILURE;
528 double sigSlope = sigScale * sigDB->
lutCpSlope();
529 double sigOffset = sigScale * sigDB->
lutCpOffset();
532 double ovSlope = ovScale * ovDB->
lutCpSlope();
536 calcCombinedLUT(sigLutIn,sigSlope,sigOffset,ovLutIn,ovSlope,ovOffset,ovNoiseCut,output);
538 return StatusCode::SUCCESS;
544 ATH_MSG_ERROR(
"Cannot process calcLutOutJEP as lutJepStrategy > 2");
545 return StatusCode::FAILURE;
557 calcCombinedLUT(sigLutIn,sigSlope,sigOffset,ovLutIn,ovSlope,ovOffset,ovNoiseCut,output);
559 return StatusCode::SUCCESS;
563 const std::vector<int>& ovIN,
const int ovSlope,
const int ovOffset,
const int ovNoiseCut,std::vector<int>& output)
573 output.reserve(sigIN.size());
575 for (
unsigned int i=0;i<sigIN.size();++i) {
577 int signal = sigIN[i];
580 int outSig = signal*sigSlope - sigOffset;
581 int outOv =
overlay*ovSlope - ovOffset;
582 int outTmp = outSig + outOv;
585 if (outTmp >= ovNoiseCut) {
586 out = (outSig + outOv + 2048)>>12;
590 if (out < 0) out = 0;
591 if (out > 255) out = 255;
593 output.push_back( out );
602 std::vector<int> fir;
604 {db->firCoeff5(),db->firCoeff4(),db->firCoeff3(),db->firCoeff2(),db->firCoeff1()},
608 int pedCorrectionStrategy = db->lutCpStrategy();
609 std::vector<int16_t> correction;
612 if (pedCorrectionStrategy == 1) {
616 int firPed = (db->firCoeff5() + db->firCoeff4() + db->firCoeff3() +
617 db->firCoeff2() + db->firCoeff1()) * int(db->pedMean() + 0.5);
628 if (pedCorrectionStrategy == 2) {
633 std::size_t offset = (fir.size() - tower->
correction().size())/2;
635 for(std::size_t i = offset, e = fir.size() - offset; i != e; ++i) {
636 correction.push_back(tower->
correction()[i-offset]);
642 m_TTtool->dropBits(fir, db->firStartBit(), output);
644 return StatusCode::SUCCESS;
656 if (sigDigits.size() == ovDigits.size()) {
657 for (
auto x:ovDigits) normDigits.push_back(
x );
661 if (sigDigits.size() > ovDigits.size()) {
662 unsigned int pad = (sigDigits.size() - ovDigits.size()) / 2;
663 for (
unsigned int x=0;
x<pad;++
x) normDigits.push_back( 32 );
664 for (
auto x:ovDigits) normDigits.push_back(
x );
665 for (
unsigned int x=0;
x<pad;++
x) normDigits.push_back( 32 );
670 if (sigDigits.size() < ovDigits.size()) {
671 unsigned int offset = (ovDigits.size() - sigDigits.size()) / 2;
672 for (
unsigned int x=0;
x<sigDigits.size();++
x) {
673 unsigned int pos =
x + offset;
674 normDigits.push_back( ovDigits[pos] );
689 return StatusCode::SUCCESS;
698 ATH_MSG_ERROR(
"Tower with coolId 0x"<<std::hex<<tower->
coolId()<<std::dec<<
" Not in database! Aborting ...");
699 return StatusCode::FAILURE;
703 int pedCorrectionStrategy(0);
714 std::vector<int> digits(std::begin(tower->
adc()), std::end(tower->
adc()));
717 std::vector<int> fir;
724 std::vector<int16_t> correction;
734 if (pedCorrectionStrategy == 1) {
750 if (pedCorrectionStrategy == 2) {
755 std::size_t offset = (fir.size() - tower->
correction().size())/2;
757 for(std::size_t i = offset, e = fir.size() - offset; i != e; ++i) {
758 correction.push_back(tower->
correction()[i-offset]);
762 printVec(this->
msg(MSG::VERBOSE), correction);
768 std::vector<int> lutIn;
772 std::vector<int> lutOut_cp;
791 printVec(this->
msg(MSG::VERBOSE), lutOut_cp);
795 std::vector<int> lutOut_jep;
814 printVec(this->
msg(MSG::VERBOSE), lutOut_jep);
818 std::vector<int> BCIDOut;
830 printVec(this->
msg(MSG::VERBOSE), BCIDOut);
833 std::size_t peak = lutOut_jep.size()/2;
834 std::vector<uint_least8_t> etResultVectorCp { uint8_t(lutOut_cp[peak]) };
836 printVec(this->
msg(MSG::VERBOSE), etResultVectorCp);
837 std::vector<uint_least8_t> etResultVectorJep { uint8_t(lutOut_jep[peak]) };
839 printVec(this->
msg(MSG::VERBOSE), etResultVectorJep);
851 std::array<int, 3> bcidDecision {
855 printVec(this->
msg(MSG::VERBOSE), bcidDecision);
857 std::array<int, 3> satOverride {
861 printVec(this->
msg(MSG::VERBOSE), satOverride);
863 if((bcidDecision[range]) & (0x1 << (BCIDOut[BCIDOut.size()/2]))) {
864 if((satOverride[range]) & 0x1) {
866 etResultVectorCp[0] = SATURATIONVALUE;
867 etResultVectorJep[0] = SATURATIONVALUE;
871 etResultVectorCp[0] = 0;
872 etResultVectorJep[0] = 0;
878 tower->
setLut_cp(std::move(etResultVectorCp));
879 tower->
setLut_jep(std::move(etResultVectorJep));
880 tower->
setBcidVec({uint8_t(BCIDOut[BCIDOut.size()/2])});
882 printVec(this->
msg(MSG::VERBOSE), tower->
bcidVec());
888 tower->
setBcidExt(std::vector<uint8_t>(tower->
adc().size(), 0u));
895 correction[correction.size()/2]));
902 return StatusCode::SUCCESS;
917 return tt->cpET() == 0 && tt->jepET() == 0;
933 return StatusCode::SUCCESS;
944 ATH_MSG_INFO(
"Found " << inputTTs->size() <<
" input TriggerTowers");
959 [
this](
const xAOD::TriggerTower* tt){return !IsGoodTower(tt,m_deadChannelsContainer,m_disabledTowersContainer);}),
962 return StatusCode::SUCCESS;
969 StatusCode sc1 = StatusCode::SUCCESS;
973 sc1 = StatusCode::FAILURE;
976 StatusCode sc2 = StatusCode::SUCCESS;
980 sc2 = StatusCode::FAILURE;
984 StatusCode sc3 = StatusCode::SUCCESS;
988 sc3 = StatusCode::FAILURE;
992 (sc2==StatusCode::FAILURE) ||
993 (sc3==StatusCode::FAILURE))) {
995 <<
"Found Em LArTTL1 : "<<sc1 <<
endmsg
996 <<
"Found Had LArTTL1 : "<<sc2 <<
endmsg
997 <<
"Found TileTTL1 : "<<sc3<<
endmsg
999 return StatusCode::FAILURE;
1003 if(sc1 == StatusCode::SUCCESS) {
1006 if(sc2 == StatusCode::SUCCESS) {
1009 if(sc3 == StatusCode::SUCCESS) {
1021 [
this](
const xAOD::TriggerTower* tt){return !IsGoodTower(tt,m_deadChannelsContainer,m_disabledTowersContainer);}),
1024 return StatusCode::SUCCESS;
1031 for(
const LArTTL1* tower : *towers){
1032 ATH_MSG_VERBOSE(
"Looking at retrieved tower number "<<towerNumber++<<
" ***********");
1038 int layer = int(
m_caloId->sampling(
id) != 0);
1042 int nsamples = tower->nsamples();
1043 std::vector<float> tower_amps = tower->samples();
1055 if(j >= 0 && j < nsamples) {
1056 amps[i] = tower_amps[j];
1066 t->setCoolId(coolId.
id());
1077 for(
const TileTTL1* tower : *towers) {
1078 ATH_MSG_VERBOSE(
"Looking at retrieved tower number "<<towerNumber++<<
" ***********");
1091 unsigned Ieta = unsigned(fabs(tower_eta)*10.0);
1093 ATH_MSG_WARNING(
"TileTTL1 with invalid index for m_sinThetaHash: Ieta = " << Ieta);
1098 int nsamples = tower->nsamples();
1099 std::vector<float> tower_amps = tower->fsamples();
1108 for(
int i = 0; i < 7; i++) {
1110 if(j >= 0 && j < nsamples) {
1124 t->setCoolId(
channelId(tower_eta, tower_phi, 1).
id());
1125 t->setEta(tower_eta);
1126 t->setPhi(tower_phi);
1137 CLHEP::HepRandomEngine* rndmADCs =
m_rndmADCs->getEngine (ctx);
1144 tower->setAdc(std::vector<uint16_t>(std::begin(digits), std::end(digits)));
1145 tower->setAdcPeak(digits.size()/2);
1153 if(!chanCalib) {
ATH_MSG_WARNING(
"No database entry for tower " << channel.id());
return {}; }
1154 double ped = chanCalib->pedMean();
1157 double adcCal = (
m_gainCorr > 0.) ? CLHEP::RandGaussZiggurat::shoot(rndmADCs, 1.,
m_gainCorr) : 1.;
1159 std::vector<int> digits;
1160 const int nSamples = amps.size();
1161 digits.reserve(nSamples);
1162 for(
int i = 0; i < nSamples; ++i) {
1164 double adcNoise = (
m_adcVar > 0.) ? CLHEP::RandGaussZiggurat::shoot(rndmADCs,0.,
m_adcVar) : 0.;
1166 int digit = int((amps[i]*adcCal/
m_adcStep) + ped + adcNoise);
1167 if(digit > ADCMAX) digit = ADCMAX;
1168 if(digit < 0) digit = 0;
1169 digits.push_back(digit);
1176 if(
et < bcidEnergyRangeLow)
return 0;
1177 if(
et < bcidEnergyRangeHigh)
return 1;
1183 int region = l1id->
region(
id);
1184 int ieta = l1id->
eta(
id);
1187 double gran[4] = {0.1, 0.2, 0.1, 0.425};
1188 double offset[4] = {0., 2.5, 3.1, 3.2};
1191 if(region>=0 && region<=3) {
1192 eta =
sign* (((ieta+0.5) * gran[region]) + offset[region]);
1206 double phiMax = l1id->
phi_max(regId);
1207 int iphi = l1id->
phi(
id);
1208 double phi = (iphi+0.5)*2*
M_PI/(phiMax+1);
1219 int crate, module, channel;
1221 int slot =
module + 5;
1222 int pin = channel % 16;
1223 int asic = channel / 16;
1229 constexpr static int NELEMENTS = 33;
1231 float shiftedEta = feta + 4.9;
1233 if(fabs(shiftedEta*10.0 - (
uint)(
eta+1)) < 0.01)
eta++;
1234 if(fabs(shiftedEta) < 0.01)
eta = 0;
1236 constexpr int nBins = 16;
1237 constexpr uint map[nBins] = {2,6,10,14,17,19,21,23,75,77,79,80,83,87,91,95};
1239 if(
eta > 23 &&
eta < 74) {
1242 for(
int i = 0; i < nBins; i++) {
1244 if(i < 8) element = i;
1245 else element = i + 50;
1250 if (layer == 1 && (element == 0 || element == 64)) element = 1;
1251 else if (layer == 1 && (element == 1 || element == 65)) element = 0;
1252 else if (layer == 1 && (element == 2 || element == 62)) element = 3;
1253 else if (layer == 1 && (element == 3 || element == 63)) element = 2;
1254 else if (element > 32) element = 65-element;
1257 element = NELEMENTS-element-1;
1270 double nll_slope = 0.001 * scale;
1271 double nll_offset = 0.001 * par1;
1272 double nll_ampl = 0.001 * par2;
1273 double nll_expo = 0.;
1275 nll_expo = -1. / (4096 * 0.001*par3);
1279 double nll_noise = 0.001 * par4;
1282 if (lutin * slope < offset + nll_noise * noiseCut) {
1287 int output = int((((
int)(2048 + nll_slope * (lutin * slope - offset)))>>12) + nll_offset + nll_ampl * std::exp(nll_expo * (lutin * slope - offset)));
1288 if(output >= 255)
return 255;
1289 if(output < 0)
return 0;
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define CHECK(...)
Evaluate an expression and check for errors.
Helper class to provide type-safe access to aux data.
Handle class for reading a decoration on an object.
Handle class for reading from StoreGate.
TileContainer< TileTTL1 > TileTTL1Container
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)
ServiceHandle< StoreGateSvc > & evtStore()
const ServiceHandle< StoreGateSvc > & detStore() const
Helper class for offline TT identifiers.
int phi_max(const Identifier regId) const
min value of phi index (-999 == failure)
Identifier region_id(int pos_neg_z, int sampling, int region) const
build a region (of towers) identifier
int region(const Identifier id) const
return region according to :
int pos_neg_z(const Identifier id) const
return pos_neg_z according to :
int eta(const Identifier id) const
return eta according to :
int phi(const Identifier id) const
return phi according to :
Encapsulates the ID of one channel of conditions data in COOL, ie the ID of a row in a table.
Folder <-> Object mapping for /TRIGGER/L1Calo/V1/Conditions/DisabledTowers .
const L1CaloPpmDeadChannels * ppmDeadChannels(unsigned int channelId) const
Folder <-> Object mapping for /TRIGGER/L1Calo/V1/Calibration/PpmDeadChannels .
Folder <-> Object mapping for /TRIGGER/L1Calo/V2/Calibration/Physics/PprChanCalib .
unsigned short lutJepStrategy() const
unsigned short lutCpSlope() const
unsigned short satBcidLevel() const
unsigned short lutCpScale() const
unsigned short lutJepNoiseCut() const
unsigned short lutJepSlope() const
unsigned short lutCpStrategy() const
unsigned int pedFirSum() const
unsigned short satBcidThreshLow() const
unsigned short firStartBit() const
unsigned short lutCpOffset() const
unsigned short lutJepScale() const
unsigned short bcidEnergyRangeLow() const
unsigned short satBcidThreshHigh() const
unsigned short lutCpNoiseCut() const
unsigned short bcidEnergyRangeHigh() const
unsigned short lutJepOffset() const
Container class for LArTTL1.
Liquid Argon TT L1 sum class.
std::string m_chanCalibKeyoverlay
void processLArTowers(const LArTTL1Container *)
extract amplitudes from TTL1
SG::ReadCondHandleKey< L1CaloPpmDeadChannelsContainer > m_deadChannelsKey
bool m_isDataReprocessing
int EtRange(int et, unsigned short bcidEnergyRangeLow, unsigned short bcidEnergyRangeHigh) const
SG::ReadHandleKey< xAOD::TriggerTowerContainer > m_inputTTLocation
L1CaloDisabledTowersContainer * m_disabledTowersContaineroverlay
std::vector< std::vector< double > > m_xaodTowersAmps
SG::ReadHandleKey< TileTTL1Container > m_TileTTL1ContainerName
SG::ReadCondHandleKey< L1CaloPprChanCalibContainer > m_chanCalibKey
ATHRNG::RNGWrapper * m_rndmADCs
L1CaloPpmDeadChannelsContainer * m_deadChannelsContaineroverlay
bool IsGoodTower(const xAOD::TriggerTower *tt, const L1CaloPpmDeadChannelsContainer *dead, const L1CaloDisabledTowersContainer *disabled) const
bool IsDeadChannel(const L1CaloPpmDeadChannels *db) const
Database helper functions for dead and disabled towers.
std::unique_ptr< xAOD::TriggerTowerContainer > m_xaodTowers
SG::WriteHandleKey< xAOD::TriggerTowerContainer > m_outputLocationRerun
ToolHandle< IL1TriggerTowerTool > m_TTtool
void calcCombinedLUT(const std::vector< int > &sigIN, const int sigSlope, const int sigOffset, const std::vector< int > &ovIN, const int ovSlope, const int ovOffset, const int ovNoiseCut, std::vector< int > &output)
int non_linear_lut(int lutin, unsigned short offset, unsigned short slope, unsigned short noiseCut, unsigned short scale, short par1, short par2, short par3, short par4)
bool IsDisabledChannel(const L1CaloDisabledTowers *db) const
double IDphi(const Identifier &id, const CaloLVL1_ID *caloId)
L1CaloPprChanDefaults m_chanDefaults
ToolHandle< IL1CaloMappingTool > m_mappingTool
ServiceHandle< IAthRNGSvc > m_rngSvc
void normaliseDigits(const std::vector< int > &sigDigits, const std::vector< int > &ovDigits, std::vector< int > &normDigits)
normalise the number of ADC digits for overlay
L1CaloPprChanCalibContainer * m_chanCalibContaineroverlay
StatusCode preProcessTower(int bcid, float mu, xAOD::TriggerTower *tower)
int etaToElement(float feta, int layer) const
SG::ReadHandleKey< TrigConf::L1Menu > m_L1MenuKey
SG::ReadHandleKey< xAOD::EventInfo > m_xaodevtKey
virtual StatusCode addOverlay(int bcid, float mu)
Add overlay data.
const L1CaloPpmDeadChannelsContainer * m_deadChannelsContainer
StatusCode getTriggerTowers()
gets collection of input TriggerTowers for reprocessing
StatusCode getCaloTowers()
fetch Calorimeter Towers
double IDeta(const Identifier &id, const CaloLVL1_ID *caloId)
functions to extract eta, phi coordinates from calo tower identifiers
L1CaloCoolChannelId channelId(double eta, double phi, int layer)
Compute L1CaloCoolChannelId (including support for old geometries)
StatusCode calcLutOutCP(const std::vector< int > &sigLutIn, const L1CaloPprChanCalib *sigDB, const std::vector< int > &ovLutIn, const L1CaloPprChanCalib *ovDB, std::vector< int > &output)
calculate LUT out
Run2TriggerTowerMaker(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< LArTTL1Container > m_EmTTL1ContainerName
ToolHandle< LVL1BS::ITrigT1CaloDataAccessV2 > m_bstowertool
static constexpr unsigned int m_maxIetaBins
static constexpr int s_FIRLENGTH
std::string m_disabledTowersKeyoverlay
const L1CaloPprChanCalibContainer * m_chanCalibContainer
StatusCode preProcessTower_getLutIn(int bcid, float mu, xAOD::TriggerTower *tower, const L1CaloPprChanCalib *db, const std::vector< int > &digits, std::vector< int > &output)
PreProcess up to LUT in.
void digitize(const EventContext &ctx)
Convert analogue pulses to digits.
StatusCode calcLutOutJEP(const std::vector< int > &sigLutIn, const L1CaloPprChanCalib *sigDB, const std::vector< int > &ovLutIn, const L1CaloPprChanCalib *ovDB, std::vector< int > &output)
SG::ReadDecorHandleKey< xAOD::EventInfo > m_actMuKey
SG::ReadHandleKey< LArTTL1Container > m_HadTTL1ContainerName
SG::ReadCondHandleKey< L1CaloDisabledTowersContainer > m_disabledTowersKey
std::unique_ptr< xAOD::TriggerTowerAuxContainer > m_xaodTowersAux
const CaloLVL1_ID * m_caloId
StatusCode preProcess(int bcid, float mu)
Simulate PreProcessing on analogue amplitudes.
static constexpr int s_MEV
std::string m_chanDefaultsKeyoverlay
std::array< double, m_maxIetaBins > m_sinThetaHash
instead of calculating the expression: double theta =2.
std::string m_deadChannelsKeyoverlay
void processTileTowers(const TileTTL1Container *)
StatusCode store()
Stores Trigger Towers in the TES, at a location defined in m_outputLocation.
std::vector< int > ADC(CLHEP::HepRandomEngine *rndmADCs, L1CaloCoolChannelId channel, const std::vector< double > &s) const
Functions to simulate processing of tower signals.
const L1CaloDisabledTowersContainer * m_disabledTowersContainer
SG::ReadCondHandleKey< L1CaloPprChanDefaultsContainer > m_chanDefaultsKey
StatusCode execute()
Checks that the Cell Type is supported (terminates with errors if not) and calls relevant routine to ...
virtual ~Run2TriggerTowerMaker()
SG::WriteHandleKey< xAOD::TriggerTowerContainer > m_outputLocation
void handle(const Incident &)
Best if initialisation which uses COOL-derived values is done here rather than in initialize()
static const std::string xAODTriggerTowerLocation
static const std::string xAODTriggerTowerRerunLocation
SG::Decorator< T, ALLOC > Decorator
class to provide type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Handle class for reading a decoration on an object.
bool isPresent() const
Is the referenced container present in SG?
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
double TTL1Calib(const Identifier &) const
Returns the factor which converts amplitude in pCb to mV in TTL1.
double TTL1Ped(const Identifier &) const
Returns the pedestal (in mV) for TTL1 adcs.
uint32_t eventTypeBitmask() const
The event type bitmask.
@ IS_SIMULATION
true: simulation, false: data
void setPeak(uint8_t)
set peak
void setBcidVec(const std::vector< uint8_t > &)
set bcidVec
uint32_t coolId() const
Tower identifiers.
void setCorrectionEnabled(const std::vector< uint8_t > &)
set correctionEnabled
void setCorrection(const std::vector< int16_t > &)
set correction
const std::vector< uint8_t > & correctionEnabled() const
get correctionEnabled
void setLut_cp(const std::vector< uint8_t > &)
set lut_cp
virtual double eta() const final
The pseudorapidity ( ) of the particle.
void setBcidExt(const std::vector< uint8_t > &)
set bcidExt
void setLut_jep(const std::vector< uint8_t > &)
set lut_jep
const std::vector< uint16_t > & adc() const
get adc
int layer() const
get layer ( 0 = EM, 1 = Had, 2 = FCAL23) - to be confirmed
const std::vector< int16_t > & correction() const
get correction
const std::vector< uint8_t > & lut_cp() const
get lut_cp
const std::vector< uint8_t > & bcidVec() const
get bcidVec
bool match(std::string s1, std::string s2)
match the individual directories of two strings
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
DataModel_detail::iterator< DVL > remove_if(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end, Predicate pred)
Specialization of remove_if for DataVector/List.
EventInfo_v1 EventInfo
Definition of the latest event info version.
TriggerTowerContainer_v2 TriggerTowerContainer
Define the latest version of the TriggerTower container.
TriggerTower_v2 TriggerTower
Define the latest version of the TriggerTower class.
TriggerTowerAuxContainer_v2 TriggerTowerAuxContainer
Define the latest version of the TriggerTower auxiliary container.
Extra patterns decribing particle interation process.